83 lines
2.7 KiB
Plaintext
83 lines
2.7 KiB
Plaintext
import { f as createRule } from "../utils.js";
|
|
var jsx_props_no_multi_spaces_default = createRule({
|
|
name: "jsx-props-no-multi-spaces",
|
|
meta: {
|
|
type: "layout",
|
|
docs: { description: "Disallow multiple spaces between inline JSX props. Deprecated, use `no-multi-spaces` rule instead." },
|
|
fixable: "code",
|
|
deprecated: {
|
|
message: "The rule was replaced with a more general rule.",
|
|
deprecatedSince: "5.0.0",
|
|
replacedBy: [{ rule: {
|
|
name: "no-multi-spaces",
|
|
url: "https://eslint.style/rules/no-multi-spaces"
|
|
} }]
|
|
},
|
|
schema: [],
|
|
messages: {
|
|
noLineGap: "Expected no line gap between “{{prop1}}” and “{{prop2}}”",
|
|
onlyOneSpace: "Expected only one space between “{{prop1}}” and “{{prop2}}”"
|
|
}
|
|
},
|
|
create(context) {
|
|
const sourceCode = context.sourceCode;
|
|
function getPropName(propNode) {
|
|
switch (propNode.type) {
|
|
case "JSXSpreadAttribute": return sourceCode.getText(propNode.argument);
|
|
case "JSXIdentifier": return propNode.name;
|
|
case "JSXMemberExpression": return `${getPropName(propNode.object)}.${propNode.property.name}`;
|
|
default: return propNode.name ? propNode.name.name : `${sourceCode.getText(propNode.object)}.${propNode.property.name}`;
|
|
}
|
|
}
|
|
function hasEmptyLines(first, second) {
|
|
const comments = sourceCode.getCommentsBefore ? sourceCode.getCommentsBefore(second) : [];
|
|
const nodes = [].concat(first, comments, second);
|
|
for (let i = 1; i < nodes.length; i += 1) {
|
|
const prev = nodes[i - 1];
|
|
if (nodes[i].loc.start.line - prev.loc.end.line >= 2) return true;
|
|
}
|
|
return false;
|
|
}
|
|
function checkSpacing(prev, node) {
|
|
if (hasEmptyLines(prev, node)) context.report({
|
|
messageId: "noLineGap",
|
|
node,
|
|
data: {
|
|
prop1: getPropName(prev),
|
|
prop2: getPropName(node)
|
|
}
|
|
});
|
|
if (prev.loc.end.line !== node.loc.end.line) return;
|
|
if (sourceCode.text.slice(prev.range[1], node.range[0]) !== " ") context.report({
|
|
node,
|
|
messageId: "onlyOneSpace",
|
|
data: {
|
|
prop1: getPropName(prev),
|
|
prop2: getPropName(node)
|
|
},
|
|
fix(fixer) {
|
|
return fixer.replaceTextRange([prev.range[1], node.range[0]], " ");
|
|
}
|
|
});
|
|
}
|
|
function containsGenericType(node) {
|
|
return typeof node.typeArguments !== "undefined" && node.typeArguments?.type === "TSTypeParameterInstantiation";
|
|
}
|
|
function getGenericNode(node) {
|
|
const name = node.name;
|
|
if (containsGenericType(node)) {
|
|
const type = node.typeArguments;
|
|
return Object.assign({}, node, { range: [name.range[0], type?.range[1]] });
|
|
}
|
|
return name;
|
|
}
|
|
return { JSXOpeningElement(node) {
|
|
node.attributes.reduce((prev, prop) => {
|
|
checkSpacing(prev, prop);
|
|
return prop;
|
|
}, getGenericNode(node));
|
|
} };
|
|
}
|
|
});
|
|
export { jsx_props_no_multi_spaces_default as t };
|