2013-01-31 01:49:25 +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-01-12 03:31:43 +08:00
|
|
|
"use strict";
|
2013-01-31 01:49:25 +08:00
|
|
|
|
2017-01-12 03:31:43 +08:00
|
|
|
const ContextElementDependency = require("./ContextElementDependency");
|
2018-07-30 23:08:51 +08:00
|
|
|
const RequireContextDependency = require("./RequireContextDependency");
|
2013-01-31 01:49:25 +08:00
|
|
|
|
2017-01-12 03:31:43 +08:00
|
|
|
const RequireContextDependencyParserPlugin = require("./RequireContextDependencyParserPlugin");
|
2013-01-31 01:49:25 +08:00
|
|
|
|
2017-01-12 03:31:43 +08:00
|
|
|
class RequireContextPlugin {
|
2017-06-02 19:41:25 +08:00
|
|
|
constructor(modulesDirectories, extensions, mainFiles) {
|
2018-05-29 20:50:40 +08:00
|
|
|
if (!Array.isArray(modulesDirectories)) {
|
2017-01-12 03:31:43 +08:00
|
|
|
throw new Error("modulesDirectories must be an array");
|
2018-05-29 20:50:40 +08:00
|
|
|
}
|
|
|
|
if (!Array.isArray(extensions)) {
|
2017-01-12 03:31:43 +08:00
|
|
|
throw new Error("extensions must be an array");
|
2018-05-29 20:50:40 +08:00
|
|
|
}
|
2017-01-12 03:31:43 +08:00
|
|
|
this.modulesDirectories = modulesDirectories;
|
|
|
|
this.extensions = extensions;
|
2017-06-02 19:41:25 +08:00
|
|
|
this.mainFiles = mainFiles;
|
2017-01-12 03:31:43 +08:00
|
|
|
}
|
2013-01-31 01:49:25 +08:00
|
|
|
|
2017-01-12 03:31:43 +08:00
|
|
|
apply(compiler) {
|
2018-02-25 09:00:20 +08:00
|
|
|
compiler.hooks.compilation.tap(
|
|
|
|
"RequireContextPlugin",
|
|
|
|
(compilation, { contextModuleFactory, normalModuleFactory }) => {
|
|
|
|
compilation.dependencyFactories.set(
|
|
|
|
RequireContextDependency,
|
|
|
|
contextModuleFactory
|
|
|
|
);
|
|
|
|
compilation.dependencyTemplates.set(
|
|
|
|
RequireContextDependency,
|
|
|
|
new RequireContextDependency.Template()
|
|
|
|
);
|
2016-09-14 18:04:42 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
compilation.dependencyFactories.set(
|
|
|
|
ContextElementDependency,
|
|
|
|
normalModuleFactory
|
|
|
|
);
|
2016-09-14 18:04:42 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
const handler = (parser, parserOptions) => {
|
|
|
|
if (
|
2018-08-21 08:26:50 +08:00
|
|
|
parserOptions.requireContext !== undefined &&
|
2018-02-25 09:00:20 +08:00
|
|
|
!parserOptions.requireContext
|
|
|
|
)
|
|
|
|
return;
|
2016-09-14 18:04:42 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
new RequireContextDependencyParserPlugin().apply(parser);
|
|
|
|
};
|
2017-12-14 17:22:27 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
normalModuleFactory.hooks.parser
|
|
|
|
.for("javascript/auto")
|
|
|
|
.tap("RequireContextPlugin", handler);
|
|
|
|
normalModuleFactory.hooks.parser
|
|
|
|
.for("javascript/dynamic")
|
|
|
|
.tap("RequireContextPlugin", handler);
|
2013-02-15 21:16:18 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
contextModuleFactory.hooks.alternatives.tap(
|
|
|
|
"RequireContextPlugin",
|
|
|
|
items => {
|
|
|
|
if (items.length === 0) return items;
|
2020-01-18 04:19:37 +08:00
|
|
|
// TODO use .flat() when min node.js version >= 12
|
|
|
|
return [].concat(
|
|
|
|
...items.map(obj => {
|
|
|
|
const { request, context } = obj;
|
2018-02-25 09:00:20 +08:00
|
|
|
return this.extensions
|
2020-01-18 04:19:37 +08:00
|
|
|
.filter(ext => request.endsWith(ext))
|
|
|
|
.map(ext => ({
|
|
|
|
context,
|
|
|
|
request: request.slice(0, -ext.length)
|
|
|
|
}))
|
2018-02-25 09:00:20 +08:00
|
|
|
.concat(obj);
|
|
|
|
})
|
2020-01-18 04:19:37 +08:00
|
|
|
);
|
2018-02-25 09:00:20 +08:00
|
|
|
}
|
|
|
|
);
|
2013-02-15 21:16:18 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
contextModuleFactory.hooks.alternatives.tap(
|
|
|
|
"RequireContextPlugin",
|
|
|
|
items => {
|
|
|
|
if (items.length === 0) return items;
|
2020-01-18 04:19:37 +08:00
|
|
|
const result = [];
|
|
|
|
for (const obj of items) {
|
|
|
|
const { request, context } = obj;
|
|
|
|
for (const mainFile of this.mainFiles) {
|
|
|
|
if (request.endsWith(`/${mainFile}`)) {
|
|
|
|
result.push({
|
|
|
|
context,
|
|
|
|
request: request.slice(0, -mainFile.length)
|
|
|
|
});
|
|
|
|
result.push({
|
|
|
|
context,
|
|
|
|
request: request.slice(0, -mainFile.length - 1)
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
result.push(obj);
|
|
|
|
}
|
|
|
|
return result;
|
2018-02-25 09:00:20 +08:00
|
|
|
}
|
|
|
|
);
|
2017-06-02 19:41:25 +08:00
|
|
|
|
2018-02-25 09:00:20 +08:00
|
|
|
contextModuleFactory.hooks.alternatives.tap(
|
|
|
|
"RequireContextPlugin",
|
|
|
|
items => {
|
|
|
|
if (items.length === 0) return items;
|
|
|
|
return items.map(obj => {
|
2020-01-18 04:19:37 +08:00
|
|
|
for (const dir of this.modulesDirectories) {
|
|
|
|
if (obj.request.startsWith(`./${dir}/`)) {
|
2018-02-25 09:00:20 +08:00
|
|
|
obj.request = obj.request.slice(dir.length + 3);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return obj;
|
|
|
|
});
|
2013-06-15 23:31:56 +08:00
|
|
|
}
|
2018-02-25 09:00:20 +08:00
|
|
|
);
|
|
|
|
}
|
|
|
|
);
|
2017-01-12 03:31:43 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
module.exports = RequireContextPlugin;
|