Skip to content

Commit 6086d8c

Browse files
committed
insert free var injection code to correct place
webpack#167
1 parent fa6f328 commit 6086d8c

File tree

7 files changed

+45
-23
lines changed

7 files changed

+45
-23
lines changed

lib/NormalModule.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,8 @@ NormalModule.prototype.source = function(dependencyTemplates, outputOptions, req
139139
emitFunction();
140140
var start = block.range ? block.range[0] : 0;
141141
var end = block.range ? block.range[1] : _source.size();
142-
if(varStartCode) source.insert(start, varStartCode);
143-
if(varEndCode) source.insert(end, "\n/* WEBPACK VAR INJECTION */" + varEndCode);
142+
if(varStartCode) source.insert(start + 0.5, varStartCode);
143+
if(varEndCode) source.insert(end + 0.5, "\n/* WEBPACK VAR INJECTION */" + varEndCode);
144144
}
145145
}
146146
doBlock(this);

lib/dependencies/AMDDefineDependency.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,25 +23,25 @@ AMDDefineDependency.Template.prototype.apply = function(dep, source, outputOptio
2323
var localModuleVar = dep.localModule && dep.localModule.used && dep.localModule.variableName();
2424
if(localModuleVar) {
2525
if(dep.objectRange && !dep.functionRange) {
26+
source.insert(0, "var " + localModuleVar + ";");
2627
source.replace(dep.range[0], dep.objectRange[0]-1,
2728
"!(" + localModuleVar + " = ");
28-
source.insert(0, "var " + localModuleVar + ";");
2929
source.replace(dep.objectRange[1], dep.range[1]-1, ")");
3030
} else if(!dep.arrayRange && dep.functionRange && !dep.objectRange) {
31+
source.insert(0, "var " + localModuleVar + ";");
3132
source.replace(dep.range[0], dep.functionRange[0]-1,
3233
"!(" + localModuleVar + " = (");
33-
source.insert(0, "var " + localModuleVar + ";");
3434
source.replace(dep.functionRange[1], dep.range[1]-1, ".call(exports, require, exports, module)))");
3535
} else if(dep.arrayRange && dep.functionRange && !dep.objectRange) {
36+
source.insert(0, "var __WEBPACK_AMD_DEFINE_ARRAY__, " + localModuleVar + ";");
3637
source.replace(dep.range[0], dep.arrayRange[0]-1,
3738
"!(" + localModuleVar + " = ");
38-
source.insert(0, "var __WEBPACK_AMD_DEFINE_ARRAY__, " + localModuleVar + ";");
3939
source.replace(dep.arrayRange[1], dep.functionRange[0]-1, ", __WEBPACK_AMD_DEFINE_RESULT__ = (");
4040
source.replace(dep.functionRange[1], dep.range[1]-1, ".apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)))");
4141
} else if(dep.functionRange && dep.objectRange) {
42+
source.insert(0, "var __WEBPACK_AMD_DEFINE_FACTORY__, " + localModuleVar + ";");
4243
source.replace(dep.range[0], dep.functionRange[0]-1,
4344
"!(__WEBPACK_AMD_DEFINE_FACTORY__ = (");
44-
source.insert(0, "var __WEBPACK_AMD_DEFINE_FACTORY__, " + localModuleVar + ";");
4545
source.replace(dep.functionRange[1], dep.range[1]-1, "), (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (" + localModuleVar + " = __WEBPACK_AMD_DEFINE_FACTORY__.call(exports, require, exports, module)) : " + localModuleVar + " = __WEBPACK_AMD_DEFINE_FACTORY__))");
4646
}
4747
} else {
@@ -50,20 +50,20 @@ AMDDefineDependency.Template.prototype.apply = function(dep, source, outputOptio
5050
"!(module.exports = ");
5151
source.replace(dep.objectRange[1], dep.range[1]-1, ")");
5252
} else if(!dep.arrayRange && dep.functionRange && !dep.objectRange) {
53+
source.insert(0, "var __WEBPACK_AMD_DEFINE_RESULT__;");
5354
source.replace(dep.range[0], dep.functionRange[0]-1,
5455
"!(__WEBPACK_AMD_DEFINE_RESULT__ = (");
55-
source.insert(0, "var __WEBPACK_AMD_DEFINE_RESULT__;");
5656
source.replace(dep.functionRange[1], dep.range[1]-1, ".call(exports, require, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))");
5757
} else if(dep.arrayRange && dep.functionRange && !dep.objectRange) {
58+
source.insert(0, "var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;");
5859
source.replace(dep.range[0], dep.arrayRange[0]-1,
5960
"!(__WEBPACK_AMD_DEFINE_ARRAY__ = ");
60-
source.insert(0, "var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;");
6161
source.replace(dep.arrayRange[1], dep.functionRange[0]-1, ", __WEBPACK_AMD_DEFINE_RESULT__ = (");
6262
source.replace(dep.functionRange[1], dep.range[1]-1, ".apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))");
6363
} else if(dep.functionRange && dep.objectRange) {
64+
source.insert(0, "var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;");
6465
source.replace(dep.range[0], dep.functionRange[0]-1,
6566
"!(__WEBPACK_AMD_DEFINE_FACTORY__ = (");
66-
source.insert(0, "var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;");
6767
source.replace(dep.functionRange[1], dep.range[1]-1, "), (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_RESULT__ = __WEBPACK_AMD_DEFINE_FACTORY__.call(exports, require, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : module.exports = __WEBPACK_AMD_DEFINE_FACTORY__))");
6868
}
6969
}

