diff --git a/package.json b/package.json index cfe9b28b..e94f8b3f 100644 --- a/package.json +++ b/package.json @@ -47,11 +47,11 @@ "connect": "^3.7.0", "earcut": "^2.2.3", "express-useragent": "^1.0.13", + "fast-glob": "^3.3.3", "jszip": "^3.7.1", "manifold-3d": "^3.1.1", "moment": "^2.29.4", "prettier": "^3.5.3", - "react-responsive-carousel": "^3.2.23", "serve-static": "^1.14.1", "three": "^0.174.0", "three-mesh-bvh": "^0.7.6", @@ -103,7 +103,7 @@ "prebuild": "node bin/electron-pre.js", "postbuild": "node bin/electron-post.js", "preinstall": "node bin/install-pre.js && npx webpack --config bin/webpack-three.js", - "preinstall2": "npx webpack --config src2/webpack/webpack-three-esm.js && node src2/webpack/esbuild.config.js", + "preinstall2": "npx webpack --config src2/webpack/webpack-three-esm.js && node src2/webpack/esbuild.config.mjs", "docs-dev": "docusaurus start", "docs-build": "docusaurus build", "docs-serve": "docusaurus serve", diff --git a/src2/webpack/esbuild.config.js b/src2/webpack/esbuild.config.js deleted file mode 100644 index c598874f..00000000 --- a/src2/webpack/esbuild.config.js +++ /dev/null @@ -1,70 +0,0 @@ -// esbuild.config.js -import { build } from 'esbuild'; - -// Get build mode from command line argument -const mode = process.argv[2] || 'dev'; -const isProd = mode === 'prod'; - -console.log(`Building in ${mode} mode...`); - -// Dummy document shim for worker context -// const dummyDocument = ` -// // Inject dummy document for worker context -// if (typeof document === 'undefined') { -// var document = { -// createElement: () => ({}), -// getElementById: () => null, -// querySelector: () => null, -// addEventListener: () => {}, -// removeEventListener: () => {} -// }; -// } -// if (typeof window === 'undefined') { -// var window = { }; -// } -// `; - -async function buildApp() { - try { - // Bundle main app - await build({ - entryPoints: ['src2/main/mesh.js'], - bundle: true, - outfile: 'src2/pack/mesh.js', - format: 'esm', - external: ['module'], - sourcemap: !isProd, // true for dev, false for prod - minify: isProd, // false for dev, true for prod - target: 'es2020', - platform: 'browser', - define: { - 'process.env.NODE_ENV': `"${mode}"` - } - }); - - // Bundle worker - await build({ - entryPoints: ['src2/mesh/work.js'], - bundle: true, - outfile: 'src2/pack/work.js', - format: 'esm', - external: ['module'], - sourcemap: !isProd, // true for dev, false for prod - minify: isProd, // false for dev, true for prod - target: 'es2020', - platform: 'browser', - define: { - 'process.env.NODE_ENV': `"${mode}"` - } - }); - - console.log(`Build completed successfully in ${mode} mode!`); - } catch (error) { - console.error('Build failed:', error); - process.exit(1); - } -} - -buildApp(); - -// You can add more build steps or static asset copying as needed. \ No newline at end of file diff --git a/src2/webpack/esbuild.config.mjs b/src2/webpack/esbuild.config.mjs new file mode 100644 index 00000000..88f1cb9e --- /dev/null +++ b/src2/webpack/esbuild.config.mjs @@ -0,0 +1,82 @@ +import { build, transform } from 'esbuild'; +import fs from 'fs/promises'; +import glob from 'fast-glob'; + +// Get build mode from command line argument +const mode = process.argv[2] || 'dev'; +const isProd = mode === 'prod'; + +console.log(`Building in ${mode} mode...`); + +const MESH_OUTFILE = 'src2/pack/mesh.js'; +const MESH_EXTRAS = [ + 'mod/*/mesh.js', + 'mod/*/tra1.js' +]; + +async function appendExtraModules(extras, minify = false) { + const files = await glob(extras); + if (files.length === 0) return; + + const transformed = await Promise.all( + files.map(async (file) => { + const code = await fs.readFile(file, 'utf8'); + if (!minify) return code; + + const result = await transform(code, { + minify: true, + loader: 'js', + target: 'es2020', + }); + return result.code; + }) + ); + + await fs.appendFile(MESH_OUTFILE, transformed.join('')); + console.log(`Appended ${files.length} module(s) to ${MESH_OUTFILE}`); +} + +async function buildApp() { + try { + // Bundle main app + await build({ + entryPoints: [ 'src2/main/mesh.js' ], + bundle: true, + outfile: MESH_OUTFILE, + format: 'esm', + external: ['module'], + sourcemap: !isProd, // true for dev, false for prod + minify: isProd, // false for dev, true for prod + target: 'es2020', + platform: 'browser', + define: { + 'process.env.NODE_ENV': `"${mode}"` + } + }); + + appendExtraModules(MESH_EXTRAS, isProd); + + // Bundle worker + await build({ + entryPoints: [ 'src2/mesh/work.js' ], + bundle: true, + outfile: 'src2/pack/work.js', + format: 'esm', + external: ['module'], + sourcemap: !isProd, // true for dev, false for prod + minify: isProd, // false for dev, true for prod + target: 'es2020', + platform: 'browser', + define: { + 'process.env.NODE_ENV': `"${mode}"` + } + }); + + console.log(`Build completed successfully in ${mode} mode!`); + } catch (error) { + console.error('Build failed:', error); + process.exit(1); + } +} + +buildApp(); \ No newline at end of file