Skip to content

Commit 709971d

Browse files
park-jeminTkDodo
andauthored
fix(eslint-plugin-query): fix no-void-query-fn false positive on enums for TS 6 (TanStack#10460)
Co-authored-by: Dominik Dorfmeister 🔮 <office@dorfmeister.cc>
1 parent 608706e commit 709971d

File tree

3 files changed

+85
-6
lines changed

3 files changed

+85
-6
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@tanstack/eslint-plugin-query': patch
3+
---
4+
5+
fix(eslint-plugin-query): fix `no-void-query-fn` false positive on enum returns for typescript 6.

packages/eslint-plugin-query/src/__tests__/no-void-query-fn.test.ts

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,84 @@ ruleTester.run('no-void-query-fn', rule, {
267267
})
268268
`,
269269
},
270+
{
271+
name: 'queryFn returns a numeric enum member',
272+
code: normalizeIndent`
273+
import { useQuery } from '@tanstack/react-query'
274+
275+
enum ExampleEnum {
276+
A,
277+
B,
278+
}
279+
280+
function Component() {
281+
const query = useQuery({
282+
queryKey: ['test'],
283+
queryFn: () => ExampleEnum.A,
284+
})
285+
return null
286+
}
287+
`,
288+
},
289+
{
290+
name: 'queryFn returns a string enum member',
291+
code: normalizeIndent`
292+
import { useQuery } from '@tanstack/react-query'
293+
294+
enum StringEnum {
295+
Foo = 'foo',
296+
Bar = 'bar',
297+
}
298+
299+
function Component() {
300+
const query = useQuery({
301+
queryKey: ['test'],
302+
queryFn: () => StringEnum.Foo,
303+
})
304+
return null
305+
}
306+
`,
307+
},
308+
{
309+
name: 'async queryFn returns a numeric enum member',
310+
code: normalizeIndent`
311+
import { useQuery } from '@tanstack/react-query'
312+
313+
enum Status {
314+
Active,
315+
Inactive,
316+
}
317+
318+
function Component() {
319+
const query = useQuery({
320+
queryKey: ['test'],
321+
queryFn: async () => {
322+
return Status.Active
323+
},
324+
})
325+
return null
326+
}
327+
`,
328+
},
329+
{
330+
name: 'queryFn returns a const enum member',
331+
code: normalizeIndent`
332+
import { useQuery } from '@tanstack/react-query'
333+
334+
const enum Direction {
335+
Up = 'UP',
336+
Down = 'DOWN',
337+
}
338+
339+
function Component() {
340+
const query = useQuery({
341+
queryKey: ['test'],
342+
queryFn: () => Direction.Up,
343+
})
344+
return null
345+
}
346+
`,
347+
},
270348
],
271349
invalid: [
272350
{

packages/eslint-plugin-query/src/rules/no-void-query-fn/no-void-query-fn.rule.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,6 @@ import { getDocsUrl } from '../../utils/get-docs-url'
55
import type { ParserServicesWithTypeInformation } from '@typescript-eslint/utils'
66
import type { ExtraRuleDocs } from '../../types'
77

8-
const TypeFlags = {
9-
Void: 16384,
10-
Undefined: 32768,
11-
} as const
12-
138
export const name = 'no-void-query-fn'
149

1510
const createRule = ESLintUtils.RuleCreator<ExtraRuleDocs>(getDocsUrl)
@@ -87,5 +82,6 @@ function isIllegalReturn(checker: TypeChecker, type: Type): boolean {
8782
return awaited.types.some((t) => isIllegalReturn(checker, t))
8883
}
8984

90-
return awaited.flags & (TypeFlags.Void | TypeFlags.Undefined) ? true : false
85+
const typeString = checker.typeToString(awaited)
86+
return typeString === 'void' || typeString === 'undefined'
9187
}

0 commit comments

Comments
 (0)