ModuleBuildError.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const { cutOffLoaderExecution } = require("../ErrorHelpers");
  7. const makeSerializable = require("../util/makeSerializable");
  8. const WebpackError = require("./WebpackError");
  9. /** @typedef {Error & { hideStack?: boolean }} ErrorWithHideStack */
  10. /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<[string | ErrorWithHideStack]>} ObjectDeserializerContext */
  11. /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<[string | ErrorWithHideStack]>} ObjectSerializerContext */
  12. class ModuleBuildError extends WebpackError {
  13. /**
  14. * Creates an instance of ModuleBuildError.
  15. * @param {string | ErrorWithHideStack} err error thrown
  16. * @param {{ from?: string | null }} info additional info
  17. */
  18. constructor(err, { from = null } = {}) {
  19. let message = "Module build failed";
  20. /** @type {undefined | string} */
  21. let details;
  22. message += from ? ` (from ${from}):\n` : ": ";
  23. if (err !== null && typeof err === "object") {
  24. if (typeof err.stack === "string" && err.stack) {
  25. const stack = cutOffLoaderExecution(err.stack);
  26. if (!err.hideStack) {
  27. // V8 prefixes `.stack` with "Name: message"; JSC and others emit
  28. // frames only, which would drop the message. Lead with it then.
  29. message +=
  30. typeof err.message === "string" &&
  31. err.message &&
  32. !stack.includes(err.message)
  33. ? `${err.name ? `${err.name}: ` : ""}${err.message}`
  34. : stack;
  35. } else {
  36. details = stack;
  37. message +=
  38. typeof err.message === "string" && err.message ? err.message : err;
  39. }
  40. } else if (typeof err.message === "string" && err.message) {
  41. message += err.message;
  42. } else {
  43. message += String(err);
  44. }
  45. } else {
  46. message += String(err);
  47. }
  48. super(message);
  49. /** @type {string} */
  50. this.name = "ModuleBuildError";
  51. /** @type {string | undefined} */
  52. this.details = details;
  53. /** @type {string | ErrorWithHideStack} */
  54. this.error = err;
  55. }
  56. /**
  57. * Serializes this instance into the provided serializer context.
  58. * @param {ObjectSerializerContext} context context
  59. */
  60. serialize(context) {
  61. context.write(this.error);
  62. super.serialize(context);
  63. }
  64. /**
  65. * Restores this instance from the provided deserializer context.
  66. * @param {ObjectDeserializerContext} context context
  67. */
  68. deserialize(context) {
  69. this.error = context.read();
  70. super.deserialize(context.rest);
  71. }
  72. }
  73. makeSerializable(ModuleBuildError, "webpack/lib/errors/ModuleBuildError");
  74. module.exports = ModuleBuildError;