Skip to content
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

[New] order: add distinctGroup option #2395

Merged
merged 1 commit into from Aug 26, 2022
Merged

[New] order: add distinctGroup option #2395

merged 1 commit into from Aug 26, 2022

Conversation

hyperupcall
Copy link
Contributor

@hyperupcall hyperupcall commented Mar 3, 2022

Haiii~!,

This PR aims to close #2292. It implements what is proposed

I'll add that this functionality is really useful for emulating the behavior of TSLint's native ordered-imports option. This is needed for a PR I've made for tslint-to-eslint-config.

In the linked issue:

It seems reasonable to allow a custom pathGroup to be able to opt out of having a newline inserted around it, but I'm not sure what that schema would look like

I did a first pass implementation that seemed good - lemmie know if I need to change anything

Before this gets merged, I would like to add several more tests to ensure everything is working OK - I opened this PR hopefully for some initial feedback

Copy link
Member

@ljharb ljharb left a comment

Choose a reason for hiding this comment

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

Looks pretty good!

src/rules/order.js Outdated Show resolved Hide resolved
src/rules/order.js Outdated Show resolved Hide resolved
@LSH0924
Copy link

LSH0924 commented Apr 22, 2022

hi there.
This is exactly the function I am looking for. is this draft still alive?

@hyperupcall
Copy link
Contributor Author

hyperupcall commented Apr 28, 2022

@LSH0924 When I last made an update, I think there were issues with for example alphabetization not working correctly somehow. I don't remember the specifics, but I've been meaning to test it again and see if there is an actual issue or I was just tripping. I'm going to give it another go today or tomorrow, but if there is an issue and I'm not able to fix it this week I'm probably going to close this issue and leave it up to somebody else to continue from here

EDIT: I have identified the issue - my original proposed changes didn't actually implement the feature. I believe I have found the correct implementation - I'll publish my changes very soon after some cleanup

@ljharb
Copy link
Member

ljharb commented Apr 28, 2022

@hyperupcall thanks! in either case, please do not close the PR; others can update it later instead.

@hyperupcall
Copy link
Contributor Author

hyperupcall commented Apr 29, 2022

Okay so the feature has been implemented, but on further thought, I think it might be better to fix the original issue in a different way. The original feature request (and mine too) was/is

How can I get a certain import to customly get ordered within its group?

Within the implementation, the imports are ordered within its group. The catch is that patterns that match a particular pathGroup.pattern create a new group. As I understand it, these new groups always have a decimal rank value. But, this doesn't intuitively make sense because the pathGroup.position property doesn't imply a new group is created, only that it is ordered within its own pathGroup.group

The noInsertNewline property partially solves this because it allows for manually disabling newlines and making it appear that everything works. But I have found that it is quite hard to get the matching behavior in various situations (possibly impossible), and it requires extra effort

I propose an additional property called something like pathGroupsNaturalNewlines - it will automatically create newlines the way that makes sense. Moreover, modifications to pathGroups appear to not create an extra group, Below is a demonstration of the current implementation

Here is what a file would currently look like

file.ts

import A from "Bar";
import B from "baz";
import b from "Foo";

import J from ".";

import F from "..";
import D from "../";

import Z from "../Bar";
import O from "../baz";
import Z from "../Foo";

import L from "./Bar";
import P from "./baz";
import L from "./Foo";

This is what the same file would look like if pathGroupsNaturalNewlines behaves as is described and is true:

file.ts

import A from "Bar";
import B from "baz";
import b from "Foo";

import J from ".";
import F from "..";
import D from "../";
import Z from "../Bar";
import O from "../baz";
import Z from "../Foo";

import L from "./Bar";
import P from "./baz";
import L from "./Foo";

Configuration:

.eslintrc.json
"pathGroupsExcludedImportTypes": [],
"pathGroupsNaturalNewlines": true,
"pathGroups": [
    {
        "pattern": "./",
        "patternOptions": {
            "nocomment": true,
            "dot": true
        },
        "group": "sibling",
        "position": "before"
    },
    {
        "pattern": ".",
        "patternOptions": {
            "nocomment": true,
            "dot": true
        },
        "group": "parent",
        "position": "before"
    },
    {
        "pattern": "..",
        "patternOptions": {
            "nocomment": true,
            "dot": true
        },
        "group": "parent",
        "position": "before"
    },
    {
        "pattern": "../",
        "patternOptions": {
            "nocomment": true,
            "dot": true
        },
        "group": "parent",
        "position": "before"
    }
]

