eslint
Advanced tools
Comparing version 8.19.0 to 8.20.0
@@ -107,34 +107,2 @@ /** | ||
/** | ||
* Validates the spacing around a comma token. | ||
* @param {Object} tokens The tokens to be validated. | ||
* @param {Token} tokens.comma The token representing the comma. | ||
* @param {Token} [tokens.left] The last token before the comma. | ||
* @param {Token} [tokens.right] The first token after the comma. | ||
* @param {Token|ASTNode} reportItem The item to use when reporting an error. | ||
* @returns {void} | ||
* @private | ||
*/ | ||
function validateCommaItemSpacing(tokens, reportItem) { | ||
if (tokens.left && astUtils.isTokenOnSameLine(tokens.left, tokens.comma) && | ||
(options.before !== sourceCode.isSpaceBetweenTokens(tokens.left, tokens.comma)) | ||
) { | ||
report(reportItem, "before", tokens.left); | ||
} | ||
if (tokens.right && astUtils.isClosingParenToken(tokens.right)) { | ||
return; | ||
} | ||
if (tokens.right && !options.after && tokens.right.type === "Line") { | ||
return; | ||
} | ||
if (tokens.right && astUtils.isTokenOnSameLine(tokens.comma, tokens.right) && | ||
(options.after !== sourceCode.isSpaceBetweenTokens(tokens.comma, tokens.right)) | ||
) { | ||
report(reportItem, "after", tokens.right); | ||
} | ||
} | ||
/** | ||
* Adds null elements of the given ArrayExpression or ArrayPattern node to the ignore list. | ||
@@ -176,14 +144,40 @@ * @param {ASTNode} node An ArrayExpression or ArrayPattern node. | ||
if (token && token.type === "JSXText") { | ||
return; | ||
} | ||
const previousToken = tokensAndComments[i - 1]; | ||
const nextToken = tokensAndComments[i + 1]; | ||
validateCommaItemSpacing({ | ||
comma: token, | ||
left: astUtils.isCommaToken(previousToken) || commaTokensToIgnore.includes(token) ? null : previousToken, | ||
right: astUtils.isCommaToken(nextToken) ? null : nextToken | ||
}, token); | ||
if ( | ||
previousToken && | ||
!astUtils.isCommaToken(previousToken) && // ignore spacing between two commas | ||
/* | ||
* `commaTokensToIgnore` are ending commas of `null` elements (array holes/elisions). | ||
* In addition to spacing between two commas, this can also ignore: | ||
* | ||
* - Spacing after `[` (controlled by array-bracket-spacing) | ||
* Example: [ , ] | ||
* ^ | ||
* - Spacing after a comment (for backwards compatibility, this was possibly unintentional) | ||
* Example: [a, /* * / ,] | ||
* ^ | ||
*/ | ||
!commaTokensToIgnore.includes(token) && | ||
astUtils.isTokenOnSameLine(previousToken, token) && | ||
options.before !== sourceCode.isSpaceBetweenTokens(previousToken, token) | ||
) { | ||
report(token, "before", previousToken); | ||
} | ||
if ( | ||
nextToken && | ||
!astUtils.isCommaToken(nextToken) && // ignore spacing between two commas | ||
!astUtils.isClosingParenToken(nextToken) && // controlled by space-in-parens | ||
!astUtils.isClosingBracketToken(nextToken) && // controlled by array-bracket-spacing | ||
!astUtils.isClosingBraceToken(nextToken) && // controlled by object-curly-spacing | ||
!(!options.after && nextToken.type === "Line") && // special case, allow space before line comment | ||
astUtils.isTokenOnSameLine(token, nextToken) && | ||
options.after !== sourceCode.isSpaceBetweenTokens(token, nextToken) | ||
) { | ||
report(token, "after", nextToken); | ||
} | ||
}); | ||
@@ -190,0 +184,0 @@ }, |
@@ -67,55 +67,41 @@ /** | ||
const escaped = escapeRegExp(term); | ||
const wordBoundary = "\\b"; | ||
const eitherOrWordBoundary = `|${wordBoundary}`; | ||
let prefix; | ||
/* | ||
* If the term ends in a word character (a-z0-9_), ensure a word | ||
* boundary at the end, so that substrings do not get falsely | ||
* matched. eg "todo" in a string such as "mastodon". | ||
* If the term ends in a non-word character, then \b won't match on | ||
* the boundary to the next non-word character, which would likely | ||
* be a space. For example `/\bFIX!\b/.test('FIX! blah') === false`. | ||
* In these cases, use no bounding match. Same applies for the | ||
* prefix, handled below. | ||
* When matching at the start, ignore leading whitespace, and | ||
* there's no need to worry about word boundaries. | ||
* | ||
* These expressions for the prefix and suffix are designed as follows: | ||
* ^ handles any terms at the beginning of a comment. | ||
* e.g. terms ["TODO"] matches `//TODO something` | ||
* $ handles any terms at the end of a comment | ||
* e.g. terms ["TODO"] matches `// something TODO` | ||
* \s* handles optional leading spaces (for "start" location only) | ||
* e.g. terms ["TODO"] matches `// TODO something` | ||
* \b handles terms preceded/followed by word boundary | ||
* e.g. terms: ["!FIX", "FIX!"] matches `// FIX!something` or `// something!FIX` | ||
* terms: ["FIX"] matches `// FIX!` or `// !FIX`, but not `// fixed or affix` | ||
*/ | ||
const suffix = /\w$/u.test(term) ? "\\b" : ""; | ||
const wordBoundary = "\\b"; | ||
let prefix = ""; | ||
if (location === "start") { | ||
/* | ||
* When matching at the start, ignore leading whitespace, and | ||
* there's no need to worry about word boundaries. | ||
*/ | ||
prefix = "^\\s*"; | ||
} else if (/^\w/u.test(term)) { | ||
prefix = wordBoundary; | ||
} else { | ||
prefix = ""; | ||
} | ||
if (location === "start") { | ||
const suffix = /\w$/u.test(term) ? wordBoundary : ""; | ||
const flags = "iu"; // Case-insensitive with Unicode case folding. | ||
/* | ||
* For location "start" the regex should be | ||
* ^\s*TERM\b. This checks the word boundary | ||
* at the beginning of the comment. | ||
*/ | ||
return new RegExp(prefix + escaped + suffix, "iu"); | ||
} | ||
/* | ||
* For location "anywhere" the regex should be | ||
* \bTERM\b|\bTERM\b, this checks the entire comment | ||
* for the term. | ||
* For location "start", the typical regex is: | ||
* /^\s*ESCAPED_TERM\b/iu. | ||
* | ||
* For location "anywhere" the typical regex is | ||
* /\bESCAPED_TERM\b/iu | ||
* | ||
* If it starts or ends with non-word character, the prefix and suffix empty, respectively. | ||
*/ | ||
return new RegExp( | ||
prefix + | ||
escaped + | ||
suffix + | ||
eitherOrWordBoundary + | ||
term + | ||
wordBoundary, | ||
"iu" | ||
); | ||
return new RegExp(`${prefix}${escaped}${suffix}`, flags); | ||
} | ||
@@ -122,0 +108,0 @@ |
{ | ||
"name": "eslint", | ||
"version": "8.19.0", | ||
"version": "8.20.0", | ||
"author": "Nicholas C. Zakas <nicholas+npm@nczconsulting.com>", | ||
@@ -105,5 +105,5 @@ "description": "An AST-based pattern checker for JavaScript.", | ||
"eslint-plugin-eslint-comments": "^3.2.0", | ||
"eslint-plugin-eslint-plugin": "^4.2.0", | ||
"eslint-plugin-eslint-plugin": "^4.4.0", | ||
"eslint-plugin-internal-rules": "file:tools/internal-rules", | ||
"eslint-plugin-jsdoc": "^37.0.0", | ||
"eslint-plugin-jsdoc": "^38.1.6", | ||
"eslint-plugin-node": "^11.1.0", | ||
@@ -127,4 +127,4 @@ "eslint-plugin-unicorn": "^42.0.0", | ||
"load-perf": "^0.2.0", | ||
"markdownlint": "^0.24.0", | ||
"markdownlint-cli": "^0.30.0", | ||
"markdownlint": "^0.25.1", | ||
"markdownlint-cli": "^0.31.1", | ||
"marked": "^4.0.8", | ||
@@ -131,0 +131,0 @@ "memfs": "^3.0.1", |
@@ -48,11 +48,5 @@ [![npm version](https://img.shields.io/npm/v/eslint.svg)](https://www.npmjs.com/package/eslint) | ||
You can install ESLint using npm: | ||
You can install and configure ESLint using this command: | ||
```sh | ||
npm install eslint --save-dev | ||
``` | ||
You should then set up a configuration file: | ||
```sh | ||
```shell | ||
npm init @eslint/config | ||
@@ -63,3 +57,3 @@ ``` | ||
```sh | ||
```shell | ||
./node_modules/.bin/eslint yourfile.js | ||
@@ -66,0 +60,0 @@ ``` |
Sorry, the diff of this file is too big to display
2726375
64767
299