UNPKG

eslint-plugin-stylistic-compat

Version:

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

194 lines (190 loc) 8.84 kB
'use strict'; var _Set = require('@babel/runtime-corejs3/core-js/set'); var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/for-each'); var _findInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/find'); 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/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/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/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'); 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'); const messages = { require: "JSX element should start in a new line", prevent: "JSX element should not start in a new line", allowMultilines: "Multiline JSX elements should start in a new line" }; function isMultilined(node) { return node && node.loc.start.line !== node.loc.end.line; } var jsxNewline = utils.createRule({ name: "jsx-newline", package: "jsx", meta: { type: "layout", docs: { description: "Require or prevent a new line after jsx elements and expressions." }, fixable: "code", messages, schema: [{ type: "object", properties: { prevent: { default: false, type: "boolean" }, allowMultilines: { default: false, type: "boolean" } }, additionalProperties: false, // @ts-expect-error Missing in type definition if: { properties: { allowMultilines: { const: true } } }, then: { properties: { prevent: { const: true } }, required: ["prevent"] } }] }, create(context) { const jsxElementParents = /* @__PURE__ */new _Set(); const sourceCode = context.sourceCode; function isBlockCommentInCurlyBraces(element) { const elementRawValue = sourceCode.getText(element); return /^\s*\{\/\*/.test(elementRawValue); } function isNonBlockComment(element) { return !isBlockCommentInCurlyBraces(element) && (element.type === "JSXElement" || element.type === "JSXExpressionContainer"); } return { "Program:exit": function () { _forEachInstanceProperty(jsxElementParents).call(jsxElementParents, parent => { var _context; _forEachInstanceProperty(_context = parent.children).call(_context, (element, index, elements) => { if (element.type === "JSXElement" || element.type === "JSXExpressionContainer") { var _context2; const configuration = context.options[0] || {}; const prevent = configuration.prevent || false; const allowMultilines = configuration.allowMultilines || false; const firstAdjacentSibling = elements[index + 1]; const secondAdjacentSibling = elements[index + 2]; const hasSibling = firstAdjacentSibling && secondAdjacentSibling && (firstAdjacentSibling.type === "Literal" || firstAdjacentSibling.type === "JSXText"); if (!hasSibling) return; const isWithoutNewLine = !/\n\s*\n/.test(firstAdjacentSibling.value); if (isBlockCommentInCurlyBraces(element)) return; if (allowMultilines && (isMultilined(element) || isMultilined(_findInstanceProperty(_context2 = _sliceInstanceProperty(elements).call(elements, index + 2)).call(_context2, isNonBlockComment)))) { if (!isWithoutNewLine) return; const regex2 = /(\n)(?!.*\1)/g; const replacement2 = "\n\n"; const messageId2 = "allowMultilines"; context.report({ messageId: messageId2, node: secondAdjacentSibling, fix(fixer) { return fixer.replaceText(firstAdjacentSibling, sourceCode.getText(firstAdjacentSibling).replace(regex2, replacement2)); } }); return; } if (isWithoutNewLine === prevent) return; const messageId = prevent ? "prevent" : "require"; const regex = prevent ? /(\n\n)(?!.*\1)/g : /(\n)(?!.*\1)/g; const replacement = prevent ? "\n" : "\n\n"; context.report({ messageId, node: secondAdjacentSibling, fix(fixer) { return fixer.replaceText(firstAdjacentSibling, // double or remove the last newline sourceCode.getText(firstAdjacentSibling).replace(regex, replacement)); } }); } }); }); }, ":matches(JSXElement, JSXFragment) > :matches(JSXElement, JSXExpressionContainer)": node => { jsxElementParents.add(node.parent); } }; } }); module.exports = jsxNewline;