马宇豪
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
    MIT License http://www.opensource.org/licenses/mit-license.php
    Author Tobias Koppers @sokra
*/
 
"use strict";
 
const WebpackError = require("./WebpackError");
const makeSerializable = require("./util/makeSerializable");
 
/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
 
const WASM_HEADER = Buffer.from([0x00, 0x61, 0x73, 0x6d]);
 
class ModuleParseError extends WebpackError {
    /**
     * @param {string | Buffer} source source code
     * @param {Error&any} err the parse error
     * @param {string[]} loaders the loaders used
     * @param {string} type module type
     */
    constructor(source, err, loaders, type) {
        let message = "Module parse failed: " + (err && err.message);
        let loc = undefined;
 
        if (
            ((Buffer.isBuffer(source) && source.slice(0, 4).equals(WASM_HEADER)) ||
                (typeof source === "string" && /^\0asm/.test(source))) &&
            !type.startsWith("webassembly")
        ) {
            message +=
                "\nThe module seem to be a WebAssembly module, but module is not flagged as WebAssembly module for webpack.";
            message +=
                "\nBREAKING CHANGE: Since webpack 5 WebAssembly is not enabled by default and flagged as experimental feature.";
            message +=
                "\nYou need to enable one of the WebAssembly experiments via 'experiments.asyncWebAssembly: true' (based on async modules) or 'experiments.syncWebAssembly: true' (like webpack 4, deprecated).";
            message +=
                "\nFor files that transpile to WebAssembly, make sure to set the module type in the 'module.rules' section of the config (e. g. 'type: \"webassembly/async\"').";
        } else if (!loaders) {
            message +=
                "\nYou may need an appropriate loader to handle this file type.";
        } else if (loaders.length >= 1) {
            message += `\nFile was processed with these loaders:${loaders
                .map(loader => `\n * ${loader}`)
                .join("")}`;
            message +=
                "\nYou may need an additional loader to handle the result of these loaders.";
        } else {
            message +=
                "\nYou may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders";
        }
 
        if (
            err &&
            err.loc &&
            typeof err.loc === "object" &&
            typeof err.loc.line === "number"
        ) {
            var lineNumber = err.loc.line;
 
            if (
                Buffer.isBuffer(source) ||
                /[\0\u0001\u0002\u0003\u0004\u0005\u0006\u0007]/.test(source)
            ) {
                // binary file
                message += "\n(Source code omitted for this binary file)";
            } else {
                const sourceLines = source.split(/\r?\n/);
                const start = Math.max(0, lineNumber - 3);
                const linesBefore = sourceLines.slice(start, lineNumber - 1);
                const theLine = sourceLines[lineNumber - 1];
                const linesAfter = sourceLines.slice(lineNumber, lineNumber + 2);
 
                message +=
                    linesBefore.map(l => `\n| ${l}`).join("") +
                    `\n> ${theLine}` +
                    linesAfter.map(l => `\n| ${l}`).join("");
            }
 
            loc = { start: err.loc };
        } else if (err && err.stack) {
            message += "\n" + err.stack;
        }
 
        super(message);
 
        this.name = "ModuleParseError";
        this.loc = loc;
        this.error = err;
    }
 
    /**
     * @param {ObjectSerializerContext} context context
     */
    serialize(context) {
        const { write } = context;
 
        write(this.error);
 
        super.serialize(context);
    }
 
    /**
     * @param {ObjectDeserializerContext} context context
     */
    deserialize(context) {
        const { read } = context;
 
        this.error = read();
 
        super.deserialize(context);
    }
}
 
makeSerializable(ModuleParseError, "webpack/lib/ModuleParseError");
 
module.exports = ModuleParseError;