| | |
| | | |
| | | "use strict"; |
| | | |
| | | const forEachBail = require("./forEachBail"); |
| | | const getPaths = require("./getPaths"); |
| | | const { modulesResolveHandler } = require("./ModulesUtils"); |
| | | |
| | | /** @typedef {import("./Resolver")} Resolver */ |
| | | /** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */ |
| | | /** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook */ |
| | | |
| | | module.exports = class ModulesInHierarchicalDirectoriesPlugin { |
| | | /** |
| | | * @param {string | ResolveStepHook} source source |
| | | * @param {string | Array<string>} directories directories |
| | | * @param {string | string[]} directories directories |
| | | * @param {string | ResolveStepHook} target target |
| | | */ |
| | | constructor(source, directories, target) { |
| | | this.source = source; |
| | | this.directories = /** @type {Array<string>} */ [...directories]; |
| | | this.directories = /** @type {string[]} */ [...directories]; |
| | | this.target = target; |
| | | } |
| | | |
| | |
| | | .tapAsync( |
| | | "ModulesInHierarchicalDirectoriesPlugin", |
| | | (request, resolveContext, callback) => { |
| | | const fs = resolver.fileSystem; |
| | | const addrs = getPaths(/** @type {string} */ (request.path)) |
| | | .paths.map((path) => |
| | | this.directories.map((directory) => |
| | | resolver.join(path, directory), |
| | | ), |
| | | ) |
| | | .reduce((array, path) => { |
| | | array.push(...path); |
| | | return array; |
| | | }, []); |
| | | forEachBail( |
| | | addrs, |
| | | /** |
| | | * @param {string} addr addr |
| | | * @param {(err?: null|Error, result?: null|ResolveRequest) => void} callback callback |
| | | * @returns {void} |
| | | */ |
| | | (addr, callback) => { |
| | | fs.stat(addr, (err, stat) => { |
| | | if (!err && stat && stat.isDirectory()) { |
| | | /** @type {ResolveRequest} */ |
| | | const obj = { |
| | | ...request, |
| | | path: addr, |
| | | request: `./${request.request}`, |
| | | module: false, |
| | | }; |
| | | const message = `looking for modules in ${addr}`; |
| | | return resolver.doResolve( |
| | | modulesResolveHandler( |
| | | resolver, |
| | | this.directories, |
| | | target, |
| | | obj, |
| | | message, |
| | | request, |
| | | resolveContext, |
| | | callback, |
| | | ); |
| | | } |
| | | if (resolveContext.log) { |
| | | resolveContext.log( |
| | | `${addr} doesn't exist or is not a directory`, |
| | | ); |
| | | } |
| | | if (resolveContext.missingDependencies) { |
| | | resolveContext.missingDependencies.add(addr); |
| | | } |
| | | return callback(); |
| | | }); |
| | | }, |
| | | callback, |
| | | ); |
| | | }, |