webpack/lib/dependencies/RequireContextPlugin.js

165 lines
4.6 KiB
JavaScript
Raw Normal View History

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
"use strict";
2013-01-31 01:49:25 +08:00
const {
JAVASCRIPT_MODULE_TYPE_AUTO,
JAVASCRIPT_MODULE_TYPE_DYNAMIC
} = require("../ModuleTypeConstants");
const { cachedSetProperty } = require("../util/cleverMerge");
const ContextElementDependency = require("./ContextElementDependency");
2018-07-30 23:08:51 +08:00
const RequireContextDependency = require("./RequireContextDependency");
const RequireContextDependencyParserPlugin = require("./RequireContextDependencyParserPlugin");
2013-01-31 01:49:25 +08:00
2023-05-22 08:03:05 +08:00
/** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
/** @typedef {import("../../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
/** @typedef {import("../Compiler")} Compiler */
2023-05-22 08:03:05 +08:00
/** @typedef {import("../javascript/JavascriptParser")} Parser */
2013-01-31 01:49:25 +08:00
/** @type {ResolveOptions} */
const EMPTY_RESOLVE_OPTIONS = {};
const PLUGIN_NAME = "RequireContextPlugin";
class RequireContextPlugin {
/**
* Apply the plugin
* @param {Compiler} compiler the compiler instance
* @returns {void}
*/
apply(compiler) {
2018-02-25 09:00:20 +08:00
compiler.hooks.compilation.tap(
PLUGIN_NAME,
2018-02-25 09:00:20 +08:00
(compilation, { contextModuleFactory, normalModuleFactory }) => {
compilation.dependencyFactories.set(
RequireContextDependency,
contextModuleFactory
);
compilation.dependencyTemplates.set(
RequireContextDependency,
new RequireContextDependency.Template()
);
2018-02-25 09:00:20 +08:00
compilation.dependencyFactories.set(
ContextElementDependency,
normalModuleFactory
);
2023-05-22 08:03:05 +08:00
/**
* @param {Parser} parser parser parser
* @param {JavascriptParserOptions} parserOptions parserOptions
* @returns {void}
*/
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;
2018-02-25 09:00:20 +08:00
new RequireContextDependencyParserPlugin().apply(parser);
};
2018-02-25 09:00:20 +08:00
normalModuleFactory.hooks.parser
.for(JAVASCRIPT_MODULE_TYPE_AUTO)
.tap(PLUGIN_NAME, handler);
2018-02-25 09:00:20 +08:00
normalModuleFactory.hooks.parser
.for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
.tap(PLUGIN_NAME, handler);
2013-02-15 21:16:18 +08:00
contextModuleFactory.hooks.alternativeRequests.tap(
PLUGIN_NAME,
(items, options) => {
2018-02-25 09:00:20 +08:00
if (items.length === 0) return items;
const finalResolveOptions = compiler.resolverFactory.get(
"normal",
cachedSetProperty(
options.resolveOptions || EMPTY_RESOLVE_OPTIONS,
"dependencyType",
2025-04-26 01:43:01 +08:00
/** @type {string} */
(options.category)
)
).options;
let newItems;
if (!finalResolveOptions.fullySpecified) {
newItems = [];
for (const item of items) {
const { request, context } = item;
for (const ext of finalResolveOptions.extensions) {
if (request.endsWith(ext)) {
newItems.push({
context,
request: request.slice(0, -ext.length)
});
}
}
if (!finalResolveOptions.enforceExtension) {
newItems.push(item);
}
}
items = newItems;
2013-02-15 21:16:18 +08:00
newItems = [];
for (const obj of items) {
const { request, context } = obj;
for (const mainFile of finalResolveOptions.mainFiles) {
if (request.endsWith(`/${mainFile}`)) {
newItems.push({
context,
request: request.slice(0, -mainFile.length)
});
newItems.push({
context,
request: request.slice(0, -mainFile.length - 1)
});
}
}
newItems.push(obj);
}
items = newItems;
}
newItems = [];
for (const item of items) {
let hideOriginal = false;
for (const modulesItems of finalResolveOptions.modules) {
if (Array.isArray(modulesItems)) {
for (const dir of modulesItems) {
if (item.request.startsWith(`./${dir}/`)) {
newItems.push({
context: item.context,
request: item.request.slice(dir.length + 3)
});
hideOriginal = true;
}
}
} else {
const dir = modulesItems.replace(/\\/g, "/");
const fullPath =
item.context.replace(/\\/g, "/") + item.request.slice(1);
if (fullPath.startsWith(dir)) {
newItems.push({
context: item.context,
request: fullPath.slice(dir.length + 1)
});
}
2018-02-25 09:00:20 +08:00
}
}
if (!hideOriginal) {
newItems.push(item);
}
}
return newItems;
2013-06-15 23:31:56 +08:00
}
2018-02-25 09:00:20 +08:00
);
}
);
}
}
module.exports = RequireContextPlugin;