@tanstack/eslint-plugin-query 5.0.0-alpha.88 → 5.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,437 +1,34 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }// src/rules/exhaustive-deps/exhaustive-deps.rule.ts
2
- var _utils = require('@typescript-eslint/utils');
3
-
4
- // src/utils/ast-utils.ts
5
-
6
-
7
- // src/utils/unique-by.ts
8
- function uniqueBy(arr, fn) {
9
- return arr.filter((x, i, a) => a.findIndex((y) => fn(x) === fn(y)) === i);
10
- }
11
-
12
- // src/utils/ast-utils.ts
13
- var ASTUtils = {
14
- isNodeOfOneOf(node, types) {
15
- return types.includes(node.type);
16
- },
17
- isIdentifier(node) {
18
- return node.type === _utils.AST_NODE_TYPES.Identifier;
19
- },
20
- isIdentifierWithName(node, name2) {
21
- return ASTUtils.isIdentifier(node) && node.name === name2;
22
- },
23
- isIdentifierWithOneOfNames(node, name2) {
24
- return ASTUtils.isIdentifier(node) && name2.includes(node.name);
25
- },
26
- isProperty(node) {
27
- return node.type === _utils.AST_NODE_TYPES.Property;
28
- },
29
- isObjectExpression(node) {
30
- return node.type === _utils.AST_NODE_TYPES.ObjectExpression;
31
- },
32
- isPropertyWithIdentifierKey(node, key) {
33
- return ASTUtils.isProperty(node) && ASTUtils.isIdentifierWithName(node.key, key);
34
- },
35
- findPropertyWithIdentifierKey(properties, key) {
36
- return properties.find(
37
- (x) => ASTUtils.isPropertyWithIdentifierKey(x, key)
38
- );
39
- },
40
- getNestedIdentifiers(node) {
41
- const identifiers = [];
42
- if (ASTUtils.isIdentifier(node)) {
43
- identifiers.push(node);
44
- }
45
- if ("arguments" in node) {
46
- node.arguments.forEach((x) => {
47
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
48
- });
49
- }
50
- if ("elements" in node) {
51
- node.elements.forEach((x) => {
52
- if (x !== null) {
53
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
54
- }
55
- });
56
- }
57
- if ("properties" in node) {
58
- node.properties.forEach((x) => {
59
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
60
- });
61
- }
62
- if ("expressions" in node) {
63
- node.expressions.forEach((x) => {
64
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
65
- });
66
- }
67
- if (node.type === _utils.AST_NODE_TYPES.Property) {
68
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.value));
69
- }
70
- if (node.type === _utils.AST_NODE_TYPES.SpreadElement) {
71
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument));
72
- }
73
- if (node.type === _utils.AST_NODE_TYPES.MemberExpression) {
74
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.object));
75
- }
76
- if (node.type === _utils.AST_NODE_TYPES.UnaryExpression) {
77
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument));
78
- }
79
- if (node.type === _utils.AST_NODE_TYPES.ChainExpression) {
80
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression));
81
- }
82
- if (node.type === _utils.AST_NODE_TYPES.TSNonNullExpression) {
83
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression));
84
- }
85
- return identifiers;
86
- },
87
- isAncestorIsCallee(identifier) {
88
- let previousNode = identifier;
89
- let currentNode = identifier.parent;
90
- while (currentNode !== void 0) {
91
- if (currentNode.type === _utils.AST_NODE_TYPES.CallExpression && currentNode.callee === previousNode) {
92
- return true;
93
- }
94
- if (currentNode.type !== _utils.AST_NODE_TYPES.MemberExpression) {
95
- return false;
96
- }
97
- previousNode = currentNode;
98
- currentNode = currentNode.parent;
99
- }
100
- return false;
101
- },
102
- traverseUpOnly(identifier, allowedNodeTypes) {
103
- const parent = identifier.parent;
104
- if (parent !== void 0 && allowedNodeTypes.includes(parent.type)) {
105
- return ASTUtils.traverseUpOnly(parent, allowedNodeTypes);
106
- }
107
- return identifier;
108
- },
109
- isDeclaredInNode(params) {
110
- const { functionNode, reference, scopeManager } = params;
111
- const scope = scopeManager.acquire(functionNode);
112
- if (scope === null) {
113
- return false;
114
- }
115
- return scope.set.has(reference.identifier.name);
116
- },
117
- getExternalRefs(params) {
118
- const { scopeManager, sourceCode, node } = params;
119
- const scope = scopeManager.acquire(node);
120
- if (scope === null) {
121
- return [];
122
- }
123
- const references = scope.references.filter((x) => x.isRead() && !scope.set.has(x.identifier.name)).map((x) => {
124
- const referenceNode = ASTUtils.traverseUpOnly(x.identifier, [
125
- _utils.AST_NODE_TYPES.MemberExpression,
126
- _utils.AST_NODE_TYPES.Identifier
127
- ]);
128
- return {
129
- variable: x,
130
- node: referenceNode,
131
- text: sourceCode.getText(referenceNode)
132
- };
133
- });
134
- const localRefIds = new Set(
135
- [...scope.set.values()].map((x) => sourceCode.getText(x.identifiers[0]))
136
- );
137
- const externalRefs = references.filter(
138
- (x) => x.variable.resolved === null || !localRefIds.has(x.text)
139
- );
140
- return uniqueBy(externalRefs, (x) => x.text).map((x) => x.variable);
141
- },
142
- mapKeyNodeToText(node, sourceCode) {
143
- return sourceCode.getText(
144
- ASTUtils.traverseUpOnly(node, [
145
- _utils.AST_NODE_TYPES.MemberExpression,
146
- _utils.AST_NODE_TYPES.Identifier
147
- ])
148
- );
149
- },
150
- isValidReactComponentOrHookName(identifier) {
151
- return identifier !== null && /^(use|[A-Z])/.test(identifier.name);
152
- },
153
- getFunctionAncestor(context) {
154
- return context.getAncestors().find((x) => {
155
- var _a;
156
- if (x.type === _utils.AST_NODE_TYPES.FunctionDeclaration) {
157
- return true;
158
- }
159
- return ((_a = x.parent) == null ? void 0 : _a.type) === _utils.AST_NODE_TYPES.VariableDeclarator && x.parent.id.type === _utils.AST_NODE_TYPES.Identifier && ASTUtils.isNodeOfOneOf(x, [
160
- _utils.AST_NODE_TYPES.FunctionDeclaration,
161
- _utils.AST_NODE_TYPES.FunctionExpression,
162
- _utils.AST_NODE_TYPES.ArrowFunctionExpression
163
- ]);
164
- });
165
- },
166
- getReferencedExpressionByIdentifier(params) {
167
- var _a, _b, _c;
168
- const { node, context } = params;
169
- const resolvedNode = (_c = (_b = (_a = context.getScope().references.find((ref) => ref.identifier === node)) == null ? void 0 : _a.resolved) == null ? void 0 : _b.defs[0]) == null ? void 0 : _c.node;
170
- if ((resolvedNode == null ? void 0 : resolvedNode.type) !== _utils.AST_NODE_TYPES.VariableDeclarator) {
171
- return null;
172
- }
173
- return resolvedNode.init;
174
- },
175
- getNestedReturnStatements(node) {
176
- const returnStatements = [];
177
- if (node.type === _utils.AST_NODE_TYPES.ReturnStatement) {
178
- returnStatements.push(node);
179
- }
180
- if ("body" in node && node.body !== void 0 && node.body !== null) {
181
- Array.isArray(node.body) ? node.body.forEach((x) => {
182
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
183
- }) : returnStatements.push(
184
- ...ASTUtils.getNestedReturnStatements(node.body)
185
- );
186
- }
187
- if ("consequent" in node) {
188
- Array.isArray(node.consequent) ? node.consequent.forEach((x) => {
189
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
190
- }) : returnStatements.push(
191
- ...ASTUtils.getNestedReturnStatements(node.consequent)
192
- );
193
- }
194
- if ("alternate" in node && node.alternate !== null) {
195
- Array.isArray(node.alternate) ? node.alternate.forEach((x) => {
196
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
197
- }) : returnStatements.push(
198
- ...ASTUtils.getNestedReturnStatements(node.alternate)
199
- );
200
- }
201
- if ("cases" in node) {
202
- node.cases.forEach((x) => {
203
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
204
- });
205
- }
206
- if ("block" in node) {
207
- returnStatements.push(...ASTUtils.getNestedReturnStatements(node.block));
208
- }
209
- if ("handler" in node && node.handler !== null) {
210
- returnStatements.push(...ASTUtils.getNestedReturnStatements(node.handler));
211
- }
212
- if ("finalizer" in node && node.finalizer !== null) {
213
- returnStatements.push(
214
- ...ASTUtils.getNestedReturnStatements(node.finalizer)
215
- );
216
- }
217
- if ("expression" in node && node.expression !== true && node.expression !== false) {
218
- returnStatements.push(
219
- ...ASTUtils.getNestedReturnStatements(node.expression)
220
- );
221
- }
222
- if ("test" in node && node.test !== null) {
223
- returnStatements.push(...ASTUtils.getNestedReturnStatements(node.test));
224
- }
225
- return returnStatements;
226
- }
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
227
9
  };
