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.
		
		
		
		
			
				
					73 lines
				
				2.9 KiB
			
		
		
			
		
	
	
					73 lines
				
				2.9 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								function resolveModuleName(request, issuer, compilerOptions, moduleResolutionHost, parentResolver) {
							 | 
						||
| 
								 | 
							
								  const pnp = require(`pnpapi`);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const [, prefix = ``, packageName = ``, rest] = request.match(/^(!(?:.*!)+)?((?!\.{0,2}\/)(?:@[^\/]+\/)?[^\/]+)?(.*)/);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  let failedLookupLocations = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // First we try the resolution on "@types/package-name" starting from the project root
							 | 
						||
| 
								 | 
							
								  if (packageName) {
							 | 
						||
| 
								 | 
							
								    const typesPackagePath = `@types/${packageName.replace(/\//g, `__`)}${rest}`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let unqualified;
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      unqualified = pnp.resolveToUnqualified(typesPackagePath, issuer, {considerBuiltins: false});
							 | 
						||
| 
								 | 
							
								    } catch (error) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (unqualified) {
							 | 
						||
| 
								 | 
							
								      // TypeScript checks whether the directory of the candidate is a directory
							 | 
						||
| 
								 | 
							
								      // which may cause issues w/ zip loading (since the zip archive is still
							 | 
						||
| 
								 | 
							
								      // reported as a file). To workaround this we add a trailing slash, which
							 | 
						||
| 
								 | 
							
								      // causes TypeScript to assume the parent is a directory.
							 | 
						||
| 
								 | 
							
								      if (moduleResolutionHost.directoryExists && moduleResolutionHost.directoryExists(unqualified))
							 | 
						||
| 
								 | 
							
								        unqualified += `/`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const finalResolution = parentResolver(unqualified, issuer, compilerOptions, moduleResolutionHost);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (finalResolution.resolvedModule || finalResolution.resolvedTypeReferenceDirective) {
							 | 
						||
| 
								 | 
							
								        return finalResolution;
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        failedLookupLocations = failedLookupLocations.concat(finalResolution.failedLookupLocations);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Then we try on "package-name", this time starting from the package that makes the request
							 | 
						||
| 
								 | 
							
								  if (true) {
							 | 
						||
| 
								 | 
							
								    const regularPackagePath = `${packageName || ``}${rest}`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let unqualified;
							 | 
						||
| 
								 | 
							
								    try {
							 | 
						||
| 
								 | 
							
								      unqualified = pnp.resolveToUnqualified(regularPackagePath, issuer, {considerBuiltins: false});
							 | 
						||
| 
								 | 
							
								    } catch (error) {}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if (unqualified) {
							 | 
						||
| 
								 | 
							
								      // TypeScript checks whether the directory of the candidate is a directory
							 | 
						||
| 
								 | 
							
								      // which may cause issues w/ zip loading (since the zip archive is still
							 | 
						||
| 
								 | 
							
								      // reported as a file). To workaround this we add a trailing slash, which
							 | 
						||
| 
								 | 
							
								      // causes TypeScript to assume the parent is a directory.
							 | 
						||
| 
								 | 
							
								      if (moduleResolutionHost.directoryExists && moduleResolutionHost.directoryExists(unqualified))
							 | 
						||
| 
								 | 
							
								        unqualified += `/`;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const finalResolution = parentResolver(unqualified, issuer, compilerOptions, moduleResolutionHost);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (finalResolution.resolvedModule || finalResolution.resolvedTypeReferenceDirective) {
							 | 
						||
| 
								 | 
							
								        return finalResolution;
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        failedLookupLocations = failedLookupLocations.concat(finalResolution.failedLookupLocations);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    resolvedModule: undefined,
							 | 
						||
| 
								 | 
							
								    resolvedTypeReferenceDirective: undefined,
							 | 
						||
| 
								 | 
							
								    failedLookupLocations,
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports.resolveModuleName = process.versions.pnp
							 | 
						||
| 
								 | 
							
								  ? resolveModuleName
							 | 
						||
| 
								 | 
							
								  : (moduleName, containingFile, compilerOptions, compilerHost, resolveModuleName) =>
							 | 
						||
| 
								 | 
							
								      resolveModuleName(moduleName, containingFile, compilerOptions, compilerHost);
							 |