| |
| |
| |
| |
| |
| "use strict"; |
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
| module.exports = class PnpPlugin { |
| |
| |
| |
| |
| |
| |
| constructor(source, pnpApi, target, alternateTarget) { |
| this.source = source; |
| this.pnpApi = pnpApi; |
| this.target = target; |
| this.alternateTarget = alternateTarget; |
| } |
|
|
| |
| |
| |
| |
| apply(resolver) { |
| |
| const target = resolver.ensureHook(this.target); |
| const alternateTarget = resolver.ensureHook(this.alternateTarget); |
| resolver |
| .getHook(this.source) |
| .tapAsync("PnpPlugin", (request, resolveContext, callback) => { |
| const req = request.request; |
| if (!req) return callback(); |
|
|
| |
| const issuer = `${request.path}/`; |
|
|
| const packageMatch = /^(@[^/]+\/)?[^/]+/.exec(req); |
| if (!packageMatch) return callback(); |
|
|
| const [packageName] = packageMatch; |
| const innerRequest = `.${req.slice(packageName.length)}`; |
|
|
| |
| let resolution; |
| |
| let apiResolution; |
| try { |
| resolution = this.pnpApi.resolveToUnqualified(packageName, issuer, { |
| considerBuiltins: false, |
| }); |
|
|
| if (resolution === null) { |
| |
| |
| resolver.doResolve( |
| alternateTarget, |
| request, |
| "issuer is not managed by a pnpapi", |
| resolveContext, |
| (err, result) => { |
| if (err) return callback(err); |
| if (result) return callback(null, result); |
| |
| return callback(null, null); |
| }, |
| ); |
| return; |
| } |
|
|
| if (resolveContext.fileDependencies) { |
| apiResolution = this.pnpApi.resolveToUnqualified("pnpapi", issuer, { |
| considerBuiltins: false, |
| }); |
| } |
| } catch ( error) { |
| if ( |
| |
| (error).code === "MODULE_NOT_FOUND" && |
| |
| (error).pnpCode === "UNDECLARED_DEPENDENCY" |
| ) { |
| |
| |
| 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); |
| |
| return callback(null, null); |
| }, |
| ); |
| }); |
| } |
| }; |
|
|