If pathGroupsNaturalNewlines solves everyone's use cases, then it might only be necessary to implement that and not go with noInsertNewline after all. @LSH0924 @thany would either of you still have a need for noInsertNewline if pathGroupsNaturalNewlines exists?

Thoughts?

Once we decide what to do, I'll remove the implementations we don't need (if any) and add the necessary documentation and add actual tests

@codecov
Copy link

codecov bot commented Aug 13, 2022

Codecov Report

Merging #2395 (80e838a) into main (a8781f7) will increase coverage by 0.01%.
The diff coverage is 100.00%.

❗ Current head 80e838a differs from pull request most recent head 998655b. Consider uploading reports for the commit 998655b to get more accurate results

@@            Coverage Diff             @@
##             main    #2395      +/-   ##
==========================================
+ Coverage   95.17%   95.19%   +0.01%     
==========================================
  Files          66       66              
  Lines        2799     2808       +9     
  Branches      940      942       +2     
==========================================
+ Hits         2664     2673       +9     
  Misses        135      135              
Impacted Files Coverage Δ
src/rules/order.js 99.14% <100.00%> (+0.02%) ⬆️

Help us with your feedback. Take ten seconds to tell us how you rate us. Have a feature suggestion? Share it here.

@hyperupcall hyperupcall marked this pull request as ready for review August 14, 2022 01:04
@hyperupcall
Copy link
Contributor Author

hyperupcall commented Aug 14, 2022

Since this PR is several months old (and now ready), I'll recap and provide all the necessary information:

This PR aims to close #2292, but approaches the solution differently than proposed.

Originally, it was proposed to implement a property for any entry in pathGroup, so that ordering would stay within its own group. That is, when position was specified, this new property would ensure that a "new group" wouldn't get created and would ensure an extra newline would not be generated. The original PR implemented it this way, but it was too fragile and was difficult to use in practice.

Now, with the current code, the property was added at the top level, so it affects all pathGroups entries. This makes it so that every pathGroup with a custom position property will stay within its own group. As a result, the configuration required to fix this issue is more intuitive.

This PR has been undrafted and includes the relevant tests and documentation ^w^

@hyperupcall
Copy link
Contributor Author

Oops, I see the unresolved connections, and I can't appear to resolve them since I rebased over the latest commits and force pushed the result.

Both seem to be outdated, as I now default to false in the schema definition and the other comment was about an older property name.

src/rules/order.js Outdated Show resolved Hide resolved
src/rules/order.js Outdated Show resolved Hide resolved
Copy link
Member

@ljharb ljharb left a comment

Choose a reason for hiding this comment

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

Thanks, that clears it up!

Let's name this option (and the resulting variables) "distinctGroup", and default it to "true" - and include a note in the readme (and a "TODO, semver-major" comment in the code) that the next semver-major will change the default of "distinctGroup" from true to false.

@ljharb ljharb changed the title Add option to toggle newline generation for sorting within a group [New] order: add distinctGroup option Aug 26, 2022
@ljharb ljharb merged commit 998655b into import-js:main Aug 26, 2022
@hyperupcall hyperupcall deleted the fix-inter-group-newline branch December 14, 2022 08:41
crapStone pushed a commit to Calciumdibromid/CaBr2 that referenced this pull request Jan 13, 2023
This PR contains the following updates:

