Skip to content

Commit f3a2e80

Browse files
committed
1 parent cecf0d5 commit f3a2e80

File tree

3 files changed

+59
-5
lines changed

3 files changed

+59
-5
lines changed

ExtractedModule.js

+17-1
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
var SourceMapSource = require("webpack/lib/SourceMapSource");
66
var RawSource = require("webpack/lib/RawSource");
77

8-
function ExtractedModule(identifier, originalModule, source, sourceMap, addtitionalInformation) {
8+
function ExtractedModule(identifier, originalModule, source, sourceMap, addtitionalInformation, prevModules) {
99
this._identifier = identifier;
1010
this._originalModule = originalModule;
1111
this._source = source;
1212
this._sourceMap = sourceMap;
13+
this._prevModules = prevModules;
1314
this.addtitionalInformation = addtitionalInformation;
1415
this.chunks = [];
1516
}
@@ -39,3 +40,18 @@ ExtractedModule.prototype.source = function() {
3940
else
4041
return new RawSource(this._source);
4142
};
43+
44+
ExtractedModule.prototype.getOriginalModule = function() {
45+
return this._originalModule;
46+
};
47+
48+
ExtractedModule.prototype.getPrevModules = function() {
49+
return this._prevModules;
50+
}
51+
52+
ExtractedModule.prototype.addPrevModules = function(prevModules) {
53+
prevModules.forEach(function(m) {
54+
if(this._prevModules.indexOf(m) < 0)
55+
this._prevModules.push(m);
56+
}, this);
57+
};

OrderUndefinedError.js

+14
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+
function OrderUndefinedError(module) {
6+
Error.call(this);
7+
Error.captureStackTrace(this, OrderUndefinedError);
8+
this.name = "OrderUndefinedError";
9+
this.message = "Order in extracted chunk undefined";
10+
this.module = module;
11+
}
12+
module.exports = OrderUndefinedError;
13+
14+
OrderUndefinedError.prototype = Object.create(Error.prototype);

index.js

+28-4
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ var SourceMapConsumer = require("source-map").SourceMapConsumer;
1010
var ModuleFilenameHelpers = require("webpack/lib/ModuleFilenameHelpers");
1111
var ExtractedModule = require("./ExtractedModule");
1212
var Chunk = require("webpack/lib/Chunk");
13+
var OrderUndefinedError = require("./OrderUndefinedError");
1314
var loaderUtils = require("loader-utils");
1415

1516
var nextId = 0;
@@ -197,6 +198,13 @@ ExtractTextPlugin.prototype.apply = function(compiler) {
197198
extractedChunks.forEach(function(extractedChunk) {
198199
if(extractedChunk.modules.length) {
199200
extractedChunk.modules.sort(function(a, b) {
201+
var order = getOrder(a, b);
202+
if(isNaN(order)) {
203+
compilation.errors.push(new OrderUndefinedError(a.getOriginalModule()));
204+
compilation.errors.push(new OrderUndefinedError(b.getOriginalModule()));
205+
}
206+
if(order !== 0 && !isNaN(order))
207+
return order;
200208
var ai = a.identifier();
201209
var bi = b.identifier();
202210
if(ai < bi)
@@ -246,24 +254,28 @@ ExtractTextPlugin.prototype.mergeNonInitialChunks = function(chunk, intoChunk, c
246254
}
247255
};
248256

249-
ExtractTextPluginCompilation.prototype.addModule = function(identifier, originalModule, source, additionalInformation, sourceMap) {
257+
ExtractTextPluginCompilation.prototype.addModule = function(identifier, originalModule, source, additionalInformation, sourceMap, prevModules) {
250258
if(!this.modulesByIdentifier[identifier])
251-
return this.modulesByIdentifier[identifier] = new ExtractedModule(identifier, originalModule, source, sourceMap, additionalInformation);
252-
return this.modulesByIdentifier[identifier];
259+
return this.modulesByIdentifier[identifier] = new ExtractedModule(identifier, originalModule, source, sourceMap, additionalInformation, prevModules);
260+
var m = this.modulesByIdentifier[identifier];
261+
m.addPrevModules(prevModules);
262+
return m;
253263
};
254264

255265
ExtractTextPluginCompilation.prototype.addResultToChunk = function(identifier, result, originalModule, extractedChunk) {
256266
if(!Array.isArray(result)) {
257267
result = [[identifier, result]];
258268
}
259269
var counterMap = {};
270+
var prevModules = [];
260271
result.forEach(function(item) {
261272
var c = counterMap[item[0]];
262273
var i = item.slice();
263-
var module = this.addModule.call(this, item[0] + (c || ""), originalModule, item[1], item[2], item[3]);
274+
var module = this.addModule.call(this, item[0] + (c || ""), originalModule, item[1], item[2], item[3], prevModules.slice());
264275
extractedChunk.addModule(module);
265276
module.addChunk(extractedChunk);
266277
counterMap[item[0]] = (c || 0) + 1;
278+
prevModules.push(module);
267279
}, this);
268280
};
269281

@@ -274,3 +286,15 @@ ExtractTextPlugin.prototype.renderExtractedChunk = function(chunk) {
274286
}, this);
275287
return source;
276288
};
289+
290+
function getOrder(a, b) {
291+
var bBeforeA = a.getPrevModules().indexOf(b) >= 0;
292+
var aBeforeB = b.getPrevModules().indexOf(a) >= 0;
293+
if(aBeforeB && bBeforeA)
294+
return NaN;
295+
if(bBeforeA)
296+
return 1;
297+
if(aBeforeB)
298+
return -1;
299+
return 0;
300+
}

0 commit comments

Comments
 (0)