eslint-plugin-cypress
Advanced tools
Comparing version
@@ -37,3 +37,3 @@ # Contributing to cypress-io/eslint-plugin-cypress | ||
* Make sure all tests are passing | ||
* Add the rule to [legacy.js](https://github.com/cypress-io/eslint-plugin-cypress/blob/master/legacy.js) and to [flat.js](https://github.com/cypress-io/eslint-plugin-cypress/blob/master/lib/flat.js) | ||
* Add the rule to [flat.js](https://github.com/cypress-io/eslint-plugin-cypress/blob/master/lib/flat.js) | ||
* Create a git commit with a commit message similar to: `feat: add rule <description>` (see [commit message conventions](https://github.com/semantic-release/semantic-release#commit-message-format)) | ||
@@ -48,7 +48,2 @@ * Create a PR from your branch | ||
## Legacy tests | ||
* The directory [tests-legacy](https://github.com/cypress-io/eslint-plugin-cypress/tree/master/tests-legacy) contains tests which are compatible with the legacy [ESLint v8 RuleTester](https://eslint.org/docs/v8.x/integrate/nodejs-api#ruletester) utility. It is not expected to add new rules to this set of tests. | ||
* The directory [tests](https://github.com/cypress-io/eslint-plugin-cypress/tree/master/tests) is for tests compatible with the current [ESLint RuleTester](https://eslint.org/docs/latest/integrate/nodejs-api#ruletester). | ||
## Merging pull requests | ||
@@ -55,0 +50,0 @@ |
# Cypress ESLint Plugin - Legacy Config | ||
This document supplements the [README](./README.md) document and describes how to use the Cypress ESLint Plugin (`eslint-plugin-cypress`) in a [deprecated ESLint legacy config environment](https://eslint.org/docs/latest/use/configure/configuration-files-deprecated). The use of flat configurations with this plugin is described in the [README](./README.md) document. | ||
This document previously described how to use the Cypress ESLint Plugin (`eslint-plugin-cypress`) with an [ESLint legacy config environment](https://eslint.org/docs/latest/use/configure/configuration-files-deprecated). | ||
Usage with ESLint `9.x` is described. | ||
This form of configuration was deprecated with the release of ESLint `v9` and its use with `eslint-plugin-cypress` is no longer supported. | ||
## Deprecations | ||
The use of `eslintrc` configurations with `eslint-plugin-cypress` is deprecated and support will be removed in a future version of this plugin. This is tied in to the ESLint announcement in the blog post [Flat config rollout plans](https://eslint.org/blog/2023/10/flat-config-rollout-plans/) from October 2023 which describes that the `eslintrc` configuration system is planned to be removed in the future ESLint `v10.0.0`. Users are encouraged to migrate to using a [flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files). | ||
## Installation | ||
Use a minimum ESLint `9.x`. | ||
```shell | ||
npm install eslint eslint-plugin-cypress --save-dev | ||
``` | ||
or | ||
```shell | ||
yarn add eslint eslint-plugin-cypress --dev | ||
``` | ||
## Usage | ||
To use a deprecated configuration with ESLint `v9`, such as `.eslintrc.json`, you must set the `ESLINT_USE_FLAT_CONFIG` environment variable to `false` (see [ESLint v9 > Configuration Files (Deprecated)](https://eslint.org/docs/latest/use/configure/configuration-files-deprecated)). The following examples use `json` format for the content of the configuration file: | ||
```json | ||
{ | ||
"plugins": [ | ||
"cypress" | ||
] | ||
} | ||
``` | ||
You can add rules - see [Rules](./README.md#rules) for a list of the available rules: | ||
```json | ||
{ | ||
"rules": { | ||
"cypress/no-assigning-return-values": "error", | ||
"cypress/no-unnecessary-waiting": "error", | ||
"cypress/assertion-before-screenshot": "warn", | ||
"cypress/no-force": "warn", | ||
"cypress/no-async-tests": "error", | ||
"cypress/no-async-before": "error", | ||
"cypress/no-pause": "error", | ||
"cypress/no-debug": "error" | ||
} | ||
} | ||
``` | ||
You can allow certain globals provided by Cypress: | ||
```json | ||
{ | ||
"env": { | ||
"cypress/globals": true | ||
} | ||
} | ||
``` | ||
## Recommended configuration | ||
Use the recommended configuration and you can forego configuring _plugins_, _rules_, and _env_ individually. See [Rules](./README.md#rules) for which rules are included in the recommended configuration. | ||
```json | ||
{ | ||
"extends": [ | ||
"plugin:cypress/recommended" | ||
] | ||
} | ||
``` | ||
## Rules | ||
See the [Rules](./README.md#rules) list in the main [README](./README.md) document. | ||
## Mocha and Chai | ||
Cypress is built on top of [Mocha](https://on.cypress.io/guides/references/bundled-libraries#Mocha) and [Chai](https://on.cypress.io/guides/references/bundled-libraries#Chai). See the following sections for information on using ESLint plugins [eslint-plugin-mocha](https://www.npmjs.com/package/eslint-plugin-mocha) and [eslint-plugin-chai-friendly](https://www.npmjs.com/package/eslint-plugin-chai-friendly) together with `eslint-plugin-cypress`. | ||
## Mocha `.only` and `.skip` | ||
During test spec development, [Mocha exclusive tests](https://mochajs.org/#exclusive-tests) `.only` or [Mocha inclusive tests](https://mochajs.org/#inclusive-tests) `.skip` may be used to control which tests are executed, as described in the Cypress documentation [Excluding and Including Tests](https://on.cypress.io/guides/core-concepts/writing-and-organizing-tests#Excluding-and-Including-Tests). To apply corresponding rules, you can install and use [eslint-plugin-mocha](https://www.npmjs.com/package/eslint-plugin-mocha). The rule [mocha/no-exclusive-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-exclusive-tests.md) detects the use of `.only` and the [mocha/no-skipped-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-skipped-tests.md) rule detects the use of `.skip`: | ||
```sh | ||
npm install --save-dev eslint-plugin-mocha | ||
``` | ||
In your `.eslintrc.json`: | ||
```json | ||
{ | ||
"plugins": [ | ||
"cypress", | ||
"mocha" | ||
], | ||
"rules": { | ||
"mocha/no-exclusive-tests": "warn", | ||
"mocha/no-skipped-tests": "warn" | ||
} | ||
} | ||
``` | ||
Or you can simply use the `cypress/recommended` and `mocha/recommended` configurations together, for example: | ||
```json | ||
{ | ||
"extends": [ | ||
"plugin:cypress/recommended", | ||
"plugin:mocha/recommended" | ||
] | ||
} | ||
``` | ||
## Chai and `no-unused-expressions` | ||
Using an assertion such as `expect(value).to.be.true` can fail the ESLint rule `no-unused-expressions` even though it's not an error in this case. To fix this, you can install and use [eslint-plugin-chai-friendly](https://www.npmjs.com/package/eslint-plugin-chai-friendly). | ||
```sh | ||
npm install --save-dev eslint-plugin-chai-friendly | ||
``` | ||
In your `.eslintrc.json`: | ||
```json | ||
{ | ||
"plugins": [ | ||
"cypress", | ||
"chai-friendly" | ||
], | ||
"rules": { | ||
"no-unused-expressions": 0, | ||
"chai-friendly/no-unused-expressions": 2 | ||
} | ||
} | ||
``` | ||
Or you can simply add its `recommended` config: | ||
```json | ||
{ | ||
"extends": ["plugin:chai-friendly/recommended"] | ||
} | ||
``` | ||
Users who were previously using a deprecated configuration environment should migrate to a [flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files). |
# Cypress ESLint Plugin - Flat Config | ||
Please refer to the [README](./README.md) document where the previous contents of this document, describing how to use `eslint-plugin-cypress` with an ESLint `v9` (default) [flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files), can now be found. | ||
For instructions on using a deprecated [eslintrc-type](https://eslint.org/docs/latest/use/configure/configuration-files-deprecated) config file from previous ESLint `v8` versions and below, please refer to the [ESLINTRC-CONFIG](./ESLINTRC-CONFIG.md) document. | ||
Please refer to the [README](./README.md) document which describes how to use `eslint-plugin-cypress` with an ESLint `v9` (default) [flat configuration](https://eslint.org/docs/latest/use/configure/configuration-files). |
@@ -8,14 +8,14 @@ const globals = require('globals') | ||
rules: { | ||
'assertion-before-screenshot': require('./rules/assertion-before-screenshot'), | ||
'no-assigning-return-values': require('./rules/no-assigning-return-values'), | ||
'unsafe-to-chain-command': require('./rules/unsafe-to-chain-command'), | ||
'no-unnecessary-waiting': require('./rules/no-unnecessary-waiting'), | ||
'no-async-before': require('./rules/no-async-before'), | ||
'no-async-tests': require('./rules/no-async-tests'), | ||
'assertion-before-screenshot': require('./rules/assertion-before-screenshot'), | ||
'require-data-selectors': require('./rules/require-data-selectors'), | ||
'no-chained-get': require('./rules/no-chained-get'), | ||
'no-debug': require('./rules/no-debug'), | ||
'no-force': require('./rules/no-force'), | ||
'no-pause': require('./rules/no-pause'), | ||
'no-debug': require('./rules/no-debug'), | ||
'no-unnecessary-waiting': require('./rules/no-unnecessary-waiting'), | ||
'no-xpath': require('./rules/no-xpath'), | ||
'no-chained-get': require('./rules/no-chained-get'), | ||
'require-data-selectors': require('./rules/require-data-selectors'), | ||
'unsafe-to-chain-command': require('./rules/unsafe-to-chain-command'), | ||
}, | ||
@@ -22,0 +22,0 @@ } |
{ | ||
"name": "eslint-plugin-cypress", | ||
"version": "4.3.0", | ||
"version": "5.0.0", | ||
"description": "An ESLint plugin for projects using Cypress", | ||
"main": "legacy.js", | ||
"main": "./lib/flat.js", | ||
"exports": { | ||
".": "./legacy.js", | ||
".": "./lib/flat.js", | ||
"./flat": "./lib/flat.js" | ||
@@ -29,19 +29,18 @@ }, | ||
"dependencies": { | ||
"globals": "^15.15.0" | ||
"globals": "^16.2.0" | ||
}, | ||
"devDependencies": { | ||
"eslint": "^9.24.0", | ||
"eslint": "^9.27.0", | ||
"eslint-plugin-eslint-plugin": "^6.4.0", | ||
"eslint-plugin-mocha": "^10.5.0", | ||
"eslint-plugin-mocha": "^11.1.0", | ||
"husky": "^9.1.7", | ||
"jest": "^29.7.0", | ||
"semantic-release": "24.2.3" | ||
"semantic-release": "24.2.5" | ||
}, | ||
"scripts": { | ||
"lint": "eslint \"*.js\" \"**/**/*.js\"", | ||
"lint-fix": "npm run lint -- --fix", | ||
"lint": "eslint", | ||
"lint-fix": "eslint --fix", | ||
"semantic-release": "semantic-release", | ||
"start": "npm run test-watch", | ||
"test": "jest", | ||
"test:legacy": "jest --config jest.config-legacy.js", | ||
"test-watch": "jest --watchAll", | ||
@@ -48,0 +47,0 @@ "prepare": "husky" |
@@ -21,17 +21,23 @@ # Cypress ESLint Plugin [](https://circleci.com/gh/cypress-io/eslint-plugin-cypress/tree/master) | ||
ESLint `v9` uses a [Flat config file](https://eslint.org/docs/latest/use/configure/configuration-files) format with filename `eslint.config.*js` by default. For instructions on using a deprecated [eslintrc-type](https://eslint.org/docs/latest/use/configure/configuration-files-deprecated) config file from previous ESLint versions, please refer to the [ESLINTRC-CONFIG](./ESLINTRC-CONFIG.md) document. | ||
ESLint `v9` uses a [Flat config file](https://eslint.org/docs/latest/use/configure/configuration-files) format with filename `eslint.config.*js` by default. This plugin no longer supports the use of a deprecated [eslintrc-type](https://eslint.org/docs/latest/use/configure/configuration-files-deprecated) config file from previous ESLint versions. | ||
To set up a flat configuration, add a file `eslint.config.mjs` to the root directory of your Cypress project and include the following instructions to import the available flat configurations using: | ||
To set up a configuration, add a file `eslint.config.mjs` to the root directory of your Cypress project and include the following instructions to import the available configurations using: | ||
```shell | ||
import pluginCypress from 'eslint-plugin-cypress/flat' | ||
import pluginCypress from 'eslint-plugin-cypress' | ||
``` | ||
For backwards compatibility with previous plugin versions `3.3.0` - `4.3.0`, the following equivalent deprecated form is also supported. This is planned to be removed in a future major version: | ||
```shell | ||
import pluginCypress from 'eslint-plugin-cypress/flat' # deprecated | ||
``` | ||
## Configurations | ||
There are two specific flat configurations available: | ||
There are two specific configurations available: | ||
| Configuration | Content | | ||
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ||
| `configs.globals` | defines globals `cy`, `Cypress`, `expect`, `assert` and `chai` used in Cypress test specs as well as `globals.browser` and `globals.mocha` from [globals](https://www.npmjs.com/package/globals). This version no longer specifies `languageOptions` for `ecmaVersion` and `sourceType` - see ESLint [JavaScript languageOptions](https://eslint.org/docs/latest/use/configure/language-options#specifying-javascript-options). There are no default rules enabled in this configuration. | | ||
| `configs.globals` | defines globals `cy`, `Cypress`, `expect`, `assert` and `chai` used in Cypress test specs as well as `globals.browser` and `globals.mocha` from [globals](https://www.npmjs.com/package/globals). There are no default rules enabled in this configuration. | | ||
| `configs.recommended` | enables [recommended Rules](#rules). It includes also `configs.global` (see above). | | ||
@@ -71,7 +77,7 @@ | ||
All rules from `eslint-plugin-cypress` are available through `eslint-plugin-cypress/flat` and can be individually activated. | ||
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 pluginCypress from 'eslint-plugin-cypress/flat' | ||
import pluginCypress from 'eslint-plugin-cypress' | ||
export default [ | ||
@@ -95,3 +101,3 @@ { | ||
```js | ||
import pluginCypress from 'eslint-plugin-cypress/flat' | ||
import pluginCypress from 'eslint-plugin-cypress' | ||
export default [ | ||
@@ -112,3 +118,3 @@ pluginCypress.configs.recommended, | ||
```js | ||
import pluginCypress from 'eslint-plugin-cypress/flat' | ||
import pluginCypress from 'eslint-plugin-cypress' | ||
export default [ | ||
@@ -164,18 +170,18 @@ pluginCypress.configs.globals | ||
Cypress is built on top of [Mocha](https://on.cypress.io/guides/references/bundled-libraries#Mocha) and [Chai](https://on.cypress.io/guides/references/bundled-libraries#Chai). See the following sections for information on using ESLint plugins [eslint-plugin-mocha](https://www.npmjs.com/package/eslint-plugin-mocha) and [eslint-plugin-chai-friendly](https://www.npmjs.com/package/eslint-plugin-chai-friendly) together with `eslint-plugin-cypress`. | ||
Cypress is built on top of [Mocha](https://on.cypress.io/app/references/bundled-libraries#Mocha) and [Chai](https://on.cypress.io/app/references/bundled-libraries#Chai). See the following sections for information on using ESLint plugins [eslint-plugin-mocha](https://www.npmjs.com/package/eslint-plugin-mocha) and [eslint-plugin-chai-friendly](https://www.npmjs.com/package/eslint-plugin-chai-friendly) together with `eslint-plugin-cypress`. | ||
## Mocha `.only` and `.skip` | ||
During test spec development, [Mocha exclusive tests](https://mochajs.org/#exclusive-tests) `.only` or [Mocha inclusive tests](https://mochajs.org/#inclusive-tests) `.skip` may be used to control which tests are executed, as described in the Cypress documentation [Excluding and Including Tests](https://on.cypress.io/guides/core-concepts/writing-and-organizing-tests#Excluding-and-Including-Tests). To apply corresponding rules, you can install and use [eslint-plugin-mocha](https://www.npmjs.com/package/eslint-plugin-mocha). The rule [mocha/no-exclusive-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-exclusive-tests.md) detects the use of `.only` and the [mocha/no-skipped-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-skipped-tests.md) rule detects the use of `.skip`. | ||
During test spec development, [Mocha exclusive tests](https://mochajs.org/#exclusive-tests) `.only` or [Mocha inclusive tests](https://mochajs.org/#inclusive-tests) `.skip` may be used to control which tests are executed, as described in the Cypress documentation [Excluding and Including Tests](https://on.cypress.io/app/core-concepts/writing-and-organizing-tests#Excluding-and-Including-Tests). To apply corresponding rules, you can install and use [eslint-plugin-mocha@^11](https://www.npmjs.com/package/eslint-plugin-mocha) plugin version or above. The rule [mocha/no-exclusive-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-exclusive-tests.md) detects the use of `.only` and the [mocha/no-pending-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-pending-tests.md) rule detects the use of `.skip`. | ||
### Cypress and Mocha recommended | ||
[eslint-plugin-mocha](https://www.npmjs.com/package/eslint-plugin-mocha) is added to the example [Cypress recommended](#cypress-recommended). This plugin offers a flat file recommended option `configs.flat.recommended`. | ||
[eslint-plugin-mocha@^11](https://www.npmjs.com/package/eslint-plugin-mocha) is added to the example [Cypress recommended](#cypress-recommended). This version of the plugin supports only flat file configurations with the option `configs.recommended`. | ||
The settings for individual `mocha` rules from the `configs.flat.recommended` option are changed. | ||
- [mocha/no-exclusive-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-exclusive-tests.md) and [mocha/no-skipped-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-skipped-tests.md) are set to `error` instead of `warn` | ||
The settings for individual `mocha` rules from the `configs.recommended` option are changed. | ||
- [mocha/no-exclusive-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-exclusive-tests.md) and [mocha/no-pending-tests](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-pending-tests.md) are set to `error` instead of `warn` | ||
- [mocha/no-mocha-arrows](https://github.com/lo1tuma/eslint-plugin-mocha/blob/main/docs/rules/no-mocha-arrows.md) is set to `off` instead of `error` | ||
```shell | ||
npm install eslint-plugin-mocha@^10.5.0 --save-dev | ||
npm install eslint-plugin-mocha@^11 --save-dev | ||
``` | ||
@@ -185,5 +191,5 @@ | ||
import pluginMocha from 'eslint-plugin-mocha' | ||
import pluginCypress from 'eslint-plugin-cypress/flat' | ||
import pluginCypress from 'eslint-plugin-cypress' | ||
export default [ | ||
pluginMocha.configs.flat.recommended, | ||
pluginMocha.configs.recommended, | ||
pluginCypress.configs.recommended, | ||
@@ -193,3 +199,3 @@ { | ||
'mocha/no-exclusive-tests': 'error', | ||
'mocha/no-skipped-tests': 'error', | ||
'mocha/no-pending-tests': 'error', | ||
'mocha/no-mocha-arrows': 'off', | ||
@@ -215,3 +221,3 @@ 'cypress/no-unnecessary-waiting': 'off' | ||
```js | ||
import pluginCypress from 'eslint-plugin-cypress/flat' | ||
import pluginCypress from 'eslint-plugin-cypress' | ||
import pluginChaiFriendly from 'eslint-plugin-chai-friendly' | ||
@@ -218,0 +224,0 @@ export default [ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
230
2.68%152939
-12.89%84
-11.58%3148
-10.21%+ Added
- Removed
Updated