Skip to content

Commit 994983b

Browse files
authored
fix: wrong report for object option in jsonc/object-curly-spacing (#283)
1 parent a372a88 commit 994983b

File tree

6 files changed

+707
-85
lines changed

6 files changed

+707
-85
lines changed

.changeset/tidy-flowers-push.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"eslint-plugin-jsonc": patch
3+
---
4+
5+
fix: wrong report for object option in `jsonc/object-curly-spacing`

.eslintrc.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ module.exports = {
2222
"@typescript-eslint/no-non-null-assertion": "off",
2323
"@typescript-eslint/no-explicit-any": "off",
2424
"no-shadow": "off",
25-
complexity: "off",
2625
"one-var": "off",
2726
"no-invalid-this": "off",
2827
// Repo rule

lib/rules/array-bracket-spacing.ts

Lines changed: 36 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,28 @@ export default createRule("array-bracket-spacing", {
7878
singleElementException: isOptionSet("singleValue"),
7979
objectsInArraysException: isOptionSet("objectsInArrays"),
8080
arraysInArraysException: isOptionSet("arraysInArrays"),
81+
isOpeningBracketMustBeSpaced(node: AST.JSONArrayExpression) {
82+
if (options.singleElementException && node.elements.length === 1) {
83+
return !options.spaced;
84+
}
85+
const firstElement = node.elements[0];
86+
return firstElement &&
87+
((options.objectsInArraysException && isObjectType(firstElement)) ||
88+
(options.arraysInArraysException && isArrayType(firstElement)))
89+
? !options.spaced
90+
: options.spaced;
91+
},
92+
isClosingBracketMustBeSpaced(node: AST.JSONArrayExpression) {
93+
if (options.singleElementException && node.elements.length === 1) {
94+
return !options.spaced;
95+
}
96+
const lastElement = node.elements[node.elements.length - 1];
97+
return lastElement &&
98+
((options.objectsInArraysException && isObjectType(lastElement)) ||
99+
(options.arraysInArraysException && isArrayType(lastElement)))
100+
? !options.spaced
101+
: options.spaced;
102+
},
81103
};
82104

83105
/**
@@ -189,57 +211,25 @@ export default createRule("array-bracket-spacing", {
189211
const second = sourceCode.getFirstToken(node as any, 1)!;
190212
const last = sourceCode.getLastToken(node as any)!;
191213
const penultimate = sourceCode.getTokenBefore(last)!;
192-
const firstElement = node.elements[0];
193-
const lastElement = node.elements[node.elements.length - 1];
194-
195-
const openingBracketMustBeSpaced =
196-
(firstElement &&
197-
options.objectsInArraysException &&
198-
isObjectType(firstElement)) ||
199-
(firstElement &&
200-
options.arraysInArraysException &&
201-
isArrayType(firstElement)) ||
202-
(options.singleElementException && node.elements.length === 1)
203-
? !options.spaced
204-
: options.spaced;
205-
206-
const closingBracketMustBeSpaced =
207-
(lastElement &&
208-
options.objectsInArraysException &&
209-
isObjectType(lastElement)) ||
210-
(lastElement &&
211-
options.arraysInArraysException &&
212-
isArrayType(lastElement)) ||
213-
(options.singleElementException && node.elements.length === 1)
214-
? !options.spaced
215-
: options.spaced;
216214

217215
if (isTokenOnSameLine(first, second)) {
218-
if (
219-
openingBracketMustBeSpaced &&
220-
!sourceCode.isSpaceBetweenTokens(first, second)
221-
)
222-
reportRequiredBeginningSpace(node, first);
223-
224-
if (
225-
!openingBracketMustBeSpaced &&
226-
sourceCode.isSpaceBetweenTokens(first, second)
227-
)
228-
reportNoBeginningSpace(node, first);
216+
if (options.isOpeningBracketMustBeSpaced(node)) {
217+
if (!sourceCode.isSpaceBetween(first, second))
218+
reportRequiredBeginningSpace(node, first);
219+
} else {
220+
if (sourceCode.isSpaceBetween(first, second))
221+
reportNoBeginningSpace(node, first);
222+
}
229223
}
230224

231225
if (first !== penultimate && isTokenOnSameLine(penultimate, last)) {
232-
if (
233-
closingBracketMustBeSpaced &&
234-
!sourceCode.isSpaceBetweenTokens(penultimate, last)
235-
)
236-
reportRequiredEndingSpace(node, last);
237-
238-
if (
239-
!closingBracketMustBeSpaced &&
240-
sourceCode.isSpaceBetweenTokens(penultimate, last)
241-
)
242-
reportNoEndingSpace(node, last);
226+
if (options.isClosingBracketMustBeSpaced(node)) {
227+
if (!sourceCode.isSpaceBetween(penultimate, last))
228+
reportRequiredEndingSpace(node, last);
229+
} else {
230+
if (sourceCode.isSpaceBetween(penultimate, last))
231+
reportNoEndingSpace(node, last);
232+
}
243233
}
244234
}
245235

lib/rules/object-curly-spacing.ts

Lines changed: 33 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,25 @@ export default createRule("object-curly-spacing", {
7474
spaced,
7575
arraysInObjectsException: isOptionSet("arraysInObjects"),
7676
objectsInObjectsException: isOptionSet("objectsInObjects"),
77+
isOpeningCurlyBraceMustBeSpaced(_second: Token | Comment) {
78+
return options.spaced;
79+
},
80+
isClosingCurlyBraceMustBeSpaced(penultimate: Token | Comment) {
81+
const targetPenultimateType =
82+
options.arraysInObjectsException && isClosingBracketToken(penultimate)
83+
? "JSONArrayExpression"
84+
: options.objectsInObjectsException &&
85+
isClosingBraceToken(penultimate)
86+
? "JSONObjectExpression"
87+
: null;
88+
const node = sourceCode.getNodeByRangeIndex(
89+
penultimate.range![0],
90+
) as AST.JSONNode | null;
91+
92+
return targetPenultimateType && node?.type === targetPenultimateType
93+
? !options.spaced
94+
: options.spaced;
95+
},
7796
};
7897

7998
/**
@@ -185,47 +204,25 @@ export default createRule("object-curly-spacing", {
185204
last: Token,
186205
) {
187206
if (isTokenOnSameLine(first, second)) {
188-
const firstSpaced = sourceCode.isSpaceBetweenTokens(
189-
first,
190-
second as Token,
191-
);
192-
193-
if (options.spaced && !firstSpaced)
194-
reportRequiredBeginningSpace(node, first);
207+
const firstSpaced = sourceCode.isSpaceBetween(first, second as any);
195208

196-
if (!options.spaced && firstSpaced && second.type !== "Line")
197-
reportNoBeginningSpace(node, first);
209+
if (options.isOpeningCurlyBraceMustBeSpaced(second)) {
210+
if (!firstSpaced) reportRequiredBeginningSpace(node, first);
211+
} else {
212+
if (firstSpaced && second.type !== "Line") {
213+
reportNoBeginningSpace(node, first);
214+
}
215+
}
198216
}
199217

200218
if (isTokenOnSameLine(penultimate, last)) {
201-
const shouldCheckPenultimate =
202-
(options.arraysInObjectsException &&
203-
isClosingBracketToken(penultimate)) ||
204-
(options.objectsInObjectsException &&
205-
isClosingBraceToken(penultimate));
206-
const penultimateType =
207-
shouldCheckPenultimate &&
208-
sourceCode.getNodeByRangeIndex(penultimate.range[0])!.type;
209-
210-
const closingCurlyBraceMustBeSpaced =
211-
(options.arraysInObjectsException &&
212-
penultimateType === "ArrayExpression") ||
213-
(options.objectsInObjectsException &&
214-
(penultimateType === "ObjectExpression" ||
215-
penultimateType === "ObjectPattern"))
216-
? !options.spaced
217-
: options.spaced;
218-
219-
const lastSpaced = sourceCode.isSpaceBetweenTokens(
220-
penultimate as Token,
221-
last,
222-
);
223-
224-
if (closingCurlyBraceMustBeSpaced && !lastSpaced)
225-
reportRequiredEndingSpace(node, last);
219+
const lastSpaced = sourceCode.isSpaceBetween(penultimate as any, last);
226220

227-
if (!closingCurlyBraceMustBeSpaced && lastSpaced)
228-
reportNoEndingSpace(node, last);
221+
if (options.isClosingCurlyBraceMustBeSpaced(penultimate)) {
222+
if (!lastSpaced) reportRequiredEndingSpace(node, last);
223+
} else {
224+
if (lastSpaced) reportNoEndingSpace(node, last);
225+
}
229226
}
230227
}
231228

0 commit comments

Comments
 (0)