| | |
| | | const { createFakeHook } = require("./util/deprecation"); |
| | | const { join } = require("./util/fs"); |
| | | |
| | | /** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */ |
| | | /** @typedef {import("./Compilation").FileSystemDependencies} FileSystemDependencies */ |
| | | /** @typedef {import("./ContextModule").ContextModuleOptions} ContextModuleOptions */ |
| | | /** @typedef {import("./ContextModule").ResolveDependenciesCallback} ResolveDependenciesCallback */ |
| | | /** @typedef {import("./ModuleFactory").ModuleFactoryCreateData} ModuleFactoryCreateData */ |
| | |
| | | /** @typedef {import("./ResolverFactory")} ResolverFactory */ |
| | | /** @typedef {import("./dependencies/ContextDependency")} ContextDependency */ |
| | | /** @typedef {import("./dependencies/ContextDependency").ContextOptions} ContextOptions */ |
| | | /** @typedef {import("enhanced-resolve").ResolveRequest} ResolveRequest */ |
| | | |
| | | /** |
| | | * Defines the shared type used by this module. |
| | | * @template T |
| | | * @typedef {import("./util/deprecation").FakeHook<T>} FakeHook<T> |
| | | */ |
| | |
| | | /** @typedef {{ context: string, request: string }} ContextAlternativeRequest */ |
| | | |
| | | /** |
| | | * Defines the context resolve data type used by this module. |
| | | * @typedef {object} ContextResolveData |
| | | * @property {string} context |
| | | * @property {string} request |
| | | * @property {ModuleFactoryCreateData["resolveOptions"]} resolveOptions |
| | | * @property {LazySet<string>} fileDependencies |
| | | * @property {LazySet<string>} missingDependencies |
| | | * @property {LazySet<string>} contextDependencies |
| | | * @property {FileSystemDependencies} fileDependencies |
| | | * @property {FileSystemDependencies} missingDependencies |
| | | * @property {FileSystemDependencies} contextDependencies |
| | | * @property {ContextDependency[]} dependencies |
| | | */ |
| | | |
| | |
| | | |
| | | class ContextModuleFactory extends ModuleFactory { |
| | | /** |
| | | * Creates an instance of ContextModuleFactory. |
| | | * @param {ResolverFactory} resolverFactory resolverFactory |
| | | */ |
| | | constructor(resolverFactory) { |
| | |
| | | ), |
| | | alternativeRequests |
| | | }); |
| | | /** @type {ResolverFactory} */ |
| | | this.resolverFactory = resolverFactory; |
| | | } |
| | | |
| | | /** |
| | | * Processes the provided data. |
| | | * @param {ModuleFactoryCreateData} data data object |
| | | * @param {ModuleFactoryCallback} callback callback |
| | | * @returns {void} |
| | |
| | | const dependencies = /** @type {ContextDependency[]} */ (data.dependencies); |
| | | const resolveOptions = data.resolveOptions; |
| | | const dependency = dependencies[0]; |
| | | /** @type {FileSystemDependencies} */ |
| | | const fileDependencies = new LazySet(); |
| | | /** @type {FileSystemDependencies} */ |
| | | const missingDependencies = new LazySet(); |
| | | /** @type {FileSystemDependencies} */ |
| | | const contextDependencies = new LazySet(); |
| | | this.hooks.beforeResolve.callAsync( |
| | | { |
| | |
| | | const idx = request.lastIndexOf("!"); |
| | | if (idx >= 0) { |
| | | let loadersRequest = request.slice(0, idx + 1); |
| | | /** @type {number} */ |
| | | let i; |
| | | for ( |
| | | i = 0; |
| | |
| | | loadersRequest = loadersRequest |
| | | .slice(i) |
| | | .replace(/!+$/, "") |
| | | .replace(/!!+/g, "!"); |
| | | .replace(/!{2,}/g, "!"); |
| | | loaders = loadersRequest === "" ? [] : loadersRequest.split("!"); |
| | | resource = request.slice(idx + 1); |
| | | } else { |
| | |
| | | (callback) => { |
| | | const results = /** @type {ResolveRequest[]} */ ([]); |
| | | /** |
| | | * Processes the provided obj. |
| | | * @param {ResolveRequest} obj obj |
| | | * @returns {void} |
| | | */ |
| | |
| | | } |
| | | |
| | | /** |
| | | * Resolves dependencies. |
| | | * @param {InputFileSystem} fs file system |
| | | * @param {ContextModuleOptions} options options |
| | | * @param {ResolveDependenciesCallback} callback callback function |
| | |
| | | if (!regExp || !resource) return callback(null, []); |
| | | |
| | | /** |
| | | * Adds directory checked. |
| | | * @param {string} ctx context |
| | | * @param {string} directory directory |
| | | * @param {Set<string>} visited visited |
| | |
| | | }; |
| | | |
| | | /** |
| | | * Adds the provided ctx to the context module factory. |
| | | * @param {string} ctx context |
| | | * @param {string} directory directory |
| | | * @param {(context: string, subResource: string, callback: () => void) => void} addSubDirectory addSubDirectoryFn |
| | |
| | | |
| | | if (!result) return callback(null, []); |
| | | |
| | | /** @type {ContextElementDependency[]} */ |
| | | const flattenedResult = []; |
| | | |
| | | for (const item of result) { |
| | |
| | | }; |
| | | |
| | | /** |
| | | * Adds sub directory. |
| | | * @param {string} ctx context |
| | | * @param {string} dir dir |
| | | * @param {ResolveDependenciesCallback} callback callback |
| | |
| | | addDirectory(ctx, dir, addSubDirectory, callback); |
| | | |
| | | /** |
| | | * Processes the provided resource. |
| | | * @param {string} resource resource |
| | | * @param {ResolveDependenciesCallback} callback callback |
| | | */ |
| | | const visitResource = (resource, callback) => { |
| | | if (typeof fs.realpath === "function") { |
| | | addDirectoryChecked(resource, resource, new Set(), callback); |
| | | addDirectoryChecked( |
| | | resource, |
| | | resource, |
| | | /** @type {Set<string>} */ |
| | | new Set(), |
| | | callback |
| | | ); |
| | | } else { |
| | | addDirectory(resource, resource, addSubDirectory, callback); |
| | | } |