From f44ed807fa981e69e3b010215d5ef8d636b3e6f4 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Sun, 29 Dec 2013 12:11:03 +0100 Subject: [PATCH 1/8] more reliable in parsing AMD stuff fixes #138 --- lib/dependencies/AMDDefineDependency.js | 20 ++++++--- .../AMDDefineDependencyParserPlugin.js | 43 +++++++++--------- test/cases/parsing/extract-amd/index.js | 44 ++++++++++++++++++- 3 files changed, 77 insertions(+), 30 deletions(-) diff --git a/lib/dependencies/AMDDefineDependency.js b/lib/dependencies/AMDDefineDependency.js index 226cb996be7..484df9f7e7d 100644 --- a/lib/dependencies/AMDDefineDependency.js +++ b/lib/dependencies/AMDDefineDependency.js @@ -4,12 +4,13 @@ */ var NullDependency = require("./NullDependency"); -function AMDDefineDependency(range, arrayRange, functionRange) { +function AMDDefineDependency(range, arrayRange, functionRange, objectRange) { NullDependency.call(this); this.Class = AMDDefineDependency; this.range = range; this.arrayRange = arrayRange; this.functionRange = functionRange; + this.objectRange = objectRange; } module.exports = AMDDefineDependency; @@ -19,20 +20,25 @@ AMDDefineDependency.prototype.type = "amd define"; AMDDefineDependency.Template = function AMDRequireDependencyTemplate() {}; AMDDefineDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) { - if(dep.arrayRange && !dep.functionRange) { - source.replace(dep.range[0], dep.arrayRange[0]-1, + if(dep.objectRange && !dep.functionRange) { + source.replace(dep.range[0], dep.objectRange[0]-1, "(module.exports = "); - source.replace(dep.arrayRange[1], dep.range[1]-1, ")"); - } else if(!dep.arrayRange && dep.functionRange) { + source.replace(dep.objectRange[1], dep.range[1]-1, ")"); + } else if(!dep.arrayRange && dep.functionRange && !dep.objectRange) { source.replace(dep.range[0], dep.functionRange[0]-1, "(__WEBPACK_AMD_DEFINE_RESULT__ = ("); source.insert(0, "var __WEBPACK_AMD_DEFINE_RESULT__;"); - source.replace(dep.functionRange[1], dep.range[1]-1, "(require, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))"); - } else if(dep.arrayRange && dep.functionRange) { + source.replace(dep.functionRange[1], dep.range[1]-1, ".call(exports, require, exports, module)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))"); + } else if(dep.arrayRange && dep.functionRange && !dep.objectRange) { source.replace(dep.range[0], dep.arrayRange[0]-1, "(__WEBPACK_AMD_DEFINE_ARRAY__ = "); source.insert(0, "var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;"); source.replace(dep.arrayRange[1], dep.functionRange[0]-1, ", __WEBPACK_AMD_DEFINE_RESULT__ = ("); source.replace(dep.functionRange[1], dep.range[1]-1, ".apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))"); + } else if(dep.functionRange && dep.objectRange) { + source.replace(dep.range[0], dep.functionRange[0]-1, + "(__WEBPACK_AMD_DEFINE_FACTORY__ = ("); + source.insert(0, "var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;"); + source.replace(dep.functionRange[1], dep.range[1]-1, "), (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_RESULT__ = __WEBPACK_AMD_DEFINE_FACTORY__.call(null), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : module.exports = __WEBPACK_AMD_DEFINE_FACTORY__))"); } }; diff --git a/lib/dependencies/AMDDefineDependencyParserPlugin.js b/lib/dependencies/AMDDefineDependencyParserPlugin.js index 13303bbe9b9..9018461f76d 100644 --- a/lib/dependencies/AMDDefineDependencyParserPlugin.js +++ b/lib/dependencies/AMDDefineDependencyParserPlugin.js @@ -11,40 +11,39 @@ var ContextDependencyHelpers = require("./ContextDependencyHelpers"); module.exports = AbstractPlugin.create({ "call define": function(expr) { - var array, fn; + var array, fn, obj; switch(expr.arguments.length) { case 1: if(expr.arguments[0].type == "FunctionExpression") { // define(f() {...}) fn = expr.arguments[0]; - } else { + } else if(expr.arguments[0].type === "ObjectExpression") { // define({...}) - var dep = new AMDDefineDependency(expr.range, expr.arguments[0].range); - dep.loc = expr.loc; - this.state.current.addDependency(dep); - return true; + obj = expr.arguments[0]; + } else { + // define(expr) + // unclear if function or object + obj = fn = expr.arguments[0]; } break; case 2: if(expr.arguments[0].type === "Literal") { - if(expr.arguments[1].type == "FunctionExpression") { + // define("...", ...) + if(expr.arguments[1].type === "FunctionExpression") { // define("...", f() {...}) fn = expr.arguments[1]; - } else { + } else if(expr.arguments[1].type === "ObjectExpression") { // define("...", {...}) - var dep = new AMDDefineDependency(expr.range, expr.arguments[1].range); - dep.loc = expr.loc; - this.state.current.addDependency(dep); - return true; - } - } else { - if(expr.arguments[1].type == "FunctionExpression") { - // define([...], f() {...}) - array = expr.arguments[0]; - fn = expr.arguments[1]; + obj = expr.arguments[1]; } else { - return; + // define("...", expr) + // unclear if function or object + obj = fn = expr.arguments[1]; } + } else { + // define([...], f() {}) + array = expr.arguments[0]; + fn = expr.arguments[1]; } break; case 3: @@ -52,8 +51,8 @@ module.exports = AbstractPlugin.create({ array = expr.arguments[1]; fn = expr.arguments[2]; break; + default: return; } - if(!array && !fn) return; if(array) { var param = this.evaluateExpression(array); var result = this.applyPluginsBailResult("call define:amd:array", expr, param); @@ -70,8 +69,10 @@ module.exports = AbstractPlugin.create({ else this.walkExpression(fn.body); }.bind(this)); + } else if(fn || obj) { + this.walkExpression(fn || obj); } - var dep = new AMDDefineDependency(expr.range, array ? array.range : null, fn ? fn.range : null); + var dep = new AMDDefineDependency(expr.range, array ? array.range : null, fn ? fn.range : null, obj ? obj.range : null); dep.loc = expr.loc; this.state.current.addDependency(dep); return true; diff --git a/test/cases/parsing/extract-amd/index.js b/test/cases/parsing/extract-amd/index.js index 541b6489f0d..7727d7e360b 100644 --- a/test/cases/parsing/extract-amd/index.js +++ b/test/cases/parsing/extract-amd/index.js @@ -35,36 +35,60 @@ it("should be able to use AMD-style require", function(done) { done(); }); }); + it("should be able to use require.js-style define", function(done) { define("name", ["./circular"], function(circular) { circular.should.be.eql(1); done(); }); }); + it("should be able to use require.js-style define, without name", function(done) { true && define(["./circular"], function(circular) { circular.should.be.eql(1); done(); }); }); + it("should be able to use require.js-style define, with empty dependencies", function(done) { define("name", [], function() { done(); }); }); + +it("should be able to use require.js-style define, with empty dependencies, with a expression", function(done) { + define([], done); +}); + +it("should be able to use require.js-style define, with empty dependencies, with a expression and name", function(done) { + define("name", [], done); +}); + it("should be able to use require.js-style define, without dependencies", function(done) { true && define("name", function() { done(); }); }); + +it("should be able to use require.js-style define, without dependencies, with a expression", function(done) { + true && define("name", done); +}); + var obj = {}; it("should be able to use require.js-style define, with an object", function() { + module.exports = null; + true && define("blaaa", obj); + + module.exports.should.be.equal(obj); + module.exports = null; + define("blaaa", obj); -}); -after(function() { + module.exports.should.be.equal(obj); + module.exports = null; }); + it("should offer AMD-style define for CommonJs", function(done) { var _test_require = require.valueOf(); var _test_exports = exports; @@ -78,12 +102,15 @@ it("should offer AMD-style define for CommonJs", function(done) { done(); }); }); + it("should not crash on require.js require only with array", function() { require(["./circular"]); }); + it("should be able to use AMD require without function expression (empty array)", function(done) { require([], done); }); + it("should be able to use AMD require without function expression", function(done) { require(["./circular"], fn); function fn(c) { @@ -91,6 +118,7 @@ it("should be able to use AMD require without function expression", function(don done(); } }); + it("should create a chunk for require.js require", function(done) { var sameTick = true; require(["./c"], function(c) { @@ -101,3 +129,15 @@ it("should create a chunk for require.js require", function(done) { }); sameTick = false; }); + +it("should not fail #138", function(done) { + (function (factory) { + if (typeof define === 'function' && define.amd) { + define([], factory); // AMD + } else if (typeof exports === 'object') { + module.exports = factory(); // Node + } else { + factory(); // Browser global + } + }(function () { done() })); +}); From 86e0fa51711b80f7bb335d6d1a9630285dff8b2d Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Sun, 29 Dec 2013 12:21:14 +0100 Subject: [PATCH 2/8] fixed rar bug --- lib/dependencies/AMDDefineDependency.js | 2 +- test/cases/parsing/extract-amd/index.js | 41 +++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/lib/dependencies/AMDDefineDependency.js b/lib/dependencies/AMDDefineDependency.js index 484df9f7e7d..4d277eb913d 100644 --- a/lib/dependencies/AMDDefineDependency.js +++ b/lib/dependencies/AMDDefineDependency.js @@ -39,6 +39,6 @@ AMDDefineDependency.Template.prototype.apply = function(dep, source, outputOptio source.replace(dep.range[0], dep.functionRange[0]-1, "(__WEBPACK_AMD_DEFINE_FACTORY__ = ("); source.insert(0, "var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;"); - source.replace(dep.functionRange[1], dep.range[1]-1, "), (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_RESULT__ = __WEBPACK_AMD_DEFINE_FACTORY__.call(null), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : module.exports = __WEBPACK_AMD_DEFINE_FACTORY__))"); + source.replace(dep.functionRange[1], dep.range[1]-1, "), (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_RESULT__ = __WEBPACK_AMD_DEFINE_FACTORY__.call(exports, require, exports, module), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)) : module.exports = __WEBPACK_AMD_DEFINE_FACTORY__))"); } }; diff --git a/test/cases/parsing/extract-amd/index.js b/test/cases/parsing/extract-amd/index.js index 7727d7e360b..9712685271c 100644 --- a/test/cases/parsing/extract-amd/index.js +++ b/test/cases/parsing/extract-amd/index.js @@ -57,7 +57,8 @@ it("should be able to use require.js-style define, with empty dependencies", fun }); it("should be able to use require.js-style define, with empty dependencies, with a expression", function(done) { - define([], done); + define([], ok); + function ok() { done() }; }); it("should be able to use require.js-style define, with empty dependencies, with a expression and name", function(done) { @@ -71,7 +72,8 @@ it("should be able to use require.js-style define, without dependencies", functi }); it("should be able to use require.js-style define, without dependencies, with a expression", function(done) { - true && define("name", done); + true && define("name", ok); + function ok() { done() }; }); var obj = {}; @@ -108,7 +110,8 @@ it("should not crash on require.js require only with array", function() { }); it("should be able to use AMD require without function expression (empty array)", function(done) { - require([], done); + require([], ok); + function ok() { done() }; }); it("should be able to use AMD require without function expression", function(done) { @@ -141,3 +144,35 @@ it("should not fail #138", function(done) { } }(function () { done() })); }); + +it("should parse a bound function expression 1", function(done) { + define(function(a, require, exports, module) { + a.should.be.eql(123); + require.should.be.type("function"); + done(); + }.bind(null, 123)); +}); + +it("should parse a bound function expression 2", function(done) { + define("name", function(a, require, exports, module) { + a.should.be.eql(123); + require.should.be.type("function"); + done(); + }.bind(null, 123)); +}); + +it("should parse a bound function expression 3", function(done) { + define(["./a"], function(number, a) { + number.should.be.eql(123); + a.should.be.eql("a"); + done(); + }.bind(null, 123)); +}); + +it("should parse a bound function expression 4", function(done) { + define("name", ["./a"], function(number, a) { + number.should.be.eql(123); + a.should.be.eql("a"); + done(); + }.bind(null, 123)); +}); From 3e38890c0c2f6d39aa1901ea290e64e7c57c00bd Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Sun, 29 Dec 2013 12:24:48 +0100 Subject: [PATCH 3/8] 0.11.16 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 95f415b9578..0091930006b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webpack", - "version": "0.11.15", + "version": "0.11.16", "author": "Tobias Koppers @sokra", "description": "Packs CommonJs/AMD/Labeled Modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jade, coffee, css, less, ... and your custom stuff.", "dependencies": { From 6929ee0d695364465731734590b9fa7bccbfab14 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 31 Dec 2013 12:20:06 +0100 Subject: [PATCH 4/8] allow bound function expressions in define calls --- .../AMDDefineDependencyParserPlugin.js | 27 +++++++++++++++++-- test/cases/parsing/extract-amd/index.js | 6 +++-- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/lib/dependencies/AMDDefineDependencyParserPlugin.js b/lib/dependencies/AMDDefineDependencyParserPlugin.js index 9018461f76d..b67ec101644 100644 --- a/lib/dependencies/AMDDefineDependencyParserPlugin.js +++ b/lib/dependencies/AMDDefineDependencyParserPlugin.js @@ -9,12 +9,22 @@ var ConstDependency = require("./ConstDependency"); var AMDDefineDependency = require("./AMDDefineDependency"); var ContextDependencyHelpers = require("./ContextDependencyHelpers"); +function isBoundFunctionExpression(expr) { + if(expr.type !== "CallExpression") return false; + if(expr.callee.type !== "MemberExpression") return false; + if(expr.callee.computed) return false; + if(expr.callee.object.type !== "FunctionExpression") return false; + if(expr.callee.property.type !== "Identifier") return false; + if(expr.callee.property.name !== "bind") return false; + return true; +} + module.exports = AbstractPlugin.create({ "call define": function(expr) { var array, fn, obj; switch(expr.arguments.length) { case 1: - if(expr.arguments[0].type == "FunctionExpression") { + if(expr.arguments[0].type == "FunctionExpression" || isBoundFunctionExpression(expr.arguments[0])) { // define(f() {...}) fn = expr.arguments[0]; } else if(expr.arguments[0].type === "ObjectExpression") { @@ -29,7 +39,7 @@ module.exports = AbstractPlugin.create({ case 2: if(expr.arguments[0].type === "Literal") { // define("...", ...) - if(expr.arguments[1].type === "FunctionExpression") { + if(expr.arguments[1].type === "FunctionExpression" || isBoundFunctionExpression(expr.arguments[0])) { // define("...", f() {...}) fn = expr.arguments[1]; } else if(expr.arguments[1].type === "ObjectExpression") { @@ -69,6 +79,19 @@ module.exports = AbstractPlugin.create({ else this.walkExpression(fn.body); }.bind(this)); + } else if(fn && isBoundFunctionExpression(fn)) { + var inTry = this.scope.inTry; + this.inScope(fn.callee.object.params.filter(function(i) { + return ["require", "module", "exports"].indexOf(i.name) < 0; + }), function() { + this.scope.inTry = inTry; + if(fn.callee.object.body.type === "BlockStatement") + this.walkStatement(fn.callee.object.body); + else + this.walkExpression(fn.callee.object.body); + }.bind(this)); + if(fn.arguments) + this.walkExpressions(fn.arguments); } else if(fn || obj) { this.walkExpression(fn || obj); } diff --git a/test/cases/parsing/extract-amd/index.js b/test/cases/parsing/extract-amd/index.js index 9712685271c..4d439a87694 100644 --- a/test/cases/parsing/extract-amd/index.js +++ b/test/cases/parsing/extract-amd/index.js @@ -148,7 +148,8 @@ it("should not fail #138", function(done) { it("should parse a bound function expression 1", function(done) { define(function(a, require, exports, module) { a.should.be.eql(123); - require.should.be.type("function"); + (typeof require).should.be.eql("function"); + require("./a").should.be.eql("a"); done(); }.bind(null, 123)); }); @@ -156,7 +157,8 @@ it("should parse a bound function expression 1", function(done) { it("should parse a bound function expression 2", function(done) { define("name", function(a, require, exports, module) { a.should.be.eql(123); - require.should.be.type("function"); + (typeof require).should.be.eql("function"); + require("./a").should.be.eql("a"); done(); }.bind(null, 123)); }); From 783e251691f3ee86d906c27662cbfec015e419af Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 31 Dec 2013 12:23:58 +0100 Subject: [PATCH 5/8] track free vars over IIFEs #138 --- lib/Parser.js | 43 +++++++++++++++++++------ test/cases/parsing/extract-amd/index.js | 11 +++++++ 2 files changed, 44 insertions(+), 10 deletions(-) diff --git a/lib/Parser.js b/lib/Parser.js index b6f8bf4cf35..0ed36aac4bf 100644 --- a/lib/Parser.js +++ b/lib/Parser.js @@ -549,17 +549,40 @@ Parser.prototype.walkExpression = function walkExpression(expression) { this.walkExpressions(expression.arguments); break; case "CallExpression": - var callee = this.evaluateExpression(expression.callee); - if(callee.isIdentifier()) { - var result = this.applyPluginsBailResult("call " + callee.identifier, expression); - if(result === true) - break; - } + if(expression.callee.type === "FunctionExpression" && expression.arguments) { + // (function(...) { }(...)) + var args = expression.arguments.map(function(arg) { + var result = this.evaluateExpression(arg); + if(!result.isIdentifier()) result = undefined; + if(!result) { + this.walkExpression(arg); + return; + } + return result.identifier; + }, this); + this.inScope(expression.callee.params.filter(function(identifier, idx) { + return identifier.name !== args[idx]; + }), function() { + if(expression.callee.body.type === "BlockStatement") + this.walkStatement(expression.callee.body); + else + this.walkExpression(expression.callee.body); + }.bind(this)); - if(expression.callee) - this.walkExpression(expression.callee); - if(expression.arguments) - this.walkExpressions(expression.arguments); + } else { + + var callee = this.evaluateExpression(expression.callee); + if(callee.isIdentifier()) { + var result = this.applyPluginsBailResult("call " + callee.identifier, expression); + if(result === true) + break; + } + + if(expression.callee) + this.walkExpression(expression.callee); + if(expression.arguments) + this.walkExpressions(expression.arguments); + } break; case "MemberExpression": var expr = expression; diff --git a/test/cases/parsing/extract-amd/index.js b/test/cases/parsing/extract-amd/index.js index 4d439a87694..d1da75da3e2 100644 --- a/test/cases/parsing/extract-amd/index.js +++ b/test/cases/parsing/extract-amd/index.js @@ -178,3 +178,14 @@ it("should parse a bound function expression 4", function(done) { done(); }.bind(null, 123)); }); + +it("should not fail issue #138 second", function() { + (function(define, global) { 'use strict'; + define(function (require) { + (typeof require).should.be.eql("function"); + require("./a").should.be.eql("a"); + return "#138 2."; + }); + })(typeof define === 'function' && define.amd ? define : function (factory) { module.exports = factory(require); }, this); + module.exports.should.be.eql("#138 2."); +}); \ No newline at end of file From 1de897068eb544e7b9df03bf07081506aa38020d Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 31 Dec 2013 12:25:44 +0100 Subject: [PATCH 6/8] 0.11.17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0091930006b..c49693b8743 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webpack", - "version": "0.11.16", + "version": "0.11.17", "author": "Tobias Koppers @sokra", "description": "Packs CommonJs/AMD/Labeled Modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jade, coffee, css, less, ... and your custom stuff.", "dependencies": { From a008d90164cde033b898efb2ce38f3e848785081 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 31 Dec 2013 12:42:38 +0100 Subject: [PATCH 7/8] bug fix --- lib/Parser.js | 6 ++++-- test/cases/parsing/extract-amd/index.js | 9 +++++++++ test/cases/parsing/extract-amd/warnings.js | 3 +++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 test/cases/parsing/extract-amd/warnings.js diff --git a/lib/Parser.js b/lib/Parser.js index 0ed36aac4bf..7a20b29f0ee 100644 --- a/lib/Parser.js +++ b/lib/Parser.js @@ -551,9 +551,11 @@ Parser.prototype.walkExpression = function walkExpression(expression) { case "CallExpression": if(expression.callee.type === "FunctionExpression" && expression.arguments) { // (function(...) { }(...)) - var args = expression.arguments.map(function(arg) { + var args = expression.arguments.map(function(arg, idx) { var result = this.evaluateExpression(arg); - if(!result.isIdentifier()) result = undefined; + if(result && !result.isIdentifier()) result = undefined; + if(result && (!expression.callee.params[idx] || expression.callee.params[idx].name !== result.identifier)) + result = undefined; if(!result) { this.walkExpression(arg); return; diff --git a/test/cases/parsing/extract-amd/index.js b/test/cases/parsing/extract-amd/index.js index d1da75da3e2..4ea7f324930 100644 --- a/test/cases/parsing/extract-amd/index.js +++ b/test/cases/parsing/extract-amd/index.js @@ -179,6 +179,15 @@ it("should parse a bound function expression 4", function(done) { }.bind(null, 123)); }); +it("should create a context if require passed to IIFE (renaming todo)", function(done) { + require.ensure([], function(require) { + (function(req) { + req.keys.should.be.type("function"); + done(); + }(require)); + }); +}); + it("should not fail issue #138 second", function() { (function(define, global) { 'use strict'; define(function (require) { diff --git a/test/cases/parsing/extract-amd/warnings.js b/test/cases/parsing/extract-amd/warnings.js new file mode 100644 index 00000000000..688b2ebf5c1 --- /dev/null +++ b/test/cases/parsing/extract-amd/warnings.js @@ -0,0 +1,3 @@ +module.exports = [ + [/Critical dependencies/] +]; \ No newline at end of file From 0a29109a6e4579926ebc9b03a6301c61861cce62 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Tue, 31 Dec 2013 12:43:03 +0100 Subject: [PATCH 8/8] 0.11.18 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c49693b8743..35ad039f79f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "webpack", - "version": "0.11.17", + "version": "0.11.18", "author": "Tobias Koppers @sokra", "description": "Packs CommonJs/AMD/Labeled Modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jade, coffee, css, less, ... and your custom stuff.", "dependencies": {