aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack/lib/ContextModuleFactory.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
committerFlorian Dold <florian.dold@gmail.com>2017-05-03 15:35:00 +0200
commitde98e0b232509d5f40c135d540a70e415272ff85 (patch)
treea79222a5b58484ab3b80d18efcaaa7ccc4769b33 /node_modules/webpack/lib/ContextModuleFactory.js
parente0c9d480a73fa629c1e4a47d3e721f1d2d345406 (diff)
node_modules
Diffstat (limited to 'node_modules/webpack/lib/ContextModuleFactory.js')
-rw-r--r--node_modules/webpack/lib/ContextModuleFactory.js159
1 files changed, 159 insertions, 0 deletions
diff --git a/node_modules/webpack/lib/ContextModuleFactory.js b/node_modules/webpack/lib/ContextModuleFactory.js
new file mode 100644
index 000000000..a2b666fad
--- /dev/null
+++ b/node_modules/webpack/lib/ContextModuleFactory.js
@@ -0,0 +1,159 @@
+/*
+ MIT License http://www.opensource.org/licenses/mit-license.php
+ Author Tobias Koppers @sokra
+*/
+var asyncLib = require("async");
+var path = require("path");
+
+var Tapable = require("tapable");
+var ContextModule = require("./ContextModule");
+var ContextElementDependency = require("./dependencies/ContextElementDependency");
+
+function ContextModuleFactory(resolvers) {
+ Tapable.call(this);
+ this.resolvers = resolvers;
+}
+module.exports = ContextModuleFactory;
+
+ContextModuleFactory.prototype = Object.create(Tapable.prototype);
+ContextModuleFactory.prototype.constructor = ContextModuleFactory;
+
+ContextModuleFactory.prototype.create = function(data, callback) {
+ var module = this;
+ var context = data.context;
+ var dependencies = data.dependencies;
+ var dependency = dependencies[0];
+ this.applyPluginsAsyncWaterfall("before-resolve", {
+ context: context,
+ request: dependency.request,
+ recursive: dependency.recursive,
+ regExp: dependency.regExp,
+ async: dependency.async,
+ dependencies: dependencies
+ }, function(err, result) {
+ if(err) return callback(err);
+
+ // Ignored
+ if(!result) return callback();
+
+ var context = result.context;
+ var request = result.request;
+ var recursive = result.recursive;
+ var regExp = result.regExp;
+ var asyncContext = result.async;
+ var dependencies = result.dependencies;
+
+ var loaders, resource, loadersPrefix = "";
+ var idx = request.lastIndexOf("!");
+ if(idx >= 0) {
+ loaders = request.substr(0, idx + 1);
+ for(var i = 0; i < loaders.length && loaders[i] === "!"; i++) {
+ loadersPrefix += "!";
+ }
+ loaders = loaders.substr(i).replace(/!+$/, "").replace(/!!+/g, "!");
+ if(loaders === "") loaders = [];
+ else loaders = loaders.split("!");
+ resource = request.substr(idx + 1);
+ } else {
+ loaders = [];
+ resource = request;
+ }
+
+ var resolvers = module.resolvers;
+
+ asyncLib.parallel([
+ function(callback) {
+ resolvers.context.resolve({}, context, resource, function(err, result) {
+ if(err) return callback(err);
+ callback(null, result);
+ });
+ },
+ function(callback) {
+ asyncLib.map(loaders, function(loader, callback) {
+ resolvers.loader.resolve({}, context, loader, function(err, result) {
+ if(err) return callback(err);
+ callback(null, result);
+ });
+ }, callback);
+ }
+ ], function(err, result) {
+ if(err) return callback(err);
+
+ module.applyPluginsAsyncWaterfall("after-resolve", {
+ loaders: loadersPrefix + result[1].join("!") + (result[1].length > 0 ? "!" : ""),
+ resource: result[0],
+ recursive: recursive,
+ regExp: regExp,
+ async: asyncContext,
+ dependencies: dependencies,
+ resolveDependencies: module.resolveDependencies.bind(module)
+ }, function(err, result) {
+ if(err) return callback(err);
+
+ // Ignored
+ if(!result) return callback();
+
+ return callback(null, new ContextModule(result.resolveDependencies, result.resource, result.recursive, result.regExp, result.loaders, result.async, dependency.chunkName));
+ });
+ });
+ });
+};
+
+ContextModuleFactory.prototype.resolveDependencies = function resolveDependencies(fs, resource, recursive, regExp, callback) {
+ if(!regExp || !resource)
+ return callback(null, []);
+ (function addDirectory(directory, callback) {
+ fs.readdir(directory, function(err, files) {
+ if(err) return callback(err);
+ if(!files || files.length === 0) return callback(null, []);
+ asyncLib.map(files.filter(function(p) {
+ return p.indexOf(".") !== 0;
+ }), function(seqment, callback) {
+
+ var subResource = path.join(directory, seqment);
+
+ fs.stat(subResource, function(err, stat) {
+ if(err) return callback(err);
+
+ if(stat.isDirectory()) {
+
+ if(!recursive) return callback();
+ addDirectory.call(this, subResource, callback);
+
+ } else if(stat.isFile()) {
+
+ var obj = {
+ context: resource,
+ request: "." + subResource.substr(resource.length).replace(/\\/g, "/")
+ };
+
+ this.applyPluginsAsyncWaterfall("alternatives", [obj], function(err, alternatives) {
+ if(err) return callback(err);
+ alternatives = alternatives.filter(function(obj) {
+ return regExp.test(obj.request);
+ }).map(function(obj) {
+ var dep = new ContextElementDependency(obj.request);
+ dep.optional = true;
+ return dep;
+ });
+ callback(null, alternatives);
+ });
+
+ } else callback();
+
+ }.bind(this));
+
+ }.bind(this), function(err, result) {
+ if(err) return callback(err);
+
+ if(!result) return callback(null, []);
+
+ callback(null, result.filter(function(i) {
+ return !!i;
+ }).reduce(function(a, i) {
+ return a.concat(i);
+ }, []));
+ });
+ }.bind(this));
+ }.call(this, resource, callback));
+};