mirror of https://github.com/webpack/webpack.git
Upgrade tapable in ModuleFactories
This commit is contained in:
parent
3f453a4f3c
commit
a27ef326d5
|
@ -7,7 +7,9 @@
|
|||
const asyncLib = require("async");
|
||||
const path = require("path");
|
||||
|
||||
const Tapable = require("tapable-old");
|
||||
const Tapable = require("tapable").Tapable;
|
||||
const AsyncSeriesWaterfallHook = require("tapable").AsyncSeriesWaterfallHook;
|
||||
const SyncWaterfallHook = require("tapable").SyncWaterfallHook;
|
||||
const ContextModule = require("./ContextModule");
|
||||
const ContextElementDependency = require("./dependencies/ContextElementDependency");
|
||||
|
||||
|
@ -16,6 +18,21 @@ const EMPTY_RESOLVE_OPTIONS = {};
|
|||
module.exports = class ContextModuleFactory extends Tapable {
|
||||
constructor(resolverFactory) {
|
||||
super();
|
||||
this.hooks = {
|
||||
beforeResolve: new AsyncSeriesWaterfallHook(["data"]),
|
||||
afterResolve: new AsyncSeriesWaterfallHook(["data"]),
|
||||
contextModuleFiles: new SyncWaterfallHook(["files"]),
|
||||
alternatives: new AsyncSeriesWaterfallHook(["modules"])
|
||||
};
|
||||
this._pluginCompat.tap("ContextModuleFactory", options => {
|
||||
switch(options.name) {
|
||||
case "before-resolve":
|
||||
case "after-resolve":
|
||||
case "alternatives":
|
||||
options.async = true;
|
||||
break;
|
||||
}
|
||||
});
|
||||
this.resolverFactory = resolverFactory;
|
||||
}
|
||||
|
||||
|
@ -24,7 +41,7 @@ module.exports = class ContextModuleFactory extends Tapable {
|
|||
const dependencies = data.dependencies;
|
||||
const resolveOptions = data.resolveOptions;
|
||||
const dependency = dependencies[0];
|
||||
this.applyPluginsAsyncWaterfall("before-resolve", Object.assign({
|
||||
this.hooks.beforeResolve.callAsync(Object.assign({
|
||||
context: context,
|
||||
dependencies: dependencies,
|
||||
resolveOptions
|
||||
|
@ -76,7 +93,7 @@ module.exports = class ContextModuleFactory extends Tapable {
|
|||
], (err, result) => {
|
||||
if(err) return callback(err);
|
||||
|
||||
this.applyPluginsAsyncWaterfall("after-resolve", Object.assign({
|
||||
this.hooks.afterResolve.callAsync(Object.assign({
|
||||
addon: loadersPrefix + result[1].join("!") + (result[1].length > 0 ? "!" : ""),
|
||||
resource: result[0],
|
||||
resolveDependencies: this.resolveDependencies.bind(this)
|
||||
|
@ -106,7 +123,7 @@ module.exports = class ContextModuleFactory extends Tapable {
|
|||
const addDirectory = (directory, callback) => {
|
||||
fs.readdir(directory, (err, files) => {
|
||||
if(err) return callback(err);
|
||||
files = cmf.applyPluginsWaterfall("context-module-files", files);
|
||||
files = cmf.hooks.contextModuleFiles.call(files);
|
||||
if(!files || files.length === 0) return callback(null, []);
|
||||
asyncLib.map(files.filter(p => p.indexOf(".") !== 0), (seqment, callback) => {
|
||||
|
||||
|
@ -136,7 +153,7 @@ module.exports = class ContextModuleFactory extends Tapable {
|
|||
request: "." + subResource.substr(resource.length).replace(/\\/g, "/")
|
||||
};
|
||||
|
||||
this.applyPluginsAsyncWaterfall("alternatives", [obj], (err, alternatives) => {
|
||||
this.hooks.alternatives.callAsync([obj], (err, alternatives) => {
|
||||
if(err) return callback(err);
|
||||
alternatives = alternatives.filter(obj => regExp.test(obj.request)).map(obj => {
|
||||
const dep = new ContextElementDependency(obj.request + resourceQuery, obj.request);
|
||||
|
|
|
@ -4,12 +4,13 @@
|
|||
*/
|
||||
"use strict";
|
||||
|
||||
const Tapable = require("tapable-old");
|
||||
const Tapable = require("tapable").Tapable;
|
||||
const DllModule = require("./DllModule");
|
||||
|
||||
class DllModuleFactory extends Tapable {
|
||||
constructor() {
|
||||
super();
|
||||
this.hooks = {};
|
||||
}
|
||||
create(data, callback) {
|
||||
const dependency = data.dependencies[0];
|
||||
|
|
|
@ -51,7 +51,7 @@ class IgnorePlugin {
|
|||
checkIgnore(result, callback) {
|
||||
// check if result is ignored
|
||||
if(this.checkResult(result)) {
|
||||
return callback();
|
||||
return callback(null, null);
|
||||
}
|
||||
return callback(null, result);
|
||||
}
|
||||
|
|
|
@ -4,12 +4,13 @@
|
|||
*/
|
||||
"use strict";
|
||||
|
||||
const Tapable = require("tapable-old");
|
||||
const Tapable = require("tapable").Tapable;
|
||||
const MultiModule = require("./MultiModule");
|
||||
|
||||
module.exports = class MultiModuleFactory extends Tapable {
|
||||
constructor() {
|
||||
super();
|
||||
this.hooks = {};
|
||||
}
|
||||
|
||||
create(data, callback) {
|
||||
|
|
|
@ -5,7 +5,12 @@
|
|||
"use strict";
|
||||
|
||||
const asyncLib = require("async");
|
||||
const Tapable = require("tapable-old");
|
||||
const Tapable = require("tapable").Tapable;
|
||||
const AsyncSeriesWaterfallHook = require("tapable").AsyncSeriesWaterfallHook;
|
||||
const SyncWaterfallHook = require("tapable").SyncWaterfallHook;
|
||||
const SyncBailHook = require("tapable").SyncBailHook;
|
||||
const SyncHook = require("tapable").SyncHook;
|
||||
const HookMap = require("tapable").HookMap;
|
||||
const NormalModule = require("./NormalModule");
|
||||
const RawModule = require("./RawModule");
|
||||
const RuleSet = require("./RuleSet");
|
||||
|
@ -47,13 +52,45 @@ const identToLoaderRequest = resultString => {
|
|||
class NormalModuleFactory extends Tapable {
|
||||
constructor(context, resolverFactory, options) {
|
||||
super();
|
||||
this.hooks = {
|
||||
resolver: new SyncWaterfallHook(["resolver"]),
|
||||
factory: new SyncWaterfallHook(["factory"]),
|
||||
beforeResolve: new AsyncSeriesWaterfallHook(["data"]),
|
||||
afterResolve: new AsyncSeriesWaterfallHook(["data"]),
|
||||
createModule: new SyncBailHook(["data"]),
|
||||
module: new SyncWaterfallHook(["module", "data"]),
|
||||
createParser: new HookMap(() => new SyncBailHook(["parserOptions"])),
|
||||
parser: new HookMap(() => new SyncHook(["parser", "parserOptions"])),
|
||||
};
|
||||
this._pluginCompat.tap("NormalModuleFactory", options => {
|
||||
switch(options.name) {
|
||||
case "before-resolve":
|
||||
case "after-resolve":
|
||||
options.async = true;
|
||||
break;
|
||||
case "parser":
|
||||
this.hooks.parser.for("javascript/auto").tap(options.fn.name || "unnamed compat plugin", options.fn);
|
||||
return true;
|
||||
}
|
||||
let match;
|
||||
match = /^parser (.+)$/.exec(options.name);
|
||||
if(match) {
|
||||
this.hooks.parser.for(match[1]).tap(options.fn.name || "unnamed compat plugin", options.fn.bind(this));
|
||||
return true;
|
||||
}
|
||||
match = /^create-parser (.+)$/.exec(options.name);
|
||||
if(match) {
|
||||
this.hooks.createParser.for(match[1]).tap(options.fn.name || "unnamed compat plugin", options.fn.bind(this));
|
||||
return true;
|
||||
}
|
||||
});
|
||||
this.resolverFactory = resolverFactory;
|
||||
this.ruleSet = new RuleSet(options.defaultRules.concat(options.rules));
|
||||
this.cachePredicate = typeof options.unsafeCache === "function" ? options.unsafeCache : Boolean.bind(null, options.unsafeCache);
|
||||
this.context = context || "";
|
||||
this.parserCache = {};
|
||||
this.plugin("factory", () => (result, callback) => {
|
||||
let resolver = this.applyPluginsWaterfall0("resolver", null);
|
||||
let resolver = this.hooks.resolver.call(null);
|
||||
|
||||
// Ignored
|
||||
if(!resolver) return callback();
|
||||
|
@ -68,13 +105,13 @@ class NormalModuleFactory extends Tapable {
|
|||
if(typeof data.source === "function")
|
||||
return callback(null, data);
|
||||
|
||||
this.applyPluginsAsyncWaterfall("after-resolve", data, (err, result) => {
|
||||
this.hooks.afterResolve.callAsync(data, (err, result) => {
|
||||
if(err) return callback(err);
|
||||
|
||||
// Ignored
|
||||
if(!result) return callback();
|
||||
|
||||
let createdModule = this.applyPluginsBailResult1("create-module", result);
|
||||
let createdModule = this.hooks.createModule.call(result);
|
||||
if(!createdModule) {
|
||||
|
||||
if(!result.request) {
|
||||
|
@ -93,7 +130,7 @@ class NormalModuleFactory extends Tapable {
|
|||
);
|
||||
}
|
||||
|
||||
createdModule = this.applyPluginsWaterfall1("module", createdModule, result);
|
||||
createdModule = this.hooks.module.call(createdModule, result);
|
||||
|
||||
return callback(null, createdModule);
|
||||
});
|
||||
|
@ -230,7 +267,7 @@ class NormalModuleFactory extends Tapable {
|
|||
const resolveOptions = data.resolveOptions || EMPTY_RESOLVE_OPTIONS;
|
||||
const request = dependencies[0].request;
|
||||
const contextInfo = data.contextInfo || {};
|
||||
this.applyPluginsAsyncWaterfall("before-resolve", {
|
||||
this.hooks.beforeResolve.callAsync({
|
||||
contextInfo,
|
||||
resolveOptions,
|
||||
context,
|
||||
|
@ -242,7 +279,7 @@ class NormalModuleFactory extends Tapable {
|
|||
// Ignored
|
||||
if(!result) return callback();
|
||||
|
||||
const factory = this.applyPluginsWaterfall0("factory", null);
|
||||
const factory = this.hooks.factory.call(null);
|
||||
|
||||
// Ignored
|
||||
if(!factory) return callback();
|
||||
|
@ -300,15 +337,11 @@ class NormalModuleFactory extends Tapable {
|
|||
|
||||
createParser(type, parserOptions) {
|
||||
parserOptions = parserOptions || {};
|
||||
const parser = this.applyPluginsBailResult1(`create-parser ${type}`, parserOptions);
|
||||
const parser = this.hooks.createParser.for(type).call(parserOptions);
|
||||
if(!parser) {
|
||||
throw new Error(`No parser registered for ${type}`);
|
||||
}
|
||||
if(type === "javascript/auto") {
|
||||
// TODO: remove backward compat in webpack 5
|
||||
this.applyPlugins2("parser", parser, parserOptions);
|
||||
}
|
||||
this.applyPlugins2(`parser ${type}`, parser, parserOptions);
|
||||
this.hooks.parser.for(type).call(parser, parserOptions);
|
||||
return parser;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue