this repo has no description
at v1.0.2 4.0 kB view raw
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);