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] no-duplicates: support inline type import with prefer-inline option #2475

Merged
merged 1 commit into from Dec 30, 2022

Conversation

snewcomer
Copy link
Contributor

@snewcomer snewcomer commented Jun 10, 2022

close #2470

ref typescript-eslint/typescript-eslint#5050

Typescript import { type A } from 'util/cool-linter' was introduced in 4.5 https://devblogs.microsoft.com/typescript/announcing-typescript-4-5/#type-on-import-names

This PR seeks to add TypeScript support to the existing rule no-duplicates.

❌ Invalid `["error", { "prefer-inline": true }]`

import { AValue, type AType } from './mama-mia'
import type { BType } from './mama-mia'

✅ Valid with `["error", { "prefer-inline": true }]`

import { AValue, type AType, type BType } from './mama-mia'

Config:

```json
"import/no-duplicates": ["error", {"inlineTypeImport": true}]
Copy link
Contributor Author

Choose a reason for hiding this comment

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

consistent with this PR, we could use prefer-inline

package.json Outdated Show resolved Hide resolved
@jasongerbes
Copy link

Would it be possible to extend this rule to also test exports?

@snewcomer
Copy link
Contributor Author

@jasongerbes Great q! I'm not seeing inline export type throw any warnings so I'm guessing it is possible! I didn't see any mention in the release notes. Either it is an option or a different rule. After this PR is merged, I imagine we could consider it then. I don't have an answer right now.

export { type A };

@ljharb ljharb marked this pull request as draft August 29, 2022 21:45
@snewcomer snewcomer force-pushed the sn/duplicate-inline-type branch 2 times, most recently from 9f92d7c to bc2f797 Compare October 2, 2022 03:34
@snewcomer snewcomer marked this pull request as ready for review October 2, 2022 03:47
@snewcomer
Copy link
Contributor Author

cc @ljharb @bradzacher This is ready for your review.

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 good!

src/rules/no-duplicates.js Outdated Show resolved Hide resolved
tests/src/rules/no-duplicates.js Outdated Show resolved Hide resolved
@codecov
Copy link

codecov bot commented Oct 2, 2022

Codecov Report

Base: 95.30% // Head: 95.27% // Decreases project coverage by -0.02% ⚠️

Coverage data is based on head (24fd549) compared to base (de895ac).
Patch coverage: 87.50% of modified lines in pull request are covered.

❗ Current head 24fd549 differs from pull request most recent head 6304ddc. Consider uploading reports for the commit 6304ddc to get more accurate results

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2475      +/-   ##
==========================================
- Coverage   95.30%   95.27%   -0.03%     
==========================================
  Files          68       68              
  Lines        2960     2966       +6     
  Branches     1004     1008       +4     
==========================================
+ Hits         2821     2826       +5     
- Misses        139      140       +1     
Impacted Files Coverage Δ
src/rules/no-duplicates.js 99.24% <87.50%> (-0.76%) ⬇️

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.

@snewcomer
Copy link
Contributor Author

Hi @ljharb! Just seeing if I could get another friendly review when/if you have time!

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 good! I'm comfortable with this option name, but preferInline would work as well.

What about someone who supports inline type imports, but wants to force non-inline ones? Perhaps this should be an option with a value of "separate" versus "inline"?

src/rules/no-duplicates.js Outdated Show resolved Hide resolved
src/rules/no-duplicates.js Outdated Show resolved Hide resolved
@snewcomer snewcomer changed the title [New] no-duplicates: support inline type import with inlineTypeImport option [New] no-duplicates: support inline type import with preferInline option Nov 6, 2022
@snewcomer
Copy link
Contributor Author

@ljharb Thanks for the reviews and comments! So this PR is part of a larger effort.

  1. fixes a Type import to Inline-Type via prefer-inline or prefer-top-level - [New] consistent-type-specifier-style: add rule #2473.
  2. Fixes a Value import to Inline Type - feat(eslint-plugin): [consistent-type-imports] support fixing to inline types typescript-eslint/typescript-eslint#5050.
  3. (this PR) adds support for resolving duplicate Type imports to Inline Types to a single import source.

I think 1) is what you are referencing, correct?

@snewcomer snewcomer requested a review from ljharb November 8, 2022 00:12
@snewcomer snewcomer changed the title [New] no-duplicates: support inline type import with preferInline option [New] no-duplicates: support inline type import with prefer-inline option Nov 8, 2022
@snewcomer snewcomer requested review from ljharb and removed request for ljharb November 8, 2022 00:25
@snewcomer
Copy link
Contributor Author

I updated to prefer-inline to be consistent with #2473. Does that seem ok?

@ljharb
Copy link
Member

ljharb commented Nov 8, 2022

Yep, 1 is what I'm referencing

@snewcomer snewcomer force-pushed the sn/duplicate-inline-type branch 2 times, most recently from 4d0a47a to 90ae183 Compare November 16, 2022 21:07
@snewcomer snewcomer force-pushed the sn/duplicate-inline-type branch 2 times, most recently from f392d5a to 9fae012 Compare November 25, 2022 02:10
@snewcomer snewcomer force-pushed the sn/duplicate-inline-type branch 2 times, most recently from b897247 to 4e79fc7 Compare December 5, 2022 16:39
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!

@ljharb
Copy link
Member

ljharb commented Dec 30, 2022

I'm not worried about the node 6 travis failure (it's due to npm 6 breaking it, and travis not yet updating nvm to work around it) nor about the uncovered line.

@ljharb ljharb merged commit 6304ddc into import-js:main Dec 30, 2022
@snewcomer snewcomer deleted the sn/duplicate-inline-type branch December 30, 2022 21:32
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>
@@ -291,6 +305,9 @@ module.exports = {
if (n.importKind === 'type') {
return n.specifiers.length > 0 && n.specifiers[0].type === 'ImportDefaultSpecifier' ? map.defaultTypesImported : map.namedTypesImported;
}
if (n.specifiers.some((spec) => spec.importKind === 'type')) {
return map.namedTypesImported;
}
Copy link
Contributor Author

Choose a reason for hiding this comment

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

This seems to be the source of error for a few folks

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.

addition to rule: import/no-duplicates
3 participants