| Package | Type | Update | Change |
|---|---|---|---|
| [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) | devDependencies | minor | [`2.26.0` -> `2.27.4`](https://renovatebot.com/diffs/npm/eslint-plugin-import/2.26.0/2.27.4) |

---

### Release Notes

<details>
<summary>import-js/eslint-plugin-import</summary>

### [`v2.27.4`](https://github.com/import-js/eslint-plugin-import/blob/HEAD/CHANGELOG.md#&#8203;2274---2023-01-11)

[Compare Source](import-js/eslint-plugin-import@v2.27.3...v2.27.4)

##### Fixed

-   `semver` should be a prod dep (\[[#&#8203;2668](import-js/eslint-plugin-import#2668)])

### [`v2.27.3`](https://github.com/import-js/eslint-plugin-import/blob/HEAD/CHANGELOG.md#&#8203;2273---2023-01-11)

[Compare Source](import-js/eslint-plugin-import@v2.27.2...v2.27.3)

##### Fixed

-   \[`no-empty-named-blocks`]: rewrite rule to only check import declarations (\[[#&#8203;2666](import-js/eslint-plugin-import#2666)])

### [`v2.27.2`](https://github.com/import-js/eslint-plugin-import/blob/HEAD/CHANGELOG.md#&#8203;2272---2023-01-11)

[Compare Source](import-js/eslint-plugin-import@v2.27.1...v2.27.2)

##### Fixed

-   \[`no-duplicates`]: do not unconditionally require `typescript` (\[[#&#8203;2665](import-js/eslint-plugin-import#2665)])

### [`v2.27.1`](https://github.com/import-js/eslint-plugin-import/blob/HEAD/CHANGELOG.md#&#8203;2271---2023-01-11)

[Compare Source](import-js/eslint-plugin-import@v2.27.0...v2.27.1)

##### Fixed

-   `array.prototype.flatmap` should be a prod dep (\[[#&#8203;2664](import-js/eslint-plugin-import#2664)], thanks \[[@&#8203;cristobal](https://github.com/cristobal)])

### [`v2.27.0`](https://github.com/import-js/eslint-plugin-import/blob/HEAD/CHANGELOG.md#&#8203;2270---2023-01-11)

[Compare Source](import-js/eslint-plugin-import@v2.26.0...v2.27.0)

##### Added

-   \[`newline-after-import`]: add `considerComments` option (\[[#&#8203;2399](import-js/eslint-plugin-import#2399)], thanks \[[@&#8203;pri1311](https://github.com/pri1311)])
-   \[`no-cycle`]: add `allowUnsafeDynamicCyclicDependency` option (\[[#&#8203;2387](import-js/eslint-plugin-import#2387)], thanks \[[@&#8203;GerkinDev](https://github.com/GerkinDev)])
-   \[`no-restricted-paths`]: support arrays for `from` and `target` options (\[[#&#8203;2466](import-js/eslint-plugin-import#2466)], thanks \[[@&#8203;AdriAt360](https://github.com/AdriAt360)])
-   \[`no-anonymous-default-export`]: add `allowNew` option (\[[#&#8203;2505](import-js/eslint-plugin-import#2505)], thanks \[[@&#8203;DamienCassou](https://github.com/DamienCassou)])
-   \[`order`]: Add `distinctGroup` option (\[[#&#8203;2395](import-js/eslint-plugin-import#2395)], thanks \[[@&#8203;hyperupcall](https://github.com/hyperupcall)])
-   \[`no-extraneous-dependencies`]: Add `includeInternal` option (\[[#&#8203;2541](import-js/eslint-plugin-import#2541)], thanks \[[@&#8203;bdwain](https://github.com/bdwain)])
-   \[`no-extraneous-dependencies`]: Add `includeTypes` option (\[[#&#8203;2543](import-js/eslint-plugin-import#2543)], thanks \[[@&#8203;bdwain](https://github.com/bdwain)])
-   \[`order`]: new `alphabetize.orderImportKind` option to sort imports with same path based on their kind (`type`, `typeof`) (\[[#&#8203;2544](import-js/eslint-plugin-import#2544)], thanks \[[@&#8203;stropho](https://github.com/stropho)])
-   \[`consistent-type-specifier-style`]: add rule (\[[#&#8203;2473](import-js/eslint-plugin-import#2473)], thanks \[[@&#8203;bradzacher](https://github.com/bradzacher)])
-   Add \[`no-empty-named-blocks`] rule (\[[#&#8203;2568](import-js/eslint-plugin-import#2568)], thanks \[[@&#8203;guilhermelimak](https://github.com/guilhermelimak)])
-   \[`prefer-default-export`]: add "target" option (\[[#&#8203;2602](import-js/eslint-plugin-import#2602)], thanks \[[@&#8203;azyzz228](https://github.com/azyzz228)])
-   \[`no-absolute-path`]: add fixer (\[[#&#8203;2613](import-js/eslint-plugin-import#2613)], thanks \[[@&#8203;adipascu](https://github.com/adipascu)])
-   \[`no-duplicates`]: support inline type import with `inlineTypeImport` option (\[[#&#8203;2475](import-js/eslint-plugin-import#2475)], thanks \[[@&#8203;snewcomer](https://github.com/snewcomer)])

##### Fixed

-   \[`order`]: move nested imports closer to main import entry (\[[#&#8203;2396](import-js/eslint-plugin-import#2396)], thanks \[[@&#8203;pri1311](https://github.com/pri1311)])
-   \[`no-restricted-paths`]: fix an error message (\[[#&#8203;2466](import-js/eslint-plugin-import#2466)], thanks \[[@&#8203;AdriAt360](https://github.com/AdriAt360)])
-   \[`no-restricted-paths`]: use `Minimatch.match` instead of `minimatch` to comply with Windows Native paths (\[[#&#8203;2466](import-js/eslint-plugin-import#2466)], thanks \[[@&#8203;AdriAt360](https://github.com/AdriAt360)])
-   \[`order`]: require with member expression could not be fixed if alphabetize.order was used (\[[#&#8203;2490](import-js/eslint-plugin-import#2490)], thanks \[[@&#8203;msvab](https://github.com/msvab)])
-   \[`order`]: leave more space in rankings for consecutive path groups (\[[#&#8203;2506](import-js/eslint-plugin-import#2506)], thanks \[[@&#8203;Pearce-Ropion](https://github.com/Pearce-Ropion)])
-   \[`no-cycle`]: add ExportNamedDeclaration statements to dependencies (\[[#&#8203;2511](import-js/eslint-plugin-import#2511)], thanks \[[@&#8203;BenoitZugmeyer](https://github.com/BenoitZugmeyer)])
-   \[`dynamic-import-chunkname`]: prevent false report on a valid webpack magic comment (\[[#&#8203;2330](import-js/eslint-plugin-import#2330)], thanks \[[@&#8203;mhmadhamster](https://github.com/mhmadhamster)])
-   \[`export`]: do not error on TS export overloads (\[[#&#8203;1590](import-js/eslint-plugin-import#1590)], thanks \[[@&#8203;ljharb](https://github.com/ljharb)])
-   \[`no-unresolved`], \[`extensions`]: ignore type only exports (\[[#&#8203;2436](import-js/eslint-plugin-import#2436)], thanks \[[@&#8203;Lukas-Kullmann](https://github.com/Lukas-Kullmann)])
-   `ExportMap`: add missing param to function (\[[#&#8203;2589](import-js/eslint-plugin-import#2589)], thanks \[[@&#8203;Fdawgs](https://github.com/Fdawgs)])
-   \[`no-unused-modules`]: `checkPkgFieldObject` filters boolean fields from checks (\[[#&#8203;2598](import-js/eslint-plugin-import#2598)], thanks \[[@&#8203;mpint](https://github.com/mpint)])
-   \[`no-cycle`]: accept Flow `typeof` imports, just like `type` (\[[#&#8203;2608](import-js/eslint-plugin-import#2608)], thanks \[[@&#8203;gnprice](https://github.com/gnprice)])
-   \[`no-import-module-exports`]: avoid a false positive for import variables (\[[#&#8203;2315](import-js/eslint-plugin-import#2315)], thanks \[[@&#8203;BarryThePenguin](https://github.com/BarryThePenguin)])

##### Changed

-   \[Tests] \[`named`]: Run all TypeScript test (\[[#&#8203;2427](import-js/eslint-plugin-import#2427)], thanks \[[@&#8203;ProdigySim](https://github.com/ProdigySim)])
-   \[readme] note use of typescript in readme `import/extensions` section (\[[#&#8203;2440](import-js/eslint-plugin-import#2440)], thanks \[[@&#8203;OutdatedVersion](https://github.com/OutdatedVersion)])
-   \[Docs] \[`order`]: use correct default value (\[[#&#8203;2392](import-js/eslint-plugin-import#2392)], thanks \[[@&#8203;hyperupcall](https://github.com/hyperupcall)])
-   \[meta] replace git.io link in comments with the original URL (\[[#&#8203;2444](import-js/eslint-plugin-import#2444)], thanks \[[@&#8203;liby](https://github.com/liby)])
-   \[Docs] remove global install in readme (\[[#&#8203;2412](import-js/eslint-plugin-import#2412)], thanks \[[@&#8203;aladdin-add](https://github.com/aladdin-add)])
-   \[readme] clarify `eslint-import-resolver-typescript` usage (\[[#&#8203;2503](import-js/eslint-plugin-import#2503)], thanks \[[@&#8203;JounQin](https://github.com/JounQin)])
-   \[Refactor] \[`no-cycle`]: Add per-run caching of traversed paths (\[[#&#8203;2419](import-js/eslint-plugin-import#2419)], thanks \[[@&#8203;nokel81](https://github.com/nokel81)])
-   \[Performance] `ExportMap`: add caching after parsing for an ambiguous module (\[[#&#8203;2531](import-js/eslint-plugin-import#2531)], thanks \[[@&#8203;stenin-nikita](https://github.com/stenin-nikita)])
-   \[Docs] \[`no-useless-path-segments`]: fix paths (\[[#&#8203;2424](import-js/eslint-plugin-import#2424)], thanks \[[@&#8203;s-h-a-d-o-w](https://github.com/s-h-a-d-o-w)])
-   \[Tests] \[`no-cycle`]: add passing test cases (\[[#&#8203;2438](import-js/eslint-plugin-import#2438)], thanks \[[@&#8203;georeith](https://github.com/georeith)])
-   \[Refactor] \[`no-extraneous-dependencies`] improve performance using cache (\[[#&#8203;2374](import-js/eslint-plugin-import#2374)], thanks \[[@&#8203;meowtec](https://github.com/meowtec)])
-   \[meta] `CONTRIBUTING.md`: mention inactive PRs (\[[#&#8203;2546](import-js/eslint-plugin-import#2546)], thanks \[[@&#8203;stropho](https://github.com/stropho)])
-   \[readme] make json for setting groups multiline (\[[#&#8203;2570](import-js/eslint-plugin-import#2570)], thanks \[[@&#8203;bertyhell](https://github.com/bertyhell)])
-   \[Tests] \[`no-restricted-paths`]: Tests for `import type` statements (\[[#&#8203;2459](import-js/eslint-plugin-import#2459)], thanks \[[@&#8203;golergka](https://github.com/golergka)])
-   \[Tests] \[`no-restricted-paths`]: fix one failing `import type` test case, submitted by \[[@&#8203;golergka](https://github.com/golergka)], thanks \[[@&#8203;azyzz228](https://github.com/azyzz228)]
-   \[Docs] automate docs with eslint-doc-generator (\[[#&#8203;2582](import-js/eslint-plugin-import#2582)], thanks \[[@&#8203;bmish](https://github.com/bmish)])
-   \[readme] Increase clarity around typescript configuration (\[[#&#8203;2588](import-js/eslint-plugin-import#2588)], thanks \[[@&#8203;Nfinished](https://github.com/Nfinished)])
-   \[Docs] update `eslint-doc-generator` to v1.0.0 (\[[#&#8203;2605](import-js/eslint-plugin-import#2605)], thanks \[[@&#8203;bmish](https://github.com/bmish)])
-   \[Perf] \[`no-cycle`], \[`no-internal-modules`], \[`no-restricted-paths`]: use `anyOf` instead of `oneOf` (thanks \[[@&#8203;ljharb](https://github.com/ljharb)], \[[@&#8203;remcohaszing](https://github.com/remcohaszing)])

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzNC45Ny41IiwidXBkYXRlZEluVmVyIjoiMzQuMTAwLjEifQ==-->

Co-authored-by: cabr2-bot <cabr2.help@gmail.com>
Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1724
Reviewed-by: Epsilon_02 <epsilon_02@noreply.codeberg.org>
Co-authored-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
Co-committed-by: Calciumdibromid Bot <cabr2_bot@noreply.codeberg.org>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

Successfully merging this pull request may close these issues.

Custom ordering
3 participants