webpack
Version:
Packs CommonJs/AMD modules for the browser. Allows to split your codebase into multiple bundles, which can be loaded on demand. Support loaders to preprocess files, i.e. json, jsx, es7, css, less, ... and your custom stuff.
92 lines (84 loc) • 2.69 kB
JavaScript
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
;
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<string, T>} resolved
* @property {Map<string, T>} unresolved
* @property {Map<string, T>} 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<MatchedConfigs<T>>} resolved matchers
*/
exports.resolveMatchedConfigs = (compilation, configs) => {
/** @type {Map<string, T>} */
const resolved = new Map();
/** @type {Map<string, T>} */
const unresolved = new Map();
/** @type {Map<string, T>} */
const prefixed = new Map();
const resolveContext = {
/** @type {LazySet<string>} */
fileDependencies: new LazySet(),
/** @type {LazySet<string>} */
contextDependencies: new LazySet(),
/** @type {LazySet<string>} */
missingDependencies: new LazySet()
};
const resolver = compilation.resolverFactory.get("normal", RESOLVE_OPTIONS);
const context = compilation.compiler.context;
return Promise.all(
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();
}
resolved.set(result, config);
resolve();
}
);
});
} 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 };
});
};