diff --git a/lib/Compilation.js b/lib/Compilation.js index 97b57f2c4..481c87aa3 100644 --- a/lib/Compilation.js +++ b/lib/Compilation.js @@ -9,6 +9,7 @@ var Parser = require("./Parser"); var Dependency = require("./Dependency"); var EntryModuleNotFoundError = require("./EntryModuleNotFoundError"); var ModuleNotFoundError = require("./ModuleNotFoundError"); +var CriticalDependenciesWarning = require("./CriticalDependenciesWarning"); var Module = require("./Module"); var ArrayMap = require("./ArrayMap"); var Chunk = require("./Chunk"); @@ -20,10 +21,9 @@ function Compilation(compiler) { this.mainTemplate = compiler.mainTemplate; this.chunkTemplate = compiler.chunkTemplate; this.moduleTemplate = compiler.moduleTemplate; - this.options = compiler.options; this.resolvers = compiler.resolvers; this.inputFileSystem = compiler.inputFileSystem; - var options = compiler.options; + var options = this.options = compiler.options; this.outputOptions = options && options.output; this.bail = options && options.bail; this.entries = []; @@ -116,6 +116,11 @@ Compilation.prototype.processModuleDependencies = function(module, callback) { } async.forEach(factories, function(item, callback) { 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) { err.dependencies = dependencies; err.origin = module; @@ -132,13 +137,13 @@ Compilation.prototype.processModuleDependencies = function(module, callback) { var factory = item[0]; factory.create(module.context, dependencies[0], function(err, dependantModule) { 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) { if(isOptional()) - return errorAndCallback(err); - else return warningAndCallback(err); + else + return errorAndCallback(err); } if(err) return errorOrWarningAndCallback(new ModuleNotFoundError(module, err)); if(!dependantModule) return callback(); diff --git a/lib/CriticalDependenciesWarning.js b/lib/CriticalDependenciesWarning.js new file mode 100644 index 000000000..395057438 --- /dev/null +++ b/lib/CriticalDependenciesWarning.js @@ -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); diff --git a/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js b/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js index cff89aa84..ba6cb1edd 100644 --- a/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js +++ b/lib/dependencies/AMDRequireDependenciesBlockParserPlugin.js @@ -111,7 +111,7 @@ module.exports = AbstractPlugin.create({ } }, "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; dep.loc = expr.loc; dep.optional = !!this.scope.inTry; diff --git a/lib/dependencies/CommonJsRequireDependencyParserPlugin.js b/lib/dependencies/CommonJsRequireDependencyParserPlugin.js index a093479b1..c5a46f6f0 100644 --- a/lib/dependencies/CommonJsRequireDependencyParserPlugin.js +++ b/lib/dependencies/CommonJsRequireDependencyParserPlugin.js @@ -50,7 +50,7 @@ module.exports = AbstractPlugin.create({ } }, "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; dep.loc = expr.loc; dep.optional = !!this.scope.inTry; diff --git a/lib/dependencies/ContextDependencyHelpers.js b/lib/dependencies/ContextDependencyHelpers.js index ab3f66939..74f9fb77d 100644 --- a/lib/dependencies/ContextDependencyHelpers.js +++ b/lib/dependencies/ContextDependencyHelpers.js @@ -4,7 +4,7 @@ */ var ContextDependencyHelpers = exports; -ContextDependencyHelpers.create = function(Dep, range, param) { +ContextDependencyHelpers.create = function(Dep, range, param, expr) { if(param.isWrapped() && param.prefix.isString()) { var prefix = param.prefix.string; var postfix = param.postfix.isString() ? param.postfix.string : ""; @@ -21,9 +21,13 @@ ContextDependencyHelpers.create = function(Dep, range, param) { ".*" + postfix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"); var dep = new Dep(context, true, regExp, range, valueRange); + dep.loc = expr.loc; dep.prepend = prefix; return dep; } 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; } };