const browserify = require('browserify') const watchify = require('watchify') const { createWriteStream } = require('fs') const { readFile } = require('fs').promises const bundleResourceToFile = (inPath, outPath) => { return new Promise((resolve, reject) => { browserify(inPath).bundle() .once('error', (e) => reject(e)) .pipe(createWriteStream(outPath)) .once('finish', () => resolve()) }) } const bundleResource = (inPath) => { return new Promise((resolve, reject) => { browserify(inPath).bundle((err, buffer) => { if (err != null) { reject(err) return } resolve(buffer) }) }) } const watchResourceToFile = (inPath, outPath) => { const b = browserify({ entries: [inPath], cache: {}, packageCache: {}, plugin: [watchify] }) const bundle = () => { b.bundle() .once('error', (e) => { console.error(`Failed to bundle ${inPath} into ${outPath}.`) console.error(e) }) .pipe(createWriteStream(outPath)) .once('finish', () => console.log(`Bundled ${inPath} into ${outPath}.`)) } b.on('update', bundle) bundle() } const main = async () => { if (process.argv[2] === 'build') { await bundleResourceToFile('client/main.js', 'static/karma.js') await bundleResourceToFile('context/main.js', 'static/context.js') } else if (process.argv[2] === 'check') { const expectedClient = await bundleResource('client/main.js') const expectedContext = await bundleResource('context/main.js') const actualClient = await readFile('static/karma.js') const actualContext = await readFile('static/context.js') if (Buffer.compare(expectedClient, actualClient) !== 0 || Buffer.compare(expectedContext, actualContext) !== 0) { // eslint-disable-next-line no-throw-literal throw 'Bundled client assets are outdated. Forgot to run "npm run build"?' } } else if (process.argv[2] === 'watch') { watchResourceToFile('client/main.js', 'static/karma.js') watchResourceToFile('context/main.js', 'static/context.js') } else { // eslint-disable-next-line no-throw-literal throw `Unknown command: ${process.argv[2]}` } } main().catch((err) => { console.error(err) process.exit(1) })