this repo has no description
at v1.0.1 3.3 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 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);