Skip to content

Commit 3cdc53e

Browse files
committed
feat: add require-query-options rule
1 parent 7c3b6e7 commit 3cdc53e

File tree

9 files changed

+2265
-4
lines changed

9 files changed

+2265
-4
lines changed

.prettierignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
/docs/rules

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# eslint-plugin-react-query-options
2+
3+
Eslint plugin for tanstack query to enforce using the `queryOptions` api inspired by [this post](https://tkdodo.eu/blog/the-query-options-api) from TkDodo
4+
5+
<!-- prettier-ignore-start -->
6+
<!-- begin auto-generated rules list -->
7+
8+
💼 Configurations enabled in.\
9+
✅ Set in the `recommended` configuration.
10+
11+
| Name                  | Description | 💼 |
12+
| :----------------------------------------------------------- | :------------------------------------------------------------------ | :- |
13+
| [require-query-options](docs/rules/require-query-options.md) | Enforce use*Query functions are called with a queryOptions pattern. ||
14+
15+
<!-- end auto-generated rules list -->
16+
<!-- prettier-ignore-end -->
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Enforce use*Query functions are called with a queryOptions pattern (`react-query-options/require-query-options`)
2+
3+
💼 This rule is enabled in the ✅ `recommended` config.
4+
5+
<!-- end auto-generated rule header -->
6+
7+
Enforces useQuery (and family) hooks use some form of query constructor pattern. Will error if queryKey or queryFn properties are passed to the hook
8+
9+
## Fail
10+
11+
```js
12+
useQuery({
13+
queryKey: [/**/],
14+
/* additional properties */
15+
})
16+
17+
useQuery({
18+
queryFn: () => { /**/ }
19+
/* additional properties */
20+
})
21+
```
22+
23+
## Pass
24+
25+
```js
26+
const query = {
27+
queryKey: [/**/],
28+
queryFn: () => { /**/ }
29+
}
30+
31+
const queryBuilder = () => ({
32+
queryKey: [/**/],
33+
queryFn: () => { /**/ }
34+
})
35+
36+
useQuery(query)
37+
useQuery(queryBuilder())
38+
useQuery({
39+
...queryBuilder(),
40+
/* additional properties */
41+
select: (data) => data
42+
})
43+
```

package.json

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
"type": "module",
55
"exports": "./dist/index.js",
66
"scripts": {
7-
"build": "tsc",
7+
"build": "tsdown --clean --dts",
8+
"test": "tsx --test",
9+
"eslint-docs:update": "eslint-doc-generator",
10+
"eslint-docs:lint": "eslint-doc-generator --check",
811
"prepare": "node --run build"
912
},
1013
"keywords": [
1114
"eslint",
15+
"eslintplugin",
1216
"eslint-plugin",
1317
"query",
1418
"react-query",
@@ -20,9 +24,21 @@
2024
},
2125
"license": "MIT",
2226
"packageManager": "[email protected]+sha512.0e155aa2629db8672b49e8475da6226aa4bdea85fdcdfdc15350874946d4f3c91faaf64cbdc4a5d1ab8002f473d5c3fcedcd197989cf0390f9badd3c04678706",
27+
"dependencies": {
28+
"@typescript-eslint/utils": "^8.44.0"
29+
},
2330
"devDependencies": {
2431
"@tsconfig/node-lts": "^22.0.2",
32+
"@types/node": "^24.5.1",
33+
"@typescript-eslint/rule-tester": "^8.44.0",
34+
"eslint": "^9.35.0",
35+
"eslint-doc-generator": "^2.2.2",
2536
"prettier": "^3.6.2",
37+
"tsdown": "^0.15.2",
38+
"tsx": "^4.20.5",
2639
"typescript": "^5.9.2"
40+
},
41+
"peerDependencies": {
42+
"eslint": ">=9.0.0"
2743
}
2844
}

0 commit comments

Comments
 (0)