Skip to content

Commit d2f6d9b

Browse files
ab-angelicaAngelica Bocanegra
andauthored
fix: object-type-curly-spacing should not trim multi-line expressions (#481)
Co-authored-by: Angelica Bocanegra <[email protected]>
1 parent 7cabcda commit d2f6d9b

File tree

3 files changed

+55
-30
lines changed

3 files changed

+55
-30
lines changed

README.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2620,6 +2620,10 @@ type obj = {|"foo": "bar" |}
26202620
type obj = {"foo": "bar", [key: string]: string }
26212621
// Message: There should be no space before "}".
26222622

2623+
type obj = {
2624+
"foo": "bar", [key: string]: string }
2625+
// Message: There should be no space before "}".
2626+
26232627
type obj = { baz: {"foo": "qux"}, bar: 4}
26242628
// Message: There should be no space after "{".
26252629

@@ -2671,7 +2675,18 @@ type obj = {
26712675
foo: "bar"}
26722676

26732677
type obj = {
2674-
foo: "bar"}
2678+
foo: "bar"
2679+
}
2680+
2681+
type obj = {
2682+
foo: "bar",
2683+
ee: "bar",
2684+
}
2685+
2686+
type obj = {
2687+
foo: "bar",
2688+
ee: "bar",
2689+
}
26752690

26762691
type obj = {|"foo": "bar"|}
26772692

src/rules/objectTypeCurlySpacing.js

Lines changed: 29 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ const meta = {
1111
fixable: 'code',
1212
};
1313

14+
const sameLine = (left, right) => {
15+
return left.loc.end.line === right.loc.start.line;
16+
};
17+
1418
const create = (context) => {
1519
const never = (context?.options[0] ?? 'never') === 'never';
1620
const sourceCode = context.getSourceCode();
@@ -31,33 +35,18 @@ const create = (context) => {
3135
const spacesBefore = firstInnerToken.range[0] - opener.range[1];
3236
const spacesAfter = closer.range[0] - lastInnerToken.range[1];
3337

34-
if (never) {
35-
if (spacesBefore) {
36-
if (sourceCode.text[opener?.range[1]] !== '\n') {
37-
context.report({
38-
data: {
39-
token: opener.value,
40-
},
41-
fix: spacingFixers.stripSpacesAfter(opener, spacesBefore),
42-
message: 'There should be no space after "{{token}}".',
43-
node,
44-
});
45-
}
46-
}
47-
if (spacesAfter) {
48-
if (sourceCode.text[closer?.range[0] - 1] !== '\n') {
49-
context.report({
50-
data: {
51-
token: closer.value,
52-
},
53-
fix: spacingFixers.stripSpacesBefore(closer, spacesAfter),
54-
message: 'There should be no space before "{{token}}".',
55-
node,
56-
});
57-
}
58-
}
59-
} else {
60-
if (!spacesBefore) {
38+
// Check the opening brace
39+
if (sameLine(opener, firstInnerToken)) {
40+
if (never && spacesBefore) {
41+
context.report({
42+
data: {
43+
token: opener.value,
44+
},
45+
fix: spacingFixers.stripSpacesAfter(opener, spacesBefore),
46+
message: 'There should be no space after "{{token}}".',
47+
node,
48+
});
49+
} else if (!never && !spacesBefore) {
6150
context.report({
6251
data: {
6352
token: opener.value,
@@ -67,8 +56,20 @@ const create = (context) => {
6756
node,
6857
});
6958
}
59+
}
7060

71-
if (!spacesAfter) {
61+
// Check the closing brace
62+
if (sameLine(lastInnerToken, closer)) {
63+
if (never && spacesAfter) {
64+
context.report({
65+
data: {
66+
token: closer.value,
67+
},
68+
fix: spacingFixers.stripSpacesBefore(closer, spacesAfter),
69+
message: 'There should be no space before "{{token}}".',
70+
node,
71+
});
72+
} else if (!never && !spacesAfter) {
7273
context.report({
7374
data: {
7475
token: closer.value,

tests/rules/assertions/objectTypeCurlySpacing.js

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ export default {
3737
],
3838
output: 'type obj = {"foo": "bar", [key: string]: string}',
3939
},
40+
{
41+
code: 'type obj = {\n"foo": "bar", [key: string]: string }',
42+
errors: [
43+
{message: 'There should be no space before "}".'},
44+
],
45+
output: 'type obj = {\n"foo": "bar", [key: string]: string}',
46+
},
4047
{
4148
code: 'type obj = { baz: {"foo": "qux"}, bar: 4}',
4249
errors: [
@@ -144,7 +151,9 @@ export default {
144151
{code: 'type obj = {foo: "bar"}'},
145152
{code: 'type obj = {foo: "bar"\n}'},
146153
{code: 'type obj = {\nfoo: "bar"}'},
147-
{code: 'type obj = {\nfoo: "bar"}'},
154+
{code: 'type obj = {\nfoo: "bar"\n}'},
155+
{code: 'type obj = {\nfoo: "bar",\nee: "bar",\n}'},
156+
{code: 'type obj = {\nfoo: "bar",\nee: "bar",\n }'},
148157
{code: 'type obj = {|"foo": "bar"|}'},
149158
{code: 'type obj = {"foo": "bar", [key: string]: string}'},
150159

0 commit comments

Comments
 (0)