You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
3.3 KiB
131 lines
3.3 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Tobias Koppers @sokra |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const fs = require("graceful-fs"); |
|
const CachedInputFileSystem = require("./CachedInputFileSystem"); |
|
const ResolverFactory = require("./ResolverFactory"); |
|
|
|
/** @typedef {import("./PnpPlugin").PnpApiImpl} PnpApi */ |
|
/** @typedef {import("./Resolver")} Resolver */ |
|
/** @typedef {import("./Resolver").FileSystem} FileSystem */ |
|
/** @typedef {import("./Resolver").ResolveContext} ResolveContext */ |
|
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */ |
|
/** @typedef {import("./ResolverFactory").Plugin} Plugin */ |
|
/** @typedef {import("./ResolverFactory").UserResolveOptions} ResolveOptions */ |
|
|
|
const nodeFileSystem = new CachedInputFileSystem(fs, 4000); |
|
|
|
const nodeContext = { |
|
environments: ["node+es3+es5+process+native"] |
|
}; |
|
|
|
const asyncResolver = ResolverFactory.createResolver({ |
|
conditionNames: ["node"], |
|
extensions: [".js", ".json", ".node"], |
|
fileSystem: nodeFileSystem |
|
}); |
|
function resolve(context, path, request, resolveContext, callback) { |
|
if (typeof context === "string") { |
|
callback = resolveContext; |
|
resolveContext = request; |
|
request = path; |
|
path = context; |
|
context = nodeContext; |
|
} |
|
if (typeof callback !== "function") { |
|
callback = resolveContext; |
|
} |
|
asyncResolver.resolve(context, path, request, resolveContext, callback); |
|
} |
|
|
|
const syncResolver = ResolverFactory.createResolver({ |
|
conditionNames: ["node"], |
|
extensions: [".js", ".json", ".node"], |
|
useSyncFileSystemCalls: true, |
|
fileSystem: nodeFileSystem |
|
}); |
|
function resolveSync(context, path, request) { |
|
if (typeof context === "string") { |
|
request = path; |
|
path = context; |
|
context = nodeContext; |
|
} |
|
return syncResolver.resolveSync(context, path, request); |
|
} |
|
|
|
function create(options) { |
|
options = { |
|
fileSystem: nodeFileSystem, |
|
...options |
|
}; |
|
const resolver = ResolverFactory.createResolver(options); |
|
return function (context, path, request, resolveContext, callback) { |
|
if (typeof context === "string") { |
|
callback = resolveContext; |
|
resolveContext = request; |
|
request = path; |
|
path = context; |
|
context = nodeContext; |
|
} |
|
if (typeof callback !== "function") { |
|
callback = resolveContext; |
|
} |
|
resolver.resolve(context, path, request, resolveContext, callback); |
|
}; |
|
} |
|
|
|
function createSync(options) { |
|
options = { |
|
useSyncFileSystemCalls: true, |
|
fileSystem: nodeFileSystem, |
|
...options |
|
}; |
|
const resolver = ResolverFactory.createResolver(options); |
|
return function (context, path, request) { |
|
if (typeof context === "string") { |
|
request = path; |
|
path = context; |
|
context = nodeContext; |
|
} |
|
return resolver.resolveSync(context, path, 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; |
|
} |
|
}), |
|
ResolverFactory, |
|
CachedInputFileSystem, |
|
get CloneBasenamePlugin() { |
|
return require("./CloneBasenamePlugin"); |
|
}, |
|
get LogInfoPlugin() { |
|
return require("./LogInfoPlugin"); |
|
}, |
|
get forEachBail() { |
|
return require("./forEachBail"); |
|
} |
|
});
|
|
|