UNPKG

eslint-plugin-stylistic-compat

Version:

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

253 lines (248 loc) 10.2 kB
'use strict'; 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/includes'); 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 isFunctionBody(node) { const parent = node.parent; return node.type === "BlockStatement" && utils.isFunction(parent) && parent.body === node; } var _baseRule = utils.createRule({ name: "space-before-blocks", package: "js", meta: { type: "layout", docs: { description: "Enforce consistent spacing before blocks" }, fixable: "whitespace", schema: [{ oneOf: [{ type: "string", enum: ["always", "never"] }, { type: "object", properties: { keywords: { type: "string", enum: ["always", "never", "off"] }, functions: { type: "string", enum: ["always", "never", "off"] }, classes: { type: "string", enum: ["always", "never", "off"] } }, additionalProperties: false }] }], messages: { unexpectedSpace: "Unexpected space before opening brace.", missingSpace: "Missing space before opening brace." } }, create(context) { const config = context.options[0]; const sourceCode = context.sourceCode; let alwaysFunctions = true; let alwaysKeywords = true; let alwaysClasses = true; let neverFunctions = false; let neverKeywords = false; let neverClasses = false; if (typeof config === "object") { alwaysFunctions = config.functions === "always"; alwaysKeywords = config.keywords === "always"; alwaysClasses = config.classes === "always"; neverFunctions = config.functions === "never"; neverKeywords = config.keywords === "never"; neverClasses = config.classes === "never"; } else if (config === "never") { alwaysFunctions = false; alwaysKeywords = false; alwaysClasses = false; neverFunctions = true; neverKeywords = true; neverClasses = true; } function isConflicted(precedingToken, node) { return utils.isArrowToken(precedingToken) || utils.isKeywordToken(precedingToken) && !isFunctionBody(node) || utils.isColonToken(precedingToken) && "parent" in node && node.parent && node.parent.type === "SwitchCase" && precedingToken === utils.getSwitchCaseColonToken(node.parent, sourceCode); } function checkPrecedingSpace(node) { const precedingToken = sourceCode.getTokenBefore(node); if (precedingToken && !isConflicted(precedingToken, node) && utils.isTokenOnSameLine(precedingToken, node)) { const hasSpace = sourceCode.isSpaceBetween(precedingToken, node); let requireSpace; let requireNoSpace; if (isFunctionBody(node)) { requireSpace = alwaysFunctions; requireNoSpace = neverFunctions; } else if (node.type === "ClassBody") { requireSpace = alwaysClasses; requireNoSpace = neverClasses; } else { requireSpace = alwaysKeywords; requireNoSpace = neverKeywords; } if (requireSpace && !hasSpace) { context.report({ node, messageId: "missingSpace", fix(fixer) { return fixer.insertTextBefore(node, " "); } }); } else if (requireNoSpace && hasSpace) { context.report({ node, messageId: "unexpectedSpace", fix(fixer) { return fixer.removeRange([precedingToken.range[1], node.range[0]]); } }); } } } function checkSpaceBeforeCaseBlock(node) { const cases = node.cases; let openingBrace; if (cases.length > 0) openingBrace = sourceCode.getTokenBefore(cases[0]);else openingBrace = sourceCode.getLastToken(node, 1); checkPrecedingSpace(openingBrace); } return { BlockStatement: checkPrecedingSpace, ClassBody: checkPrecedingSpace, SwitchStatement: checkSpaceBeforeCaseBlock }; } }); const baseRule = /* @__PURE__ */utils.castRuleModule(_baseRule); var spaceBeforeBlocks = utils.createRule({ name: "space-before-blocks", package: "ts", meta: { type: "layout", docs: { description: "Enforce consistent spacing before blocks" }, fixable: baseRule.meta.fixable, hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages }, defaultOptions: ["always"], create(context, [config]) { const rules = baseRule.create(context); const sourceCode = context.sourceCode; let requireSpace = true; if (typeof config === "object") requireSpace = config.classes === "always";else if (config === "never") requireSpace = false; function checkPrecedingSpace(node) { const precedingToken = sourceCode.getTokenBefore(node); if (precedingToken && vendor.astUtilsExports.isTokenOnSameLine(precedingToken, node)) { const hasSpace = sourceCode.isSpaceBetween(precedingToken, node); if (requireSpace && !hasSpace) { context.report({ node, messageId: "missingSpace", fix(fixer) { return fixer.insertTextBefore(node, " "); } }); } else if (!requireSpace && hasSpace) { context.report({ node, messageId: "unexpectedSpace", fix(fixer) { return fixer.removeRange([precedingToken.range[1], node.range[0]]); } }); } } } function checkSpaceAfterEnum(node) { const punctuator = sourceCode.getTokenAfter(node.id); if (punctuator) checkPrecedingSpace(punctuator); } return { ...rules, TSEnumDeclaration: checkSpaceAfterEnum, TSInterfaceBody: checkPrecedingSpace }; } }); module.exports = spaceBeforeBlocks;