Skip to content

Commit 2f6c028

Browse files
authored
fix(eslint-plugin-query): add Suspense query hooks to no-rest-destructuring rule (TanStack#8260)
* fix(eslint-plugin-query): add missing hooks to no-rest-destructuring rule * test(no-rest-destructuring): add test cases for Suspense query hooks
1 parent 3ea6c0c commit 2f6c028

File tree

2 files changed

+189
-2
lines changed

2 files changed

+189
-2
lines changed

packages/eslint-plugin-query/src/__tests__/no-rest-destructuring.test.ts

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,144 @@ ruleTester.run('no-rest-destructuring', rule, {
147147
}
148148
`,
149149
},
150+
{
151+
name: 'useSuspenseQuery is not captured',
152+
code: normalizeIndent`
153+
import { useSuspenseQuery } from '@tanstack/react-query'
154+
155+
function Component() {
156+
useSuspenseQuery()
157+
return
158+
}
159+
`,
160+
},
161+
{
162+
name: 'useSuspenseQuery is not destructured',
163+
code: normalizeIndent`
164+
import { useSuspenseQuery } from '@tanstack/react-query'
165+
166+
function Component() {
167+
const query = useSuspenseQuery()
168+
return
169+
}
170+
`,
171+
},
172+
{
173+
name: 'useSuspenseQuery is destructured without rest',
174+
code: normalizeIndent`
175+
import { useSuspenseQuery } from '@tanstack/react-query'
176+
177+
function Component() {
178+
const { data, isLoading, isError } = useSuspenseQuery()
179+
return
180+
}
181+
`,
182+
},
183+
{
184+
name: 'useSuspenseInfiniteQuery is not captured',
185+
code: normalizeIndent`
186+
import { useSuspenseInfiniteQuery } from '@tanstack/react-query'
187+
188+
function Component() {
189+
useSuspenseInfiniteQuery()
190+
return
191+
}
192+
`,
193+
},
194+
{
195+
name: 'useSuspenseInfiniteQuery is not destructured',
196+
code: normalizeIndent`
197+
import { useSuspenseInfiniteQuery } from '@tanstack/react-query'
198+
199+
function Component() {
200+
const query = useSuspenseInfiniteQuery()
201+
return
202+
}
203+
`,
204+
},
205+
{
206+
name: 'useSuspenseInfiniteQuery is destructured without rest',
207+
code: normalizeIndent`
208+
import { useSuspenseInfiniteQuery } from '@tanstack/react-query'
209+
210+
function Component() {
211+
const { data, isLoading, isError } = useSuspenseInfiniteQuery()
212+
return
213+
}
214+
`,
215+
},
216+
{
217+
name: 'useSuspenseQueries is not captured',
218+
code: normalizeIndent`
219+
import { useSuspenseQueries } from '@tanstack/react-query'
220+
221+
function Component() {
222+
useSuspenseQueries([])
223+
return
224+
}
225+
`,
226+
},
227+
{
228+
name: 'useSuspenseQueries is not destructured',
229+
code: normalizeIndent`
230+
import { useSuspenseQueries } from '@tanstack/react-query'
231+
232+
function Component() {
233+
const queries = useSuspenseQueries([])
234+
return
235+
}
236+
`,
237+
},
238+
{
239+
name: 'useSuspenseQueries array has no rest destructured element',
240+
code: normalizeIndent`
241+
import { useSuspenseQueries } from '@tanstack/react-query'
242+
243+
function Component() {
244+
const [query1, { data, isLoading }] = useSuspenseQueries([
245+
{ queryKey: ['key1'], queryFn: () => {} },
246+
{ queryKey: ['key2'], queryFn: () => {} },
247+
])
248+
return
249+
}
250+
`,
251+
},
252+
{
253+
name: 'useSuspenseQuery is destructured with rest but not from tanstack query',
254+
code: normalizeIndent`
255+
import { useSuspenseQuery } from 'other-package'
256+
257+
function Component() {
258+
const { data, ...rest } = useSuspenseQuery()
259+
return
260+
}
261+
`,
262+
},
263+
{
264+
name: 'useSuspenseInfiniteQuery is destructured with rest but not from tanstack query',
265+
code: normalizeIndent`
266+
import { useSuspenseInfiniteQuery } from 'other-package'
267+
268+
function Component() {
269+
const { data, ...rest } = useSuspenseInfiniteQuery()
270+
return
271+
}
272+
`,
273+
},
274+
{
275+
name: 'useSuspenseQueries array has rest destructured element but not from tanstack query',
276+
code: normalizeIndent`
277+
import { useSuspenseQueries } from 'other-package'
278+
279+
function Component() {
280+
const [query1, { data, ...rest }] = useSuspenseQueries([
281+
{ queryKey: ['key1'], queryFn: () => {} },
282+
{ queryKey: ['key2'], queryFn: () => {} },
283+
])
284+
return
285+
}
286+
`,
287+
},
150288
],
151289
invalid: [
152290
{
@@ -188,5 +326,44 @@ ruleTester.run('no-rest-destructuring', rule, {
188326
`,
189327
errors: [{ messageId: 'objectRestDestructure' }],
190328
},
329+
{
330+
name: 'useSuspenseQuery is destructured with rest',
331+
code: normalizeIndent`
332+
import { useSuspenseQuery } from '@tanstack/react-query'
333+
334+
function Component() {
335+
const { data, ...rest } = useSuspenseQuery()
336+
return
337+
}
338+
`,
339+
errors: [{ messageId: 'objectRestDestructure' }],
340+
},
341+
{
342+
name: 'useSuspenseInfiniteQuery is destructured with rest',
343+
code: normalizeIndent`
344+
import { useSuspenseInfiniteQuery } from '@tanstack/react-query'
345+
346+
function Component() {
347+
const { data, ...rest } = useSuspenseInfiniteQuery()
348+
return
349+
}
350+
`,
351+
errors: [{ messageId: 'objectRestDestructure' }],
352+
},
353+
{
354+
name: 'useSuspenseQueries is destructured with rest',
355+
code: normalizeIndent`
356+
import { useSuspenseQueries } from '@tanstack/react-query'
357+
358+
function Component() {
359+
const [query1, { data, ...rest }] = useSuspenseQueries([
360+
{ queryKey: ['key1'], queryFn: () => {} },
361+
{ queryKey: ['key2'], queryFn: () => {} },
362+
])
363+
return
364+
}
365+
`,
366+
errors: [{ messageId: 'objectRestDestructure' }],
367+
},
191368
],
192369
})

packages/eslint-plugin-query/src/rules/no-rest-destructuring/no-rest-destructuring.rule.ts

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,14 @@ import type { ExtraRuleDocs } from '../../types'
77

88
export const name = 'no-rest-destructuring'
99

10-
const queryHooks = ['useQuery', 'useQueries', 'useInfiniteQuery']
10+
const queryHooks = [
11+
'useQuery',
12+
'useQueries',
13+
'useInfiniteQuery',
14+
'useSuspenseQuery',
15+
'useSuspenseQueries',
16+
'useSuspenseInfiniteQuery',
17+
]
1118

1219
const createRule = ESLintUtils.RuleCreator<ExtraRuleDocs>(getDocsUrl)
1320

@@ -38,7 +45,10 @@ export const rule = createRule({
3845
}
3946

4047
const returnValue = node.parent.id
41-
if (node.callee.name !== 'useQueries') {
48+
if (
49+
node.callee.name !== 'useQueries' &&
50+
node.callee.name !== 'useSuspenseQueries'
51+
) {
4252
if (NoRestDestructuringUtils.isObjectRestDestructuring(returnValue)) {
4353
context.report({
4454
node: node.parent,

0 commit comments

Comments
 (0)