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