From 0f7049b26d0e027e902f16452a88763042b994c1 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Wed, 25 May 2022 16:14:58 +0000 Subject: [PATCH] Cherry-pick PR #49233 into release-4.7 Component commits: 1ab6396efe Fix extensions for noDtsResolution in node16/nodenext --- src/compiler/moduleNameResolver.ts | 14 +++++--- .../fourslash/server/goToSource13_nodenext.ts | 35 +++++++++++++++++++ 2 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 tests/cases/fourslash/server/goToSource13_nodenext.ts diff --git a/src/compiler/moduleNameResolver.ts b/src/compiler/moduleNameResolver.ts index 8f466c0495aee..d2b0db1041b4e 100644 --- a/src/compiler/moduleNameResolver.ts +++ b/src/compiler/moduleNameResolver.ts @@ -1288,18 +1288,22 @@ namespace ts { ); } + const jsOnlyExtensions = [Extensions.JavaScript]; + const tsExtensions = [Extensions.TypeScript, Extensions.JavaScript]; + const tsPlusJsonExtensions = [...tsExtensions, Extensions.Json]; + const tsconfigExtensions = [Extensions.TSConfig]; function nodeNextModuleNameResolverWorker(features: NodeResolutionFeatures, moduleName: string, containingFile: string, compilerOptions: CompilerOptions, host: ModuleResolutionHost, cache?: ModuleResolutionCache, redirectedReference?: ResolvedProjectReference, resolutionMode?: ModuleKind.CommonJS | ModuleKind.ESNext): ResolvedModuleWithFailedLookupLocations { const containingDirectory = getDirectoryPath(containingFile); // es module file or cjs-like input file, use a variant of the legacy cjs resolver that supports the selected modern features const esmMode = resolutionMode === ModuleKind.ESNext ? NodeResolutionFeatures.EsmMode : 0; - return nodeModuleNameResolverWorker(features | esmMode, moduleName, containingDirectory, compilerOptions, host, cache, compilerOptions.resolveJsonModule ? tsPlusJsonExtensions : tsExtensions, redirectedReference); + let extensions = compilerOptions.noDtsResolution ? [Extensions.TsOnly, Extensions.JavaScript] : tsExtensions; + if (compilerOptions.resolveJsonModule) { + extensions = [...extensions, Extensions.Json]; + } + return nodeModuleNameResolverWorker(features | esmMode, moduleName, containingDirectory, compilerOptions, host, cache, extensions, redirectedReference); } - const jsOnlyExtensions = [Extensions.JavaScript]; - const tsExtensions = [Extensions.TypeScript, Extensions.JavaScript]; - const tsPlusJsonExtensions = [...tsExtensions, Extensions.Json]; - const tsconfigExtensions = [Extensions.TSConfig]; function tryResolveJSModuleWorker(moduleName: string, initialDir: string, host: ModuleResolutionHost): ResolvedModuleWithFailedLookupLocations { return nodeModuleNameResolverWorker(NodeResolutionFeatures.None, moduleName, initialDir, { moduleResolution: ModuleResolutionKind.NodeJs, allowJs: true }, host, /*cache*/ undefined, jsOnlyExtensions, /*redirectedReferences*/ undefined); } diff --git a/tests/cases/fourslash/server/goToSource13_nodenext.ts b/tests/cases/fourslash/server/goToSource13_nodenext.ts new file mode 100644 index 0000000000000..99a3a29ef2ec9 --- /dev/null +++ b/tests/cases/fourslash/server/goToSource13_nodenext.ts @@ -0,0 +1,35 @@ +/// + +// @Filename: /node_modules/left-pad/package.json +//// { +//// "name": "left-pad", +//// "version": "1.3.0", +//// "description": "String left pad", +//// "main": "index.js", +//// "types": "index.d.ts" +//// } + +// @Filename: /node_modules/left-pad/index.d.ts +//// declare function leftPad(str: string|number, len: number, ch?: string|number): string; +//// declare namespace leftPad { } +//// export = leftPad; + +// @Filename: /node_modules/left-pad/index.js +//// module.exports = leftPad; +//// function /*end*/leftPad(str, len, ch) {} + +// @Filename: /tsconfig.json +//// { +//// "compilerOptions": { +//// "module": "node16", +//// "strict": true, +//// "outDir": "./out", +//// +//// } +//// } + +// @Filename: /index.mts +//// import leftPad = require("left-pad"); +//// /*start*/leftPad("", 4); + +verify.goToSourceDefinition("start", "end");