Skip to content

Commit 76cf092

Browse files
authored
Expand anti-parent-barrel auto-import heuristic to all moduleResolution modes (#57342)
1 parent 10a3872 commit 76cf092

File tree

3 files changed

+62
-4
lines changed

3 files changed

+62
-4
lines changed

src/services/codefixes/importFixes.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,6 @@ import {
9797
mapDefined,
9898
memoizeOne,
9999
ModuleKind,
100-
ModuleResolutionKind,
101100
moduleResolutionUsesNodeModules,
102101
moduleSpecifiers,
103102
MultiMap,
@@ -1054,13 +1053,11 @@ function compareModuleSpecifiers(
10541053
// This is a simple heuristic to try to avoid creating an import cycle with a barrel re-export.
10551054
// E.g., do not `import { Foo } from ".."` when you could `import { Foo } from "../Foo"`.
10561055
// This can produce false positives or negatives if re-exports cross into sibling directories
1057-
// (e.g. `export * from "../whatever"`) or are not named "index" (we don't even try to consider
1058-
// this if we're in a resolution mode where you can't drop trailing "/index" from paths).
1056+
// (e.g. `export * from "../whatever"`) or are not named "index".
10591057
function isFixPossiblyReExportingImportingFile(fix: ImportFixWithModuleSpecifier, importingFile: SourceFile, compilerOptions: CompilerOptions, toPath: (fileName: string) => Path): boolean {
10601058
if (
10611059
fix.isReExport &&
10621060
fix.exportInfo?.moduleFileName &&
1063-
getEmitModuleResolutionKind(compilerOptions) === ModuleResolutionKind.Node10 &&
10641061
isIndexFileName(fix.exportInfo.moduleFileName)
10651062
) {
10661063
const reExportDir = toPath(getDirectoryPath(fix.exportInfo.moduleFileName));
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
// @module: preserve
4+
// @moduleResolution: bundler
5+
6+
// @Filename: /foo/a.ts
7+
//// export const A = 0;
8+
9+
// @Filename: /foo/b.ts
10+
//// export {};
11+
//// A/*sibling*/
12+
13+
// @Filename: /foo/index.ts
14+
//// export * from "./a";
15+
//// export * from "./b";
16+
17+
// @Filename: /index.ts
18+
//// export * from "./foo";
19+
//// export * from "./src";
20+
21+
// @Filename: /src/a.ts
22+
//// export {};
23+
//// A/*parent*/
24+
25+
// @Filename: /src/index.ts
26+
//// export * from "./a";
27+
28+
// Module specifiers made up of only "." and ".." components are deprioritized
29+
verify.importFixModuleSpecifiers("sibling", ["./a", ".", ".."]);
30+
verify.importFixModuleSpecifiers("parent", ["../foo", "../foo/a", ".."]);
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
// @module: nodenext
4+
5+
// @Filename: /package.json
6+
//// { "type": "module" }
7+
8+
// @Filename: /foo/a.ts
9+
//// export const A = 0;
10+
11+
// @Filename: /foo/b.ts
12+
//// export {};
13+
//// A/*sibling*/
14+
15+
// @Filename: /foo/index.ts
16+
//// export * from "./a.js";
17+
//// export * from "./b.js";
18+
19+
// @Filename: /index.ts
20+
//// export * from "./foo/index.js";
21+
//// export * from "./src/index.js";
22+
23+
// @Filename: /src/a.ts
24+
//// export {};
25+
//// A/*parent*/
26+
27+
// @Filename: /src/index.ts
28+
//// export * from "./a.js";
29+
30+
verify.importFixModuleSpecifiers("sibling", ["./a.js", "./index.js", "../index.js"]);
31+
verify.importFixModuleSpecifiers("parent", ["../foo/a.js", "../foo/index.js", "../index.js"]);

0 commit comments

Comments
 (0)