UNPKG

eslint-plugin-stylistic-compat

Version:

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

281 lines (276 loc) 11.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'); var _baseRule = utils.createRule({ name: "block-spacing", package: "js", meta: { type: "layout", docs: { description: "Disallow or enforce spaces inside of blocks after opening block and before closing block" }, fixable: "whitespace", schema: [{ type: "string", enum: ["always", "never"] }], messages: { missing: "Requires a space {{location}} '{{token}}'.", extra: "Unexpected space(s) {{location}} '{{token}}'." } }, create(context) { const always = context.options[0] !== "never"; const messageId = always ? "missing" : "extra"; const sourceCode = context.sourceCode; function getOpenBrace(node) { if (node.type === "SwitchStatement") { if (node.cases.length > 0) return sourceCode.getTokenBefore(node.cases[0]); return sourceCode.getLastToken(node, 1); } if (node.type === "StaticBlock") return sourceCode.getFirstToken(node, { skip: 1 }); return sourceCode.getFirstToken(node); } function isValid(left, right) { return !utils.isTokenOnSameLine(left, right) || sourceCode.isSpaceBetween(left, right) === always; } function checkSpacingInsideBraces(node) { const openBrace = getOpenBrace(node); const closeBrace = sourceCode.getLastToken(node); const firstToken = sourceCode.getTokenAfter(openBrace, { includeComments: true }); const lastToken = sourceCode.getTokenBefore(closeBrace, { includeComments: true }); if (openBrace.type !== "Punctuator" || openBrace.value !== "{" || closeBrace.type !== "Punctuator" || closeBrace.value !== "}" || firstToken === closeBrace) { return; } if (!always && firstToken.type === "Line") return; if (!isValid(openBrace, firstToken)) { let loc = openBrace.loc; if (messageId === "extra") { loc = { start: openBrace.loc.end, end: firstToken.loc.start }; } context.report({ node, loc, messageId, data: { location: "after", token: openBrace.value }, fix(fixer) { if (always) return fixer.insertTextBefore(firstToken, " "); return fixer.removeRange([openBrace.range[1], firstToken.range[0]]); } }); } if (!isValid(lastToken, closeBrace)) { let loc = closeBrace.loc; if (messageId === "extra") { loc = { start: lastToken.loc.end, end: closeBrace.loc.start }; } context.report({ node, loc, messageId, data: { location: "before", token: closeBrace.value }, fix(fixer) { if (always) return fixer.insertTextAfter(lastToken, " "); return fixer.removeRange([lastToken.range[1], closeBrace.range[0]]); } }); } } return { BlockStatement: checkSpacingInsideBraces, StaticBlock: checkSpacingInsideBraces, SwitchStatement: checkSpacingInsideBraces }; } }); const baseRule = /* @__PURE__ */utils.castRuleModule(_baseRule); var blockSpacing = utils.createRule({ name: "block-spacing", package: "ts", meta: { type: "layout", docs: { description: "Disallow or enforce spaces inside of blocks after opening block and before closing block" }, fixable: "whitespace", hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema, messages: baseRule.meta.messages }, defaultOptions: ["always"], create(context, [whenToApplyOption]) { const sourceCode = context.sourceCode; const baseRules = baseRule.create(context); const always = whenToApplyOption !== "never"; const messageId = always ? "missing" : "extra"; function getOpenBrace(node) { return sourceCode.getFirstToken(node, { filter: token => token.type === vendor.distExports.AST_TOKEN_TYPES.Punctuator && token.value === "{" }); } function isValid(left, right) { return !vendor.astUtilsExports.isTokenOnSameLine(left, right) || sourceCode.isSpaceBetween(left, right) === always; } function checkSpacingInsideBraces(node) { const openBrace = getOpenBrace(node); const closeBrace = sourceCode.getLastToken(node); const firstToken = sourceCode.getTokenAfter(openBrace, { includeComments: true }); const lastToken = sourceCode.getTokenBefore(closeBrace, { includeComments: true }); if (openBrace.type !== vendor.distExports.AST_TOKEN_TYPES.Punctuator || openBrace.value !== "{" || closeBrace.type !== vendor.distExports.AST_TOKEN_TYPES.Punctuator || closeBrace.value !== "}" || firstToken === closeBrace) { return; } if (!always && firstToken.type === vendor.distExports.AST_TOKEN_TYPES.Line) return; if (!isValid(openBrace, firstToken)) { let loc = openBrace.loc; if (messageId === "extra") { loc = { start: openBrace.loc.end, end: firstToken.loc.start }; } context.report({ node, loc, messageId, data: { location: "after", token: openBrace.value }, fix(fixer) { if (always) return fixer.insertTextBefore(firstToken, " "); return fixer.removeRange([openBrace.range[1], firstToken.range[0]]); } }); } if (!isValid(lastToken, closeBrace)) { let loc = closeBrace.loc; if (messageId === "extra") { loc = { start: lastToken.loc.end, end: closeBrace.loc.start }; } context.report({ node, loc, messageId, data: { location: "before", token: closeBrace.value }, fix(fixer) { if (always) return fixer.insertTextAfter(lastToken, " "); return fixer.removeRange([lastToken.range[1], closeBrace.range[0]]); } }); } } return { ...baseRules, // This code worked "out of the box" for interface and type literal // Enums were very close to match as well, the only reason they are not is that was that enums don't have a body node in the parser // So the opening brace punctuator starts in the middle of the node - `getFirstToken` in // the base rule did not filter for the first opening brace punctuator TSInterfaceBody: baseRules.BlockStatement, TSTypeLiteral: baseRules.BlockStatement, TSEnumDeclaration: checkSpacingInsideBraces }; } }); module.exports = blockSpacing;