UNPKG

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
'use strict'; var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/includes'); var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/for-each'); var utils = require('../utils.js'); require('@babel/runtime-corejs3/core-js/object/from-entries'); require('@babel/runtime-corejs3/core-js/instance/map'); require('@babel/runtime-corejs3/core-js/instance/filter'); require('@babel/runtime-corejs3/core-js/object/entries'); require('@babel/runtime-corejs3/core-js/set'); require('@babel/runtime-corejs3/core-js/instance/flags'); require('@babel/runtime-corejs3/core-js/instance/starts-with'); require('../vendor.js'); require('@babel/runtime-corejs3/core-js/object/assign'); require('@babel/runtime-corejs3/core-js/object/create'); require('@babel/runtime-corejs3/core-js/object/freeze'); require('@babel/runtime-corejs3/core-js/array/is-array'); require('@babel/runtime-corejs3/core-js/instance/last-index-of'); require('@babel/runtime-corejs3/core-js/instance/slice'); require('@babel/runtime-corejs3/core-js/object/define-properties'); require('@babel/runtime-corejs3/core-js/object/keys'); require('@babel/runtime-corejs3/core-js/instance/index-of'); require('@babel/runtime-corejs3/core-js/instance/at'); require('@babel/runtime-corejs3/core-js/symbol'); require('@babel/runtime-corejs3/core-js/symbol/iterator'); require('@babel/runtime-corejs3/core-js/parse-int'); require('@babel/runtime-corejs3/core-js/parse-float'); require('@babel/runtime-corejs3/core-js/weak-map'); require('@babel/runtime-corejs3/core-js/object/define-property'); require('@babel/runtime-corejs3/core-js/global-this'); require('@babel/runtime-corejs3/core-js/array/from'); require('eslint/use-at-your-own-risk'); require('eslint'); require('@babel/runtime-corejs3/core-js/object/get-own-property-descriptor'); require('@babel/runtime-corejs3/core-js/map'); require('@babel/runtime-corejs3/core-js/instance/some'); require('@babel/runtime-corejs3/core-js/instance/find'); require('@babel/runtime-corejs3/core-js/instance/every'); require('@babel/runtime-corejs3/core-js/instance/sort'); require('@babel/runtime-corejs3/core-js/array/of'); require('@babel/runtime-corejs3/core-js/instance/concat'); require('@babel/runtime-corejs3/core-js/instance/entries'); require('@babel/runtime-corejs3/core-js/instance/find-index'); require('@babel/runtime-corejs3/core-js/instance/flat'); require('@babel/runtime-corejs3/core-js/instance/keys'); require('@babel/runtime-corejs3/core-js/instance/values'); require('@babel/runtime-corejs3/core-js/object/get-own-property-names'); require('@babel/runtime-corejs3/core-js/number/is-finite'); require('@babel/runtime-corejs3/core-js/number/is-nan'); require('@babel/runtime-corejs3/core-js/number/parse-float'); require('@babel/runtime-corejs3/core-js/number/parse-int'); require('@babel/runtime-corejs3/core-js/object/is'); require('@babel/runtime-corejs3/core-js/object/is-extensible'); require('@babel/runtime-corejs3/core-js/object/is-frozen'); require('@babel/runtime-corejs3/core-js/object/is-sealed'); require('@babel/runtime-corejs3/core-js/object/values'); require('@babel/runtime-corejs3/core-js/string/from-code-point'); require('@babel/runtime-corejs3/core-js/string/raw'); require('@babel/runtime-corejs3/core-js/instance/code-point-at'); require('@babel/runtime-corejs3/core-js/instance/ends-with'); require('@babel/runtime-corejs3/core-js/instance/pad-end'); require('@babel/runtime-corejs3/core-js/instance/pad-start'); require('@babel/runtime-corejs3/core-js/instance/trim'); require('@babel/runtime-corejs3/core-js/instance/trim-end'); require('@babel/runtime-corejs3/core-js/instance/trim-left'); require('@babel/runtime-corejs3/core-js/instance/trim-right'); require('@babel/runtime-corejs3/core-js/instance/trim-start'); require('@babel/runtime-corejs3/core-js/symbol/for'); require('@babel/runtime-corejs3/core-js/symbol/key-for'); require('@babel/runtime-corejs3/core-js/object/prevent-extensions'); require('@babel/runtime-corejs3/core-js/object/seal'); require('@babel/runtime-corejs3/core-js/object/get-prototype-of'); require('@babel/runtime-corejs3/core-js/symbol/replace'); require('@babel/runtime-corejs3/core-js/instance/bind'); require('@babel/runtime-corejs3/core-js/instance/splice'); require('@babel/runtime-corejs3/core-js/instance/repeat'); require('@babel/runtime-corejs3/core-js/instance/reduce'); require('@babel/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;