UNPKG

webpack

Version:

Packs CommonJs/AMD 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.

128 lines (114 loc) 4.37 kB
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ 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) { Tapable.call(this); this.resolvers = resolvers; this.parser = parser; this.loaders = new LoadersList(options.loaders); this.preLoaders = new LoadersList(options.preLoaders); this.postLoaders = new LoadersList(options.postLoaders); this.context = context || ""; } module.exports = NormalModuleFactory; NormalModuleFactory.prototype = Object.create(Tapable.prototype); NormalModuleFactory.prototype.create = function(context, dependency, callback) { context = context || this.context; var request = dependency.request; this.applyPluginsAsyncWaterfall("before-resolve", { context: context, request: request }, function(err, result) { if(err) return callback(err); // Ignored if(!result) return callback(); context = result.context; request = result.request; var noAutoLoaders = /^-?!/.test(request); var noPrePostAutoLoaders = /^!!/.test(request); var noPostAutoLoaders = /^-!/.test(request); var elements = request.replace(/^-?!+/, "").replace(/!!+/g, "!").split("!"); var resource = elements.pop(); async.parallel([ function(callback) { this.resolveRequestArray(context, elements, this.resolvers.loader, callback); }.bind(this), function(callback) { if(resource === "" || resource[0] === "?") return callback(null, resource); this.resolvers.normal.resolve(context, resource, callback); }.bind(this) ], function(err, results) { if(err) return callback(err); var loaders = results[0]; resource = results[1]; if(resource === false) return callback(null, new RawModule("/* (ignored) */", "ignored " + context + " " + request, request + " (ignored)")); // ignored var userRequest = loaders.concat([resource]).join("!"); if(noPrePostAutoLoaders) return onDoneResolving.call(this); if(noAutoLoaders) { async.parallel([ this.resolveRequestArray.bind(this, context, noPostAutoLoaders ? [] : this.postLoaders.match(resource), this.resolvers.loader), this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader) ], function(err, results) { if(err) return callback(err); loaders = results[0].concat(loaders).concat(results[1]); onDoneResolving.call(this); }.bind(this)); } else { async.parallel([ this.resolveRequestArray.bind(this, context, noPostAutoLoaders ? [] : this.postLoaders.match(resource), this.resolvers.loader), this.resolveRequestArray.bind(this, context, this.loaders.match(resource), this.resolvers.loader), this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader) ], function(err, results) { if(err) return callback(err); loaders = results[0].concat(loaders).concat(results[1]).concat(results[2]); onDoneResolving.call(this); }.bind(this)); } function onDoneResolving() { this.applyPluginsAsyncWaterfall("after-resolve", { context: context, request: loaders.concat([resource]).join("!"), userRequest: userRequest, rawRequest: request, loaders: loaders, resource: resource, parser: this.parser }, function(err, result) { if(err) return callback(err); // Ignored if(!result) return callback(); return callback(null, new NormalModule( result.request, result.userRequest, result.rawRequest, result.loaders, result.resource, result.parser ) ); }); } }.bind(this)); }.bind(this)); }; NormalModuleFactory.prototype.resolveRequestArray = function resolveRequestArray(context, array, resolver, callback) { if(array.length === 0) return callback(null, []); async.map(array, function(item, callback) { if(item === "" || item[0] === "?") return callback(null, item); resolver.resolve(context, item, callback); }, callback); };