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 entryPoints = [
82 `packages/core-extensions/src/${ext}/${side}.${fileExt}`
83 ];
84
85 const wpModulesDir = `packages/core-extensions/src/${ext}/webpackModules`;
86 if (fs.existsSync(wpModulesDir) && side === "index") {
87 const wpModules = fs.readdirSync(wpModulesDir);
88 for (const wpModule of wpModules) {
89 entryPoints.push(
90 `packages/core-extensions/src/${ext}/webpackModules/${wpModule}`
91 );
92 }
93 }
94
95 const wpImportPlugin = {
96 name: "webpackImports",
97 setup(build) {
98 build.onResolve({ filter: /^@moonlight-mod\/wp\// }, (args) => {
99 const wpModule = args.path.replace(/^@moonlight-mod\/wp\//, "");
100 return {
101 path: wpModule,
102 external: true
103 };
104 });
105 }
106 };
107
108 const esbuildConfig = {
109 entryPoints,
110 outdir,
111
112 format: "cjs",
113 platform: "node",
114
115 treeShaking: true,
116 bundle: true,
117 sourcemap: prod ? false : "inline",
118
119 external,
120
121 plugins: copyManifest
122 ? [
123 copyStaticFiles({
124 src: `./packages/core-extensions/src/${ext}/manifest.json`,
125 dest: `./dist/core-extensions/${ext}/manifest.json`
126 }),
127 wpImportPlugin
128 ]
129 : [wpImportPlugin],
130
131 logOverride: {
132 "commonjs-variable-in-esm": "verbose"
133 }
134 };
135
136 if (watch) {
137 const ctx = await esbuild.context(esbuildConfig);
138 await ctx.watch();
139 } else {
140 await esbuild.build(esbuildConfig);
141 }
142}
143
144const promises = [];
145
146for (const [name, entry] of Object.entries(config)) {
147 promises.push(build(name, entry));
148}
149
150const coreExtensions = fs.readdirSync("./packages/core-extensions/src");
151for (const ext of coreExtensions) {
152 let copiedManifest = false;
153
154 for (const fileExt of ["ts", "tsx"]) {
155 for (const type of ["index", "node", "host"]) {
156 if (
157 fs.existsSync(
158 `./packages/core-extensions/src/${ext}/${type}.${fileExt}`
159 )
160 ) {
161 promises.push(buildExt(ext, type, !copiedManifest, fileExt));
162 copiedManifest = true;
163 }
164 }
165 }
166}
167
168await Promise.all(promises);