From ff656eb17f3b84968bf7d4e027ab1dbbc258950d Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:57:40 -0700 Subject: [PATCH 1/4] Set maxNodeModuleJsDepth in JS-containing projects --- internal/project/project.go | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/internal/project/project.go b/internal/project/project.go index 3ed15c5096..67943d5e7d 100644 --- a/internal/project/project.go +++ b/internal/project/project.go @@ -153,6 +153,7 @@ type Project struct { // rootFileNames was a map from Path to { NormalizedPath, ScriptInfo? } in the original code. // But the ProjectService owns script infos, so it's not clear why there was an extra pointer. rootFileNames *collections.OrderedMap[tspath.Path, string] + rootJSFileCount int compilerOptions *core.CompilerOptions typeAcquisition *core.TypeAcquisition parsedCommandLine *tsoptions.ParsedCommandLine @@ -564,6 +565,12 @@ func (p *Project) updateProgram() bool { } else { rootFileNames := p.GetRootFileNames() compilerOptions := p.compilerOptions + + if compilerOptions.MaxNodeModuleJsDepth == nil && p.rootJSFileCount > 0 { + compilerOptions = compilerOptions.Clone() + compilerOptions.MaxNodeModuleJsDepth = ptrTo(2) + } + p.programConfig = &tsoptions.ParsedCommandLine{ ParsedConfig: &core.ParsedOptions{ CompilerOptions: compilerOptions, @@ -860,7 +867,7 @@ func (p *Project) RemoveFile(info *ScriptInfo, fileExists bool) { p.mu.Lock() defer p.mu.Unlock() if p.isRoot(info) && p.kind == KindInferred { - p.rootFileNames.Delete(info.path) + p.deleteRootFileName(info.path) p.typeAcquisition = nil p.programConfig = nil } @@ -883,13 +890,12 @@ func (p *Project) AddInferredProjectRoot(info *ScriptInfo) { if p.isRoot(info) { panic("script info is already a root") } - p.rootFileNames.Set(info.path, info.fileName) + p.setRootFileName(info.path, info.fileName) p.programConfig = nil p.typeAcquisition = nil // !!! // if p.kind == KindInferred { // p.host.startWatchingConfigFilesForInferredProjectRoot(info.path); - // // handle JS toggling // } info.attachToProject(p) p.markAsDirtyLocked() @@ -932,7 +938,7 @@ func (p *Project) setRootFiles(rootFileNames []string) { // !!! updateNonInferredProjectFiles uses a fileExists check, which I guess // could be needed if a watcher fails? newRootScriptInfos[path] = struct{}{} - p.rootFileNames.Set(path, file) + p.setRootFileName(path, file) // if !isAlreadyRoot { // if scriptInfo.isOpen { // !!!s.removeRootOfInferredProjectIfNowPartOfOtherProject(scriptInfo) @@ -943,12 +949,32 @@ func (p *Project) setRootFiles(rootFileNames []string) { if p.rootFileNames.Size() > len(rootFileNames) { for root := range p.rootFileNames.Keys() { if _, ok := newRootScriptInfos[root]; !ok { - p.rootFileNames.Delete(root) + p.deleteRootFileName(root) } } } } +func (p *Project) setRootFileName(path tspath.Path, fileName string) { + p.rootFileNames.Set(path, fileName) + if p.kind == KindInferred { + if tspath.HasJSFileExtension(fileName) { + p.rootJSFileCount++ + } + } +} + +func (p *Project) deleteRootFileName(path tspath.Path) { + fileName, ok := p.rootFileNames.Get(path) + if !ok { + return + } + p.rootFileNames.Delete(path) + if p.kind == KindInferred && tspath.HasJSFileExtension(fileName) { + p.rootJSFileCount-- + } +} + func (p *Project) clearSourceMapperCache() { // !!! } @@ -1065,6 +1091,7 @@ func (p *Project) Close() { } } p.rootFileNames = nil + p.rootJSFileCount = 0 p.parsedCommandLine = nil p.programConfig = nil p.checkerPool = nil From 71895cf35de0595579c2105872fdf16cae13fb74 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Wed, 18 Jun 2025 22:21:23 -0700 Subject: [PATCH 2/4] Fix bug --- internal/project/project.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/internal/project/project.go b/internal/project/project.go index cd8998a64c..2e68020a52 100644 --- a/internal/project/project.go +++ b/internal/project/project.go @@ -953,9 +953,10 @@ func (p *Project) setRootFiles(rootFileNames []string) { } func (p *Project) setRootFileName(path tspath.Path, fileName string) { + has := p.rootFileNames.Has(path) p.rootFileNames.Set(path, fileName) if p.kind == KindInferred { - if tspath.HasJSFileExtension(fileName) { + if !has && tspath.HasJSFileExtension(fileName) { p.rootJSFileCount++ } } @@ -967,8 +968,10 @@ func (p *Project) deleteRootFileName(path tspath.Path) { return } p.rootFileNames.Delete(path) - if p.kind == KindInferred && tspath.HasJSFileExtension(fileName) { - p.rootJSFileCount-- + if p.kind == KindInferred { + if tspath.HasJSFileExtension(fileName) { + p.rootJSFileCount-- + } } } From bb5474b636408cdcf74e203cc38ce081c80fbc9d Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Thu, 19 Jun 2025 15:21:19 -0700 Subject: [PATCH 3/4] rename --- internal/project/project.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/internal/project/project.go b/internal/project/project.go index 2e68020a52..afbb62d25d 100644 --- a/internal/project/project.go +++ b/internal/project/project.go @@ -864,7 +864,7 @@ func (p *Project) RemoveFile(info *ScriptInfo, fileExists bool) { p.mu.Lock() defer p.mu.Unlock() if p.isRoot(info) && p.kind == KindInferred { - p.deleteRootFileName(info.path) + p.deleteRootFileNameOfInferred(info.path) p.typeAcquisition = nil p.programConfig = nil } @@ -887,7 +887,7 @@ func (p *Project) AddInferredProjectRoot(info *ScriptInfo) { if p.isRoot(info) { panic("script info is already a root") } - p.setRootFileName(info.path, info.fileName) + p.setRootFileNameOfInferred(info.path, info.fileName) p.programConfig = nil p.typeAcquisition = nil // !!! @@ -935,7 +935,7 @@ func (p *Project) setRootFiles(rootFileNames []string) { // !!! updateNonInferredProjectFiles uses a fileExists check, which I guess // could be needed if a watcher fails? newRootScriptInfos[path] = struct{}{} - p.setRootFileName(path, file) + p.rootFileNames.Set(path, file) // if !isAlreadyRoot { // if scriptInfo.isOpen { // !!!s.removeRootOfInferredProjectIfNowPartOfOtherProject(scriptInfo) @@ -946,13 +946,13 @@ func (p *Project) setRootFiles(rootFileNames []string) { if p.rootFileNames.Size() > len(rootFileNames) { for root := range p.rootFileNames.Keys() { if _, ok := newRootScriptInfos[root]; !ok { - p.deleteRootFileName(root) + p.rootFileNames.Delete(root) } } } } -func (p *Project) setRootFileName(path tspath.Path, fileName string) { +func (p *Project) setRootFileNameOfInferred(path tspath.Path, fileName string) { has := p.rootFileNames.Has(path) p.rootFileNames.Set(path, fileName) if p.kind == KindInferred { @@ -962,7 +962,7 @@ func (p *Project) setRootFileName(path tspath.Path, fileName string) { } } -func (p *Project) deleteRootFileName(path tspath.Path) { +func (p *Project) deleteRootFileNameOfInferred(path tspath.Path) { fileName, ok := p.rootFileNames.Get(path) if !ok { return From 74b406abdc3eb522d0627a69b540942a19b4ecf2 Mon Sep 17 00:00:00 2001 From: Jake Bailey <5341706+jakebailey@users.noreply.github.com> Date: Fri, 20 Jun 2025 13:22:28 -0700 Subject: [PATCH 4/4] move checks --- internal/project/project.go | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/internal/project/project.go b/internal/project/project.go index fda97cb6a8..d23850af30 100644 --- a/internal/project/project.go +++ b/internal/project/project.go @@ -971,25 +971,29 @@ func (p *Project) setRootFiles(rootFileNames []string) { } func (p *Project) setRootFileNameOfInferred(path tspath.Path, fileName string) { + if p.kind != KindInferred { + panic("setRootFileNameOfInferred called on non-inferred project") + } + has := p.rootFileNames.Has(path) p.rootFileNames.Set(path, fileName) - if p.kind == KindInferred { - if !has && tspath.HasJSFileExtension(fileName) { - p.rootJSFileCount++ - } + if !has && tspath.HasJSFileExtension(fileName) { + p.rootJSFileCount++ } } func (p *Project) deleteRootFileNameOfInferred(path tspath.Path) { + if p.kind != KindInferred { + panic("deleteRootFileNameOfInferred called on non-inferred project") + } + fileName, ok := p.rootFileNames.Get(path) if !ok { return } p.rootFileNames.Delete(path) - if p.kind == KindInferred { - if tspath.HasJSFileExtension(fileName) { - p.rootJSFileCount-- - } + if tspath.HasJSFileExtension(fileName) { + p.rootJSFileCount-- } }