Skip to content

feat(formatter/sort_imports)!: Change default groups order#19427

Merged
graphite-app[bot] merged 1 commit intomainfrom
02-16-feat_formatter_sort_imports_change_default_groups_order
Feb 16, 2026
Merged

feat(formatter/sort_imports)!: Change default groups order#19427
graphite-app[bot] merged 1 commit intomainfrom
02-16-feat_formatter_sort_imports_change_default_groups_order

Conversation

@leaysgur
Copy link
Member

@leaysgur leaysgur commented Feb 16, 2026

Thank you for your feedback in #18688 .

With the current highest number of 🆙 and 👍, we plan to make this setting the new default.

[
  "builtin",
  ["external", "subpath"],
  "internal",
  ["parent", "sibling", "index"],
  "style",
  "side-effect",
  "side-effect-style",
  "unknown"
]

However, there are two modifications:

  • Change subpath from external equivalent to internal equivalent
    • (This received the most upvotes!, and) I believe most use cases are for internal aliases
  • Do not include side_effect
    • Including side_effect in groups causes its position to shift, regardless of the sortSideEffects option (whether to sort by side_effect A vs side_effect B)
    • While I expect few cases where this would cause problems, I will err on the side of caution

This is the final form.

[
  "builtin",
  "external",
  ["internal", "subpath"],
  ["parent", "sibling", "index"],
  "style",
  "unknown"
]

Copilot AI review requested due to automatic review settings February 16, 2026 06:11
@leaysgur leaysgur requested a review from Dunqing as a code owner February 16, 2026 06:11
Copy link
Member Author


How to use the Graphite Merge Queue

Add either label to this PR to merge it via the merge queue:

  • 0-merge - adds this PR to the back of the merge queue
  • hotfix - for urgent hot fixes, skip the queue and merge this PR next

You must have a Graphite account in order to use the merge queue. Sign up using this link.

An organization admin has enabled the Graphite Merge Queue in this repository.

Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue.

This stack of pull requests is managed by Graphite. Learn more about stacking.

@github-actions github-actions bot added A-formatter Area - Formatter C-enhancement Category - New feature or request labels Feb 16, 2026
@leaysgur
Copy link
Member Author

leaysgur commented Feb 16, 2026

Oxfmt Ecosystem CI

suite oxfmt@latest 440c74d branch
monkeytypegame/monkeytype
eggjs/egg
formatjs/formatjs
cnpm/cnpmcore
actualbudget/actual
vuejs/core
npmx-dev/npmx.dev
dyad-sh/dyad
vercel/turborepo
fastify/fastify-vite
getsentry/sentry-javascript
tale/headplane
vuejs/pinia
AmanVarshney01/create-better-t-stack
Comfy-Org/ComfyUI_frontend
openclaw/openclaw
huggingface/huggingface.js
fuma-nama/fumadocs
lichess-org/lila
aidenybai/react-grab
rolldown/rolldown

@leaysgur leaysgur changed the title feat(formatter/sort_imports)!: Change default groups order feat(formatter/sort_imports)!: Change default groups order Feb 16, 2026
@codspeed-hq
Copy link

codspeed-hq bot commented Feb 16, 2026

Merging this PR will not alter performance

✅ 47 untouched benchmarks
⏩ 3 skipped benchmarks1


Comparing 02-16-feat_formatter_sort_imports_change_default_groups_order (b71a639) with main (e4a2886)

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR changes the default import groups order for the sort imports feature, moving from a type-vs-value based grouping to a location-based grouping policy.

Changes:

  • Changed default groups from separating type and value imports to grouping by import location only (builtin → external → internal/subpath → parent/sibling/index → style)
  • Moved subpath imports from external-equivalent to internal-equivalent grouping
  • Excluded side_effect from default groups to prevent breaking code that depends on side-effect execution order

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 2 comments.

File Description
crates/oxc_formatter/src/ir_transform/sort_imports/options.rs Updated default_groups() to return new location-based groups instead of type/value-based groups, and improved comment clarity
crates/oxc_formatter/tests/ir_transform/sort_imports/groups.rs Updated test expectations to reflect new grouping behavior (contains critical bugs in expected output)
crates/oxc_formatter/tests/ir_transform/sort_imports/basic.rs Updated test expectations to show type and value imports mixed within groups, removed extraneous blank lines between same-group imports

@leaysgur leaysgur force-pushed the 02-16-feat_formatter_sort_imports_change_default_groups_order branch from 440c74d to b71a639 Compare February 16, 2026 06:31
@leaysgur
Copy link
Member Author

leaysgur commented Feb 16, 2026

