Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

[enhancement]: flat configs are possibly undefined #3878

Open
2 tasks done
CHC383 opened this issue Jan 14, 2025 · 8 comments · May be fixed by #3882 or #3879
Open
2 tasks done

[enhancement]: flat configs are possibly undefined #3878

CHC383 opened this issue Jan 14, 2025 · 8 comments · May be fixed by #3882 or #3879

Comments

@CHC383
Copy link

CHC383 commented Jan 14, 2025

Is there an existing issue for this?

  • I have searched the existing issues and my issue is unique
  • My issue appears in the command-line and not only in the text editor

Description Overview

This is a follow up of #3874, since flat is Record<string, ReactFlatConfig>, flat.xxx or flat["xxx"] could be undefined. The fix might be explicitly list recommended, all and jsx-runtime as the key of the Record instead of using string.

Image
import tseslint from 'typescript-eslint'
import reactPlugin from 'eslint-plugin-react'

export default tseslint.config(
  reactPlugin.configs.flat.recommended
)
Argument of type 'ReactFlatConfig | undefined' is not assignable to parameter of type 'InfiniteDepthConfigWithExtends'.

Expected Behavior

No type error

eslint-plugin-react version

v7.37.4

eslint version

9.17.0

node version

v22.13.0

@CHC383 CHC383 added the bug label Jan 14, 2025
CHC383 added a commit to CHC383/eslint-plugin-react that referenced this issue Jan 14, 2025
@CHC383 CHC383 linked a pull request Jan 14, 2025 that will close this issue
@ljharb
Copy link
Member

ljharb commented Jan 14, 2025

To be clear, this is not a bug - the types are correct - but you're right they could be more helpful.

@ljharb ljharb changed the title [Bug]: flat configs are possibly undefined [enhancement]: flat configs are possibly undefined Jan 14, 2025
CHC383 added a commit to CHC383/eslint-plugin-react that referenced this issue Jan 14, 2025
CHC383 added a commit to CHC383/eslint-plugin-react that referenced this issue Jan 14, 2025
CHC383 added a commit to CHC383/eslint-plugin-react that referenced this issue Jan 14, 2025
CHC383 added a commit to CHC383/eslint-plugin-react that referenced this issue Jan 14, 2025
@CHC383
Copy link
Author

CHC383 commented Jan 14, 2025

Just to share a workaround for Typescript users until we figure out how to type the configs properly

// @ts-expect-error https://github.com/jsx-eslint/eslint-plugin-react/issues/3878
reactPlugin.configs.flat.recommended,

CHC383 added a commit to CHC383/eslint-plugin-react that referenced this issue Jan 25, 2025
@CHC383 CHC383 linked a pull request Jan 25, 2025 that will close this issue
@3dos
Copy link

3dos commented Feb 11, 2025

As a workaround, I added a .d.ts file to fix original types which are too loose:

// eslint-plugin-react.d.ts
declare module 'eslint-plugin-react' {
  export const configs: typeof configs & {
    flat: Record<'all' | 'recommended' | 'jsx-runtime', ReactFlatConfig>; // the original type is Record<string, ReactFlatConfig>
  };
}

This could be a fix for this lib but I see there is already an open PR. I can propose this fix in another PR if it makes sense

@ljharb
Copy link
Member

ljharb commented Feb 11, 2025

Please don’t open an additional PR; if you have a fix that could work, please post a link to the branch on the existing PR.

@3dos
Copy link

3dos commented Feb 11, 2025

The fix is just there. The branch is more a refactor with a breaking change, this is why I offered to create a simpler PR with the mentioned typing fix.

@ljharb
Copy link
Member

ljharb commented Feb 11, 2025

Since our types are built, that isn’t a possible fix we can apply, unfortunately.

@3dos
Copy link

3dos commented Feb 11, 2025

I don't understand, if your types are generated from the JSDocs, then the fix seems pretty simple; Change Record<string, ReactFlatConfig> to Record<'all' | 'recommended' | 'jsx-runtime', ReactFlatConfig> here:

/** @type {{ deprecatedRules: typeof deprecatedRules, rules: typeof allRules, configs: typeof configs & { flat: Record<string, ReactFlatConfig> }}} */

Or am I missing something?

@CHC383
Copy link
Author

CHC383 commented Feb 11, 2025

@3dos There were two attempts to fix this issue, #3879 and #3882, #3879 was taking the same approach as yours and it didn't work due to #3879 (comment), you could try it yourself by applying your changes locally and test it through #3879 (comment)

# for free to join this conversation on GitHub. Already have an account? # to comment
3 participants