@tanstack/eslint-plugin-query 5.68.0 → 5.72.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.
Files changed (119) hide show
  1. package/dist/index.cjs +1001 -0
  2. package/dist/index.cjs.map +1 -0
  3. package/dist/index.d.cts +24 -0
  4. package/dist/index.d.ts +24 -0
  5. package/dist/index.js +968 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/rules.cjs +966 -0
  8. package/dist/rules.cjs.map +1 -0
  9. package/dist/rules.js +929 -0
  10. package/dist/rules.js.map +1 -0
  11. package/package.json +13 -13
  12. package/dist/cjs/index.cjs +0 -38
  13. package/dist/cjs/index.cjs.map +0 -1
  14. package/dist/cjs/index.d.cts +0 -13
  15. package/dist/cjs/rules/exhaustive-deps/exhaustive-deps.rule.cjs +0 -134
  16. package/dist/cjs/rules/exhaustive-deps/exhaustive-deps.rule.cjs.map +0 -1
  17. package/dist/cjs/rules/exhaustive-deps/exhaustive-deps.rule.d.cts +0 -4
  18. package/dist/cjs/rules/exhaustive-deps/exhaustive-deps.utils.cjs +0 -26
  19. package/dist/cjs/rules/exhaustive-deps/exhaustive-deps.utils.cjs.map +0 -1
  20. package/dist/cjs/rules/exhaustive-deps/exhaustive-deps.utils.d.cts +0 -10
  21. package/dist/cjs/rules/infinite-query-property-order/constants.cjs +0 -13
  22. package/dist/cjs/rules/infinite-query-property-order/constants.cjs.map +0 -1
  23. package/dist/cjs/rules/infinite-query-property-order/constants.d.cts +0 -4
  24. package/dist/cjs/rules/infinite-query-property-order/infinite-query-property-order.rule.cjs +0 -88
  25. package/dist/cjs/rules/infinite-query-property-order/infinite-query-property-order.rule.cjs.map +0 -1
  26. package/dist/cjs/rules/infinite-query-property-order/infinite-query-property-order.rule.d.cts +0 -4
  27. package/dist/cjs/rules/infinite-query-property-order/infinite-query-property-order.utils.cjs +0 -47
  28. package/dist/cjs/rules/infinite-query-property-order/infinite-query-property-order.utils.cjs.map +0 -1
  29. package/dist/cjs/rules/infinite-query-property-order/infinite-query-property-order.utils.d.cts +0 -1
  30. package/dist/cjs/rules/no-rest-destructuring/no-rest-destructuring.rule.cjs +0 -92
  31. package/dist/cjs/rules/no-rest-destructuring/no-rest-destructuring.rule.cjs.map +0 -1
  32. package/dist/cjs/rules/no-rest-destructuring/no-rest-destructuring.rule.d.cts +0 -4
  33. package/dist/cjs/rules/no-rest-destructuring/no-rest-destructuring.utils.cjs +0 -13
  34. package/dist/cjs/rules/no-rest-destructuring/no-rest-destructuring.utils.cjs.map +0 -1
  35. package/dist/cjs/rules/no-rest-destructuring/no-rest-destructuring.utils.d.cts +0 -4
  36. package/dist/cjs/rules/no-unstable-deps/no-unstable-deps.rule.cjs +0 -93
  37. package/dist/cjs/rules/no-unstable-deps/no-unstable-deps.rule.cjs.map +0 -1
  38. package/dist/cjs/rules/no-unstable-deps/no-unstable-deps.rule.d.cts +0 -6
  39. package/dist/cjs/rules/stable-query-client/stable-query-client.rule.cjs +0 -71
  40. package/dist/cjs/rules/stable-query-client/stable-query-client.rule.cjs.map +0 -1
  41. package/dist/cjs/rules/stable-query-client/stable-query-client.rule.d.cts +0 -4
  42. package/dist/cjs/rules.cjs +0 -16
  43. package/dist/cjs/rules.cjs.map +0 -1
  44. package/dist/cjs/rules.d.cts +0 -3
  45. package/dist/cjs/types.d.cts +0 -3
  46. package/dist/cjs/utils/ast-utils.cjs +0 -267
  47. package/dist/cjs/utils/ast-utils.cjs.map +0 -1
  48. package/dist/cjs/utils/ast-utils.d.cts +0 -38
  49. package/dist/cjs/utils/detect-react-query-imports.cjs +0 -55
  50. package/dist/cjs/utils/detect-react-query-imports.cjs.map +0 -1
  51. package/dist/cjs/utils/detect-react-query-imports.d.cts +0 -11
  52. package/dist/cjs/utils/get-docs-url.cjs +0 -5
  53. package/dist/cjs/utils/get-docs-url.cjs.map +0 -1
  54. package/dist/cjs/utils/get-docs-url.d.cts +0 -1
  55. package/dist/cjs/utils/unique-by.cjs +0 -7
  56. package/dist/cjs/utils/unique-by.cjs.map +0 -1
  57. package/dist/cjs/utils/unique-by.d.cts +0 -1
  58. package/dist/esm/index.d.ts +0 -13
  59. package/dist/esm/index.js +0 -39
  60. package/dist/esm/index.js.map +0 -1
  61. package/dist/esm/rules/exhaustive-deps/exhaustive-deps.rule.d.ts +0 -4
  62. package/dist/esm/rules/exhaustive-deps/exhaustive-deps.rule.js +0 -134
  63. package/dist/esm/rules/exhaustive-deps/exhaustive-deps.rule.js.map +0 -1
  64. package/dist/esm/rules/exhaustive-deps/exhaustive-deps.utils.d.ts +0 -10
  65. package/dist/esm/rules/exhaustive-deps/exhaustive-deps.utils.js +0 -26
  66. package/dist/esm/rules/exhaustive-deps/exhaustive-deps.utils.js.map +0 -1
  67. package/dist/esm/rules/infinite-query-property-order/constants.d.ts +0 -4
  68. package/dist/esm/rules/infinite-query-property-order/constants.js +0 -13
  69. package/dist/esm/rules/infinite-query-property-order/constants.js.map +0 -1
  70. package/dist/esm/rules/infinite-query-property-order/infinite-query-property-order.rule.d.ts +0 -4
  71. package/dist/esm/rules/infinite-query-property-order/infinite-query-property-order.rule.js +0 -88
  72. package/dist/esm/rules/infinite-query-property-order/infinite-query-property-order.rule.js.map +0 -1
  73. package/dist/esm/rules/infinite-query-property-order/infinite-query-property-order.utils.d.ts +0 -1
  74. package/dist/esm/rules/infinite-query-property-order/infinite-query-property-order.utils.js +0 -47
  75. package/dist/esm/rules/infinite-query-property-order/infinite-query-property-order.utils.js.map +0 -1
  76. package/dist/esm/rules/no-rest-destructuring/no-rest-destructuring.rule.d.ts +0 -4
  77. package/dist/esm/rules/no-rest-destructuring/no-rest-destructuring.rule.js +0 -92
  78. package/dist/esm/rules/no-rest-destructuring/no-rest-destructuring.rule.js.map +0 -1
  79. package/dist/esm/rules/no-rest-destructuring/no-rest-destructuring.utils.d.ts +0 -4
  80. package/dist/esm/rules/no-rest-destructuring/no-rest-destructuring.utils.js +0 -13
  81. package/dist/esm/rules/no-rest-destructuring/no-rest-destructuring.utils.js.map +0 -1
  82. package/dist/esm/rules/no-unstable-deps/no-unstable-deps.rule.d.ts +0 -6
  83. package/dist/esm/rules/no-unstable-deps/no-unstable-deps.rule.js +0 -93
  84. package/dist/esm/rules/no-unstable-deps/no-unstable-deps.rule.js.map +0 -1
  85. package/dist/esm/rules/stable-query-client/stable-query-client.rule.d.ts +0 -4
  86. package/dist/esm/rules/stable-query-client/stable-query-client.rule.js +0 -71
  87. package/dist/esm/rules/stable-query-client/stable-query-client.rule.js.map +0 -1
  88. package/dist/esm/rules.d.ts +0 -3
  89. package/dist/esm/rules.js +0 -16
  90. package/dist/esm/rules.js.map +0 -1
  91. package/dist/esm/types.d.ts +0 -3
  92. package/dist/esm/utils/ast-utils.d.ts +0 -38
  93. package/dist/esm/utils/ast-utils.js +0 -267
  94. package/dist/esm/utils/ast-utils.js.map +0 -1
  95. package/dist/esm/utils/detect-react-query-imports.d.ts +0 -11
  96. package/dist/esm/utils/detect-react-query-imports.js +0 -55
  97. package/dist/esm/utils/detect-react-query-imports.js.map +0 -1
  98. package/dist/esm/utils/get-docs-url.d.ts +0 -1
  99. package/dist/esm/utils/get-docs-url.js +0 -5
  100. package/dist/esm/utils/get-docs-url.js.map +0 -1
  101. package/dist/esm/utils/unique-by.d.ts +0 -1
  102. package/dist/esm/utils/unique-by.js +0 -7
  103. package/dist/esm/utils/unique-by.js.map +0 -1
  104. package/src/index.ts +0 -52
  105. package/src/rules/exhaustive-deps/exhaustive-deps.rule.ts +0 -184
  106. package/src/rules/exhaustive-deps/exhaustive-deps.utils.ts +0 -41
  107. package/src/rules/infinite-query-property-order/constants.ts +0 -17
  108. package/src/rules/infinite-query-property-order/infinite-query-property-order.rule.ts +0 -107
  109. package/src/rules/infinite-query-property-order/infinite-query-property-order.utils.ts +0 -67
  110. package/src/rules/no-rest-destructuring/no-rest-destructuring.rule.ts +0 -115
  111. package/src/rules/no-rest-destructuring/no-rest-destructuring.utils.ts +0 -11
  112. package/src/rules/no-unstable-deps/no-unstable-deps.rule.ts +0 -129
  113. package/src/rules/stable-query-client/stable-query-client.rule.ts +0 -88
  114. package/src/rules.ts +0 -23
  115. package/src/types.ts +0 -3
  116. package/src/utils/ast-utils.ts +0 -391
  117. package/src/utils/detect-react-query-imports.ts +0 -97
  118. package/src/utils/get-docs-url.ts +0 -2
  119. package/src/utils/unique-by.ts +0 -3
