diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 1da70cd173f..510fc096297 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -1049,9 +1049,18 @@ namespace ts { } function loadModuleFromPackageJson(jsonContent: PackageJsonPathFields, extensions: Extensions, candidate: string, failedLookupLocations: Push, state: ModuleResolutionState): PathAndExtension | undefined { - const file = tryReadPackageJsonFields(extensions !== Extensions.JavaScript && extensions !== Extensions.Json, jsonContent, candidate, state); + let file = tryReadPackageJsonFields(extensions !== Extensions.JavaScript && extensions !== Extensions.Json, jsonContent, candidate, state); if (!file) { - return undefined; + if (extensions === Extensions.TypeScript) { + // When resolving typescript modules, try resolving using main field as well + file = tryReadPackageJsonFields(/*readTypes*/ false, jsonContent, candidate, state); + if (!file) { + return undefined; + } + } + else { + return undefined; + } } const onlyRecordFailures = !directoryProbablyExists(getDirectoryPath(file), state.host); diff --git a/src/harness/unittests/moduleResolution.ts b/src/harness/unittests/moduleResolution.ts index fc1811420d3..b5c527aa246 100644 --- a/src/harness/unittests/moduleResolution.ts +++ b/src/harness/unittests/moduleResolution.ts @@ -181,6 +181,13 @@ namespace ts { "/a/b/foo.ts", "/a/b/foo.tsx", "/a/b/foo.d.ts", + "/c/d", + "/c/d.ts", + "/c/d.tsx", + "/c/d.d.ts", + "/c/d/index.ts", + "/c/d/index.tsx", + "/c/d/index.d.ts", "/a/b/foo/index.ts", "/a/b/foo/index.tsx", ]); diff --git a/tests/baselines/reference/duplicatePackage_relativeImportWithinPackage.trace.json b/tests/baselines/reference/duplicatePackage_relativeImportWithinPackage.trace.json index d592022e2e1..d75683d210f 100644 --- a/tests/baselines/reference/duplicatePackage_relativeImportWithinPackage.trace.json +++ b/tests/baselines/reference/duplicatePackage_relativeImportWithinPackage.trace.json @@ -40,6 +40,7 @@ "File '/node_modules/a/node_modules/foo.d.ts' does not exist.", "'package.json' does not have a 'typings' field.", "'package.json' does not have a 'types' field.", + "'package.json' does not have a 'main' field.", "File '/node_modules/a/node_modules/foo/index.ts' does not exist.", "File '/node_modules/a/node_modules/foo/index.tsx' does not exist.", "File '/node_modules/a/node_modules/foo/index.d.ts' exist - use it as a name resolution result.", diff --git a/tests/baselines/reference/duplicatePackage_relativeImportWithinPackage_scoped.trace.json b/tests/baselines/reference/duplicatePackage_relativeImportWithinPackage_scoped.trace.json index 108873d70f9..7b07ecd66e4 100644 --- a/tests/baselines/reference/duplicatePackage_relativeImportWithinPackage_scoped.trace.json +++ b/tests/baselines/reference/duplicatePackage_relativeImportWithinPackage_scoped.trace.json @@ -40,6 +40,7 @@ "File '/node_modules/a/node_modules/@foo/bar.d.ts' does not exist.", "'package.json' does not have a 'typings' field.", "'package.json' does not have a 'types' field.", + "'package.json' does not have a 'main' field.", "File '/node_modules/a/node_modules/@foo/bar/index.ts' does not exist.", "File '/node_modules/a/node_modules/@foo/bar/index.tsx' does not exist.", "File '/node_modules/a/node_modules/@foo/bar/index.d.ts' exist - use it as a name resolution result.", diff --git a/tests/baselines/reference/moduleResolutionWithExtensions_unexpected.trace.json b/tests/baselines/reference/moduleResolutionWithExtensions_unexpected.trace.json index 5f32a4bf511..60cdab44a29 100644 --- a/tests/baselines/reference/moduleResolutionWithExtensions_unexpected.trace.json +++ b/tests/baselines/reference/moduleResolutionWithExtensions_unexpected.trace.json @@ -11,6 +11,14 @@ "File '/node_modules/normalize.css.d.ts' does not exist.", "'package.json' does not have a 'typings' field.", "'package.json' does not have a 'types' field.", + "'package.json' has 'main' field 'normalize.css' that references '/node_modules/normalize.css/normalize.css'.", + "File '/node_modules/normalize.css/normalize.css' exist - use it as a name resolution result.", + "File '/node_modules/normalize.css/normalize.css' has an unsupported extension, so skipping it.", + "Loading module as file / folder, candidate module location '/node_modules/normalize.css/normalize.css', target file type 'TypeScript'.", + "File '/node_modules/normalize.css/normalize.css.ts' does not exist.", + "File '/node_modules/normalize.css/normalize.css.tsx' does not exist.", + "File '/node_modules/normalize.css/normalize.css.d.ts' does not exist.", + "Directory '/node_modules/normalize.css/normalize.css' does not exist, skipping all lookups in it.", "File '/node_modules/normalize.css/index.ts' does not exist.", "File '/node_modules/normalize.css/index.tsx' does not exist.", "File '/node_modules/normalize.css/index.d.ts' does not exist.", diff --git a/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.errors.txt b/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.errors.txt deleted file mode 100644 index 2dffc5530f8..00000000000 --- a/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.errors.txt +++ /dev/null @@ -1,14 +0,0 @@ -/index.ts(1,19): error TS2307: Cannot find module 'foo'. - - -==== /node_modules/foo/package.json (0 errors) ==== - { "name": "foo", "version": "1.2.3", "main": "src/index.js" } - -==== /node_modules/foo/src/index.d.ts (0 errors) ==== - export const x: number; - -==== /index.ts (1 errors) ==== - import { x } from "foo"; - ~~~~~ -!!! error TS2307: Cannot find module 'foo'. - \ No newline at end of file diff --git a/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.trace.json b/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.trace.json index 4833e4a57a0..849b65ee59f 100644 --- a/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.trace.json +++ b/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.trace.json @@ -11,27 +11,16 @@ "File '/node_modules/foo.d.ts' does not exist.", "'package.json' does not have a 'typings' field.", "'package.json' does not have a 'types' field.", - "File '/node_modules/foo/index.ts' does not exist.", - "File '/node_modules/foo/index.tsx' does not exist.", - "File '/node_modules/foo/index.d.ts' does not exist.", - "Directory '/node_modules/@types' does not exist, skipping all lookups in it.", - "Loading module 'foo' from 'node_modules' folder, target file type 'JavaScript'.", - "'package.json' does not have a 'typings' field.", - "'package.json' does not have a 'types' field.", - "'package.json' has 'main' field 'src/index.js' that references '/node_modules/foo/src/index.js'.", - "Found 'package.json' at '/node_modules/foo/package.json'. Package ID is 'foo/src/index.d.ts@1.2.3'.", - "File '/node_modules/foo.js' does not exist.", - "File '/node_modules/foo.jsx' does not exist.", "'package.json' has 'main' field 'src/index.js' that references '/node_modules/foo/src/index.js'.", "File '/node_modules/foo/src/index.js' does not exist.", - "Loading module as file / folder, candidate module location '/node_modules/foo/src/index.js', target file type 'JavaScript'.", - "File '/node_modules/foo/src/index.js.js' does not exist.", - "File '/node_modules/foo/src/index.js.jsx' does not exist.", + "Loading module as file / folder, candidate module location '/node_modules/foo/src/index.js', target file type 'TypeScript'.", + "File '/node_modules/foo/src/index.js.ts' does not exist.", + "File '/node_modules/foo/src/index.js.tsx' does not exist.", + "File '/node_modules/foo/src/index.js.d.ts' does not exist.", "File name '/node_modules/foo/src/index.js' has a '.js' extension - stripping it.", - "File '/node_modules/foo/src/index.js' does not exist.", - "File '/node_modules/foo/src/index.jsx' does not exist.", - "Directory '/node_modules/foo/src/index.js' does not exist, skipping all lookups in it.", - "File '/node_modules/foo/index.js' does not exist.", - "File '/node_modules/foo/index.jsx' does not exist.", - "======== Module name 'foo' was not resolved. ========" + "File '/node_modules/foo/src/index.ts' does not exist.", + "File '/node_modules/foo/src/index.tsx' does not exist.", + "File '/node_modules/foo/src/index.d.ts' exist - use it as a name resolution result.", + "Resolving real path for '/node_modules/foo/src/index.d.ts', result '/node_modules/foo/src/index.d.ts'.", + "======== Module name 'foo' was successfully resolved to '/node_modules/foo/src/index.d.ts'. ========" ] \ No newline at end of file diff --git a/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.types b/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.types index 32a66be06a6..e0ae051e59f 100644 --- a/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.types +++ b/tests/baselines/reference/moduleResolution_packageJson_yesAtPackageRoot_mainFieldInSubDirectory.types @@ -4,5 +4,5 @@ export const x: number; === /index.ts === import { x } from "foo"; ->x : any +>x : number diff --git a/tests/baselines/reference/packageJsonMain.trace.json b/tests/baselines/reference/packageJsonMain.trace.json index 6d39b9d4a7b..06c8cff6643 100644 --- a/tests/baselines/reference/packageJsonMain.trace.json +++ b/tests/baselines/reference/packageJsonMain.trace.json @@ -11,6 +11,13 @@ "File '/node_modules/foo.d.ts' does not exist.", "'package.json' does not have a 'typings' field.", "'package.json' does not have a 'types' field.", + "'package.json' has 'main' field 'oof' that references '/node_modules/foo/oof'.", + "File '/node_modules/foo/oof' does not exist.", + "Loading module as file / folder, candidate module location '/node_modules/foo/oof', target file type 'TypeScript'.", + "File '/node_modules/foo/oof.ts' does not exist.", + "File '/node_modules/foo/oof.tsx' does not exist.", + "File '/node_modules/foo/oof.d.ts' does not exist.", + "Directory '/node_modules/foo/oof' does not exist, skipping all lookups in it.", "File '/node_modules/foo/index.ts' does not exist.", "File '/node_modules/foo/index.tsx' does not exist.", "File '/node_modules/foo/index.d.ts' does not exist.", @@ -40,6 +47,18 @@ "File '/node_modules/bar.d.ts' does not exist.", "'package.json' does not have a 'typings' field.", "'package.json' does not have a 'types' field.", + "'package.json' has 'main' field 'rab.js' that references '/node_modules/bar/rab.js'.", + "File '/node_modules/bar/rab.js' exist - use it as a name resolution result.", + "File '/node_modules/bar/rab.js' has an unsupported extension, so skipping it.", + "Loading module as file / folder, candidate module location '/node_modules/bar/rab.js', target file type 'TypeScript'.", + "File '/node_modules/bar/rab.js.ts' does not exist.", + "File '/node_modules/bar/rab.js.tsx' does not exist.", + "File '/node_modules/bar/rab.js.d.ts' does not exist.", + "File name '/node_modules/bar/rab.js' has a '.js' extension - stripping it.", + "File '/node_modules/bar/rab.ts' does not exist.", + "File '/node_modules/bar/rab.tsx' does not exist.", + "File '/node_modules/bar/rab.d.ts' does not exist.", + "Directory '/node_modules/bar/rab.js' does not exist, skipping all lookups in it.", "File '/node_modules/bar/index.ts' does not exist.", "File '/node_modules/bar/index.tsx' does not exist.", "File '/node_modules/bar/index.d.ts' does not exist.", @@ -67,6 +86,15 @@ "File '/node_modules/baz.d.ts' does not exist.", "'package.json' does not have a 'typings' field.", "'package.json' does not have a 'types' field.", + "'package.json' has 'main' field 'zab' that references '/node_modules/baz/zab'.", + "File '/node_modules/baz/zab' does not exist.", + "Loading module as file / folder, candidate module location '/node_modules/baz/zab', target file type 'TypeScript'.", + "File '/node_modules/baz/zab.ts' does not exist.", + "File '/node_modules/baz/zab.tsx' does not exist.", + "File '/node_modules/baz/zab.d.ts' does not exist.", + "File '/node_modules/baz/zab/index.ts' does not exist.", + "File '/node_modules/baz/zab/index.tsx' does not exist.", + "File '/node_modules/baz/zab/index.d.ts' does not exist.", "File '/node_modules/baz/index.ts' does not exist.", "File '/node_modules/baz/index.tsx' does not exist.", "File '/node_modules/baz/index.d.ts' does not exist.", diff --git a/tests/baselines/reference/packageJsonMain_isNonRecursive.trace.json b/tests/baselines/reference/packageJsonMain_isNonRecursive.trace.json index 81f5be11a6d..a2878a2a4fe 100644 --- a/tests/baselines/reference/packageJsonMain_isNonRecursive.trace.json +++ b/tests/baselines/reference/packageJsonMain_isNonRecursive.trace.json @@ -11,6 +11,15 @@ "File '/node_modules/foo.d.ts' does not exist.", "'package.json' does not have a 'typings' field.", "'package.json' does not have a 'types' field.", + "'package.json' has 'main' field 'oof' that references '/node_modules/foo/oof'.", + "File '/node_modules/foo/oof' does not exist.", + "Loading module as file / folder, candidate module location '/node_modules/foo/oof', target file type 'TypeScript'.", + "File '/node_modules/foo/oof.ts' does not exist.", + "File '/node_modules/foo/oof.tsx' does not exist.", + "File '/node_modules/foo/oof.d.ts' does not exist.", + "File '/node_modules/foo/oof/index.ts' does not exist.", + "File '/node_modules/foo/oof/index.tsx' does not exist.", + "File '/node_modules/foo/oof/index.d.ts' does not exist.", "File '/node_modules/foo/index.ts' does not exist.", "File '/node_modules/foo/index.tsx' does not exist.", "File '/node_modules/foo/index.d.ts' does not exist.",