228
-
229
- // src/utils/create-rule.ts
230
-
231
-
232
- // src/utils/detect-react-query-imports.ts
233
- function detectTanstackQueryImports(create) {
234
- return (context, optionsWithDefault) => {
235
- const tanstackQueryImportSpecifiers = [];
236
- const helpers = {
237
- isTanstackQueryImport(node) {
238
- return !!tanstackQueryImportSpecifiers.find((specifier) => {
239
- if (specifier.type === "ImportSpecifier") {
240
- return node.name === specifier.local.name;
241
- }
242
- return false;
243
- });
244
- }
245
- };
246
- const detectionInstructions = {
247
- ImportDeclaration(node) {
248
- if (node.specifiers.length > 0 && node.importKind === "value" && node.source.value.startsWith("@tanstack/") && node.source.value.endsWith("-query")) {
249
- tanstackQueryImportSpecifiers.push(...node.specifiers);
250
- }
251
- }
252
- };
253
- const ruleInstructions = create(context, optionsWithDefault, helpers);
254
- const enhancedRuleInstructions = {};
255
- const allKeys = new Set(
256
- Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions))
257
- );
258
- allKeys.forEach((instruction) => {
259
- enhancedRuleInstructions[instruction] = (node) => {
260
- var _a, _b;
261
- if (instruction in detectionInstructions) {
262
- (_a = detectionInstructions[instruction]) == null ? void 0 : _a.call(detectionInstructions, node);
263
- }
264
- if (ruleInstructions[instruction]) {
265
- return (_b = ruleInstructions[instruction]) == null ? void 0 : _b.call(ruleInstructions, node);
266
- }
267
- return void 0;
268
- };
269
- });
270
- return enhancedRuleInstructions;
271
- };
272
- }
273
-
274
- // src/utils/create-rule.ts
275
- var getDocsUrl = (ruleName) => `https://tanstack.com/query/v4/docs/eslint/${ruleName}`;
276
- function createRule({ create, ...rest }) {
277
- return _utils.ESLintUtils.RuleCreator(getDocsUrl)({
278
- ...rest,
279
- create: detectTanstackQueryImports(create)
280
- });
281
- }
282
-
283
- // src/rules/exhaustive-deps/exhaustive-deps.utils.ts
284
-
285
- var ExhaustiveDepsUtils = {
286
- isRelevantReference(params) {
287
- var _a;
288
- const { reference, scopeManager, context } = params;
289
- const component = ASTUtils.getFunctionAncestor(context);
290
- if (component !== void 0 && !ASTUtils.isDeclaredInNode({
291
- scopeManager,
292
- reference,
293
- functionNode: component
294
- })) {
295
- return false;
296
- }
297
- return reference.identifier.name !== "undefined" && ((_a = reference.identifier.parent) == null ? void 0 : _a.type) !== _utils.AST_NODE_TYPES.NewExpression && !ExhaustiveDepsUtils.isQueryClientReference(reference);
298
- },
299
- isQueryClientReference(reference) {
300
- var _a, _b, _c;
301
- const declarator = (_b = (_a = reference.resolved) == null ? void 0 : _a.defs[0]) == null ? void 0 : _b.node;
302
- return (declarator == null ? void 0 : declarator.type) === _utils.AST_NODE_TYPES.VariableDeclarator && ((_c = declarator.init) == null ? void 0 : _c.type) === _utils.AST_NODE_TYPES.CallExpression && declarator.init.callee.type === _utils.AST_NODE_TYPES.Identifier && declarator.init.callee.name === "useQueryClient";
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
303
15
  }
16
+ return to;
304
17
  };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
305
19
 
306
- // src/rules/exhaustive-deps/exhaustive-deps.rule.ts
307
- var QUERY_KEY = "queryKey";
308
- var QUERY_FN = "queryFn";
309
- var name = "exhaustive-deps";
310
- var rule = createRule({
311
- name,
312
- meta: {
313
- type: "problem",
314
- docs: {
315
- description: "Exhaustive deps rule for useQuery",
316
- recommended: "error"
317
- },
318
- messages: {
319
- missingDeps: `The following dependencies are missing in your queryKey: {{deps}}`,
320
- fixTo: "Fix to {{result}}"
321
- },
322
- hasSuggestions: true,
323
- fixable: "code",
324
- schema: []
325
- },
326
- defaultOptions: [],
327
- create(context) {
328
- return {
329
- Property(node) {
330
- if (node.parent === void 0 || !ASTUtils.isObjectExpression(node.parent) || !ASTUtils.isIdentifierWithName(node.key, QUERY_KEY)) {
331
- return;
332
- }
333
- const scopeManager = context.getSourceCode().scopeManager;
334
- const queryKey = ASTUtils.findPropertyWithIdentifierKey(
335
- node.parent.properties,
336
- QUERY_KEY
337
- );
338
- const queryFn = ASTUtils.findPropertyWithIdentifierKey(
339
- node.parent.properties,
340
- QUERY_FN
341
- );
342
- if (scopeManager === null || queryKey === void 0 || queryFn === void 0 || queryFn.value.type !== _utils.AST_NODE_TYPES.ArrowFunctionExpression) {
343
- return;
344
- }
345
- let queryKeyNode = queryKey.value;
346
- if (queryKeyNode.type === _utils.AST_NODE_TYPES.TSAsExpression && queryKeyNode.expression.type === _utils.AST_NODE_TYPES.ArrayExpression) {
347
- queryKeyNode = queryKeyNode.expression;
348
- }
349
- if (queryKeyNode.type === _utils.AST_NODE_TYPES.Identifier) {
350
- const expression = ASTUtils.getReferencedExpressionByIdentifier({
351
- context,
352
- node: queryKeyNode
353
- });
354
- if ((expression == null ? void 0 : expression.type) === _utils.AST_NODE_TYPES.ArrayExpression) {
355
- queryKeyNode = expression;
356
- }
357
- }
358
- const sourceCode = context.getSourceCode();
359
- const queryKeyValue = queryKeyNode;
360
- const externalRefs = ASTUtils.getExternalRefs({
361
- scopeManager,
362
- sourceCode,
363
- node: queryFn.value
364
- });
365
- const relevantRefs = externalRefs.filter(
366
- (reference) => ExhaustiveDepsUtils.isRelevantReference({
367
- context,
368
- reference,
369
- scopeManager
370
- })
371
- );
372
- const existingKeys = ASTUtils.getNestedIdentifiers(queryKeyValue).map(
373
- (identifier) => ASTUtils.mapKeyNodeToText(identifier, sourceCode)
374
- );
375
- const missingRefs = relevantRefs.map((ref) => ({
376
- ref,
377
- text: ASTUtils.mapKeyNodeToText(ref.identifier, sourceCode)
378
- })).filter(({ ref, text }) => {
379
- return !ref.isTypeReference && !ASTUtils.isAncestorIsCallee(ref.identifier) && !existingKeys.some((existingKey) => existingKey === text) && !existingKeys.includes(_nullishCoalesce(text.split(".")[0], () => ( "")));
380
- }).map(({ ref, text }) => ({
381
- identifier: ref.identifier,
382
- text
383
- }));
384
- const uniqueMissingRefs = uniqueBy(missingRefs, (x) => x.text);
385
- if (uniqueMissingRefs.length > 0) {
386
- const missingAsText = uniqueMissingRefs.map((ref) => ASTUtils.mapKeyNodeToText(ref.identifier, sourceCode)).join(", ");
387
- const existingWithMissing = sourceCode.getText(queryKeyValue).replace(/\]$/, `, ${missingAsText}]`);
388
- const suggestions = [];
389
- if (queryKeyNode.type === _utils.AST_NODE_TYPES.ArrayExpression) {
390
- suggestions.push({
391
- messageId: "fixTo",
392
- data: { result: existingWithMissing },
393
- fix(fixer) {
394
- return fixer.replaceText(queryKeyValue, existingWithMissing);
395
- }
396
- });
397
- }
398
- context.report({
399
- node,
400
- messageId: "missingDeps",
401
- data: {
402
- deps: uniqueMissingRefs.map((ref) => ref.text).join(", ")
403
- },
404
- suggest: suggestions
405
- });
406
- }
407
- }
408
- };
409
- }
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ configs: () => import_configs.configs,
24
+ rules: () => import_rules.rules
25
+ });
26
+ module.exports = __toCommonJS(src_exports);
27
+ var import_configs = require("./configs.cjs");
28
+ var import_rules = require("./rules.cjs");
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ configs,
32
+ rules
410
33
  });
