From 8279a89b74e6a48aeced0b5bca8c83606fcb697f Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Thu, 8 Feb 2024 08:59:43 -0800 Subject: [PATCH 1/2] Expand anti-parent-barrel auto-import heuristic to all moduleResolution modes --- src/services/codefixes/importFixes.ts | 4 +-- .../importNameCodeFix_barrelExport4.ts | 30 ++++++++++++++++++ .../importNameCodeFix_barrelExport5.ts | 31 +++++++++++++++++++ 3 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 tests/cases/fourslash/importNameCodeFix_barrelExport4.ts create mode 100644 tests/cases/fourslash/importNameCodeFix_barrelExport5.ts diff --git a/src/services/codefixes/importFixes.ts b/src/services/codefixes/importFixes.ts index a634ac334a02f..747b8f5a8bd0a 100644 --- a/src/services/codefixes/importFixes.ts +++ b/src/services/codefixes/importFixes.ts @@ -1054,13 +1054,11 @@ function compareModuleSpecifiers( // This is a simple heuristic to try to avoid creating an import cycle with a barrel re-export. // E.g., do not `import { Foo } from ".."` when you could `import { Foo } from "../Foo"`. // This can produce false positives or negatives if re-exports cross into sibling directories -// (e.g. `export * from "../whatever"`) or are not named "index" (we don't even try to consider -// this if we're in a resolution mode where you can't drop trailing "/index" from paths). +// (e.g. `export * from "../whatever"`) or are not named "index". function isFixPossiblyReExportingImportingFile(fix: ImportFixWithModuleSpecifier, importingFile: SourceFile, compilerOptions: CompilerOptions, toPath: (fileName: string) => Path): boolean { if ( fix.isReExport && fix.exportInfo?.moduleFileName && - getEmitModuleResolutionKind(compilerOptions) === ModuleResolutionKind.Node10 && isIndexFileName(fix.exportInfo.moduleFileName) ) { const reExportDir = toPath(getDirectoryPath(fix.exportInfo.moduleFileName)); diff --git a/tests/cases/fourslash/importNameCodeFix_barrelExport4.ts b/tests/cases/fourslash/importNameCodeFix_barrelExport4.ts new file mode 100644 index 0000000000000..493a8ae7718a9 --- /dev/null +++ b/tests/cases/fourslash/importNameCodeFix_barrelExport4.ts @@ -0,0 +1,30 @@ +/// + +// @module: preserve +// @moduleResolution: bundler + +// @Filename: /foo/a.ts +//// export const A = 0; + +// @Filename: /foo/b.ts +//// export {}; +//// A/*sibling*/ + +// @Filename: /foo/index.ts +//// export * from "./a"; +//// export * from "./b"; + +// @Filename: /index.ts +//// export * from "./foo"; +//// export * from "./src"; + +// @Filename: /src/a.ts +//// export {}; +//// A/*parent*/ + +// @Filename: /src/index.ts +//// export * from "./a"; + +// Module specifiers made up of only "." and ".." components are deprioritized +verify.importFixModuleSpecifiers("sibling", ["./a", ".", ".."]); +verify.importFixModuleSpecifiers("parent", ["../foo", "../foo/a", ".."]); \ No newline at end of file diff --git a/tests/cases/fourslash/importNameCodeFix_barrelExport5.ts b/tests/cases/fourslash/importNameCodeFix_barrelExport5.ts new file mode 100644 index 0000000000000..465f96c8b9f68 --- /dev/null +++ b/tests/cases/fourslash/importNameCodeFix_barrelExport5.ts @@ -0,0 +1,31 @@ +/// + +// @module: nodenext + +// @Filename: /package.json +//// { "type": "module" } + +// @Filename: /foo/a.ts +//// export const A = 0; + +// @Filename: /foo/b.ts +//// export {}; +//// A/*sibling*/ + +// @Filename: /foo/index.ts +//// export * from "./a.js"; +//// export * from "./b.js"; + +// @Filename: /index.ts +//// export * from "./foo/index.js"; +//// export * from "./src/index.js"; + +// @Filename: /src/a.ts +//// export {}; +//// A/*parent*/ + +// @Filename: /src/index.ts +//// export * from "./a.js"; + +verify.importFixModuleSpecifiers("sibling", ["./a.js", "./index.js", "../index.js"]); +verify.importFixModuleSpecifiers("parent", ["../foo/a.js", "../foo/index.js", "../index.js"]); \ No newline at end of file From c93dad186786253249175022d270f6edff5c3967 Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Thu, 8 Feb 2024 09:01:58 -0800 Subject: [PATCH 2/2] Lint --- src/services/codefixes/importFixes.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/services/codefixes/importFixes.ts b/src/services/codefixes/importFixes.ts index 747b8f5a8bd0a..f6e192dc4b9a0 100644 --- a/src/services/codefixes/importFixes.ts +++ b/src/services/codefixes/importFixes.ts @@ -97,7 +97,6 @@ import { mapDefined, memoizeOne, ModuleKind, - ModuleResolutionKind, moduleResolutionUsesNodeModules, moduleSpecifiers, MultiMap,