Skip to content

Commit 638dd64

Browse files
committed
Add cache to auto-import package.json filter
1 parent 0141d1d commit 638dd64

File tree

2 files changed

+45
-9
lines changed

2 files changed

+45
-9
lines changed

src/compiler/moduleSpecifiers.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,9 @@ function computeModuleSpecifiers(
369369
let redirectPathsSpecifiers: string[] | undefined;
370370
let relativeSpecifiers: string[] | undefined;
371371
for (const modulePath of modulePaths) {
372-
const specifier = tryGetModuleNameAsNodeModule(modulePath, info, importingSourceFile, host, compilerOptions, userPreferences, /*packageNameOnly*/ undefined, options.overrideImportMode);
372+
const specifier = modulePath.isInNodeModules
373+
? tryGetModuleNameAsNodeModule(modulePath, info, importingSourceFile, host, compilerOptions, userPreferences, /*packageNameOnly*/ undefined, options.overrideImportMode)
374+
: undefined;
373375
nodeModulesSpecifiers = append(nodeModulesSpecifiers, specifier);
374376
if (specifier && modulePath.isRedirect) {
375377
// If we got a specifier for a redirect, it was a bare package specifier (e.g. "@foo/bar",

src/services/utilities.ts

Lines changed: 42 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3663,7 +3663,13 @@ export function createPackageJsonImportFilter(fromFile: SourceFile, preferences:
36633663
).filter(p => p.parseable);
36643664

36653665
let usesNodeCoreModules: boolean | undefined;
3666-
return { allowsImportingAmbientModule, allowsImportingSourceFile, allowsImportingSpecifier };
3666+
let ambientModuleCache: Map<Symbol, boolean> | undefined;
3667+
let sourceFileCache: Map<SourceFile, boolean> | undefined;
3668+
return {
3669+
allowsImportingAmbientModule,
3670+
allowsImportingSourceFile,
3671+
allowsImportingSpecifier,
3672+
};
36673673

36683674
function moduleSpecifierIsCoveredByPackageJson(specifier: string) {
36693675
const packageName = getNodeModuleRootSpecifier(specifier);
@@ -3680,32 +3686,60 @@ export function createPackageJsonImportFilter(fromFile: SourceFile, preferences:
36803686
return true;
36813687
}
36823688

3683-
const declaringSourceFile = moduleSymbol.valueDeclaration.getSourceFile();
3684-
const declaringNodeModuleName = getNodeModulesPackageNameFromFileName(declaringSourceFile.fileName, moduleSpecifierResolutionHost);
3685-
if (typeof declaringNodeModuleName === "undefined") {
3686-
return true;
3689+
if (!ambientModuleCache) {
3690+
ambientModuleCache = new Map();
3691+
}
3692+
else {
3693+
const cached = ambientModuleCache.get(moduleSymbol);
3694+
if (cached !== undefined) {
3695+
return cached;
3696+
}
36873697
}
36883698

36893699
const declaredModuleSpecifier = stripQuotes(moduleSymbol.getName());
36903700
if (isAllowedCoreNodeModulesImport(declaredModuleSpecifier)) {
3701+
ambientModuleCache.set(moduleSymbol, true);
36913702
return true;
36923703
}
36933704

3694-
return moduleSpecifierIsCoveredByPackageJson(declaringNodeModuleName)
3695-
|| moduleSpecifierIsCoveredByPackageJson(declaredModuleSpecifier);
3705+
const declaringSourceFile = moduleSymbol.valueDeclaration.getSourceFile();
3706+
const declaringNodeModuleName = getNodeModulesPackageNameFromFileName(declaringSourceFile.fileName, moduleSpecifierResolutionHost);
3707+
if (typeof declaringNodeModuleName === "undefined") {
3708+
ambientModuleCache.set(moduleSymbol, true);
3709+
return true;
3710+
}
3711+
3712+
const result =
3713+
moduleSpecifierIsCoveredByPackageJson(declaringNodeModuleName) ||
3714+
moduleSpecifierIsCoveredByPackageJson(declaredModuleSpecifier);
3715+
ambientModuleCache.set(moduleSymbol, result);
3716+
return result;
36963717
}
36973718

36983719
function allowsImportingSourceFile(sourceFile: SourceFile, moduleSpecifierResolutionHost: ModuleSpecifierResolutionHost): boolean {
36993720
if (!packageJsons.length) {
37003721
return true;
37013722
}
37023723

3724+
if (!sourceFileCache) {
3725+
sourceFileCache = new Map();
3726+
}
3727+
else {
3728+
const cached = sourceFileCache.get(sourceFile);
3729+
if (cached !== undefined) {
3730+
return cached;
3731+
}
3732+
}
3733+
37033734
const moduleSpecifier = getNodeModulesPackageNameFromFileName(sourceFile.fileName, moduleSpecifierResolutionHost);
37043735
if (!moduleSpecifier) {
3736+
sourceFileCache.set(sourceFile, true);
37053737
return true;
37063738
}
37073739

3708-
return moduleSpecifierIsCoveredByPackageJson(moduleSpecifier);
3740+
const result = moduleSpecifierIsCoveredByPackageJson(moduleSpecifier);
3741+
sourceFileCache.set(sourceFile, result);
3742+
return result;
37093743
}
37103744

37113745
function allowsImportingSpecifier(moduleSpecifier: string) {

0 commit comments

Comments
 (0)