UNPKG

2.12 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Sean Larkin @thelarkinn
4*/
5
6"use strict";
7
8const WebpackError = require("./WebpackError");
9
10/** @typedef {import("./Module")} Module */
11
12/**
13 * @template T
14 * @callback Callback
15 * @param {Error=} err
16 * @param {T=} stats
17 * @returns {void}
18 */
19
20class HookWebpackError extends WebpackError {
21 /**
22 * Creates an instance of HookWebpackError.
23 * @param {Error} error inner error
24 * @param {string} hook name of hook
25 */
26 constructor(error, hook) {
27 super(error.message);
28
29 this.name = "HookWebpackError";
30 this.hook = hook;
31 this.error = error;
32 this.hideStack = true;
33 this.details = `caused by plugins in ${hook}\n${error.stack}`;
34
35 Error.captureStackTrace(this, this.constructor);
36 this.stack += `\n-- inner error --\n${error.stack}`;
37 }
38}
39
40module.exports = HookWebpackError;
41
42/**
43 * @param {Error} error an error
44 * @param {string} hook name of the hook
45 * @returns {WebpackError} a webpack error
46 */
47const makeWebpackError = (error, hook) => {
48 if (error instanceof WebpackError) return error;
49 return new HookWebpackError(error, hook);
50};
51module.exports.makeWebpackError = makeWebpackError;
52
53/**
54 * @template T
55 * @param {function(WebpackError=, T=): void} callback webpack error callback
56 * @param {string} hook name of hook
57 * @returns {Callback<T>} generic callback
58 */
59const makeWebpackErrorCallback = (callback, hook) => {
60 return (err, result) => {
61 if (err) {
62 if (err instanceof WebpackError) {
63 callback(err);
64 return;
65 }
66 callback(new HookWebpackError(err, hook));
67 return;
68 }
69 callback(null, result);
70 };
71};
72
73module.exports.makeWebpackErrorCallback = makeWebpackErrorCallback;
74
75/**
76 * @template T
77 * @param {function(): T} fn function which will be wrapping in try catch
78 * @param {string} hook name of hook
79 * @returns {T} the result
80 */
81const tryRunOrWebpackError = (fn, hook) => {
82 let r;
83 try {
84 r = fn();
85 } catch (err) {
86 if (err instanceof WebpackError) {
87 throw err;
88 }
89 throw new HookWebpackError(err, hook);
90 }
91 return r;
92};
93
94module.exports.tryRunOrWebpackError = tryRunOrWebpackError;