'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