Skip to content

Commit dd00d8a

Browse files
committed
jsx-indent: support shorthand fragments
1 parent 18898e1 commit dd00d8a

File tree

2 files changed

+532
-36
lines changed

2 files changed

+532
-36
lines changed

lib/rules/jsx-indent.js

Lines changed: 41 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -205,43 +205,48 @@ module.exports = {
205205
}
206206
}
207207

208-
return {
209-
JSXOpeningElement: function(node) {
210-
let prevToken = sourceCode.getTokenBefore(node);
211-
if (!prevToken) {
212-
return;
213-
}
214-
// Use the parent in a list or an array
215-
if (prevToken.type === 'JSXText' || prevToken.type === 'Punctuator' && prevToken.value === ',') {
216-
prevToken = sourceCode.getNodeByRangeIndex(prevToken.range[0]);
217-
prevToken = prevToken.type === 'Literal' || prevToken.type === 'JSXText' ? prevToken.parent : prevToken;
218-
// Use the first non-punctuator token in a conditional expression
219-
} else if (prevToken.type === 'Punctuator' && prevToken.value === ':') {
220-
do {
221-
prevToken = sourceCode.getTokenBefore(prevToken);
222-
} while (prevToken.type === 'Punctuator');
223-
prevToken = sourceCode.getNodeByRangeIndex(prevToken.range[0]);
224-
while (prevToken.parent && prevToken.parent.type !== 'ConditionalExpression') {
225-
prevToken = prevToken.parent;
226-
}
227-
}
228-
prevToken = prevToken.type === 'JSXExpressionContainer' ? prevToken.expression : prevToken;
229-
230-
const parentElementIndent = getNodeIndent(prevToken);
231-
const indent = (
232-
prevToken.loc.start.line === node.loc.start.line ||
233-
isRightInLogicalExp(node) ||
234-
isAlternateInConditionalExp(node)
235-
) ? 0 : indentSize;
236-
checkNodesIndent(node, parentElementIndent + indent);
237-
},
238-
JSXClosingElement: function(node) {
239-
if (!node.parent) {
240-
return;
208+
function handleOpeningElement(node) {
209+
let prevToken = sourceCode.getTokenBefore(node);
210+
if (!prevToken) {
211+
return;
212+
}
213+
// Use the parent in a list or an array
214+
if (prevToken.type === 'JSXText' || prevToken.type === 'Punctuator' && prevToken.value === ',') {
215+
prevToken = sourceCode.getNodeByRangeIndex(prevToken.range[0]);
216+
prevToken = prevToken.type === 'Literal' || prevToken.type === 'JSXText' ? prevToken.parent : prevToken;
217+
// Use the first non-punctuator token in a conditional expression
218+
} else if (prevToken.type === 'Punctuator' && prevToken.value === ':') {
219+
do {
220+
prevToken = sourceCode.getTokenBefore(prevToken);
221+
} while (prevToken.type === 'Punctuator' && prevToken.value !== '/');
222+
prevToken = sourceCode.getNodeByRangeIndex(prevToken.range[0]);
223+
while (prevToken.parent && prevToken.parent.type !== 'ConditionalExpression') {
224+
prevToken = prevToken.parent;
241225
}
242-
const peerElementIndent = getNodeIndent(node.parent.openingElement);
243-
checkNodesIndent(node, peerElementIndent);
244-
},
226+
}
227+
prevToken = prevToken.type === 'JSXExpressionContainer' ? prevToken.expression : prevToken;
228+
const parentElementIndent = getNodeIndent(prevToken);
229+
const indent = (
230+
prevToken.loc.start.line === node.loc.start.line ||
231+
isRightInLogicalExp(node) ||
232+
isAlternateInConditionalExp(node)
233+
) ? 0 : indentSize;
234+
checkNodesIndent(node, parentElementIndent + indent);
235+
}
236+
237+
function handleClosingElement(node) {
238+
if (!node.parent) {
239+
return;
240+
}
241+
const peerElementIndent = getNodeIndent(node.parent.openingElement || node.parent.openingFragment);
242+
checkNodesIndent(node, peerElementIndent);
243+
}
244+
245+
return {
246+
JSXOpeningElement: handleOpeningElement,
247+
JSXOpeningFragment: handleOpeningElement,
248+
JSXClosingElement: handleClosingElement,
249+
JSXClosingFragment: handleClosingElement,
245250
JSXExpressionContainer: function(node) {
246251
if (!node.parent) {
247252
return;

0 commit comments

Comments
 (0)