/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const ModuleNotFoundError = require("../ModuleNotFoundError"); const LazySet = require("../util/LazySet"); /** @typedef {import("../Compilation")} Compilation */ /** @typedef {import("../ResolverFactory").ResolveOptionsWithDependencyType} ResolveOptionsWithDependencyType */ /** * @template T * @typedef {object} MatchedConfigs * @property {Map} resolved * @property {Map} unresolved * @property {Map} prefixed */ /** @type {ResolveOptionsWithDependencyType} */ const RESOLVE_OPTIONS = { dependencyType: "esm" }; /** * @template T * @param {Compilation} compilation the compilation * @param {[string, T][]} configs to be processed configs * @returns {Promise>} resolved matchers */ module.exports.resolveMatchedConfigs = (compilation, configs) => { /** @type {Map} */ const resolved = new Map(); /** @type {Map} */ const unresolved = new Map(); /** @type {Map} */ const prefixed = new Map(); const resolveContext = { /** @type {LazySet} */ fileDependencies: new LazySet(), /** @type {LazySet} */ contextDependencies: new LazySet(), /** @type {LazySet} */ missingDependencies: new LazySet() }; const resolver = compilation.resolverFactory.get("normal", RESOLVE_OPTIONS); const context = compilation.compiler.context; return Promise.all( // eslint-disable-next-line array-callback-return configs.map(([request, config]) => { if (/^\.\.?(\/|$)/.test(request)) { // relative request return new Promise(resolve => { resolver.resolve( {}, context, request, resolveContext, (err, result) => { if (err || result === false) { err = err || new Error(`Can't resolve ${request}`); compilation.errors.push( new ModuleNotFoundError(null, err, { name: `shared module ${request}` }) ); return resolve(null); } resolved.set(/** @type {string} */ (result), config); resolve(null); } ); }); } else if (/^(\/|[A-Za-z]:\\|\\\\)/.test(request)) { // absolute path resolved.set(request, config); } else if (request.endsWith("/")) { // module request prefix prefixed.set(request, config); } else { // module request unresolved.set(request, config); } }) ).then(() => { compilation.contextDependencies.addAll(resolveContext.contextDependencies); compilation.fileDependencies.addAll(resolveContext.fileDependencies); compilation.missingDependencies.addAll(resolveContext.missingDependencies); return { resolved, unresolved, prefixed }; }); };