-
-
Notifications
You must be signed in to change notification settings - Fork 2.8k
Bug: [prefer-readonly-parameter-types] isTypeReadonly
stack overflow
#4476
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
Comments
Hi, (I'm hitting it with different code than the one in the playground) |
I figured that if there is a new error - it's some of the recent changes we made to the tooling. |
The playground is unintuitive to me (I'm a vim & command-line kind-of guy...), this complains about infinite instantiation, is that it? |
What part of it...? It's just a text editor with typescript and ESLint integrated into it.
No - we aren't trying to repro a TS error. We're trying to repro the crash in the lint rule. |
I was unable to reproduce the bug in the playground, but I've managed to create a tiny project that demonstrates the issue for me.
module.exports = {
extends: [
'plugin:@typescript-eslint/all',
],
parserOptions: {
project: 'tsconfig.json',
},
};
import * as React from 'react';
import type { ReadonlyDeep } from 'type-fest';
function foo(event: ReadonlyDeep<HTMLInputElement>): void {
}
{
"name": "test",
"version": "1.0.0",
"description": "A tiny project to demonstrate a bug in `typescript-eslint`.",
"main": "index.js",
"scripts": {
"check": "eslint index.ts"
},
"author": "Albert Einstein",
"license": "MIT",
"devDependencies": {
"@types/react": "17.0.38",
"@typescript-eslint/eslint-plugin": "5.10.0",
"@typescript-eslint/parser": "5.10.0",
"eslint": "8.7.0",
"typescript": "4.5.5"
},
"dependencies": {
"react": "17.0.2",
"type-fest": "2.10.0"
}
}
{
"compilerOptions": {
"moduleResolution": "node",
"target": "es2021"
},
"include": ["index.ts"]
} Then after installing the dependencies,
I hope that helps. Thanks for looking into this. |
Mostly the fact that there isn't any user feedback when it's running - I was looking for a run button, tried ctrl+enter, nothing. Turns out it just took like 20s to compile with no indication that something is happening... Also, I didn't know what am error would look like - would a log magically pop out of somewhere? Would the editor just break? Or would it just not report an issue where there should've been one? |
This could be relevant: #4185 (comment) |
Has anyone found a workaround for this? I tried ignoring the problematic file but that had no effect. The only thing that worked was to disable the rule entirely but that's obviously not ideal. |
isTypeReadonly
stack overflowisTypeReadonly
stack overflow
Minimal repro without deps:
|
fix(eslint-plugin): isTypeReadonly stack overflow (#4476) Co-authored-by: Josh Goldberg <git@joshuakgoldberg.com>
Another fail test case:
@JoshuaKGoldberg please reopen it so as not to lose it |
Could you file a new issue please @sviat9440 with all the test cases you've found? Closed issues and PRs make it hard to manage & search for the information. |
This PR contains the following updates: | Package | Type | Update | Change | |---|---|---|---| | [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint) | devDependencies | minor | [`5.40.1` -> `5.41.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/5.40.1/5.41.0) | | [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint) | devDependencies | minor | [`5.40.1` -> `5.41.0`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/5.40.1/5.41.0) | --- ### Release Notes <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/eslint-plugin)</summary> ### [`v5.41.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#​5410-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5401v5410-2022-10-24) [Compare Source](typescript-eslint/typescript-eslint@v5.40.1...v5.41.0) ##### Bug Fixes - **eslint-plugin:** \[no-base-to-string] ignore Error, URL, and URLSearchParams by default ([#​5839](typescript-eslint/typescript-eslint#5839)) ([96e1c6c](typescript-eslint/typescript-eslint@96e1c6c)) - **type-utils:** prevent stack overflow in `isTypeReadonly` ([#​5860](typescript-eslint/typescript-eslint#5860)) ([a6d8f7e](typescript-eslint/typescript-eslint@a6d8f7e)), closes [#​4476](typescript-eslint/typescript-eslint#4476) ##### Features - **eslint-plugin:** \[no-unsafe-declaration-merging] switch to use scope analysis instead of type information ([#​5865](typescript-eslint/typescript-eslint#5865)) ([e70a10a](typescript-eslint/typescript-eslint@e70a10a)) - **eslint-plugin:** add no-unsafe-declaration-merging ([#​5840](typescript-eslint/typescript-eslint#5840)) ([3728031](typescript-eslint/typescript-eslint@3728031)) #### [5.40.1](typescript-eslint/typescript-eslint@v5.40.0...v5.40.1) (2022-10-17) ##### Bug Fixes - **eslint-plugin:** Skip missing 'rest' tuple type arguments in no-misused-promises ([#​5809](typescript-eslint/typescript-eslint#5809)) ([c5beaa2](typescript-eslint/typescript-eslint@c5beaa2)), closes [#​5807](typescript-eslint/typescript-eslint#5807) </details> <details> <summary>typescript-eslint/typescript-eslint (@​typescript-eslint/parser)</summary> ### [`v5.41.0`](https://github.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#​5410-httpsgithubcomtypescript-eslinttypescript-eslintcomparev5401v5410-2022-10-24) [Compare Source](typescript-eslint/typescript-eslint@v5.40.1...v5.41.0) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) #### [5.40.1](typescript-eslint/typescript-eslint@v5.40.0...v5.40.1) (2022-10-17) **Note:** Version bump only for package [@​typescript-eslint/parser](https://github.com/typescript-eslint/parser) </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 these updates again. --- - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click this checkbox. --- This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate). <!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiIzMy4xLjAiLCJ1cGRhdGVkSW5WZXIiOiIzMy4xLjAifQ==--> Co-authored-by: cabr2-bot <cabr2.help@gmail.com> Reviewed-on: https://codeberg.org/Calciumdibromid/CaBr2/pulls/1604 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>
Repro
I encountered this bug via the
@typescript-eslint/prefer-readonly-parameter-types
rule. I am trying to define this function:where
ReadonlyDeep
comes from thetype-fest
package, since I haven't figured out how to makeReact.FormEvent<HTMLInputElement>
sufficiently readonly to satisfy that lint rule.For completeness, I am invoking ESLint as follows, though I suspect this is irrelevant:
eslint --config .eslintrc.js --ignore-path .gitignore --report-unused-disable-directives --max-warnings 0 'src/**/*.tsx'
Expected Result
The rule does not overflow the call stack during linting.
Actual Result
Stack overflow:
Additional Info
Edit 10/24 by JoshuaKGoldberg: wrapped in a details tag
With `--debug` (my apologies: this is huge):
Versions
@typescript-eslint/type-utils
5.10.0
TypeScript
4.5.5
node
16.11.0
The text was updated successfully, but these errors were encountered: