this repo has no description
1import * as esbuild from "esbuild";
2import copyStaticFiles from "esbuild-copy-static-files";
3
4import path from "path";
5import fs from "fs";
6
7const config = {
8 injector: "packages/injector/src/index.ts",
9 "node-preload": "packages/node-preload/src/index.ts",
10 "web-preload": "packages/web-preload/src/index.ts"
11};
12
13const prod = process.env.NODE_ENV === "production";
14const watch = process.argv.includes("--watch");
15
16const external = [
17 "electron",
18 "fs",
19 "path",
20 "module",
21 "events",
22 "original-fs", // wtf asar?
23
24 // Silence an esbuild warning
25 "./node-preload.js"
26];
27
28async function build(name, entry) {
29 const outfile = path.join("./dist", name + ".js");
30
31 const dropLabels = [];
32 if (name !== "injector") dropLabels.push("injector");
33 if (name !== "node-preload") dropLabels.push("nodePreload");
34 if (name !== "web-preload") dropLabels.push("webPreload");
35
36 const define = {
37 MOONLIGHT_ENV: `"${name}"`,
38 MOONLIGHT_PROD: prod.toString()
39 };
40
41 for (const iterName of Object.keys(config)) {
42 const snake = iterName.replace(/-/g, "_").toUpperCase();
43 define[`MOONLIGHT_${snake}`] = (name === iterName).toString();
44 }
45
46 const nodeDependencies = ["glob"];
47 const ignoredExternal = name === "web-preload" ? nodeDependencies : [];
48
49 const esbuildConfig = {
50 entryPoints: [entry],
51 outfile,
52
53 format: "cjs",
54 platform: name === "web-preload" ? "browser" : "node",
55
56 treeShaking: true,
57 bundle: true,
58 minify: prod,
59 sourcemap: "inline",
60
61 external: [...ignoredExternal, ...external],
62
63 define,
64 dropLabels
65 };
66
67 if (watch) {
68 const ctx = await esbuild.context(esbuildConfig);
69 await ctx.watch();
70 } else {
71 await esbuild.build(esbuildConfig);
72 }
73}
74
75async function buildExt(ext, side, copyManifest, fileExt) {
76 const outDir = path.join("./dist", "core-extensions", ext);
77 if (!fs.existsSync(outDir)) {
78 fs.mkdirSync(outDir, { recursive: true });
79 }
80
81 const entryPoint = `packages/core-extensions/src/${ext}/${side}.${fileExt}`;
82
83 const esbuildConfig = {
84 entryPoints: [entryPoint],
85 outfile: path.join(outDir, side + ".js"),
86
87 format: "cjs",
88 platform: "node",
89
90 treeShaking: true,
91 bundle: true,
92 sourcemap: prod ? false : "inline",
93
94 external,
95
96 plugins: copyManifest
97 ? [
98 copyStaticFiles({
99 src: `./packages/core-extensions/src/${ext}/manifest.json`,
100 dest: `./dist/core-extensions/${ext}/manifest.json`
101 })
102 ]
103 : []
104 };
105
106 if (watch) {
107 const ctx = await esbuild.context(esbuildConfig);
108 await ctx.watch();
109 } else {
110 await esbuild.build(esbuildConfig);
111 }
112}
113
114const promises = [];
115
116for (const [name, entry] of Object.entries(config)) {
117 promises.push(build(name, entry));
118}
119
120const coreExtensions = fs.readdirSync("./packages/core-extensions/src");
121for (const ext of coreExtensions) {
122 let copiedManifest = false;
123
124 for (const fileExt of ["ts", "tsx"]) {
125 for (const type of ["index", "node", "host"]) {
126 if (
127 fs.existsSync(
128 `./packages/core-extensions/src/${ext}/${type}.${fileExt}`
129 )
130 ) {
131 promises.push(buildExt(ext, type, !copiedManifest, fileExt));
132 copiedManifest = true;
133 }
134 }
135 }
136}
137
138await Promise.all(promises);