From 10d3a938256a087e02f2a8f578a688a019ca7f0e Mon Sep 17 00:00:00 2001 From: John Favret <64748847+johnfav03@users.noreply.github.com> Date: Thu, 2 Oct 2025 11:04:21 -0500 Subject: [PATCH 1/6] added userpref gating for package.json auto imports --- internal/ls/autoimports.go | 8 +++++++- internal/ls/completions.go | 4 +++- internal/ls/types.go | 2 ++ internal/modulespecifiers/preferences.go | 13 +++++++++++++ internal/modulespecifiers/specifiers.go | 2 +- internal/modulespecifiers/types.go | 18 ++++++++++++++++++ 6 files changed, 44 insertions(+), 3 deletions(-) diff --git a/internal/ls/autoimports.go b/internal/ls/autoimports.go index 3b38e0d637..8c48803b84 100644 --- a/internal/ls/autoimports.go +++ b/internal/ls/autoimports.go @@ -1010,7 +1010,9 @@ func (l *LanguageService) getNewImportFixes( ) []*ImportFix /* FixAddNewImport | FixAddJsdocTypeImport */ { isJs := tspath.HasJSFileExtension(sourceFile.FileName()) compilerOptions := l.GetProgram().Options() - // !!! packagejsonAutoimportProvider + // !!! if preferences.IncludePackageJsonAutoImports != "off" { + // !!! packagejsonAutoimportProvider + // !!! } // getChecker := createGetChecker(program, host)// memoized typechecker based on `isFromPackageJson` bool getModuleSpecifiers := func(moduleSymbol *ast.Symbol, checker *checker.Checker) ([]string, modulespecifiers.ResultKind) { @@ -1345,6 +1347,10 @@ func forEachExternalModuleToImportFrom( }, ) + // if preferences.IncludePackageJsonAutoImports == "off" { + // return; + // } + // !!! autoImportProvider // if autoImportProvider := useAutoImportProvider && l.getPackageJsonAutoImportProvider(); autoImportProvider != nil { // // start := timestamp(); diff --git a/internal/ls/completions.go b/internal/ls/completions.go index 6966553a1e..6969d7be2f 100644 --- a/internal/ls/completions.go +++ b/internal/ls/completions.go @@ -1187,7 +1187,9 @@ func (l *LanguageService) getCompletionData( isValidTypeOnlyUseSite := ast.IsValidTypeOnlyAliasUseSite(location) // !!! moduleSpecifierCache := host.getModuleSpecifierCache(); - // !!! packageJsonAutoImportProvider := host.getPackageJsonAutoImportProvider(); + // !!! if preferences.includePackageJsonAutoImports != "off" { + // !!! packageJsonAutoImportProvider := host.getPackageJsonAutoImportProvider(); + // !!! } addSymbolToList := func(info []*SymbolExportInfo, symbolName string, isFromAmbientModule bool, exportMapKey ExportInfoMapKey) []*SymbolExportInfo { // Do a relatively cheap check to bail early if all re-exports are non-importable // due to file location or package.json dependency filtering. For non-node16+ diff --git a/internal/ls/types.go b/internal/ls/types.go index f5f9d19014..f57baa3543 100644 --- a/internal/ls/types.go +++ b/internal/ls/types.go @@ -51,6 +51,7 @@ type UserPreferences struct { ImportModuleSpecifierPreference modulespecifiers.ImportModuleSpecifierPreference ImportModuleSpecifierEndingPreference modulespecifiers.ImportModuleSpecifierEndingPreference + IncludePackageJsonAutoImports modulespecifiers.IncludePackageJsonAutoImports PreferTypeOnlyAutoImports *bool AutoImportSpecifierExcludeRegexes []string AutoImportFileExcludePatterns []string @@ -62,6 +63,7 @@ func (p *UserPreferences) ModuleSpecifierPreferences() modulespecifiers.UserPref return modulespecifiers.UserPreferences{ ImportModuleSpecifierPreference: p.ImportModuleSpecifierPreference, ImportModuleSpecifierEndingPreference: p.ImportModuleSpecifierEndingPreference, + IncludePackageJsonAutoImports: p.IncludePackageJsonAutoImports, AutoImportSpecifierExcludeRegexes: p.AutoImportSpecifierExcludeRegexes, } } diff --git a/internal/modulespecifiers/preferences.go b/internal/modulespecifiers/preferences.go index 226335fdbb..aea01e0009 100644 --- a/internal/modulespecifiers/preferences.go +++ b/internal/modulespecifiers/preferences.go @@ -141,6 +141,7 @@ func getPreferredEnding( type ModuleSpecifierPreferences struct { relativePreference RelativePreferenceKind getAllowedEndingsInPreferredOrder func(syntaxImpliedNodeFormat core.ResolutionMode) []ModuleSpecifierEnding + packageJsonAutoImports PackageJsonAutoImports excludeRegexes []string } @@ -170,6 +171,17 @@ func getModuleSpecifierPreferences( // all others are shortest } } + + var packageJsonAutoImports PackageJsonAutoImports + switch prefs.IncludePackageJsonAutoImports { + case "on": + packageJsonAutoImports = PackageJsonAutoImportsOn + case "off": + packageJsonAutoImports = PackageJsonAutoImportsOff + default: + packageJsonAutoImports = PackageJsonAutoImportsAuto + } + filePreferredEnding := getPreferredEnding( prefs, host, @@ -226,6 +238,7 @@ func getModuleSpecifierPreferences( } return ModuleSpecifierPreferences{ + packageJsonAutoImports: packageJsonAutoImports, excludeRegexes: excludes, relativePreference: relativePreference, getAllowedEndingsInPreferredOrder: getAllowedEndingsInPreferredOrder, diff --git a/internal/modulespecifiers/specifiers.go b/internal/modulespecifiers/specifiers.go index 1f8e26b040..797c1b6bf0 100644 --- a/internal/modulespecifiers/specifiers.go +++ b/internal/modulespecifiers/specifiers.go @@ -493,7 +493,7 @@ func getLocalModuleSpecifier( } var fromPackageJsonImports string - if !pathsOnly { + if !pathsOnly && preferences.packageJsonAutoImports != PackageJsonAutoImportsOff { fromPackageJsonImports = tryGetModuleNameFromPackageJsonImports( moduleFileName, sourceDirectory, diff --git a/internal/modulespecifiers/types.go b/internal/modulespecifiers/types.go index eb9881f656..2df7c9518f 100644 --- a/internal/modulespecifiers/types.go +++ b/internal/modulespecifiers/types.go @@ -85,9 +85,19 @@ const ( ImportModuleSpecifierEndingPreferenceJs ImportModuleSpecifierEndingPreference = "js" ) +type IncludePackageJsonAutoImports string + +const ( + IncludePackageJsonAutoImportsNone IncludePackageJsonAutoImports = "" + IncludePackageJsonAutoImportsAuto IncludePackageJsonAutoImports = "auto" + IncludePackageJsonAutoImportsOn IncludePackageJsonAutoImports = "on" + IncludePackageJsonAutoImportsOff IncludePackageJsonAutoImports = "off" +) + type UserPreferences struct { ImportModuleSpecifierPreference ImportModuleSpecifierPreference ImportModuleSpecifierEndingPreference ImportModuleSpecifierEndingPreference + IncludePackageJsonAutoImports IncludePackageJsonAutoImports AutoImportSpecifierExcludeRegexes []string } @@ -113,6 +123,14 @@ const ( ModuleSpecifierEndingTsExtension ) +type PackageJsonAutoImports uint8 + +const ( + PackageJsonAutoImportsAuto PackageJsonAutoImports = iota + PackageJsonAutoImportsOn + PackageJsonAutoImportsOff +) + type MatchingMode uint8 const ( From 50f4996b34a25cc46487e4e359d6f890fa3a983b Mon Sep 17 00:00:00 2001 From: John Favret <64748847+johnfav03@users.noreply.github.com> Date: Fri, 3 Oct 2025 12:28:55 -0400 Subject: [PATCH 2/6] removed from modulespecifiers --- internal/modulespecifiers/preferences.go | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/internal/modulespecifiers/preferences.go b/internal/modulespecifiers/preferences.go index aea01e0009..3ac2adefbf 100644 --- a/internal/modulespecifiers/preferences.go +++ b/internal/modulespecifiers/preferences.go @@ -141,7 +141,6 @@ func getPreferredEnding( type ModuleSpecifierPreferences struct { relativePreference RelativePreferenceKind getAllowedEndingsInPreferredOrder func(syntaxImpliedNodeFormat core.ResolutionMode) []ModuleSpecifierEnding - packageJsonAutoImports PackageJsonAutoImports excludeRegexes []string } @@ -172,16 +171,6 @@ func getModuleSpecifierPreferences( } } - var packageJsonAutoImports PackageJsonAutoImports - switch prefs.IncludePackageJsonAutoImports { - case "on": - packageJsonAutoImports = PackageJsonAutoImportsOn - case "off": - packageJsonAutoImports = PackageJsonAutoImportsOff - default: - packageJsonAutoImports = PackageJsonAutoImportsAuto - } - filePreferredEnding := getPreferredEnding( prefs, host, @@ -238,7 +227,6 @@ func getModuleSpecifierPreferences( } return ModuleSpecifierPreferences{ - packageJsonAutoImports: packageJsonAutoImports, excludeRegexes: excludes, relativePreference: relativePreference, getAllowedEndingsInPreferredOrder: getAllowedEndingsInPreferredOrder, From fb5e4c628a7c9ed0c8bcfae1485767847450b406 Mon Sep 17 00:00:00 2001 From: John Favret <64748847+johnfav03@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:02:24 -0400 Subject: [PATCH 3/6] readd modulespecifiers and remove uint8 type --- internal/modulespecifiers/preferences.go | 2 ++ internal/modulespecifiers/specifiers.go | 2 +- internal/modulespecifiers/types.go | 8 -------- 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/internal/modulespecifiers/preferences.go b/internal/modulespecifiers/preferences.go index 3ac2adefbf..7cc9d132b3 100644 --- a/internal/modulespecifiers/preferences.go +++ b/internal/modulespecifiers/preferences.go @@ -141,6 +141,7 @@ func getPreferredEnding( type ModuleSpecifierPreferences struct { relativePreference RelativePreferenceKind getAllowedEndingsInPreferredOrder func(syntaxImpliedNodeFormat core.ResolutionMode) []ModuleSpecifierEnding + packageJsonAutoImports IncludePackageJsonAutoImports excludeRegexes []string } @@ -227,6 +228,7 @@ func getModuleSpecifierPreferences( } return ModuleSpecifierPreferences{ + packageJsonAutoImports: prefs.IncludePackageJsonAutoImports, excludeRegexes: excludes, relativePreference: relativePreference, getAllowedEndingsInPreferredOrder: getAllowedEndingsInPreferredOrder, diff --git a/internal/modulespecifiers/specifiers.go b/internal/modulespecifiers/specifiers.go index 797c1b6bf0..775db819b2 100644 --- a/internal/modulespecifiers/specifiers.go +++ b/internal/modulespecifiers/specifiers.go @@ -493,7 +493,7 @@ func getLocalModuleSpecifier( } var fromPackageJsonImports string - if !pathsOnly && preferences.packageJsonAutoImports != PackageJsonAutoImportsOff { + if !pathsOnly && preferences.packageJsonAutoImports != IncludePackageJsonAutoImportsOff { fromPackageJsonImports = tryGetModuleNameFromPackageJsonImports( moduleFileName, sourceDirectory, diff --git a/internal/modulespecifiers/types.go b/internal/modulespecifiers/types.go index 2df7c9518f..3de30bb37f 100644 --- a/internal/modulespecifiers/types.go +++ b/internal/modulespecifiers/types.go @@ -123,14 +123,6 @@ const ( ModuleSpecifierEndingTsExtension ) -type PackageJsonAutoImports uint8 - -const ( - PackageJsonAutoImportsAuto PackageJsonAutoImports = iota - PackageJsonAutoImportsOn - PackageJsonAutoImportsOff -) - type MatchingMode uint8 const ( From bc76488bcd36cf013cc2ddc7d36ef23658ca79ca Mon Sep 17 00:00:00 2001 From: John Favret <64748847+johnfav03@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:08:34 -0400 Subject: [PATCH 4/6] updated types.go --- _submodules/TypeScript | 2 +- internal/ls/types.go | 69 ------------------------------------------ 2 files changed, 1 insertion(+), 70 deletions(-) delete mode 100644 internal/ls/types.go diff --git a/_submodules/TypeScript b/_submodules/TypeScript index bc7d42611e..add6971195 160000 --- a/_submodules/TypeScript +++ b/_submodules/TypeScript @@ -1 +1 @@ -Subproject commit bc7d42611e35678c7cbddb104aa4b117a95ccdfa +Subproject commit add697119549734b24d46b30b9f6d2e757c6d53a diff --git a/internal/ls/types.go b/internal/ls/types.go deleted file mode 100644 index f57baa3543..0000000000 --- a/internal/ls/types.go +++ /dev/null @@ -1,69 +0,0 @@ -package ls - -import ( - "github.com/microsoft/typescript-go/internal/modulespecifiers" -) - -type JsxAttributeCompletionStyle string - -const ( - JsxAttributeCompletionStyleAuto JsxAttributeCompletionStyle = "auto" - JsxAttributeCompletionStyleBraces JsxAttributeCompletionStyle = "braces" - JsxAttributeCompletionStyleNone JsxAttributeCompletionStyle = "none" -) - -type QuotePreference string - -const ( - QuotePreferenceAuto QuotePreference = "auto" - QuotePreferenceDouble QuotePreference = "double" - QuotePreferenceSingle QuotePreference = "single" -) - -type UserPreferences struct { - QuotePreference *QuotePreference - // If enabled, TypeScript will search through all external modules' exports and add them to the completions list. - // This affects lone identifier completions but not completions on the right hand side of `obj.`. - IncludeCompletionsForModuleExports *bool - - // Enables auto-import-style completions on partially-typed import statements. E.g., allows - // `import write|` to be completed to `import { writeFile } from "fs"`. - IncludeCompletionsForImportStatements *bool - - // Unless this option is `false`, member completion lists triggered with `.` will include entries - // on potentially-null and potentially-undefined values, with insertion text to replace - // preceding `.` tokens with `?.`. - IncludeAutomaticOptionalChainCompletions *bool - - // If enabled, completions for class members (e.g. methods and properties) will include - // a whole declaration for the member. - // E.g., `class A { f| }` could be completed to `class A { foo(): number {} }`, instead of - // `class A { foo }`. - IncludeCompletionsWithClassMemberSnippets *bool - - // If enabled, object literal methods will have a method declaration completion entry in addition - // to the regular completion entry containing just the method name. - // E.g., `const objectLiteral: T = { f| }` could be completed to `const objectLiteral: T = { foo(): void {} }`, - // in addition to `const objectLiteral: T = { foo }`. - IncludeCompletionsWithObjectLiteralMethodSnippets *bool - - JsxAttributeCompletionStyle *JsxAttributeCompletionStyle - - ImportModuleSpecifierPreference modulespecifiers.ImportModuleSpecifierPreference - ImportModuleSpecifierEndingPreference modulespecifiers.ImportModuleSpecifierEndingPreference - IncludePackageJsonAutoImports modulespecifiers.IncludePackageJsonAutoImports - PreferTypeOnlyAutoImports *bool - AutoImportSpecifierExcludeRegexes []string - AutoImportFileExcludePatterns []string - - UseAliasesForRename *bool -} - -func (p *UserPreferences) ModuleSpecifierPreferences() modulespecifiers.UserPreferences { - return modulespecifiers.UserPreferences{ - ImportModuleSpecifierPreference: p.ImportModuleSpecifierPreference, - ImportModuleSpecifierEndingPreference: p.ImportModuleSpecifierEndingPreference, - IncludePackageJsonAutoImports: p.IncludePackageJsonAutoImports, - AutoImportSpecifierExcludeRegexes: p.AutoImportSpecifierExcludeRegexes, - } -} From a393ad3a04aabec97af9b5bc08968618defbc066 Mon Sep 17 00:00:00 2001 From: John Favret <64748847+johnfav03@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:15:20 -0400 Subject: [PATCH 5/6] Revert "Merge branch 'auto-imports-user-prefs' of github.com:johnfav03/typescript-go into auto-imports-user-prefs" This reverts commit 865d44bc8948e7165defb117837464f5cbe2326d, reversing changes made to 186540b5240e2e31e61a2c4a8467d79b8174292c. --- _submodules/TypeScript | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/_submodules/TypeScript b/_submodules/TypeScript index add6971195..bc7d42611e 160000 --- a/_submodules/TypeScript +++ b/_submodules/TypeScript @@ -1 +1 @@ -Subproject commit add697119549734b24d46b30b9f6d2e757c6d53a +Subproject commit bc7d42611e35678c7cbddb104aa4b117a95ccdfa From 5a2f8121b0fbbd55acecc7ed34558a2056339b83 Mon Sep 17 00:00:00 2001 From: John Favret <64748847+johnfav03@users.noreply.github.com> Date: Fri, 3 Oct 2025 14:57:13 -0400 Subject: [PATCH 6/6] fixed build issue --- internal/modulespecifiers/types.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/modulespecifiers/types.go b/internal/modulespecifiers/types.go index 3de30bb37f..e8e3d7806c 100644 --- a/internal/modulespecifiers/types.go +++ b/internal/modulespecifiers/types.go @@ -95,10 +95,10 @@ const ( ) type UserPreferences struct { - ImportModuleSpecifierPreference ImportModuleSpecifierPreference - ImportModuleSpecifierEndingPreference ImportModuleSpecifierEndingPreference - IncludePackageJsonAutoImports IncludePackageJsonAutoImports - AutoImportSpecifierExcludeRegexes []string + ImportModuleSpecifierPreference ImportModuleSpecifierPreference + ImportModuleSpecifierEnding ImportModuleSpecifierEndingPreference + IncludePackageJsonAutoImports IncludePackageJsonAutoImports + AutoImportSpecifierExcludeRegexes []string } type ModuleSpecifierOptions struct {