UNPKG

eslint-plugin-stylistic-compat

Version:

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

203 lines (199 loc) 8.42 kB
'use strict'; 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/instance/slice'); 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/reduce'); require('@babel/runtime-corejs3/core-js/instance/reverse'); const messages = { wrongIndent: "Expected indentation of {{needed}} {{type}} {{characters}} but found {{gotten}}." }; var jsxIndentProps = utils.createRule({ name: "jsx-indent-props", package: "jsx", meta: { type: "layout", docs: { description: "Enforce props indentation in JSX" }, fixable: "code", messages, schema: [{ anyOf: [{ type: "string", enum: ["tab", "first"] }, { type: "integer" }, { type: "object", properties: { indentMode: { anyOf: [{ type: "string", enum: ["tab", "first"] }, { type: "integer" }] }, ignoreTernaryOperator: { type: "boolean" } } }] }] }, create(context) { const options = context.options[0]; const extraColumnStart = 0; let indentType = "space"; let indentSize = 4; const line = { isUsingOperator: false, currentOperator: false }; let ignoreTernaryOperator = false; if (context.options.length) { const isConfigObject = typeof context.options[0] === "object"; const indentMode = isConfigObject ? typeof options === "object" && options.indentMode : options; if (indentMode === "first") { indentSize = "first"; indentType = "space"; } else if (indentMode === "tab") { indentSize = 1; indentType = "tab"; } else if (typeof indentMode === "number") { indentSize = indentMode; indentType = "space"; } if (typeof options === "object" && options.ignoreTernaryOperator) ignoreTernaryOperator = true; } function getNodeIndent(node) { let src = context.sourceCode.getText(node, node.loc.start.column + extraColumnStart); const lines = src.split("\n"); src = lines[0]; let regExp; if (indentType === "space") regExp = /^ +/;else regExp = /^\t+/; const indent = regExp.exec(src); const useOperator = /^[ \t]*:/.test(src) || /^[ \t]*\?/.test(src); const useBracket = /</.test(src); line.currentOperator = false; if (useOperator) { line.isUsingOperator = true; line.currentOperator = true; } else if (useBracket) { line.isUsingOperator = false; } return indent ? indent[0].length : 0; } function checkNodesIndent(nodes, indent) { let nestedIndent = indent; _forEachInstanceProperty(nodes).call(nodes, node => { const nodeIndent = getNodeIndent(node); if (line.isUsingOperator && !line.currentOperator && indentSize !== "first" && !ignoreTernaryOperator) { nestedIndent += indentSize; line.isUsingOperator = false; } if (node.type !== "ArrayExpression" && node.type !== "ObjectExpression" && nodeIndent !== nestedIndent && utils.isNodeFirstInLine(context, node)) { context.report({ node, messageId: "wrongIndent", data: { needed: nestedIndent, type: indentType, characters: nestedIndent === 1 ? "character" : "characters", gotten: nodeIndent }, fix(fixer) { return fixer.replaceTextRange([node.range[0] - node.loc.start.column, node.range[0]], new Array(nestedIndent + 1).join(indentType === "space" ? " " : " ")); } }); } }); } return { JSXOpeningElement(node) { if (!node.attributes.length) return; let propIndent; if (indentSize === "first") { const firstPropNode = node.attributes[0]; propIndent = firstPropNode.loc.start.column; } else { const elementIndent = getNodeIndent(node); propIndent = elementIndent + indentSize; } checkNodesIndent(node.attributes, propIndent); } }; } }); module.exports = jsxIndentProps;