Skip to content

Commit 52b40b3

Browse files
committed
allow loaders to load modules
fixed templates readable name
1 parent efc2942 commit 52b40b3

File tree

10 files changed

+91
-26
lines changed

10 files changed

+91
-26
lines changed

lib/Compilation.js

Lines changed: 25 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,12 @@ function Compilation(compiler) {
5050
module.exports = Compilation;
5151

5252
Compilation.prototype = Object.create(Tapable.prototype);
53-
Compilation.prototype.addModule = function(module) {
53+
Compilation.prototype.addModule = function(module, cacheGroup) {
54+
cacheGroup = cacheGroup || "m";
5455
var identifier = module.identifier();
5556
if(this._modules[identifier]) return false;
56-
if(this.cache && this.cache["m" + identifier]) {
57-
var cacheModule = this.cache["m" + identifier];
57+
if(this.cache && this.cache[cacheGroup + identifier]) {
58+
var cacheModule = this.cache[cacheGroup + identifier];
5859

5960
var rebuild = true;
6061
if(!cacheModule.error && cacheModule.cacheable && this.fileTimestamps && this.contextTimestamps) {
@@ -77,7 +78,7 @@ Compilation.prototype.addModule = function(module) {
7778
}
7879
}
7980
this._modules[identifier] = module;
80-
if(this.cache) this.cache["m" + identifier] = module;
81+
if(this.cache) this.cache[cacheGroup + identifier] = module;
8182
this.modules.push(module);
8283
return true;
8384
};
@@ -111,13 +112,6 @@ Compilation.prototype.buildModule = function(module, callback) {
111112
};
112113

113114
Compilation.prototype.processModuleDependencies = function(module, callback) {
114-
var errorAndCallback = this.bail ? function errorAndCallback(err) {
115-
callback(err);
116-
} : function errorAndCallback(err) {
117-
this.errors.push(err);
118-
callback();
119-
}.bind(this);
120-
121115
var dependencies = [];
122116
function addDependency(dep) {
123117
for(var i = 0; i < dependencies.length; i++) {
@@ -127,13 +121,17 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
127121
dependencies.push([dep]);
128122
}
129123
function addDependenciesBlock(block) {
130-
block.dependencies.forEach(addDependency);
131-
block.blocks.forEach(addDependenciesBlock);
132-
block.variables.forEach(function(v) {
124+
if(block.dependencies) block.dependencies.forEach(addDependency);
125+
if(block.blocks) block.blocks.forEach(addDependenciesBlock);
126+
if(block.variables) block.variables.forEach(function(v) {
133127
v.dependencies.forEach(addDependency);
134128
});
135129
}
136130
addDependenciesBlock(module);
131+
this.addModuleDependencies(module, dependencies, this.bail, null, true, callback);
132+
};
133+
134+
Compilation.prototype.addModuleDependencies = function(module, dependencies, bail, cacheGroup, recursive, callback) {
137135
var factories = [];
138136
for(var i = 0; i < dependencies.length; i++) {
139137
var factory = this.dependencyFactories.get(dependencies[i][0].Class);
@@ -153,7 +151,10 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
153151
err.origin = module;
154152
module.dependenciesErrors.push(err);
155153
this.errors.push(err);
156-
callback();
154+
if(bail)
155+
callback(err);
156+
else
157+
callback();
157158
}.bind(this);
158159
var warningAndCallback = function warningAndCallback(err) {
159160
err.dependencies = dependencies;
@@ -184,7 +185,7 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
184185
}
185186

186187
dependantModule.issuer = module.identifier();
187-
var newModule = this.addModule(dependantModule);
188+
var newModule = this.addModule(dependantModule, cacheGroup);
188189

189190
if(!newModule) {
190191
dependantModule = this.getModule(dependantModule);
@@ -216,7 +217,10 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
216217
dependantModule.addReason(module, dep);
217218
});
218219

219-
return this.processModuleDependencies(dependantModule, callback);
220+
if(recursive)
221+
return this.processModuleDependencies(dependantModule, callback);
222+
else
223+
return callback();
220224
}
221225

222226
dependencies.forEach(function(dep) {
@@ -232,7 +236,10 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
232236
dependantModule.profile.building = afterBuilding - afterFactory;
233237
}
234238

235-
this.processModuleDependencies(dependantModule, callback);
239+
if(recursive)
240+
this.processModuleDependencies(dependantModule, callback);
241+
else
242+
return callback();
236243
}.bind(this));
237244

238245
}.bind(this));

lib/NormalModule.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ NormalModule.prototype.readableIdentifier = function(requestShortener) {
3838

3939
NormalModule.prototype.fillLoaderContext = function fillLoaderContext(loaderContext, options, compilation) {
4040
loaderContext.webpack = true;
41-
compilation.applyPlugins("normal-module-loader", loaderContext);
41+
compilation.applyPlugins("normal-module-loader", loaderContext, this);
4242
loaderContext.emitFile = function(name, content, sourceMap) {
4343
if(typeof sourceMap === "string") {
4444
this.assets[name] = new OriginalSource(content, sourceMap);
@@ -196,6 +196,12 @@ NormalModule.prototype.createTemplate = function(keepModules) {
196196
template._source = this._source;
197197
template.built = this.built;
198198
template.templateModules = keepModules;
199+
template._templateOrigin = this;
200+
template.readableIdentifier = function() {
201+
return "template of " + this._templateOrigin.id + " referencing " + keepModules.map(function(m) {
202+
return m.id;
203+
}).join(", ");
204+
};
199205
var args = template.arguments = [];
200206
function doDeps(deps) {
201207
return deps.map(function(dep) {

lib/NormalModuleFactory.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,10 @@ NormalModuleFactory.prototype.create = function(context, dependency, callback) {
3232
context = result.context;
3333
request = result.request;
3434

35-
var noAutoLoaders = /^!/.test(request);
35+
var noAutoLoaders = /^-?!/.test(request);
3636
var noPrePostAutoLoaders = /^!!/.test(request);
37-
var elements = request.replace(/^!+/, "").replace(/!!+/g, "!").split("!");
37+
var noPostAutoLoaders = /^-!/.test(request);
38+
var elements = request.replace(/^-?!+/, "").replace(/!!+/g, "!").split("!");
3839
var resource = elements.pop();
3940

4041
async.parallel([
@@ -56,7 +57,7 @@ NormalModuleFactory.prototype.create = function(context, dependency, callback) {
5657
return onDoneResolving.call(this);
5758
if(noAutoLoaders) {
5859
async.parallel([
59-
this.resolveRequestArray.bind(this, context, this.postLoaders.match(resource), this.resolvers.loader),
60+
this.resolveRequestArray.bind(this, context, noPostAutoLoaders ? [] : this.postLoaders.match(resource), this.resolvers.loader),
6061
this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader)
6162
], function(err, results) {
6263
if(err) return callback(err);
@@ -65,7 +66,7 @@ NormalModuleFactory.prototype.create = function(context, dependency, callback) {
6566
}.bind(this));
6667
} else {
6768
async.parallel([
68-
this.resolveRequestArray.bind(this, context, this.postLoaders.match(resource), this.resolvers.loader),
69+
this.resolveRequestArray.bind(this, context, noPostAutoLoaders ? [] : this.postLoaders.match(resource), this.resolvers.loader),
6970
this.resolveRequestArray.bind(this, context, this.loaders.match(resource), this.resolvers.loader),
7071
this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader)
7172
], function(err, results) {

lib/Stats.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,7 @@ Stats.jsonToString = function jsonToString(obj, useColors) {
463463
normal("[");
464464
normal(module.id);
465465
normal("] ");
466-
bold(module.name);
466+
bold(module.name || module.identifier);
467467
processModuleAttributes(module);
468468
newline();
469469
if(module.reasons) {

lib/WebpackOptionsApply.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ var NodeStuffPlugin = require("./NodeStuffPlugin");
1919
var CompatibilityPlugin = require("./CompatibilityPlugin");
2020
var DefinePlugin = require("./DefinePlugin");
2121

22+
var LoaderPlugin = require("./dependencies/LoaderPlugin");
2223
var CommonJsPlugin = require("./dependencies/CommonJsPlugin");
2324
var AMDPlugin = require("./dependencies/AMDPlugin");
2425
var LabeledModulesPlugin = require("./dependencies/LabeledModulesPlugin");
@@ -154,6 +155,7 @@ WebpackOptionsApply.prototype.process = function(options, compiler) {
154155
}
155156
compiler.apply(
156157
new CompatibilityPlugin(),
158+
new LoaderPlugin(),
157159
new NodeStuffPlugin(options.node),
158160
new RequireJsStuffPlugin(),
159161
new APIPlugin(),
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var ModuleDependency = require("./ModuleDependency");
6+
7+
function LoaderDependency(request) {
8+
ModuleDependency.call(this, request);
9+
this.Class = LoaderDependency;
10+
}
11+
module.exports = LoaderDependency;
12+
13+
LoaderDependency.prototype = Object.create(ModuleDependency.prototype);
14+
LoaderDependency.prototype.type = "loader";

lib/dependencies/LoaderPlugin.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
MIT License http://www.opensource.org/licenses/mit-license.php
3+
Author Tobias Koppers @sokra
4+
*/
5+
var LoaderDependency = require("./LoaderDependency");
6+
7+
function LoaderPlugin() {
8+
}
9+
module.exports = LoaderPlugin;
10+
11+
LoaderPlugin.prototype.apply = function(compiler) {
12+
compiler.plugin("compilation", function(compilation, params) {
13+
var normalModuleFactory = params.normalModuleFactory;
14+
15+
compilation.dependencyFactories.set(LoaderDependency, normalModuleFactory);
16+
});
17+
compiler.plugin("compilation", function(compilation) {
18+
var cache = {};
19+
compilation.plugin("normal-module-loader", function(loaderContext, module) {
20+
loaderContext.loadModule = function loadModule(request, callback) {
21+
var dep = new LoaderDependency(request);
22+
compilation.addModuleDependencies(module, [[dep]], true, "lm", false, function(err, module) {
23+
if(err) return callback(err);
24+
25+
if(!dep.module._source) throw new Error("The module created for a LoaderDependency must have a property _source");
26+
var map = dep.module._source.map();
27+
var source = dep.module._source.source();
28+
return callback(null, source, map, dep.module);
29+
});
30+
};
31+
});
32+
});
33+
};

test/browsertest/lib/index.web.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -446,8 +446,8 @@ describe("main", function() {
446446
require("../../../package.json").name.should.be.eql("webpack");
447447
});
448448
it("should handle the jade loader correctly", function() {
449-
require("!jade?self!../resources/template.jade")({abc: "abc"}).should.be.eql("<p>selfabc</p>");
450-
require("../resources/template.jade")({abc: "abc"}).should.be.eql("<p>abc</p>");
449+
require("!jade?self!../resources/template.jade")({abc: "abc"}).should.be.eql("<p>selfabc</p><h1>included</h1>");
450+
require("../resources/template.jade")({abc: "abc"}).should.be.eql("<p>abc</p><h1>included</h1>");
451451
});
452452
it("should handle the coffee loader correctly", function() {
453453
require("!coffee!../resources/script.coffee").should.be.eql("coffee test");
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
h1 included
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
p
22
block content
3+
include included

0 commit comments

Comments
 (0)