UNPKG

@stylistic/eslint-plugin-js

Version:

JavaScript stylistic rules for ESLint, migrated from [eslint core](https://github.com/eslint/eslint).

105 lines (102 loc) 3.52 kB
import { c as createRule, b as isCommaToken, i as isTokenOnSameLine, f as isClosingParenToken, j as isClosingBracketToken, k as isClosingBraceToken } from '../utils.js'; import 'eslint-visitor-keys'; import 'espree'; var commaSpacing = createRule({ name: "comma-spacing", package: "js", meta: { type: "layout", docs: { description: "Enforce consistent spacing before and after commas" }, fixable: "whitespace", schema: [ { type: "object", properties: { before: { type: "boolean", default: false }, after: { type: "boolean", default: true } }, additionalProperties: false } ], messages: { missing: "A space is required {{loc}} ','.", unexpected: "There should be no space {{loc}} ','." } }, create(context) { const sourceCode = context.sourceCode; const tokensAndComments = sourceCode.tokensAndComments; const options = { before: context.options[0] ? context.options[0].before : false, after: context.options[0] ? context.options[0].after : true }; const commaTokensToIgnore = []; function report(node, loc, otherNode) { context.report({ node, fix(fixer) { if (options[loc]) { if (loc === "before") return fixer.insertTextBefore(node, " "); return fixer.insertTextAfter(node, " "); } let start, end; const newText = ""; if (loc === "before") { start = otherNode.range[1]; end = node.range[0]; } else { start = node.range[1]; end = otherNode.range[0]; } return fixer.replaceTextRange([start, end], newText); }, messageId: options[loc] ? "missing" : "unexpected", data: { loc } }); } function addNullElementsToIgnoreList(node) { let previousToken = sourceCode.getFirstToken(node); node.elements.forEach((element) => { let token; if (element === null) { token = sourceCode.getTokenAfter(previousToken); if (isCommaToken(token)) commaTokensToIgnore.push(token); } else { token = sourceCode.getTokenAfter(element); } previousToken = token; }); } return { "Program:exit": function() { tokensAndComments.forEach((token, i) => { if (!isCommaToken(token)) return; const previousToken = tokensAndComments[i - 1]; const nextToken = tokensAndComments[i + 1]; if (previousToken && !isCommaToken(previousToken) && !commaTokensToIgnore.includes(token) && isTokenOnSameLine(previousToken, token) && options.before !== sourceCode.isSpaceBetween(previousToken, token)) { report(token, "before", previousToken); } if (nextToken && !isCommaToken(nextToken) && !isClosingParenToken(nextToken) && !isClosingBracketToken(nextToken) && !isClosingBraceToken(nextToken) && !(!options.after && nextToken.type === "Line") && isTokenOnSameLine(token, nextToken) && options.after !== sourceCode.isSpaceBetween(token, nextToken)) { report(token, "after", nextToken); } }); }, "ArrayExpression": addNullElementsToIgnoreList, "ArrayPattern": addNullElementsToIgnoreList }; } }); export { commaSpacing as default };