Logo of bundle-runner

bundle-runner

Run webpack bundles in Node.js with optional VM sandboxing

This package allows running a Webpack bundle in Node.js with optional sandboxed context. Useful for development, loading bundle from memory (HMR) and a consistent way of loading bundle between development and production environments.

✅ What sandboxing is for:

  • Optional sandboxing using Node.js VM
  • Mitigate script evaluation side-effects to global object
  • Avoid unwanted shared state
  • Avoid memory leaks during HMR

❌ What sandboxing is not for:

  • Fully avoid side effects of evaluation
  • A secure sandbox to run untrusted code
  • High performance

Install

yarn add bundle-runner

npm install bundle-runner

Usage

import { createBundle } from 'bundle-runner'

const { evaluateEntry } = createBundle('path/to/bundle.json')

const entry = evaluateEntry(context)

createBundle

function createBundle(bundle: Partial<Bundle> | string, options?: CreateBundleOptions): {
    bundle: Bundle;
    evaluateEntry: (context: object) => any;
    evaluateModule: (filename: string, context: object) => any;
    rewriteErrorTrace: (err: Error) => Promise<Error>;
}

CreateBundleOptions

type CreateBundleOptions = {
    basedir?: string;
    runInNewContext?: 'once' | boolean;
    runningScriptOptions?: VM.RunningScriptOptions;
}

Bundle Format

Input can be string (path to a .js file or .json file with bundle format) or directly bundle object with type of:

type Bundle = {
    basedir: string;
    entry: string;
    files: {
        [filename: string]: string
    };
    maps: {
        [filename: string]: string
    };
}

SourceMap Support

After creating bundle, a rewriteErrorTrace utility is exposed which you can use to rewrite traces:

const { evaluateEntry, rewriteErrorTrace } = createBundle('path/to/bundle.json')

try {
  const entry = evaluateEntry(context)
  const app = await entry({})
} catch (err) {
  await rewriteErrorTrace(err)
  throw err
}

Credits

Inspired by vue-server-renderer made by Evan You.

License

MIT