diff --git a/.changeset/no-void-query-fn-ts6-enum.md b/.changeset/no-void-query-fn-ts6-enum.md new file mode 100644 index 00000000000..9c1155cf1fe --- /dev/null +++ b/.changeset/no-void-query-fn-ts6-enum.md @@ -0,0 +1,5 @@ +--- +'@tanstack/eslint-plugin-query': patch +--- + +fix(eslint-plugin-query): fix `no-void-query-fn` false positive on enum returns for typescript 6. diff --git a/packages/eslint-plugin-query/src/__tests__/no-void-query-fn.test.ts b/packages/eslint-plugin-query/src/__tests__/no-void-query-fn.test.ts index c47856fbc67..700a4f95e68 100644 --- a/packages/eslint-plugin-query/src/__tests__/no-void-query-fn.test.ts +++ b/packages/eslint-plugin-query/src/__tests__/no-void-query-fn.test.ts @@ -267,6 +267,84 @@ ruleTester.run('no-void-query-fn', rule, { }) `, }, + { + name: 'queryFn returns a numeric enum member', + code: normalizeIndent` + import { useQuery } from '@tanstack/react-query' + + enum ExampleEnum { + A, + B, + } + + function Component() { + const query = useQuery({ + queryKey: ['test'], + queryFn: () => ExampleEnum.A, + }) + return null + } + `, + }, + { + name: 'queryFn returns a string enum member', + code: normalizeIndent` + import { useQuery } from '@tanstack/react-query' + + enum StringEnum { + Foo = 'foo', + Bar = 'bar', + } + + function Component() { + const query = useQuery({ + queryKey: ['test'], + queryFn: () => StringEnum.Foo, + }) + return null + } + `, + }, + { + name: 'async queryFn returns a numeric enum member', + code: normalizeIndent` + import { useQuery } from '@tanstack/react-query' + + enum Status { + Active, + Inactive, + } + + function Component() { + const query = useQuery({ + queryKey: ['test'], + queryFn: async () => { + return Status.Active + }, + }) + return null + } + `, + }, + { + name: 'queryFn returns a const enum member', + code: normalizeIndent` + import { useQuery } from '@tanstack/react-query' + + const enum Direction { + Up = 'UP', + Down = 'DOWN', + } + + function Component() { + const query = useQuery({ + queryKey: ['test'], + queryFn: () => Direction.Up, + }) + return null + } + `, + }, ], invalid: [ { diff --git a/packages/eslint-plugin-query/src/rules/no-void-query-fn/no-void-query-fn.rule.ts b/packages/eslint-plugin-query/src/rules/no-void-query-fn/no-void-query-fn.rule.ts index 5a8708efc0c..cda036aaed5 100644 --- a/packages/eslint-plugin-query/src/rules/no-void-query-fn/no-void-query-fn.rule.ts +++ b/packages/eslint-plugin-query/src/rules/no-void-query-fn/no-void-query-fn.rule.ts @@ -5,11 +5,6 @@ import { getDocsUrl } from '../../utils/get-docs-url' import type { ParserServicesWithTypeInformation } from '@typescript-eslint/utils' import type { ExtraRuleDocs } from '../../types' -const TypeFlags = { - Void: 16384, - Undefined: 32768, -} as const - export const name = 'no-void-query-fn' const createRule = ESLintUtils.RuleCreator(getDocsUrl) @@ -87,5 +82,6 @@ function isIllegalReturn(checker: TypeChecker, type: Type): boolean { return awaited.types.some((t) => isIllegalReturn(checker, t)) } - return awaited.flags & (TypeFlags.Void | TypeFlags.Undefined) ? true : false + const typeString = checker.typeToString(awaited) + return typeString === 'void' || typeString === 'undefined' }