webpack
Advanced tools
Comparing version 5.72.1 to 5.73.0
@@ -193,3 +193,4 @@ /* | ||
css: options.experiments.css, | ||
futureDefaults | ||
futureDefaults, | ||
isNode: targetProperties && targetProperties.node === true | ||
}); | ||
@@ -455,2 +456,3 @@ | ||
* @param {boolean} options.futureDefaults is future defaults enabled | ||
* @param {boolean} options.isNode is node target platform | ||
* @returns {void} | ||
@@ -460,3 +462,3 @@ */ | ||
parserOptions, | ||
{ futureDefaults } | ||
{ futureDefaults, isNode } | ||
) => { | ||
@@ -476,2 +478,6 @@ D(parserOptions, "unknownContextRequest", "."); | ||
D(parserOptions, "importMeta", true); | ||
D(parserOptions, "dynamicImportMode", "lazy"); | ||
D(parserOptions, "dynamicImportPrefetch", false); | ||
D(parserOptions, "dynamicImportPreload", false); | ||
D(parserOptions, "createRequire", isNode); | ||
if (futureDefaults) D(parserOptions, "exportsPresence", "error"); | ||
@@ -488,2 +494,3 @@ }; | ||
* @param {boolean} options.futureDefaults is future defaults enabled | ||
* @param {boolean} options.isNode is node target platform | ||
* @returns {void} | ||
@@ -493,3 +500,3 @@ */ | ||
module, | ||
{ cache, syncWebAssembly, asyncWebAssembly, css, futureDefaults } | ||
{ cache, syncWebAssembly, asyncWebAssembly, css, futureDefaults, isNode } | ||
) => { | ||
@@ -513,3 +520,4 @@ if (cache) { | ||
applyJavascriptParserOptionsDefaults(module.parser.javascript, { | ||
futureDefaults | ||
futureDefaults, | ||
isNode | ||
}); | ||
@@ -516,0 +524,0 @@ |
@@ -8,5 +8,8 @@ /* | ||
const { fileURLToPath } = require("url"); | ||
const CommentCompilationWarning = require("../CommentCompilationWarning"); | ||
const RuntimeGlobals = require("../RuntimeGlobals"); | ||
const UnsupportedFeatureWarning = require("../UnsupportedFeatureWarning"); | ||
const WebpackError = require("../WebpackError"); | ||
const BasicEvaluatedExpression = require("../javascript/BasicEvaluatedExpression"); | ||
const { | ||
@@ -30,4 +33,8 @@ evaluateToIdentifier, | ||
/** @typedef {import("estree").CallExpression} CallExpressionNode */ | ||
/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */ | ||
const createRequireSpecifierTag = Symbol("createRequire"); | ||
const createdRequireIdentifierTag = Symbol("createRequire()"); | ||
class CommonJsImportsParserPlugin { | ||
@@ -44,3 +51,10 @@ /** | ||
// metadata // | ||
const getContext = () => { | ||
if (parser.currentTagData) { | ||
const { context } = parser.currentTagData; | ||
return context; | ||
} | ||
}; | ||
//#region metadata | ||
const tapRequireExpression = (expression, getMembers) => { | ||
@@ -50,3 +64,3 @@ parser.hooks.typeof | ||
.tap( | ||
"CommonJsPlugin", | ||
"CommonJsImportsParserPlugin", | ||
toConstantDependency(parser, JSON.stringify("function")) | ||
@@ -56,31 +70,45 @@ ); | ||
.for(expression) | ||
.tap("CommonJsPlugin", evaluateToString("function")); | ||
.tap("CommonJsImportsParserPlugin", evaluateToString("function")); | ||
parser.hooks.evaluateIdentifier | ||
.for(expression) | ||
.tap( | ||
"CommonJsPlugin", | ||
"CommonJsImportsParserPlugin", | ||
evaluateToIdentifier(expression, "require", getMembers, true) | ||
); | ||
}; | ||
const tapRequireExpressionTag = tag => { | ||
parser.hooks.typeof | ||
.for(tag) | ||
.tap( | ||
"CommonJsImportsParserPlugin", | ||
toConstantDependency(parser, JSON.stringify("function")) | ||
); | ||
parser.hooks.evaluateTypeof | ||
.for(tag) | ||
.tap("CommonJsImportsParserPlugin", evaluateToString("function")); | ||
}; | ||
tapRequireExpression("require", () => []); | ||
tapRequireExpression("require.resolve", () => ["resolve"]); | ||
tapRequireExpression("require.resolveWeak", () => ["resolveWeak"]); | ||
//#endregion | ||
// Weird stuff // | ||
parser.hooks.assign.for("require").tap("CommonJsPlugin", expr => { | ||
// to not leak to global "require", we need to define a local require here. | ||
const dep = new ConstDependency("var require;", 0); | ||
dep.loc = expr.loc; | ||
parser.state.module.addPresentationalDependency(dep); | ||
return true; | ||
}); | ||
parser.hooks.assign | ||
.for("require") | ||
.tap("CommonJsImportsParserPlugin", expr => { | ||
// to not leak to global "require", we need to define a local require here. | ||
const dep = new ConstDependency("var require;", 0); | ||
dep.loc = expr.loc; | ||
parser.state.module.addPresentationalDependency(dep); | ||
return true; | ||
}); | ||
// Unsupported // | ||
//#region Unsupported | ||
parser.hooks.expression | ||
.for("require.main.require") | ||
.for("require.main") | ||
.tap( | ||
"CommonJsPlugin", | ||
"CommonJsImportsParserPlugin", | ||
expressionIsUnsupported( | ||
parser, | ||
"require.main.require is not supported by webpack." | ||
"require.main is not supported by webpack." | ||
) | ||
@@ -91,3 +119,3 @@ ); | ||
.tap( | ||
"CommonJsPlugin", | ||
"CommonJsImportsParserPlugin", | ||
expressionIsUnsupported( | ||
@@ -101,3 +129,3 @@ parser, | ||
.tap( | ||
"CommonJsPlugin", | ||
"CommonJsImportsParserPlugin", | ||
expressionIsUnsupported( | ||
@@ -111,3 +139,3 @@ parser, | ||
.tap( | ||
"CommonJsPlugin", | ||
"CommonJsImportsParserPlugin", | ||
expressionIsUnsupported( | ||
@@ -118,6 +146,6 @@ parser, | ||
); | ||
//#endregion | ||
// renaming // | ||
parser.hooks.canRename.for("require").tap("CommonJsPlugin", () => true); | ||
parser.hooks.rename.for("require").tap("CommonJsPlugin", expr => { | ||
//#region Renaming | ||
const defineUndefined = expr => { | ||
// To avoid "not defined" error, replace the value with undefined | ||
@@ -128,44 +156,62 @@ const dep = new ConstDependency("undefined", expr.range); | ||
return false; | ||
}); | ||
}; | ||
parser.hooks.canRename | ||
.for("require") | ||
.tap("CommonJsImportsParserPlugin", () => true); | ||
parser.hooks.rename | ||
.for("require") | ||
.tap("CommonJsImportsParserPlugin", defineUndefined); | ||
//#endregion | ||
// inspection // | ||
//#region Inspection | ||
const requireCache = toConstantDependency( | ||
parser, | ||
RuntimeGlobals.moduleCache, | ||
[ | ||
RuntimeGlobals.moduleCache, | ||
RuntimeGlobals.moduleId, | ||
RuntimeGlobals.moduleLoaded | ||
] | ||
); | ||
parser.hooks.expression | ||
.for("require.cache") | ||
.tap( | ||
"CommonJsImportsParserPlugin", | ||
toConstantDependency(parser, RuntimeGlobals.moduleCache, [ | ||
RuntimeGlobals.moduleCache, | ||
RuntimeGlobals.moduleId, | ||
RuntimeGlobals.moduleLoaded | ||
]) | ||
.tap("CommonJsImportsParserPlugin", requireCache); | ||
//#endregion | ||
//#region Require as expression | ||
const requireAsExpressionHandler = expr => { | ||
const dep = new CommonJsRequireContextDependency( | ||
{ | ||
request: options.unknownContextRequest, | ||
recursive: options.unknownContextRecursive, | ||
regExp: options.unknownContextRegExp, | ||
mode: "sync" | ||
}, | ||
expr.range, | ||
undefined, | ||
parser.scope.inShorthand, | ||
getContext() | ||
); | ||
// require as expression // | ||
dep.critical = | ||
options.unknownContextCritical && | ||
"require function is used in a way in which dependencies cannot be statically extracted"; | ||
dep.loc = expr.loc; | ||
dep.optional = !!parser.scope.inTry; | ||
parser.state.current.addDependency(dep); | ||
return true; | ||
}; | ||
parser.hooks.expression | ||
.for("require") | ||
.tap("CommonJsImportsParserPlugin", expr => { | ||
const dep = new CommonJsRequireContextDependency( | ||
{ | ||
request: options.unknownContextRequest, | ||
recursive: options.unknownContextRecursive, | ||
regExp: options.unknownContextRegExp, | ||
mode: "sync" | ||
}, | ||
expr.range, | ||
undefined, | ||
parser.scope.inShorthand | ||
); | ||
dep.critical = | ||
options.unknownContextCritical && | ||
"require function is used in a way in which dependencies cannot be statically extracted"; | ||
dep.loc = expr.loc; | ||
dep.optional = !!parser.scope.inTry; | ||
parser.state.current.addDependency(dep); | ||
return true; | ||
}); | ||
.tap("CommonJsImportsParserPlugin", requireAsExpressionHandler); | ||
//#endregion | ||
// require // | ||
//#region Require | ||
const processRequireItem = (expr, param) => { | ||
if (param.isString()) { | ||
const dep = new CommonJsRequireDependency(param.string, param.range); | ||
const dep = new CommonJsRequireDependency( | ||
param.string, | ||
param.range, | ||
getContext() | ||
); | ||
dep.loc = expr.loc; | ||
@@ -187,3 +233,5 @@ dep.optional = !!parser.scope.inTry; | ||
}, | ||
parser | ||
parser, | ||
undefined, | ||
getContext() | ||
); | ||
@@ -282,4 +330,5 @@ if (!dep) return; | ||
.tap("CommonJsImportsParserPlugin", createRequireHandler(true)); | ||
//#endregion | ||
// require with property access // | ||
//#region Require with property access | ||
const chainHandler = (expr, calleeMembers, callExpr, members) => { | ||
@@ -331,4 +380,5 @@ if (callExpr.arguments.length !== 1) return; | ||
.tap("CommonJsImportsParserPlugin", callChainHandler); | ||
//#endregion | ||
// require.resolve // | ||
//#region Require.resolve | ||
const processResolve = (expr, weak) => { | ||
@@ -361,3 +411,7 @@ if (expr.arguments.length !== 1) return; | ||
if (param.isString()) { | ||
const dep = new RequireResolveDependency(param.string, param.range); | ||
const dep = new RequireResolveDependency( | ||
param.string, | ||
param.range, | ||
getContext() | ||
); | ||
dep.loc = expr.loc; | ||
@@ -381,3 +435,4 @@ dep.optional = !!parser.scope.inTry; | ||
}, | ||
parser | ||
parser, | ||
getContext() | ||
); | ||
@@ -393,3 +448,3 @@ if (!dep) return; | ||
.for("require.resolve") | ||
.tap("RequireResolveDependencyParserPlugin", expr => { | ||
.tap("CommonJsImportsParserPlugin", expr => { | ||
return processResolve(expr, false); | ||
@@ -399,7 +454,233 @@ }); | ||
.for("require.resolveWeak") | ||
.tap("RequireResolveDependencyParserPlugin", expr => { | ||
.tap("CommonJsImportsParserPlugin", expr => { | ||
return processResolve(expr, true); | ||
}); | ||
//#endregion | ||
//#region Create require | ||
if (!options.createRequire) return; | ||
let moduleName; | ||
let specifierName; | ||
if (options.createRequire === true) { | ||
moduleName = "module"; | ||
specifierName = "createRequire"; | ||
} else { | ||
const match = /^(.*) from (.*)$/.exec(options.createRequire); | ||
if (match) { | ||
[, specifierName, moduleName] = match; | ||
} | ||
if (!specifierName || !moduleName) { | ||
const err = new WebpackError( | ||
`Parsing javascript parser option "createRequire" failed, got ${JSON.stringify( | ||
options.createRequire | ||
)}` | ||
); | ||
err.details = | ||
'Expected string in format "createRequire from module", where "createRequire" is specifier name and "module" name of the module'; | ||
throw err; | ||
} | ||
} | ||
tapRequireExpressionTag(createdRequireIdentifierTag); | ||
tapRequireExpressionTag(createRequireSpecifierTag); | ||
parser.hooks.evaluateCallExpression | ||
.for(createRequireSpecifierTag) | ||
.tap("CommonJsImportsParserPlugin", expr => { | ||
const context = parseCreateRequireArguments(expr); | ||
if (context === undefined) return; | ||
const ident = parser.evaluatedVariable({ | ||
tag: createdRequireIdentifierTag, | ||
data: { context }, | ||
next: undefined | ||
}); | ||
return new BasicEvaluatedExpression() | ||
.setIdentifier(ident, ident, () => []) | ||
.setSideEffects(false) | ||
.setRange(expr.range); | ||
}); | ||
parser.hooks.unhandledExpressionMemberChain | ||
.for(createdRequireIdentifierTag) | ||
.tap("CommonJsImportsParserPlugin", (expr, members) => { | ||
return expressionIsUnsupported( | ||
parser, | ||
`createRequire().${members.join(".")} is not supported by webpack.` | ||
)(expr); | ||
}); | ||
parser.hooks.canRename | ||
.for(createdRequireIdentifierTag) | ||
.tap("CommonJsImportsParserPlugin", () => true); | ||
parser.hooks.canRename | ||
.for(createRequireSpecifierTag) | ||
.tap("CommonJsImportsParserPlugin", () => true); | ||
parser.hooks.rename | ||
.for(createRequireSpecifierTag) | ||
.tap("CommonJsImportsParserPlugin", defineUndefined); | ||
parser.hooks.expression | ||
.for(createdRequireIdentifierTag) | ||
.tap("CommonJsImportsParserPlugin", requireAsExpressionHandler); | ||
parser.hooks.call | ||
.for(createdRequireIdentifierTag) | ||
.tap("CommonJsImportsParserPlugin", createRequireHandler(false)); | ||
/** | ||
* @param {CallExpressionNode} expr call expression | ||
* @returns {string} context | ||
*/ | ||
const parseCreateRequireArguments = expr => { | ||
const args = expr.arguments; | ||
if (args.length !== 1) { | ||
const err = new WebpackError( | ||
"module.createRequire supports only one argument." | ||
); | ||
err.loc = expr.loc; | ||
parser.state.module.addWarning(err); | ||
return; | ||
} | ||
const arg = args[0]; | ||
const evaluated = parser.evaluateExpression(arg); | ||
if (!evaluated.isString()) { | ||
const err = new WebpackError( | ||
"module.createRequire failed parsing argument." | ||
); | ||
err.loc = arg.loc; | ||
parser.state.module.addWarning(err); | ||
return; | ||
} | ||
const ctx = evaluated.string.startsWith("file://") | ||
? fileURLToPath(evaluated.string) | ||
: evaluated.string; | ||
// argument always should be a filename | ||
return ctx.slice(0, ctx.lastIndexOf(ctx.startsWith("/") ? "/" : "\\")); | ||
}; | ||
parser.hooks.import.tap( | ||
{ | ||
name: "CommonJsImportsParserPlugin", | ||
stage: -10 | ||
}, | ||
(statement, source) => { | ||
if ( | ||
source !== moduleName || | ||
statement.specifiers.length !== 1 || | ||
statement.specifiers[0].type !== "ImportSpecifier" || | ||
statement.specifiers[0].imported.type !== "Identifier" || | ||
statement.specifiers[0].imported.name !== specifierName | ||
) | ||
return; | ||
// clear for 'import { createRequire as x } from "module"' | ||
// if any other specifier was used import module | ||
const clearDep = new ConstDependency( | ||
parser.isAsiPosition(statement.range[0]) ? ";" : "", | ||
statement.range | ||
); | ||
clearDep.loc = statement.loc; | ||
parser.state.module.addPresentationalDependency(clearDep); | ||
parser.unsetAsiPosition(statement.range[1]); | ||
return true; | ||
} | ||
); | ||
parser.hooks.importSpecifier.tap( | ||
{ | ||
name: "CommonJsImportsParserPlugin", | ||
stage: -10 | ||
}, | ||
(statement, source, id, name) => { | ||
if (source !== moduleName || id !== specifierName) return; | ||
parser.tagVariable(name, createRequireSpecifierTag); | ||
return true; | ||
} | ||
); | ||
parser.hooks.preDeclarator.tap( | ||
"CommonJsImportsParserPlugin", | ||
declarator => { | ||
if ( | ||
declarator.id.type !== "Identifier" || | ||
!declarator.init || | ||
declarator.init.type !== "CallExpression" || | ||
declarator.init.callee.type !== "Identifier" | ||
) | ||
return; | ||
const variableInfo = parser.getVariableInfo( | ||
declarator.init.callee.name | ||
); | ||
if ( | ||
variableInfo && | ||
variableInfo.tagInfo && | ||
variableInfo.tagInfo.tag === createRequireSpecifierTag | ||
) { | ||
const context = parseCreateRequireArguments(declarator.init); | ||
if (context === undefined) return; | ||
parser.tagVariable(declarator.id.name, createdRequireIdentifierTag, { | ||
name: declarator.id.name, | ||
context | ||
}); | ||
return true; | ||
} | ||
} | ||
); | ||
parser.hooks.memberChainOfCallMemberChain | ||
.for(createRequireSpecifierTag) | ||
.tap( | ||
"CommonJsImportsParserPlugin", | ||
(expr, calleeMembers, callExpr, members) => { | ||
if ( | ||
calleeMembers.length !== 0 || | ||
members.length !== 1 || | ||
members[0] !== "cache" | ||
) | ||
return; | ||
// createRequire().cache | ||
const context = parseCreateRequireArguments(callExpr); | ||
if (context === undefined) return; | ||
return requireCache(expr); | ||
} | ||
); | ||
parser.hooks.callMemberChainOfCallMemberChain | ||
.for(createRequireSpecifierTag) | ||
.tap( | ||
"CommonJsImportsParserPlugin", | ||
(expr, calleeMembers, innerCallExpression, members) => { | ||
if ( | ||
calleeMembers.length !== 0 || | ||
members.length !== 1 || | ||
members[0] !== "resolve" | ||
) | ||
return; | ||
// createRequire().resolve() | ||
return processResolve(expr, false); | ||
} | ||
); | ||
parser.hooks.expressionMemberChain | ||
.for(createdRequireIdentifierTag) | ||
.tap("CommonJsImportsParserPlugin", (expr, members) => { | ||
// require.cache | ||
if (members.length === 1 && members[0] === "cache") { | ||
return requireCache(expr); | ||
} | ||
}); | ||
parser.hooks.callMemberChain | ||
.for(createdRequireIdentifierTag) | ||
.tap("CommonJsImportsParserPlugin", (expr, members) => { | ||
// require.resolve() | ||
if (members.length === 1 && members[0] === "resolve") { | ||
return processResolve(expr, false); | ||
} | ||
}); | ||
parser.hooks.call | ||
.for(createRequireSpecifierTag) | ||
.tap("CommonJsImportsParserPlugin", expr => { | ||
const clearDep = new ConstDependency( | ||
"/* createRequire() */ undefined", | ||
expr.range | ||
); | ||
clearDep.loc = expr.loc; | ||
parser.state.module.addPresentationalDependency(clearDep); | ||
return true; | ||
}); | ||
//#endregion | ||
} | ||
} | ||
module.exports = CommonJsImportsParserPlugin; |
@@ -13,4 +13,4 @@ /* | ||
class CommonJsRequireContextDependency extends ContextDependency { | ||
constructor(options, range, valueRange, inShorthand) { | ||
super(options); | ||
constructor(options, range, valueRange, inShorthand, context) { | ||
super(options, context); | ||
@@ -17,0 +17,0 @@ this.range = range; |
@@ -13,5 +13,6 @@ /* | ||
class CommonJsRequireDependency extends ModuleDependency { | ||
constructor(request, range) { | ||
constructor(request, range, context) { | ||
super(request); | ||
this.range = range; | ||
this._context = context; | ||
} | ||
@@ -18,0 +19,0 @@ |
@@ -29,4 +29,5 @@ /* | ||
* @param {ContextDependencyOptions} options options for the context module | ||
* @param {string=} context request context | ||
*/ | ||
constructor(options) { | ||
constructor(options, context) { | ||
super(); | ||
@@ -54,4 +55,12 @@ | ||
this.replaces = undefined; | ||
this._requestContext = context; | ||
} | ||
/** | ||
* @returns {string | undefined} a request context | ||
*/ | ||
getContext() { | ||
return this._requestContext; | ||
} | ||
get category() { | ||
@@ -73,3 +82,5 @@ return "commonjs"; | ||
return ( | ||
`context${this.options.request} ${this.options.recursive} ` + | ||
`context${this._requestContext || ""}|ctx request${ | ||
this.options.request | ||
} ${this.options.recursive} ` + | ||
`${regExpToString(this.options.regExp)} ${regExpToString( | ||
@@ -118,2 +129,3 @@ this.options.include | ||
write(this.request); | ||
write(this._requestContext); | ||
write(this.range); | ||
@@ -135,2 +147,3 @@ write(this.valueRange); | ||
this.request = read(); | ||
this._requestContext = read(); | ||
this.range = read(); | ||
@@ -137,0 +150,0 @@ this.valueRange = read(); |
@@ -42,3 +42,3 @@ /* | ||
/** @typedef {{ new(options: ContextDependencyOptions, range: [number, number], valueRange: [number, number]): ContextDependency }} ContextDependencyConstructor */ | ||
/** @typedef {{ new(options: ContextDependencyOptions, range: [number, number], valueRange: [number, number], ...args: any[]): ContextDependency }} ContextDependencyConstructor */ | ||
@@ -53,5 +53,15 @@ /** | ||
* @param {JavascriptParser} parser the parser | ||
* @param {...any} depArgs depArgs | ||
* @returns {ContextDependency} the created Dependency | ||
*/ | ||
exports.create = (Dep, range, param, expr, options, contextOptions, parser) => { | ||
exports.create = ( | ||
Dep, | ||
range, | ||
param, | ||
expr, | ||
options, | ||
contextOptions, | ||
parser, | ||
...depArgs | ||
) => { | ||
if (param.isTemplateString()) { | ||
@@ -102,3 +112,4 @@ let prefixRaw = param.quasis[0].string; | ||
range, | ||
valueRange | ||
valueRange, | ||
...depArgs | ||
); | ||
@@ -186,3 +197,4 @@ dep.loc = expr.loc; | ||
range, | ||
valueRange | ||
valueRange, | ||
...depArgs | ||
); | ||
@@ -225,3 +237,4 @@ dep.loc = expr.loc; | ||
range, | ||
param.range | ||
param.range, | ||
...depArgs | ||
); | ||
@@ -228,0 +241,0 @@ dep.loc = expr.loc; |
@@ -52,16 +52,2 @@ /* | ||
/** | ||
* @returns {string | undefined} a request context | ||
*/ | ||
getContext() { | ||
return this._context; | ||
} | ||
/** | ||
* @returns {string | null} an identifier to merge equal requests | ||
*/ | ||
getResourceIdentifier() { | ||
return `context${this._context || ""}|${super.getResourceIdentifier()}`; | ||
} | ||
get category() { | ||
@@ -90,3 +76,2 @@ return this._category; | ||
write(this._category); | ||
write(this._context); | ||
write(this.referencedExports); | ||
@@ -100,3 +85,2 @@ super.serialize(context); | ||
this._category = read(); | ||
this._context = read(); | ||
this.referencedExports = read(); | ||
@@ -103,0 +87,0 @@ super.deserialize(context); |
@@ -106,3 +106,3 @@ /* | ||
if (typeof value === "boolean") { | ||
source.replace(dep.range[0], dep.range[1] - 1, `${value}`); | ||
source.replace(dep.range[0], dep.range[1] - 1, ` ${value}`); | ||
} else { | ||
@@ -109,0 +109,0 @@ const usedName = exportsInfo.getUsedName(ids, runtime); |
@@ -17,2 +17,3 @@ /* | ||
/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */ | ||
/** @typedef {import("../ChunkGroup").RawChunkGroupOptions} RawChunkGroupOptions */ | ||
@@ -22,2 +23,5 @@ /** @typedef {import("../ContextModule").ContextMode} ContextMode */ | ||
class ImportParserPlugin { | ||
/** | ||
* @param {JavascriptParserOptions} options options | ||
*/ | ||
constructor(options) { | ||
@@ -33,3 +37,3 @@ this.options = options; | ||
/** @type {ContextMode} */ | ||
let mode = "lazy"; | ||
let mode = this.options.dynamicImportMode; | ||
let include = null; | ||
@@ -42,2 +46,13 @@ let exclude = null; | ||
const { dynamicImportPreload, dynamicImportPrefetch } = this.options; | ||
if (dynamicImportPreload !== undefined && dynamicImportPreload !== false) | ||
groupOptions.preloadOrder = | ||
dynamicImportPreload === true ? 0 : dynamicImportPreload; | ||
if ( | ||
dynamicImportPrefetch !== undefined && | ||
dynamicImportPrefetch !== false | ||
) | ||
groupOptions.prefetchOrder = | ||
dynamicImportPrefetch === true ? 0 : dynamicImportPrefetch; | ||
const { options: importOptions, errors: commentErrors } = | ||
@@ -182,12 +197,18 @@ parser.parseCommentOptions(expr.range); | ||
if ( | ||
mode !== "lazy" && | ||
mode !== "lazy-once" && | ||
mode !== "eager" && | ||
mode !== "weak" | ||
) { | ||
parser.state.module.addWarning( | ||
new UnsupportedFeatureWarning( | ||
`\`webpackMode\` expected 'lazy', 'lazy-once', 'eager' or 'weak', but received: ${mode}.`, | ||
expr.loc | ||
) | ||
); | ||
mode = "lazy"; | ||
} | ||
if (param.isString()) { | ||
if (mode !== "lazy" && mode !== "eager" && mode !== "weak") { | ||
parser.state.module.addWarning( | ||
new UnsupportedFeatureWarning( | ||
`\`webpackMode\` expected 'lazy', 'eager' or 'weak', but received: ${mode}.`, | ||
expr.loc | ||
) | ||
); | ||
} | ||
if (mode === "eager") { | ||
@@ -223,17 +244,2 @@ const dep = new ImportEagerDependency( | ||
} else { | ||
if ( | ||
mode !== "lazy" && | ||
mode !== "lazy-once" && | ||
mode !== "eager" && | ||
mode !== "weak" | ||
) { | ||
parser.state.module.addWarning( | ||
new UnsupportedFeatureWarning( | ||
`\`webpackMode\` expected 'lazy', 'lazy-once', 'eager' or 'weak', but received: ${mode}.`, | ||
expr.loc | ||
) | ||
); | ||
mode = "lazy"; | ||
} | ||
if (mode === "weak") { | ||
@@ -240,0 +246,0 @@ mode = "async-weak"; |
@@ -16,2 +16,3 @@ /* | ||
/** @typedef {import("../ModuleGraph")} ModuleGraph */ | ||
/** @typedef {import("../json/JsonData")} JsonData */ | ||
/** @typedef {import("../util/Hash")} Hash */ | ||
@@ -22,9 +23,11 @@ | ||
if (Array.isArray(data)) { | ||
return data.map((item, idx) => { | ||
return { | ||
name: `${idx}`, | ||
canMangle: true, | ||
exports: getExportsFromData(item) | ||
}; | ||
}); | ||
return data.length < 100 | ||
? data.map((item, idx) => { | ||
return { | ||
name: `${idx}`, | ||
canMangle: true, | ||
exports: getExportsFromData(item) | ||
}; | ||
}) | ||
: undefined; | ||
} else { | ||
@@ -47,8 +50,7 @@ const exports = []; | ||
/** | ||
* @param {(string | ExportSpec)[]} exports json exports | ||
* @param {JsonData=} data json data | ||
*/ | ||
constructor(exports) { | ||
constructor(data) { | ||
super(); | ||
this.exports = exports; | ||
this._hashUpdate = undefined; | ||
this.data = data; | ||
} | ||
@@ -67,3 +69,3 @@ | ||
return { | ||
exports: this.exports, | ||
exports: getExportsFromData(this.data && this.data.get()), | ||
dependencies: undefined | ||
@@ -80,8 +82,3 @@ }; | ||
updateHash(hash, context) { | ||
if (this._hashUpdate === undefined) { | ||
this._hashUpdate = this.exports | ||
? JSON.stringify(this.exports) | ||
: "undefined"; | ||
} | ||
hash.update(this._hashUpdate); | ||
this.data.updateHash(hash); | ||
} | ||
@@ -91,3 +88,3 @@ | ||
const { write } = context; | ||
write(this.exports); | ||
write(this.data); | ||
super.serialize(context); | ||
@@ -98,3 +95,3 @@ } | ||
const { read } = context; | ||
this.exports = read(); | ||
this.data = read(); | ||
super.deserialize(context); | ||
@@ -110,2 +107,1 @@ } | ||
module.exports = JsonExportsDependency; | ||
module.exports.getExportsFromData = getExportsFromData; |
@@ -29,9 +29,17 @@ /* | ||
this.assertions = undefined; | ||
this._context = undefined; | ||
} | ||
/** | ||
* @returns {string | undefined} a request context | ||
*/ | ||
getContext() { | ||
return this._context; | ||
} | ||
/** | ||
* @returns {string | null} an identifier to merge equal requests | ||
*/ | ||
getResourceIdentifier() { | ||
let str = `module${this.request}`; | ||
let str = `context${this._context || ""}|module${this.request}`; | ||
if (this.assertions !== undefined) { | ||
@@ -67,2 +75,3 @@ str += JSON.stringify(this.assertions); | ||
write(this.userRequest); | ||
write(this._context); | ||
write(this.range); | ||
@@ -76,2 +85,3 @@ super.serialize(context); | ||
this.userRequest = read(); | ||
this._context = read(); | ||
this.range = read(); | ||
@@ -78,0 +88,0 @@ super.deserialize(context); |
@@ -13,4 +13,4 @@ /* | ||
class RequireResolveContextDependency extends ContextDependency { | ||
constructor(options, range, valueRange) { | ||
super(options); | ||
constructor(options, range, valueRange, context) { | ||
super(options, context); | ||
@@ -17,0 +17,0 @@ this.range = range; |
@@ -18,6 +18,7 @@ /* | ||
class RequireResolveDependency extends ModuleDependency { | ||
constructor(request, range) { | ||
constructor(request, range, context) { | ||
super(request); | ||
this.range = range; | ||
this._context = context; | ||
} | ||
@@ -24,0 +25,0 @@ |
@@ -8,2 +8,4 @@ /* | ||
const { pathToFileURL } = require("url"); | ||
const BasicEvaluatedExpression = require("../javascript/BasicEvaluatedExpression"); | ||
const { approve } = require("../javascript/JavascriptParserHelpers"); | ||
@@ -15,2 +17,3 @@ const InnerGraph = require("../optimize/InnerGraph"); | ||
/** @typedef {import("../Compiler")} Compiler */ | ||
/** @typedef {import("../NormalModule")} NormalModule */ | ||
/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */ | ||
@@ -33,2 +36,9 @@ | ||
/** | ||
* @param {NormalModule} module module | ||
* @returns {URL} file url | ||
*/ | ||
const getUrl = module => { | ||
return pathToFileURL(module.resource); | ||
}; | ||
/** | ||
* @param {JavascriptParser} parser parser | ||
@@ -73,2 +83,13 @@ * @param {object} parserOptions options | ||
parser.hooks.canRename.for("URL").tap("URLPlugin", approve); | ||
parser.hooks.evaluateNewExpression | ||
.for("URL") | ||
.tap("URLPlugin", expr => { | ||
const request = getUrlRequest(expr); | ||
if (!request) return; | ||
const url = new URL(request, getUrl(parser.state.module)); | ||
return new BasicEvaluatedExpression() | ||
.setString(url.toString()) | ||
.setRange(expr.range); | ||
}); | ||
parser.hooks.new.for("URL").tap("URLPlugin", _expr => { | ||
@@ -75,0 +96,0 @@ const expr = /** @type {NewExpressionNode} */ (_expr); |
@@ -31,2 +31,3 @@ /* | ||
/** @typedef {import("./Compilation").EntryOptions} EntryOptions */ | ||
/** @typedef {import("./Compilation").PathData} PathData */ | ||
/** @typedef {import("./Compiler").AssetEmittedInfo} AssetEmittedInfo */ | ||
@@ -33,0 +34,0 @@ /** @typedef {import("./MultiStats")} MultiStats */ |
@@ -27,2 +27,10 @@ /* | ||
} | ||
updateHash(hash) { | ||
if (this._buffer === undefined && this._data !== undefined) { | ||
this._buffer = Buffer.from(JSON.stringify(this._data)); | ||
} | ||
if (this._buffer) return hash.update(this._buffer); | ||
} | ||
} | ||
@@ -29,0 +37,0 @@ |
@@ -44,4 +44,4 @@ /* | ||
: parseFn(source[0] === "\ufeff" ? source.slice(1) : source); | ||
state.module.buildInfo.jsonData = new JsonData(data); | ||
const jsonData = new JsonData(data); | ||
state.module.buildInfo.jsonData = jsonData; | ||
state.module.buildInfo.strict = true; | ||
@@ -51,5 +51,3 @@ state.module.buildMeta.exportsType = "default"; | ||
typeof data === "object" ? "redirect-warn" : false; | ||
state.module.addDependency( | ||
new JsonExportsDependency(JsonExportsDependency.getExportsFromData(data)) | ||
); | ||
state.module.addDependency(new JsonExportsDependency(jsonData)); | ||
return state; | ||
@@ -56,0 +54,0 @@ } |
@@ -67,3 +67,3 @@ /* | ||
"global", | ||
"The global namespace object is Node.js feature and doesn't present in browser." | ||
"The global namespace object is a Node.js feature and isn't available in browsers." | ||
) | ||
@@ -70,0 +70,0 @@ ); |
@@ -23,8 +23,9 @@ /* | ||
return Template.asString([ | ||
'var webpackThen = typeof Symbol === "function" ? Symbol("webpack then") : "__webpack_then__";', | ||
'var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues") : "__webpack_queues__";', | ||
'var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__";', | ||
'var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__";', | ||
`var completeQueue = ${runtimeTemplate.basicFunction("queue", [ | ||
"if(queue) {", | ||
`var resolveQueue = ${runtimeTemplate.basicFunction("queue", [ | ||
"if(queue && !queue.d) {", | ||
Template.indent([ | ||
"queue.d = 1;", | ||
`queue.forEach(${runtimeTemplate.expressionFunction( | ||
@@ -41,10 +42,2 @@ "fn.r--", | ||
])}`, | ||
`var completeFunction = ${runtimeTemplate.expressionFunction( | ||
"!--fn.r && fn()", | ||
"fn" | ||
)};`, | ||
`var queueFunction = ${runtimeTemplate.expressionFunction( | ||
"queue ? queue.push(fn) : completeFunction(fn)", | ||
"queue, fn" | ||
)};`, | ||
`var wrapDeps = ${runtimeTemplate.returningFunction( | ||
@@ -54,19 +47,18 @@ `deps.map(${runtimeTemplate.basicFunction("dep", [ | ||
Template.indent([ | ||
"if(dep[webpackThen]) return dep;", | ||
"if(dep[webpackQueues]) return dep;", | ||
"if(dep.then) {", | ||
Template.indent([ | ||
"var queue = [];", | ||
"queue.d = 0;", | ||
`dep.then(${runtimeTemplate.basicFunction("r", [ | ||
"obj[webpackExports] = r;", | ||
"completeQueue(queue);", | ||
"queue = 0;" | ||
"resolveQueue(queue);" | ||
])}, ${runtimeTemplate.basicFunction("e", [ | ||
"obj[webpackError] = e;", | ||
"completeQueue(queue);", | ||
"queue = 0;" | ||
"resolveQueue(queue);" | ||
])});`, | ||
"var obj = {};", | ||
`obj[webpackThen] = ${runtimeTemplate.expressionFunction( | ||
"queueFunction(queue, fn), dep['catch'](reject)", | ||
"fn, reject" | ||
`obj[webpackQueues] = ${runtimeTemplate.expressionFunction( | ||
`fn(queue)`, | ||
"fn" | ||
)};`, | ||
@@ -79,6 +71,3 @@ "return obj;" | ||
"var ret = {};", | ||
`ret[webpackThen] = ${runtimeTemplate.expressionFunction( | ||
"completeFunction(fn)", | ||
"fn" | ||
)};`, | ||
`ret[webpackQueues] = ${runtimeTemplate.emptyFunction()};`, | ||
"ret[webpackExports] = dep;", | ||
@@ -90,3 +79,6 @@ "return ret;" | ||
`${fn} = ${runtimeTemplate.basicFunction("module, body, hasAwait", [ | ||
"var queue = hasAwait && [];", | ||
"var queue;", | ||
"hasAwait && ((queue = []).d = 1);", | ||
"if(queue) queue.moduleId = module.id;", | ||
"var depQueues = new Set();", | ||
"var exports = module.exports;", | ||
@@ -96,36 +88,12 @@ "var currentDeps;", | ||
"var reject;", | ||
"var isEvaluating = true;", | ||
"var nested = false;", | ||
`var whenAll = ${runtimeTemplate.basicFunction( | ||
"deps, onResolve, onReject", | ||
[ | ||
"if (nested) return;", | ||
"nested = true;", | ||
"onResolve.r += deps.length;", | ||
`deps.map(${runtimeTemplate.expressionFunction( | ||
"dep[webpackThen](onResolve, onReject)", | ||
"dep, i" | ||
)});`, | ||
"nested = false;" | ||
] | ||
)};`, | ||
`var promise = new Promise(${runtimeTemplate.basicFunction( | ||
"resolve, rej", | ||
[ | ||
"reject = rej;", | ||
`outerResolve = ${runtimeTemplate.expressionFunction( | ||
"resolve(exports), completeQueue(queue), queue = 0" | ||
)};` | ||
] | ||
["reject = rej;", "outerResolve = resolve;"] | ||
)});`, | ||
"promise[webpackExports] = exports;", | ||
`promise[webpackThen] = ${runtimeTemplate.basicFunction( | ||
"fn, rejectFn", | ||
[ | ||
"if (isEvaluating) { return completeFunction(fn); }", | ||
"if (currentDeps) whenAll(currentDeps, fn, rejectFn);", | ||
"queueFunction(queue, fn);", | ||
"promise['catch'](rejectFn);" | ||
] | ||
`promise[webpackQueues] = ${runtimeTemplate.expressionFunction( | ||
`queue && fn(queue), depQueues.forEach(fn), promise["catch"](${runtimeTemplate.emptyFunction()})`, | ||
"fn" | ||
)};`, | ||
"promise.moduleId = module.id;", | ||
"module.exports = promise;", | ||
@@ -142,9 +110,17 @@ `body(${runtimeTemplate.basicFunction("deps", [ | ||
`var promise = new Promise(${runtimeTemplate.basicFunction( | ||
"resolve, reject", | ||
"resolve", | ||
[ | ||
`fn = ${runtimeTemplate.expressionFunction( | ||
"resolve(getResult)" | ||
"resolve(getResult)", | ||
"" | ||
)};`, | ||
"fn.r = 0;", | ||
"whenAll(currentDeps, fn, reject);" | ||
`var fnQueue = ${runtimeTemplate.expressionFunction( | ||
"q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))", | ||
"q" | ||
)};`, | ||
`currentDeps.map(${runtimeTemplate.expressionFunction( | ||
"dep[webpackQueues](fnQueue)", | ||
"dep" | ||
)});` | ||
] | ||
@@ -154,6 +130,6 @@ )});`, | ||
])}, ${runtimeTemplate.expressionFunction( | ||
"err && reject(promise[webpackError] = err), outerResolve()", | ||
"(err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue)", | ||
"err" | ||
)});`, | ||
"isEvaluating = false;" | ||
"queue && (queue.d = 0);" | ||
])};` | ||
@@ -160,0 +136,0 @@ ]); |
@@ -132,4 +132,3 @@ /* | ||
} else if (!descriptionFileData.version) { | ||
details = | ||
"No version in description file (usually package.json). Add version to description file, or manually specify version in shared config."; | ||
details = `No version in description file (usually package.json). Add version to description file ${resourceResolveData.descriptionFilePath}, or manually specify version in shared config.`; | ||
} else { | ||
@@ -136,0 +135,0 @@ version = descriptionFileData.version; |
{ | ||
"name": "webpack", | ||
"version": "5.72.1", | ||
"version": "5.73.0", | ||
"author": "Tobias Koppers @sokra", | ||
@@ -5,0 +5,0 @@ "description": "Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.", |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 1 instance in 1 package
4395990
127655
23