-
Notifications
You must be signed in to change notification settings - Fork 1
/
run_esbuild.js
87 lines (80 loc) · 3.51 KB
/
run_esbuild.js
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
85
86
87
const { build } = require('esbuild');
const chokidar = require('chokidar');
///XXX: if you get an error about esbuild install scripts in console,
//run 'node node_modules/esbuild/install.js'...
const watchChanges = process.argv.includes("watch");
console.log('watchChanges ' + watchChanges);
// assuming that THREE is a global object,
// makes any imported reference to three proxy to that instead.
const threeShim = Object.keys(require("three")).map(k => `export const ${k} = window.THREE.${k}`).join('\n');
//https://esbuild.github.io/plugins/#using-plugins
const externaliseThreePlugin = {
name: 'three',
setup(build) {
build.onResolve({ filter: /^three$/ }, args => ({
path: args.path,
// external: true,
namespace: 'three-ns'
}));
build.onLoad({ filter: /.*/, namespace: 'three-ns' }, (args) => ({
contents: threeShim,
loader: 'js'
}));
}
}
async function startBuild(name, node=false) {
console.log(`[${new Date()}] building ${name}, node=${node}`);
// TODO: log errors / warnings / stats.
const builder = await build({
color: true,
platform: node ? "node" : "browser",
//may need a better approach to electron externals soon...
//also... why am I getting several copies of three in my renderer bundle?!
external: ["electron", "fsevents", "express", "mediainfo.js"],
plugins: [externaliseThreePlugin], //this is not a keeper... but...
entryPoints: [`./src/${name}/index.tsx`],
outfile: `./public/esbuild/${name}.js`, //putting build artefacts here, adding to .gitignore and removing old file.
//could do something like `git rm --cached `git ls-files -i -X .gitignore`` but I still want other files in public
//and maintaining list of names in gitignore sounds fiddly.
///--- need to clarify what's going on with css ---
minify: true,
bundle: true,
sourcemap: true,
define: {
"process.env.NODE_ENV": '"production"',
"import.meta.env.DEV": 'false' //vite-like
},
tsconfig: './tsconfig.json',
logLevel: 'warning',
incremental: watchChanges,
loader: { '.glsl': 'text' }
});
//nb, now using renderer code in gui, so just watching all src
//in a way it'd make sense to make those files 'common'
if (watchChanges) {
chokidar.watch([`src/**/*`], {ignoreInitial: true}).on('all', () => {
console.log(`[${new Date()}] rebuilding ${name}`);
try {
builder.rebuild();
} catch (error) {
//note: we get UnhandledPromiseRejectionWarning from node when there's an error,
//and trying to catch here does nothing AFAICT.
console.log(`caught error '${error}' while rebuilding ${name}`);
}
});
}
}
(async () => {
//seems like it'd be pretty easy to add something so this script could be watched / watch itself...
startBuild('renderer');
startBuild('gui');
startBuild('server', true);
//still haven't got live-reload working, should be good eventually...
//handy to be able to see gui / renderer in browser and see how things work with basic server, but for interop we need our custom server.
//might even consider putting most of this build logic into actual Electron script...
///// server is express running in electron.
// liveServer.start({
// root: 'public',
// open: false,
// });
})();