text: 'use strict';
  
  const ErrorStackParser = require('error-stack-parser');
  const RequestShortener = require("webpack/lib/RequestShortener");
  
  // TODO: allow the location to be customized in options
  const requestShortener = new RequestShortener(process.cwd());
  
  /*
   This logic is mostly duplicated from webpack/lib/Stats.js#toJson()
   See: https://github.com/webpack/webpack/blob/2f618e733aab4755deb42e9d8e859609005607c0/lib/Stats.js#L89
  */
  
  function extractError (e) {
    return {
      message: e.message,
      file: getFile(e),
      origin: getOrigin(e),
      name: e.name,
      severity: 0,
      webpackError: e,
      originalStack: getOriginalErrorStack(e)
    };
  }
  
  function getOriginalErrorStack(e) {
    while (e.error != null) {
      e = e.error;
    }
    if (e.stack) {
      return ErrorStackParser.parse(e);
    }
    return [];
  }
  
  function getFile (e) {
    if (e.file) {
      return e.file;
    } else if (e.module && e.module.readableIdentifier && typeof e.module.readableIdentifier === "function") {
      return e.module.readableIdentifier(requestShortener);
    }
  }
  
  function getOrigin (e) {
    let origin = '';
    if (e.dependencies && e.origin) {
      origin += '\n @ ' + e.origin.readableIdentifier(requestShortener);
      e.dependencies.forEach(function (dep) {
        if (!dep.loc) return;
        if (typeof dep.loc === "string") return;
        if (!dep.loc.start) return;
        if (!dep.loc.end) return;
        origin += ' ' + dep.loc.start.line + ':' + dep.loc.start.column + '-' +
          (dep.loc.start.line !== dep.loc.end.line ? dep.loc.end.line + ':' : '') + dep.loc.end.column;
      });
      var current = e.origin;
      while (current.issuer && typeof current.issuer.readableIdentifier === 'function') {
        current = current.issuer;
        origin += '\n @ ' + current.readableIdentifier(requestShortener);
      }
    }
    return origin;
  }
  
  module.exports = extractError;
  