2013-01-31 01:49:25 +08:00
/ *
MIT License http : //www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @ sokra
* /
2018-07-30 23:08:51 +08:00
2017-01-19 11:09:33 +08:00
"use strict" ;
2017-03-25 05:17:47 +08:00
const WebpackError = require ( "./WebpackError" ) ;
2018-10-25 16:47:52 +08:00
const makeSerializable = require ( "./util/makeSerializable" ) ;
2017-03-25 05:17:47 +08:00
2023-04-12 02:57:43 +08:00
/** @typedef {import("./serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
/** @typedef {import("./serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
2020-04-29 02:22:50 +08:00
const WASM _HEADER = Buffer . from ( [ 0x00 , 0x61 , 0x73 , 0x6d ] ) ;
2017-03-25 05:17:47 +08:00
class ModuleParseError extends WebpackError {
2018-06-04 16:10:23 +08:00
/ * *
2020-04-29 02:22:50 +08:00
* @ param { string | Buffer } source source code
2018-06-04 16:10:23 +08:00
* @ param { Error & any } err the parse error
2019-05-30 05:11:49 +08:00
* @ param { string [ ] } loaders the loaders used
2020-04-29 02:22:50 +08:00
* @ param { string } type module type
2018-06-04 16:10:23 +08:00
* /
2020-04-29 02:22:50 +08:00
constructor ( source , err , loaders , type ) {
2018-10-30 05:18:08 +08:00
let message = "Module parse failed: " + ( err && err . message ) ;
2018-06-04 16:10:23 +08:00
let loc = undefined ;
2018-10-25 16:47:52 +08:00
2020-04-29 02:22:50 +08:00
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 ) {
2019-06-13 17:22:00 +08:00
message +=
"\nYou may need an appropriate loader to handle this file type." ;
} else if ( loaders . length >= 1 ) {
2019-06-03 21:23:13 +08:00
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." ;
2019-05-30 05:11:49 +08:00
} else {
message +=
2019-06-03 21:23:13 +08:00
"\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" ;
2019-05-30 05:11:49 +08:00
}
2018-10-25 16:47:52 +08:00
2018-02-25 09:00:20 +08:00
if (
2018-10-30 05:18:08 +08:00
err &&
2018-02-25 09:00:20 +08:00
err . loc &&
typeof err . loc === "object" &&
typeof err . loc . line === "number"
) {
2017-01-19 11:09:33 +08:00
var lineNumber = err . loc . line ;
2018-10-25 16:47:52 +08:00
2020-04-29 02:22:50 +08:00
if (
Buffer . isBuffer ( source ) ||
/[\0\u0001\u0002\u0003\u0004\u0005\u0006\u0007]/ . test ( source )
) {
2018-02-25 09:00:20 +08:00
// binary file
2018-06-04 16:10:23 +08:00
message += "\n(Source code omitted for this binary file)" ;
2017-01-19 11:09:33 +08:00
} else {
2019-06-04 20:48:46 +08:00
const sourceLines = source . split ( /\r?\n/ ) ;
2018-06-04 16:10:23 +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 ) ;
2018-10-25 16:47:52 +08:00
2018-06-04 16:10:23 +08:00
message +=
linesBefore . map ( l => ` \n | ${ l } ` ) . join ( "" ) +
` \n > ${ theLine } ` +
linesAfter . map ( l => ` \n | ${ l } ` ) . join ( "" ) ;
2017-01-19 11:09:33 +08:00
}
2018-10-25 16:47:52 +08:00
2018-07-14 03:30:55 +08:00
loc = { start : err . loc } ;
2018-10-30 05:18:08 +08:00
} else if ( err && err . stack ) {
2018-06-04 16:10:23 +08:00
message += "\n" + err . stack ;
2014-03-20 15:38:28 +08:00
}
2018-06-04 16:10:23 +08:00
super ( message ) ;
this . name = "ModuleParseError" ;
this . loc = loc ;
2017-01-19 11:09:33 +08:00
this . error = err ;
2013-01-31 01:49:25 +08:00
}
2018-10-25 16:47:52 +08:00
2023-04-12 02:57:43 +08:00
/ * *
* @ param { ObjectSerializerContext } context context
* /
2018-10-25 16:47:52 +08:00
serialize ( context ) {
const { write } = context ;
write ( this . error ) ;
super . serialize ( context ) ;
}
2023-04-12 02:57:43 +08:00
/ * *
* @ param { ObjectDeserializerContext } context context
* /
2018-10-25 16:47:52 +08:00
deserialize ( context ) {
const { read } = context ;
this . error = read ( ) ;
super . deserialize ( context ) ;
}
2013-01-31 01:49:25 +08:00
}
2018-10-25 16:49:51 +08:00
makeSerializable ( ModuleParseError , "webpack/lib/ModuleParseError" ) ;
2018-10-25 16:47:52 +08:00
2017-01-19 11:09:33 +08:00
module . exports = ModuleParseError ;