-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathesbuild.js
88 lines (80 loc) · 2.5 KB
/
esbuild.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
const { sassPlugin } = require("esbuild-sass-plugin");
const { PurgeCSS } = require("purgecss");
const fs = require("fs/promises");
const esbuild = require("esbuild");
// adapted from https://github.com/GitHubJiKe/esbuild-plugin-purgecss
const purgeCSSPlugin = {
name: "purgecss",
setup(build) {
if (!build.initialOptions.metafile) {
throw new Error("You should set metafile true to use this plugin.");
}
build.onEnd(async (args) => {
const outputKeys = Object.keys(args.metafile.outputs);
const genFilter = (postfix) => (k) => k.endsWith(postfix);
const css = outputKeys.filter(genFilter(".css"));
const opts = {
content: ["./src/**/*.njk", "./assets/**/*.js"],
safelist: {
greedy: [/^ct-/, /modal/, /^division-/, /collapsing/, /is-focused/],
},
};
const res = await new PurgeCSS().purge({ ...opts, css });
for (let index = 0; index < res.length; index++) {
const { file, css } = res[index];
console.log(`Purged size (${file}): ${css.length}`);
await fs.writeFile(file, css);
}
});
},
};
const copyAssets = {
name: "copy-assets",
setup(build) {
build.onStart(async () => {
await fs.cp("./data/results/", "./_site/data/", {
recursive: true,
});
await fs.cp("./src/images/", "./_site/images/", {
recursive: true,
});
await fs.cp("./src/preview/assets/", "./_site/preview/assets/", {
recursive: true,
force: false,
});
await fs.cp("./src/slides/assets/", "./_site/slides/assets/", {
recursive: true,
force: false,
});
});
},
};
const config = {
entryPoints: {
main: "./assets/index.js",
"preview/assets/convert": "./src/preview/assets/convert.js",
"preview/assets/canonicalize": "./src/preview/assets/canonicalize.js",
"slides/assets/gen": "./src/slides/assets/gen.ts",
"slides/assets/printable": "./src/slides/assets/printable.ts",
"results/eventHisto": "./src/results/tournament/eventHisto.js",
},
external: ["canvg", "html2canvas", "dompurify"],
bundle: true,
minify: true,
outdir: "_site",
metafile: true,
legalComments: "linked",
logLevel: "info",
plugins: [
sassPlugin({ silenceDeprecations: ["slash-div"] }),
purgeCSSPlugin,
copyAssets,
],
};
if (process.env.NODE_ENV === "development") {
esbuild
.context(config)
.then((ctx) => ctx.watch().catch(() => process.exit(1)));
} else {
esbuild.build(config).catch(() => process.exit(1));
}