411
-
412
- // src/rules/index.ts
413
- var rules = {
414
- [name]: rule
415
- };
416
-
417
- // src/configs/index.ts
418
- function generateRecommendedConfig(allRules) {
419
- return Object.entries(allRules).reduce((memo, [name2, rule2]) => {
420
- const { recommended } = rule2.meta.docs || {};
421
- return {
422
- ...memo,
423
- ...recommended ? { [`@tanstack/query/${name2}`]: recommended } : {}
424
- };
425
- }, {});
426
- }
427
- var configs = {
428
- recommended: {
429
- plugins: ["@tanstack/eslint-plugin-query"],
430
- rules: generateRecommendedConfig(rules)
431
- }
432
- };
433
-
434
-
435
-
436
- exports.configs = configs; exports.rules = rules;
437
34
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/rules/exhaustive-deps/exhaustive-deps.rule.ts","../../src/utils/ast-utils.ts","../../src/utils/unique-by.ts","../../src/utils/create-rule.ts","../../src/utils/detect-react-query-imports.ts","../../src/rules/exhaustive-deps/exhaustive-deps.utils.ts","../../src/rules/index.ts","../../src/configs/index.ts"],"names":["AST_NODE_TYPES","name","rule"],"mappings":"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","sourcesContent":["import { AST_NODE_TYPES } from '@typescript-eslint/utils'\nimport { ASTUtils } from '../../utils/ast-utils'\nimport { createRule } from '../../utils/create-rule'\nimport { uniqueBy } from '../../utils/unique-by'\nimport { ExhaustiveDepsUtils } from './exhaustive-deps.utils'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nconst QUERY_KEY = 'queryKey'\nconst QUERY_FN = 'queryFn'\n\nexport const name = 'exhaustive-deps'\n\nexport const rule = createRule({\n name,\n meta: {\n type: 'problem',\n docs: {\n description: 'Exhaustive deps rule for useQuery',\n recommended: 'error',\n },\n messages: {\n missingDeps: `The following dependencies are missing in your queryKey: {{deps}}`,\n fixTo: 'Fix to {{result}}',\n },\n hasSuggestions: true,\n fixable: 'code',\n schema: [],\n },\n defaultOptions: [],\n\n create(context) {\n return {\n Property(node) {\n if (\n node.parent === undefined ||\n !ASTUtils.isObjectExpression(node.parent) ||\n !ASTUtils.isIdentifierWithName(node.key, QUERY_KEY)\n ) {\n return\n }\n\n const scopeManager = context.getSourceCode().scopeManager\n const queryKey = ASTUtils.findPropertyWithIdentifierKey(\n node.parent.properties,\n QUERY_KEY,\n )\n const queryFn = ASTUtils.findPropertyWithIdentifierKey(\n node.parent.properties,\n QUERY_FN,\n )\n\n if (\n scopeManager === null ||\n queryKey === undefined ||\n queryFn === undefined ||\n queryFn.value.type !== AST_NODE_TYPES.ArrowFunctionExpression\n ) {\n return\n }\n\n let queryKeyNode = queryKey.value\n\n if (\n queryKeyNode.type === AST_NODE_TYPES.TSAsExpression &&\n queryKeyNode.expression.type === AST_NODE_TYPES.ArrayExpression\n ) {\n queryKeyNode = queryKeyNode.expression\n }\n\n if (queryKeyNode.type === AST_NODE_TYPES.Identifier) {\n const expression = ASTUtils.getReferencedExpressionByIdentifier({\n context,\n node: queryKeyNode,\n })\n\n if (expression?.type === AST_NODE_TYPES.ArrayExpression) {\n queryKeyNode = expression\n }\n }\n\n const sourceCode = context.getSourceCode()\n const queryKeyValue = queryKeyNode\n const externalRefs = ASTUtils.getExternalRefs({\n scopeManager,\n sourceCode,\n node: queryFn.value,\n })\n\n const relevantRefs = externalRefs.filter((reference) =>\n ExhaustiveDepsUtils.isRelevantReference({\n context,\n reference,\n scopeManager,\n }),\n )\n\n const existingKeys = ASTUtils.getNestedIdentifiers(queryKeyValue).map(\n (identifier) => ASTUtils.mapKeyNodeToText(identifier, sourceCode),\n )\n\n const missingRefs = relevantRefs\n .map((ref) => ({\n ref: ref,\n text: ASTUtils.mapKeyNodeToText(ref.identifier, sourceCode),\n }))\n .filter(({ ref, text }) => {\n return (\n !ref.isTypeReference &&\n !ASTUtils.isAncestorIsCallee(ref.identifier) &&\n !existingKeys.some((existingKey) => existingKey === text) &&\n !existingKeys.includes(text.split('.')[0] ?? '')\n )\n })\n .map(({ ref, text }) => ({\n identifier: ref.identifier,\n text: text,\n }))\n\n const uniqueMissingRefs = uniqueBy(missingRefs, (x) => x.text)\n\n if (uniqueMissingRefs.length > 0) {\n const missingAsText = uniqueMissingRefs\n .map((ref) => ASTUtils.mapKeyNodeToText(ref.identifier, sourceCode))\n .join(', ')\n\n const existingWithMissing = sourceCode\n .getText(queryKeyValue)\n .replace(/\\]$/, `, ${missingAsText}]`)\n\n const suggestions: TSESLint.ReportSuggestionArray<string> = []\n\n if (queryKeyNode.type === AST_NODE_TYPES.ArrayExpression) {\n suggestions.push({\n messageId: 'fixTo',\n data: { result: existingWithMissing },\n fix(fixer) {\n return fixer.replaceText(queryKeyValue, existingWithMissing)\n },\n })\n }\n\n context.report({\n node: node,\n messageId: 'missingDeps',\n data: {\n deps: uniqueMissingRefs.map((ref) => ref.text).join(', '),\n },\n suggest: suggestions,\n })\n }\n },\n }\n },\n})\n","import { AST_NODE_TYPES } from '@typescript-eslint/utils'\nimport { uniqueBy } from './unique-by'\nimport type { TSESLint, TSESTree } from '@typescript-eslint/utils'\nimport type TSESLintScopeManager from '@typescript-eslint/scope-manager'\nimport type { RuleContext } from '@typescript-eslint/utils/dist/ts-eslint'\n\nexport const ASTUtils = {\n isNodeOfOneOf<T extends AST_NODE_TYPES>(\n node: TSESTree.Node,\n types: readonly T[],\n ): node is TSESTree.Node & { type: T } {\n return types.includes(node.type as T)\n },\n isIdentifier(node: TSESTree.Node): node is TSESTree.Identifier {\n return node.type === AST_NODE_TYPES.Identifier\n },\n isIdentifierWithName(\n node: TSESTree.Node,\n name: string,\n ): node is TSESTree.Identifier {\n return ASTUtils.isIdentifier(node) && node.name === name\n },\n isIdentifierWithOneOfNames<T extends string[]>(\n node: TSESTree.Node,\n name: T,\n ): node is TSESTree.Identifier & { name: T[number] } {\n return ASTUtils.isIdentifier(node) && name.includes(node.name)\n },\n isProperty(node: TSESTree.Node): node is TSESTree.Property {\n return node.type === AST_NODE_TYPES.Property\n },\n isObjectExpression(node: TSESTree.Node): node is TSESTree.ObjectExpression {\n return node.type === AST_NODE_TYPES.ObjectExpression\n },\n isPropertyWithIdentifierKey(\n node: TSESTree.Node,\n key: string,\n ): node is TSESTree.Property {\n return (\n ASTUtils.isProperty(node) && ASTUtils.isIdentifierWithName(node.key, key)\n )\n },\n findPropertyWithIdentifierKey(\n properties: TSESTree.ObjectLiteralElement[],\n key: string,\n ): TSESTree.Property | undefined {\n return properties.find((x) =>\n ASTUtils.isPropertyWithIdentifierKey(x, key),\n ) as TSESTree.Property | undefined\n },\n getNestedIdentifiers(node: TSESTree.Node): TSESTree.Identifier[] {\n const identifiers: TSESTree.Identifier[] = []\n\n if (ASTUtils.isIdentifier(node)) {\n identifiers.push(node)\n }\n\n if ('arguments' in node) {\n node.arguments.forEach((x) => {\n identifiers.push(...ASTUtils.getNestedIdentifiers(x))\n })\n }\n\n if ('elements' in node) {\n node.elements.forEach((x) => {\n if (x !== null) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(x))\n }\n })\n }\n\n if ('properties' in node) {\n node.properties.forEach((x) => {\n identifiers.push(...ASTUtils.getNestedIdentifiers(x))\n })\n }\n\n if ('expressions' in node) {\n node.expressions.forEach((x) => {\n identifiers.push(...ASTUtils.getNestedIdentifiers(x))\n })\n }\n\n if (node.type === AST_NODE_TYPES.Property) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.value))\n }\n\n if (node.type === AST_NODE_TYPES.SpreadElement) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument))\n }\n\n if (node.type === AST_NODE_TYPES.MemberExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.object))\n }\n\n if (node.type === AST_NODE_TYPES.UnaryExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument))\n }\n\n if (node.type === AST_NODE_TYPES.ChainExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression))\n }\n\n if (node.type === AST_NODE_TYPES.TSNonNullExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression))\n }\n\n return identifiers\n },\n isAncestorIsCallee(identifier: TSESTree.Node) {\n let previousNode = identifier\n let currentNode = identifier.parent\n\n while (currentNode !== undefined) {\n if (\n currentNode.type === AST_NODE_TYPES.CallExpression &&\n currentNode.callee === previousNode\n ) {\n return true\n }\n\n if (currentNode.type !== AST_NODE_TYPES.MemberExpression) {\n return false\n }\n\n previousNode = currentNode\n currentNode = currentNode.parent\n }\n\n return false\n },\n traverseUpOnly(\n identifier: TSESTree.Node,\n allowedNodeTypes: AST_NODE_TYPES[],\n ): TSESTree.Node {\n const parent = identifier.parent\n\n if (parent !== undefined && allowedNodeTypes.includes(parent.type)) {\n return ASTUtils.traverseUpOnly(parent, allowedNodeTypes)\n }\n\n return identifier\n },\n isDeclaredInNode(params: {\n functionNode: TSESTree.Node\n reference: TSESLintScopeManager.Reference\n scopeManager: TSESLint.Scope.ScopeManager\n }) {\n const { functionNode, reference, scopeManager } = params\n const scope = scopeManager.acquire(functionNode)\n\n if (scope === null) {\n return false\n }\n\n return scope.set.has(reference.identifier.name)\n },\n getExternalRefs(params: {\n scopeManager: TSESLint.Scope.ScopeManager\n sourceCode: Readonly<TSESLint.SourceCode>\n node: TSESTree.Node\n }): TSESLint.Scope.Reference[] {\n const { scopeManager, sourceCode, node } = params\n const scope = scopeManager.acquire(node)\n\n if (scope === null) {\n return []\n }\n\n const references = scope.references\n .filter((x) => x.isRead() && !scope.set.has(x.identifier.name))\n .map((x) => {\n const referenceNode = ASTUtils.traverseUpOnly(x.identifier, [\n AST_NODE_TYPES.MemberExpression,\n AST_NODE_TYPES.Identifier,\n ])\n\n return {\n variable: x,\n node: referenceNode,\n text: sourceCode.getText(referenceNode),\n }\n })\n\n const localRefIds = new Set(\n [...scope.set.values()].map((x) => sourceCode.getText(x.identifiers[0])),\n )\n\n const externalRefs = references.filter(\n (x) => x.variable.resolved === null || !localRefIds.has(x.text),\n )\n\n return uniqueBy(externalRefs, (x) => x.text).map((x) => x.variable)\n },\n mapKeyNodeToText(\n node: TSESTree.Node,\n sourceCode: Readonly<TSESLint.SourceCode>,\n ) {\n return sourceCode.getText(\n ASTUtils.traverseUpOnly(node, [\n AST_NODE_TYPES.MemberExpression,\n AST_NODE_TYPES.Identifier,\n ]),\n )\n },\n isValidReactComponentOrHookName(identifier: TSESTree.Identifier | null) {\n return identifier !== null && /^(use|[A-Z])/.test(identifier.name)\n },\n getFunctionAncestor(\n context: Readonly<RuleContext<string, readonly unknown[]>>,\n ) {\n return context.getAncestors().find((x) => {\n if (x.type === AST_NODE_TYPES.FunctionDeclaration) {\n return true\n }\n\n return (\n x.parent?.type === AST_NODE_TYPES.VariableDeclarator &&\n x.parent.id.type === AST_NODE_TYPES.Identifier &&\n ASTUtils.isNodeOfOneOf(x, [\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n ])\n )\n })\n },\n getReferencedExpressionByIdentifier(params: {\n node: TSESTree.Node\n context: Readonly<RuleContext<string, readonly unknown[]>>\n }) {\n const { node, context } = params\n\n const resolvedNode = context\n .getScope()\n .references.find((ref) => ref.identifier === node)?.resolved\n ?.defs[0]?.node\n\n if (resolvedNode?.type !== AST_NODE_TYPES.VariableDeclarator) {\n return null\n }\n\n return resolvedNode.init\n },\n getNestedReturnStatements(node: TSESTree.Node): TSESTree.ReturnStatement[] {\n const returnStatements: TSESTree.ReturnStatement[] = []\n\n if (node.type === AST_NODE_TYPES.ReturnStatement) {\n returnStatements.push(node)\n }\n\n if ('body' in node && node.body !== undefined && node.body !== null) {\n Array.isArray(node.body)\n ? node.body.forEach((x) => {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(x))\n })\n : returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.body),\n )\n }\n\n if ('consequent' in node) {\n Array.isArray(node.consequent)\n ? node.consequent.forEach((x) => {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(x))\n })\n : returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.consequent),\n )\n }\n\n if ('alternate' in node && node.alternate !== null) {\n Array.isArray(node.alternate)\n ? node.alternate.forEach((x) => {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(x))\n })\n : returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.alternate),\n )\n }\n\n if ('cases' in node) {\n node.cases.forEach((x) => {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(x))\n })\n }\n\n if ('block' in node) {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(node.block))\n }\n\n if ('handler' in node && node.handler !== null) {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(node.handler))\n }\n\n if ('finalizer' in node && node.finalizer !== null) {\n returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.finalizer),\n )\n }\n\n if (\n 'expression' in node &&\n node.expression !== true &&\n node.expression !== false\n ) {\n returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.expression),\n )\n }\n\n if ('test' in node && node.test !== null) {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(node.test))\n }\n\n return returnStatements\n },\n}\n","export function uniqueBy<T>(arr: T[], fn: (x: T) => unknown): T[] {\n return arr.filter((x, i, a) => a.findIndex((y) => fn(x) === fn(y)) === i)\n}\n","import { ESLintUtils } from '@typescript-eslint/utils'\nimport { detectTanstackQueryImports } from './detect-react-query-imports'\nimport type { EnhancedCreate } from './detect-react-query-imports'\n\nconst getDocsUrl = (ruleName: string): string =>\n `https://tanstack.com/query/v4/docs/eslint/${ruleName}`\n\ntype EslintRule = Omit<\n Parameters<ReturnType<typeof ESLintUtils.RuleCreator>>[0],\n 'create'\n> & {\n create: EnhancedCreate\n}\n\nexport function createRule({ create, ...rest }: EslintRule) {\n return ESLintUtils.RuleCreator(getDocsUrl)({\n ...rest,\n create: detectTanstackQueryImports(create),\n })\n}\n","import type { ESLintUtils, TSESLint, TSESTree } from '@typescript-eslint/utils'\n\ntype Create = Parameters<\n ReturnType<typeof ESLintUtils.RuleCreator>\n>[0]['create']\n\ntype Context = Parameters<Create>[0]\ntype Options = Parameters<Create>[1]\ntype Helpers = {\n isTanstackQueryImport: (node: TSESTree.Identifier) => boolean\n}\n\nexport type EnhancedCreate = (\n context: Context,\n options: Options,\n helpers: Helpers,\n) => ReturnType<Create>\n\nexport function detectTanstackQueryImports(create: EnhancedCreate): Create {\n return (context, optionsWithDefault) => {\n const tanstackQueryImportSpecifiers: TSESTree.ImportClause[] = []\n\n const helpers: Helpers = {\n isTanstackQueryImport(node) {\n return !!tanstackQueryImportSpecifiers.find((specifier) => {\n if (specifier.type === 'ImportSpecifier') {\n return node.name === specifier.local.name\n }\n\n return false\n })\n },\n }\n\n const detectionInstructions: TSESLint.RuleListener = {\n ImportDeclaration(node) {\n if (\n node.specifiers.length > 0 &&\n node.importKind === 'value' &&\n node.source.value.startsWith('@tanstack/') &&\n node.source.value.endsWith('-query')\n ) {\n tanstackQueryImportSpecifiers.push(...node.specifiers)\n }\n },\n }\n\n // Call original rule definition\n const ruleInstructions = create(context, optionsWithDefault, helpers)\n const enhancedRuleInstructions: TSESLint.RuleListener = {}\n\n const allKeys = new Set(\n Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions)),\n )\n\n // Iterate over ALL instructions keys so we can override original rule instructions\n // to prevent their execution if conditions to report errors are not met.\n allKeys.forEach((instruction) => {\n enhancedRuleInstructions[instruction] = (node) => {\n if (instruction in detectionInstructions) {\n detectionInstructions[instruction]?.(node)\n }\n\n // TODO: canReportErrors()\n if (ruleInstructions[instruction]) {\n return ruleInstructions[instruction]?.(node)\n }\n\n return undefined\n }\n })\n\n return enhancedRuleInstructions\n }\n}\n","import { AST_NODE_TYPES } from '@typescript-eslint/utils'\nimport { ASTUtils } from '../../utils/ast-utils'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nexport const ExhaustiveDepsUtils = {\n isRelevantReference(params: {\n context: Readonly<TSESLint.RuleContext<string, readonly unknown[]>>\n reference: TSESLint.Scope.Reference\n scopeManager: TSESLint.Scope.ScopeManager\n }) {\n const { reference, scopeManager, context } = params\n const component = ASTUtils.getFunctionAncestor(context)\n\n if (\n component !== undefined &&\n !ASTUtils.isDeclaredInNode({\n scopeManager,\n reference,\n functionNode: component,\n })\n ) {\n return false\n }\n\n return (\n reference.identifier.name !== 'undefined' &&\n reference.identifier.parent?.type !== AST_NODE_TYPES.NewExpression &&\n !ExhaustiveDepsUtils.isQueryClientReference(reference)\n )\n },\n isQueryClientReference(reference: TSESLint.Scope.Reference) {\n const declarator = reference.resolved?.defs[0]?.node\n\n return (\n declarator?.type === AST_NODE_TYPES.VariableDeclarator &&\n declarator.init?.type === AST_NODE_TYPES.CallExpression &&\n declarator.init.callee.type === AST_NODE_TYPES.Identifier &&\n declarator.init.callee.name === 'useQueryClient'\n )\n },\n}\n","import * as exhaustiveDeps from './exhaustive-deps/exhaustive-deps.rule'\n\nexport const rules = {\n [exhaustiveDeps.name]: exhaustiveDeps.rule,\n}\n","import { rules } from '../rules'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nfunction generateRecommendedConfig(\n allRules: Record<string, TSESLint.RuleModule<any, any>>,\n) {\n return Object.entries(allRules).reduce((memo, [name, rule]) => {\n const { recommended } = rule.meta.docs || {}\n\n return {\n ...memo,\n ...(recommended ? { [`@tanstack/query/${name}`]: recommended } : {}),\n }\n }, {} as Record<string, 'strict' | 'error' | 'warn'>)\n}\n\nexport const configs = {\n recommended: {\n plugins: ['@tanstack/eslint-plugin-query'],\n rules: generateRecommendedConfig(rules),\n },\n}\n"]}
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export { configs } from './configs'\nexport { rules } from './rules'\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAwB;AACxB,mBAAsB;","names":[]}
@@ -1,435 +1,6 @@
1
- // src/rules/exhaustive-deps/exhaustive-deps.rule.ts
2
- import { AST_NODE_TYPES as AST_NODE_TYPES3 } from "@typescript-eslint/utils";
3
-
4
- // src/utils/ast-utils.ts
5
- import { AST_NODE_TYPES } from "@typescript-eslint/utils";
6
-
7
- // src/utils/unique-by.ts
8
- function uniqueBy(arr, fn) {
9
- return arr.filter((x, i, a) => a.findIndex((y) => fn(x) === fn(y)) === i);
10
- }
11
-
12
- // src/utils/ast-utils.ts
13
- var ASTUtils = {
14
- isNodeOfOneOf(node, types) {
15
- return types.includes(node.type);
16
- },
17
- isIdentifier(node) {
18
- return node.type === AST_NODE_TYPES.Identifier;
19
- },
20
- isIdentifierWithName(node, name2) {
21
- return ASTUtils.isIdentifier(node) && node.name === name2;
22
- },
23
- isIdentifierWithOneOfNames(node, name2) {
24
- return ASTUtils.isIdentifier(node) && name2.includes(node.name);
25
- },
26
- isProperty(node) {
27
- return node.type === AST_NODE_TYPES.Property;
28
- },
29
- isObjectExpression(node) {
30
- return node.type === AST_NODE_TYPES.ObjectExpression;
31
- },
32
- isPropertyWithIdentifierKey(node, key) {
33
- return ASTUtils.isProperty(node) && ASTUtils.isIdentifierWithName(node.key, key);
34
- },
35
- findPropertyWithIdentifierKey(properties, key) {
36
- return properties.find(
37
- (x) => ASTUtils.isPropertyWithIdentifierKey(x, key)
38
- );
39
- },
40
- getNestedIdentifiers(node) {
41
- const identifiers = [];
42
- if (ASTUtils.isIdentifier(node)) {
43
- identifiers.push(node);
44
- }
45
- if ("arguments" in node) {
46
- node.arguments.forEach((x) => {
47
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
48
- });
49
- }
50
- if ("elements" in node) {
51
- node.elements.forEach((x) => {
52
- if (x !== null) {
53
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
54
- }
55
- });
56
- }
57
- if ("properties" in node) {
58
- node.properties.forEach((x) => {
59
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
60
- });
61
- }
62
- if ("expressions" in node) {
63
- node.expressions.forEach((x) => {
64
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
65
- });
66
- }
67
- if (node.type === AST_NODE_TYPES.Property) {
68
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.value));
69
- }
70
- if (node.type === AST_NODE_TYPES.SpreadElement) {
71
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument));
72
- }
73
- if (node.type === AST_NODE_TYPES.MemberExpression) {
74
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.object));
75
- }
76
- if (node.type === AST_NODE_TYPES.UnaryExpression) {
77
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument));
78
- }
79
- if (node.type === AST_NODE_TYPES.ChainExpression) {
80
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression));
81
- }
82
- if (node.type === AST_NODE_TYPES.TSNonNullExpression) {
83
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression));
84
- }
85
- return identifiers;
86
- },
87
- isAncestorIsCallee(identifier) {
88
- let previousNode = identifier;
89
- let currentNode = identifier.parent;
90
- while (currentNode !== void 0) {
91
- if (currentNode.type === AST_NODE_TYPES.CallExpression && currentNode.callee === previousNode) {
92
- return true;
93
- }
94
- if (currentNode.type !== AST_NODE_TYPES.MemberExpression) {
95
- return false;
96
- }
97
- previousNode = currentNode;
98
- currentNode = currentNode.parent;
99
- }
100
- return false;
101
- },
102
- traverseUpOnly(identifier, allowedNodeTypes) {
103
- const parent = identifier.parent;
104
- if (parent !== void 0 && allowedNodeTypes.includes(parent.type)) {
105
- return ASTUtils.traverseUpOnly(parent, allowedNodeTypes);
106
- }
107
- return identifier;
108
- },
109
- isDeclaredInNode(params) {
110
- const { functionNode, reference, scopeManager } = params;
111
- const scope = scopeManager.acquire(functionNode);
112
- if (scope === null) {
113
- return false;
114
- }
115
- return scope.set.has(reference.identifier.name);
116
- },
117
- getExternalRefs(params) {
118
- const { scopeManager, sourceCode, node } = params;
119
- const scope = scopeManager.acquire(node);
120
- if (scope === null) {
121
- return [];
122
- }
123
- const references = scope.references.filter((x) => x.isRead() && !scope.set.has(x.identifier.name)).map((x) => {
124
- const referenceNode = ASTUtils.traverseUpOnly(x.identifier, [
125
- AST_NODE_TYPES.MemberExpression,
126
- AST_NODE_TYPES.Identifier
127
- ]);
128
- return {
129
- variable: x,
130
- node: referenceNode,
131
- text: sourceCode.getText(referenceNode)
132
- };
133
- });
134
- const localRefIds = new Set(
135
- [...scope.set.values()].map((x) => sourceCode.getText(x.identifiers[0]))
136
- );
137
- const externalRefs = references.filter(
138
- (x) => x.variable.resolved === null || !localRefIds.has(x.text)
139
- );
140
- return uniqueBy(externalRefs, (x) => x.text).map((x) => x.variable);
141
- },
142
- mapKeyNodeToText(node, sourceCode) {
143
- return sourceCode.getText(
144
- ASTUtils.traverseUpOnly(node, [
145
- AST_NODE_TYPES.MemberExpression,
146
- AST_NODE_TYPES.Identifier
147
- ])
148
- );
149
- },
150
- isValidReactComponentOrHookName(identifier) {
151
- return identifier !== null && /^(use|[A-Z])/.test(identifier.name);
152
- },
153
- getFunctionAncestor(context) {
154
- return context.getAncestors().find((x) => {
155
- var _a;
156
- if (x.type === AST_NODE_TYPES.FunctionDeclaration) {
157
- return true;
158
- }
159
- return ((_a = x.parent) == null ? void 0 : _a.type) === AST_NODE_TYPES.VariableDeclarator && x.parent.id.type === AST_NODE_TYPES.Identifier && ASTUtils.isNodeOfOneOf(x, [
160
- AST_NODE_TYPES.FunctionDeclaration,
161
- AST_NODE_TYPES.FunctionExpression,
162
- AST_NODE_TYPES.ArrowFunctionExpression
163
- ]);
164
- });
165
- },
166
- getReferencedExpressionByIdentifier(params) {
167
- var _a, _b, _c;
168
- const { node, context } = params;
169
- const resolvedNode = (_c = (_b = (_a = context.getScope().references.find((ref) => ref.identifier === node)) == null ? void 0 : _a.resolved) == null ? void 0 : _b.defs[0]) == null ? void 0 : _c.node;
170
- if ((resolvedNode == null ? void 0 : resolvedNode.type) !== AST_NODE_TYPES.VariableDeclarator) {
171
- return null;
172
- }
173
- return resolvedNode.init;
174
- },
175
- getNestedReturnStatements(node) {
176
- const returnStatements = [];
177
- if (node.type === AST_NODE_TYPES.ReturnStatement) {
178
- returnStatements.push(node);
179
- }
180
- if ("body" in node && node.body !== void 0 && node.body !== null) {
181
- Array.isArray(node.body) ? node.body.forEach((x) => {
182
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
183
- }) : returnStatements.push(
184
- ...ASTUtils.getNestedReturnStatements(node.body)
185
- );
186
- }
187
- if ("consequent" in node) {
188
- Array.isArray(node.consequent) ? node.consequent.forEach((x) => {
189
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
190
- }) : returnStatements.push(
191
- ...ASTUtils.getNestedReturnStatements(node.consequent)
192
- );
193
- }
194
- if ("alternate" in node && node.alternate !== null) {
195
- Array.isArray(node.alternate) ? node.alternate.forEach((x) => {
196
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
197
- }) : returnStatements.push(
198
- ...ASTUtils.getNestedReturnStatements(node.alternate)
199
- );
200
- }
201
- if ("cases" in node) {
202
- node.cases.forEach((x) => {
203
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
204
- });
205
- }
206
- if ("block" in node) {
207
- returnStatements.push(...ASTUtils.getNestedReturnStatements(node.block));
208
- }
209
- if ("handler" in node && node.handler !== null) {
210
- returnStatements.push(...ASTUtils.getNestedReturnStatements(node.handler));
211
- }
212
- if ("finalizer" in node && node.finalizer !== null) {
213
- returnStatements.push(
214
- ...ASTUtils.getNestedReturnStatements(node.finalizer)
215
- );
216
- }
217
- if ("expression" in node && node.expression !== true && node.expression !== false) {
218
- returnStatements.push(
219
- ...ASTUtils.getNestedReturnStatements(node.expression)
220
- );
221
- }
222
- if ("test" in node && node.test !== null) {
223
- returnStatements.push(...ASTUtils.getNestedReturnStatements(node.test));
224
- }
225
- return returnStatements;
226
- }
227
- };
228
-
229
- // src/utils/create-rule.ts
230
- import { ESLintUtils } from "@typescript-eslint/utils";
231
-
232
- // src/utils/detect-react-query-imports.ts
233
- function detectTanstackQueryImports(create) {
234
- return (context, optionsWithDefault) => {
235
- const tanstackQueryImportSpecifiers = [];
236
- const helpers = {
237
- isTanstackQueryImport(node) {
238
- return !!tanstackQueryImportSpecifiers.find((specifier) => {
239
- if (specifier.type === "ImportSpecifier") {
240
- return node.name === specifier.local.name;
241
- }
242
- return false;
243
- });
244
- }
245
- };
246
- const detectionInstructions = {
247
- ImportDeclaration(node) {
248
- if (node.specifiers.length > 0 && node.importKind === "value" && node.source.value.startsWith("@tanstack/") && node.source.value.endsWith("-query")) {
249
- tanstackQueryImportSpecifiers.push(...node.specifiers);
250
- }
251
- }
252
- };
253
- const ruleInstructions = create(context, optionsWithDefault, helpers);
254
- const enhancedRuleInstructions = {};
255
- const allKeys = new Set(
256
- Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions))
257
- );
258
- allKeys.forEach((instruction) => {
259
- enhancedRuleInstructions[instruction] = (node) => {
260
- var _a, _b;
261
- if (instruction in detectionInstructions) {
262
- (_a = detectionInstructions[instruction]) == null ? void 0 : _a.call(detectionInstructions, node);
263
- }
264
- if (ruleInstructions[instruction]) {
265
- return (_b = ruleInstructions[instruction]) == null ? void 0 : _b.call(ruleInstructions, node);
266
- }
267
- return void 0;
268
- };
269
- });
270
- return enhancedRuleInstructions;
271
- };
272
- }
273
-
274
- // src/utils/create-rule.ts
275
- var getDocsUrl = (ruleName) => `https://tanstack.com/query/v4/docs/eslint/${ruleName}`;
276
- function createRule({ create, ...rest }) {
277
- return ESLintUtils.RuleCreator(getDocsUrl)({
278
- ...rest,
279
- create: detectTanstackQueryImports(create)
280
- });
281
- }
282
-
283
- // src/rules/exhaustive-deps/exhaustive-deps.utils.ts
284
- import { AST_NODE_TYPES as AST_NODE_TYPES2 } from "@typescript-eslint/utils";
285
- var ExhaustiveDepsUtils = {
286
- isRelevantReference(params) {
287
- var _a;
288
- const { reference, scopeManager, context } = params;
289
- const component = ASTUtils.getFunctionAncestor(context);
290
- if (component !== void 0 && !ASTUtils.isDeclaredInNode({
291
- scopeManager,
292
- reference,
293
- functionNode: component
294
- })) {
295
- return false;
296
- }
297
- return reference.identifier.name !== "undefined" && ((_a = reference.identifier.parent) == null ? void 0 : _a.type) !== AST_NODE_TYPES2.NewExpression && !ExhaustiveDepsUtils.isQueryClientReference(reference);
298
- },
299
- isQueryClientReference(reference) {
300
- var _a, _b, _c;
301
- const declarator = (_b = (_a = reference.resolved) == null ? void 0 : _a.defs[0]) == null ? void 0 : _b.node;
302
- return (declarator == null ? void 0 : declarator.type) === AST_NODE_TYPES2.VariableDeclarator && ((_c = declarator.init) == null ? void 0 : _c.type) === AST_NODE_TYPES2.CallExpression && declarator.init.callee.type === AST_NODE_TYPES2.Identifier && declarator.init.callee.name === "useQueryClient";
303
- }
304
- };
305
-
306
- // src/rules/exhaustive-deps/exhaustive-deps.rule.ts
307
- var QUERY_KEY = "queryKey";
308
- var QUERY_FN = "queryFn";
309
- var name = "exhaustive-deps";
310
- var rule = createRule({
311
- name,
312
- meta: {
313
- type: "problem",
314
- docs: {
315
- description: "Exhaustive deps rule for useQuery",
316
- recommended: "error"
317
- },
318
- messages: {
319
- missingDeps: `The following dependencies are missing in your queryKey: {{deps}}`,
320
- fixTo: "Fix to {{result}}"
321
- },
322
- hasSuggestions: true,
323
- fixable: "code",
324
- schema: []
325
- },
326
- defaultOptions: [],
327
- create(context) {
328
- return {
329
- Property(node) {
330
- if (node.parent === void 0 || !ASTUtils.isObjectExpression(node.parent) || !ASTUtils.isIdentifierWithName(node.key, QUERY_KEY)) {
331
- return;
332
- }
333
- const scopeManager = context.getSourceCode().scopeManager;
334
- const queryKey = ASTUtils.findPropertyWithIdentifierKey(
335
- node.parent.properties,
336
- QUERY_KEY
337
- );
338
- const queryFn = ASTUtils.findPropertyWithIdentifierKey(
339
- node.parent.properties,
340
- QUERY_FN
341
- );
342
- if (scopeManager === null || queryKey === void 0 || queryFn === void 0 || queryFn.value.type !== AST_NODE_TYPES3.ArrowFunctionExpression) {
343
- return;
344
- }
345
- let queryKeyNode = queryKey.value;
346
- if (queryKeyNode.type === AST_NODE_TYPES3.TSAsExpression && queryKeyNode.expression.type === AST_NODE_TYPES3.ArrayExpression) {
347
- queryKeyNode = queryKeyNode.expression;
348
- }
349
- if (queryKeyNode.type === AST_NODE_TYPES3.Identifier) {
350
- const expression = ASTUtils.getReferencedExpressionByIdentifier({
351
- context,
352
- node: queryKeyNode
353
- });
354
- if ((expression == null ? void 0 : expression.type) === AST_NODE_TYPES3.ArrayExpression) {
355
- queryKeyNode = expression;
356
- }
357
- }
358
- const sourceCode = context.getSourceCode();
359
- const queryKeyValue = queryKeyNode;
360
- const externalRefs = ASTUtils.getExternalRefs({
361
- scopeManager,
362
- sourceCode,
363
- node: queryFn.value
364
- });
365
- const relevantRefs = externalRefs.filter(
366
- (reference) => ExhaustiveDepsUtils.isRelevantReference({
367
- context,
368
- reference,
369
- scopeManager
370
- })
371
- );
372
- const existingKeys = ASTUtils.getNestedIdentifiers(queryKeyValue).map(
373
- (identifier) => ASTUtils.mapKeyNodeToText(identifier, sourceCode)
374
- );
375
- const missingRefs = relevantRefs.map((ref) => ({
376
- ref,
377
- text: ASTUtils.mapKeyNodeToText(ref.identifier, sourceCode)
378
- })).filter(({ ref, text }) => {
379
- return !ref.isTypeReference && !ASTUtils.isAncestorIsCallee(ref.identifier) && !existingKeys.some((existingKey) => existingKey === text) && !existingKeys.includes(text.split(".")[0] ?? "");
380
- }).map(({ ref, text }) => ({
381
- identifier: ref.identifier,
382
- text
383
- }));
384
- const uniqueMissingRefs = uniqueBy(missingRefs, (x) => x.text);
385
- if (uniqueMissingRefs.length > 0) {
386
- const missingAsText = uniqueMissingRefs.map((ref) => ASTUtils.mapKeyNodeToText(ref.identifier, sourceCode)).join(", ");
387
- const existingWithMissing = sourceCode.getText(queryKeyValue).replace(/\]$/, `, ${missingAsText}]`);
388
- const suggestions = [];
389
- if (queryKeyNode.type === AST_NODE_TYPES3.ArrayExpression) {
390
- suggestions.push({
391
- messageId: "fixTo",
392
- data: { result: existingWithMissing },
393
- fix(fixer) {
394
- return fixer.replaceText(queryKeyValue, existingWithMissing);
395
- }
396
- });
397
- }
398
- context.report({
399
- node,
400
- messageId: "missingDeps",
401
- data: {
402
- deps: uniqueMissingRefs.map((ref) => ref.text).join(", ")
403
- },
404
- suggest: suggestions
405
- });
406
- }
407
- }
408
- };
409
- }
410
- });
411
-
412
- // src/rules/index.ts
413
- var rules = {
414
- [name]: rule
415
- };
416
-
417
- // src/configs/index.ts
418
- function generateRecommendedConfig(allRules) {
419
- return Object.entries(allRules).reduce((memo, [name2, rule2]) => {
420
- const { recommended } = rule2.meta.docs || {};
421
- return {
422
- ...memo,
423
- ...recommended ? { [`@tanstack/query/${name2}`]: recommended } : {}
424
- };
425
- }, {});
426
- }
427
- var configs = {
428
- recommended: {
429
- plugins: ["@tanstack/eslint-plugin-query"],
430
- rules: generateRecommendedConfig(rules)
431
- }
432
- };
1
+ // src/index.ts
2
+ import { configs } from "./configs.js";
3
+ import { rules } from "./rules.js";
433
4
  export {
434
5
  configs,
435
6
  rules
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/rules/exhaustive-deps/exhaustive-deps.rule.ts","../../src/utils/ast-utils.ts","../../src/utils/unique-by.ts","../../src/utils/create-rule.ts","../../src/utils/detect-react-query-imports.ts","../../src/rules/exhaustive-deps/exhaustive-deps.utils.ts","../../src/rules/index.ts","../../src/configs/index.ts"],"sourcesContent":["import { AST_NODE_TYPES } from '@typescript-eslint/utils'\nimport { ASTUtils } from '../../utils/ast-utils'\nimport { createRule } from '../../utils/create-rule'\nimport { uniqueBy } from '../../utils/unique-by'\nimport { ExhaustiveDepsUtils } from './exhaustive-deps.utils'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nconst QUERY_KEY = 'queryKey'\nconst QUERY_FN = 'queryFn'\n\nexport const name = 'exhaustive-deps'\n\nexport const rule = createRule({\n name,\n meta: {\n type: 'problem',\n docs: {\n description: 'Exhaustive deps rule for useQuery',\n recommended: 'error',\n },\n messages: {\n missingDeps: `The following dependencies are missing in your queryKey: {{deps}}`,\n fixTo: 'Fix to {{result}}',\n },\n hasSuggestions: true,\n fixable: 'code',\n schema: [],\n },\n defaultOptions: [],\n\n create(context) {\n return {\n Property(node) {\n if (\n node.parent === undefined ||\n !ASTUtils.isObjectExpression(node.parent) ||\n !ASTUtils.isIdentifierWithName(node.key, QUERY_KEY)\n ) {\n return\n }\n\n const scopeManager = context.getSourceCode().scopeManager\n const queryKey = ASTUtils.findPropertyWithIdentifierKey(\n node.parent.properties,\n QUERY_KEY,\n )\n const queryFn = ASTUtils.findPropertyWithIdentifierKey(\n node.parent.properties,\n QUERY_FN,\n )\n\n if (\n scopeManager === null ||\n queryKey === undefined ||\n queryFn === undefined ||\n queryFn.value.type !== AST_NODE_TYPES.ArrowFunctionExpression\n ) {\n return\n }\n\n let queryKeyNode = queryKey.value\n\n if (\n queryKeyNode.type === AST_NODE_TYPES.TSAsExpression &&\n queryKeyNode.expression.type === AST_NODE_TYPES.ArrayExpression\n ) {\n queryKeyNode = queryKeyNode.expression\n }\n\n if (queryKeyNode.type === AST_NODE_TYPES.Identifier) {\n const expression = ASTUtils.getReferencedExpressionByIdentifier({\n context,\n node: queryKeyNode,\n })\n\n if (expression?.type === AST_NODE_TYPES.ArrayExpression) {\n queryKeyNode = expression\n }\n }\n\n const sourceCode = context.getSourceCode()\n const queryKeyValue = queryKeyNode\n const externalRefs = ASTUtils.getExternalRefs({\n scopeManager,\n sourceCode,\n node: queryFn.value,\n })\n\n const relevantRefs = externalRefs.filter((reference) =>\n ExhaustiveDepsUtils.isRelevantReference({\n context,\n reference,\n scopeManager,\n }),\n )\n\n const existingKeys = ASTUtils.getNestedIdentifiers(queryKeyValue).map(\n (identifier) => ASTUtils.mapKeyNodeToText(identifier, sourceCode),\n )\n\n const missingRefs = relevantRefs\n .map((ref) => ({\n ref: ref,\n text: ASTUtils.mapKeyNodeToText(ref.identifier, sourceCode),\n }))\n .filter(({ ref, text }) => {\n return (\n !ref.isTypeReference &&\n !ASTUtils.isAncestorIsCallee(ref.identifier) &&\n !existingKeys.some((existingKey) => existingKey === text) &&\n !existingKeys.includes(text.split('.')[0] ?? '')\n )\n })\n .map(({ ref, text }) => ({\n identifier: ref.identifier,\n text: text,\n }))\n\n const uniqueMissingRefs = uniqueBy(missingRefs, (x) => x.text)\n\n if (uniqueMissingRefs.length > 0) {\n const missingAsText = uniqueMissingRefs\n .map((ref) => ASTUtils.mapKeyNodeToText(ref.identifier, sourceCode))\n .join(', ')\n\n const existingWithMissing = sourceCode\n .getText(queryKeyValue)\n .replace(/\\]$/, `, ${missingAsText}]`)\n\n const suggestions: TSESLint.ReportSuggestionArray<string> = []\n\n if (queryKeyNode.type === AST_NODE_TYPES.ArrayExpression) {\n suggestions.push({\n messageId: 'fixTo',\n data: { result: existingWithMissing },\n fix(fixer) {\n return fixer.replaceText(queryKeyValue, existingWithMissing)\n },\n })\n }\n\n context.report({\n node: node,\n messageId: 'missingDeps',\n data: {\n deps: uniqueMissingRefs.map((ref) => ref.text).join(', '),\n },\n suggest: suggestions,\n })\n }\n },\n }\n },\n})\n","import { AST_NODE_TYPES } from '@typescript-eslint/utils'\nimport { uniqueBy } from './unique-by'\nimport type { TSESLint, TSESTree } from '@typescript-eslint/utils'\nimport type TSESLintScopeManager from '@typescript-eslint/scope-manager'\nimport type { RuleContext } from '@typescript-eslint/utils/dist/ts-eslint'\n\nexport const ASTUtils = {\n isNodeOfOneOf<T extends AST_NODE_TYPES>(\n node: TSESTree.Node,\n types: readonly T[],\n ): node is TSESTree.Node & { type: T } {\n return types.includes(node.type as T)\n },\n isIdentifier(node: TSESTree.Node): node is TSESTree.Identifier {\n return node.type === AST_NODE_TYPES.Identifier\n },\n isIdentifierWithName(\n node: TSESTree.Node,\n name: string,\n ): node is TSESTree.Identifier {\n return ASTUtils.isIdentifier(node) && node.name === name\n },\n isIdentifierWithOneOfNames<T extends string[]>(\n node: TSESTree.Node,\n name: T,\n ): node is TSESTree.Identifier & { name: T[number] } {\n return ASTUtils.isIdentifier(node) && name.includes(node.name)\n },\n isProperty(node: TSESTree.Node): node is TSESTree.Property {\n return node.type === AST_NODE_TYPES.Property\n },\n isObjectExpression(node: TSESTree.Node): node is TSESTree.ObjectExpression {\n return node.type === AST_NODE_TYPES.ObjectExpression\n },\n isPropertyWithIdentifierKey(\n node: TSESTree.Node,\n key: string,\n ): node is TSESTree.Property {\n return (\n ASTUtils.isProperty(node) && ASTUtils.isIdentifierWithName(node.key, key)\n )\n },\n findPropertyWithIdentifierKey(\n properties: TSESTree.ObjectLiteralElement[],\n key: string,\n ): TSESTree.Property | undefined {\n return properties.find((x) =>\n ASTUtils.isPropertyWithIdentifierKey(x, key),\n ) as TSESTree.Property | undefined\n },\n getNestedIdentifiers(node: TSESTree.Node): TSESTree.Identifier[] {\n const identifiers: TSESTree.Identifier[] = []\n\n if (ASTUtils.isIdentifier(node)) {\n identifiers.push(node)\n }\n\n if ('arguments' in node) {\n node.arguments.forEach((x) => {\n identifiers.push(...ASTUtils.getNestedIdentifiers(x))\n })\n }\n\n if ('elements' in node) {\n node.elements.forEach((x) => {\n if (x !== null) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(x))\n }\n })\n }\n\n if ('properties' in node) {\n node.properties.forEach((x) => {\n identifiers.push(...ASTUtils.getNestedIdentifiers(x))\n })\n }\n\n if ('expressions' in node) {\n node.expressions.forEach((x) => {\n identifiers.push(...ASTUtils.getNestedIdentifiers(x))\n })\n }\n\n if (node.type === AST_NODE_TYPES.Property) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.value))\n }\n\n if (node.type === AST_NODE_TYPES.SpreadElement) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument))\n }\n\n if (node.type === AST_NODE_TYPES.MemberExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.object))\n }\n\n if (node.type === AST_NODE_TYPES.UnaryExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument))\n }\n\n if (node.type === AST_NODE_TYPES.ChainExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression))\n }\n\n if (node.type === AST_NODE_TYPES.TSNonNullExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression))\n }\n\n return identifiers\n },\n isAncestorIsCallee(identifier: TSESTree.Node) {\n let previousNode = identifier\n let currentNode = identifier.parent\n\n while (currentNode !== undefined) {\n if (\n currentNode.type === AST_NODE_TYPES.CallExpression &&\n currentNode.callee === previousNode\n ) {\n return true\n }\n\n if (currentNode.type !== AST_NODE_TYPES.MemberExpression) {\n return false\n }\n\n previousNode = currentNode\n currentNode = currentNode.parent\n }\n\n return false\n },\n traverseUpOnly(\n identifier: TSESTree.Node,\n allowedNodeTypes: AST_NODE_TYPES[],\n ): TSESTree.Node {\n const parent = identifier.parent\n\n if (parent !== undefined && allowedNodeTypes.includes(parent.type)) {\n return ASTUtils.traverseUpOnly(parent, allowedNodeTypes)\n }\n\n return identifier\n },\n isDeclaredInNode(params: {\n functionNode: TSESTree.Node\n reference: TSESLintScopeManager.Reference\n scopeManager: TSESLint.Scope.ScopeManager\n }) {\n const { functionNode, reference, scopeManager } = params\n const scope = scopeManager.acquire(functionNode)\n\n if (scope === null) {\n return false\n }\n\n return scope.set.has(reference.identifier.name)\n },\n getExternalRefs(params: {\n scopeManager: TSESLint.Scope.ScopeManager\n sourceCode: Readonly<TSESLint.SourceCode>\n node: TSESTree.Node\n }): TSESLint.Scope.Reference[] {\n const { scopeManager, sourceCode, node } = params\n const scope = scopeManager.acquire(node)\n\n if (scope === null) {\n return []\n }\n\n const references = scope.references\n .filter((x) => x.isRead() && !scope.set.has(x.identifier.name))\n .map((x) => {\n const referenceNode = ASTUtils.traverseUpOnly(x.identifier, [\n AST_NODE_TYPES.MemberExpression,\n AST_NODE_TYPES.Identifier,\n ])\n\n return {\n variable: x,\n node: referenceNode,\n text: sourceCode.getText(referenceNode),\n }\n })\n\n const localRefIds = new Set(\n [...scope.set.values()].map((x) => sourceCode.getText(x.identifiers[0])),\n )\n\n const externalRefs = references.filter(\n (x) => x.variable.resolved === null || !localRefIds.has(x.text),\n )\n\n return uniqueBy(externalRefs, (x) => x.text).map((x) => x.variable)\n },\n mapKeyNodeToText(\n node: TSESTree.Node,\n sourceCode: Readonly<TSESLint.SourceCode>,\n ) {\n return sourceCode.getText(\n ASTUtils.traverseUpOnly(node, [\n AST_NODE_TYPES.MemberExpression,\n AST_NODE_TYPES.Identifier,\n ]),\n )\n },\n isValidReactComponentOrHookName(identifier: TSESTree.Identifier | null) {\n return identifier !== null && /^(use|[A-Z])/.test(identifier.name)\n },\n getFunctionAncestor(\n context: Readonly<RuleContext<string, readonly unknown[]>>,\n ) {\n return context.getAncestors().find((x) => {\n if (x.type === AST_NODE_TYPES.FunctionDeclaration) {\n return true\n }\n\n return (\n x.parent?.type === AST_NODE_TYPES.VariableDeclarator &&\n x.parent.id.type === AST_NODE_TYPES.Identifier &&\n ASTUtils.isNodeOfOneOf(x, [\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n ])\n )\n })\n },\n getReferencedExpressionByIdentifier(params: {\n node: TSESTree.Node\n context: Readonly<RuleContext<string, readonly unknown[]>>\n }) {\n const { node, context } = params\n\n const resolvedNode = context\n .getScope()\n .references.find((ref) => ref.identifier === node)?.resolved\n ?.defs[0]?.node\n\n if (resolvedNode?.type !== AST_NODE_TYPES.VariableDeclarator) {\n return null\n }\n\n return resolvedNode.init\n },\n getNestedReturnStatements(node: TSESTree.Node): TSESTree.ReturnStatement[] {\n const returnStatements: TSESTree.ReturnStatement[] = []\n\n if (node.type === AST_NODE_TYPES.ReturnStatement) {\n returnStatements.push(node)\n }\n\n if ('body' in node && node.body !== undefined && node.body !== null) {\n Array.isArray(node.body)\n ? node.body.forEach((x) => {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(x))\n })\n : returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.body),\n )\n }\n\n if ('consequent' in node) {\n Array.isArray(node.consequent)\n ? node.consequent.forEach((x) => {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(x))\n })\n : returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.consequent),\n )\n }\n\n if ('alternate' in node && node.alternate !== null) {\n Array.isArray(node.alternate)\n ? node.alternate.forEach((x) => {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(x))\n })\n : returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.alternate),\n )\n }\n\n if ('cases' in node) {\n node.cases.forEach((x) => {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(x))\n })\n }\n\n if ('block' in node) {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(node.block))\n }\n\n if ('handler' in node && node.handler !== null) {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(node.handler))\n }\n\n if ('finalizer' in node && node.finalizer !== null) {\n returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.finalizer),\n )\n }\n\n if (\n 'expression' in node &&\n node.expression !== true &&\n node.expression !== false\n ) {\n returnStatements.push(\n ...ASTUtils.getNestedReturnStatements(node.expression),\n )\n }\n\n if ('test' in node && node.test !== null) {\n returnStatements.push(...ASTUtils.getNestedReturnStatements(node.test))\n }\n\n return returnStatements\n },\n}\n","export function uniqueBy<T>(arr: T[], fn: (x: T) => unknown): T[] {\n return arr.filter((x, i, a) => a.findIndex((y) => fn(x) === fn(y)) === i)\n}\n","import { ESLintUtils } from '@typescript-eslint/utils'\nimport { detectTanstackQueryImports } from './detect-react-query-imports'\nimport type { EnhancedCreate } from './detect-react-query-imports'\n\nconst getDocsUrl = (ruleName: string): string =>\n `https://tanstack.com/query/v4/docs/eslint/${ruleName}`\n\ntype EslintRule = Omit<\n Parameters<ReturnType<typeof ESLintUtils.RuleCreator>>[0],\n 'create'\n> & {\n create: EnhancedCreate\n}\n\nexport function createRule({ create, ...rest }: EslintRule) {\n return ESLintUtils.RuleCreator(getDocsUrl)({\n ...rest,\n create: detectTanstackQueryImports(create),\n })\n}\n","import type { ESLintUtils, TSESLint, TSESTree } from '@typescript-eslint/utils'\n\ntype Create = Parameters<\n ReturnType<typeof ESLintUtils.RuleCreator>\n>[0]['create']\n\ntype Context = Parameters<Create>[0]\ntype Options = Parameters<Create>[1]\ntype Helpers = {\n isTanstackQueryImport: (node: TSESTree.Identifier) => boolean\n}\n\nexport type EnhancedCreate = (\n context: Context,\n options: Options,\n helpers: Helpers,\n) => ReturnType<Create>\n\nexport function detectTanstackQueryImports(create: EnhancedCreate): Create {\n return (context, optionsWithDefault) => {\n const tanstackQueryImportSpecifiers: TSESTree.ImportClause[] = []\n\n const helpers: Helpers = {\n isTanstackQueryImport(node) {\n return !!tanstackQueryImportSpecifiers.find((specifier) => {\n if (specifier.type === 'ImportSpecifier') {\n return node.name === specifier.local.name\n }\n\n return false\n })\n },\n }\n\n const detectionInstructions: TSESLint.RuleListener = {\n ImportDeclaration(node) {\n if (\n node.specifiers.length > 0 &&\n node.importKind === 'value' &&\n node.source.value.startsWith('@tanstack/') &&\n node.source.value.endsWith('-query')\n ) {\n tanstackQueryImportSpecifiers.push(...node.specifiers)\n }\n },\n }\n\n // Call original rule definition\n const ruleInstructions = create(context, optionsWithDefault, helpers)\n const enhancedRuleInstructions: TSESLint.RuleListener = {}\n\n const allKeys = new Set(\n Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions)),\n )\n\n // Iterate over ALL instructions keys so we can override original rule instructions\n // to prevent their execution if conditions to report errors are not met.\n allKeys.forEach((instruction) => {\n enhancedRuleInstructions[instruction] = (node) => {\n if (instruction in detectionInstructions) {\n detectionInstructions[instruction]?.(node)\n }\n\n // TODO: canReportErrors()\n if (ruleInstructions[instruction]) {\n return ruleInstructions[instruction]?.(node)\n }\n\n return undefined\n }\n })\n\n return enhancedRuleInstructions\n }\n}\n","import { AST_NODE_TYPES } from '@typescript-eslint/utils'\nimport { ASTUtils } from '../../utils/ast-utils'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nexport const ExhaustiveDepsUtils = {\n isRelevantReference(params: {\n context: Readonly<TSESLint.RuleContext<string, readonly unknown[]>>\n reference: TSESLint.Scope.Reference\n scopeManager: TSESLint.Scope.ScopeManager\n }) {\n const { reference, scopeManager, context } = params\n const component = ASTUtils.getFunctionAncestor(context)\n\n if (\n component !== undefined &&\n !ASTUtils.isDeclaredInNode({\n scopeManager,\n reference,\n functionNode: component,\n })\n ) {\n return false\n }\n\n return (\n reference.identifier.name !== 'undefined' &&\n reference.identifier.parent?.type !== AST_NODE_TYPES.NewExpression &&\n !ExhaustiveDepsUtils.isQueryClientReference(reference)\n )\n },\n isQueryClientReference(reference: TSESLint.Scope.Reference) {\n const declarator = reference.resolved?.defs[0]?.node\n\n return (\n declarator?.type === AST_NODE_TYPES.VariableDeclarator &&\n declarator.init?.type === AST_NODE_TYPES.CallExpression &&\n declarator.init.callee.type === AST_NODE_TYPES.Identifier &&\n declarator.init.callee.name === 'useQueryClient'\n )\n },\n}\n","import * as exhaustiveDeps from './exhaustive-deps/exhaustive-deps.rule'\n\nexport const rules = {\n [exhaustiveDeps.name]: exhaustiveDeps.rule,\n}\n","import { rules } from '../rules'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nfunction generateRecommendedConfig(\n allRules: Record<string, TSESLint.RuleModule<any, any>>,\n) {\n return Object.entries(allRules).reduce((memo, [name, rule]) => {\n const { recommended } = rule.meta.docs || {}\n\n return {\n ...memo,\n ...(recommended ? { [`@tanstack/query/${name}`]: recommended } : {}),\n }\n }, {} as Record<string, 'strict' | 'error' | 'warn'>)\n}\n\nexport const configs = {\n recommended: {\n plugins: ['@tanstack/eslint-plugin-query'],\n rules: generateRecommendedConfig(rules),\n },\n}\n"],"mappings":"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","names":["AST_NODE_TYPES","name","AST_NODE_TYPES","AST_NODE_TYPES","AST_NODE_TYPES","name","rule"]}
1
+ {"version":3,"sources":["../../src/index.ts"],"sourcesContent":["export { configs } from './configs'\nexport { rules } from './rules'\n"],"mappings":";AAAA,SAAS,eAAe;AACxB,SAAS,aAAa;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/eslint-plugin-query",
3
- "version": "5.0.0-alpha.88",
3
+ "version": "5.0.0-beta.0",
4
4
  "description": "ESLint plugin for TanStack Query",
5
5
  "author": "Eliya Cohen",
6
6
  "license": "MIT",