lib/dependencies/AMDRequireDependenciesBlock.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,13 @@ var AMDRequireDependency = require("./AMDRequireDependency");
88
function AMDRequireDependenciesBlock(expr, arrayRange, functionRange, module, loc) {
99
AsyncDependenciesBlock.call(this, null, module, loc);
1010
this.expr = expr;
11-
this.range = expr.range;
11+
this.outerRange = expr.range;
1212
this.arrayRange = arrayRange;
1313
this.functionRange = functionRange;
14+
this.range = arrayRange && functionRange ? [arrayRange[0], functionRange[1]] :
15+
arrayRange ? arrayRange :
16+
functionRange ? functionRange :
17+
expr.range;
1418
this.addDependency(new AMDRequireDependency(this));
1519
}
1620
module.exports = AMDRequireDependenciesBlock;

lib/dependencies/AMDRequireDependency.js

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,35 +20,37 @@ AMDRequireDependency.Template.prototype.apply = function(dep, source, outputOpti
2020
var chunkId = depBlock.chunk && !depBlock.chunk.entry && depBlock.chunk.id;
2121
if(depBlock.arrayRange && !depBlock.functionRange) {
2222
if(typeof chunkId === "number") {
23-
source.replace(depBlock.range[0], depBlock.arrayRange[0]-1,
23+
source.replace(depBlock.outerRange[0], depBlock.arrayRange[0]-1,
2424
"require.e/* require */(" + chunkId + asComment(depBlock.chunkReason) + ", function(require) {");
25-
source.replace(depBlock.arrayRange[1], depBlock.range[1]-1, ";})");
25+
source.replace(depBlock.arrayRange[1], depBlock.outerRange[1]-1, ";})");
2626
} else {
27-
source.replace(depBlock.range[0], depBlock.arrayRange[0]-1,
27+
source.replace(depBlock.outerRange[0], depBlock.arrayRange[0]-1,
2828
"!/* require */(" + asComment(depBlock.chunkReason));
29-
source.replace(depBlock.arrayRange[1], depBlock.range[1]-1, ")");
29+
source.replace(depBlock.arrayRange[1], depBlock.outerRange[1]-1, ")");
3030
}
3131
} else if(!depBlock.arrayRange && depBlock.functionRange) {
3232
if(typeof chunkId === "number") {
33-
source.replace(depBlock.range[0], depBlock.functionRange[0]-1,
33+
source.replace(depBlock.outerRange[0], depBlock.functionRange[0]-1,
3434
"require.e/* require */(" + chunkId + asComment(depBlock.chunkReason) + ", function(require) {(");
35-
source.replace(depBlock.functionRange[1], depBlock.range[1]-1, ".call(exports, require, exports, module));})");
35+
source.replace(depBlock.functionRange[1], depBlock.outerRange[1]-1, ".call(exports, require, exports, module));})");
3636
} else {
37-
source.replace(depBlock.range[0], depBlock.functionRange[0]-1,
37+
source.replace(depBlock.outerRange[0], depBlock.functionRange[0]-1,
3838
"!/* require */(" + asComment(depBlock.chunkReason));
39-
source.replace(depBlock.functionRange[1], depBlock.range[1]-1, ".call(exports, require, exports, module))");
39+
source.replace(depBlock.functionRange[1], depBlock.outerRange[1]-1, ".call(exports, require, exports, module))");
4040
}
4141
} else if(depBlock.arrayRange && depBlock.functionRange) {
4242
if(typeof chunkId === "number") {
43-
source.replace(depBlock.range[0], depBlock.arrayRange[0]-1,
44-
"require.e/* require */(" + chunkId + asComment(depBlock.chunkReason) + ", function(require) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = ");
43+
source.replace(depBlock.outerRange[0], depBlock.arrayRange[0]-1,
44+
"require.e/* require */(" + chunkId + asComment(depBlock.chunkReason) + ", function(require) { ");
45+
source.insert(depBlock.arrayRange[0] + 0.9, "var __WEBPACK_AMD_REQUIRE_ARRAY__ = ");
4546
source.replace(depBlock.arrayRange[1], depBlock.functionRange[0]-1, "; (");
46-
source.replace(depBlock.functionRange[1], depBlock.range[1]-1, ".apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));})");
47+
source.insert(depBlock.functionRange[1], ".apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));");
48+
source.replace(depBlock.functionRange[1], depBlock.outerRange[1]-1, "})");
4749
} else {
48-
source.replace(depBlock.range[0], depBlock.arrayRange[0]-1,
50+
source.replace(depBlock.outerRange[0], depBlock.arrayRange[0]-1,
4951
"!/* require */(" + asComment(depBlock.chunkReason) + "function() { var __WEBPACK_AMD_REQUIRE_ARRAY__ = ");
5052
source.replace(depBlock.arrayRange[1], depBlock.functionRange[0]-1, "; (");
51-
source.replace(depBlock.functionRange[1], depBlock.range[1]-1, ".apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));}())");
53+
source.replace(depBlock.functionRange[1], depBlock.outerRange[1]-1, ".apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));}())");
5254
}
5355
}
5456
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
throw new Error("Fail");
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
it("should inject the module object into a chunk (AMD1)", function() {
2+
require([], function() {
3+
module.webpackPolyfill.should.be.eql(1);
4+
});
5+
});
6+
7+
it("should inject the module object into a chunk (AMD2)", function() {
8+
require([module.webpackPolyfill ? "./x1" : "./fail"]);
9+
});
10+
11+
it("should inject the module object into a chunk (ensure)", function() {
12+
require.ensure([], function(require) {
13+
module.webpackPolyfill.should.be.eql(1);
14+
});
15+
});

test/cases/parsing/inject-free-vars/x1.js

Whitespace-only changes.

0 commit comments

Comments
 (0)