eslint-plugin-stylistic-compat
Version:
Compatibility version of @stylistic/eslint-plugin for Node.js >= 12 and ESLint v8
251 lines (247 loc) • 10.8 kB
JavaScript
'use strict';
var _includesInstanceProperty = require('/runtime-corejs3/core-js/instance/includes');
var _forEachInstanceProperty = require('/runtime-corejs3/core-js/instance/for-each');
var utils = require('../utils.js');
require('/runtime-corejs3/core-js/object/from-entries');
require('/runtime-corejs3/core-js/instance/map');
require('/runtime-corejs3/core-js/instance/filter');
require('/runtime-corejs3/core-js/object/entries');
require('/runtime-corejs3/core-js/set');
require('/runtime-corejs3/core-js/instance/flags');
require('/runtime-corejs3/core-js/instance/starts-with');
require('../vendor.js');
require('/runtime-corejs3/core-js/object/assign');
require('/runtime-corejs3/core-js/object/create');
require('/runtime-corejs3/core-js/object/freeze');
require('/runtime-corejs3/core-js/array/is-array');
require('/runtime-corejs3/core-js/instance/last-index-of');
require('/runtime-corejs3/core-js/instance/slice');
require('/runtime-corejs3/core-js/object/define-properties');
require('/runtime-corejs3/core-js/object/keys');
require('/runtime-corejs3/core-js/instance/index-of');
require('/runtime-corejs3/core-js/instance/at');
require('/runtime-corejs3/core-js/symbol');
require('/runtime-corejs3/core-js/symbol/iterator');
require('/runtime-corejs3/core-js/parse-int');
require('/runtime-corejs3/core-js/parse-float');
require('/runtime-corejs3/core-js/weak-map');
require('/runtime-corejs3/core-js/object/define-property');
require('/runtime-corejs3/core-js/global-this');
require('/runtime-corejs3/core-js/array/from');
require('eslint/use-at-your-own-risk');
require('eslint');
require('/runtime-corejs3/core-js/object/get-own-property-descriptor');
require('/runtime-corejs3/core-js/map');
require('/runtime-corejs3/core-js/instance/some');
require('/runtime-corejs3/core-js/instance/find');
require('/runtime-corejs3/core-js/instance/every');
require('/runtime-corejs3/core-js/instance/sort');
require('/runtime-corejs3/core-js/array/of');
require('/runtime-corejs3/core-js/instance/concat');
require('/runtime-corejs3/core-js/instance/entries');
require('/runtime-corejs3/core-js/instance/find-index');
require('/runtime-corejs3/core-js/instance/flat');
require('/runtime-corejs3/core-js/instance/keys');
require('/runtime-corejs3/core-js/instance/values');
require('/runtime-corejs3/core-js/object/get-own-property-names');
require('/runtime-corejs3/core-js/number/is-finite');
require('/runtime-corejs3/core-js/number/is-nan');
require('/runtime-corejs3/core-js/number/parse-float');
require('/runtime-corejs3/core-js/number/parse-int');
require('/runtime-corejs3/core-js/object/is');
require('/runtime-corejs3/core-js/object/is-extensible');
require('/runtime-corejs3/core-js/object/is-frozen');
require('/runtime-corejs3/core-js/object/is-sealed');
require('/runtime-corejs3/core-js/object/values');
require('/runtime-corejs3/core-js/string/from-code-point');
require('/runtime-corejs3/core-js/string/raw');
require('/runtime-corejs3/core-js/instance/code-point-at');
require('/runtime-corejs3/core-js/instance/ends-with');
require('/runtime-corejs3/core-js/instance/pad-end');
require('/runtime-corejs3/core-js/instance/pad-start');
require('/runtime-corejs3/core-js/instance/trim');
require('/runtime-corejs3/core-js/instance/trim-end');
require('/runtime-corejs3/core-js/instance/trim-left');
require('/runtime-corejs3/core-js/instance/trim-right');
require('/runtime-corejs3/core-js/instance/trim-start');
require('/runtime-corejs3/core-js/symbol/for');
require('/runtime-corejs3/core-js/symbol/key-for');
require('/runtime-corejs3/core-js/object/prevent-extensions');
require('/runtime-corejs3/core-js/object/seal');
require('/runtime-corejs3/core-js/object/get-prototype-of');
require('/runtime-corejs3/core-js/symbol/replace');
require('/runtime-corejs3/core-js/instance/bind');
require('/runtime-corejs3/core-js/instance/splice');
require('/runtime-corejs3/core-js/instance/repeat');
require('/runtime-corejs3/core-js/instance/reduce');
require('/runtime-corejs3/core-js/instance/reverse');
var spaceInParens = utils.createRule({
name: "space-in-parens",
package: "js",
meta: {
type: "layout",
docs: {
description: "Enforce consistent spacing inside parentheses"
},
fixable: "whitespace",
schema: [{
type: "string",
enum: ["always", "never"]
}, {
type: "object",
properties: {
exceptions: {
type: "array",
items: {
type: "string",
enum: ["{}", "[]", "()", "empty"]
},
uniqueItems: true
}
},
additionalProperties: false
}],
messages: {
missingOpeningSpace: "There must be a space after this paren.",
missingClosingSpace: "There must be a space before this paren.",
rejectedOpeningSpace: "There should be no space after this paren.",
rejectedClosingSpace: "There should be no space before this paren."
}
},
create(context) {
const ALWAYS = context.options[0] === "always";
const exceptionsArrayOptions = context.options[1] && context.options[1].exceptions || [];
const options = {
braceException: false,
bracketException: false,
parenException: false,
empty: false
};
let exceptions = {
openers: [],
closers: []
};
if (exceptionsArrayOptions.length) {
options.braceException = _includesInstanceProperty(exceptionsArrayOptions).call(exceptionsArrayOptions, "{}");
options.bracketException = _includesInstanceProperty(exceptionsArrayOptions).call(exceptionsArrayOptions, "[]");
options.parenException = _includesInstanceProperty(exceptionsArrayOptions).call(exceptionsArrayOptions, "()");
options.empty = _includesInstanceProperty(exceptionsArrayOptions).call(exceptionsArrayOptions, "empty");
}
function getExceptions() {
const openers = [];
const closers = [];
if (options.braceException) {
openers.push("{");
closers.push("}");
}
if (options.bracketException) {
openers.push("[");
closers.push("]");
}
if (options.parenException) {
openers.push("(");
closers.push(")");
}
if (options.empty) {
openers.push(")");
closers.push("(");
}
return {
openers,
closers
};
}
const sourceCode = context.sourceCode;
function isOpenerException(token) {
var _context;
return _includesInstanceProperty(_context = exceptions.openers).call(_context, token.value);
}
function isCloserException(token) {
var _context2;
return _includesInstanceProperty(_context2 = exceptions.closers).call(_context2, token.value);
}
function openerMissingSpace(openingParenToken, tokenAfterOpeningParen) {
if (sourceCode.isSpaceBetween(openingParenToken, tokenAfterOpeningParen)) return false;
if (!options.empty && utils.isClosingParenToken(tokenAfterOpeningParen)) return false;
if (ALWAYS) return !isOpenerException(tokenAfterOpeningParen);
return isOpenerException(tokenAfterOpeningParen);
}
function openerRejectsSpace(openingParenToken, tokenAfterOpeningParen) {
if (!utils.isTokenOnSameLine(openingParenToken, tokenAfterOpeningParen)) return false;
if (tokenAfterOpeningParen.type === "Line") return false;
if (!sourceCode.isSpaceBetween(openingParenToken, tokenAfterOpeningParen)) return false;
if (ALWAYS) return isOpenerException(tokenAfterOpeningParen);
return !isOpenerException(tokenAfterOpeningParen);
}
function closerMissingSpace(tokenBeforeClosingParen, closingParenToken) {
if (sourceCode.isSpaceBetween(tokenBeforeClosingParen, closingParenToken)) return false;
if (!options.empty && utils.isOpeningParenToken(tokenBeforeClosingParen)) return false;
if (ALWAYS) return !isCloserException(tokenBeforeClosingParen);
return isCloserException(tokenBeforeClosingParen);
}
function closerRejectsSpace(tokenBeforeClosingParen, closingParenToken) {
if (!utils.isTokenOnSameLine(tokenBeforeClosingParen, closingParenToken)) return false;
if (!sourceCode.isSpaceBetween(tokenBeforeClosingParen, closingParenToken)) return false;
if (ALWAYS) return isCloserException(tokenBeforeClosingParen);
return !isCloserException(tokenBeforeClosingParen);
}
return {
Program: function checkParenSpaces(node) {
exceptions = getExceptions();
const tokens = sourceCode.tokensAndComments;
_forEachInstanceProperty(tokens).call(tokens, (token, i) => {
const prevToken = tokens[i - 1];
const nextToken = tokens[i + 1];
if (!utils.isOpeningParenToken(token) && !utils.isClosingParenToken(token)) return;
if (token.value === "(" && openerMissingSpace(token, nextToken)) {
context.report({
node,
loc: token.loc,
messageId: "missingOpeningSpace",
fix(fixer) {
return fixer.insertTextAfter(token, " ");
}
});
}
if (token.value === "(" && openerRejectsSpace(token, nextToken)) {
context.report({
node,
loc: {
start: token.loc.end,
end: nextToken.loc.start
},
messageId: "rejectedOpeningSpace",
fix(fixer) {
return fixer.removeRange([token.range[1], nextToken.range[0]]);
}
});
}
if (token.value === ")" && closerMissingSpace(prevToken, token)) {
context.report({
node,
loc: token.loc,
messageId: "missingClosingSpace",
fix(fixer) {
return fixer.insertTextBefore(token, " ");
}
});
}
if (token.value === ")" && closerRejectsSpace(prevToken, token)) {
context.report({
node,
loc: {
start: prevToken.loc.end,
end: token.loc.start
},
messageId: "rejectedClosingSpace",
fix(fixer) {
return fixer.removeRange([prevToken.range[1], token.range[0]]);
}
});
}
});
}
};
}
});
module.exports = spaceInParens;