diff --git a/src/services/codefixes/importFixes.ts b/src/services/codefixes/importFixes.ts index 6284cb6775569..64010a69af551 100644 --- a/src/services/codefixes/importFixes.ts +++ b/src/services/codefixes/importFixes.ts @@ -678,11 +678,17 @@ namespace ts.codefix { if (a.kind !== ImportFixKind.UseNamespace && b.kind !== ImportFixKind.UseNamespace) { return compareBooleans(allowsImportingSpecifier(b.moduleSpecifier), allowsImportingSpecifier(a.moduleSpecifier)) || compareNodeCoreModuleSpecifiers(a.moduleSpecifier, b.moduleSpecifier, importingFile, program) + || compareBooleans(isOnlyDotsAndSlashes(a.moduleSpecifier), isOnlyDotsAndSlashes(b.moduleSpecifier)) || compareNumberOfDirectorySeparators(a.moduleSpecifier, b.moduleSpecifier); } return Comparison.EqualTo; } + const notDotOrSlashPattern = /[^.\/]/; + function isOnlyDotsAndSlashes(path: string) { + return !notDotOrSlashPattern.test(path); + } + function compareNodeCoreModuleSpecifiers(a: string, b: string, importingFile: SourceFile, program: Program): Comparison { if (startsWith(a, "node:") && !startsWith(b, "node:")) return shouldUseUriStyleNodeCoreModules(importingFile, program) ? Comparison.LessThan : Comparison.GreaterThan; if (startsWith(b, "node:") && !startsWith(a, "node:")) return shouldUseUriStyleNodeCoreModules(importingFile, program) ? Comparison.GreaterThan : Comparison.LessThan; diff --git a/tests/cases/fourslash/importNameCodeFix_barrelExport.ts b/tests/cases/fourslash/importNameCodeFix_barrelExport.ts new file mode 100644 index 0000000000000..de5fe32726944 --- /dev/null +++ b/tests/cases/fourslash/importNameCodeFix_barrelExport.ts @@ -0,0 +1,29 @@ +/// + +// @module: commonjs + +// @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", ".."]);