From 83eec78bf03a7b37acdcc626777b6043d523bcda Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Sat, 1 Mar 2014 20:07:42 +0100 Subject: [PATCH] follow the browser-module spec: ignoring export an empty module. fixes #187 --- lib/NormalModuleFactory.js | 7 +- lib/RawModule.js | 65 +++++++++++++++++++ test/cases/resolving/browser-field/index.js | 6 ++ .../node_modules/ignoring-module/file.js | 1 + .../node_modules/ignoring-module/index.js | 2 + .../node_modules/ignoring-module/package.json | 6 ++ 6 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 lib/RawModule.js create mode 100644 test/cases/resolving/browser-field/node_modules/ignoring-module/file.js create mode 100644 test/cases/resolving/browser-field/node_modules/ignoring-module/index.js create mode 100644 test/cases/resolving/browser-field/node_modules/ignoring-module/package.json diff --git a/lib/NormalModuleFactory.js b/lib/NormalModuleFactory.js index d56992af1..2489aaf53 100644 --- a/lib/NormalModuleFactory.js +++ b/lib/NormalModuleFactory.js @@ -6,6 +6,7 @@ var async = require("async"); var Tapable = require("tapable"); var NormalModule = require("./NormalModule"); +var RawModule = require("./RawModule"); var LoadersList = require("webpack-core/lib/LoadersList"); function NormalModuleFactory(context, resolvers, parser, options) { @@ -55,7 +56,11 @@ NormalModuleFactory.prototype.create = function(context, dependency, callback) { var loaders = results[0]; resource = results[1]; - if(resource === false) return callback(); // ignored + if(resource === false) + return callback(null, + new RawModule("/* (ignored) */", + "ignored " + context + " " + request, + request + " (ignored)")); // ignored var userRequest = loaders.concat([resource]).join("!"); diff --git a/lib/RawModule.js b/lib/RawModule.js new file mode 100644 index 000000000..a4094e7f6 --- /dev/null +++ b/lib/RawModule.js @@ -0,0 +1,65 @@ +/* + MIT License http://www.opensource.org/licenses/mit-license.php + Author Tobias Koppers @sokra +*/ +var Module = require("./Module"); +var OriginalSource = require("webpack-core/lib/OriginalSource"); +var RawSource = require("webpack-core/lib/RawSource"); + +function RawModule(source, identifier, readableIdentifier) { + Module.call(this); + this.sourceStr = source; + this.identifierStr = identifier || this.sourceStr; + this.readableIdentifierStr = readableIdentifier || this.identifierStr; + this.cacheable = true; + this.built = false; +} +module.exports = RawModule; + +RawModule.prototype = Object.create(Module.prototype); + +RawModule.prototype.identifier = function() { + return this.identifierStr; +}; + +RawModule.prototype.readableIdentifier = function(requestShortener) { + return requestShortener.shorten(this.readableIdentifierStr); +}; + +RawModule.prototype.needRebuild = function(fileTimestamps, contextTimestamps) { + return false; +}; + +RawModule.prototype.build = function(options, compilation, resolver, fs, callback) { + this.builtTime = new Date().getTime(); + callback(); +}; + +RawModule.prototype.source = function(dependencyTemplates, outputOptions, requestShortener) { + if(this.useSourceMap) + return new OriginalSource(this.sourceStr, this.identifier()); + else + return new RawSource(this.sourceStr); +}; + +RawModule.prototype.size = function() { + return this.sourceStr.length; +}; + +RawModule.prototype.getSourceHash = function() { + var hash = require("crypto").createHash("md5"); + hash.update(this.sourceStr); + return hash.digest("hex"); +}; + +RawModule.prototype.getAllModuleDependencies = function() { + return []; +}; + +RawModule.prototype.createTemplate = function() { + return new RawModule(this.sourceStr, "template of " + this.id); +}; + +RawModule.prototype.getTemplateArguments = function() { + return []; +}; diff --git a/test/cases/resolving/browser-field/index.js b/test/cases/resolving/browser-field/index.js index 3da3b6a21..342938206 100644 --- a/test/cases/resolving/browser-field/index.js +++ b/test/cases/resolving/browser-field/index.js @@ -28,6 +28,12 @@ it("should ignore recursive module mappings", function() { require("recursive-module").should.be.eql("new-module"); }); +it("should use empty modules for ignored modules", function() { + require("ignoring-module").module.should.be.eql({}); + require("ignoring-module").file.should.be.eql({}); + require("ignoring-module").module.should.not.be.equal(require("ignoring-module").file); +}); + // Errors require.include("recursive-file/a"); require.include("recursive-file/b"); diff --git a/test/cases/resolving/browser-field/node_modules/ignoring-module/file.js b/test/cases/resolving/browser-field/node_modules/ignoring-module/file.js new file mode 100644 index 000000000..3d566b490 --- /dev/null +++ b/test/cases/resolving/browser-field/node_modules/ignoring-module/file.js @@ -0,0 +1 @@ +throw new Error("Fail"); \ No newline at end of file diff --git a/test/cases/resolving/browser-field/node_modules/ignoring-module/index.js b/test/cases/resolving/browser-field/node_modules/ignoring-module/index.js new file mode 100644 index 000000000..c1dc1b466 --- /dev/null +++ b/test/cases/resolving/browser-field/node_modules/ignoring-module/index.js @@ -0,0 +1,2 @@ +exports.module = require("wrong-module"); +exports.file = require("./file"); \ No newline at end of file diff --git a/test/cases/resolving/browser-field/node_modules/ignoring-module/package.json b/test/cases/resolving/browser-field/node_modules/ignoring-module/package.json new file mode 100644 index 000000000..8d49b9a68 --- /dev/null +++ b/test/cases/resolving/browser-field/node_modules/ignoring-module/package.json @@ -0,0 +1,6 @@ +{ + "browser": { + "wrong-module": false, + "./file.js": false + } +} \ No newline at end of file