Skip to content

Commit 9182124

Browse files
committed
Add function to add indents in newline
Utilised getNodeIndent helper from jsx-indent-props as base-code
1 parent e441aae commit 9182124

File tree

1 file changed

+44
-1
lines changed

1 file changed

+44
-1
lines changed

lib/rules/jsx-first-prop-new-line.js

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,50 @@ module.exports = {
2020
schema: [{
2121
enum: ['always', 'never', 'multiline', 'multiline-multiprop']
2222
}]
23+
2324
},
2425

2526
create: function (context) {
2627
var configuration = context.options[0];
28+
var extraColumnStart = 0;
29+
var indentType = 'space';
30+
var indentSize = 2;
31+
var sourceCode = context.getSourceCode();
32+
33+
if (context.options.length > 1) {
34+
if (context.options[1] === 'tab') {
35+
indentSize = 1;
36+
indentType = 'tab';
37+
} else if (typeof context.options[1] === 'number') {
38+
indentSize = context.options[1];
39+
indentType = 'space';
40+
}
41+
}
42+
43+
function getNodeIndent(node, byLastLine, excludeCommas) {
44+
byLastLine = byLastLine || false;
45+
excludeCommas = excludeCommas || false;
46+
47+
var src = sourceCode.getText(node, node.loc.start.column + extraColumnStart);
48+
var lines = src.split('\n');
49+
if (byLastLine) {
50+
src = lines[lines.length - 1];
51+
} else {
52+
src = lines[0];
53+
}
54+
55+
var skip = excludeCommas ? ',' : '';
56+
57+
var regExp;
58+
if (indentType === 'space') {
59+
regExp = new RegExp('^[ ' + skip + ']+');
60+
} else {
61+
regExp = new RegExp('^[\t' + skip + ']+');
62+
}
63+
64+
var indent = regExp.exec(src);
65+
return indent ? indent[0].length : 0;
66+
}
2767

2868
function isMultilineJSX(jsxNode) {
2969
return jsxNode.loc.start.line < jsxNode.loc.end.line;
@@ -42,7 +82,10 @@ module.exports = {
4282
node: decl,
4383
message: 'Property should be placed on a new line',
4484
fix: function(fixer) {
45-
return fixer.insertTextAfter(node.name, '\n');
85+
var nodeIndent = getNodeIndent(node, false, false);
86+
var neededIndent = nodeIndent + indentSize;
87+
var insert = '\n' + Array(neededIndent + 1).join(indentType === 'space' ? ' ' : '\t');
88+
return fixer.replaceTextRange([node.name.end, decl.start], insert);
4689
}
4790
});
4891
}

0 commit comments

Comments
 (0)