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

[Refactor] no-extraneous-dependencies improve performance #2374

Draft
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

meowtec
Copy link
Contributor

@meowtec meowtec commented Jan 27, 2022

In my project this will reduce the time from

import/no-extraneous-dependencies         |  3442.375 |     5.9%

to

import/no-extraneous-dependencies         |  1903.296 |     3.5%

@meowtec meowtec changed the title [Refactor] no extraneous dependencies improve performance [Refactor] no-extraneous-dependencies improve performance Jan 27, 2022
@meowtec meowtec marked this pull request as draft January 27, 2022 04:01
@meowtec meowtec force-pushed the performance/no-extraneous-dependencies branch from 9d7efd5 to d144bb0 Compare January 27, 2022 04:41
@meowtec meowtec marked this pull request as ready for review January 27, 2022 05:23
@codecov
Copy link

codecov bot commented Jan 27, 2022

Codecov Report

Base: 95.20% // Head: 95.15% // Decreases project coverage by -0.05% ⚠️

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

❗ Current head 7f251b2 differs from pull request most recent head 9b9ae94. Consider uploading reports for the commit 9b9ae94 to get more accurate results

Additional details and impacted files
@@            Coverage Diff             @@
##             main    #2374      +/-   ##
==========================================
- Coverage   95.20%   95.15%   -0.06%     
==========================================
  Files          66       66              
  Lines        2818     2828      +10     
  Branches      948      949       +1     
==========================================
+ Hits         2683     2691       +8     
- Misses        135      137       +2     
Impacted Files Coverage Δ
src/rules/no-extraneous-dependencies.js 98.16% <85.71%> (-1.84%) ⬇️

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.

function getPackageDepFields(packageJsonPath) {
if (!depFieldCache.has(packageJsonPath)) {
const depFields = extractDepFields(
JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')),
Copy link
Member

Choose a reason for hiding this comment

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

what happens if the package.json file has invalid syntax, or doesn't exist?

const { settings } = context;
if (isInternalRegexMatch(name, settings)) { return 'internal'; }
if (isAbsolute(name, settings, path)) { return 'absolute'; }
if (isAbsolute(name, settings)) { return 'absolute'; }
Copy link
Member

Choose a reason for hiding this comment

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

i very intentionally had all of these pass all three arguments, for consistency. if we're changing that, then this only takes 1 argument.

Suggested change
if (isAbsolute(name, settings)) { return 'absolute'; }
if (isAbsolute(name)) { return 'absolute'; }

(similar feedback on all the others)

@meowtec meowtec force-pushed the performance/no-extraneous-dependencies branch 4 times, most recently from 6343bfb to a84c08d Compare January 28, 2022 05:48
if (isRelativeToSibling(name)) { return 'sibling'; }

// `resolve` is expensive, do it only when necessary
const path = getPath();
if (isBuiltIn(name, settings, path)) { return 'builtin'; }
Copy link
Member

Choose a reason for hiding this comment

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

this change moves isBuiltIn below absolute/relativeToParent/index/relativeToSibling - this might be a breaking change for anyone relying on the import/core-modules setting, which currently takes precedence.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Could we make this change in next major version?

Copy link
Member

Choose a reason for hiding this comment

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

There's unlikely to be a major version any time soon, if ever.

@ljharb
Copy link
Member

ljharb commented Sep 2, 2022

@meowtec i'd love to incorporate these speed improvements if we can avoid the breaking change - can you update this PR to do that?

@ljharb ljharb marked this pull request as draft September 2, 2022 21:03
ljharb pushed a commit to meowtec/eslint-plugin-import that referenced this pull request Sep 2, 2022
@ljharb ljharb force-pushed the performance/no-extraneous-dependencies branch from a84c08d to 7c00c5a Compare September 2, 2022 22:17
@ljharb
Copy link
Member

ljharb commented Sep 2, 2022

I've reordered the commits, and added "clear the cache on program exit" so that long-running eslint processes won't have a memory leak. I plan to pull the cache commit into main directly, and leave this PR containing just the "lazy resolve" commit so we can keep working on it.

ljharb pushed a commit to meowtec/eslint-plugin-import that referenced this pull request Sep 2, 2022
@ljharb ljharb force-pushed the performance/no-extraneous-dependencies branch from 7c00c5a to 9b9ae94 Compare September 2, 2022 22:26
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
Labels
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants