microsoft / microsoft/TypeScript

Auto-import prioritizes files alphabetically before index.ts inside a folder, ignoring the barrel

Open
#64,034 3 comments 1 reaction 3 assignees Claimed by @RyanCavanaugh View on GitHub
Needs More Info
Dominant language
Go
Stars
111k
Forks
14.3k
PR merge metrics
PR metrics pending

Description

### 🔎 Search Terms

auto-import index label:"Domain: LS: Auto-import"

### 🕗 Version & Regression Information

This changed between versions 6.0.3 and 7.0.2

VSCode version: 1.134.0
Windows 11

### ⏯ Playground Link

https://github.com/alexicum/autoimport-index-ignore/blob/main/src/index.ts

### 💻 Code

**Project structure:**

```text
src/
components/
Product/
index.ts // re‑exports from product.tsx and ProductList.tsx
product.tsx // exports Product (lowercase 'p')
ProductList.tsx // exports ProductList (uppercase 'P')
utils/
double/
double.ts // exports double (lowercase 'd')
index.ts // re‑exports from double.ts
triple/
index.ts // re‑exports from triple.ts
triple.ts // exports triple (lowercase 't')
index.ts // root file where imports are tested
```

**Code example** (src/index.ts):

```TypeScript
// Product is exported from `product.tsx` (lowercase 'p', ASCII 112)
// Since 'p' > 'i' (105), index.ts comes alphabetically first,
// so the import is correctly suggested from `./components/Product`
import { Product } from "./components/Product/index.js";

// ProductList is exported from `ProductList.tsx` (uppercase 'P', ASCII 80)
// Since 'P' < 'i' (105), ProductList.tsx comes before index.ts,
// so the language service suggests direct path `./components/Product/ProductList.js`
import { ProductList } from "./components/Product/ProductList.js";

// double is exported from `double.ts` (lowercase 'd', ASCII 100)
// Since 'd' < 'i' (105), double.ts comes before index.ts → direct path `./utils/double/double.js`
import { double } from "./utils/double/double.js";

// triple is exported from `triple.ts` (lowercase 't', ASCII 116)
// Since 't' > 'i' (105), index.ts comes first → barrel path `./utils/triple/index.js`
import { triple } from "./utils/triple/index.js";

console.log(Product, ProductList, double, triple);
```

### 🙁 Actual behavior

In the example above, the auto‑import suggestions (or the inserted imports) depend on the alphabetical order of the file names relative to index.ts.
When a file name starts with a character that has a lower ASCII code than i, the language service chooses that file instead of the barrel.
When the character has a higher code, the barrel is chosen.
This behaviour may be unexpected, since `index.ts` is typically intended to serve as the public entry point for the folder.

### 🙂 Expected behavior

Regardless of alphabetical order, if index.(ts/tsx) exists and exports the symbol, the auto‑import should always suggest the folder import (e.g., './components/Product' or './utils/double') rather than a direct path to an internal file.

### Additional information about the issue

In 6.0.3 barrel files are always ignored.

The code example for this issue is located in the same repository as the example for:
["Auto-import ignores barrel (index.ts) when the imported folder name is a prefix of the importing file name" (#64029)](https://github.com/microsoft/TypeScript/issues/64029)

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.