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