| 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) |
| }) |