马宇豪
2024-07-16 f591c27b57e2418c9495bc02ae8cfff84d35bc18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
/*
    MIT License http://www.opensource.org/licenses/mit-license.php
    Author Tobias Koppers @sokra
*/
 
"use strict";
 
const loaderFlag = "LOADER_EXECUTION";
 
const webpackOptionsFlag = "WEBPACK_OPTIONS";
 
/**
 * @param {string} stack stack trace
 * @param {string} flag flag to cut off
 * @returns {string} stack trace without the specified flag included
 */
const cutOffByFlag = (stack, flag) => {
    const errorStack = stack.split("\n");
    for (let i = 0; i < errorStack.length; i++) {
        if (errorStack[i].includes(flag)) {
            errorStack.length = i;
        }
    }
    return errorStack.join("\n");
};
 
/**
 * @param {string} stack stack trace
 * @returns {string} stack trace without the loader execution flag included
 */
const cutOffLoaderExecution = stack => cutOffByFlag(stack, loaderFlag);
 
/**
 * @param {string} stack stack trace
 * @returns {string} stack trace without the webpack options flag included
 */
const cutOffWebpackOptions = stack => cutOffByFlag(stack, webpackOptionsFlag);
 
/**
 * @param {string} stack stack trace
 * @param {string} message error message
 * @returns {string} stack trace without the message included
 */
const cutOffMultilineMessage = (stack, message) => {
    const stackSplitByLines = stack.split("\n");
    const messageSplitByLines = message.split("\n");
 
    const result = [];
 
    stackSplitByLines.forEach((line, idx) => {
        if (!line.includes(messageSplitByLines[idx])) result.push(line);
    });
 
    return result.join("\n");
};
 
/**
 * @param {string} stack stack trace
 * @param {string} message error message
 * @returns {string} stack trace without the message included
 */
const cutOffMessage = (stack, message) => {
    const nextLine = stack.indexOf("\n");
    if (nextLine === -1) {
        return stack === message ? "" : stack;
    } else {
        const firstLine = stack.slice(0, nextLine);
        return firstLine === message ? stack.slice(nextLine + 1) : stack;
    }
};
 
/**
 * @param {string} stack stack trace
 * @param {string} message error message
 * @returns {string} stack trace without the loader execution flag and message included
 */
const cleanUp = (stack, message) => {
    stack = cutOffLoaderExecution(stack);
    stack = cutOffMessage(stack, message);
    return stack;
};
 
/**
 * @param {string} stack stack trace
 * @param {string} message error message
 * @returns {string} stack trace without the webpack options flag and message included
 */
const cleanUpWebpackOptions = (stack, message) => {
    stack = cutOffWebpackOptions(stack);
    stack = cutOffMultilineMessage(stack, message);
    return stack;
};
 
exports.cutOffByFlag = cutOffByFlag;
exports.cutOffLoaderExecution = cutOffLoaderExecution;
exports.cutOffWebpackOptions = cutOffWebpackOptions;
exports.cutOffMultilineMessage = cutOffMultilineMessage;
exports.cutOffMessage = cutOffMessage;
exports.cleanUp = cleanUp;
exports.cleanUpWebpackOptions = cleanUpWebpackOptions;