| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 | /*	MIT License http://www.opensource.org/licenses/mit-license.php	Author Maël Nison @arcanis*/"use strict";/** @typedef {import("./Resolver")} Resolver *//** @typedef {import("./Resolver").ResolveStepHook} ResolveStepHook *//** * @typedef {Object} PnpApiImpl * @property {function(string, string, object): string} resolveToUnqualified */module.exports = class PnpPlugin {	/**	 * @param {string | ResolveStepHook} source source	 * @param {PnpApiImpl} pnpApi pnpApi	 * @param {string | ResolveStepHook} target target	 */	constructor(source, pnpApi, target) {		this.source = source;		this.pnpApi = pnpApi;		this.target = target;	}	/**	 * @param {Resolver} resolver the resolver	 * @returns {void}	 */	apply(resolver) {		const target = resolver.ensureHook(this.target);		resolver			.getHook(this.source)			.tapAsync("PnpPlugin", (request, resolveContext, callback) => {				const req = request.request;				if (!req) return callback();				// The trailing slash indicates to PnP that this value is a folder rather than a file				const issuer = `${request.path}/`;				const packageMatch = /^(@[^/]+\/)?[^/]+/.exec(req);				if (!packageMatch) return callback();				const packageName = packageMatch[0];				const innerRequest = `.${req.slice(packageName.length)}`;				let resolution;				let apiResolution;				try {					resolution = this.pnpApi.resolveToUnqualified(packageName, issuer, {						considerBuiltins: false					});					if (resolveContext.fileDependencies) {						apiResolution = this.pnpApi.resolveToUnqualified("pnpapi", issuer, {							considerBuiltins: false						});					}				} catch (error) {					if (						error.code === "MODULE_NOT_FOUND" &&						error.pnpCode === "UNDECLARED_DEPENDENCY"					) {						// This is not a PnP managed dependency.						// Try to continue resolving with our alternatives						if (resolveContext.log) {							resolveContext.log(`request is not managed by the pnpapi`);							for (const line of error.message.split("\n").filter(Boolean))								resolveContext.log(`  ${line}`);						}						return callback();					}					return callback(error);				}				if (resolution === packageName) return callback();				if (apiResolution && resolveContext.fileDependencies) {					resolveContext.fileDependencies.add(apiResolution);				}				const obj = {					...request,					path: resolution,					request: innerRequest,					ignoreSymlinks: true,					fullySpecified: request.fullySpecified && innerRequest !== "."				};				resolver.doResolve(					target,					obj,					`resolved by pnp to ${resolution}`,					resolveContext,					(err, result) => {						if (err) return callback(err);						if (result) return callback(null, result);						// Skip alternatives						return callback(null, null);					}				);			});	}};
 |