webpack/lib/dependencies/AMDDefineDependencyParserPl...

499 lines
15 KiB
JavaScript
Raw Normal View History

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
"use strict";
2018-11-17 01:18:44 +08:00
const RuntimeGlobals = require("../RuntimeGlobals");
const AMDDefineDependency = require("./AMDDefineDependency");
const AMDRequireArrayDependency = require("./AMDRequireArrayDependency");
2018-07-30 23:08:51 +08:00
const AMDRequireContextDependency = require("./AMDRequireContextDependency");
const AMDRequireItemDependency = require("./AMDRequireItemDependency");
const ConstDependency = require("./ConstDependency");
const ContextDependencyHelpers = require("./ContextDependencyHelpers");
const DynamicExports = require("./DynamicExports");
2018-07-30 23:08:51 +08:00
const LocalModuleDependency = require("./LocalModuleDependency");
2018-07-27 04:37:36 +08:00
const { addLocalModule, getLocalModule } = require("./LocalModulesHelpers");
2013-01-31 01:49:25 +08:00
2024-01-27 01:38:18 +08:00
/** @typedef {import("estree").ArrowFunctionExpression} ArrowFunctionExpression */
2023-06-17 03:44:20 +08:00
/** @typedef {import("estree").CallExpression} CallExpression */
2024-01-27 01:38:18 +08:00
/** @typedef {import("estree").Expression} Expression */
/** @typedef {import("estree").FunctionExpression} FunctionExpression */
2024-08-07 23:22:25 +08:00
/** @typedef {import("estree").Identifier} Identifier */
2024-01-27 01:38:18 +08:00
/** @typedef {import("estree").Literal} Literal */
2024-08-07 23:22:25 +08:00
/** @typedef {import("estree").MemberExpression} MemberExpression */
/** @typedef {import("estree").ObjectExpression} ObjectExpression */
2024-01-27 01:38:18 +08:00
/** @typedef {import("estree").SpreadElement} SpreadElement */
/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
/** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
/** @typedef {import("../javascript/BasicEvaluatedExpression")} BasicEvaluatedExpression */
2023-05-22 05:47:28 +08:00
/** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
2025-09-11 08:10:10 +08:00
/** @typedef {import("../javascript/JavascriptParser").ExportedVariableInfo} ExportedVariableInfo */
2024-01-27 01:38:18 +08:00
/** @typedef {import("../javascript/JavascriptParser").Range} Range */
2023-05-22 05:47:28 +08:00
2023-06-17 03:44:20 +08:00
/**
2024-01-27 01:38:18 +08:00
* @param {Expression | SpreadElement} expr expression
2024-08-07 23:22:25 +08:00
* @returns {expr is CallExpression} true if it's a bound function expression
2023-06-17 03:44:20 +08:00
*/
const isBoundFunctionExpression = (expr) => {
2018-02-25 09:00:20 +08:00
if (expr.type !== "CallExpression") return false;
if (expr.callee.type !== "MemberExpression") return false;
if (expr.callee.computed) return false;
if (expr.callee.object.type !== "FunctionExpression") return false;
if (expr.callee.property.type !== "Identifier") return false;
if (expr.callee.property.name !== "bind") return false;
return true;
2017-11-08 18:32:05 +08:00
};
2024-01-27 01:38:18 +08:00
/** @typedef {FunctionExpression | ArrowFunctionExpression} UnboundFunctionExpression */
/**
* @param {Expression | SpreadElement} expr expression
2024-08-07 23:22:25 +08:00
* @returns {expr is FunctionExpression | ArrowFunctionExpression} true when unbound function expression
2024-01-27 01:38:18 +08:00
*/
const isUnboundFunctionExpression = (expr) => {
2018-02-25 09:00:20 +08:00
if (expr.type === "FunctionExpression") return true;
if (expr.type === "ArrowFunctionExpression") return true;
2017-11-19 02:33:48 +08:00
return false;
};
2017-11-19 02:33:48 +08:00
2024-01-27 01:38:18 +08:00
/**
* @param {Expression | SpreadElement} expr expression
2024-08-07 23:22:25 +08:00
* @returns {expr is FunctionExpression | ArrowFunctionExpression | CallExpression} true when callable
2024-01-27 01:38:18 +08:00
*/
const isCallable = (expr) => {
2018-02-25 09:00:20 +08:00
if (isUnboundFunctionExpression(expr)) return true;
if (isBoundFunctionExpression(expr)) return true;
2017-11-19 02:33:48 +08:00
return false;
};
2017-11-19 02:33:48 +08:00
2025-09-11 08:10:10 +08:00
/** @typedef {Record<number, string>} Identifiers */
2025-06-04 02:20:37 +08:00
const PLUGIN_NAME = "AMDDefineDependencyParserPlugin";
class AMDDefineDependencyParserPlugin {
2024-01-27 01:38:18 +08:00
/**
* @param {JavascriptParserOptions} options parserOptions
*/
constructor(options) {
this.options = options;
}
2023-05-22 05:47:28 +08:00
/**
* @param {JavascriptParser} parser the parser
* @returns {void}
*/
2018-03-05 20:51:12 +08:00
apply(parser) {
2018-03-17 00:57:57 +08:00
parser.hooks.call
.for("define")
2025-06-04 02:20:37 +08:00
.tap(PLUGIN_NAME, this.processCallDefine.bind(this, parser));
}
2024-01-27 01:38:18 +08:00
/**
* @param {JavascriptParser} parser the parser
* @param {CallExpression} expr call expression
* @param {BasicEvaluatedExpression} param param
2025-09-11 08:10:10 +08:00
* @param {Identifiers} identifiers identifiers
2024-01-27 01:38:18 +08:00
* @param {string=} namedModule named module
* @returns {boolean | undefined} result
*/
2018-03-17 00:57:57 +08:00
processArray(parser, expr, param, identifiers, namedModule) {
2018-03-05 20:51:12 +08:00
if (param.isArray()) {
2024-08-02 23:42:44 +08:00
const items = /** @type {BasicEvaluatedExpression[]} */ (param.items);
for (const [idx, item] of items.entries()) {
2018-03-05 20:51:12 +08:00
if (
2024-08-02 23:42:44 +08:00
item.isString() &&
2024-01-27 01:38:18 +08:00
["require", "module", "exports"].includes(
2024-08-02 23:42:44 +08:00
/** @type {string} */ (item.string)
2024-01-27 01:38:18 +08:00
)
) {
2025-09-11 08:10:10 +08:00
identifiers[idx] =
/** @type {string} */
(item.string);
}
2024-08-02 23:42:44 +08:00
const result = this.processItem(parser, expr, item, namedModule);
2018-03-05 20:51:12 +08:00
if (result === undefined) {
2024-08-02 23:42:44 +08:00
this.processContext(parser, expr, item);
2018-03-05 20:51:12 +08:00
}
2024-08-02 23:42:44 +08:00
}
2018-03-05 20:51:12 +08:00
return true;
} else if (param.isConstArray()) {
2024-01-27 01:38:18 +08:00
/** @type {(string | LocalModuleDependency | AMDRequireItemDependency)[]} */
2018-03-05 20:51:12 +08:00
const deps = [];
2024-08-07 23:22:25 +08:00
const array = /** @type {string[]} */ (param.array);
for (const [idx, request] of array.entries()) {
2018-03-05 20:51:12 +08:00
let dep;
let localModule;
if (request === "require") {
identifiers[idx] = request;
dep = RuntimeGlobals.require;
2018-03-05 20:51:12 +08:00
} else if (["exports", "module"].includes(request)) {
identifiers[idx] = request;
dep = request;
2018-07-27 04:37:36 +08:00
} else if ((localModule = getLocalModule(parser.state, request))) {
localModule.flagUsed();
2018-04-10 15:22:34 +08:00
dep = new LocalModuleDependency(localModule, undefined, false);
2024-01-27 01:38:18 +08:00
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
parser.state.module.addPresentationalDependency(dep);
2017-11-27 22:27:41 +08:00
} else {
2018-03-05 20:51:12 +08:00
dep = this.newRequireItemDependency(request);
2024-01-27 01:38:18 +08:00
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
2024-07-31 11:11:11 +08:00
dep.optional = Boolean(parser.scope.inTry);
2018-03-05 20:51:12 +08:00
parser.state.current.addDependency(dep);
}
deps.push(dep);
2024-08-02 02:36:27 +08:00
}
2024-01-27 01:38:18 +08:00
const dep = this.newRequireArrayDependency(
deps,
/** @type {Range} */ (param.range)
);
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
2024-07-31 11:11:11 +08:00
dep.optional = Boolean(parser.scope.inTry);
parser.state.module.addPresentationalDependency(dep);
2018-03-05 20:51:12 +08:00
return true;
}
}
2024-01-27 01:38:18 +08:00
/**
* @param {JavascriptParser} parser the parser
* @param {CallExpression} expr call expression
* @param {BasicEvaluatedExpression} param param
* @param {string=} namedModule named module
2024-03-18 23:28:40 +08:00
* @returns {boolean | undefined} result
2024-01-27 01:38:18 +08:00
*/
2018-03-17 00:57:57 +08:00
processItem(parser, expr, param, namedModule) {
2018-03-05 20:51:12 +08:00
if (param.isConditional()) {
2024-08-02 02:36:27 +08:00
const options = /** @type {BasicEvaluatedExpression[]} */ (param.options);
for (const item of options) {
const result = this.processItem(parser, expr, item);
2018-03-05 20:51:12 +08:00
if (result === undefined) {
2024-08-02 02:36:27 +08:00
this.processContext(parser, expr, item);
2017-11-27 22:27:41 +08:00
}
2024-08-02 02:36:27 +08:00
}
2018-03-05 20:51:12 +08:00
return true;
} else if (param.isString()) {
2024-07-31 09:56:53 +08:00
let dep;
let localModule;
2018-03-05 20:51:12 +08:00
if (param.string === "require") {
2024-01-27 01:38:18 +08:00
dep = new ConstDependency(
RuntimeGlobals.require,
/** @type {Range} */ (param.range),
[RuntimeGlobals.require]
);
2018-11-17 01:18:44 +08:00
} else if (param.string === "exports") {
2024-01-27 01:38:18 +08:00
dep = new ConstDependency(
"exports",
/** @type {Range} */ (param.range),
[RuntimeGlobals.exports]
);
2018-11-17 01:18:44 +08:00
} else if (param.string === "module") {
2024-01-27 01:38:18 +08:00
dep = new ConstDependency(
"module",
/** @type {Range} */ (param.range),
[RuntimeGlobals.module]
);
2018-03-05 20:51:12 +08:00
} else if (
2024-01-27 01:38:18 +08:00
(localModule = getLocalModule(
parser.state,
/** @type {string} */ (param.string),
namedModule
))
2018-03-05 20:51:12 +08:00
) {
localModule.flagUsed();
2018-04-10 15:22:34 +08:00
dep = new LocalModuleDependency(localModule, param.range, false);
2018-03-05 20:51:12 +08:00
} else {
2024-03-18 23:28:40 +08:00
dep = this.newRequireItemDependency(
/** @type {string} */ (param.string),
param.range
);
2024-07-31 11:11:11 +08:00
dep.optional = Boolean(parser.scope.inTry);
parser.state.current.addDependency(dep);
return true;
2017-11-27 22:27:41 +08:00
}
2024-01-27 01:38:18 +08:00
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
parser.state.module.addPresentationalDependency(dep);
2017-11-27 22:27:41 +08:00
return true;
2018-03-05 20:51:12 +08:00
}
}
2024-01-27 01:38:18 +08:00
/**
* @param {JavascriptParser} parser the parser
* @param {CallExpression} expr call expression
* @param {BasicEvaluatedExpression} param param
* @returns {boolean | undefined} result
*/
2018-03-17 00:57:57 +08:00
processContext(parser, expr, param) {
2018-03-05 20:51:12 +08:00
const dep = ContextDependencyHelpers.create(
AMDRequireContextDependency,
2024-01-27 01:38:18 +08:00
/** @type {Range} */ (param.range),
2018-03-05 20:51:12 +08:00
param,
expr,
2018-10-30 19:39:43 +08:00
this.options,
{
category: "amd"
},
2018-10-30 19:39:43 +08:00
parser
2018-03-05 20:51:12 +08:00
);
if (!dep) return;
2024-01-27 01:38:18 +08:00
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
2024-07-31 11:11:11 +08:00
dep.optional = Boolean(parser.scope.inTry);
2018-03-17 00:57:57 +08:00
parser.state.current.addDependency(dep);
2018-03-05 20:51:12 +08:00
return true;
}
2017-11-27 22:27:41 +08:00
2024-01-27 01:38:18 +08:00
/**
* @param {JavascriptParser} parser the parser
* @param {CallExpression} expr call expression
* @returns {boolean | undefined} result
*/
2018-03-17 00:57:57 +08:00
processCallDefine(parser, expr) {
2025-04-07 21:09:05 +08:00
/** @type {Expression | SpreadElement | undefined} */
2024-07-31 09:56:53 +08:00
let array;
2024-08-07 23:22:25 +08:00
/** @type {FunctionExpression | ArrowFunctionExpression | CallExpression | Identifier | undefined} */
2024-07-31 09:56:53 +08:00
let fn;
2024-08-07 23:22:25 +08:00
/** @type {ObjectExpression | Identifier | undefined} */
2024-07-31 09:56:53 +08:00
let obj;
2024-08-07 23:22:25 +08:00
/** @type {string | undefined} */
2024-07-31 09:56:53 +08:00
let namedModule;
2018-03-05 20:51:12 +08:00
switch (expr.arguments.length) {
case 1:
if (isCallable(expr.arguments[0])) {
2018-03-22 17:54:18 +08:00
// define(f() {…})
2018-03-05 20:51:12 +08:00
fn = expr.arguments[0];
} else if (expr.arguments[0].type === "ObjectExpression") {
2018-03-22 17:54:18 +08:00
// define({…})
2018-03-05 20:51:12 +08:00
obj = expr.arguments[0];
} else {
// define(expr)
// unclear if function or object
2024-08-07 23:22:25 +08:00
obj = fn = /** @type {Identifier} */ (expr.arguments[0]);
2014-01-31 21:09:08 +08:00
}
2018-03-05 20:51:12 +08:00
break;
case 2:
if (expr.arguments[0].type === "Literal") {
2024-08-07 23:22:25 +08:00
namedModule = /** @type {string} */ (expr.arguments[0].value);
2018-03-22 17:54:18 +08:00
// define("…", …)
2018-03-05 20:51:12 +08:00
if (isCallable(expr.arguments[1])) {
2018-03-22 17:54:18 +08:00
// define("…", f() {…})
2018-03-05 20:51:12 +08:00
fn = expr.arguments[1];
} else if (expr.arguments[1].type === "ObjectExpression") {
2018-03-22 17:54:18 +08:00
// define("…", {…})
2018-03-05 20:51:12 +08:00
obj = expr.arguments[1];
} else {
2018-03-22 17:54:18 +08:00
// define("…", expr)
2018-03-05 20:51:12 +08:00
// unclear if function or object
2024-08-07 23:22:25 +08:00
obj = fn = /** @type {Identifier} */ (expr.arguments[1]);
2018-03-05 20:51:12 +08:00
}
} else {
array = expr.arguments[0];
if (isCallable(expr.arguments[1])) {
2018-03-22 17:54:18 +08:00
// define([…], f() {})
2018-03-05 20:51:12 +08:00
fn = expr.arguments[1];
} else if (expr.arguments[1].type === "ObjectExpression") {
2018-03-22 17:54:18 +08:00
// define([…], {…})
2018-03-05 20:51:12 +08:00
obj = expr.arguments[1];
} else {
2018-03-22 17:54:18 +08:00
// define([…], expr)
2018-03-05 20:51:12 +08:00
// unclear if function or object
2024-08-07 23:22:25 +08:00
obj = fn = /** @type {Identifier} */ (expr.arguments[1]);
}
2018-02-25 09:00:20 +08:00
}
2018-03-05 20:51:12 +08:00
break;
case 3:
2018-03-22 17:54:18 +08:00
// define("…", […], f() {…})
2024-08-07 23:22:25 +08:00
namedModule =
/** @type {string} */
(
/** @type {Literal} */
(expr.arguments[0]).value
);
2018-03-05 20:51:12 +08:00
array = expr.arguments[1];
if (isCallable(expr.arguments[2])) {
2018-03-22 17:54:18 +08:00
// define("…", […], f() {})
2018-03-05 20:51:12 +08:00
fn = expr.arguments[2];
} else if (expr.arguments[2].type === "ObjectExpression") {
2018-03-22 17:54:18 +08:00
// define("…", […], {…})
2018-03-05 20:51:12 +08:00
obj = expr.arguments[2];
2018-02-25 09:00:20 +08:00
} else {
2018-03-22 17:54:18 +08:00
// define("…", […], expr)
2018-03-05 20:51:12 +08:00
// unclear if function or object
2024-08-07 23:22:25 +08:00
obj = fn = /** @type {Identifier} */ (expr.arguments[2]);
2018-02-25 09:00:20 +08:00
}
2018-03-05 20:51:12 +08:00
break;
default:
return;
}
DynamicExports.bailout(parser.state);
2024-08-07 23:22:25 +08:00
/** @type {Identifier[] | null} */
2018-03-05 20:51:12 +08:00
let fnParams = null;
let fnParamsOffset = 0;
if (fn) {
if (isUnboundFunctionExpression(fn)) {
2024-08-07 23:22:25 +08:00
fnParams =
/** @type {Identifier[]} */
(fn.params);
} else if (isBoundFunctionExpression(fn)) {
2024-08-07 23:22:25 +08:00
const object =
/** @type {FunctionExpression} */
(/** @type {MemberExpression} */ (fn.callee).object);
fnParams =
/** @type {Identifier[]} */
(object.params);
fnParamsOffset = fn.arguments.length - 1;
if (fnParamsOffset < 0) {
fnParamsOffset = 0;
}
2018-03-05 20:51:12 +08:00
}
}
2025-09-11 08:10:10 +08:00
/** @type {Map<string, ExportedVariableInfo>} */
2024-07-31 04:09:42 +08:00
const fnRenames = new Map();
2018-03-05 20:51:12 +08:00
if (array) {
2025-09-11 08:10:10 +08:00
/** @type {Identifiers} */
const identifiers = {};
2018-03-05 20:51:12 +08:00
const param = parser.evaluateExpression(array);
2018-03-17 00:57:57 +08:00
const result = this.processArray(
parser,
expr,
param,
identifiers,
namedModule
);
2018-03-05 20:51:12 +08:00
if (!result) return;
if (fnParams) {
2018-03-05 20:51:12 +08:00
fnParams = fnParams.slice(fnParamsOffset).filter((param, idx) => {
if (identifiers[idx]) {
fnRenames.set(param.name, parser.getVariableInfo(identifiers[idx]));
2018-03-05 20:51:12 +08:00
return false;
}
return true;
});
}
2018-03-05 20:51:12 +08:00
} else {
const identifiers = ["require", "exports", "module"];
if (fnParams) {
2018-03-05 20:51:12 +08:00
fnParams = fnParams.slice(fnParamsOffset).filter((param, idx) => {
if (identifiers[idx]) {
fnRenames.set(param.name, parser.getVariableInfo(identifiers[idx]));
2018-03-05 20:51:12 +08:00
return false;
}
return true;
});
}
2018-03-05 20:51:12 +08:00
}
2024-01-27 01:38:18 +08:00
/** @type {boolean | undefined} */
2018-03-05 20:51:12 +08:00
let inTry;
if (fn && isUnboundFunctionExpression(fn)) {
inTry = parser.scope.inTry;
2025-03-11 08:28:01 +08:00
parser.inScope(/** @type {Identifier[]} */ (fnParams), () => {
for (const [name, varInfo] of fnRenames) {
parser.setVariable(name, varInfo);
}
2024-01-27 01:38:18 +08:00
parser.scope.inTry = /** @type {boolean} */ (inTry);
2018-03-05 23:22:38 +08:00
if (fn.body.type === "BlockStatement") {
parser.detectMode(fn.body.body);
const prev = parser.prevStatement;
parser.preWalkStatement(fn.body);
parser.prevStatement = prev;
2018-03-05 20:51:12 +08:00
parser.walkStatement(fn.body);
2018-03-05 23:22:38 +08:00
} else {
parser.walkExpression(fn.body);
}
2018-03-05 20:51:12 +08:00
});
} else if (fn && isBoundFunctionExpression(fn)) {
inTry = parser.scope.inTry;
2024-08-07 23:22:25 +08:00
const object =
/** @type {FunctionExpression} */
(/** @type {MemberExpression} */ (fn.callee).object);
2018-03-05 20:51:12 +08:00
parser.inScope(
2024-08-07 23:22:25 +08:00
/** @type {Identifier[]} */
(object.params).filter(
(i) => !["require", "module", "exports"].includes(i.name)
2018-03-05 20:51:12 +08:00
),
() => {
for (const [name, varInfo] of fnRenames) {
parser.setVariable(name, varInfo);
}
2024-03-18 23:28:40 +08:00
parser.scope.inTry = /** @type {boolean} */ (inTry);
2025-08-22 02:30:56 +08:00
parser.detectMode(object.body.body);
const prev = parser.prevStatement;
parser.preWalkStatement(object.body);
parser.prevStatement = prev;
parser.walkStatement(object.body);
2018-02-25 09:00:20 +08:00
}
2018-03-05 20:51:12 +08:00
);
2024-08-07 23:22:25 +08:00
if (fn.arguments) {
parser.walkExpressions(fn.arguments);
}
2018-03-05 20:51:12 +08:00
} else if (fn || obj) {
2025-04-07 21:09:05 +08:00
parser.walkExpression(
/** @type {FunctionExpression | ArrowFunctionExpression | CallExpression | ObjectExpression | Identifier} */
(fn || obj)
);
2018-03-05 20:51:12 +08:00
}
2018-03-05 20:51:12 +08:00
const dep = this.newDefineDependency(
2024-01-27 01:38:18 +08:00
/** @type {Range} */ (expr.range),
array ? /** @type {Range} */ (array.range) : null,
fn ? /** @type {Range} */ (fn.range) : null,
obj ? /** @type {Range} */ (obj.range) : null,
2024-07-31 09:37:24 +08:00
namedModule || null
2018-03-05 20:51:12 +08:00
);
2024-01-27 01:38:18 +08:00
dep.loc = /** @type {DependencyLocation} */ (expr.loc);
2018-03-05 20:51:12 +08:00
if (namedModule) {
2018-07-27 04:37:36 +08:00
dep.localModule = addLocalModule(parser.state, namedModule);
2018-03-05 20:51:12 +08:00
}
parser.state.module.addPresentationalDependency(dep);
2018-03-05 20:51:12 +08:00
return true;
}
2024-01-27 01:38:18 +08:00
/**
* @param {Range} range range
* @param {Range | null} arrayRange array range
* @param {Range | null} functionRange function range
* @param {Range | null} objectRange object range
2024-08-07 23:22:25 +08:00
* @param {string | null} namedModule true, when define is called with a name
2024-01-27 01:38:18 +08:00
* @returns {AMDDefineDependency} AMDDefineDependency
*/
2018-03-17 00:57:57 +08:00
newDefineDependency(
range,
arrayRange,
functionRange,
objectRange,
namedModule
) {
return new AMDDefineDependency(
range,
arrayRange,
functionRange,
objectRange,
namedModule
);
2018-03-05 20:51:12 +08:00
}
2024-01-27 01:38:18 +08:00
/**
2024-08-07 23:22:25 +08:00
* @param {(string | LocalModuleDependency | AMDRequireItemDependency)[]} depsArray deps array
2024-01-27 01:38:18 +08:00
* @param {Range} range range
* @returns {AMDRequireArrayDependency} AMDRequireArrayDependency
*/
2018-03-17 00:57:57 +08:00
newRequireArrayDependency(depsArray, range) {
return new AMDRequireArrayDependency(depsArray, range);
2018-03-05 20:51:12 +08:00
}
2024-01-27 01:38:18 +08:00
/**
* @param {string} request request
* @param {Range=} range range
* @returns {AMDRequireItemDependency} AMDRequireItemDependency
*/
2018-03-17 00:57:57 +08:00
newRequireItemDependency(request, range) {
return new AMDRequireItemDependency(request, range);
}
}
2024-01-27 01:38:18 +08:00
module.exports = AMDDefineDependencyParserPlugin;