70dba10dfa08f81b545c0de78e7815c58b3e1800d1274e7190d4587e9c1501ed0cf9b2ceeb852d803cbba2d3acc5136dbb608cd3f40386c039239b2419a9b9 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. 'use strict';
  2. const ErrorStackParser = require('error-stack-parser');
  3. const RequestShortener = require("webpack/lib/RequestShortener");
  4. // TODO: allow the location to be customized in options
  5. const requestShortener = new RequestShortener(process.cwd());
  6. /*
  7. This logic is mostly duplicated from webpack/lib/Stats.js#toJson()
  8. See: https://github.com/webpack/webpack/blob/2f618e733aab4755deb42e9d8e859609005607c0/lib/Stats.js#L89
  9. */
  10. function extractError (e) {
  11. return {
  12. message: e.message,
  13. file: getFile(e),
  14. origin: getOrigin(e),
  15. name: e.name,
  16. severity: 0,
  17. webpackError: e,
  18. originalStack: getOriginalErrorStack(e)
  19. };
  20. }
  21. function getOriginalErrorStack(e) {
  22. while (e.error != null) {
  23. e = e.error;
  24. }
  25. if (e.stack) {
  26. return ErrorStackParser.parse(e);
  27. }
  28. return [];
  29. }
  30. function getFile (e) {
  31. if (e.file) {
  32. return e.file;
  33. } else if (e.module && e.module.readableIdentifier && typeof e.module.readableIdentifier === "function") {
  34. return e.module.readableIdentifier(requestShortener);
  35. }
  36. }
  37. function getOrigin (e) {
  38. let origin = '';
  39. if (e.dependencies && e.origin) {
  40. origin += '\n @ ' + e.origin.readableIdentifier(requestShortener);
  41. e.dependencies.forEach(function (dep) {
  42. if (!dep.loc) return;
  43. if (typeof dep.loc === "string") return;
  44. if (!dep.loc.start) return;
  45. if (!dep.loc.end) return;
  46. origin += ' ' + dep.loc.start.line + ':' + dep.loc.start.column + '-' +
  47. (dep.loc.start.line !== dep.loc.end.line ? dep.loc.end.line + ':' : '') + dep.loc.end.column;
  48. });
  49. var current = e.origin;
  50. while (current.issuer && typeof current.issuer.readableIdentifier === 'function') {
  51. current = current.issuer;
  52. origin += '\n @ ' + current.readableIdentifier(requestShortener);
  53. }
  54. }
  55. return origin;
  56. }
  57. module.exports = extractError;