UNPKG

eslint-plugin-stylistic-compat

Version:

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

191 lines (187 loc) 8.21 kB
'use strict'; var _sliceInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/slice'); var _reduceInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/reduce'); var _forEachInstanceProperty = require('@babel/runtime-corejs3/core-js/instance/for-each'); 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/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'); 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/reverse'); function getPropName(context, propNode) { if (propNode.type === "JSXSpreadAttribute") return context.sourceCode.getText(propNode.argument); return propNode.name.name; } const messages = { newLine: "Prop `{{prop}}` must be placed on a new line" }; var jsxMaxPropsPerLine = utils.createRule({ name: "jsx-max-props-per-line", package: "jsx", meta: { type: "layout", docs: { description: "Enforce maximum of props on a single line in JSX" }, fixable: "code", messages, schema: [{ anyOf: [{ type: "object", properties: { maximum: { type: "object", properties: { single: { type: "integer", minimum: 1 }, multi: { type: "integer", minimum: 1 } } } }, additionalProperties: false }, { type: "object", properties: { maximum: { type: "number", minimum: 1 }, when: { type: "string", enum: ["always", "multiline"] } }, additionalProperties: false }] }] }, create(context) { const configuration = context.options[0] || {}; const maximum = configuration.maximum || 1; const maxConfig = typeof maximum === "number" ? { single: configuration.when === "multiline" ? Infinity : maximum, multi: maximum } : { single: maximum.single || Infinity, multi: maximum.multi || Infinity }; function generateFixFunction(line, max) { const sourceCode = context.sourceCode; const output = []; const front = line[0].range[0]; const back = line[line.length - 1].range[1]; for (let i = 0; i < line.length; i += max) { const nodes = _sliceInstanceProperty(line).call(line, i, i + max); output.push(_reduceInstanceProperty(nodes).call(nodes, (prev, curr) => { if (prev === "") return sourceCode.getText(curr); return `${prev} ${sourceCode.getText(curr)}`; }, "")); } const code = output.join("\n"); return function fix(fixer) { return fixer.replaceTextRange([front, back], code); }; } return { JSXOpeningElement(node) { var _context; if (!node.attributes.length) return; const isSingleLineTag = node.loc.start.line === node.loc.end.line; if ((isSingleLineTag ? maxConfig.single : maxConfig.multi) === Infinity) return; const firstProp = node.attributes[0]; const linePartitionedProps = [[firstProp]]; _reduceInstanceProperty(_context = node.attributes).call(_context, (last, decl) => { if (last.loc.end.line === decl.loc.start.line) linePartitionedProps[linePartitionedProps.length - 1].push(decl);else linePartitionedProps.push([decl]); return decl; }); _forEachInstanceProperty(linePartitionedProps).call(linePartitionedProps, propsInLine => { const maxPropsCountPerLine = isSingleLineTag && propsInLine[0].loc.start.line === node.loc.start.line ? maxConfig.single : maxConfig.multi; if (propsInLine.length > maxPropsCountPerLine) { const name = getPropName(context, propsInLine[maxPropsCountPerLine]); context.report({ messageId: "newLine", node: propsInLine[maxPropsCountPerLine], data: { prop: name }, fix: generateFixFunction(propsInLine, maxPropsCountPerLine) }); } }); } }; } }); module.exports = jsxMaxPropsPerLine;