@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
JavaScript
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 };