Skip to content

[enhancement]: flat configs are possibly undefined #3878

@CHC383

Description

@CHC383

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

Activity

added a commit that references this issue on Jan 14, 2025
063db21
linked a pull request that will close this issue on Jan 14, 2025
ljharb

ljharb commented on Jan 14, 2025

@ljharb
Member

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

changed the title [-][Bug]: flat configs are possibly undefined[/-] [+][enhancement]: flat configs are possibly undefined[/+] on Jan 14, 2025
added 4 commits that reference this issue on Jan 14, 2025
38fb151
cd30752
b7ad705
c51432e
CHC383

CHC383 commented on Jan 14, 2025

@CHC383
Author

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,
added a commit that references this issue on Jan 25, 2025
cd3665a
linked a pull request that will close this issue on Jan 25, 2025
3dos

3dos commented on Feb 11, 2025

@3dos

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

ljharb commented on Feb 11, 2025

@ljharb
Member

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

3dos commented on Feb 11, 2025

@3dos

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

ljharb commented on Feb 11, 2025

@ljharb
Member

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

3dos

3dos commented on Feb 11, 2025

@3dos

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

CHC383 commented on Feb 11, 2025

@CHC383
Author

@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)

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

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Participants

      @ljharb@3dos@CHC383

      Issue actions

        [enhancement]: flat configs are possibly undefined · Issue #3878 · jsx-eslint/eslint-plugin-react