Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
60 changes: 47 additions & 13 deletions docs/eslint/eslint-plugin-query.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,34 +19,68 @@ $ yarn add -D @tanstack/eslint-plugin-query
$ bun add -D @tanstack/eslint-plugin-query
```

## Usage
## Flat Config (`eslint.config.js`)

To enable all of the recommended rules for our plugin, add `plugin:@tanstack/eslint-plugin-query/recommended` in extends:
### Recommended setup

```json
{
"extends": ["plugin:@tanstack/eslint-plugin-query/recommended"]
}
To enable all of the recommended rules for our plugin, add the following config:

```js
import pluginQuery from '@tanstack/eslint-plugin-query'

export default [
...pluginQuery.configs['flat/recommended'],
// Any other config...
]
```

### Custom setup

Alternatively, you can load the plugin and configure only the rules you want to use:

```js
import pluginQuery from '@tanstack/eslint-plugin-query'

export default [
{
plugins: {
'@tanstack/query': pluginQuery,
},
rules: {
'@tanstack/query/exhaustive-deps': 'error',
},
},
// Any other config...
]
```

### Alternative config
## Legacy Config (`.eslintrc`)

Alternatively, add `@tanstack/eslint-plugin-query` to the plugins section of your `.eslintrc` configuration file:
### Recommended setup

To enable all of the recommended rules for our plugin, add `plugin:@tanstack/eslint-plugin-query/recommended` in extends:

```json
{
"plugins": ["@tanstack/query"]
"extends": ["plugin:@tanstack/eslint-plugin-query/recommended"]
}
```

Then configure the rules you want to use under the rules section:
### Custom setup

Alternatively, add `@tanstack/eslint-plugin-query` to the plugins section, and configure the rules you want to use:

```json
{
"plugins": ["@tanstack/query"],
"rules": {
"@tanstack/query/exhaustive-deps": "error",
"@tanstack/query/no-rest-destructuring": "warn",
"@tanstack/query/stable-query-client": "error"
"@tanstack/query/exhaustive-deps": "error"
}
}
```

## Rules

- [@tanstack/query/exhaustive-deps](../exhaustive-deps)
- [@tanstack/query/no-rest-destructuring](../exhaustive-deps)
- [@tanstack/query/stable-query-client](../exhaustive-deps)
1 change: 0 additions & 1 deletion examples/react/basic-graphql-request/src/index.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* eslint-disable jsx-a11y/anchor-is-valid */
import React from 'react'
import ReactDOM from 'react-dom/client'
import {
Expand Down
7 changes: 0 additions & 7 deletions examples/react/basic-typescript/.eslintrc

This file was deleted.

19 changes: 19 additions & 0 deletions examples/react/basic-typescript/eslint.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { tanstackConfig } from '@tanstack/config/eslint'
import pluginQuery from '@tanstack/eslint-plugin-query'
import pluginReact from '@eslint-react/eslint-plugin'
import pluginReactHooks from 'eslint-plugin-react-hooks'

export default [
...tanstackConfig,
...pluginQuery.configs['flat/recommended'],
pluginReact.configs.recommended,
{
plugins: {
'react-hooks': pluginReactHooks,
},
rules: {
'react-hooks/exhaustive-deps': 'error',
'react-hooks/rules-of-hooks': 'error',
},
},
]
1 change: 0 additions & 1 deletion examples/react/basic-typescript/src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* eslint-disable jsx-a11y/anchor-is-valid */
import * as React from 'react'
import ReactDOM from 'react-dom/client'
import axios from 'axios'
Expand Down
2 changes: 1 addition & 1 deletion examples/react/basic-typescript/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true
},
"include": ["src"]
"include": ["src", "eslint.config.js"]
}
1 change: 0 additions & 1 deletion examples/react/basic/src/index.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* eslint-disable jsx-a11y/anchor-is-valid */
import React from 'react'
import ReactDOM from 'react-dom/client'
import axios from 'axios'
Expand Down
1 change: 0 additions & 1 deletion examples/react/default-query-function/src/index.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* eslint-disable jsx-a11y/anchor-is-valid */
import React from 'react'
import ReactDOM from 'react-dom/client'
import axios from 'axios'
Expand Down
1 change: 0 additions & 1 deletion examples/react/simple/src/index.jsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
/* eslint-disable jsx-a11y/anchor-is-valid */
import React from 'react'
import ReactDOM from 'react-dom/client'
import {
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
},
"namespace": "@tanstack",
"devDependencies": {
"@arethetypeswrong/cli": "^0.15.3",
"@arethetypeswrong/cli": "^0.16.0",
"@cspell/eslint-plugin": "^8.9.1",
"@eslint-react/eslint-plugin": "^1.5.16",
"@solidjs/testing-library": "^0.8.8",
Expand Down
3 changes: 3 additions & 0 deletions packages/eslint-plugin-query/.attw.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"ignoreRules": ["false-export-default"]
}
21 changes: 0 additions & 21 deletions packages/eslint-plugin-query/src/__tests__/configs.test.ts

This file was deleted.

34 changes: 0 additions & 34 deletions packages/eslint-plugin-query/src/configs.ts

This file was deleted.

49 changes: 47 additions & 2 deletions packages/eslint-plugin-query/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,47 @@
export { configs } from './configs'
export { rules } from './rules'
import { rules } from './rules'
import type { ESLint, Linter } from 'eslint'
import type { RuleModule } from '@typescript-eslint/utils/ts-eslint'

type RuleKey = keyof typeof rules

interface Plugin extends Omit<ESLint.Plugin, 'rules'> {
rules: Record<RuleKey, RuleModule<any, any, any>>
configs: Record<
string,
ESLint.ConfigData | Linter.FlatConfig | Array<Linter.FlatConfig>
>
}

const plugin: Plugin = {
meta: {
name: '@tanstack/eslint-plugin-query',
},
configs: {},
rules,
}

// Assign configs here so we can reference `plugin`
Object.assign(plugin.configs, {
recommended: {
plugins: ['@tanstack/eslint-plugin-query'],
rules: {
'@tanstack/query/exhaustive-deps': 'error',
'@tanstack/query/no-rest-destructuring': 'warn',
'@tanstack/query/stable-query-client': 'error',
},
},
'flat/recommended': [
{
plugins: {
'@tanstack/query': plugin,
},
rules: {
'@tanstack/query/exhaustive-deps': 'error',
'@tanstack/query/no-rest-destructuring': 'warn',
'@tanstack/query/stable-query-client': 'error',
},
},
],
})

export default plugin
11 changes: 6 additions & 5 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.