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] consistent-type-specifier-style: add rule #2473

Merged
merged 1 commit into from Sep 7, 2022

Conversation

bradzacher
Copy link
Contributor

@bradzacher bradzacher commented Jun 9, 2022

Fixes #2469

Adds a new rule as specced in #2469
To test this I had to bump the TS version to 4.5, as that was the first version that supported inline type specifiers.

@bradzacher bradzacher force-pushed the 2469-consistent-type-specifier branch 3 times, most recently from 636b694 to f862261 Compare June 10, 2022 05:40
@bradzacher
Copy link
Contributor Author

image

big oof - testing against all of these old versions of things is really tough to get right

@bradzacher bradzacher marked this pull request as ready for review June 10, 2022 05:52
Copy link
Contributor

@snewcomer snewcomer left a comment

Choose a reason for hiding this comment

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

Lovely 👍

@codecov
Copy link

codecov bot commented Jun 10, 2022

Codecov Report

Base: 95.15% // Head: 95.14% // Decreases project coverage by -0.00% ⚠️

Coverage data is based on head (ac4960c) compared to base (7f251b2).
Patch coverage: 97.46% of modified lines in pull request are covered.

❗ Current head ac4960c differs from pull request most recent head 2df9be6. Consider uploading reports for the commit 2df9be6 to get more accurate results

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2473      +/-   ##
==========================================
- Coverage   95.15%   95.14%   -0.01%     
==========================================
  Files          66       67       +1     
  Lines        2828     2907      +79     
  Branches      949      979      +30     
==========================================
+ Hits         2691     2766      +75     
- Misses        137      141       +4     
Impacted Files Coverage Δ
src/rules/consistent-type-specifier-style.js 97.46% <97.46%> (ø)
utils/module-require.js 85.71% <0.00%> (-14.29%) ⬇️

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

☔ View full report at Codecov.
📢 Do you have feedback about the report comment? Let us know in this issue.

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.

I'd prefer to avoid use of generators and loops, but that's also something I can clean up once the tests are passing.

How does a Flow user who isn't using the inline typeof syntax already, autofix to import typeof?

I think that if we can get this to leave behind the empty braces, we'll be OK pending the other comments. I'd love to land this soon.

src/rules/consistent-type-specifier-style.js Outdated Show resolved Hide resolved
src/rules/consistent-type-specifier-style.js Outdated Show resolved Hide resolved
@bradzacher
Copy link
Contributor Author

Now that the TS 4.8 release is done, I should be able to get back to this this week (hopefully).

@ljharb
Copy link
Member

ljharb commented Sep 2, 2022

I'm holding off on the next release for this :-) looking forward to you getting back to it.

@bradzacher
Copy link
Contributor Author

assuming test pass - this should be good to go now.
I updated the fixer to (a) cleanup unnecessary commas and (b) cleanup empty named blocks

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 great - have these items been addressed?

How does a Flow user who isn't using the inline typeof syntax already, autofix to import typeof?

leave behind the empty braces

src/rules/consistent-type-specifier-style.js Show resolved Hide resolved
src/rules/consistent-type-specifier-style.js Outdated Show resolved Hide resolved
src/rules/consistent-type-specifier-style.js Outdated Show resolved Hide resolved
@bradzacher
Copy link
Contributor Author

leave behind the empty braces

The fixer should no longer leave behind empty braces.

How does a Flow user who isn't using the inline typeof syntax already, autofix to import typeof?

If I'm understanding your question correctly:

  • If they don't want to use the inline specifiers at all, then they can use the prefer-top-level setting.
  • If they want to use inline type with top-level typeof, the rule does not currently have handling for this (could be a future enhancement if people want it!).

@ljharb ljharb force-pushed the 2469-consistent-type-specifier branch from 9f2b743 to 591c83d Compare September 6, 2022 05:04
@ljharb
Copy link
Member

ljharb commented Sep 6, 2022

Rebased; looks like this is good to go, pending any "uncovered line" annotations (#2473 (comment) and #2473 (comment))

@ljharb ljharb force-pushed the 2469-consistent-type-specifier branch from d400d7c to dba8107 Compare September 7, 2022 05:11
@latin-1
Copy link

latin-1 commented Nov 10, 2022

microsoft/TypeScript#47118

import type { X } from "...";
import { type X } from "...";

These two lines of code behave differently. Perhaps we should add a special treatment for this.

@ljharb
Copy link
Member

ljharb commented Nov 10, 2022

It's not clear what the difference is from that issue. Can you elaborate?

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>
@latin-1
Copy link

latin-1 commented Jan 14, 2023

typescript-eslint/typescript-eslint#6338
I posted more details at the link above. I'm not sure which plugin this should be handled in.
It's a mess. We may need two or more passes of code fixes to make it work.

@ljharb
Copy link
Member

ljharb commented Jan 14, 2023

eslint on the CLI runs multiple passes, so it's only in an editor that you're likely to run into this problem.

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

Successfully merging this pull request may close these issues.

New rule: consistent inline type specifier usage
4 participants