@@ -1,3 +0,0 @@
1
- export type ExtraRuleDocs = {
2
- recommended: 'strict' | 'error' | 'warn';
3
- };
@@ -1,38 +0,0 @@
1
- import { AST_NODE_TYPES, TSESLint, TSESTree } from '@typescript-eslint/utils';
2
- export declare const ASTUtils: {
3
- isNodeOfOneOf<T extends AST_NODE_TYPES>(node: TSESTree.Node, types: ReadonlyArray<T>): node is TSESTree.Node & {
4
- type: T;
5
- };
6
- isIdentifier(node: TSESTree.Node): node is TSESTree.Identifier;
7
- isIdentifierWithName(node: TSESTree.Node, name: string): node is TSESTree.Identifier;
8
- isIdentifierWithOneOfNames<T extends Array<string>>(node: TSESTree.Node, name: T): node is TSESTree.Identifier & {
9
- name: T[number];
10
- };
11
- isProperty(node: TSESTree.Node): node is TSESTree.Property;
12
- isObjectExpression(node: TSESTree.Node): node is TSESTree.ObjectExpression;
13
- isPropertyWithIdentifierKey(node: TSESTree.Node, key: string): node is TSESTree.Property;
14
- findPropertyWithIdentifierKey(properties: Array<TSESTree.ObjectLiteralElement>, key: string): TSESTree.Property | undefined;
15
- getNestedIdentifiers(node: TSESTree.Node): Array<TSESTree.Identifier>;
16
- isAncestorIsCallee(identifier: TSESTree.Node): boolean;
17
- traverseUpOnly(identifier: TSESTree.Node, allowedNodeTypes: Array<AST_NODE_TYPES>): TSESTree.Node;
18
- isDeclaredInNode(params: {
19
- functionNode: TSESTree.Node;
20
- reference: TSESLint.Scope.Reference;
21
- scopeManager: TSESLint.Scope.ScopeManager;
22
- }): boolean;
23
- getExternalRefs(params: {
24
- scopeManager: TSESLint.Scope.ScopeManager;
25
- sourceCode: Readonly<TSESLint.SourceCode>;
26
- node: TSESTree.Node;
27
- }): Array<TSESLint.Scope.Reference>;
28
- mapKeyNodeToText(node: TSESTree.Node, sourceCode: Readonly<TSESLint.SourceCode>): string;
29
- mapKeyNodeToBaseText(node: TSESTree.Node, sourceCode: Readonly<TSESLint.SourceCode>): string;
30
- isValidReactComponentOrHookName(identifier: TSESTree.Identifier | null | undefined): boolean;
31
- getFunctionAncestor(sourceCode: Readonly<TSESLint.SourceCode>, node: TSESTree.Node): TSESTree.ArrowFunctionExpression | TSESTree.FunctionDeclarationWithOptionalName | TSESTree.FunctionExpression | undefined;
32
- getReferencedExpressionByIdentifier(params: {
33
- node: TSESTree.Node;
34
- context: Readonly<TSESLint.RuleContext<string, ReadonlyArray<unknown>>>;
35
- }): TSESTree.Expression | null;
36
- getClosestVariableDeclarator(node: TSESTree.Node): TSESTree.VariableDeclaratorDefiniteAssignment | TSESTree.VariableDeclaratorMaybeInit | undefined;
37
- getNestedReturnStatements(node: TSESTree.Node): Array<TSESTree.ReturnStatement>;
38
- };
@@ -1,267 +0,0 @@
1
- import { AST_NODE_TYPES } from "@typescript-eslint/utils";
2
- import { uniqueBy } from "./unique-by.js";
3
- const ASTUtils = {
4
- isNodeOfOneOf(node, types) {
5
- return types.includes(node.type);
6
- },
7
- isIdentifier(node) {
8
- return node.type === AST_NODE_TYPES.Identifier;
9
- },
10
- isIdentifierWithName(node, name) {
11
- return ASTUtils.isIdentifier(node) && node.name === name;
12
- },
13
- isIdentifierWithOneOfNames(node, name) {
14
- return ASTUtils.isIdentifier(node) && name.includes(node.name);
15
- },
16
- isProperty(node) {
17
- return node.type === AST_NODE_TYPES.Property;
18
- },
19
- isObjectExpression(node) {
20
- return node.type === AST_NODE_TYPES.ObjectExpression;
21
- },
22
- isPropertyWithIdentifierKey(node, key) {
23
- return ASTUtils.isProperty(node) && ASTUtils.isIdentifierWithName(node.key, key);
24
- },
25
- findPropertyWithIdentifierKey(properties, key) {
26
- return properties.find(
27
- (x) => ASTUtils.isPropertyWithIdentifierKey(x, key)
28
- );
29
- },
30
- getNestedIdentifiers(node) {
31
- const identifiers = [];
32
- if (ASTUtils.isIdentifier(node)) {
33
- identifiers.push(node);
34
- }
35
- if ("arguments" in node) {
36
- node.arguments.forEach((x) => {
37
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
38
- });
39
- }
40
- if ("elements" in node) {
41
- node.elements.forEach((x) => {
42
- if (x !== null) {
43
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
44
- }
45
- });
46
- }
47
- if ("properties" in node) {
48
- node.properties.forEach((x) => {
49
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
50
- });
51
- }
52
- if ("expressions" in node) {
53
- node.expressions.forEach((x) => {
54
- identifiers.push(...ASTUtils.getNestedIdentifiers(x));
55
- });
56
- }
57
- if ("left" in node) {
58
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.left));
59
- }
60
- if ("right" in node) {
61
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.right));
62
- }
63
- if (node.type === AST_NODE_TYPES.Property) {
64
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.value));
65
- }
66
- if (node.type === AST_NODE_TYPES.SpreadElement) {
67
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument));
68
- }
69
- if (node.type === AST_NODE_TYPES.MemberExpression) {
70
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.object));
71
- }
72
- if (node.type === AST_NODE_TYPES.UnaryExpression) {
73
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument));
74
- }
75
- if (node.type === AST_NODE_TYPES.ChainExpression) {
76
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression));
77
- }
78
- if (node.type === AST_NODE_TYPES.TSNonNullExpression) {
79
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.expression));
80
- }
81
- if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {
82
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.body));
83
- }
84
- if (node.type === AST_NODE_TYPES.FunctionExpression) {
85
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.body));
86
- }
87
- if (node.type === AST_NODE_TYPES.BlockStatement) {
88
- identifiers.push(
89
- ...node.body.map((body) => ASTUtils.getNestedIdentifiers(body)).flat()
90
- );
91
- }
92
- if (node.type === AST_NODE_TYPES.ReturnStatement && node.argument) {
93
- identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument));
94
- }
95
- return identifiers;
96
- },
97
- isAncestorIsCallee(identifier) {
98
- let previousNode = identifier;
99
- let currentNode = identifier.parent;
100
- while (currentNode !== void 0) {
101
- if (currentNode.type === AST_NODE_TYPES.CallExpression && currentNode.callee === previousNode) {
102
- return true;
103
- }
104
- if (currentNode.type !== AST_NODE_TYPES.MemberExpression) {
105
- return false;
106
- }
107
- previousNode = currentNode;
108
- currentNode = currentNode.parent;
109
- }
110
- return false;
111
- },
112
- traverseUpOnly(identifier, allowedNodeTypes) {
113
- const parent = identifier.parent;
114
- if (parent !== void 0 && allowedNodeTypes.includes(parent.type)) {
115
- return ASTUtils.traverseUpOnly(parent, allowedNodeTypes);
116
- }
117
- return identifier;
118
- },
119
- isDeclaredInNode(params) {
120
- const { functionNode, reference, scopeManager } = params;
121
- const scope = scopeManager.acquire(functionNode);
122
- if (scope === null) {
123
- return false;
124
- }
125
- return scope.set.has(reference.identifier.name);
126
- },
127
- getExternalRefs(params) {
128
- const { scopeManager, sourceCode, node } = params;
129
- const scope = scopeManager.acquire(node);
130
- if (scope === null) {
131
- return [];
132
- }
133
- const references = scope.references.filter((x) => x.isRead() && !scope.set.has(x.identifier.name)).map((x) => {
134
- const referenceNode = ASTUtils.traverseUpOnly(x.identifier, [
135
- AST_NODE_TYPES.MemberExpression,
136
- AST_NODE_TYPES.Identifier
137
- ]);
138
- return {
139
- variable: x,
140
- node: referenceNode,
141
- text: sourceCode.getText(referenceNode)
142
- };
143
- });
144
- const localRefIds = new Set(
145
- [...scope.set.values()].map((x) => sourceCode.getText(x.identifiers[0]))
146
- );
147
- const externalRefs = references.filter(
148
- (x) => x.variable.resolved === null || !localRefIds.has(x.text)
149
- );
150
- return uniqueBy(externalRefs, (x) => x.text).map((x) => x.variable);
151
- },
152
- mapKeyNodeToText(node, sourceCode) {
153
- return sourceCode.getText(
154
- ASTUtils.traverseUpOnly(node, [
155
- AST_NODE_TYPES.MemberExpression,
156
- AST_NODE_TYPES.TSNonNullExpression,
157
- AST_NODE_TYPES.Identifier
158
- ])
159
- );
160
- },
161
- mapKeyNodeToBaseText(node, sourceCode) {
162
- return ASTUtils.mapKeyNodeToText(node, sourceCode).replace(
163
- /(?:\?(\.)|!)/g,
164
- "$1"
165
- );
166
- },
167
- isValidReactComponentOrHookName(identifier) {
168
- return identifier !== null && identifier !== void 0 && /^(use|[A-Z])/.test(identifier.name);
169
- },
170
- getFunctionAncestor(sourceCode, node) {
171
- var _a;
172
- for (const ancestor of sourceCode.getAncestors(node)) {
173
- if (ASTUtils.isNodeOfOneOf(ancestor, [
174
- AST_NODE_TYPES.FunctionDeclaration,
175
- AST_NODE_TYPES.FunctionExpression,
176
- AST_NODE_TYPES.ArrowFunctionExpression
177
- ])) {
178
- return ancestor;
179
- }
180
- if (((_a = ancestor.parent) == null ? void 0 : _a.type) === AST_NODE_TYPES.VariableDeclarator && ancestor.parent.id.type === AST_NODE_TYPES.Identifier && ASTUtils.isNodeOfOneOf(ancestor, [
181
- AST_NODE_TYPES.FunctionDeclaration,
182
- AST_NODE_TYPES.FunctionExpression,
183
- AST_NODE_TYPES.ArrowFunctionExpression
184
- ])) {
185
- return ancestor;
186
- }
187
- }
188
- return void 0;
189
- },
190
- getReferencedExpressionByIdentifier(params) {
191
- var _a, _b, _c;
192
- const { node, context } = params;
193
- const sourceCode = context.sourceCode ?? context.getSourceCode();
194
- const scope = context.sourceCode.getScope(node) ? sourceCode.getScope(node) : context.getScope();
195
- const resolvedNode = (_c = (_b = (_a = scope.references.find((ref) => ref.identifier === node)) == null ? void 0 : _a.resolved) == null ? void 0 : _b.defs[0]) == null ? void 0 : _c.node;
196
- if ((resolvedNode == null ? void 0 : resolvedNode.type) !== AST_NODE_TYPES.VariableDeclarator) {
197
- return null;
198
- }
199
- return resolvedNode.init;
200
- },
201
- getClosestVariableDeclarator(node) {
202
- let currentNode = node;
203
- while (currentNode.type !== AST_NODE_TYPES.Program) {
204
- if (currentNode.type === AST_NODE_TYPES.VariableDeclarator) {
205
- return currentNode;
206
- }
207
- currentNode = currentNode.parent;
208
- }
209
- return void 0;
210
- },
211
- getNestedReturnStatements(node) {
212
- const returnStatements = [];
213
- if (node.type === AST_NODE_TYPES.ReturnStatement) {
214
- returnStatements.push(node);
215
- }
216
- if ("body" in node && node.body !== void 0 && node.body !== null) {
217
- Array.isArray(node.body) ? node.body.forEach((x) => {
218
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
219
- }) : returnStatements.push(
220
- ...ASTUtils.getNestedReturnStatements(node.body)
221
- );
222
- }
223
- if ("consequent" in node) {
224
- Array.isArray(node.consequent) ? node.consequent.forEach((x) => {
225
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
226
- }) : returnStatements.push(
227
- ...ASTUtils.getNestedReturnStatements(node.consequent)
228
- );
229
- }
230
- if ("alternate" in node && node.alternate !== null) {
231
- Array.isArray(node.alternate) ? node.alternate.forEach((x) => {
232
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
233
- }) : returnStatements.push(
234
- ...ASTUtils.getNestedReturnStatements(node.alternate)
235
- );
236
- }
237
- if ("cases" in node) {
238
- node.cases.forEach((x) => {
239
- returnStatements.push(...ASTUtils.getNestedReturnStatements(x));
240
- });
241
- }
242
- if ("block" in node) {
243
- returnStatements.push(...ASTUtils.getNestedReturnStatements(node.block));
244
- }
245
- if ("handler" in node && node.handler !== null) {
246
- returnStatements.push(...ASTUtils.getNestedReturnStatements(node.handler));
247
- }
248
- if ("finalizer" in node && node.finalizer !== null) {
249
- returnStatements.push(
250
- ...ASTUtils.getNestedReturnStatements(node.finalizer)
251
- );
252
- }
253
- if ("expression" in node && node.expression !== true && node.expression !== false) {
254
- returnStatements.push(
255
- ...ASTUtils.getNestedReturnStatements(node.expression)
256
- );
257
- }
258
- if ("test" in node && node.test !== null) {
259
- returnStatements.push(...ASTUtils.getNestedReturnStatements(node.test));
260
- }
261
- return returnStatements;
262
- }
263
- };
264
- export {
265
- ASTUtils
266
- };
267
- //# sourceMappingURL=ast-utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ast-utils.js","sources":["../../../src/utils/ast-utils.ts"],"sourcesContent":["import { AST_NODE_TYPES } from '@typescript-eslint/utils'\nimport { uniqueBy } from './unique-by'\nimport type { TSESLint, TSESTree } from '@typescript-eslint/utils'\n\nexport const ASTUtils = {\n isNodeOfOneOf<T extends AST_NODE_TYPES>(\n node: TSESTree.Node,\n types: ReadonlyArray<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 Array<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: Array<TSESTree.ObjectLiteralElement>,\n key: string,\n ): TSESTree.Property | undefined {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return properties.find((x) =>\n ASTUtils.isPropertyWithIdentifierKey(x, key),\n ) as TSESTree.Property | undefined\n },\n getNestedIdentifiers(node: TSESTree.Node): Array<TSESTree.Identifier> {\n const identifiers: Array<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 ('left' in node) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.left))\n }\n\n if ('right' in node) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.right))\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 if (node.type === AST_NODE_TYPES.ArrowFunctionExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.body))\n }\n\n if (node.type === AST_NODE_TYPES.FunctionExpression) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.body))\n }\n\n if (node.type === AST_NODE_TYPES.BlockStatement) {\n identifiers.push(\n ...node.body.map((body) => ASTUtils.getNestedIdentifiers(body)).flat(),\n )\n }\n\n if (node.type === AST_NODE_TYPES.ReturnStatement && node.argument) {\n identifiers.push(...ASTUtils.getNestedIdentifiers(node.argument))\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: Array<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: TSESLint.Scope.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 }): Array<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.TSNonNullExpression,\n AST_NODE_TYPES.Identifier,\n ]),\n )\n },\n mapKeyNodeToBaseText(\n node: TSESTree.Node,\n sourceCode: Readonly<TSESLint.SourceCode>,\n ) {\n return ASTUtils.mapKeyNodeToText(node, sourceCode).replace(\n /(?:\\?(\\.)|!)/g,\n '$1',\n )\n },\n isValidReactComponentOrHookName(\n identifier: TSESTree.Identifier | null | undefined,\n ) {\n return (\n identifier !== null &&\n identifier !== undefined &&\n /^(use|[A-Z])/.test(identifier.name)\n )\n },\n getFunctionAncestor(\n sourceCode: Readonly<TSESLint.SourceCode>,\n node: TSESTree.Node,\n ) {\n for (const ancestor of sourceCode.getAncestors(node)) {\n if (\n ASTUtils.isNodeOfOneOf(ancestor, [\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n ])\n ) {\n return ancestor\n }\n\n if (\n ancestor.parent?.type === AST_NODE_TYPES.VariableDeclarator &&\n ancestor.parent.id.type === AST_NODE_TYPES.Identifier &&\n ASTUtils.isNodeOfOneOf(ancestor, [\n AST_NODE_TYPES.FunctionDeclaration,\n AST_NODE_TYPES.FunctionExpression,\n AST_NODE_TYPES.ArrowFunctionExpression,\n ])\n ) {\n return ancestor\n }\n }\n\n return undefined\n },\n getReferencedExpressionByIdentifier(params: {\n node: TSESTree.Node\n context: Readonly<TSESLint.RuleContext<string, ReadonlyArray<unknown>>>\n }) {\n const { node, context } = params\n\n // we need the fallbacks for backwards compat with eslint < 8.37.0\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const sourceCode = context.sourceCode ?? context.getSourceCode()\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n const scope = context.sourceCode.getScope(node)\n ? sourceCode.getScope(node)\n : context.getScope()\n\n const resolvedNode = scope.references.find((ref) => ref.identifier === node)\n ?.resolved?.defs[0]?.node\n\n if (resolvedNode?.type !== AST_NODE_TYPES.VariableDeclarator) {\n return null\n }\n\n return resolvedNode.init\n },\n getClosestVariableDeclarator(node: TSESTree.Node) {\n let currentNode: TSESTree.Node | undefined = node\n\n while (currentNode.type !== AST_NODE_TYPES.Program) {\n if (currentNode.type === AST_NODE_TYPES.VariableDeclarator) {\n return currentNode\n }\n\n currentNode = currentNode.parent\n }\n\n return undefined\n },\n getNestedReturnStatements(\n node: TSESTree.Node,\n ): Array<TSESTree.ReturnStatement> {\n const returnStatements: Array<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"],"names":[],"mappings":"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"}
@@ -1,11 +0,0 @@
1
- import { TSESTree, ESLintUtils } from '@typescript-eslint/utils';
2
- type Create = Parameters<ReturnType<typeof ESLintUtils.RuleCreator>>[0]['create'];
3
- type Context = Parameters<Create>[0];
4
- type Options = Parameters<Create>[1];
5
- type Helpers = {
6
- isSpecificTanstackQueryImport: (node: TSESTree.Identifier, source: string) => boolean;
7
- isTanstackQueryImport: (node: TSESTree.Identifier) => boolean;
8
- };
9
- type EnhancedCreate = (context: Context, options: Options, helpers: Helpers) => ReturnType<Create>;
10
- export declare function detectTanstackQueryImports(create: EnhancedCreate): Create;
11
- export {};
@@ -1,55 +0,0 @@
1
- import { TSESTree } from "@typescript-eslint/utils";
2
- function detectTanstackQueryImports(create) {
3
- return (context, optionsWithDefault) => {
4
- const tanstackQueryImportSpecifiers = [];
5
- const helpers = {
6
- isSpecificTanstackQueryImport(node, source) {
7
- return !!tanstackQueryImportSpecifiers.find((specifier) => {
8
- if (specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier && specifier.parent.type === TSESTree.AST_NODE_TYPES.ImportDeclaration && specifier.parent.source.value === source) {
9
- return node.name === specifier.local.name;
10
- }
11
- return false;
12
- });
13
- },
14
- isTanstackQueryImport(node) {
15
- return !!tanstackQueryImportSpecifiers.find((specifier) => {
16
- if (specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier) {
17
- return node.name === specifier.local.name;
18
- }
19
- return false;
20
- });
21
- }
22
- };
23
- const detectionInstructions = {
24
- ImportDeclaration(node) {
25
- if (node.specifiers.length > 0 && // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
26
- (node.importKind === "value" || node.importKind === void 0) && node.source.value.startsWith("@tanstack/") && node.source.value.endsWith("-query")) {
27
- tanstackQueryImportSpecifiers.push(...node.specifiers);
28
- }
29
- }
30
- };
31
- const ruleInstructions = create(context, optionsWithDefault, helpers);
32
- const enhancedRuleInstructions = {};
33
- const allKeys = new Set(
34
- Object.keys(detectionInstructions).concat(Object.keys(ruleInstructions))
35
- );
36
- allKeys.forEach((instruction) => {
37
- enhancedRuleInstructions[instruction] = (node) => {
38
- var _a;
39
- if (instruction in detectionInstructions) {
40
- (_a = detectionInstructions[instruction]) == null ? void 0 : _a.call(detectionInstructions, node);
41
- }
42
- const ruleInstruction = ruleInstructions[instruction];
43
- if (ruleInstruction) {
44
- return ruleInstruction(node);
45
- }
46
- return void 0;
47
- };
48
- });
49
- return enhancedRuleInstructions;
50
- };
51
- }
52
- export {
53
- detectTanstackQueryImports
54
- };
55
- //# sourceMappingURL=detect-react-query-imports.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"detect-react-query-imports.js","sources":["../../../src/utils/detect-react-query-imports.ts"],"sourcesContent":["import { TSESTree } from '@typescript-eslint/utils'\nimport type { ESLintUtils, TSESLint } 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 isSpecificTanstackQueryImport: (\n node: TSESTree.Identifier,\n source: string,\n ) => boolean\n isTanstackQueryImport: (node: TSESTree.Identifier) => boolean\n}\n\ntype 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: Array<TSESTree.ImportClause> = []\n\n const helpers: Helpers = {\n isSpecificTanstackQueryImport(node, source) {\n return !!tanstackQueryImportSpecifiers.find((specifier) => {\n if (\n specifier.type === TSESTree.AST_NODE_TYPES.ImportSpecifier &&\n specifier.parent.type ===\n TSESTree.AST_NODE_TYPES.ImportDeclaration &&\n specifier.parent.source.value === source\n ) {\n return node.name === specifier.local.name\n }\n\n return false\n })\n },\n isTanstackQueryImport(node) {\n return !!tanstackQueryImportSpecifiers.find((specifier) => {\n if (specifier.type === TSESTree.AST_NODE_TYPES.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 // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (node.importKind === 'value' || node.importKind === undefined) &&\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 const ruleInstruction = ruleInstructions[instruction]\n\n // TODO: canReportErrors()\n if (ruleInstruction) {\n return ruleInstruction(node)\n }\n\n return undefined\n }\n })\n\n return enhancedRuleInstructions\n }\n}\n"],"names":[],"mappings":";AAuBO,SAAS,2BAA2B,QAAgC;AAClE,SAAA,CAAC,SAAS,uBAAuB;AACtC,UAAM,gCAA8D,CAAC;AAErE,UAAM,UAAmB;AAAA,MACvB,8BAA8B,MAAM,QAAQ;AAC1C,eAAO,CAAC,CAAC,8BAA8B,KAAK,CAAC,cAAc;AACzD,cACE,UAAU,SAAS,SAAS,eAAe,mBAC3C,UAAU,OAAO,SACf,SAAS,eAAe,qBAC1B,UAAU,OAAO,OAAO,UAAU,QAClC;AACO,mBAAA,KAAK,SAAS,UAAU,MAAM;AAAA,UAAA;AAGhC,iBAAA;AAAA,QAAA,CACR;AAAA,MACH;AAAA,MACA,sBAAsB,MAAM;AAC1B,eAAO,CAAC,CAAC,8BAA8B,KAAK,CAAC,cAAc;AACzD,cAAI,UAAU,SAAS,SAAS,eAAe,iBAAiB;AACvD,mBAAA,KAAK,SAAS,UAAU,MAAM;AAAA,UAAA;AAGhC,iBAAA;AAAA,QAAA,CACR;AAAA,MAAA;AAAA,IAEL;AAEA,UAAM,wBAA+C;AAAA,MACnD,kBAAkB,MAAM;AAEpB,YAAA,KAAK,WAAW,SAAS;AAAA,SAExB,KAAK,eAAe,WAAW,KAAK,eAAe,WACpD,KAAK,OAAO,MAAM,WAAW,YAAY,KACzC,KAAK,OAAO,MAAM,SAAS,QAAQ,GACnC;AAC8B,wCAAA,KAAK,GAAG,KAAK,UAAU;AAAA,QAAA;AAAA,MACvD;AAAA,IAEJ;AAGA,UAAM,mBAAmB,OAAO,SAAS,oBAAoB,OAAO;AACpE,UAAM,2BAAkD,CAAC;AAEzD,UAAM,UAAU,IAAI;AAAA,MAClB,OAAO,KAAK,qBAAqB,EAAE,OAAO,OAAO,KAAK,gBAAgB,CAAC;AAAA,IACzE;AAIQ,YAAA,QAAQ,CAAC,gBAAgB;AACN,+BAAA,WAAW,IAAI,CAAC,SAAS;;AAChD,YAAI,eAAe,uBAAuB;AAClB,sCAAA,iBAAA,+CAAe;AAAA,QAAI;AAGrC,cAAA,kBAAkB,iBAAiB,WAAW;AAGpD,YAAI,iBAAiB;AACnB,iBAAO,gBAAgB,IAAI;AAAA,QAAA;AAGtB,eAAA;AAAA,MACT;AAAA,IAAA,CACD;AAEM,WAAA;AAAA,EACT;AACF;"}
@@ -1 +0,0 @@
1
- export declare const getDocsUrl: (ruleName: string) => string;
@@ -1,5 +0,0 @@
1
- const getDocsUrl = (ruleName) => `https://tanstack.com/query/latest/docs/eslint/${ruleName}`;
2
- export {
3
- getDocsUrl
4
- };
5
- //# sourceMappingURL=get-docs-url.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-docs-url.js","sources":["../../../src/utils/get-docs-url.ts"],"sourcesContent":["export const getDocsUrl = (ruleName: string): string =>\n `https://tanstack.com/query/latest/docs/eslint/${ruleName}`\n"],"names":[],"mappings":"AAAO,MAAM,aAAa,CAAC,aACzB,iDAAiD,QAAQ;"}
@@ -1 +0,0 @@
1
- export declare function uniqueBy<T>(arr: Array<T>, fn: (x: T) => unknown): Array<T>;
@@ -1,7 +0,0 @@
1
- function uniqueBy(arr, fn) {
2
- return arr.filter((x, i, a) => a.findIndex((y) => fn(x) === fn(y)) === i);
3
- }
4
- export {
5
- uniqueBy
6
- };
7
- //# sourceMappingURL=unique-by.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"unique-by.js","sources":["../../../src/utils/unique-by.ts"],"sourcesContent":["export function uniqueBy<T>(arr: Array<T>, fn: (x: T) => unknown): Array<T> {\n return arr.filter((x, i, a) => a.findIndex((y) => fn(x) === fn(y)) === i)\n}\n"],"names":[],"mappings":"AAAgB,SAAA,SAAY,KAAe,IAAiC;AAC1E,SAAO,IAAI,OAAO,CAAC,GAAG,GAAG,MAAM,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AAC1E;"}
package/src/index.ts DELETED
@@ -1,52 +0,0 @@
1
- import { rules } from './rules'
2
- import type { ESLint, Linter } from 'eslint'
3
- import type { RuleModule } from '@typescript-eslint/utils/ts-eslint'
4
-
5
- type RuleKey = keyof typeof rules
6
-
7
- export interface Plugin extends Omit<ESLint.Plugin, 'rules'> {
8
- rules: Record<RuleKey, RuleModule<any, any, any>>
9
- configs: {
10
- recommended: ESLint.ConfigData
11
- 'flat/recommended': Array<Linter.Config>
12
- }
13
- }
14
-
15
- const plugin: Plugin = {
16
- meta: {
17
- name: '@tanstack/eslint-plugin-query',
18
- },
19
- configs: {} as Plugin['configs'],
20
- rules,
21
- }
22
-
23
- // Assign configs here so we can reference `plugin`
24
- Object.assign(plugin.configs, {
25
- recommended: {
26
- plugins: ['@tanstack/query'],
27
- rules: {
28
- '@tanstack/query/exhaustive-deps': 'error',
29
- '@tanstack/query/no-rest-destructuring': 'warn',
30
- '@tanstack/query/stable-query-client': 'error',
31
- '@tanstack/query/no-unstable-deps': 'error',
32
- '@tanstack/query/infinite-query-property-order': 'error',
33
- },
34
- },
35
- 'flat/recommended': [
36
- {
37
- name: 'tanstack/query/flat/recommended',
38
- plugins: {
39
- '@tanstack/query': plugin,
40
- },
41
- rules: {
42
- '@tanstack/query/exhaustive-deps': 'error',
43
- '@tanstack/query/no-rest-destructuring': 'warn',
44
- '@tanstack/query/stable-query-client': 'error',
45
- '@tanstack/query/no-unstable-deps': 'error',
46
- '@tanstack/query/infinite-query-property-order': 'error',
47
- },
48
- },
49
- ],
50
- })
51
-
52
- export default plugin