webpack/lib/ContextReplacementPlugin.js

157 lines
4.6 KiB
JavaScript
Raw Normal View History

2013-01-31 09:33:11 +08:00
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
2018-07-30 23:08:51 +08:00
2017-03-11 01:27:53 +08:00
"use strict";
2017-03-11 01:27:53 +08:00
const ContextElementDependency = require("./dependencies/ContextElementDependency");
const { join } = require("./util/fs");
2017-03-11 01:27:53 +08:00
class ContextReplacementPlugin {
2018-02-25 09:00:20 +08:00
constructor(
resourceRegExp,
newContentResource,
newContentRecursive,
newContentRegExp
) {
2017-03-11 01:27:53 +08:00
this.resourceRegExp = resourceRegExp;
2018-02-25 09:00:20 +08:00
if (typeof newContentResource === "function") {
2017-03-11 01:27:53 +08:00
this.newContentCallback = newContentResource;
2018-02-25 09:00:20 +08:00
} else if (
typeof newContentResource === "string" &&
typeof newContentRecursive === "object"
) {
2017-03-11 01:27:53 +08:00
this.newContentResource = newContentResource;
this.newContentCreateContextMap = (fs, callback) => {
callback(null, newContentRecursive);
};
2018-02-25 09:00:20 +08:00
} else if (
typeof newContentResource === "string" &&
typeof newContentRecursive === "function"
) {
2017-03-11 01:27:53 +08:00
this.newContentResource = newContentResource;
this.newContentCreateContextMap = newContentRecursive;
} else {
2018-02-25 09:00:20 +08:00
if (typeof newContentResource !== "string") {
2017-03-11 01:27:53 +08:00
newContentRegExp = newContentRecursive;
newContentRecursive = newContentResource;
newContentResource = undefined;
}
2018-02-25 09:00:20 +08:00
if (typeof newContentRecursive !== "boolean") {
2017-03-11 01:27:53 +08:00
newContentRegExp = newContentRecursive;
newContentRecursive = undefined;
}
this.newContentResource = newContentResource;
this.newContentRecursive = newContentRecursive;
this.newContentRegExp = newContentRegExp;
2014-10-23 16:58:26 +08:00
}
}
2017-03-11 01:27:53 +08:00
apply(compiler) {
const resourceRegExp = this.resourceRegExp;
const newContentCallback = this.newContentCallback;
const newContentResource = this.newContentResource;
const newContentRecursive = this.newContentRecursive;
const newContentRegExp = this.newContentRegExp;
const newContentCreateContextMap = this.newContentCreateContextMap;
2018-02-25 09:00:20 +08:00
compiler.hooks.contextModuleFactory.tap("ContextReplacementPlugin", cmf => {
cmf.hooks.beforeResolve.tap("ContextReplacementPlugin", result => {
if (!result) return;
if (resourceRegExp.test(result.request)) {
if (newContentResource !== undefined) {
2017-03-11 01:27:53 +08:00
result.request = newContentResource;
}
if (newContentRecursive !== undefined) {
2017-03-11 01:27:53 +08:00
result.recursive = newContentRecursive;
}
if (newContentRegExp !== undefined) {
2017-03-11 01:27:53 +08:00
result.regExp = newContentRegExp;
}
2018-02-25 09:00:20 +08:00
if (typeof newContentCallback === "function") {
2017-03-11 01:27:53 +08:00
newContentCallback(result);
} else {
2018-02-25 09:00:20 +08:00
for (const d of result.dependencies) {
if (d.critical) d.critical = false;
2018-01-22 20:52:43 +08:00
}
2017-03-11 01:27:53 +08:00
}
2014-10-23 16:58:26 +08:00
}
return result;
2017-03-11 01:27:53 +08:00
});
2018-02-25 09:00:20 +08:00
cmf.hooks.afterResolve.tap("ContextReplacementPlugin", result => {
if (!result) return;
if (resourceRegExp.test(result.resource)) {
if (newContentResource !== undefined) {
if (
newContentResource.startsWith("/") ||
(newContentResource.length > 1 && newContentResource[1] === ":")
) {
result.resource = newContentResource;
} else {
result.resource = join(
compiler.inputFileSystem,
result.resource,
newContentResource
);
}
}
if (newContentRecursive !== undefined) {
2017-03-11 01:27:53 +08:00
result.recursive = newContentRecursive;
}
if (newContentRegExp !== undefined) {
2017-03-11 01:27:53 +08:00
result.regExp = newContentRegExp;
}
if (typeof newContentCreateContextMap === "function") {
2018-02-25 09:00:20 +08:00
result.resolveDependencies = createResolveDependenciesFromContextMap(
newContentCreateContextMap
);
}
2018-02-25 09:00:20 +08:00
if (typeof newContentCallback === "function") {
2017-03-11 01:27:53 +08:00
const origResource = result.resource;
newContentCallback(result);
if (
result.resource !== origResource &&
!result.resource.startsWith("/") &&
(result.resource.length <= 1 || result.resource[1] !== ":")
) {
// When the function changed it to an relative path
result.resource = join(
compiler.inputFileSystem,
origResource,
result.resource
);
2017-03-11 01:27:53 +08:00
}
} else {
2018-02-25 09:00:20 +08:00
for (const d of result.dependencies) {
if (d.critical) d.critical = false;
2018-01-22 20:52:43 +08:00
}
2014-10-23 16:58:26 +08:00
}
}
return result;
2017-03-11 01:27:53 +08:00
});
2013-01-31 09:33:11 +08:00
});
2017-03-11 01:27:53 +08:00
}
}
2018-02-25 09:00:20 +08:00
const createResolveDependenciesFromContextMap = createContextMap => {
const resolveDependenciesFromContextMap = (fs, options, callback) => {
2017-03-11 01:27:53 +08:00
createContextMap(fs, (err, map) => {
2018-02-25 09:00:20 +08:00
if (err) return callback(err);
const dependencies = Object.keys(map).map(key => {
return new ContextElementDependency(
2020-07-03 23:03:15 +08:00
map[key] + options.resourceQuery + options.resourceFragment,
key,
options.category,
options.referencedExports
2018-02-25 09:00:20 +08:00
);
});
callback(null, dependencies);
});
2017-01-11 17:51:58 +08:00
};
return resolveDependenciesFromContextMap;
2017-03-11 01:27:53 +08:00
};
module.exports = ContextReplacementPlugin;