Skip to content

Commit 82adc95

Browse files
authored
fix(eslint-plugin-query): run exhaustive dep check on referenced query key (#4480)
* run exhaustive dep check on referenced query key * fix various eslint issues
1 parent 67ddf17 commit 82adc95

File tree

3 files changed

+46
-2
lines changed

3 files changed

+46
-2
lines changed

packages/eslint-plugin-query/src/rules/exhaustive-deps/exhaustive-deps.rule.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,13 +56,26 @@ export const rule = createRule({
5656
return
5757
}
5858

59-
if (queryKey.value.type !== AST_NODE_TYPES.ArrayExpression) {
59+
let queryKeyNode = queryKey.value
60+
61+
if (queryKeyNode.type === AST_NODE_TYPES.Identifier) {
62+
const expression = ASTUtils.getReferencedExpressionByIdentifier({
63+
context,
64+
node: queryKeyNode,
65+
})
66+
67+
if (expression?.type === AST_NODE_TYPES.ArrayExpression) {
68+
queryKeyNode = expression
69+
}
70+
}
71+
72+
if (queryKeyNode.type !== AST_NODE_TYPES.ArrayExpression) {
6073
// TODO support query key factory
6174
return
6275
}
6376

6477
const sourceCode = context.getSourceCode()
65-
const queryKeyValue = queryKey.value
78+
const queryKeyValue = queryKeyNode
6679
const refs = ASTUtils.getExternalRefs({
6780
scopeManager,
6881
node: queryFn.value,

packages/eslint-plugin-query/src/rules/exhaustive-deps/exhaustive-deps.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ ruleTester.run('exhaustive-deps', rule, {
181181
suggestions: [
182182
{
183183
messageId: 'fixTo',
184+
// eslint-disable-next-line no-template-curly-in-string
184185
data: { result: '["entity/${id}", id]' },
185186
output: normalizeIndent`
186187
const id = 1;
@@ -205,6 +206,7 @@ ruleTester.run('exhaustive-deps', rule, {
205206
suggestions: [
206207
{
207208
messageId: 'fixTo',
209+
// eslint-disable-next-line no-template-curly-in-string
208210
data: { result: '[`entity/${a}`, b]' },
209211
output: normalizeIndent`
210212
const a = 1;
@@ -343,5 +345,32 @@ ruleTester.run('exhaustive-deps', rule, {
343345
},
344346
],
345347
},
348+
{
349+
name: 'should fail when a queryKey is a reference of an array expression with a missing dep',
350+
code: normalizeIndent`
351+
const x = 5;
352+
const queryKey = ['foo']
353+
useQuery({ queryKey, queryFn: () => x })
354+
`,
355+
errors: [
356+
{
357+
messageId: 'missingDeps',
358+
data: { deps: 'x' },
359+
suggestions: [
360+
{
361+
messageId: 'fixTo',
362+
data: {
363+
result: "['foo', x]",
364+
},
365+
output: normalizeIndent`
366+
const x = 5;
367+
const queryKey = ['foo', x]
368+
useQuery({ queryKey, queryFn: () => x })
369+
`,
370+
},
371+
],
372+
},
373+
],
374+
},
346375
],
347376
})

packages/eslint-plugin-query/src/utils/detect-react-query-imports.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ export function detectTanstackQueryImports(create: EnhancedCreate): Create {
2626
if (specifier.type === 'ImportSpecifier') {
2727
return node.name === specifier.local.name
2828
}
29+
30+
return false
2931
})
3032
},
3133
}

0 commit comments

Comments
 (0)