-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathesbuild.config.mjs
84 lines (74 loc) · 2.2 KB
/
esbuild.config.mjs
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
import esbuild from "esbuild";
import svgrPlugin from "esbuild-plugin-svgr";
import stylePlugin from "esbuild-style-plugin";
import postcssConfig from "./postcss.config.js";
import { readFile } from "node:fs/promises";
const packageJson = JSON.parse(await readFile("./package.json"));
const isDev = process.argv.some((x) => x === "--dev") ?? false;
/** @type {import("esbuild").BuildOptions} */
const buildConfig = {
entryPoints: ["widget/index.ts"],
bundle: true,
outfile: "inst/htmlwidgets/rdeck.bundle.js",
globalName: "rdeck",
mainFields: ["browser", "module", "main"],
legalComments: "external",
sourcemap: "inline",
minify: !isDev,
logLevel: "info",
define: {
__VERSION__: JSON.stringify(packageJson.version),
},
plugins: [
!isDev ? sourcemapPlugin() : noopPlugin(),
svgrPlugin({ typescript: true }),
stylePlugin({
cssModulesOptions: {
exportGlobals: true,
localsConvention: "camelCase",
},
postcss: postcssConfig,
}),
],
};
if (isDev) {
const ctx = await esbuild.context(buildConfig);
await ctx.watch();
} else {
await esbuild.build(buildConfig);
}
// plugins
function noopPlugin() {
/** @type {import("esbuild").Plugin} */
return {
name: "noop",
setup() {}
}
}
// https://github.com/evanw/esbuild/issues/1227#issuecomment-829778830
function sourcemapPlugin() {
const dataurl =
"sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIiJdLCJtYXBwaW5ncyI6IkEifQ==";
const omitJs = (contents) => contents + `\n//# ${dataurl}`;
const omitCss = (contents) => contents + `\n/*# ${dataurl} */`;
/** @type {import("esbuild").Plugin} */
return {
name: "no-vendors-sourcemap",
async setup(build) {
build.onLoad({ filter: /node_modules.*\.(js|ts)$/ }, async (args) => {
const contents = await readFile(args.path, "utf-8");
return {
contents: omitJs(contents),
loader: "default",
};
});
build.onLoad({ filter: /node_modules.*\.css$/ }, async (args) => {
const contents = await readFile(args.path, "utf-8");
return {
contents: omitCss(contents),
loader: "default",
};
});
},
};
}