Skip to content

Commit bea9e82

Browse files
committed
feat: add support for {@snippet} and {@render} in mustache-spacing rule
1 parent e6d6c46 commit bea9e82

18 files changed

+172
-10
lines changed

src/rules/mustache-spacing.ts

+37-1
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,16 @@ export default createRule('mustache-spacing', {
217217
true
218218
);
219219
},
220+
SvelteRenderTag(node) {
221+
const mustacheTokens = getMustacheTokens(node, sourceCode);
222+
verifyBraces(
223+
mustacheTokens.openToken,
224+
mustacheTokens.closeToken,
225+
options.tags.openingBrace,
226+
options.tags.closingBrace,
227+
true
228+
);
229+
},
220230
SvelteIfBlock(node) {
221231
const openBlockOpeningToken = sourceCode.getFirstToken(node);
222232
const openBlockClosingToken = sourceCode.getTokenAfter(node.expression, {
@@ -292,7 +302,7 @@ export default createRule('mustache-spacing', {
292302
false
293303
);
294304
},
295-
SvelteKeyBlock(node: AST.SvelteEachBlock | AST.SvelteKeyBlock) {
305+
SvelteKeyBlock(node: AST.SvelteKeyBlock) {
296306
const openBlockOpeningToken = sourceCode.getFirstToken(node);
297307
const openBlockClosingToken = sourceCode.getTokenAfter(node.expression, {
298308
includeComments: false,
@@ -387,6 +397,32 @@ export default createRule('mustache-spacing', {
387397
openBlockClosingToken === sourceCode.getTokenAfter(openBlockLast)
388398
)
389399
);
400+
},
401+
SvelteSnippetBlock(node) {
402+
const openBlockOpeningToken = sourceCode.getFirstToken(node);
403+
const openBlockClosingToken = sourceCode.getTokenAfter(node.context || node.id, {
404+
includeComments: false,
405+
filter: isClosingBraceToken
406+
})!;
407+
verifyBraces(
408+
openBlockOpeningToken,
409+
openBlockClosingToken,
410+
options.tags.openingBrace,
411+
options.tags.closingBrace,
412+
true
413+
);
414+
const closeBlockClosingToken = sourceCode.getLastToken(node);
415+
const closeBlockOpeningToken = sourceCode.getTokenBefore(closeBlockClosingToken, {
416+
includeComments: false,
417+
filter: isOpeningBraceToken
418+
})!;
419+
verifyBraces(
420+
closeBlockOpeningToken,
421+
closeBlockClosingToken,
422+
options.tags.openingBrace,
423+
options.tags.closingBrace,
424+
false
425+
);
390426
}
391427
};
392428
}

src/utils/ast-utils.ts

+31-9
Original file line numberDiff line numberDiff line change
@@ -352,7 +352,8 @@ export function getMustacheTokens(
352352
| SvAST.SvelteMustacheTag
353353
| SvAST.SvelteShorthandAttribute
354354
| SvAST.SvelteSpreadAttribute
355-
| SvAST.SvelteDebugTag,
355+
| SvAST.SvelteDebugTag
356+
| SvAST.SvelteRenderTag,
356357
sourceCode: SourceCode
357358
): {
358359
openToken: SvAST.Token;
@@ -365,7 +366,8 @@ export function getMustacheTokens(
365366
| SvAST.SvelteMustacheTag
366367
| SvAST.SvelteShorthandAttribute
367368
| SvAST.SvelteSpreadAttribute
368-
| SvAST.SvelteDebugTag,
369+
| SvAST.SvelteDebugTag
370+
| SvAST.SvelteRenderTag,
369371
sourceCode: SourceCode
370372
): {
371373
openToken: SvAST.Token;
@@ -379,18 +381,14 @@ export function getMustacheTokens(
379381
| SvAST.SvelteMustacheTag
380382
| SvAST.SvelteShorthandAttribute
381383
| SvAST.SvelteSpreadAttribute
382-
| SvAST.SvelteDebugTag,
384+
| SvAST.SvelteDebugTag
385+
| SvAST.SvelteRenderTag,
383386
sourceCode: SourceCode
384387
): {
385388
openToken: SvAST.Token;
386389
closeToken: SvAST.Token;
387390
} | null {
388-
if (
389-
node.type === 'SvelteMustacheTag' ||
390-
node.type === 'SvelteShorthandAttribute' ||
391-
node.type === 'SvelteSpreadAttribute' ||
392-
node.type === 'SvelteDebugTag'
393-
) {
391+
if (isWrappedInBraces(node)) {
394392
const openToken = sourceCode.getFirstToken(node);
395393
const closeToken = sourceCode.getLastToken(node);
396394
return {
@@ -433,6 +431,30 @@ export function getMustacheTokens(
433431
};
434432
}
435433

434+
function isWrappedInBraces(
435+
node:
436+
| SvAST.SvelteDirective
437+
| SvAST.SvelteSpecialDirective
438+
| SvAST.SvelteMustacheTag
439+
| SvAST.SvelteShorthandAttribute
440+
| SvAST.SvelteSpreadAttribute
441+
| SvAST.SvelteDebugTag
442+
| SvAST.SvelteRenderTag
443+
): node is
444+
| SvAST.SvelteMustacheTag
445+
| SvAST.SvelteShorthandAttribute
446+
| SvAST.SvelteSpreadAttribute
447+
| SvAST.SvelteDebugTag
448+
| SvAST.SvelteRenderTag {
449+
return (
450+
node.type === 'SvelteMustacheTag' ||
451+
node.type === 'SvelteShorthandAttribute' ||
452+
node.type === 'SvelteSpreadAttribute' ||
453+
node.type === 'SvelteDebugTag' ||
454+
node.type === 'SvelteRenderTag'
455+
);
456+
}
457+
436458
/** Get attribute key text */
437459
export function getAttributeKeyText(
438460
node:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
- message: Expected 1 space before '}', but not found.
2+
line: 2
3+
column: 16
4+
suggestions: null
5+
- message: Expected 1 space before '}', but not found.
6+
line: 4
7+
column: 15
8+
suggestions: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<!-- prettier-ignore -->
2+
{#snippet foo()}
3+
{/snippet}
4+
{@render foo()}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<!-- prettier-ignore -->
2+
{#snippet foo() }
3+
{/snippet}
4+
{@render foo() }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": ">=5.0.0-0"
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
- message: Expected 1 space after '{', but not found.
2+
line: 2
3+
column: 1
4+
suggestions: null
5+
- message: Expected 1 space before '}', but not found.
6+
line: 2
7+
column: 16
8+
suggestions: null
9+
- message: Expected 1 space after '{', but not found.
10+
line: 3
11+
column: 1
12+
suggestions: null
13+
- message: Expected 1 space before '}', but not found.
14+
line: 3
15+
column: 10
16+
suggestions: null
17+
- message: Expected 1 space after '{', but not found.
18+
line: 4
19+
column: 1
20+
suggestions: null
21+
- message: Expected 1 space before '}', but not found.
22+
line: 4
23+
column: 15
24+
suggestions: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<!-- prettier-ignore -->
2+
{#snippet foo()}
3+
{/snippet}
4+
{@render foo()}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<!-- prettier-ignore -->
2+
{ #snippet foo() }
3+
{ /snippet }
4+
{ @render foo() }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": ">=5.0.0-0"
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
- message: Expected no space after '{', but found.
2+
line: 2
3+
column: 3
4+
suggestions: null
5+
- message: Expected no space before '}', but found.
6+
line: 2
7+
column: 17
8+
suggestions: null
9+
- message: Expected no space after '{', but found.
10+
line: 3
11+
column: 1
12+
suggestions: null
13+
- message: Expected no space before '}', but found.
14+
line: 3
15+
column: 11
16+
suggestions: null
17+
- message: Expected no space after '{', but found.
18+
line: 4
19+
column: 1
20+
suggestions: null
21+
- message: Expected no space before '}', but found.
22+
line: 4
23+
column: 16
24+
suggestions: null
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<!-- prettier-ignore -->
2+
{ #snippet foo() }
3+
{ /snippet }
4+
{ @render foo() }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<!-- prettier-ignore -->
2+
{#snippet foo()}
3+
{/snippet}
4+
{@render foo()}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
{
2+
"FIXME": "It seems to return the wrong location in Svelte v5.",
3+
"svelte": "<=0.0.0 >=5.0.0-0"
4+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<!-- prettier-ignore -->
2+
{ #snippet foo() }
3+
{ /snippet }
4+
{ @render foo() }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": ">=5.0.0-0"
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<!-- prettier-ignore -->
2+
{#snippet foo()}
3+
{/snippet}
4+
{@render foo()}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": ">=5.0.0-0"
3+
}

0 commit comments

Comments
 (0)