Skip to content

Commit 6417a9f

Browse files
author
Chuck Dumont
authored
Merge pull request #62 from chuckdumont/work2
Simplify "call define" parser handling
2 parents a20543b + a92900b commit 6417a9f

File tree

1 file changed

+38
-25
lines changed

1 file changed

+38
-25
lines changed

lib/DojoAMDDefineDependencyParserPlugin.js

+38-25
Original file line numberDiff line numberDiff line change
@@ -21,43 +21,56 @@ const DojoAMDRequireItemDependency = require("./DojoAMDRequireItemDependency");
2121
const DojoAMDRequireArrayDependency = require("./DojoAMDRequireArrayDependency");
2222
const ConstDependency = require("webpack/lib/dependencies/ConstDependency");
2323
const DojoAMDDefineDependency = require("./DojoAMDDefineDependency");
24+
const AMDDefineDependencyParserPlugin = require("webpack/lib/dependencies/AMDDefineDependencyParserPlugin");
2425
const LocalModuleDependency = require("webpack/lib/dependencies/LocalModuleDependency");
2526
const LocalModulesHelpers = require("webpack/lib/dependencies/LocalModulesHelpers");
2627
const AMDDefineDependency = require("webpack/lib/dependencies/AMDDefineDependency");
2728

28-
module.exports = class DojoAMDDefineDependencyParserPlugin {
29+
module.exports = class DojoAMDDefineDependencyParserPlugin extends AMDDefineDependencyParserPlugin {
2930
constructor(options, dojoRequire) {
31+
super({});
3032
this.options = options;
3133
this.dojoRequire = dojoRequire;
3234
}
3335

34-
apply(parser) {
35-
parser.plugin("call define", (expr) => {
36-
if (expr.dojoSkipFlag) return;
37-
expr.dojoSkipFlag = true;
38-
parser.state.current.isAMD = true;
39-
const result = parser.applyPluginsBailResult("call define", expr);
40-
delete expr.dojoSkipFlag;
36+
// Overrides base class implementation.
37+
newDefineDependency(range, arrayRange, functionRange, objectRange, namedModule) {
38+
return new DojoAMDDefineDependency(range, arrayRange, functionRange, objectRange, namedModule);
39+
}
4140

42-
if (result) {
43-
// This is pretty hacky. We want to avoid duplicating the implementation of the 'call define' plugin handler in
44-
// AMDDefineDependencyParserPlugin, but it doesn't provide the ability to override the define dependency object
45-
// creation so instead, we reach into the module's dependencies to find the instance of the AMDDefineDependency
46-
// object and replace it our own. There should only be one AMDDefineDependency of any given module.
47-
const deps = parser.state.current.dependencies;
48-
for (let i = deps.length-1; i >= 0; i--) {
49-
const dep = deps[i];
50-
if (dep instanceof AMDDefineDependency) {
51-
const newDep = new DojoAMDDefineDependency(dep.range, dep.arrayRange, dep.functionRange, dep.objectRange, dep.namedModule);
52-
newDep.loc = dep.loc;
53-
newDep.localModule = dep.localModule;
54-
deps[i] = newDep;
55-
break;
56-
}
41+
apply(parser) {
42+
43+
super.apply(Object.assign(Object.create(parser), {
44+
plugin: (expression, callback) => {
45+
if (expression === "call define") {
46+
// Augment base class implementation for "call define"
47+
parser.plugin(expression, (expr) => {
48+
parser.state.current.isAMD = true;
49+
const result = callback(expr); // invoke base class implementation
50+
/* istanbul ignore if */
51+
if (!AMDDefineDependencyParserPlugin.prototype.newDefineDependency) {
52+
// This is pretty hacky. Earlier versions of webpack don't provide the newDefineDependency method allowing us
53+
// to override the object creation, so instead, we reach into the module's dependencies to find the instance
54+
// of the AMDDefineDependency object and replace it our own. There should only be one AMDDefineDependency of
55+
// any given module.
56+
// The newDefineDependency method was introduced in webpack with https://github.com/webpack/webpack/pull/5783
57+
const deps = parser.state.current.dependencies;
58+
for (let i = deps.length-1; i >= 0; i--) {
59+
const dep = deps[i];
60+
if (dep instanceof AMDDefineDependency) {
61+
const newDep = this.newDefineDependency(dep.range, dep.arrayRange, dep.functionRange, dep.objectRange, dep.namedModule);
62+
newDep.loc = dep.loc;
63+
newDep.localModule = dep.localModule;
64+
deps[i] = newDep;
65+
break;
66+
}
67+
}
68+
}
69+
return result;
70+
});
5771
}
5872
}
59-
return result;
60-
});
73+
}));
6174

6275
parser.plugin("call define:amd:array", (expr, param, identifiers, namedModule) => {
6376
if(param.isArray()) {

0 commit comments

Comments
 (0)