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
51 changes: 37 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -75,15 +75,18 @@ These rules enforce some of the [best practices recommended for using Cypress](h

In the following sections, different examples of possible configuration file contents are given, together with some brief explanations. Adapt these examples according to your needs.

The examples use the `defineConfig()` helper, introduced with ESLint [9.22.0](https://eslint.org/blog/2025/03/eslint-v9.22.0-released/). Refer to the blog article [Evolving flat config with extends](https://eslint.org/blog/2025/03/flat-config-extends-define-config-global-ignores/) for background information. If you are using ESLint `<9.22.0`, import `defineConfig` from [@eslint/config-helpers](https://www.npmjs.com/package/@eslint/config-helpers) instead of from `eslint/config`.

### Cypress

All rules are available by importing from `eslint-plugin-cypress` and can be individually activated.

- [cypress/unsafe-to-chain-command](https://github.com/cypress-io/eslint-plugin-cypress/blob/master/docs/rules/unsafe-to-chain-command.md) is activated and set to `error`

```js
import { defineConfig } from 'eslint/config'
import pluginCypress from 'eslint-plugin-cypress'
export default [
export default defineConfig([
{
plugins: {
cypress: pluginCypress,
Expand All @@ -92,7 +95,7 @@ export default [
'cypress/unsafe-to-chain-command': 'error',
},
},
]
])
```

### Cypress recommended
Expand All @@ -102,24 +105,36 @@ The `eslint-plugin-cypress` [recommended rules](#rules) `configs.recommended` ar
- [cypress/no-unnecessary-waiting](https://github.com/cypress-io/eslint-plugin-cypress/blob/master/docs/rules/no-unnecessary-waiting.md) which is set to `off`

```js
import { defineConfig } from 'eslint/config'
import pluginCypress from 'eslint-plugin-cypress'
export default [
pluginCypress.configs.recommended,
export default defineConfig([
{
files: ['cypress/**/*.js'],
extends: [
pluginCypress.configs.recommended,
],
rules: {
'cypress/no-unnecessary-waiting': 'off',
},
},
]
])
```

### Cypress globals

The `configs.globals` are activated.

```js
import { defineConfig } from 'eslint/config'
import pluginCypress from 'eslint-plugin-cypress'
export default [pluginCypress.configs.globals]
export default defineConfig([
{
files: ['cypress/**/*.js'],
extends: [
pluginCypress.configs.globals,
],
},
])
```

## Disable rules
Expand Down Expand Up @@ -187,20 +202,24 @@ npm install eslint-plugin-mocha@^11 --save-dev
```

```js
import { defineConfig } from 'eslint/config'
import pluginMocha from 'eslint-plugin-mocha'
import pluginCypress from 'eslint-plugin-cypress'
export default [
pluginMocha.configs.recommended,
pluginCypress.configs.recommended,
export default defineConfig([
{
files: ['cypress/**/*.js'],
extends: [
pluginMocha.configs.recommended,
pluginCypress.configs.recommended,
],
rules: {
'mocha/no-exclusive-tests': 'error',
'mocha/no-pending-tests': 'error',
'mocha/no-mocha-arrows': 'off',
'cypress/no-unnecessary-waiting': 'off',
},
},
]
])
```

### Cypress and Chai recommended
Expand All @@ -216,17 +235,21 @@ npm install eslint-plugin-chai-friendly@^1.0.1 --save-dev
```

```js
import { defineConfig } from 'eslint/config'
import pluginCypress from 'eslint-plugin-cypress'
import pluginChaiFriendly from 'eslint-plugin-chai-friendly'
export default [
pluginCypress.configs.recommended,
pluginChaiFriendly.configs.recommendedFlat,
export default defineConfig([
{
files: ['cypress/**/*.js'],
extends: [
pluginCypress.configs.recommended,
pluginChaiFriendly.configs.recommendedFlat,
],
rules: {
'cypress/no-unnecessary-waiting': 'off',
},
},
]
])
```

## Contributing
Expand Down
13 changes: 6 additions & 7 deletions circle.yml
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,12 @@ workflows:
matrix:
parameters:
eslint-version: ['9']
config-file: [
# configurations correspond to examples in README
'default',
'default-deprecated', # using deprecated /flat
'recommended',
'globals',
]
config-file:
# configurations correspond to examples in README
- 'globals'
- 'one-rule-deprecated' # using deprecated /flat
- 'one-rule'
- 'recommended'
requires:
- build-test-project
- release:
Expand Down
29 changes: 15 additions & 14 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,24 +1,22 @@
import { defineConfig, globalIgnores } from 'eslint/config'
import globals from 'globals'
import pluginJs from '@eslint/js'
import eslintPlugin from 'eslint-plugin-eslint-plugin'
import mochaPlugin from 'eslint-plugin-mocha'
import stylistic from '@stylistic/eslint-plugin'

export default [
pluginJs.configs.recommended,
eslintPlugin.configs.recommended,
mochaPlugin.configs.recommended,
stylistic.configs.recommended,
export default defineConfig([

globalIgnores(['test-project/**/*', '!test-project/**/eslint*']),

{
ignores: [
'test-project/**/*',
'!test-project/**/eslint*',
files: ['**/*.{,m}js'],
extends: [
pluginJs.configs.recommended,
eslintPlugin.configs.recommended,
mochaPlugin.configs.recommended,
stylistic.configs.recommended,
],
},
{
languageOptions: {
globals: globals.node,
},
rules: {
'no-redeclare': 'off',
'@stylistic/arrow-parens': ['error', 'always'],
Expand All @@ -34,5 +32,8 @@ export default [
'mocha/no-mocha-arrows': 'off',
'mocha/no-setup-in-describe': 'off',
},
languageOptions: {
globals: globals.node,
},
},
]
])
11 changes: 0 additions & 11 deletions test-project/eslint-configs/eslint.default-deprecated.mjs

This file was deleted.

9 changes: 0 additions & 9 deletions test-project/eslint-configs/eslint.default.mjs

This file was deleted.

11 changes: 10 additions & 1 deletion test-project/eslint-configs/eslint.globals.mjs
Original file line number Diff line number Diff line change
@@ -1,2 +1,11 @@
// Only config.globals are activated
import { defineConfig } from 'eslint/config'
import pluginCypress from 'eslint-plugin-cypress'
export default [pluginCypress.configs.globals]
export default defineConfig([
{
files: ['cypress/**/*.js'],
extends: [
pluginCypress.configs.globals,
],
},
])
15 changes: 15 additions & 0 deletions test-project/eslint-configs/eslint.one-rule-deprecated.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
// eslint-plugin-cypress/flat is deprecated and is identical to
// eslint-plugin-cypress
// Plugin activated, only one rule applied
import { defineConfig } from 'eslint/config'
import pluginCypress from 'eslint-plugin-cypress/flat'
export default defineConfig([
{
plugins: {
cypress: pluginCypress,
},
rules: {
'cypress/unsafe-to-chain-command': 'error',
},
},
])
13 changes: 13 additions & 0 deletions test-project/eslint-configs/eslint.one-rule.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Plugin activated, only one rule applied
import { defineConfig } from 'eslint/config'
import pluginCypress from 'eslint-plugin-cypress'
export default defineConfig([
{
plugins: {
cypress: pluginCypress,
},
rules: {
'cypress/unsafe-to-chain-command': 'error',
},
},
])
11 changes: 8 additions & 3 deletions test-project/eslint-configs/eslint.recommended.mjs
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
// All recommended rules are applied, except cypress/no-unnecessary-waiting
import { defineConfig } from 'eslint/config'
import pluginCypress from 'eslint-plugin-cypress'
export default [
pluginCypress.configs.recommended,
export default defineConfig([
{
files: ['cypress/**/*.js'],
extends: [
pluginCypress.configs.recommended,
],
rules: {
'cypress/no-unnecessary-waiting': 'off',
},
},
]
])
12 changes: 8 additions & 4 deletions test-project/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import pluginCypress from 'eslint-plugin-cypress/flat'
export default [
pluginCypress.configs.recommended,
// All recommended rules are applied, except cypress/no-unnecessary-waiting
import { defineConfig } from 'eslint/config'
import pluginCypress from 'eslint-plugin-cypress'
export default defineConfig([
{
extends: [
pluginCypress.configs.recommended,
],
rules: {
'cypress/no-unnecessary-waiting': 'off',
},
},
]
])