This commit is contained in:
Tobias Koppers 2013-02-13 14:42:34 +01:00
parent a0b4d5bd5c
commit dc69f23de4
5 changed files with 33 additions and 9 deletions

View File

@ -9,6 +9,7 @@ var Parser = require("./Parser");
var Dependency = require("./Dependency"); var Dependency = require("./Dependency");
var EntryModuleNotFoundError = require("./EntryModuleNotFoundError"); var EntryModuleNotFoundError = require("./EntryModuleNotFoundError");
var ModuleNotFoundError = require("./ModuleNotFoundError"); var ModuleNotFoundError = require("./ModuleNotFoundError");
var CriticalDependenciesWarning = require("./CriticalDependenciesWarning");
var Module = require("./Module"); var Module = require("./Module");
var ArrayMap = require("./ArrayMap"); var ArrayMap = require("./ArrayMap");
var Chunk = require("./Chunk"); var Chunk = require("./Chunk");
@ -20,10 +21,9 @@ function Compilation(compiler) {
this.mainTemplate = compiler.mainTemplate; this.mainTemplate = compiler.mainTemplate;
this.chunkTemplate = compiler.chunkTemplate; this.chunkTemplate = compiler.chunkTemplate;
this.moduleTemplate = compiler.moduleTemplate; this.moduleTemplate = compiler.moduleTemplate;
this.options = compiler.options;
this.resolvers = compiler.resolvers; this.resolvers = compiler.resolvers;
this.inputFileSystem = compiler.inputFileSystem; this.inputFileSystem = compiler.inputFileSystem;
var options = compiler.options; var options = this.options = compiler.options;
this.outputOptions = options && options.output; this.outputOptions = options && options.output;
this.bail = options && options.bail; this.bail = options && options.bail;
this.entries = []; this.entries = [];
@ -116,6 +116,11 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
} }
async.forEach(factories, function(item, callback) { async.forEach(factories, function(item, callback) {
var dependencies = item[1]; var dependencies = item[1];
var criticalDependencies = dependencies.filter(function(d) { return !!d.critical });
if(criticalDependencies.length > 0) {
this.warnings.push(new CriticalDependenciesWarning(module, criticalDependencies));
}
var errorAndCallback = function errorAndCallback(err) { var errorAndCallback = function errorAndCallback(err) {
err.dependencies = dependencies; err.dependencies = dependencies;
err.origin = module; err.origin = module;
@ -132,13 +137,13 @@ Compilation.prototype.processModuleDependencies = function(module, callback) {
var factory = item[0]; var factory = item[0];
factory.create(module.context, dependencies[0], function(err, dependantModule) { factory.create(module.context, dependencies[0], function(err, dependantModule) {
function isOptional() { function isOptional() {
return dependencies.filter(function(d) { return !d.optional }).length > 0; return dependencies.filter(function(d) { return !d.optional }).length == 0;
} }
function errorOrWarningAndCallback(err) { function errorOrWarningAndCallback(err) {
if(isOptional()) if(isOptional())
return errorAndCallback(err);
else
return warningAndCallback(err); return warningAndCallback(err);
else
return errorAndCallback(err);
} }
if(err) return errorOrWarningAndCallback(new ModuleNotFoundError(module, err)); if(err) return errorOrWarningAndCallback(new ModuleNotFoundError(module, err));
if(!dependantModule) return callback(); if(!dependantModule) return callback();

View File

@ -0,0 +1,15 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function CriticalDependenciesWarning(module, dependencies) {
Error.call(this);
Error.captureStackTrace(this, CriticalDependenciesWarning);
this.name = "CriticalDependenciesWarning";
this.message = "Critical dependencies.";
this.dependencies = dependencies;
this.origin = this.module = module;
}
module.exports = CriticalDependenciesWarning;
CriticalDependenciesWarning.prototype = Object.create(Error.prototype);

View File

@ -111,7 +111,7 @@ module.exports = AbstractPlugin.create({
} }
}, },
"call require:amd:context": function(expr, param) { "call require:amd:context": function(expr, param) {
var dep = ContextDependencyHelpers.create(AMDRequireContextDependency, param.range, param); var dep = ContextDependencyHelpers.create(AMDRequireContextDependency, param.range, param, expr);
if(!dep) return; if(!dep) return;
dep.loc = expr.loc; dep.loc = expr.loc;
dep.optional = !!this.scope.inTry; dep.optional = !!this.scope.inTry;

View File

@ -50,7 +50,7 @@ module.exports = AbstractPlugin.create({
} }
}, },
"call require:commonjs:context": function(expr, param) { "call require:commonjs:context": function(expr, param) {
var dep = ContextDependencyHelpers.create(CommonJsRequireContextDependency, expr.range, param); var dep = ContextDependencyHelpers.create(CommonJsRequireContextDependency, expr.range, param, expr);
if(!dep) return; if(!dep) return;
dep.loc = expr.loc; dep.loc = expr.loc;
dep.optional = !!this.scope.inTry; dep.optional = !!this.scope.inTry;

View File

@ -4,7 +4,7 @@
*/ */
var ContextDependencyHelpers = exports; var ContextDependencyHelpers = exports;
ContextDependencyHelpers.create = function(Dep, range, param) { ContextDependencyHelpers.create = function(Dep, range, param, expr) {
if(param.isWrapped() && param.prefix.isString()) { if(param.isWrapped() && param.prefix.isString()) {
var prefix = param.prefix.string; var prefix = param.prefix.string;
var postfix = param.postfix.isString() ? param.postfix.string : ""; var postfix = param.postfix.isString() ? param.postfix.string : "";
@ -21,9 +21,13 @@ ContextDependencyHelpers.create = function(Dep, range, param) {
".*" + ".*" +
postfix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"); postfix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$");
var dep = new Dep(context, true, regExp, range, valueRange); var dep = new Dep(context, true, regExp, range, valueRange);
dep.loc = expr.loc;
dep.prepend = prefix; dep.prepend = prefix;
return dep; return dep;
} else { } else {
return new Dep(".", true, /^\.\/.*$/, range, param.range); var dep = new Dep(".", true, /^\.\/.*$/, range, param.range);
dep.loc = expr.loc;
dep.critical = true;
return dep;
} }
}; };