From oxfmt ecosystem-ci, these repos are using experimentalSortImports:

  • AmanVarshney01/create-better-t-stack
    • With default groups, affected by this PR
  • openclaw
    • With default groups, affected by this PR
  • headplane
    • With default groups, affected by this PR
  • cnpmcore
    • Using their own groups, not affected by this PR
  • eggjs/egg
    • Using their own groups, not affected by this PR
  • monkeytype
    • Using their own groups, not affected by this PR
  • actual
    • Using their own groups and customGroups, not affected by this PR

No one is using subpath. 🥲

@Boshen Boshen added the 0-merge Merge with Graphite Merge Queue label Feb 16, 2026
Copy link
Member

Boshen commented Feb 16, 2026

Merge activity

Thank you for your feedback in #18688 .

With the current highest number of 🆙 and 👍, we plan to make this setting the new default.

```
[
  "builtin",
  ["external", "subpath"],
  "internal",
  ["parent", "sibling", "index"],
  "style",
  "side-effect",
  "side-effect-style",
  "unknown"
]
```

However, there are two modifications:

- Change `subpath` from `external` equivalent to `internal` equivalent
  - (This received the most upvotes!, and) I believe most use cases are for `internal` aliases
- Do not include `side_effect`
  - Including `side_effect` in `groups` causes its position to shift, regardless of the `sortSideEffects` option (whether to sort by side_effect A vs side_effect B)
  - While I expect few cases where this would cause problems, I will err on the side of caution

This is the final form.

```
[
  "builtin",
  "external",
  ["internal", "subpath"],
  ["parent", "sibling", "index"],
  "style",
  "unknown"
]
```
@graphite-app graphite-app bot force-pushed the 02-16-feat_formatter_sort_imports_change_default_groups_order branch from b71a639 to 00135b5 Compare February 16, 2026 08:19
@graphite-app graphite-app bot merged commit 00135b5 into main Feb 16, 2026
21 checks passed
@graphite-app graphite-app bot deleted the 02-16-feat_formatter_sort_imports_change_default_groups_order branch February 16, 2026 08:25
camc314 pushed a commit that referenced this pull request Feb 16, 2026
# Oxlint
### 💥 BREAKING CHANGES

