Add cache to auto-import package.json filter (#52422)

This commit is contained in:
Andrew Branch
2023-02-06 11:33:04 -08:00
committed by GitHub
parent 720ec45be5
commit 7d8f6eec46
2 changed files with 45 additions and 9 deletions
+3 -1
View File
@@ -371,7 +371,9 @@ function computeModuleSpecifiers(
let redirectPathsSpecifiers: string[] | undefined;
let relativeSpecifiers: string[] | undefined;
for (const modulePath of modulePaths) {
const specifier = tryGetModuleNameAsNodeModule(modulePath, info, importingSourceFile, host, compilerOptions, userPreferences, /*packageNameOnly*/ undefined, options.overrideImportMode);
const specifier = modulePath.isInNodeModules
? tryGetModuleNameAsNodeModule(modulePath, info, importingSourceFile, host, compilerOptions, userPreferences, /*packageNameOnly*/ undefined, options.overrideImportMode)
: undefined;
nodeModulesSpecifiers = append(nodeModulesSpecifiers, specifier);
if (specifier && modulePath.isRedirect) {
// If we got a specifier for a redirect, it was a bare package specifier (e.g. "@foo/bar",
+42 -8
View File
@@ -3677,7 +3677,13 @@ export function createPackageJsonImportFilter(fromFile: SourceFile, preferences:
).filter(p => p.parseable);
let usesNodeCoreModules: boolean | undefined;
return { allowsImportingAmbientModule, allowsImportingSourceFile, allowsImportingSpecifier };
let ambientModuleCache: Map<Symbol, boolean> | undefined;
let sourceFileCache: Map<SourceFile, boolean> | undefined;
return {
allowsImportingAmbientModule,
allowsImportingSourceFile,
allowsImportingSpecifier,
};
function moduleSpecifierIsCoveredByPackageJson(specifier: string) {
const packageName = getNodeModuleRootSpecifier(specifier);
@@ -3694,19 +3700,34 @@ export function createPackageJsonImportFilter(fromFile: SourceFile, preferences:
return true;
}
const declaringSourceFile = moduleSymbol.valueDeclaration.getSourceFile();
const declaringNodeModuleName = getNodeModulesPackageNameFromFileName(declaringSourceFile.fileName, moduleSpecifierResolutionHost);
if (typeof declaringNodeModuleName === "undefined") {
return true;
if (!ambientModuleCache) {
ambientModuleCache = new Map();
}
else {
const cached = ambientModuleCache.get(moduleSymbol);
if (cached !== undefined) {
return cached;
}
}
const declaredModuleSpecifier = stripQuotes(moduleSymbol.getName());
if (isAllowedCoreNodeModulesImport(declaredModuleSpecifier)) {
ambientModuleCache.set(moduleSymbol, true);
return true;
}
return moduleSpecifierIsCoveredByPackageJson(declaringNodeModuleName)
|| moduleSpecifierIsCoveredByPackageJson(declaredModuleSpecifier);
const declaringSourceFile = moduleSymbol.valueDeclaration.getSourceFile();
const declaringNodeModuleName = getNodeModulesPackageNameFromFileName(declaringSourceFile.fileName, moduleSpecifierResolutionHost);
if (typeof declaringNodeModuleName === "undefined") {
ambientModuleCache.set(moduleSymbol, true);
return true;
}
const result =
moduleSpecifierIsCoveredByPackageJson(declaringNodeModuleName) ||
moduleSpecifierIsCoveredByPackageJson(declaredModuleSpecifier);
ambientModuleCache.set(moduleSymbol, result);
return result;
}
function allowsImportingSourceFile(sourceFile: SourceFile, moduleSpecifierResolutionHost: ModuleSpecifierResolutionHost): boolean {
@@ -3714,12 +3735,25 @@ export function createPackageJsonImportFilter(fromFile: SourceFile, preferences:
return true;
}
if (!sourceFileCache) {
sourceFileCache = new Map();
}
else {
const cached = sourceFileCache.get(sourceFile);
if (cached !== undefined) {
return cached;
}
}
const moduleSpecifier = getNodeModulesPackageNameFromFileName(sourceFile.fileName, moduleSpecifierResolutionHost);
if (!moduleSpecifier) {
sourceFileCache.set(sourceFile, true);
return true;
}
return moduleSpecifierIsCoveredByPackageJson(moduleSpecifier);
const result = moduleSpecifierIsCoveredByPackageJson(moduleSpecifier);
sourceFileCache.set(sourceFile, result);
return result;
}
function allowsImportingSpecifier(moduleSpecifier: string) {