-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathbundle.js
124 lines (115 loc) · 3.04 KB
/
bundle.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
require("dotenv").config();
const fs = require("fs");
const path = require("path");
const esbuild = require("esbuild");
const { clean: cleanPlugin } = require("esbuild-plugin-clean");
const { copy: copyPlugin } = require("esbuild-plugin-copy");
const stylePlugin = require("esbuild-style-plugin");
const { default: wasmPlugin } = require("esbuild-plugin-wasm");
const { zip } = require("zip-a-folder");
const { NODE_ENV = "development" } = process.env;
const DEV = NODE_ENV === "development";
const PROD = NODE_ENV === "production";
const ENV_VARS_WHITELIST = [
["NODE_ENV", NODE_ENV],
"WEBSITE_URL",
"ENCRYPTION_KEY",
];
const entryPoints = [
"common.css",
"background.ts",
"content.ts",
"inpage.tsx",
"inpage-styles.css",
"popup.tsx",
"main.tsx",
DEV && "_dev/hotreload.ts",
]
.filter(Boolean)
.map((p) => `src/${p}`);
(async () => {
const ctx = await esbuild.context({
entryPoints,
outdir: "ext/assets",
bundle: true,
sourcemap: DEV,
minify: PROD,
platform: "browser",
target: "es2019",
conditions: ["development"], // for `floating-ui` modules
format: "esm",
define: Object.fromEntries(
ENV_VARS_WHITELIST.map((item) => {
const key = Array.isArray(item) ? item[0] : item;
const value = Array.isArray(item) ? item[1] : process.env[key] ?? "";
return [`process.env.${key}`, `"${value}"`];
})
),
drop: PROD ? ["console", "debugger"] : undefined,
plugins: [
cleanPlugin({
patterns: ["ext/assets"],
}),
stylePlugin({
postcss: {
plugins: [
require("tailwindcss"),
PROD && require("autoprefixer"),
].filter(Boolean),
},
}),
wasmPlugin({
mode: "embedded",
}),
DEV &&
copyPlugin({
assets: {
from: ["src/_dev/hotreload.html"],
to: ["./_dev"],
},
watch: true,
}),
PROD && {
name: "clean-useless-files",
setup(build) {
build.onEnd((result) => {
if (result.errors.length === 0) {
// This empty file generated by `esbuild-style-plugin` >_<
fs.rmSync(path.join(process.cwd(), "/ext/assets/common.js"));
}
});
},
},
PROD && {
name: "zip-build",
setup(build) {
build.onEnd((result) => {
if (result.errors.length === 0) {
fs.mkdirSync(path.join(process.cwd(), "dist"));
return zip(
path.join(process.cwd(), "ext"),
path.join(process.cwd(), "dist/ext.zip")
);
}
});
},
},
{
name: "success-logger",
setup(build) {
build.onEnd((result) => {
if (result.errors.length === 0) {
console.info("✅ Successfully bundled.");
}
});
},
},
].filter(Boolean),
});
if (DEV) {
await ctx.watch();
} else {
await ctx.rebuild();
ctx.dispose();
}
})();