| /* | |
| MIT License http://www.opensource.org/licenses/mit-license.php | |
| Author Tobias Koppers @sokra | |
| */ | |
| ; | |
| const memoize = require("./util/memoize"); | |
| /** @typedef {import("./CachedInputFileSystem").BaseFileSystem} BaseFileSystem */ | |
| /** @typedef {import("./PnpPlugin").PnpApiImpl} PnpApi */ | |
| /** @typedef {import("./Resolver")} Resolver */ | |
| /** @typedef {import("./Resolver").FileSystem} FileSystem */ | |
| /** @typedef {import("./Resolver").ResolveCallback} ResolveCallback */ | |
| /** @typedef {import("./Resolver").ResolveContext} ResolveContext */ | |
| /** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */ | |
| /** @typedef {import("./Resolver").SyncFileSystem} SyncFileSystem */ | |
| /** @typedef {import("./ResolverFactory").Plugin} Plugin */ | |
| /** @typedef {import("./ResolverFactory").UserResolveOptions} ResolveOptions */ | |
| /** | |
| * @typedef {{ | |
| * (context: object, path: string, request: string, resolveContext: ResolveContext, callback: ResolveCallback): void; | |
| * (context: object, path: string, request: string, callback: ResolveCallback): void; | |
| * (path: string, request: string, resolveContext: ResolveContext, callback: ResolveCallback): void; | |
| * (path: string, request: string, callback: ResolveCallback): void; | |
| * }} ResolveFunctionAsync | |
| */ | |
| /** | |
| * @typedef {{ | |
| * (context: object, path: string, request: string): string | false; | |
| * (path: string, request: string): string | false; | |
| * }} ResolveFunction | |
| */ | |
| const getCachedFileSystem = memoize(() => require("./CachedInputFileSystem")); | |
| const getNodeFileSystem = memoize(() => { | |
| const fs = require("graceful-fs"); | |
| const CachedInputFileSystem = getCachedFileSystem(); | |
| return new CachedInputFileSystem(fs, 4000); | |
| }); | |
| const getNodeContext = memoize(() => ({ | |
| environments: ["node+es3+es5+process+native"], | |
| })); | |
| const getResolverFactory = memoize(() => require("./ResolverFactory")); | |
| const getAsyncResolver = memoize(() => | |
| getResolverFactory().createResolver({ | |
| conditionNames: ["node"], | |
| extensions: [".js", ".json", ".node"], | |
| fileSystem: getNodeFileSystem(), | |
| }), | |
| ); | |
| /** | |
| * @type {ResolveFunctionAsync} | |
| */ | |
| const resolve = | |
| /** | |
| * @param {object | string} context context | |
| * @param {string} path path | |
| * @param {string | ResolveContext | ResolveCallback} request request | |
| * @param {ResolveContext | ResolveCallback=} resolveContext resolve context | |
| * @param {ResolveCallback=} callback callback | |
| */ | |
| (context, path, request, resolveContext, callback) => { | |
| if (typeof context === "string") { | |
| callback = /** @type {ResolveCallback} */ (resolveContext); | |
| resolveContext = /** @type {ResolveContext} */ (request); | |
| request = path; | |
| path = context; | |
| context = getNodeContext(); | |
| } | |
| if (typeof callback !== "function") { | |
| callback = /** @type {ResolveCallback} */ (resolveContext); | |
| } | |
| getAsyncResolver().resolve( | |
| context, | |
| path, | |
| /** @type {string} */ (request), | |
| /** @type {ResolveContext} */ (resolveContext), | |
| /** @type {ResolveCallback} */ (callback), | |
| ); | |
| }; | |
| const getSyncResolver = memoize(() => | |
| getResolverFactory().createResolver({ | |
| conditionNames: ["node"], | |
| extensions: [".js", ".json", ".node"], | |
| useSyncFileSystemCalls: true, | |
| fileSystem: getNodeFileSystem(), | |
| }), | |
| ); | |
| /** | |
| * @type {ResolveFunction} | |
| */ | |
| const resolveSync = | |
| /** | |
| * @param {object|string} context context | |
| * @param {string} path path | |
| * @param {string=} request request | |
| * @returns {string | false} result | |
| */ | |
| (context, path, request) => { | |
| if (typeof context === "string") { | |
| request = path; | |
| path = context; | |
| context = getNodeContext(); | |
| } | |
| return getSyncResolver().resolveSync( | |
| context, | |
| path, | |
| /** @type {string} */ (request), | |
| ); | |
| }; | |
| /** @typedef {Omit<ResolveOptions, "fileSystem"> & Partial<Pick<ResolveOptions, "fileSystem">>} ResolveOptionsOptionalFS */ | |
| /** | |
| * @param {ResolveOptionsOptionalFS} options Resolver options | |
| * @returns {ResolveFunctionAsync} Resolver function | |
| */ | |
| function create(options) { | |
| const resolver = getResolverFactory().createResolver({ | |
| fileSystem: getNodeFileSystem(), | |
| ...options, | |
| }); | |
| /** | |
| * @param {object|string} context Custom context | |
| * @param {string} path Base path | |
| * @param {string|ResolveContext|ResolveCallback} request String to resolve | |
| * @param {ResolveContext|ResolveCallback=} resolveContext Resolve context | |
| * @param {ResolveCallback=} callback Result callback | |
| */ | |
| return function create(context, path, request, resolveContext, callback) { | |
| if (typeof context === "string") { | |
| callback = /** @type {ResolveCallback} */ (resolveContext); | |
| resolveContext = /** @type {ResolveContext} */ (request); | |
| request = path; | |
| path = context; | |
| context = getNodeContext(); | |
| } | |
| if (typeof callback !== "function") { | |
| callback = /** @type {ResolveCallback} */ (resolveContext); | |
| } | |
| resolver.resolve( | |
| context, | |
| path, | |
| /** @type {string} */ (request), | |
| /** @type {ResolveContext} */ (resolveContext), | |
| callback, | |
| ); | |
| }; | |
| } | |
| /** | |
| * @param {ResolveOptionsOptionalFS} options Resolver options | |
| * @returns {ResolveFunction} Resolver function | |
| */ | |
| function createSync(options) { | |
| const resolver = getResolverFactory().createResolver({ | |
| useSyncFileSystemCalls: true, | |
| fileSystem: getNodeFileSystem(), | |
| ...options, | |
| }); | |
| /** | |
| * @param {object | string} context custom context | |
| * @param {string} path base path | |
| * @param {string=} request request to resolve | |
| * @returns {string | false} Resolved path or false | |
| */ | |
| return function createSync(context, path, request) { | |
| if (typeof context === "string") { | |
| request = path; | |
| path = context; | |
| context = getNodeContext(); | |
| } | |
| return resolver.resolveSync(context, path, /** @type {string} */ (request)); | |
| }; | |
| } | |
| /** | |
| * @template A | |
| * @template B | |
| * @param {A} obj input a | |
| * @param {B} exports input b | |
| * @returns {A & B} merged | |
| */ | |
| const mergeExports = (obj, exports) => { | |
| const descriptors = Object.getOwnPropertyDescriptors(exports); | |
| Object.defineProperties(obj, descriptors); | |
| return /** @type {A & B} */ (Object.freeze(obj)); | |
| }; | |
| module.exports = mergeExports(resolve, { | |
| get sync() { | |
| return resolveSync; | |
| }, | |
| create: mergeExports(create, { | |
| get sync() { | |
| return createSync; | |
| }, | |
| }), | |
| get ResolverFactory() { | |
| return getResolverFactory(); | |
| }, | |
| get CachedInputFileSystem() { | |
| return getCachedFileSystem(); | |
| }, | |
| get CloneBasenamePlugin() { | |
| return require("./CloneBasenamePlugin"); | |
| }, | |
| get LogInfoPlugin() { | |
| return require("./LogInfoPlugin"); | |
| }, | |
| get forEachBail() { | |
| return require("./forEachBail"); | |
| }, | |
| }); | |