Skip to content

Commit 82b4fb7

Browse files
casesandbergyannickcr
authored andcommitted
Add alternative option to jsx-curly-spacing (fixes #388, fixes #211)
1 parent 9096bcc commit 82b4fb7

File tree

2 files changed

+95
-12
lines changed

2 files changed

+95
-12
lines changed

lib/rules/jsx-curly-spacing.js

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ module.exports = function(context) {
1919
var sourceCode = context.getSourceCode();
2020
var spaced = context.options[0] === 'always';
2121
var multiline = context.options[1] ? context.options[1].allowMultiline : true;
22+
var alternative = context.options[1] ? context.options[1].alternative : false;
2223

2324
// --------------------------------------------------------------------------
2425
// Helpers
@@ -149,18 +150,43 @@ module.exports = function(context) {
149150
* @param {Token} last The last token to check (should be closing brace)
150151
* @returns {void}
151152
*/
152-
function validateBraceSpacing(node, first, second, penultimate, last) {
153+
function validateBraceSpacing(node, first, second, third, antepenultimate, penultimate, last) {
153154
if (spaced) {
154-
if (!sourceCode.isSpaceBetweenTokens(first, second)) {
155-
reportRequiredBeginningSpace(node, first);
156-
} else if (!multiline && isMultiline(first, second)) {
157-
reportNoBeginningNewline(node, first);
158-
}
159-
160-
if (!sourceCode.isSpaceBetweenTokens(penultimate, last)) {
161-
reportRequiredEndingSpace(node, last);
162-
} else if (!multiline && isMultiline(penultimate, last)) {
163-
reportNoEndingNewline(node, last);
155+
if (!alternative) {
156+
if (!sourceCode.isSpaceBetweenTokens(first, second)) {
157+
reportRequiredBeginningSpace(node, first);
158+
} else if (!multiline && isMultiline(first, second)) {
159+
reportNoBeginningNewline(node, first);
160+
}
161+
162+
if (!sourceCode.isSpaceBetweenTokens(penultimate, last)) {
163+
reportRequiredEndingSpace(node, last);
164+
} else if (!multiline && isMultiline(penultimate, last)) {
165+
reportNoEndingNewline(node, last);
166+
}
167+
168+
// Object literal
169+
} else if (first.value === second.value) {
170+
if (sourceCode.isSpaceBetweenTokens(first, second)) {
171+
reportNoBeginningSpace(node, first);
172+
}
173+
if (sourceCode.isSpaceBetweenTokens(penultimate, last)) {
174+
reportNoEndingSpace(node, last);
175+
}
176+
if (!sourceCode.isSpaceBetweenTokens(second, third)) {
177+
reportRequiredBeginningSpace(node, second);
178+
}
179+
if (!sourceCode.isSpaceBetweenTokens(antepenultimate, penultimate)) {
180+
reportRequiredEndingSpace(node, penultimate);
181+
}
182+
183+
} else {
184+
if (!sourceCode.isSpaceBetweenTokens(first, second)) {
185+
reportRequiredBeginningSpace(node, first);
186+
}
187+
if (!sourceCode.isSpaceBetweenTokens(penultimate, last)) {
188+
reportRequiredEndingSpace(node, last);
189+
}
164190
}
165191

166192
return;
@@ -186,8 +212,10 @@ module.exports = function(context) {
186212
var last = sourceCode.getLastToken(node);
187213
var second = context.getTokenAfter(first);
188214
var penultimate = sourceCode.getTokenBefore(last);
215+
var third = context.getTokenAfter(second);
216+
var antepenultimate = sourceCode.getTokenBefore(penultimate);
189217

190-
validateBraceSpacing(node, first, second, penultimate, last);
218+
validateBraceSpacing(node, first, second, third, antepenultimate, penultimate, last);
191219
}
192220
};
193221
};
@@ -199,6 +227,9 @@ module.exports.schema = [{
199227
properties: {
200228
allowMultiline: {
201229
type: 'boolean'
230+
},
231+
alternative: {
232+
type: 'boolean'
202233
}
203234
},
204235
additionalProperties: false

tests/lib/rules/jsx-curly-spacing.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,22 @@ ruleTester.run('jsx-curly-spacing', rule, {
8383
options: ['never'],
8484
parserOptions: parserOptions,
8585
parser: 'babel-eslint'
86+
}, {
87+
code: '<App foo={ bar } />;',
88+
options: ['always', {alternative: true}],
89+
parserOptions: parserOptions
90+
}, {
91+
code: '<App foo={{ bar: true, baz: true }} />;',
92+
options: ['always', {alternative: true}],
93+
parserOptions: parserOptions
94+
}, {
95+
code: [
96+
'<App foo={',
97+
'bar',
98+
'} />;'
99+
].join('\n'),
100+
options: ['always', {alternative: true}],
101+
parserOptions: parserOptions
86102
}],
87103

88104
invalid: [{
@@ -185,5 +201,41 @@ ruleTester.run('jsx-curly-spacing', rule, {
185201
message: 'There should be no newline before \'}\''
186202
}],
187203
parserOptions: parserOptions
204+
}, {
205+
code: '<App foo={bar} />;',
206+
options: ['always', {alternative: true}],
207+
errors: [{
208+
message: 'A space is required after \'{\''
209+
}, {
210+
message: 'A space is required before \'}\''
211+
}],
212+
parserOptions: parserOptions
213+
}, {
214+
code: '<App foo={ bar} />;',
215+
options: ['always', {alternative: true}],
216+
errors: [{
217+
message: 'A space is required before \'}\''
218+
}],
219+
parserOptions: parserOptions
220+
}, {
221+
code: '<App foo={bar } />;',
222+
options: ['always', {alternative: true}],
223+
errors: [{
224+
message: 'A space is required after \'{\''
225+
}],
226+
parserOptions: parserOptions
227+
}, {
228+
code: '<App foo={ {bar: true, baz: true} } />;',
229+
options: ['always', {alternative: true}],
230+
errors: [{
231+
message: 'There should be no space after \'{\''
232+
}, {
233+
message: 'A space is required after \'{\''
234+
}, {
235+
message: 'A space is required before \'}\''
236+
}, {
237+
message: 'There should be no space before \'}\''
238+
}],
239+
parserOptions: parserOptions
188240
}]
189241
});

0 commit comments

Comments
 (0)