mirror of
https://github.com/JamesIves/github-pages-deploy-action.git
synced 2023-12-15 20:03:39 +08:00
878 lines
23 KiB
Markdown
878 lines
23 KiB
Markdown
|
# eslint-config-prettier [![Build Status][travis-badge]][travis]
|
|||
|
|
|||
|
Turns off all rules that are unnecessary or might conflict with [Prettier].
|
|||
|
|
|||
|
This lets you use you favorite shareable config without letting its stylistic
|
|||
|
choices get in the way when using Prettier.
|
|||
|
|
|||
|
Note that this config _only_ turns rules _off,_ so it only makes sense using
|
|||
|
it together with some other config.
|
|||
|
|
|||
|
## Contents
|
|||
|
|
|||
|
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
|
|||
|
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
|
|||
|
|
|||
|
|
|||
|
- [Installation](#installation)
|
|||
|
- [CLI helper tool](#cli-helper-tool)
|
|||
|
- [Example configuration](#example-configuration)
|
|||
|
- [Special rules](#special-rules)
|
|||
|
- [arrow-body-style and prefer-arrow-callback](#arrow-body-style-and-prefer-arrow-callback)
|
|||
|
- [curly](#curly)
|
|||
|
- [lines-around-comment](#lines-around-comment)
|
|||
|
- [max-len](#max-len)
|
|||
|
- [no-confusing-arrow](#no-confusing-arrow)
|
|||
|
- [no-mixed-operators](#no-mixed-operators)
|
|||
|
- [no-tabs](#no-tabs)
|
|||
|
- [no-unexpected-multiline](#no-unexpected-multiline)
|
|||
|
- [quotes](#quotes)
|
|||
|
- [Enforce backticks](#enforce-backticks)
|
|||
|
- [Forbid unnecessary backticks](#forbid-unnecessary-backticks)
|
|||
|
- [Example _double_ quote configuration](#example-_double_-quote-configuration)
|
|||
|
- [Example _single_ quote configuration](#example-_single_-quote-configuration)
|
|||
|
- [vue/html-self-closing](#vuehtml-self-closing)
|
|||
|
- [Other rules worth mentioning](#other-rules-worth-mentioning)
|
|||
|
- [no-sequences](#no-sequences)
|
|||
|
- [Contributing](#contributing)
|
|||
|
- [License](#license)
|
|||
|
|
|||
|
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
|
|||
|
|
|||
|
## Installation
|
|||
|
|
|||
|
Tip: First, you might be interested in installing [eslint-plugin-prettier].
|
|||
|
Follow the instructions over there. This is optional, though.
|
|||
|
|
|||
|
Install eslint-config-prettier:
|
|||
|
|
|||
|
```
|
|||
|
npm install --save-dev eslint-config-prettier
|
|||
|
```
|
|||
|
|
|||
|
Then, add eslint-config-prettier to the "extends" array in your `.eslintrc.*`
|
|||
|
file. Make sure to put it **last,** so it gets the chance to override other
|
|||
|
configs.
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"extends": [
|
|||
|
"some-other-config-you-use",
|
|||
|
"prettier"
|
|||
|
]
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
A few ESLint plugins are supported as well:
|
|||
|
|
|||
|
- [@typescript-eslint/eslint-plugin]
|
|||
|
- [eslint-plugin-babel]
|
|||
|
- [eslint-plugin-flowtype]
|
|||
|
- [eslint-plugin-react]
|
|||
|
- [eslint-plugin-standard]
|
|||
|
- [eslint-plugin-unicorn]
|
|||
|
- [eslint-plugin-vue]
|
|||
|
|
|||
|
Add extra exclusions for the plugins you use like so:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"extends": [
|
|||
|
"some-other-config-you-use",
|
|||
|
"prettier",
|
|||
|
"prettier/@typescript-eslint",
|
|||
|
"prettier/babel",
|
|||
|
"prettier/flowtype",
|
|||
|
"prettier/react",
|
|||
|
"prettier/standard",
|
|||
|
"prettier/unicorn",
|
|||
|
"prettier/vue"
|
|||
|
]
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
If you extend a config which uses a plugin, it is recommended to add
|
|||
|
`"prettier/that-plugin"` (if available). For example, [eslint-config-airbnb]
|
|||
|
enables [eslint-plugin-react] rules, so `"prettier/react"` is needed:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"extends": [
|
|||
|
"airbnb",
|
|||
|
"prettier",
|
|||
|
"prettier/react"
|
|||
|
]
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
If you’re unsure which plugins are used, you can usually find them in your
|
|||
|
`package.json`.
|
|||
|
|
|||
|
## CLI helper tool
|
|||
|
|
|||
|
eslint-config-prettier also ships with a little CLI tool to help you check if
|
|||
|
your configuration contains any rules that are unnecessary or conflict with
|
|||
|
Prettier.
|
|||
|
|
|||
|
First, add a script for it to package.json:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"scripts": {
|
|||
|
"eslint-check": "eslint --print-config . | eslint-config-prettier-check"
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Then run `npm run eslint-check`.
|
|||
|
|
|||
|
If you use [multiple configuration files] or [overrides], you may need to run
|
|||
|
the above script several times with different `--print-config` arguments, such
|
|||
|
as:
|
|||
|
|
|||
|
```
|
|||
|
eslint --print-config test/index.js | eslint-config-prettier-check
|
|||
|
```
|
|||
|
|
|||
|
Exit codes:
|
|||
|
|
|||
|
- 0: No problems found.
|
|||
|
- 1: Unexpected error.
|
|||
|
- 2: Conflicting rules found.
|
|||
|
|
|||
|
## Example configuration
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"extends": [
|
|||
|
"standard",
|
|||
|
"plugin:@typescript-eslint/recommended",
|
|||
|
"plugin:flowtype/recommended",
|
|||
|
"plugin:react/recommended",
|
|||
|
"plugin:unicorn/recommended",
|
|||
|
"plugin:vue/recommended",
|
|||
|
"prettier",
|
|||
|
"prettier/@typescript-eslint",
|
|||
|
"prettier/babel",
|
|||
|
"prettier/flowtype",
|
|||
|
"prettier/react",
|
|||
|
"prettier/standard",
|
|||
|
"prettier/unicorn",
|
|||
|
"prettier/vue"
|
|||
|
],
|
|||
|
"plugins": [
|
|||
|
"@typescript-eslint",
|
|||
|
"babel",
|
|||
|
"flowtype",
|
|||
|
"prettier",
|
|||
|
"react",
|
|||
|
"standard",
|
|||
|
"unicorn",
|
|||
|
"vue"
|
|||
|
],
|
|||
|
"parserOptions": {
|
|||
|
"sourceType": "module",
|
|||
|
"ecmaFeatures": {
|
|||
|
"jsx": true
|
|||
|
}
|
|||
|
},
|
|||
|
"env": {
|
|||
|
"es6": true,
|
|||
|
"node": true
|
|||
|
},
|
|||
|
"rules": {
|
|||
|
"prettier/prettier": "error"
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## Special rules
|
|||
|
|
|||
|
There a few rules that eslint-config-prettier disables that actually can be
|
|||
|
enabled in some cases.
|
|||
|
|
|||
|
- Some require certain options. The CLI helper tool validates this.
|
|||
|
- Some require special attention when writing code. The CLI helper tool warns
|
|||
|
you if any of those rules are enabled, but can’t tell if anything is
|
|||
|
problematic.
|
|||
|
- Some can cause problems if using [eslint-plugin-prettier] and `--fix`.
|
|||
|
|
|||
|
For maximum ease of use, the special rules are disabled by default. If you want
|
|||
|
them, you need to explicitly specify them in your ESLint config.
|
|||
|
|
|||
|
### [arrow-body-style] and [prefer-arrow-callback]
|
|||
|
|
|||
|
**These rules might cause problems if using [eslint-plugin-prettier] and `--fix`.**
|
|||
|
|
|||
|
If you use any of these rules together with the `prettier/prettier` rule from
|
|||
|
[eslint-plugin-prettier], you can in some cases end up with invalid code due to
|
|||
|
a bug in ESLint’s autofix.
|
|||
|
|
|||
|
These rules are safe to use if:
|
|||
|
|
|||
|
- You don’t use [eslint-plugin-prettier]. In other words, you run `eslint --fix`
|
|||
|
and `prettier --write` as separate steps.
|
|||
|
- You _do_ use [eslint-plugin-prettier], but don’t use `--fix`. (But then,
|
|||
|
what’s the point?)
|
|||
|
|
|||
|
You _can_ still use these rules together with [eslint-plugin-prettier] if you
|
|||
|
want, because the bug does not occur _all the time._ But if you do, you need to
|
|||
|
keep in mind that you might end up with invalid code, where you manually have to
|
|||
|
insert a missing closing parenthesis to get going again.
|
|||
|
|
|||
|
If you’re fixing large of amounts of previously unformatted code, consider
|
|||
|
temporarily disabling the `prettier/prettier` rule and running `eslint --fix`
|
|||
|
and `prettier --write` separately.
|
|||
|
|
|||
|
See these issues for more information:
|
|||
|
|
|||
|
- [eslint-config-prettier#31]
|
|||
|
- [eslint-config-prettier#71]
|
|||
|
- [eslint-plugin-prettier#65]
|
|||
|
|
|||
|
When the autofix bug in ESLint has been fixed, the special case for these rules
|
|||
|
can be removed.
|
|||
|
|
|||
|
### [curly]
|
|||
|
|
|||
|
**This rule requires certain options.**
|
|||
|
|
|||
|
If a block (for example after `if`, `else`, `for` or `while`) contains only one
|
|||
|
statement, JavaScript allows omitting the curly braces around that statement.
|
|||
|
This rule enforces if or when those optional curly braces should be omitted.
|
|||
|
|
|||
|
If you use the `"multi-line"` or `"multi-or-nest"` option, the rule can conflict
|
|||
|
with Prettier.
|
|||
|
|
|||
|
For example, the `"multi-line"` option allows this line:
|
|||
|
|
|||
|
```js
|
|||
|
if (cart.items && cart.items[0] && cart.items[0].quantity === 0) updateCart(cart);
|
|||
|
```
|
|||
|
|
|||
|
However, Prettier might consider the line too long and turn it into the
|
|||
|
following, which the `"multi-line"` option does _not_ allow:
|
|||
|
|
|||
|
```js
|
|||
|
if (cart.items && cart.items[0] && cart.items[0].quantity === 0)
|
|||
|
updateCart(cart);
|
|||
|
```
|
|||
|
|
|||
|
If you like this rule, it can be used just fine with Prettier as long as you
|
|||
|
don’t use the `"multi-line"` or `"multi-or-nest"` option.
|
|||
|
|
|||
|
Example ESLint configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"curly": ["error", "all"]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### [lines-around-comment]
|
|||
|
|
|||
|
**This rule can be used with certain options.**
|
|||
|
|
|||
|
This rule requires empty lines before and/or after comments. Prettier preserves
|
|||
|
blank lines, with two exceptions:
|
|||
|
|
|||
|
- Several blank lines in a row are collapsed into a single blank line. This is
|
|||
|
fine.
|
|||
|
- Blank lines at the beginning and end of blocks, objects and arrays are always
|
|||
|
removed. This may lead to conflicts.
|
|||
|
|
|||
|
By default, ESLint requires a blank line above the comment is this case:
|
|||
|
|
|||
|
```js
|
|||
|
if (result) {
|
|||
|
|
|||
|
/* comment */
|
|||
|
return result;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
However, Prettier removes the blank line:
|
|||
|
|
|||
|
```js
|
|||
|
if (result) {
|
|||
|
/* comment */
|
|||
|
return result;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
If you like this rule, it can be used just fine with Prettier as long as you add
|
|||
|
some extra configuration to allow comments at the start and end of blocks,
|
|||
|
objects and arrays.
|
|||
|
|
|||
|
Example ESLint configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"lines-around-comment": [
|
|||
|
"error",
|
|||
|
{
|
|||
|
"beforeBlockComment": true,
|
|||
|
"afterBlockComment": true,
|
|||
|
"beforeLineComment": true,
|
|||
|
"afterLineComment": true,
|
|||
|
"allowBlockStart": true,
|
|||
|
"allowBlockEnd": true,
|
|||
|
"allowObjectStart": true,
|
|||
|
"allowObjectEnd": true,
|
|||
|
"allowArrayStart": true,
|
|||
|
"allowArrayEnd": true
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### [max-len]
|
|||
|
|
|||
|
**This rule requires special attention when writing code.**
|
|||
|
|
|||
|
Usually, Prettier takes care of following a maximum line length automatically.
|
|||
|
However, there are cases where Prettier can’t do anything, such as for long
|
|||
|
strings, regular expressions and comments. Those need to be split up by a human.
|
|||
|
|
|||
|
If you’d like to enforce an even stricter maximum line length policy than
|
|||
|
Prettier can provide automatically, you can enable this rule. Just remember to
|
|||
|
keep `max-len`’s options and Prettier’s `printWidth` option in sync.
|
|||
|
|
|||
|
Keep in mind that you might have to refactor code slightly if Prettier formats
|
|||
|
lines in a way that the `max-len` rule does not approve of.
|
|||
|
|
|||
|
Example ESLint configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"max-len": ["error", {"code": 80, "ignoreUrls": true}]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### [no-confusing-arrow]
|
|||
|
|
|||
|
**This rule requires certain options.**
|
|||
|
|
|||
|
For example, the rule could warn about this line:
|
|||
|
|
|||
|
```js
|
|||
|
var x = a => 1 ? 2 : 3;
|
|||
|
```
|
|||
|
|
|||
|
By default, ESLint suggests switching to an explicit return:
|
|||
|
|
|||
|
```js
|
|||
|
var x = a => { return 1 ? 2 : 3; };
|
|||
|
```
|
|||
|
|
|||
|
That causes no problems with Prettier.
|
|||
|
|
|||
|
With `{allowParens: true}`, adding parentheses is also considered a valid way to
|
|||
|
avoid the arrow confusion:
|
|||
|
|
|||
|
```js
|
|||
|
var x = a => (1 ? 2 : 3);
|
|||
|
```
|
|||
|
|
|||
|
While Prettier keeps thoses parentheses, it removes them if the line is long
|
|||
|
enough to introduce a line break:
|
|||
|
|
|||
|
```js
|
|||
|
EnterpriseCalculator.prototype.calculateImportantNumbers = inputNumber =>
|
|||
|
1 ? 2 : 3;
|
|||
|
```
|
|||
|
|
|||
|
If you like this rule, it can be used just fine with Prettier as long as the
|
|||
|
`allowParens` option is off.
|
|||
|
|
|||
|
Example ESLint configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"no-confusing-arrow": "error"
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### [no-mixed-operators]
|
|||
|
|
|||
|
**This rule requires special attention when writing code.**
|
|||
|
|
|||
|
This rule forbids mixing certain operators, such as `&&` and `||`.
|
|||
|
|
|||
|
For example, the rule could warn about this line:
|
|||
|
|
|||
|
```js
|
|||
|
var foo = a + b * c;
|
|||
|
```
|
|||
|
|
|||
|
The rule suggests adding parentheses, like this:
|
|||
|
|
|||
|
```js
|
|||
|
var foo = a + (b * c);
|
|||
|
```
|
|||
|
|
|||
|
However, Prettier removes many “unnecessary” parentheses, turning it back to:
|
|||
|
|
|||
|
```js
|
|||
|
var foo = a + b * c;
|
|||
|
```
|
|||
|
|
|||
|
If you want to use this rule with Prettier, you need to split the expression
|
|||
|
into another variable:
|
|||
|
|
|||
|
```js
|
|||
|
var bar = b * c;
|
|||
|
var foo = a + bar;
|
|||
|
```
|
|||
|
|
|||
|
Keep in mind that Prettier prints _some_ “unnecessary” parentheses, though:
|
|||
|
|
|||
|
```js
|
|||
|
var foo = (a && b) || c;
|
|||
|
```
|
|||
|
|
|||
|
Example ESLint configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"no-mixed-operators": "error"
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### [no-tabs]
|
|||
|
|
|||
|
**This rule requires certain Prettier options.**
|
|||
|
|
|||
|
This rule disallows the use of tab characters at all. It can be used just fine
|
|||
|
with Prettier as long as you don’t configure Prettier to indent using tabs.
|
|||
|
|
|||
|
Example ESLint configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"no-tabs": "error"
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Example Prettier configuration (this is the default, so adding this is not
|
|||
|
required):
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"useTabs": false
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
**Note:** Since [ESlint 5.7.0] this rule can be configured to work regardless of
|
|||
|
your Prettier configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"no-tabs": ["error", {"allowIndentationTabs": true}]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
A future version of eslint-config-prettier might check for that automatically.
|
|||
|
|
|||
|
### [no-unexpected-multiline]
|
|||
|
|
|||
|
**This rule requires special attention when writing code.**
|
|||
|
|
|||
|
This rule disallows confusing multiline expressions where a newline looks like
|
|||
|
it is ending a statement, but is not.
|
|||
|
|
|||
|
For example, the rule could warn about this:
|
|||
|
|
|||
|
```js
|
|||
|
var hello = "world"
|
|||
|
[1, 2, 3].forEach(addNumber)
|
|||
|
```
|
|||
|
|
|||
|
Prettier usually formats this in a way that makes it obvious that a semicolon
|
|||
|
was missing:
|
|||
|
|
|||
|
```js
|
|||
|
var hello = "world"[(1, 2, 3)].forEach(addNumber);
|
|||
|
```
|
|||
|
|
|||
|
However, there are cases where Prettier breaks things into several lines such
|
|||
|
that the `no-unexpected-multiline` conflicts.
|
|||
|
|
|||
|
```js
|
|||
|
const value = text.trim().split("\n")[position].toLowerCase();
|
|||
|
```
|
|||
|
|
|||
|
Prettier breaks it up into several lines, though, causing a conflict:
|
|||
|
|
|||
|
```js
|
|||
|
const value = text
|
|||
|
.trim()
|
|||
|
.split("\n")
|
|||
|
[position].toLowerCase();
|
|||
|
```
|
|||
|
|
|||
|
If you like this rule, it can usually be used with Prettier without problems,
|
|||
|
but occasionally you might need to either temporarily disable the rule or
|
|||
|
refactor your code.
|
|||
|
|
|||
|
```js
|
|||
|
const value = text
|
|||
|
.trim()
|
|||
|
.split("\n")
|
|||
|
// eslint-disable-next-line no-unexpected-multiline
|
|||
|
[position].toLowerCase();
|
|||
|
|
|||
|
// Or:
|
|||
|
|
|||
|
const lines = text.trim().split("\n");
|
|||
|
const value = lines[position].toLowerCase();
|
|||
|
```
|
|||
|
|
|||
|
**Note:** If you _do_ enable this rule, you have to run ESLint and Prettier as
|
|||
|
two separate steps (and ESLint first) in order to get any value out of it.
|
|||
|
Otherwise Prettier might reformat your code in such a way that ESLint never gets
|
|||
|
a chance to report anything (as seen in the first example).
|
|||
|
|
|||
|
Example configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"no-unexpected-multiline": "error"
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### [quotes]
|
|||
|
|
|||
|
(The following applies to [babel/quotes] as well.)
|
|||
|
|
|||
|
**This rule requires certain options and certain Prettier options.**
|
|||
|
|
|||
|
Usually, you don’t need this rule at all. But there are two cases where it could
|
|||
|
be useful:
|
|||
|
|
|||
|
- To enforce the use of backticks rather than single or double quotes for
|
|||
|
strings.
|
|||
|
- To forbid backticks where regular strings could have been used.
|
|||
|
|
|||
|
#### Enforce backticks
|
|||
|
|
|||
|
If you’d like all strings to use backticks (never quotes), enable the
|
|||
|
`"backtick"` option.
|
|||
|
|
|||
|
Example ESLint configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"quotes": ["error", "backtick"]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
#### Forbid unnecessary backticks
|
|||
|
|
|||
|
In the following example, the first array item could have been written with
|
|||
|
quotes instead of backticks.
|
|||
|
|
|||
|
```js
|
|||
|
const strings = [
|
|||
|
`could have been a regular string`,
|
|||
|
`
|
|||
|
multiple
|
|||
|
lines
|
|||
|
`,
|
|||
|
`uses ${interpolation}`,
|
|||
|
String.raw`\tagged/`,
|
|||
|
];
|
|||
|
```
|
|||
|
|
|||
|
If you’d like ESLint to enforce `` `could have been a regular string` `` being
|
|||
|
written as either `"could have been a regular string"` or `'could have been a
|
|||
|
regular string'`, you need to use some specific configuration. The `quotes` rule has two options, a string option and an object option.
|
|||
|
|
|||
|
- The first (string) option needs to be set to `"single"` or `"double"` and be
|
|||
|
kept in sync with Prettier’s [singleQuote] option.
|
|||
|
- The second (object) option needs the following properties:
|
|||
|
- `"avoidEscape": true` to follow Prettier’s [string formatting rules].
|
|||
|
- `"allowTemplateLiterals": false` to disallow unnecessary backticks.
|
|||
|
|
|||
|
##### Example _double_ quote configuration
|
|||
|
|
|||
|
ESLint:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"quotes": [
|
|||
|
"error",
|
|||
|
"double",
|
|||
|
{ "avoidEscape": true, "allowTemplateLiterals": false }
|
|||
|
]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Prettier (this is the default, so adding this is not required):
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"singleQuote": false
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
##### Example _single_ quote configuration
|
|||
|
|
|||
|
ESLint:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"quotes": [
|
|||
|
"error",
|
|||
|
"single",
|
|||
|
{ "avoidEscape": true, "allowTemplateLiterals": false }
|
|||
|
]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
Prettier:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"singleQuote": true
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
### [vue/html-self-closing]
|
|||
|
|
|||
|
**This rule requires certain options.**
|
|||
|
|
|||
|
This rule enforces whether elements should be self-closing or not.
|
|||
|
|
|||
|
Prettier generally preserves the way you wrote your elements:
|
|||
|
|
|||
|
```vue
|
|||
|
<div />
|
|||
|
<div></div>
|
|||
|
<MyComponent />
|
|||
|
<MyComponent></MyComponent>
|
|||
|
<svg><path d="" /></svg>
|
|||
|
<svg><path d=""></path></svg>
|
|||
|
```
|
|||
|
|
|||
|
But for known _void_ HTML elements, Prettier always uses the self-closing style.
|
|||
|
For example, `<img>` is turned into `<img />`.
|
|||
|
|
|||
|
If you like this rule, it can be used just fine with Prettier as long as you
|
|||
|
set `html.void` to `"any"`.
|
|||
|
|
|||
|
Example ESLint configuration:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"vue/html-self-closing": [
|
|||
|
"error",
|
|||
|
{
|
|||
|
"html": {
|
|||
|
"void": "any"
|
|||
|
}
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## Other rules worth mentioning
|
|||
|
|
|||
|
These rules don’t conflict with Prettier, but have some gotchas when used with
|
|||
|
Prettier.
|
|||
|
|
|||
|
### [no-sequences]
|
|||
|
|
|||
|
This rule forbids using JavaScript’s confusing comma operator (sequence
|
|||
|
expressions). This piece of code is not doing what it looks like:
|
|||
|
|
|||
|
```js
|
|||
|
matrix[4, 7];
|
|||
|
```
|
|||
|
|
|||
|
Prettier adds parentheses to the above to make it clear that a sequence
|
|||
|
expression is used:
|
|||
|
|
|||
|
```js
|
|||
|
matrix[(4, 7)];
|
|||
|
```
|
|||
|
|
|||
|
However, the `no-sequences` rule allows comma operators if the expression
|
|||
|
sequence is explicitly wrapped in parentheses. Since Prettier automatically
|
|||
|
wraps them in parentheses, you might never see any warnings from ESLint about
|
|||
|
comma operators.
|
|||
|
|
|||
|
Ending up with an accidental sequence expression can easily happen while
|
|||
|
refactoring. If you want ESLint to catch such mistakes, it is recommended to
|
|||
|
forbid sequence expressions entirely using [no-restricted-syntax] \([as
|
|||
|
mentioned in the `no-sequences` documentation][no-sequences-full]):
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"no-restricted-syntax": ["error", "SequenceExpression"]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
If you still need to use the comma operator for some edge case, you can place an
|
|||
|
`// eslint-disable-next-line no-restricted-syntax` comment on the line above the
|
|||
|
expression. `no-sequences` can safely be disabled if you use the
|
|||
|
`no-restricted-syntax` approach.
|
|||
|
|
|||
|
You can also supply a custom message if you want:
|
|||
|
|
|||
|
```json
|
|||
|
{
|
|||
|
"rules": {
|
|||
|
"no-restricted-syntax": [
|
|||
|
"error",
|
|||
|
{
|
|||
|
"selector": "SequenceExpression",
|
|||
|
"message": "The comma operator is confusing and a common mistake. Don’t use it!"
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## Contributing
|
|||
|
|
|||
|
eslint-config-prettier has been tested with:
|
|||
|
|
|||
|
- ESLint 5.16.0
|
|||
|
- eslint-config-prettier 2.10.0 and older were tested with ESLint 4.x
|
|||
|
- eslint-config-prettier 2.1.1 and older were tested with ESLint 3.x
|
|||
|
- prettier 1.17.1
|
|||
|
- @typescript-eslint/eslint-plugin 1.9.0
|
|||
|
- eslint-plugin-babel 5.3.0
|
|||
|
- eslint-plugin-flowtype 3.9.0
|
|||
|
- eslint-plugin-react 7.13.0
|
|||
|
- eslint-plugin-standard 4.0.0
|
|||
|
- eslint-plugin-unicorn 8.0.2
|
|||
|
- eslint-plugin-vue 5.2.2
|
|||
|
|
|||
|
Have new rules been added since those versions? Have we missed any rules? Is
|
|||
|
there a plugin you would like to see exclusions for? Open an issue or a pull
|
|||
|
request!
|
|||
|
|
|||
|
If you’d like to add support for eslint-plugin-foobar, this is how you’d go
|
|||
|
about it:
|
|||
|
|
|||
|
First, create `foobar.js`:
|
|||
|
|
|||
|
```js
|
|||
|
"use strict";
|
|||
|
|
|||
|
module.exports = {
|
|||
|
rules: {
|
|||
|
"foobar/some-rule": "off"
|
|||
|
}
|
|||
|
};
|
|||
|
```
|
|||
|
|
|||
|
Then, create `test-lint/foobar.js`:
|
|||
|
|
|||
|
```js
|
|||
|
/* eslint-disable quotes */
|
|||
|
"use strict";
|
|||
|
|
|||
|
// Prettier does not want spaces before the parentheses, but
|
|||
|
// `plugin:foobar/recommended` wants one.
|
|||
|
console.log();
|
|||
|
```
|
|||
|
|
|||
|
`test-lint/foobar.js` must fail when used with eslint-plugin-foobar and
|
|||
|
eslint-plugin-prettier at the same time – until `"prettier/foobar"` is added to
|
|||
|
the "extends" property of an ESLint config. The file should be formatted
|
|||
|
according to Prettier, and that formatting should disagree with the plugin.
|
|||
|
|
|||
|
Finally, you need to mention the plugin in several places:
|
|||
|
|
|||
|
- Add `"foobar.js"` to the "files" field in `package.json`.
|
|||
|
- Add eslint-plugin-foobar to the "devDependencies" field in `package.json`.
|
|||
|
- Make sure that at least one rule from eslint-plugin-foobar gets used in
|
|||
|
`.eslintrc.base.js`.
|
|||
|
- Add it to the list of supported plugins, to the example config and to
|
|||
|
Contributing section in `README.md`.
|
|||
|
|
|||
|
When you’re done, run `npm test` to verify that you got it all right. It runs
|
|||
|
several other npm scripts:
|
|||
|
|
|||
|
- `"test:lint"` makes sure that the files in `test-lint/` pass ESLint when
|
|||
|
the exclusions from eslint-config-prettier are used. It also lints the code of
|
|||
|
eslint-config-prettier itself.
|
|||
|
- `"test:lint-verify-fail"` is run by a test in `test/lint-verify-fail.test.js`.
|
|||
|
- `"test:lint-rules"` is run by a test in `test/rules.test.js`.
|
|||
|
- `"test:jest"` runs unit tests that check a number of things:
|
|||
|
- That eslint-plugin-foobar is mentioned in all the places shown above.
|
|||
|
- That no unknown rules are turned off. This helps catching typos, for
|
|||
|
example.
|
|||
|
- That the CLI works.
|
|||
|
- `"test:cli-sanity"` and `"test:cli-sanity-warning"` are sanity checks for the
|
|||
|
CLI.
|
|||
|
|
|||
|
## License
|
|||
|
|
|||
|
[MIT](LICENSE).
|
|||
|
|
|||
|
[@typescript-eslint/eslint-plugin]: https://github.com/typescript-eslint/typescript-eslint
|
|||
|
[ESlint 5.7.0]: https://eslint.org/blog/2018/10/eslint-v5.7.0-released
|
|||
|
[Prettier]: https://github.com/prettier/prettier
|
|||
|
[arrow-body-style]: https://eslint.org/docs/rules/arrow-body-style
|
|||
|
[babel/quotes]: https://github.com/babel/eslint-plugin-babel#rules
|
|||
|
[curly]: https://eslint.org/docs/rules/curly
|
|||
|
[eslint-config-airbnb]: https://www.npmjs.com/package/eslint-config-airbnb
|
|||
|
[eslint-config-prettier#31]: https://github.com/prettier/eslint-config-prettier/issues/31
|
|||
|
[eslint-config-prettier#71]: https://github.com/prettier/eslint-config-prettier/issues/71
|
|||
|
[eslint-plugin-babel]: https://github.com/babel/eslint-plugin-babel
|
|||
|
[eslint-plugin-flowtype]: https://github.com/gajus/eslint-plugin-flowtype
|
|||
|
[eslint-plugin-prettier#65]: https://github.com/prettier/eslint-plugin-prettier/issues/65
|
|||
|
[eslint-plugin-prettier]: https://github.com/prettier/eslint-plugin-prettier
|
|||
|
[eslint-plugin-react]: https://github.com/yannickcr/eslint-plugin-react
|
|||
|
[eslint-plugin-standard]: https://github.com/xjamundx/eslint-plugin-standard
|
|||
|
[eslint-plugin-unicorn]: https://github.com/sindresorhus/eslint-plugin-unicorn
|
|||
|
[eslint-plugin-vue]: https://github.com/vuejs/eslint-plugin-vue
|
|||
|
[lines-around-comment]: https://eslint.org/docs/rules/lines-around-comment
|
|||
|
[max-len]: https://eslint.org/docs/rules/max-len
|
|||
|
[multiple configuration files]: https://eslint.org/docs/user-guide/configuring#configuration-cascading-and-hierarchy
|
|||
|
[no-confusing-arrow]: https://eslint.org/docs/rules/no-confusing-arrow
|
|||
|
[no-mixed-operators]: https://eslint.org/docs/rules/no-mixed-operators
|
|||
|
[no-restricted-syntax]: https://eslint.org/docs/rules/no-restricted-syntax
|
|||
|
[no-sequences-full]: https://eslint.org/docs/rules/no-sequences#when-not-to-use-it
|
|||
|
[no-sequences]: https://eslint.org/docs/rules/no-sequences
|
|||
|
[no-tabs]: https://eslint.org/docs/rules/no-tabs
|
|||
|
[no-unexpected-multiline]: https://eslint.org/docs/rules/no-unexpected-multiline
|
|||
|
[overrides]: https://eslint.org/docs/user-guide/configuring#configuration-based-on-glob-patterns
|
|||
|
[prefer-arrow-callback]: https://eslint.org/docs/rules/prefer-arrow-callback
|
|||
|
[quotes]: https://eslint.org/docs/rules/quotes
|
|||
|
[singleQuote]: https://prettier.io/docs/en/options.html#quotes
|
|||
|
[string formatting rules]: https://prettier.io/docs/en/rationale.html#strings
|
|||
|
[travis-badge]: https://travis-ci.org/prettier/eslint-config-prettier.svg?branch=master
|
|||
|
[travis]: https://travis-ci.org/prettier/eslint-config-prettier
|
|||
|
[vue/html-self-closing]: https://github.com/vuejs/eslint-plugin-vue/blob/master/docs/rules/html-self-closing.md
|