Skip to content

Commit 466ec90

Browse files
committed
let loaders emit warnings/errors, don't fail on entry module error
1 parent 0cf8a98 commit 466ec90

File tree

5 files changed

+71
-19
lines changed

5 files changed

+71
-19
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -477,15 +477,20 @@ You can also save this options object in a JSON file and use it with the shell c
477477
// "-web-loader", "-loader", ""]
478478
// postfixes for loader modules to try
479479

480-
loaders: [{test: /\.generator.js/, loader: "val"}],
480+
loaders: [{
481+
test: /\.generator\.js/,
482+
exclude: /\.no\.generator\.js/,
483+
loader: "val"
484+
}],
481485
// default: (defaults are also included if you define your own)
482486
// [{test: /\.coffee$/, loader: "coffee"},
483487
// {test: /\.json$/, loader: "json"},
484488
// {test: /\.jade$/, loader: "jade"},
485489
// {test: /\.css$/, loader: "style!css"},
486490
// {test: /\.less$/, loader: "style!css!val!less"}]
487491
// automatically use loaders if filename match RegExp
488-
// and no loader is specified
492+
// and no loader is specified.
493+
// you can pass a RegExp as string, or multiple RegExps/strings in an array
489494

490495
postprocess: {
491496
normal: [function(filename, callback) {

lib/buildDeps.js

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,8 +48,9 @@ module.exports = function buildDeps(context, mainModule, options, callback) {
4848
// all other stuff is added recursivly
4949
addModule(depTree, context, mainModule, options, {type: "main"}, function(err, id) {
5050
if(err) {
51-
callback(err);
52-
return;
51+
depTree.errors.push("Entry module failed!\n " + err +
52+
"\n @ " + mainModule);
53+
id = 0;
5354
}
5455
buildTree(id);
5556
});
@@ -216,16 +217,29 @@ function addModule(depTree, context, modu, options, reason, finalCallback) {
216217
context, filenameWithLoaders,
217218
preLoaders, loaders, postLoaders,
218219
filename,
219-
options, function(err, source, deps, dependencyInfo, profileBuild) {
220+
options, function(err, extraResults, source, deps) {
220221

222+
var dependencyInfo = extraResults && extraResults.dependencyInfo;
221223
if(dependencyInfo) modu.dependencies = dependencyInfo.files; // It my be also supplied if err is set.
224+
if(extraResults && extraResults.warnings && extraResults.warnings.length > 0) {
225+
extraResults.warnings.forEach(function(w) {
226+
depTree.warnings.push(w + "\n @ loader @ " + filenameWithLoaders);
227+
});
228+
modu.warnings = extraResults.warnings;
229+
}
230+
if(extraResults && extraResults.errors && extraResults.errors.length > 0) {
231+
extraResults.errors.forEach(function(e) {
232+
depTree.errors.push(e + "\n @ loader @ " + filenameWithLoaders);
233+
});
234+
modu.errors = extraResults.errors;
235+
}
222236
if(err) {
223237
modu.error = err;
224238
return callback(err);
225239
}
226240

227241
if(profile) {
228-
profile.buildModule = profileBuild;
242+
profile.buildModule = extraResults.profile;
229243
profile.buildModuleEnd = new Date();
230244
}
231245
if(dependencyInfo.cacheable && options.cache) {
@@ -243,11 +257,31 @@ function addModule(depTree, context, modu, options, reason, finalCallback) {
243257
}
244258
}
245259

260+
function asRegExp(test) {
261+
if(typeof test == "string") test = new RegExp(test);
262+
return test;
263+
}
264+
265+
function matchAny(test, str) {
266+
if(!test) return true;
267+
test = asRegExp(test);
268+
if(Array.isArray(test)) {
269+
return test.map(asRegExp).filter(function(regExp) {
270+
return regExp.test(str);
271+
}).length > 0;
272+
} else {
273+
return test.test(str);
274+
}
275+
}
276+
246277
function matchLoadersList(list) {
247278
return list.filter(function(item) {
248-
var regExp = item.test;
249-
if(typeof regExp == "string") regExp = new RegExp(regExp);
250-
return (regExp.test(filename));
279+
return matchAny(item.test, filename);
280+
}).filter(function(item) {
281+
return matchAny(item.include, filename);
282+
}).filter(function(item) {
283+
if(!item.exclude) return true;
284+
return !matchAny(item.exclude, filename);
251285
}).map(function(item) {
252286
return item.loader;
253287
}).join("!");

lib/buildModule.js

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,47 @@ function buildModule(context, filenameWithLoaders,
1818
var dependencyInfo = {
1919
cacheable: true,
2020
files: [filename]
21+
};
22+
23+
var extraResults = {
24+
dependencyInfo: dependencyInfo,
25+
profile: profile,
26+
warnings: [],
27+
errors: []
2128
}
2229

2330
fs.readFile(filename, function(err, content) {
24-
if(err) return callback(err, null, null, dependencyInfo);
31+
if(err) return callback(err, extraResults);
2532

2633
profile && (profile.readEnd = new Date().getTime());
2734

2835
var loaderContext = {
2936
loaders: loaders,
3037
preLoaders: preLoaders,
3138
postLoaders: postLoaders,
32-
loaderType: null
39+
loaderType: null,
40+
emitWarning: function(warning) {
41+
extraResults.warnings.push(warning);
42+
},
43+
emitError: function(error) {
44+
extraResults.errors.push(error);
45+
}
3346
};
3447

3548
loaderContext.loaderType = "preLoader";
3649
execLoaders(context, filenameWithLoaders, preLoaders, [filename], [content], loaderContext, dependencyInfo, options,
3750
function(err, result) {
38-
if(err) return callback(err, null, null, dependencyInfo);
51+
if(err) return callback(err, extraResults);
3952
profile && (profile.preLoadersEnd = new Date().getTime());
4053
loaderContext.loaderType = "loader";
4154
execLoaders(context, filenameWithLoaders, loaders, [filename], result, loaderContext, dependencyInfo, options,
4255
function(err, result) {
43-
if(err) return callback(err, null, null, dependencyInfo);
56+
if(err) return callback(err, extraResults);
4457
profile && (profile.loadersEnd = new Date().getTime());
4558
loaderContext.loaderType = "postLoader";
4659
execLoaders(context, filenameWithLoaders, postLoaders, [filename], result, loaderContext, dependencyInfo, options,
4760
function(err, result) {
48-
if(err) return callback(err, null, null, dependencyInfo);
61+
if(err) return callback(err, extraResults);
4962
profile && (profile.postLoadersEnd = new Date().getTime());
5063
return processJs(result)
5164
});
@@ -63,11 +76,11 @@ function buildModule(context, filenameWithLoaders,
6376
try {
6477
deps = parse(source, options.parse);
6578
} catch(e) {
66-
callback(new Error("File \"" + filenameWithLoaders + "\" parsing failed: " + e), null, null, dependencyInfo);
79+
callback(new Error("File \"" + filenameWithLoaders + "\" parsing failed: " + e), extraResults);
6780
return;
6881
}
6982
profile && (profile.end = new Date().getTime());
70-
return callback(null, source, deps, dependencyInfo, profile);
83+
return callback(null, extraResults, source, deps);
7184
}
7285
}
7386
module.exports = buildModule;

lib/worker.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,9 @@ process.on("message", function(msg) {
3939
buildModule(context, filenameWithLoaders,
4040
preLoaders, loaders, postLoaders,
4141
filename,
42-
options, function(err, source, deps, cacheInfo, profile) {
42+
options, function(err, extraResults, source, deps) {
4343
if(err) err = { message: err.message, stack: err.stack, _toString: err.toString() };
44-
process.send([id, err, source, deps, cacheInfo, profile]);
44+
process.send([id, err, extraResults, source, deps]);
4545
});
4646
break;
4747
case "resolve":

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "webpack",
3-
"version": "0.7.2",
3+
"version": "0.7.3",
44
"author": "Tobias Koppers @sokra",
55
"description": "Packs CommonJs/AMD Modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loading of js, json, jade, coffee, css, ... out of the box and more with custom loaders.",
66
"dependencies": {

0 commit comments

Comments
 (0)