UNPKG

eslint-plugin-stylistic-compat

Version:

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

292 lines (287 loc) 13.2 kB
'use strict'; var _sliceInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/slice'); var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/trim'); 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/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-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: "brace-style", package: "js", meta: { type: "layout", docs: { description: "Enforce consistent brace style for blocks" }, schema: [{ type: "string", enum: ["1tbs", "stroustrup", "allman"] }, { type: "object", properties: { allowSingleLine: { type: "boolean", default: false } }, additionalProperties: false }], fixable: "whitespace", messages: { nextLineOpen: "Opening curly brace does not appear on the same line as controlling statement.", sameLineOpen: "Opening curly brace appears on the same line as controlling statement.", blockSameLine: "Statement inside of curly braces should be on next line.", nextLineClose: "Closing curly brace does not appear on the same line as the subsequent block.", singleLineClose: "Closing curly brace should be on the same line as opening curly brace or on the line after the previous block.", sameLineClose: "Closing curly brace appears on the same line as the subsequent block." } }, create(context) { const style = context.options[0] || "1tbs"; const params = context.options[1] || {}; const sourceCode = context.sourceCode; function removeNewlineBetween(firstToken, secondToken) { var _context; const textRange = [firstToken.range[1], secondToken.range[0]]; const textBetween = _sliceInstanceProperty(_context = sourceCode.text).call(_context, textRange[0], textRange[1]); if (_trimInstanceProperty(textBetween).call(textBetween)) return null; return fixer => fixer.replaceTextRange(textRange, " "); } function validateCurlyPair(openingCurly, closingCurly) { const tokenBeforeOpeningCurly = sourceCode.getTokenBefore(openingCurly); const tokenAfterOpeningCurly = sourceCode.getTokenAfter(openingCurly); const tokenBeforeClosingCurly = sourceCode.getTokenBefore(closingCurly); const singleLineException = params.allowSingleLine && utils.isTokenOnSameLine(openingCurly, closingCurly); if (style !== "allman" && !utils.isTokenOnSameLine(tokenBeforeOpeningCurly, openingCurly)) { context.report({ node: openingCurly, messageId: "nextLineOpen", fix: removeNewlineBetween(tokenBeforeOpeningCurly, openingCurly) }); } if (style === "allman" && utils.isTokenOnSameLine(tokenBeforeOpeningCurly, openingCurly) && !singleLineException) { context.report({ node: openingCurly, messageId: "sameLineOpen", fix: fixer => fixer.insertTextBefore(openingCurly, "\n") }); } if (utils.isTokenOnSameLine(openingCurly, tokenAfterOpeningCurly) && tokenAfterOpeningCurly !== closingCurly && !singleLineException) { context.report({ node: openingCurly, messageId: "blockSameLine", fix: fixer => fixer.insertTextAfter(openingCurly, "\n") }); } if (tokenBeforeClosingCurly !== openingCurly && !singleLineException && utils.isTokenOnSameLine(tokenBeforeClosingCurly, closingCurly)) { context.report({ node: closingCurly, messageId: "singleLineClose", fix: fixer => fixer.insertTextBefore(closingCurly, "\n") }); } } function validateCurlyBeforeKeyword(curlyToken) { const keywordToken = sourceCode.getTokenAfter(curlyToken); if (style === "1tbs" && !utils.isTokenOnSameLine(curlyToken, keywordToken)) { context.report({ node: curlyToken, messageId: "nextLineClose", fix: removeNewlineBetween(curlyToken, keywordToken) }); } if (style !== "1tbs" && utils.isTokenOnSameLine(curlyToken, keywordToken)) { context.report({ node: curlyToken, messageId: "sameLineClose", fix: fixer => fixer.insertTextAfter(curlyToken, "\n") }); } } return { BlockStatement(node) { if (!utils.STATEMENT_LIST_PARENTS.has(node.parent.type)) validateCurlyPair(sourceCode.getFirstToken(node), sourceCode.getLastToken(node)); }, StaticBlock(node) { validateCurlyPair(sourceCode.getFirstToken(node, { skip: 1 }), // skip the `static` token sourceCode.getLastToken(node)); }, ClassBody(node) { validateCurlyPair(sourceCode.getFirstToken(node), sourceCode.getLastToken(node)); }, SwitchStatement(node) { const closingCurly = sourceCode.getLastToken(node); const openingCurly = sourceCode.getTokenBefore(node.cases.length ? node.cases[0] : closingCurly); validateCurlyPair(openingCurly, closingCurly); }, IfStatement(node) { if (node.consequent.type === "BlockStatement" && node.alternate) { validateCurlyBeforeKeyword(sourceCode.getLastToken(node.consequent)); } }, TryStatement(node) { validateCurlyBeforeKeyword(sourceCode.getLastToken(node.block)); if (node.handler && node.finalizer) { validateCurlyBeforeKeyword(sourceCode.getLastToken(node.handler.body)); } } }; } }); const baseRule = /* @__PURE__ */utils.castRuleModule(_baseRule); var braceStyle = utils.createRule({ name: "brace-style", package: "ts", meta: { type: "layout", docs: { description: "Enforce consistent brace style for blocks" }, messages: baseRule.meta.messages, fixable: baseRule.meta.fixable, hasSuggestions: baseRule.meta.hasSuggestions, schema: baseRule.meta.schema }, defaultOptions: ["1tbs"], create(context) { const [style, { allowSingleLine } = { allowSingleLine: false }] = context.options; const isAllmanStyle = style === "allman"; const sourceCode = context.sourceCode; const rules = baseRule.create(context); function validateCurlyPair(openingCurlyToken, closingCurlyToken) { if (allowSingleLine && vendor.astUtilsExports.isTokenOnSameLine(openingCurlyToken, closingCurlyToken)) { return; } const tokenBeforeOpeningCurly = sourceCode.getTokenBefore(openingCurlyToken); const tokenBeforeClosingCurly = sourceCode.getTokenBefore(closingCurlyToken); const tokenAfterOpeningCurly = sourceCode.getTokenAfter(openingCurlyToken); if (!isAllmanStyle && !vendor.astUtilsExports.isTokenOnSameLine(tokenBeforeOpeningCurly, openingCurlyToken)) { context.report({ node: openingCurlyToken, messageId: "nextLineOpen", fix: fixer => { var _context; const textRange = [tokenBeforeOpeningCurly.range[1], openingCurlyToken.range[0]]; const textBetween = _sliceInstanceProperty(_context = sourceCode.text).call(_context, textRange[0], textRange[1]); if (_trimInstanceProperty(textBetween).call(textBetween)) return null; return fixer.replaceTextRange(textRange, " "); } }); } if (isAllmanStyle && vendor.astUtilsExports.isTokenOnSameLine(tokenBeforeOpeningCurly, openingCurlyToken)) { context.report({ node: openingCurlyToken, messageId: "sameLineOpen", fix: fixer => fixer.insertTextBefore(openingCurlyToken, "\n") }); } if (vendor.astUtilsExports.isTokenOnSameLine(openingCurlyToken, tokenAfterOpeningCurly) && tokenAfterOpeningCurly !== closingCurlyToken) { context.report({ node: openingCurlyToken, messageId: "blockSameLine", fix: fixer => fixer.insertTextAfter(openingCurlyToken, "\n") }); } if (vendor.astUtilsExports.isTokenOnSameLine(tokenBeforeClosingCurly, closingCurlyToken) && tokenBeforeClosingCurly !== openingCurlyToken) { context.report({ node: closingCurlyToken, messageId: "singleLineClose", fix: fixer => fixer.insertTextBefore(closingCurlyToken, "\n") }); } } return { ...rules, "TSInterfaceBody, TSModuleBlock": function (node) { const openingCurly = sourceCode.getFirstToken(node); const closingCurly = sourceCode.getLastToken(node); validateCurlyPair(openingCurly, closingCurly); }, TSEnumDeclaration(node) { var _node$body; const closingCurly = sourceCode.getLastToken(node); const members = ((_node$body = node.body) == null ? undefined : _node$body.members) || node.members; const openingCurly = sourceCode.getTokenBefore(members.length ? members[0] : closingCurly); validateCurlyPair(openingCurly, closingCurly); } }; } }); module.exports = braceStyle;