Skip to content

Commit a901624

Browse files
authored
fix(eslint-plugin-template): [attribute-order] check for ng-template within svg (#2223)
1 parent 3690109 commit a901624

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed

packages/eslint-plugin-template/docs/rules/attributes-order.md

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,35 @@ interface Options {
578578

579579
#### ❌ Invalid Code
580580

581+
```html
582+
<svg>
583+
<ng-template let-value #Template></ng-template>
584+
~~~~~~~~~~~~~~~~~~~
585+
</svg>
586+
```
587+
588+
<br>
589+
590+
---
591+
592+
<br>
593+
594+
#### Default Config
595+
596+
```json
597+
{
598+
"rules": {
599+
"@angular-eslint/template/attributes-order": [
600+
"error"
601+
]
602+
}
603+
}
604+
```
605+
606+
<br>
607+
608+
#### ❌ Invalid Code
609+
581610
```html
582611
<td mat-cell *matCellDef="let element"></td>
583612
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1019,6 +1048,32 @@ interface Options {
10191048
<div i18n test1="test1" i18n-test1="@@TEST1" test2="test2" i18n-test2="@@TEST2"></div>
10201049
```
10211050

1051+
<br>
1052+
1053+
---
1054+
1055+
<br>
1056+
1057+
#### Default Config
1058+
1059+
```json
1060+
{
1061+
"rules": {
1062+
"@angular-eslint/template/attributes-order": [
1063+
"error"
1064+
]
1065+
}
1066+
}
1067+
```
1068+
1069+
<br>
1070+
1071+
#### ✅ Valid Code
1072+
1073+
```html
1074+
<svg><ng-template #Template let-value><line x1="1" x2="2" y1="3" y2="4"></line></ng-template></svg>
1075+
```
1076+
10221077
</details>
10231078

10241079
<br>

packages/eslint-plugin-template/src/rules/attributes-order.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -300,7 +300,10 @@ function toTemplateReferenceVariableOrderType(reference: TmplAstReference) {
300300
function isImplicitTemplate(
301301
node: TmplAstNode,
302302
): node is TmplAstTemplate & { tagName: null } {
303-
return isTmplAstTemplate(node) && node.tagName !== 'ng-template';
303+
return (
304+
isTmplAstTemplate(node) &&
305+
(node.tagName === null || !/^(:svg:)?ng-template$/.test(node.tagName))
306+
);
304307
}
305308

306309
function extractTemplateAttrs(

packages/eslint-plugin-template/tests/rules/attributes-order/cases.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ export const valid: readonly (string | ValidTestCase<Options>)[] = [
2323
'<ng-template [ngIf]="condition" [ngIfThen]="If" [ngIfElse]="Else"><div></div></ng-template>',
2424
'<ng-template #Template let-value><div></div></ng-template>',
2525
'<div i18n test1="test1" i18n-test1="@@TEST1" test2="test2" i18n-test2="@@TEST2"></div>',
26+
'<svg><ng-template #Template let-value><line x1="1" x2="2" y1="3" y2="4"></line></ng-template></svg>',
2627
];
2728

2829
export const invalid: readonly InvalidTestCase<MessageIds, Options>[] = [
@@ -345,6 +346,27 @@ export const invalid: readonly InvalidTestCase<MessageIds, Options>[] = [
345346
346347
`,
347348
}),
349+
convertAnnotatedSourceToFailureCase({
350+
messageId,
351+
description: 'should work with ng-template in svg',
352+
annotatedSource: `
353+
<svg>
354+
<ng-template let-value #Template></ng-template>
355+
~~~~~~~~~~~~~~~~~~~
356+
</svg>
357+
`,
358+
options: [{ alphabetical: true }] as Options,
359+
data: {
360+
expected: '`#Template`, `let-value`',
361+
actual: '`let-value`, `#Template`',
362+
},
363+
annotatedOutput: `
364+
<svg>
365+
<ng-template #Template let-value></ng-template>
366+
367+
</svg>
368+
`,
369+
}),
348370
convertAnnotatedSourceToFailureCase({
349371
messageId,
350372
description: 'should work with structural directive and single let',

0 commit comments

Comments
 (0)