UNPKG

eslint-plugin-stylistic-compat

Version:

Compatibility version of @stylistic/eslint-plugin for Node.js >= 12 and ESLint v8

272 lines (267 loc) 12.4 kB
'use strict'; var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/for-each'); var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/includes'); var utils = require('../utils.js'); var vendor = require('../vendor.js'); var _endsWithInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/ends-with'); 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('@babel/runtime-corejs3/core-js/array/from'); require('@babel/runtime-corejs3/core-js/array/is-array'); require('@babel/runtime-corejs3/core-js/instance/concat'); require('@babel/runtime-corejs3/core-js/object/keys'); require('@babel/runtime-corejs3/core-js/instance/reduce'); require('@babel/runtime-corejs3/core-js/object/assign'); require('@babel/runtime-corejs3/core-js/instance/keys'); require('@babel/runtime-corejs3/core-js/instance/find'); require('@babel/runtime-corejs3/core-js/instance/reverse'); require('@babel/runtime-corejs3/core-js/object/define-property'); require('@babel/runtime-corejs3/core-js/instance/slice'); require('@babel/runtime-corejs3/core-js/object/create'); require('@babel/runtime-corejs3/core-js/object/freeze'); require('@babel/runtime-corejs3/core-js/instance/last-index-of'); require('@babel/runtime-corejs3/core-js/object/define-properties'); 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/global-this'); 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/every'); require('@babel/runtime-corejs3/core-js/instance/sort'); require('@babel/runtime-corejs3/core-js/array/of'); 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/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/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'); var _baseRule = utils.createRule({ name: "space-infix-ops", package: "js", meta: { type: "layout", docs: { description: "Require spacing around infix operators" }, fixable: "whitespace", schema: [{ type: "object", properties: { int32Hint: { type: "boolean", default: false } }, additionalProperties: false }], messages: { missingSpace: "Operator '{{operator}}' must be spaced." } }, create(context) { const int32Hint = context.options[0] ? context.options[0].int32Hint === true : false; const sourceCode = context.sourceCode; function getFirstNonSpacedToken(left, right, op) { const operator = sourceCode.getFirstTokenBetween(left, right, token => token.value === op); const prev = sourceCode.getTokenBefore(operator); const next = sourceCode.getTokenAfter(operator); if (!sourceCode.isSpaceBetween(prev, operator) || !sourceCode.isSpaceBetween(operator, next)) return operator; return null; } function report(mainNode, culpritToken) { context.report({ node: mainNode, loc: culpritToken.loc, messageId: "missingSpace", data: { operator: culpritToken.value }, fix(fixer) { const previousToken = sourceCode.getTokenBefore(culpritToken); const afterToken = sourceCode.getTokenAfter(culpritToken); let fixString = ""; if (culpritToken.range[0] - previousToken.range[1] === 0) fixString = " "; fixString += culpritToken.value; if (afterToken.range[0] - culpritToken.range[1] === 0) fixString += " "; return fixer.replaceText(culpritToken, fixString); } }); } function checkBinary(node) { const leftNode = "typeAnnotation" in node.left && node.left.typeAnnotation ? node.left.typeAnnotation : node.left; const rightNode = node.right; const operator = "operator" in node && node.operator ? node.operator : "="; const nonSpacedNode = getFirstNonSpacedToken(leftNode, rightNode, operator); if (nonSpacedNode) { var _context; if (!(int32Hint && _endsWithInstanceProperty(_context = sourceCode.getText(node)).call(_context, "|0"))) report(node, nonSpacedNode); } } function checkConditional(node) { const nonSpacedConsequentNode = getFirstNonSpacedToken(node.test, node.consequent, "?"); const nonSpacedAlternateNode = getFirstNonSpacedToken(node.consequent, node.alternate, ":"); if (nonSpacedConsequentNode) report(node, nonSpacedConsequentNode); if (nonSpacedAlternateNode) report(node, nonSpacedAlternateNode); } function checkVar(node) { const leftNode = node.id.typeAnnotation ? node.id.typeAnnotation : node.id; const rightNode = node.init; if (rightNode) { const nonSpacedNode = getFirstNonSpacedToken(leftNode, rightNode, "="); if (nonSpacedNode) report(node, nonSpacedNode); } } return { AssignmentExpression: checkBinary, AssignmentPattern: checkBinary, BinaryExpression: checkBinary, LogicalExpression: checkBinary, ConditionalExpression: checkConditional, VariableDeclarator: checkVar, // TODO: Stage 3: Overridden by ts version, can delete directly PropertyDefinition(node) { if (!node.value) return; const operatorToken = sourceCode.getTokenBefore(node.value, utils.isEqToken); const leftToken = sourceCode.getTokenBefore(operatorToken); const rightToken = sourceCode.getTokenAfter(operatorToken); if (!sourceCode.isSpaceBetween(leftToken, operatorToken) || !sourceCode.isSpaceBetween(operatorToken, rightToken)) { report(node, operatorToken); } } }; } }); const baseRule = /* @__PURE__ */utils.castRuleModule(_baseRule); const UNIONS = ["|", "&"]; var spaceInfixOps = utils.createRule({ name: "space-infix-ops", package: "ts", meta: { type: "layout", docs: { description: "Require spacing around infix operators" }, fixable: baseRule.meta.fixable, hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages }, defaultOptions: [{ int32Hint: false }], create(context) { const rules = baseRule.create(context); const sourceCode = context.sourceCode; function report(node, operator) { context.report({ node, loc: operator.loc, messageId: "missingSpace", data: { operator: operator.value }, fix(fixer) { const previousToken = sourceCode.getTokenBefore(operator); const afterToken = sourceCode.getTokenAfter(operator); let fixString = ""; if (operator.range[0] - previousToken.range[1] === 0) fixString = " "; fixString += operator.value; if (afterToken.range[0] - operator.range[1] === 0) fixString += " "; return fixer.replaceText(operator, fixString); } }); } function isSpaceChar(token) { return token.type === vendor.distExports.AST_TOKEN_TYPES.Punctuator && /^[=?:]$/.test(token.value); } function checkAndReportAssignmentSpace(node, leftNode, rightNode) { if (!rightNode || !leftNode) return; const operator = sourceCode.getFirstTokenBetween(leftNode, rightNode, isSpaceChar); const prev = sourceCode.getTokenBefore(operator); const next = sourceCode.getTokenAfter(operator); if (!sourceCode.isSpaceBetween(prev, operator) || !sourceCode.isSpaceBetween(operator, next)) { report(node, operator); } } function checkForEnumAssignmentSpace(node) { checkAndReportAssignmentSpace(node, node.id, node.initializer); } function checkForPropertyDefinitionAssignmentSpace(node) { var _node$typeAnnotation; const leftNode = node.optional && !node.typeAnnotation ? sourceCode.getTokenAfter(node.key) : (_node$typeAnnotation = node.typeAnnotation) != null ? _node$typeAnnotation : node.key; checkAndReportAssignmentSpace(node, leftNode, node.value); } function checkForTypeAnnotationSpace(typeAnnotation) { const types = typeAnnotation.types; _forEachInstanceProperty(types).call(types, type => { const skipFunctionParenthesis = type.type === vendor.distExports.AST_NODE_TYPES.TSFunctionType ? vendor.astUtilsExports.isNotOpeningParenToken : 0; const operator = sourceCode.getTokenBefore(type, skipFunctionParenthesis); if (operator != null && _includesInstanceProperty(UNIONS).call(UNIONS, operator.value)) { const prev = sourceCode.getTokenBefore(operator); const next = sourceCode.getTokenAfter(operator); if (!sourceCode.isSpaceBetween(prev, operator) || !sourceCode.isSpaceBetween(operator, next)) { report(typeAnnotation, operator); } } }); } function checkForTypeAliasAssignment(node) { var _node$typeParameters; checkAndReportAssignmentSpace(node, (_node$typeParameters = node.typeParameters) != null ? _node$typeParameters : node.id, node.typeAnnotation); } function checkForTypeConditional(node) { checkAndReportAssignmentSpace(node, node.extendsType, node.trueType); checkAndReportAssignmentSpace(node, node.trueType, node.falseType); } return { ...rules, TSEnumMember: checkForEnumAssignmentSpace, PropertyDefinition: checkForPropertyDefinitionAssignmentSpace, TSTypeAliasDeclaration: checkForTypeAliasAssignment, TSUnionType: checkForTypeAnnotationSpace, TSIntersectionType: checkForTypeAnnotationSpace, TSConditionalType: checkForTypeConditional }; } }); module.exports = spaceInfixOps;