UNPKG

eslint-plugin-stylistic-compat

Version:

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

207 lines (203 loc) 8.81 kB
'use strict'; var _trimInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/trim'); var _sliceInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/slice'); var utils = require('../utils.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('../vendor.js'); require('@babel/runtime-corejs3/core-js/object/assign'); require('@babel/runtime-corejs3/core-js/object/create'); require('@babel/runtime-corejs3/core-js/object/freeze'); require('@babel/runtime-corejs3/core-js/array/is-array'); 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/object/keys'); 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/object/define-property'); require('@babel/runtime-corejs3/core-js/global-this'); require('@babel/runtime-corejs3/core-js/instance/for-each'); require('@babel/runtime-corejs3/core-js/array/from'); 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/find'); 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/concat'); 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/keys'); 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'); require('@babel/runtime-corejs3/core-js/instance/reduce'); require('@babel/runtime-corejs3/core-js/instance/reverse'); function getNormalizedOption(context) { const rawOption = context.options[0] || "consistent"; if (rawOption === "consistent") { return { multiline: "consistent", singleline: "consistent" }; } if (rawOption === "never") { return { multiline: "forbid", singleline: "forbid" }; } return { multiline: rawOption.multiline || "consistent", singleline: rawOption.singleline || "consistent" }; } const messages = { expectedBefore: "Expected newline before '}'.", expectedAfter: "Expected newline after '{'.", unexpectedBefore: "Unexpected newline before '}'.", unexpectedAfter: "Unexpected newline after '{'." }; var jsxCurlyNewline = utils.createRule({ name: "jsx-curly-newline", package: "jsx", meta: { type: "layout", docs: { description: "Enforce consistent linebreaks in curly braces in JSX attributes and expressions" }, fixable: "whitespace", schema: [{ anyOf: [{ type: "string", enum: ["consistent", "never"] }, { type: "object", properties: { singleline: { type: "string", enum: ["consistent", "require", "forbid"] }, multiline: { type: "string", enum: ["consistent", "require", "forbid"] } }, additionalProperties: false }] }], messages }, create(context) { const sourceCode = context.sourceCode; const option = getNormalizedOption(context); function isTokenOnSameLine(left, right) { return left.loc.end.line === right.loc.start.line; } function shouldHaveNewlines(expression, hasLeftNewline) { const isMultiline = expression.loc.start.line !== expression.loc.end.line; switch (isMultiline ? option.multiline : option.singleline) { case "forbid": return false; case "require": return true; case "consistent": default: return hasLeftNewline; } } function validateCurlys(curlys, expression) { const leftCurly = curlys.leftCurly; const rightCurly = curlys.rightCurly; const tokenAfterLeftCurly = sourceCode.getTokenAfter(leftCurly); const tokenBeforeRightCurly = sourceCode.getTokenBefore(rightCurly); const hasLeftNewline = !isTokenOnSameLine(leftCurly, tokenAfterLeftCurly); const hasRightNewline = !isTokenOnSameLine(tokenBeforeRightCurly, rightCurly); const needsNewlines = shouldHaveNewlines(expression, hasLeftNewline); if (hasLeftNewline && !needsNewlines) { context.report({ node: leftCurly, messageId: "unexpectedAfter", fix(fixer) { var _context, _context2; return _trimInstanceProperty(_context = _sliceInstanceProperty(_context2 = sourceCode.getText()).call(_context2, leftCurly.range[1], tokenAfterLeftCurly == null ? undefined : tokenAfterLeftCurly.range[0])).call(_context) ? null : fixer.removeRange([leftCurly.range[1], tokenAfterLeftCurly.range[0]]); } }); } else if (!hasLeftNewline && needsNewlines) { context.report({ node: leftCurly, messageId: "expectedAfter", fix: fixer => fixer.insertTextAfter(leftCurly, "\n") }); } if (hasRightNewline && !needsNewlines) { context.report({ node: rightCurly, messageId: "unexpectedBefore", fix(fixer) { var _context3, _context4; return _trimInstanceProperty(_context3 = _sliceInstanceProperty(_context4 = sourceCode.getText()).call(_context4, tokenBeforeRightCurly.range[1], rightCurly.range[0])).call(_context3) ? null : fixer.removeRange([tokenBeforeRightCurly.range[1], rightCurly.range[0]]); } }); } else if (!hasRightNewline && needsNewlines) { context.report({ node: rightCurly, messageId: "expectedBefore", fix: fixer => fixer.insertTextBefore(rightCurly, "\n") }); } } return { JSXExpressionContainer(node) { const curlyTokens = { leftCurly: sourceCode.getFirstToken(node), rightCurly: sourceCode.getLastToken(node) }; validateCurlys(curlyTokens, node.expression); } }; } }); module.exports = jsxCurlyNewline;