2023-12-18 13:12:25 +08:00
/ *
MIT License http : //www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @ sokra
* /
"use strict" ;
const WebpackError = require ( "./WebpackError" ) ;
/** @typedef {import("./Module")} Module */
class ModuleParseError extends WebpackError {
/ * *
* @ param { Module } module the errored module
* @ param { string } source source code
* @ param { Error & any } err the parse error
2024-01-16 21:26:16 +08:00
* @ param { string [ ] } loaders the loaders used
2023-12-18 13:12:25 +08:00
* /
2024-01-16 21:26:16 +08:00
constructor ( module , source , err , loaders ) {
2023-12-18 13:12:25 +08:00
let message = "Module parse failed: " + err . message ;
let loc = undefined ;
2024-01-16 21:26:16 +08:00
if ( loaders . length >= 1 ) {
message += ` \n File 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" ;
}
2023-12-18 13:12:25 +08:00
if (
err . loc &&
typeof err . loc === "object" &&
typeof err . loc . line === "number"
) {
var lineNumber = err . loc . line ;
if ( /[\0\u0001\u0002\u0003\u0004\u0005\u0006\u0007]/ . test ( source ) ) {
// binary file
message += "\n(Source code omitted for this binary file)" ;
} else {
2024-01-16 21:26:16 +08:00
const sourceLines = source . split ( /\r?\n/ ) ;
2023-12-18 13:12:25 +08:00
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 = err . loc ;
} else {
message += "\n" + err . stack ;
}
super ( message ) ;
this . name = "ModuleParseError" ;
this . module = module ;
this . loc = loc ;
this . error = err ;
Error . captureStackTrace ( this , this . constructor ) ;
}
}
module . exports = ModuleParseError ;