- 7711821 oxlint: [**BREAKING**] `no-shadow-restricted-names` report
`globalThis` by default (#19407) (Sysix)

### 🚀 Features

- ce1baa0 linter: Implement eslint/no-shadow (#18979) (Víctor Fernández)
- 7a333c1 linter: Support dynamic configs via CLI arguments (#19384)
(camc314)
- 1bf569b linter: Implement typescript/unified-signatures (#19375)
(camc314)
- 6562a9b linter: Implement typescript/parameter-properties (#19374)
(camc314)
- 94d8d74 linter: Implement typescript/no-use-before-define (#19373)
(camc314)
- 80b002a linter: Implement fixer for unicorn/no-instanceof-builtins
(#19371) (camc314)
- 5c3784b linter: Implement eslint/no-unmodified-loop-condition (#19341)
(Vincent R)
- cc00a59 linter/const-comparisons: Improve diagnostics when mixing
logical/comparison operators (#19370) (camc314)
- ea2c401 linter: Add support for no constructed context values (#18067)
(Jovi De Croock)
- f2440eb linter: Mark eslint/no-return-assign as having no fixer
(#19327) (camc314)
- 8588670 linter/unicorn: Implement suggestion for
`unicorn/no-await-in-promise-methods` rule (#19359) (Mikhail Baev)
- f0af965 linter: Move `jsx-a11y/no-static-element-interactions` rule
out of the nursery. (#19355) (connorshea)
- be0ce50 linter/tsgolint: Add support for labeled ranges in tsgolint
diagnostics (#19201) (camchenry)
- b5bc900 linter: Implement fixer for unicorn/no-new-buffer (#19326)
(camc314)
- 1612932 linter: Add typescript/no-unnecessary-condition (#19130)
(camc314)
- 37dc6c5 linter: Implement fixer for unicorn/prefer-includes (#19323)
(camc314)

### 🐛 Bug Fixes

- c2b1870 linter: Enforce config options for `react/forbid-dom-props`
rule. (#19387) (connorshea)
- 3d24e44 linter: Honor no-empty-function allow getters/setters for
object literals (#19393) (camc314)
- bbced8d linter: Enforce config options for `eslint/no-empty-function`
rule, improve docs. (#19390) (connorshea)
- 6bc8aec linter: Fix the behavior of `import/extensions` rule for a
file that has multiple extensions. (#18919) (connorshea)
- c62a295 linter/img-redundant-alt: Enforce whole-word matching for
redundant alt text (#19367) (camc314)
- 98956fe linter/describe-function-title: Skip autofix for type-only
imports (#19329) (camc314)
- d96d26d linter/plugins: Provide `parser.version` (#19364)
(overlookmotel)
- 81f0039 linter_codegen: Compute rule IDs relative to previous rule
(#19350) (camchenry)
- b7ef0a8 linter/consistent-indexed-object-style: Avoid unsafe Record
conversions for mapped types (#19320) (camc314)

### 📚 Documentation

- 3a6059f linter: Improve docs for `eslint/require-await` rule. (#19361)
(connorshea)
- b069269 linter/plugins: Add comment about deprecated `ScopeManager`
methods (#19363) (overlookmotel)
- 2d8aaf9 linter: Disable formatting for `eslint/no-unsafe-negation`
examples. (#19347) (connorshea)
- fb87806 linter: Ensure that we do not auto-format the docs for
`unicorn/number-literal-case` rule. (#19346) (connorshea)
- 8d3ae27 linter/typescript: Skip docs for deprecated type aware rule
options (#19324) (camc314)
# Oxfmt
### 💥 BREAKING CHANGES

- 00135b5 formatter/sort_imports: [**BREAKING**] Change default `groups`
order (#19427) (leaysgur)
- 9c34f72 formatter/sort_imports: [**BREAKING**] Report invalid group
name with renaming `side-effect` > `side_effect` (#19416) (leaysgur)

### 🚀 Features

- 4baebef formatter/sort_imports: Support `{ newlinesBetween: bool }`
inside `groups` (#19358) (leaysgur)
- d1c2fb6 formatter/sort_imports: Support `customGroups`
attributes(`selector` and `modifiers`) (#19356) (leaysgur)

### 🐛 Bug Fixes

- f084ea6 oxfmt: Explicitly pass `process.env` for the forked process
(#19380) (Long Ho)
- 2bc7a14 formatter: Arrow function body incorrectly broken when return
type has comment (#19368) (Dunqing)
- 90ec3d2 oxfmt: Update tailwind plugin which fixes crash on non-js file
(#19353) (leaysgur)
- e9c5b1e formatter: Treat `PrivateFieldExpression` as simple call
argument (#19348) (Dunqing)
- 80643d5 formatter: Match Prettier union indentation with leading
comments (#19271) (Dunqing)

### ⚡ Performance

- c169c77 syntax: Optimize `is_identifier_name_patched` (#19386)
(sapphi-red)
OskarLebuda pushed a commit to OskarLebuda/oxc that referenced this pull request Feb 17, 2026
…ject#19427)

Thank you for your feedback in oxc-project#18688 .

With the current highest number of 🆙 and 👍, we plan to make this setting the new default.

```
[
  "builtin",
  ["external", "subpath"],
  "internal",
  ["parent", "sibling", "index"],
  "style",
  "side-effect",
  "side-effect-style",
  "unknown"
]
```

However, there are two modifications:

- Change `subpath` from `external` equivalent to `internal` equivalent
  - (This received the most upvotes!, and) I believe most use cases are for `internal` aliases
- Do not include `side_effect`
  - Including `side_effect` in `groups` causes its position to shift, regardless of the `sortSideEffects` option (whether to sort by side_effect A vs side_effect B)
  - While I expect few cases where this would cause problems, I will err on the side of caution

This is the final form.

```
[
  "builtin",
  "external",
  ["internal", "subpath"],
  ["parent", "sibling", "index"],
  "style",
  "unknown"
]
```
OskarLebuda pushed a commit to OskarLebuda/oxc that referenced this pull request Feb 17, 2026
# Oxlint
### 💥 BREAKING CHANGES

- 7711821 oxlint: [**BREAKING**] `no-shadow-restricted-names` report
`globalThis` by default (oxc-project#19407) (Sysix)

### 🚀 Features

- ce1baa0 linter: Implement eslint/no-shadow (oxc-project#18979) (Víctor Fernández)
- 7a333c1 linter: Support dynamic configs via CLI arguments (oxc-project#19384)
(camc314)
- 1bf569b linter: Implement typescript/unified-signatures (oxc-project#19375)
(camc314)
- 6562a9b linter: Implement typescript/parameter-properties (oxc-project#19374)
(camc314)
- 94d8d74 linter: Implement typescript/no-use-before-define (oxc-project#19373)
(camc314)
- 80b002a linter: Implement fixer for unicorn/no-instanceof-builtins
(oxc-project#19371) (camc314)
- 5c3784b linter: Implement eslint/no-unmodified-loop-condition (oxc-project#19341)
(Vincent R)
- cc00a59 linter/const-comparisons: Improve diagnostics when mixing
logical/comparison operators (oxc-project#19370) (camc314)
- ea2c401 linter: Add support for no constructed context values (oxc-project#18067)
(Jovi De Croock)
- f2440eb linter: Mark eslint/no-return-assign as having no fixer
(oxc-project#19327) (camc314)
- 8588670 linter/unicorn: Implement suggestion for
`unicorn/no-await-in-promise-methods` rule (oxc-project#19359) (Mikhail Baev)
- f0af965 linter: Move `jsx-a11y/no-static-element-interactions` rule
out of the nursery. (oxc-project#19355) (connorshea)
- be0ce50 linter/tsgolint: Add support for labeled ranges in tsgolint
diagnostics (oxc-project#19201) (camchenry)
- b5bc900 linter: Implement fixer for unicorn/no-new-buffer (oxc-project#19326)
(camc314)
- 1612932 linter: Add typescript/no-unnecessary-condition (oxc-project#19130)
(camc314)
- 37dc6c5 linter: Implement fixer for unicorn/prefer-includes (oxc-project#19323)
(camc314)

### 🐛 Bug Fixes

- c2b1870 linter: Enforce config options for `react/forbid-dom-props`
rule. (oxc-project#19387) (connorshea)
- 3d24e44 linter: Honor no-empty-function allow getters/setters for
object literals (oxc-project#19393) (camc314)
- bbced8d linter: Enforce config options for `eslint/no-empty-function`
rule, improve docs. (oxc-project#19390) (connorshea)
- 6bc8aec linter: Fix the behavior of `import/extensions` rule for a
file that has multiple extensions. (oxc-project#18919) (connorshea)
- c62a295 linter/img-redundant-alt: Enforce whole-word matching for
redundant alt text (oxc-project#19367) (camc314)
- 98956fe linter/describe-function-title: Skip autofix for type-only
imports (oxc-project#19329) (camc314)
- d96d26d linter/plugins: Provide `parser.version` (oxc-project#19364)
(overlookmotel)
- 81f0039 linter_codegen: Compute rule IDs relative to previous rule
(oxc-project#19350) (camchenry)
- b7ef0a8 linter/consistent-indexed-object-style: Avoid unsafe Record
conversions for mapped types (oxc-project#19320) (camc314)

### 📚 Documentation

- 3a6059f linter: Improve docs for `eslint/require-await` rule. (oxc-project#19361)
(connorshea)
- b069269 linter/plugins: Add comment about deprecated `ScopeManager`
methods (oxc-project#19363) (overlookmotel)
- 2d8aaf9 linter: Disable formatting for `eslint/no-unsafe-negation`
examples. (oxc-project#19347) (connorshea)
- fb87806 linter: Ensure that we do not auto-format the docs for
`unicorn/number-literal-case` rule. (oxc-project#19346) (connorshea)
- 8d3ae27 linter/typescript: Skip docs for deprecated type aware rule
options (oxc-project#19324) (camc314)
# Oxfmt
### 💥 BREAKING CHANGES

- 00135b5 formatter/sort_imports: [**BREAKING**] Change default `groups`
order (oxc-project#19427) (leaysgur)
- 9c34f72 formatter/sort_imports: [**BREAKING**] Report invalid group
name with renaming `side-effect` > `side_effect` (oxc-project#19416) (leaysgur)

### 🚀 Features

- 4baebef formatter/sort_imports: Support `{ newlinesBetween: bool }`
inside `groups` (oxc-project#19358) (leaysgur)
- d1c2fb6 formatter/sort_imports: Support `customGroups`
attributes(`selector` and `modifiers`) (oxc-project#19356) (leaysgur)

### 🐛 Bug Fixes

- f084ea6 oxfmt: Explicitly pass `process.env` for the forked process
(oxc-project#19380) (Long Ho)
- 2bc7a14 formatter: Arrow function body incorrectly broken when return
type has comment (oxc-project#19368) (Dunqing)
- 90ec3d2 oxfmt: Update tailwind plugin which fixes crash on non-js file
(oxc-project#19353) (leaysgur)
- e9c5b1e formatter: Treat `PrivateFieldExpression` as simple call
argument (oxc-project#19348) (Dunqing)
- 80643d5 formatter: Match Prettier union indentation with leading
comments (oxc-project#19271) (Dunqing)

### ⚡ Performance

- c169c77 syntax: Optimize `is_identifier_name_patched` (oxc-project#19386)
(sapphi-red)
@webwea
Copy link

webwea commented Feb 18, 2026

@leaysgur
Copy link
Member Author

Ah, indeed! Thank you, I will update.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

0-merge Merge with Graphite Merge Queue A-formatter Area - Formatter C-enhancement Category - New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

Comments