1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- '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;
|