diff --git a/src/services/pathCompletions.ts b/src/services/pathCompletions.ts index 7fd3b7cfd0bf6..f42d70a0c5240 100644 --- a/src/services/pathCompletions.ts +++ b/src/services/pathCompletions.ts @@ -27,7 +27,7 @@ namespace ts.Completions.PathCompletions { const scriptDirectory = getDirectoryPath(scriptPath); if (isPathRelativeToScript(literalValue) || isRootedDiskPath(literalValue)) { - const extensions = getSupportedExtensions(compilerOptions); + const extensions = getSupportedExtensionsForModuleResolution(compilerOptions); if (compilerOptions.rootDirs) { return getCompletionEntriesForDirectoryFragmentWithRootDirs( compilerOptions.rootDirs, literalValue, scriptDirectory, extensions, /*includeExtensions*/ false, compilerOptions, host, scriptPath); @@ -42,6 +42,13 @@ namespace ts.Completions.PathCompletions { } } + function getSupportedExtensionsForModuleResolution(compilerOptions: CompilerOptions) { + const extensions = getSupportedExtensions(compilerOptions); + return compilerOptions.resolveJsonModule && getEmitModuleResolutionKind(compilerOptions) === ModuleResolutionKind.NodeJs ? + extensions.concat(Extension.Json) : + extensions; + } + /** * Takes a script path and returns paths for all potential folders that could be merged with its * containing folder via the "rootDirs" compiler option @@ -122,7 +129,7 @@ namespace ts.Completions.PathCompletions { continue; } - const foundFileName = includeExtensions ? getBaseFileName(filePath) : removeFileExtension(getBaseFileName(filePath)); + const foundFileName = includeExtensions || fileExtensionIs(filePath, Extension.Json) ? getBaseFileName(filePath) : removeFileExtension(getBaseFileName(filePath)); if (!foundFiles.has(foundFileName)) { foundFiles.set(foundFileName, true); @@ -162,7 +169,7 @@ namespace ts.Completions.PathCompletions { const result: NameAndKind[] = []; - const fileExtensions = getSupportedExtensions(compilerOptions); + const fileExtensions = getSupportedExtensionsForModuleResolution(compilerOptions); if (baseUrl) { const projectDir = compilerOptions.project || host.getCurrentDirectory(); const absolute = isRootedDiskPath(baseUrl) ? baseUrl : combinePaths(projectDir, baseUrl); diff --git a/tests/cases/fourslash/completionsPathsJsonModule.ts b/tests/cases/fourslash/completionsPathsJsonModule.ts new file mode 100644 index 0000000000000..6d1a621d69a65 --- /dev/null +++ b/tests/cases/fourslash/completionsPathsJsonModule.ts @@ -0,0 +1,12 @@ +/// + +// @moduleResolution: node +// @resolveJsonModule: true + +// @Filename: /project/node_modules/test.json +////not read + +// @Filename: /project/index.ts +////import { } from "/**/"; + +verify.completionsAt("", ["test.json"], { isNewIdentifierLocation: true }); \ No newline at end of file diff --git a/tests/cases/fourslash/completionsPathsJsonModuleWithAmd.ts b/tests/cases/fourslash/completionsPathsJsonModuleWithAmd.ts new file mode 100644 index 0000000000000..8a2388655af74 --- /dev/null +++ b/tests/cases/fourslash/completionsPathsJsonModuleWithAmd.ts @@ -0,0 +1,12 @@ +/// + +// @module: amd +// @resolveJsonModule: true + +// @Filename: /project/test.json +////not read + +// @Filename: /project/index.ts +////import { } from ".//**/"; + +verify.completionsAt("", [], { isNewIdentifierLocation: true }); \ No newline at end of file diff --git a/tests/cases/fourslash/completionsPathsJsonModuleWithoutResolveJsonModule.ts b/tests/cases/fourslash/completionsPathsJsonModuleWithoutResolveJsonModule.ts new file mode 100644 index 0000000000000..432fc6e858b6a --- /dev/null +++ b/tests/cases/fourslash/completionsPathsJsonModuleWithoutResolveJsonModule.ts @@ -0,0 +1,11 @@ +/// + +// @moduleResolution: node + +// @Filename: /project/test.json +////not read + +// @Filename: /project/index.ts +////import { } from ".//**/"; + +verify.completionsAt("", [], { isNewIdentifierLocation: true }); diff --git a/tests/cases/fourslash/completionsPathsRelativeJsonModule.ts b/tests/cases/fourslash/completionsPathsRelativeJsonModule.ts new file mode 100644 index 0000000000000..93a6ac6e4e239 --- /dev/null +++ b/tests/cases/fourslash/completionsPathsRelativeJsonModule.ts @@ -0,0 +1,12 @@ +/// + +// @moduleResolution: node +// @resolveJsonModule: true + +// @Filename: /project/test.json +////not read + +// @Filename: /project/index.ts +////import { } from ".//**/"; + +verify.completionsAt("", ["test.json"], { isNewIdentifierLocation: true }); \ No newline at end of file