2020-02-20 17:52:47 +08:00
|
|
|
/*
|
|
|
|
MIT License http://www.opensource.org/licenses/mit-license.php
|
|
|
|
Author Tobias Koppers @sokra
|
|
|
|
*/
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
|
|
|
const ModuleNotFoundError = require("../ModuleNotFoundError");
|
|
|
|
const RuntimeGlobals = require("../RuntimeGlobals");
|
|
|
|
const OverridableModule = require("./OverridableModule");
|
|
|
|
const OverridableOriginalDependency = require("./OverridableOriginalDependency");
|
|
|
|
const OverridableOriginalModuleFactory = require("./OverridableOriginalModuleFactory");
|
|
|
|
const OverridablesRuntimeModule = require("./OverridablesRuntimeModule");
|
2020-02-25 04:12:45 +08:00
|
|
|
const parseOptions = require("./parseOptions");
|
2020-02-20 17:52:47 +08:00
|
|
|
|
|
|
|
/** @typedef {import("../Compiler")} Compiler */
|
|
|
|
|
|
|
|
class OverridablesPlugin {
|
|
|
|
constructor(options) {
|
2020-02-25 04:12:45 +08:00
|
|
|
this.overridables = parseOptions(options);
|
2020-02-20 17:52:47 +08:00
|
|
|
}
|
|
|
|
/**
|
|
|
|
* @param {Compiler} compiler webpack compiler
|
|
|
|
* @returns {void}
|
|
|
|
*/
|
|
|
|
apply(compiler) {
|
|
|
|
compiler.hooks.thisCompilation.tap(
|
|
|
|
"OverridablesPlugin",
|
|
|
|
(compilation, { normalModuleFactory }) => {
|
|
|
|
compilation.dependencyFactories.set(
|
|
|
|
OverridableOriginalDependency,
|
|
|
|
new OverridableOriginalModuleFactory()
|
|
|
|
);
|
|
|
|
|
|
|
|
const resolvedOverridables = new Map();
|
|
|
|
const promise = Promise.all(
|
|
|
|
this.overridables.map(([key, request]) => {
|
|
|
|
const resolver = compilation.resolverFactory.get("normal");
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
resolver.resolve(
|
|
|
|
{},
|
|
|
|
compiler.context,
|
|
|
|
request,
|
|
|
|
{},
|
|
|
|
(err, result) => {
|
|
|
|
if (err) {
|
|
|
|
compilation.errors.push(
|
|
|
|
new ModuleNotFoundError(null, err, {
|
|
|
|
name: `overridable ${key}`
|
|
|
|
})
|
|
|
|
);
|
|
|
|
return resolve();
|
|
|
|
}
|
|
|
|
resolvedOverridables.set(result, key);
|
|
|
|
resolve();
|
|
|
|
}
|
|
|
|
);
|
|
|
|
});
|
|
|
|
})
|
|
|
|
);
|
|
|
|
normalModuleFactory.hooks.afterResolve.tapAsync(
|
|
|
|
"OverridablesPlugin",
|
|
|
|
(resolveData, callback) => {
|
|
|
|
// wait for resolving to be complete
|
|
|
|
promise.then(() => callback());
|
|
|
|
}
|
|
|
|
);
|
|
|
|
normalModuleFactory.hooks.module.tap(
|
|
|
|
"OverridablesPlugin",
|
|
|
|
(module, createData) => {
|
|
|
|
const key = resolvedOverridables.get(createData.resource);
|
|
|
|
if (key !== undefined) return new OverridableModule(module, key);
|
|
|
|
}
|
|
|
|
);
|
2020-02-27 05:32:48 +08:00
|
|
|
compilation.hooks.runtimeRequirementInTree
|
|
|
|
.for(RuntimeGlobals.ensureChunkHandlers)
|
|
|
|
.tap("OverridablesPlugin", (chunk, set) => {
|
2020-02-20 17:52:47 +08:00
|
|
|
set.add(RuntimeGlobals.module);
|
2020-02-25 04:12:45 +08:00
|
|
|
set.add(RuntimeGlobals.moduleFactories);
|
2020-02-20 17:52:47 +08:00
|
|
|
set.add(RuntimeGlobals.hasOwnProperty);
|
|
|
|
compilation.addRuntimeModule(
|
|
|
|
chunk,
|
|
|
|
new OverridablesRuntimeModule()
|
|
|
|
);
|
2020-02-27 05:32:48 +08:00
|
|
|
});
|
2020-02-20 17:52:47 +08:00
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = OverridablesPlugin;
|