123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const {
- JAVASCRIPT_MODULE_TYPE_AUTO,
- JAVASCRIPT_MODULE_TYPE_DYNAMIC
- } = require("../ModuleTypeConstants");
- const { cachedSetProperty } = require("../util/cleverMerge");
- const ContextElementDependency = require("./ContextElementDependency");
- const RequireContextDependency = require("./RequireContextDependency");
- const RequireContextDependencyParserPlugin = require("./RequireContextDependencyParserPlugin");
- /** @typedef {import("../../declarations/WebpackOptions").JavascriptParserOptions} JavascriptParserOptions */
- /** @typedef {import("../../declarations/WebpackOptions").ResolveOptions} ResolveOptions */
- /** @typedef {import("../Compiler")} Compiler */
- /** @typedef {import("../javascript/JavascriptParser")} Parser */
- /** @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) {
- compiler.hooks.compilation.tap(
- PLUGIN_NAME,
- (compilation, { contextModuleFactory, normalModuleFactory }) => {
- compilation.dependencyFactories.set(
- RequireContextDependency,
- contextModuleFactory
- );
- compilation.dependencyTemplates.set(
- RequireContextDependency,
- new RequireContextDependency.Template()
- );
- compilation.dependencyFactories.set(
- ContextElementDependency,
- normalModuleFactory
- );
- /**
- * @param {Parser} parser parser parser
- * @param {JavascriptParserOptions} parserOptions parserOptions
- * @returns {void}
- */
- const handler = (parser, parserOptions) => {
- if (
- parserOptions.requireContext !== undefined &&
- !parserOptions.requireContext
- )
- return;
- new RequireContextDependencyParserPlugin().apply(parser);
- };
- normalModuleFactory.hooks.parser
- .for(JAVASCRIPT_MODULE_TYPE_AUTO)
- .tap(PLUGIN_NAME, handler);
- normalModuleFactory.hooks.parser
- .for(JAVASCRIPT_MODULE_TYPE_DYNAMIC)
- .tap(PLUGIN_NAME, handler);
- contextModuleFactory.hooks.alternativeRequests.tap(
- PLUGIN_NAME,
- (items, options) => {
- if (items.length === 0) return items;
- const finalResolveOptions = compiler.resolverFactory.get(
- "normal",
- cachedSetProperty(
- options.resolveOptions || EMPTY_RESOLVE_OPTIONS,
- "dependencyType",
- /** @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;
- 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)
- });
- }
- }
- }
- if (!hideOriginal) {
- newItems.push(item);
- }
- }
- return newItems;
- }
- );
- }
- );
- }
- }
- module.exports = RequireContextPlugin;
|