Skip to content

Commit a53799c

Browse files
committed
use new RuleSet matching instead of LoadersList
pass issuer via contextInfo
1 parent ec262a4 commit a53799c

File tree

12 files changed

+494
-142
lines changed

12 files changed

+494
-142
lines changed

lib/Compilation.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,9 @@ Compilation.prototype.addModuleDependencies = function(module, dependencies, bai
209209

210210
var factory = item[0];
211211
factory.create({
212+
contextInfo: {
213+
issuer: module.nameForCondition && module.nameForCondition()
214+
},
212215
context: module.context,
213216
dependencies: dependencies
214217
}, function(err, dependentModule) {

lib/LoadersList.js

Lines changed: 0 additions & 110 deletions
This file was deleted.

lib/Module.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -176,3 +176,4 @@ Module.prototype.readableIdentifier = null;
176176
Module.prototype.build = null;
177177
Module.prototype.source = null;
178178
Module.prototype.size = null;
179+
Module.prototype.nameForCondition = null;

lib/NormalModule.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,12 @@ NormalModule.prototype.libIdent = function(options) {
7575
return contextify(options, this.userRequest);
7676
};
7777

78+
NormalModule.prototype.nameForCondition = function() {
79+
var idx = this.resource.indexOf("?");
80+
if(idx >= 0) return this.resource.substr(0, idx);
81+
return this.resource;
82+
};
83+
7884
NormalModule.prototype.doBuild = function doBuild(options, compilation, resolver, fs, callback) {
7985
this.cacheable = false;
8086
var module = this;

lib/NormalModuleFactory.js

Lines changed: 64 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,25 @@ var async = require("async");
77
var Tapable = require("tapable");
88
var NormalModule = require("./NormalModule");
99
var RawModule = require("./RawModule");
10-
var LoadersList = require("./LoadersList");
1110
var Parser = require("./Parser");
11+
var RuleSet = require("./RuleSet");
12+
13+
function loaderToIdent(data) {
14+
if(!data.options)
15+
return data.loader;
16+
if(typeof data.options === "string")
17+
return data.loader + "?" + data.options;
18+
if(typeof data.options !== "object")
19+
throw new Error("loader options must be string or object");
20+
if(data.options.ident)
21+
return data.loader + "??" + data.options.ident;
22+
return data.loader + "?" + JSON.stringify(data.options);
23+
}
1224

1325
function NormalModuleFactory(context, resolvers, options) {
1426
Tapable.call(this);
1527
this.resolvers = resolvers;
16-
this.loaders = new LoadersList(options.loaders);
17-
this.preLoaders = new LoadersList(options.preLoaders);
18-
this.postLoaders = new LoadersList(options.postLoaders);
28+
this.ruleSet = new RuleSet(options.rules || options.loaders);
1929
this.context = context || "";
2030
this.parserCache = {};
2131
this.plugin("factory", function() {
@@ -78,6 +88,18 @@ function NormalModuleFactory(context, resolvers, options) {
7888
var noPostAutoLoaders = /^-!/.test(request);
7989
var elements = request.replace(/^-?!+/, "").replace(/!!+/g, "!").split("!");
8090
var resource = elements.pop();
91+
elements = elements.map(function(element) {
92+
var idx = element.indexOf("?");
93+
var options;
94+
if(idx >= 0) {
95+
options = element.substr(idx + 1);
96+
element = element.substr(0, idx);
97+
}
98+
return {
99+
loader: element,
100+
options: options
101+
};
102+
});
81103

82104
async.parallel([
83105
function(callback) {
@@ -102,46 +124,53 @@ function NormalModuleFactory(context, resolvers, options) {
102124
"ignored " + context + " " + request,
103125
request + " (ignored)")); // ignored
104126

105-
var userRequest = loaders.concat([resource]).join("!");
127+
var userRequest = loaders.map(loaderToIdent).concat([resource]).join("!");
106128

107129
var resourcePath = resource;
108130
var queryIndex = resourcePath.indexOf("?");
109131
if(queryIndex >= 0)
110132
resourcePath = resourcePath.substr(0, queryIndex);
111133

112-
if(noPrePostAutoLoaders)
113-
return onDoneResolving();
114-
if(noAutoLoaders) {
115-
async.parallel([
116-
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, noPostAutoLoaders ? [] : _this.postLoaders.match(resourcePath), _this.resolvers.loader),
117-
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, _this.preLoaders.match(resourcePath), _this.resolvers.loader)
118-
], function(err, results) {
119-
if(err) return callback(err);
120-
loaders = results[0].concat(loaders).concat(results[1]);
121-
onDoneResolving();
122-
});
123-
} else {
124-
async.parallel([
125-
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, noPostAutoLoaders ? [] : _this.postLoaders.match(resourcePath), _this.resolvers.loader),
126-
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, _this.loaders.match(resourcePath), _this.resolvers.loader),
127-
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, _this.preLoaders.match(resourcePath), _this.resolvers.loader)
128-
], function(err, results) {
129-
if(err) return callback(err);
130-
loaders = results[0].concat(loaders).concat(results[1]).concat(results[2]);
131-
onDoneResolving();
132-
});
133-
}
134+
var result = _this.ruleSet.exec({
135+
resource: resourcePath,
136+
issuer: contextInfo.issuer
137+
});
138+
var settings = {};
139+
var useLoadersRight = []; // ex post loaders
140+
var useLoaders = []; // ex loaders
141+
var useLoadersLeft = []; // ex pre loaders
142+
result.forEach(function(r) {
143+
if(r.type === "use") {
144+
if(r.enforce === "right" && !noPostAutoLoaders && !noPrePostAutoLoaders)
145+
useLoadersRight.push(r.value);
146+
else if(r.enforce === "left" && !noPrePostAutoLoaders)
147+
useLoadersLeft.push(r.value);
148+
else if(!r.enforce && !noAutoLoaders && !noPrePostAutoLoaders)
149+
useLoaders.push(r.value);
150+
} else {
151+
settings[r.type] = r.value;
152+
}
153+
});
154+
async.parallel([
155+
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, useLoadersLeft, _this.resolvers.loader),
156+
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, useLoaders, _this.resolvers.loader),
157+
_this.resolveRequestArray.bind(_this, contextInfo, _this.context, useLoadersRight, _this.resolvers.loader)
158+
], function(err, results) {
159+
if(err) return callback(err);
160+
loaders = results[0].concat(loaders).concat(results[1]).concat(results[2]);
161+
onDoneResolving();
162+
});
134163

135164
function onDoneResolving() {
136165
callback(null, {
137166
context: context,
138-
request: loaders.concat([resource]).join("!"),
167+
request: loaders.map(loaderToIdent).concat([resource]).join("!"),
139168
dependencies: data.dependencies,
140169
userRequest: userRequest,
141170
rawRequest: request,
142171
loaders: loaders,
143172
resource: resource,
144-
parser: _this.getParser(null)
173+
parser: _this.getParser(settings.parser)
145174
});
146175
}
147176
});
@@ -183,9 +212,12 @@ NormalModuleFactory.prototype.create = function(data, callback) {
183212
NormalModuleFactory.prototype.resolveRequestArray = function resolveRequestArray(contextInfo, context, array, resolver, callback) {
184213
if(array.length === 0) return callback(null, []);
185214
async.map(array, function(item, callback) {
186-
if(item === "" || item[0] === "?")
187-
return callback(null, item);
188-
resolver.resolve(contextInfo, context, item, callback);
215+
resolver.resolve(contextInfo, context, item.loader, function(err, result) {
216+
if(err) return callback(err);
217+
return callback(null, Object.assign({}, item, {
218+
loader: result
219+
}));
220+
});
189221
}, callback);
190222
};
191223

0 commit comments

Comments
 (0)