Upgrade tapable in ModuleFactories

This commit is contained in:
Tobias Koppers 2017-11-28 09:54:24 +01:00
parent 3f453a4f3c
commit a27ef326d5
5 changed files with 73 additions and 21 deletions

View File

@ -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);

View File

@ -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];

View File

@ -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);
}

View File

@ -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) {

View File

@ -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;
}