Files
ue4ss-explorer/scripts/prebake.mjs
2026-07-29 14:20:30 -04:00

45 lines
1.6 KiB
JavaScript

#!/usr/bin/env node
/**
* node scripts/prebake.mjs <dump.txt> [public/dump.pdx]
*
* Use this when the dump ships with the site. Parsing 60 MB in the browser
* costs about a second on a good machine and considerably more on a laptop;
* doing it here costs nothing at runtime.
*/
import { readFileSync, writeFileSync, mkdirSync } from 'node:fs'
import { dirname } from 'node:path'
import { gzipSync } from 'node:zlib'
import { build } from 'esbuild'
const [, , input, output = 'public/dump.pdx'] = process.argv
if (!input) {
console.error('usage: node scripts/prebake.mjs <dump.txt> [out.pdx]')
process.exit(1)
}
// The parser is TypeScript and shared with the app; transpile it on the fly.
const bundled = await build({
entryPoints: ['app/lib/prebake-entry.ts'],
bundle: true,
format: 'esm',
platform: 'node',
write: false,
})
const mod = await import(
'data:text/javascript;base64,' + Buffer.from(bundled.outputFiles[0].text).toString('base64')
)
const src = new Uint8Array(readFileSync(input))
const t0 = performance.now()
const cols = mod.parseDump(src)
const bundle = mod.encodeBundle(cols)
mkdirSync(dirname(output), { recursive: true })
writeFileSync(output, bundle)
const gz = gzipSync(bundle, { level: 6 }).length
console.log(` input ${(src.length / 1e6).toFixed(1)} MB`)
console.log(` objects ${cols.count.toLocaleString()} (${cols.skipped} unparsed)`)
console.log(` parse ${(performance.now() - t0).toFixed(0)} ms`)
console.log(` output ${(bundle.length / 1e6).toFixed(1)} MB -> ${(gz / 1e6).toFixed(1)} MB gzipped`)
console.log(` written ${output}`)