-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
[New] order
: add consolidateIslands
option to collapse excess spacing for aesthetically pleasing imports
#3129
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Codecov ReportAll modified and coverable lines are covered by tests ✅
Additional details and impacted files@@ Coverage Diff @@
## main #3129 +/- ##
==========================================
+ Coverage 95.51% 95.68% +0.17%
==========================================
Files 83 83
Lines 3659 3688 +29
Branches 1306 1331 +25
==========================================
+ Hits 3495 3529 +34
+ Misses 164 159 -5 ☔ View full report in Codecov by Sentry. |
…cing for aesthetically pleasing imports
02507ca
to
464fa71
Compare
16bdbf7
to
90cfd85
Compare
Xunnamius
commented
Jan 22, 2025
5afa43a
to
3c4c3f2
Compare
3c4c3f2
to
ba167f2
Compare
ba167f2
to
4f145a2
Compare
ljharb
approved these changes
Jan 31, 2025
order
: collapse excess spacing for aesthetically pleasing imports via consolidateIslands
order
: add consolidateIslands
option to collapse excess spacing for aesthetically pleasing imports
renovate bot
added a commit
to andrei-picus-tink/auto-renovate
that referenced
this pull request
Jun 22, 2025
| datasource | package | from | to | | ---------- | -------------------- | ------ | ------ | | npm | eslint-plugin-import | 2.31.0 | 2.32.0 | ## [v2.32.0](https://github.com/import-js/eslint-plugin-import/blob/HEAD/CHANGELOG.md#2320---2025-06-20) ##### Added - add \[`enforce-node-protocol-usage`] rule and `import/node-version` setting (\[[#3024](import-js/eslint-plugin-import#3024)], thanks \[[@GoldStrikeArch](https://github.com/GoldStrikeArch)] and \[[@sevenc-nanashi](https://github.com/sevenc-nanashi)]) - add TypeScript types (\[[#3097](import-js/eslint-plugin-import#3097)], thanks \[[@G-Rath](https://github.com/G-Rath)]) - \[`extensions`]: add \`pathGroupOverrides to allow enforcement decision overrides based on specifier (\[[#3105](import-js/eslint-plugin-import#3105)], thanks \[[@Xunnamius](https://github.com/Xunnamius)]) - \[`order`]: add `sortTypesGroup` option to allow intragroup sorting of type-only imports (\[[#3104](import-js/eslint-plugin-import#3104)], thanks \[[@Xunnamius](https://github.com/Xunnamius)]) - \[`order`]: add `newlines-between-types` option to control intragroup sorting of type-only imports (\[[#3127](import-js/eslint-plugin-import#3127)], thanks \[[@Xunnamius](https://github.com/Xunnamius)]) - \[`order`]: add `consolidateIslands` option to collapse excess spacing for aesthetically pleasing imports (\[[#3129](import-js/eslint-plugin-import#3129)], thanks \[[@Xunnamius](https://github.com/Xunnamius)]) ##### Fixed - \[`no-unused-modules`]: provide more meaningful error message when no .eslintrc is present (\[[#3116](import-js/eslint-plugin-import#3116)], thanks \[[@michaelfaith](https://github.com/michaelfaith)]) - configs: added missing name attribute for eslint config inspector (\[[#3151](import-js/eslint-plugin-import#3151)], thanks \[[@NishargShah](https://github.com/NishargShah)]) - \[`order`]: ensure arcane imports do not cause undefined behavior (\[[#3128](import-js/eslint-plugin-import#3128)], thanks \[[@Xunnamius](https://github.com/Xunnamius)]) - \[`order`]: resolve undefined property access issue when using `named` ordering (\[[#3166](import-js/eslint-plugin-import#3166)], thanks \[[@Xunnamius](https://github.com/Xunnamius)]) - \[`enforce-node-protocol-usage`]: avoid a crash with some TS code (\[[#3173](import-js/eslint-plugin-import#3173)], thanks \[[@ljharb](https://github.com/ljharb)]) - \[`order`]: codify invariants from docs into config schema (\[[#3152](import-js/eslint-plugin-import#3152)], thanks \[[@Xunnamius](https://github.com/Xunnamius)]) ##### Changed - \[Docs] \[`extensions`], \[`order`]: improve documentation (\[[#3106](import-js/eslint-plugin-import#3106)], thanks \[[@Xunnamius](https://github.com/Xunnamius)]) - \[Docs] add flat config guide for using `tseslint.config()` (\[[#3125](import-js/eslint-plugin-import#3125)], thanks \[[@lnuvy](https://github.com/lnuvy)]) - \[Docs] add missing comma (\[[#3122](import-js/eslint-plugin-import#3122)], thanks \[[@RyanGst](https://github.com/RyanGst)]) - \[readme] Update flatConfig example to include typescript config (\[[#3138](import-js/eslint-plugin-import#3138)], thanks \[[@intellix](https://github.com/intellix)]) - \[Refactor] \[`order`]: remove unnecessary negative check (\[[#3167](import-js/eslint-plugin-import#3167)], thanks \[[@JounQin](https://github.com/JounQin)]) - \[Docs] \[`no-unused-modules`]: add missing double quote (\[[#3191](import-js/eslint-plugin-import#3191)], thanks \[[@albertpastrana](https://github.com/albertpastrana)]) - \[Docs] `no-restricted-paths`: clarify wording and fix errors (\[[#3172](import-js/eslint-plugin-import#3172)], thanks \[[@greim](https://github.com/greim)])
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Depends on #3128
This PR implements in
import/order
: a new option enabling the manipulation/consolidation of newlines around imports.A demo package containing this feature is temporarily available for easy testing:
Collapse excess spacing for aesthetically pleasing imports
This is implemented via
consolidateIslands
. The proposed documentation corresponding to this new feature can be previewed here.Example
Given this code (which could be the output of a previous
--fix
pass):And the following settings, the rule check will pass:
However, when given the following instead, the rule check will fail:
{ "newlines-between": "always-and-inside-groups", + "consolidateIslands": "inside-groups" }
With
--fix
yielding:Note how the intragroup "islands" of grouped single-line imports, as well as multi-line imports, are surrounded by new lines.
Essentially, I was looking for a
newlines-between
-like setting somewhere between"never"
and"always-and-inside-groups"
. I want newlines separatinggroups
/pathGroups
imports from one another (like"always-and-inside-groups"
), newlines separating imports that span multiple lines from other imports (this is the new thing), and any remaining newlines deleted or "consolidated" (like"never"
). The example above demonstrates this use case.Right now, this is achievable with
newlines-between
set to"always-and-inside-groups"
if you add additional newlines around multi-line imports to every file by hand. The goal ofconsolidateIslands
is to alloweslint --fix
to take care of the tedium in a backward-compatible way.There was a slight complication with
consolidateIslands
though: while testing across a few mid-sized repos, I discovered my naive implementation caused a conflict when enabled alongsidesortTypesAmongThemselves: true
,newlines-between: "always-and-inside-groups"
, andnewlines-between-types: "never"
... and then only when a normal import was followed by a multi-line type-only import. This conflict makes sense, sincenewlines-between-types: "never"
wants no newlines ever and demands no newline separate type-only imports from normal imports (since, currently,newlines-between-types
governs that space), yetconsolidateIslands
demands a newline separate all multi-line imports from other imports.To solve this, the current implementation has
newlines-between-types
yield toconsolidateIslands
whenever they conflict. I've also added a test to catch any regressions around this edge case.