diff --git a/internal/fourslash/tests/autoImportPackageJsonImportsHashSlash_test.go b/internal/fourslash/tests/autoImportPackageJsonImportsHashSlash_test.go new file mode 100644 index 00000000000..d6e79016711 --- /dev/null +++ b/internal/fourslash/tests/autoImportPackageJsonImportsHashSlash_test.go @@ -0,0 +1,61 @@ +package fourslash_test + +import ( + "testing" + + "github.com/microsoft/typescript-go/internal/fourslash" + "github.com/microsoft/typescript-go/internal/testutil" +) + +func TestAutoImportPackageJsonImportsHashSlashNodenext(t *testing.T) { + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: /tsconfig.json +{ + "compilerOptions": { + "module": "nodenext", + "rootDir": "./", + "outDir": "build" + } +} +// @Filename: /package.json +{ + "imports": { + "#/*": { + "types": "./src/*", + "default": "./src/*" + } + } +} +// @Filename: /src/domain/entities/entity.ts +export const entity = 1; +// @Filename: /src/features/deep/consumer.ts +entit/**/` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.BaselineAutoImportsCompletions(t, []string{""}) +} + +func TestAutoImportPackageJsonImportsHashSlashNode16(t *testing.T) { + t.Parallel() + defer testutil.RecoverAndFail(t, "Panic on fourslash test") + const content = `// @Filename: /tsconfig.json +{ + "compilerOptions": { + "module": "node16" + } +} +// @Filename: /package.json +{ + "imports": { + "#/*": "./src/*" + } +} +// @Filename: /src/domain/entities/entity.ts +export const entity = 1; +// @Filename: /src/consumer.ts +entit/**/` + f, done := fourslash.NewFourslash(t, nil /*capabilities*/, content) + defer done() + f.BaselineAutoImportsCompletions(t, []string{""}) +} diff --git a/internal/modulespecifiers/specifiers.go b/internal/modulespecifiers/specifiers.go index 5c8eb9d2fe5..9ced1e8ecd5 100644 --- a/internal/modulespecifiers/specifiers.go +++ b/internal/modulespecifiers/specifiers.go @@ -1031,9 +1031,12 @@ func tryGetModuleNameFromPackageJsonImports( top := imports.AsObject() entries := top.Entries() for k, value := range entries { - if !strings.HasPrefix(k, "#") || k == "#" || strings.HasPrefix(k, "#/") { + if k == "#" || k == "#/" || !strings.HasPrefix(k, "#") { continue // invalid imports entry } + if strings.HasPrefix(k, "#/") && options.GetModuleResolutionKind() != core.ModuleResolutionKindNodeNext && options.GetModuleResolutionKind() != core.ModuleResolutionKindBundler { + continue // "#/" imports keys are only valid in nodenext/bundler + } mode := MatchingModeExact if strings.HasSuffix(k, "/") { mode = MatchingModeDirectory diff --git a/testdata/baselines/reference/fourslash/autoImports/autoImportPackageJsonImportsHashSlashNode16.baseline.md b/testdata/baselines/reference/fourslash/autoImports/autoImportPackageJsonImportsHashSlashNode16.baseline.md new file mode 100644 index 00000000000..9aeec692c32 --- /dev/null +++ b/testdata/baselines/reference/fourslash/autoImports/autoImportPackageJsonImportsHashSlashNode16.baseline.md @@ -0,0 +1,10 @@ +// === Auto Imports === +```ts +// @FileName: /src/consumer.ts +entit/**/ +``````ts +import { entity } from "./domain/entities/entity"; + +entit +``` + diff --git a/testdata/baselines/reference/fourslash/autoImports/autoImportPackageJsonImportsHashSlashNodenext.baseline.md b/testdata/baselines/reference/fourslash/autoImports/autoImportPackageJsonImportsHashSlashNodenext.baseline.md new file mode 100644 index 00000000000..e7ff918d3d0 --- /dev/null +++ b/testdata/baselines/reference/fourslash/autoImports/autoImportPackageJsonImportsHashSlashNodenext.baseline.md @@ -0,0 +1,10 @@ +// === Auto Imports === +```ts +// @FileName: /src/features/deep/consumer.ts +entit/**/ +``````ts +import { entity } from "#/domain/entities/entity.js"; + +entit +``` +