Skip to content

Commit 2958f48

Browse files
committed
chore!: rename require-query-options -> use-query-no-inline-query
1 parent 6aacaa9 commit 2958f48

File tree

6 files changed

+104
-88
lines changed

6 files changed

+104
-88
lines changed

README.md

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,19 @@ export default [
2121
💼 Configurations enabled in.\
2222
✅ Set in the `recommended` configuration.
2323

24-
| Name                  | Description | 💼 |
25-
| :----------------------------------------------------------- | :------------------------------------------------------------------ | :- |
26-
| [require-query-options](docs/rules/require-query-options.md) | Enforce use*Query functions are called with a queryOptions pattern. ||
24+
| Name                      | Description | 💼 |
25+
| :------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------- | :- |
26+
| [use-query-no-inline-query](docs/rules/use-query-no-inline-query.md) | Enforces useQuery (and family) hooks use some form of query constructor pattern. Will error if queryKey or queryFn properties are passed to the hook ||
2727

2828
<!-- end auto-generated rules list -->
2929
<!-- prettier-ignore-end -->
30+
31+
## Configs
32+
33+
<!-- begin auto-generated configs list -->
34+
35+
| | Name |
36+
| :- | :------------ |
37+
|| `recommended` |
38+
39+
<!-- end auto-generated configs list -->

docs/rules/require-query-options.md renamed to docs/rules/use-query-no-inline-query.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# Enforce use*Query functions are called with a queryOptions pattern (`react-query-options/require-query-options`)
1+
# Enforces useQuery (and family) hooks use some form of query constructor pattern. Will error if queryKey or queryFn properties are passed to the hook (`react-query-options/use-query-no-inline-query`)
22

33
💼 This rule is enabled in the ✅ `recommended` config.
44

src/index.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import requireQueryOptions from "./rules/require-query-options.js";
1+
import useQueryNoInlineQuery from "./rules/use-query-no-inline-query.js";
2+
23
import pkg from "../package.json" with { type: "json" };
34

45
const reactQueryOptions = {
@@ -11,18 +12,19 @@ const reactQueryOptions = {
1112
return configs;
1213
},
1314
rules: {
14-
"require-query-options": requireQueryOptions,
15+
[useQueryNoInlineQuery.name]: useQueryNoInlineQuery.rule,
1516
},
1617
};
1718

1819
const configs = {
1920
recommended: [
2021
{
2122
plugins: {
22-
"react-query-options": reactQueryOptions,
23+
[reactQueryOptions.meta.namespace]: reactQueryOptions,
2324
},
2425
rules: {
25-
"react-query-options/require-query-options": "error",
26+
[`${reactQueryOptions.meta.namespace}/${useQueryNoInlineQuery.name}`]:
27+
"error",
2628
},
2729
},
2830
],

src/rules/require-query-options.ts

Lines changed: 0 additions & 74 deletions
This file was deleted.

src/rules/require-query-options.test.ts renamed to src/rules/use-query-no-inline-query.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ import "../_test/setup.js";
22

33
import { RuleTester } from "@typescript-eslint/rule-tester";
44

5-
import requireQueryOptions from "./require-query-options.js";
5+
import requireQueryOptions from "./use-query-no-inline-query.js";
66

77
const ruleTester = new RuleTester({});
88

9-
ruleTester.run("require-query-options", requireQueryOptions, {
9+
ruleTester.run(requireQueryOptions.name, requireQueryOptions.rule, {
1010
valid: [
1111
{ code: `useQuery(usersQuery)` },
1212
{ code: `useQuery({ ...usersQuery })` },
@@ -16,19 +16,19 @@ ruleTester.run("require-query-options", requireQueryOptions, {
1616
invalid: [
1717
{
1818
code: `useQuery({ queryKey: [] })`,
19-
errors: [{ messageId: "require-query-options" }],
19+
errors: [{ messageId: "no-inline-query" }],
2020
},
2121
{
2222
code: `const users = useQuery({ ...queryOptions, queryKey: [] })`,
23-
errors: [{ messageId: "require-query-options" }],
23+
errors: [{ messageId: "no-inline-query" }],
2424
},
2525
{
2626
code: `const users = useQuery({ queryFn: () => {} })`,
27-
errors: [{ messageId: "require-query-options" }],
27+
errors: [{ messageId: "no-inline-query" }],
2828
},
2929
{
3030
code: `const users = useQuery({ ...queryOptions, queryFn: () => {} })`,
31-
errors: [{ messageId: "require-query-options" }],
31+
errors: [{ messageId: "no-inline-query" }],
3232
},
3333
],
3434
});
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import {
2+
AST_NODE_TYPES,
3+
ESLintUtils,
4+
TSESTree,
5+
} from "@typescript-eslint/utils";
6+
7+
const createRule = ESLintUtils.RuleCreator(
8+
(name) =>
9+
`https://github.com/danielpza/eslint-plugin-react-query/docs/rules/${name}.md`,
10+
);
11+
12+
const useQueryHooks = [
13+
// see https://tanstack.com/query/latest/docs/framework/react/reference/useQuery
14+
"useQuery",
15+
"useQueries",
16+
"useInfiniteQuery",
17+
"useSuspenseQuery",
18+
"useSuspenseQueries",
19+
"useSuspenseInfiniteQuery",
20+
];
21+
22+
const invalidProperties = ["queryKey", "queryFn"];
23+
24+
function isValidQueryNode(queryNode: TSESTree.Node) {
25+
// we only care about object expressions
26+
if (queryNode.type !== AST_NODE_TYPES.ObjectExpression) return true;
27+
28+
// check if any of the properties is queryKey or queryFn
29+
const hasInvalidProperties = queryNode.properties.find(
30+
(property) =>
31+
property.type === AST_NODE_TYPES.Property &&
32+
property.key.type === AST_NODE_TYPES.Identifier &&
33+
invalidProperties.includes(property.key.name),
34+
);
35+
36+
return !hasInvalidProperties;
37+
}
38+
39+
const name = "use-query-no-inline-query";
40+
41+
export default {
42+
name,
43+
rule: createRule({
44+
name,
45+
defaultOptions: [],
46+
meta: {
47+
type: "suggestion",
48+
messages: {
49+
"no-inline-query": "Expected query hook to use queryOptions pattern",
50+
},
51+
docs: {
52+
description:
53+
"Enforces useQuery (and family) hooks use some form of query constructor pattern. Will error if queryKey or queryFn properties are passed to the hook",
54+
},
55+
schema: [],
56+
},
57+
create(context) {
58+
return {
59+
CallExpression(node) {
60+
if (node.callee.type !== AST_NODE_TYPES.Identifier) return;
61+
if (!useQueryHooks.includes(node.callee.name)) return;
62+
63+
// use*Query hook call
64+
if (!node.arguments[0]) return;
65+
66+
// if if caller first argument is an object
67+
const queryNode = node.arguments[0];
68+
69+
if (!isValidQueryNode(queryNode))
70+
context.report({
71+
messageId: "no-inline-query",
72+
node,
73+
});
74+
},
75+
};
76+
},
77+
}),
78+
};

0 commit comments

Comments
 (0)