diff --git a/bin/bundle.config.json b/bin/bundle.config.json index f2e3a8e7..93994e27 100644 --- a/bin/bundle.config.json +++ b/bin/bundle.config.json @@ -1,11 +1,16 @@ { + "compress": false, "outputs": { "bundle": "./web/boot/bundle.bin" }, "inputs": [ - { "root": "./web", "prefix": "" }, - { "root": "./src", "prefix": "lib" }, - { "root": "./src/wasm", "prefix": "wasm" }, - { "root": "./src/wasm", "prefix": "lib/kiri/wasm" } + { "root": "web", "prefix": "" }, + { "root": "src", "prefix": "lib" }, + { "root": "src/wasm", "prefix": "wasm" }, + { "root": "src/wasm", "prefix": "lib/kiri/wasm" } + ], + "excludes": [ + "src/pack", + "web/boot/bundle.bin" ] } diff --git a/bin/bundler.mjs b/bin/bundler.mjs index e55e9821..3a96efb4 100644 --- a/bin/bundler.mjs +++ b/bin/bundler.mjs @@ -4,10 +4,17 @@ import uglify from 'uglify-js'; import { Buffer } from 'buffer'; const cfg = JSON.parse(fs.readFileSync(process.argv[2] || './bin/bundle.config.json', 'utf8')); -const compress = process.env.UGLIFY ? true : false +const { inputs, outputs, excludes, compress } = cfg; +const envcomp = process.env.COMPRESS ? JSON.parse(process.env.COMPRESS) : undefined; +const debug = process.env.DEBUG; // --- recursive directory walker (follows symlinks safely) --- function* walk(dir, seen = new Set()) { + dir = path.normalize(dir); + if (excludes.indexOf(dir) >= 0) { + return; + } + const real = fs.realpathSync(dir); if (seen.has(real)) { return; @@ -25,7 +32,7 @@ function* walk(dir, seen = new Set()) { // --- collect all files according to config --- let entries = []; -for (const input of cfg.inputs) { +for (const input of inputs) { const root = input.root; const prefix = input.prefix || ''; for (const file of walk(root)) { @@ -42,16 +49,17 @@ let offset = 0; let cache = new Map(); for (const { file, virt } of entries) { - if (file.endsWith('/bundle.bin')) { + if (excludes.indexOf(file) >= 0) { continue; } let record = cache.get(file); if (record) { - // console.log({ dup: file }); + if (debug) console.log({ alias: virt, from: file }); entryMeta.push({ ...record, virt }); } else { + if (debug) console.log({ write: virt, from: file }); let data = fs.readFileSync(file); - if (compress && file.endsWith("js")) { + if ((envcomp ?? compress) && file.endsWith("js")) { console.log('compress', file); data = uglify.minify(data.toString(), { compress: { @@ -61,7 +69,7 @@ for (const { file, virt } of entries) { }); // console.log({ to: typeof(data), data }); if (!data.code) { - console.log({ skip: file }); + if (debug) console.log({ skip: file }); continue; } data = Buffer.from(data.code); @@ -102,7 +110,7 @@ const header = Buffer.concat([count, ...headerParts]); const full = Buffer.concat([header, ...dataParts]); // --- write final bundle --- -const outPath = cfg.outputs.bundle || './bundle.bin'; +const outPath = outputs.bundle || './bundle.bin'; fs.mkdirSync(path.dirname(outPath), { recursive: true }); fs.writeFileSync(outPath, full); // ⚡ write raw binary