UNPKG

eslint-plugin-stylistic-compat

Version:

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

309 lines (305 loc) 11.8 kB
'use strict'; var _includesInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/includes'); var utils = require('../utils.js'); var vendor = require('../vendor.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('@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('@babel/runtime-corejs3/core-js/instance/for-each'); 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/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'); function createRules(options) { var _options$overrides; const globals = { ...((options == null ? undefined : options.before) !== undefined ? { before: options.before } : {}), ...((options == null ? undefined : options.after) !== undefined ? { after: options.after } : {}) }; const override = (_options$overrides = options == null ? undefined : options.overrides) != null ? _options$overrides : {}; const colon = { ...{ before: false, after: true }, ...globals, ...(override == null ? undefined : override.colon) }; const arrow = { ...{ before: true, after: true }, ...globals, ...(override == null ? undefined : override.arrow) }; return { colon, arrow, variable: { ...colon, ...(override == null ? undefined : override.variable) }, property: { ...colon, ...(override == null ? undefined : override.property) }, parameter: { ...colon, ...(override == null ? undefined : override.parameter) }, returnType: { ...colon, ...(override == null ? undefined : override.returnType) } }; } function getIdentifierRules(rules, node) { const scope = node == null ? undefined : node.parent; if (vendor.astUtilsExports.isVariableDeclarator(scope)) return rules.variable;else if (vendor.astUtilsExports.isFunctionOrFunctionType(scope)) return rules.parameter; return rules.colon; } function getRules(rules, node) { var _node$parent; const scope = node == null || (_node$parent = node.parent) == null ? undefined : _node$parent.parent; if (vendor.astUtilsExports.isTSFunctionType(scope) || vendor.astUtilsExports.isTSConstructorType(scope)) return rules.arrow;else if (vendor.astUtilsExports.isIdentifier(scope)) return getIdentifierRules(rules, scope);else if (vendor.astUtilsExports.isClassOrTypeElement(scope)) return rules.property;else if (vendor.astUtilsExports.isFunction(scope)) return rules.returnType; return rules.colon; } var typeAnnotationSpacing = utils.createRule({ name: "type-annotation-spacing", package: "ts", meta: { type: "layout", docs: { description: "Require consistent spacing around type annotations" }, fixable: "whitespace", messages: { expectedSpaceAfter: "Expected a space after the '{{type}}'.", expectedSpaceBefore: "Expected a space before the '{{type}}'.", unexpectedSpaceAfter: "Unexpected space after the '{{type}}'.", unexpectedSpaceBefore: "Unexpected space before the '{{type}}'.", unexpectedSpaceBetween: "Unexpected space between the '{{previousToken}}' and the '{{type}}'." }, schema: [{ $defs: { spacingConfig: { type: "object", properties: { before: { type: "boolean" }, after: { type: "boolean" } }, additionalProperties: false } }, type: "object", properties: { before: { type: "boolean" }, after: { type: "boolean" }, overrides: { type: "object", properties: { colon: { $ref: "#/items/0/$defs/spacingConfig" }, arrow: { $ref: "#/items/0/$defs/spacingConfig" }, variable: { $ref: "#/items/0/$defs/spacingConfig" }, parameter: { $ref: "#/items/0/$defs/spacingConfig" }, property: { $ref: "#/items/0/$defs/spacingConfig" }, returnType: { $ref: "#/items/0/$defs/spacingConfig" } }, additionalProperties: false } }, additionalProperties: false }] }, defaultOptions: [ // technically there is a default, but the overrides mean // that if we apply them here, it will break the no override case. {}], create(context, [options]) { const punctuators = [":", "=>"]; const sourceCode = context.sourceCode; const ruleSet = createRules(options); function checkTypeAnnotationSpacing(typeAnnotation) { const nextNode = typeAnnotation; const punctuatorTokenEnd = sourceCode.getTokenBefore(nextNode); let punctuatorTokenStart = punctuatorTokenEnd; let previousToken = sourceCode.getTokenBefore(punctuatorTokenEnd); let type = punctuatorTokenEnd.value; if (!_includesInstanceProperty(punctuators).call(punctuators, type)) return; const { before, after } = getRules(ruleSet, typeAnnotation); if (type === ":" && previousToken.value === "?") { if (sourceCode.isSpaceBetween(previousToken, punctuatorTokenStart)) { context.report({ node: punctuatorTokenStart, messageId: "unexpectedSpaceBetween", data: { type, previousToken: previousToken.value }, fix(fixer) { return fixer.removeRange([previousToken.range[1], punctuatorTokenStart.range[0]]); } }); } type = "?:"; punctuatorTokenStart = previousToken; previousToken = sourceCode.getTokenBefore(previousToken); if (previousToken.value === "+" || previousToken.value === "-") { type = `${previousToken.value}?:`; punctuatorTokenStart = previousToken; previousToken = sourceCode.getTokenBefore(previousToken); } } const previousDelta = punctuatorTokenStart.range[0] - previousToken.range[1]; const nextDelta = nextNode.range[0] - punctuatorTokenEnd.range[1]; if (after && nextDelta === 0) { context.report({ node: punctuatorTokenEnd, messageId: "expectedSpaceAfter", data: { type }, fix(fixer) { return fixer.insertTextAfter(punctuatorTokenEnd, " "); } }); } else if (!after && nextDelta > 0) { context.report({ node: punctuatorTokenEnd, messageId: "unexpectedSpaceAfter", data: { type }, fix(fixer) { return fixer.removeRange([punctuatorTokenEnd.range[1], nextNode.range[0]]); } }); } if (before && previousDelta === 0) { context.report({ node: punctuatorTokenStart, messageId: "expectedSpaceBefore", data: { type }, fix(fixer) { return fixer.insertTextAfter(previousToken, " "); } }); } else if (!before && previousDelta > 0) { context.report({ node: punctuatorTokenStart, messageId: "unexpectedSpaceBefore", data: { type }, fix(fixer) { return fixer.removeRange([previousToken.range[1], punctuatorTokenStart.range[0]]); } }); } } return { TSMappedType(node) { if (node.typeAnnotation) checkTypeAnnotationSpacing(node.typeAnnotation); }, TSTypeAnnotation(node) { checkTypeAnnotationSpacing(node.typeAnnotation); } }; } }); module.exports = typeAnnotationSpacing;