@@ -154,7 +154,8 @@ module.exports = {
154
154
}
155
155
156
156
/**
157
- * Checks node is the first in its own start line. By default it looks by start line.
157
+ * Checks if the node is the first in its own start line. By default it looks by start line.
158
+ * One exception is closing tags with preceeding whitespace
158
159
* @param {ASTNode } node The node to check
159
160
* @return {Boolean } true if its the first in the its start line
160
161
*/
@@ -165,8 +166,9 @@ module.exports = {
165
166
} while ( token . type === 'JSXText' && / ^ \s * $ / . test ( token . value ) ) ;
166
167
var startLine = node . loc . start . line ;
167
168
var endLine = token ? token . loc . end . line : - 1 ;
169
+ var whitespaceOnly = token ? / \n \s * $ / . test ( token . value ) : false ;
168
170
169
- return startLine !== endLine ;
171
+ return startLine !== endLine || whitespaceOnly ;
170
172
}
171
173
172
174
/**
@@ -218,41 +220,47 @@ module.exports = {
218
220
}
219
221
}
220
222
223
+ function getOpeningElementIndent ( node ) {
224
+ var prevToken = sourceCode . getTokenBefore ( node ) ;
225
+ // Use the parent in a list or an array
226
+ if ( prevToken . type === 'JSXText' || prevToken . type === 'Punctuator' && prevToken . value === ',' ) {
227
+ prevToken = sourceCode . getNodeByRangeIndex ( prevToken . start ) ;
228
+ prevToken = prevToken . type === 'Literal' ? prevToken . parent : prevToken ;
229
+ // Use the first non-punctuator token in a conditional expression
230
+ } else if ( prevToken . type === 'Punctuator' && prevToken . value === ':' ) {
231
+ do {
232
+ prevToken = sourceCode . getTokenBefore ( prevToken ) ;
233
+ } while ( prevToken . type === 'Punctuator' ) ;
234
+ prevToken = sourceCode . getNodeByRangeIndex ( prevToken . start ) ;
235
+ while ( prevToken . parent && prevToken . parent . type !== 'ConditionalExpression' ) {
236
+ prevToken = prevToken . parent ;
237
+ }
238
+ }
239
+ prevToken = prevToken . type === 'JSXExpressionContainer' ? prevToken . expression : prevToken ;
240
+
241
+ var parentElementIndent = getNodeIndent ( prevToken ) ;
242
+ var indent = (
243
+ prevToken . loc . start . line === node . loc . start . line ||
244
+ isRightInLogicalExp ( node ) ||
245
+ isAlternateInConditionalExp ( node )
246
+ ) ? 0 : indentSize ;
247
+ return parentElementIndent + indent ;
248
+ }
249
+
221
250
return {
222
251
JSXOpeningElement : function ( node ) {
223
252
var prevToken = sourceCode . getTokenBefore ( node ) ;
224
253
if ( ! prevToken ) {
225
254
return ;
226
255
}
227
- // Use the parent in a list or an array
228
- if ( prevToken . type === 'JSXText' || prevToken . type === 'Punctuator' && prevToken . value === ',' ) {
229
- prevToken = sourceCode . getNodeByRangeIndex ( prevToken . start ) ;
230
- prevToken = prevToken . type === 'Literal' ? prevToken . parent : prevToken ;
231
- // Use the first non-punctuator token in a conditional expression
232
- } else if ( prevToken . type === 'Punctuator' && prevToken . value === ':' ) {
233
- do {
234
- prevToken = sourceCode . getTokenBefore ( prevToken ) ;
235
- } while ( prevToken . type === 'Punctuator' ) ;
236
- prevToken = sourceCode . getNodeByRangeIndex ( prevToken . start ) ;
237
- while ( prevToken . parent && prevToken . parent . type !== 'ConditionalExpression' ) {
238
- prevToken = prevToken . parent ;
239
- }
240
- }
241
- prevToken = prevToken . type === 'JSXExpressionContainer' ? prevToken . expression : prevToken ;
242
-
243
- var parentElementIndent = getNodeIndent ( prevToken ) ;
244
- var indent = (
245
- prevToken . loc . start . line === node . loc . start . line ||
246
- isRightInLogicalExp ( node ) ||
247
- isAlternateInConditionalExp ( node )
248
- ) ? 0 : indentSize ;
249
- checkNodesIndent ( node , parentElementIndent + indent ) ;
256
+ var indent = getOpeningElementIndent ( node ) ;
257
+ checkNodesIndent ( node , indent ) ;
250
258
} ,
251
259
JSXClosingElement : function ( node ) {
252
260
if ( ! node . parent ) {
253
261
return ;
254
262
}
255
- var peerElementIndent = getNodeIndent ( node . parent . openingElement ) ;
263
+ var peerElementIndent = getOpeningElementIndent ( node . parent . openingElement ) ;
256
264
checkNodesIndent ( node , peerElementIndent ) ;
257
265
} ,
258
266
JSXExpressionContainer : function ( node ) {
0 commit comments