Skip to content

Commit 580e48a

Browse files
mikededoota-meshi
andauthoredSep 27, 2024··
fix(svelte/indent): ensure proper snippet indent (#864)
Fix `svelte/indent` rule for `SvelteSnippetBlock`, by ensuring that the children and closing tags are properly indented. Closes #863. --------- Co-authored-by: Yosuke Ota <otameshiyo23@gmail.com>
1 parent c840776 commit 580e48a

File tree

5 files changed

+138
-11
lines changed

5 files changed

+138
-11
lines changed
 

‎.changeset/nervous-rings-applaud.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"eslint-plugin-svelte": patch
3+
---
4+
5+
fix(svelte/indent): ensure proper snippet indent

‎packages/eslint-plugin-svelte/src/rules/indent-helpers/svelte.ts

+27-11
Original file line numberDiff line numberDiff line change
@@ -457,15 +457,12 @@ export function defineVisitor(context: IndentContext): NodeListener {
457457
offsets.setOffsetToken(token, 1, openToken);
458458
}
459459

460-
const [openCloseTagToken, endAwaitToken, closeCloseTagToken] = sourceCode.getLastTokens(
461-
node,
462-
{
463-
count: 3,
464-
includeComments: false
465-
}
466-
);
460+
const [openCloseTagToken, endKeyToken, closeCloseTagToken] = sourceCode.getLastTokens(node, {
461+
count: 3,
462+
includeComments: false
463+
});
467464
offsets.setOffsetToken(openCloseTagToken, 0, openToken);
468-
offsets.setOffsetToken(endAwaitToken, 1, openCloseTagToken);
465+
offsets.setOffsetToken(endKeyToken, 1, openCloseTagToken);
469466
offsets.setOffsetToken(closeCloseTagToken, 0, openCloseTagToken);
470467
},
471468
SvelteSnippetBlock(node: AST.SvelteSnippetBlock) {
@@ -474,8 +471,8 @@ export function defineVisitor(context: IndentContext): NodeListener {
474471
includeComments: false
475472
});
476473
offsets.setOffsetToken(snippetToken, 1, openToken);
477-
const id = getFirstAndLastTokens(sourceCode, node.id);
478-
offsets.setOffsetToken(id.firstToken, 1, snippetToken);
474+
const snippetName = sourceCode.getTokenAfter(snippetToken)!;
475+
offsets.setOffsetToken(snippetName, 1, snippetToken);
479476

480477
const leftParenToken = sourceCode.getTokenBefore(
481478
node.params[0] || sourceCode.getLastToken(node),
@@ -492,8 +489,27 @@ export function defineVisitor(context: IndentContext): NodeListener {
492489
includeComments: false
493490
}
494491
)!;
495-
offsets.setOffsetToken(leftParenToken, 1, id.firstToken);
492+
offsets.setOffsetToken(leftParenToken, 1, snippetName);
496493
offsets.setOffsetElementList(node.params, leftParenToken, rightParenToken, 1);
494+
495+
const closeOpenTagToken = sourceCode.getTokenAfter(rightParenToken)!;
496+
offsets.setOffsetToken(closeOpenTagToken, 0, openToken);
497+
498+
for (const child of node.children) {
499+
const token = sourceCode.getFirstToken(child, {
500+
includeComments: false,
501+
filter: isNotWhitespace
502+
});
503+
offsets.setOffsetToken(token, 1, openToken);
504+
}
505+
506+
const [openCloseTagToken, endSnippetToken, closeCloseTagToken] = sourceCode.getLastTokens(
507+
node,
508+
{ count: 3, includeComments: false }
509+
);
510+
offsets.setOffsetToken(openCloseTagToken, 0, openToken);
511+
offsets.setOffsetToken(endSnippetToken, 1, openCloseTagToken);
512+
offsets.setOffsetToken(closeCloseTagToken, 0, openCloseTagToken);
497513
},
498514
// ----------------------------------------------------------------------
499515
// COMMENTS

‎packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/snippets01-errors.yaml

+60
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,63 @@
3838
line: 15
3939
column: 1
4040
suggestions: null
41+
- message: Expected indentation of 2 spaces but found 0 spaces.
42+
line: 18
43+
column: 1
44+
suggestions: null
45+
- message: Expected indentation of 4 spaces but found 0 spaces.
46+
line: 19
47+
column: 1
48+
suggestions: null
49+
- message: Expected indentation of 2 spaces but found 0 spaces.
50+
line: 20
51+
column: 1
52+
suggestions: null
53+
- message: Expected indentation of 2 spaces but found 0 spaces.
54+
line: 22
55+
column: 1
56+
suggestions: null
57+
- message: Expected indentation of 4 spaces but found 2 spaces.
58+
line: 23
59+
column: 1
60+
suggestions: null
61+
- message: Expected indentation of 2 spaces but found 0 spaces.
62+
line: 24
63+
column: 1
64+
suggestions: null
65+
- message: Expected indentation of 4 spaces but found 0 spaces.
66+
line: 25
67+
column: 1
68+
suggestions: null
69+
- message: Expected indentation of 2 spaces but found 0 spaces.
70+
line: 26
71+
column: 1
72+
suggestions: null
73+
- message: Expected indentation of 4 spaces but found 0 spaces.
74+
line: 27
75+
column: 1
76+
suggestions: null
77+
- message: Expected indentation of 2 spaces but found 0 spaces.
78+
line: 28
79+
column: 1
80+
suggestions: null
81+
- message: Expected indentation of 2 spaces but found 0 spaces.
82+
line: 31
83+
column: 1
84+
suggestions: null
85+
- message: Expected indentation of 4 spaces but found 0 spaces.
86+
line: 32
87+
column: 1
88+
suggestions: null
89+
- message: Expected indentation of 4 spaces but found 0 spaces.
90+
line: 34
91+
column: 1
92+
suggestions: null
93+
- message: Expected indentation of 2 spaces but found 0 spaces.
94+
line: 36
95+
column: 1
96+
suggestions: null
97+
- message: Expected indentation of 2 spaces but found 0 spaces.
98+
line: 38
99+
column: 1
100+
suggestions: null

‎packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/snippets01-input.svelte

+23
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,26 @@ a
1414
}
1515
)
1616
}
17+
<div>
18+
{#snippet example()}
19+
<div></div>
20+
{/snippet}
21+
22+
{
23+
#snippet example_2()
24+
}
25+
<div></div>
26+
{
27+
/snippet
28+
}
29+
</div>
30+
{
31+
#snippet example_3
32+
(
33+
34+
)
35+
}
36+
<div></div>
37+
{
38+
/snippet
39+
}

‎packages/eslint-plugin-svelte/tests/fixtures/rules/indent/invalid/snippets01-output.svelte

+23
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,26 @@
1414
}
1515
)
1616
}
17+
<div>
18+
{#snippet example()}
19+
<div></div>
20+
{/snippet}
21+
22+
{
23+
#snippet example_2()
24+
}
25+
<div></div>
26+
{
27+
/snippet
28+
}
29+
</div>
30+
{
31+
#snippet example_3
32+
(
33+
34+
)
35+
}
36+
<div></div>
37+
{
38+
/snippet
39+
}

0 commit comments

Comments
 (0)
Please sign in to comment.