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