From b0552b089d5beb1eb5b0a8e85ed8ca0e596e8bd6 Mon Sep 17 00:00:00 2001 From: Andy Date: Wed, 11 Apr 2018 16:22:10 -0700 Subject: [PATCH] Don't include "/index" in import from @types even with classic resolution (#23347) --- src/services/codefixes/importFixes.ts | 12 +++++++----- .../fourslash/importNameCodeFix_types_classic.ts | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 5 deletions(-) create mode 100644 tests/cases/fourslash/importNameCodeFix_types_classic.ts diff --git a/src/services/codefixes/importFixes.ts b/src/services/codefixes/importFixes.ts index 6becea1c6d3..a8993ce0b1d 100644 --- a/src/services/codefixes/importFixes.ts +++ b/src/services/codefixes/importFixes.ts @@ -240,6 +240,7 @@ namespace ts.codefix { preferences: UserPreferences, ): ReadonlyArray { const { baseUrl, paths, rootDirs } = compilerOptions; + const moduleResolutionKind = getEmitModuleResolutionKind(compilerOptions); const addJsExtension = usesJsExtensionOnImports(sourceFile); const choicesForEachExportingModule = flatMap(moduleSymbols, ({ moduleSymbol, importKind }) => { const modulePathsGroups = getAllModulePaths(program, moduleSymbol.valueDeclaration.getSourceFile()).map(moduleFileName => { @@ -252,7 +253,7 @@ namespace ts.codefix { return [global]; } - const relativePath = removeExtensionAndIndexPostFix(getRelativePath(moduleFileName, sourceDirectory, getCanonicalFileName), compilerOptions, addJsExtension); + const relativePath = removeExtensionAndIndexPostFix(getRelativePath(moduleFileName, sourceDirectory, getCanonicalFileName), moduleResolutionKind, addJsExtension); if (!baseUrl || preferences.importModuleSpecifierPreference === "relative") { return [relativePath]; } @@ -262,7 +263,7 @@ namespace ts.codefix { return [relativePath]; } - const importRelativeToBaseUrl = removeExtensionAndIndexPostFix(relativeToBaseUrl, compilerOptions, addJsExtension); + const importRelativeToBaseUrl = removeExtensionAndIndexPostFix(relativeToBaseUrl, moduleResolutionKind, addJsExtension); if (paths) { const fromPaths = tryGetModuleNameFromPaths(removeFileExtension(relativeToBaseUrl), importRelativeToBaseUrl, paths); if (fromPaths) { @@ -390,7 +391,8 @@ namespace ts.codefix { return firstDefined(roots, unNormalizedTypeRoot => { const typeRoot = toPath(unNormalizedTypeRoot, /*basePath*/ undefined, getCanonicalFileName); if (startsWith(moduleFileName, typeRoot)) { - return removeExtensionAndIndexPostFix(moduleFileName.substring(typeRoot.length + 1), options, addJsExtension); + // For a type definition, we can strip `/index` even with classic resolution. + return removeExtensionAndIndexPostFix(moduleFileName.substring(typeRoot.length + 1), ModuleResolutionKind.NodeJs, addJsExtension); } }); } @@ -527,11 +529,11 @@ namespace ts.codefix { }); } - function removeExtensionAndIndexPostFix(fileName: string, options: CompilerOptions, addJsExtension: boolean): string { + function removeExtensionAndIndexPostFix(fileName: string, moduleResolutionKind: ModuleResolutionKind, addJsExtension: boolean): string { const noExtension = removeFileExtension(fileName); return addJsExtension ? noExtension + ".js" - : getEmitModuleResolutionKind(options) === ModuleResolutionKind.NodeJs + : moduleResolutionKind === ModuleResolutionKind.NodeJs ? removeSuffix(noExtension, "/index") : noExtension; } diff --git a/tests/cases/fourslash/importNameCodeFix_types_classic.ts b/tests/cases/fourslash/importNameCodeFix_types_classic.ts new file mode 100644 index 00000000000..b9ba463fada --- /dev/null +++ b/tests/cases/fourslash/importNameCodeFix_types_classic.ts @@ -0,0 +1,16 @@ +/// + +// @moduleResolution: classic + +// @Filename: /node_modules/@types/foo/index.d.ts +////export const xyz: number; + +// @Filename: /a.ts +////[|xyz|] + +goTo.file("/a.ts"); +verify.importFixAtPosition([ +`import { xyz } from "foo"; + +xyz` +]);