Respect trailingComma in angular templates (#15926)

Co-authored-by: Sosuke Suzuki <aosukeke@gmail.com>
This commit is contained in:
fisker CheungandSosuke Suzuki authored and GitHub committed 2024-05-29 00:41:49 +09:00
1 parent c2e20fbae8
commit 8a88cdce6d
10 files changed
+761 -40

No files matched your search

+42
View File
@@ -0,0 +1,42 @@
#### Respect `trailingComma` in Angular templates (#15926 by @fisker)
If you are using an old version of Angular doesn't support trailing comma, make sure add
```yaml
overrides:
- files: "<patterns-of-my-angular-files>"
options:
trailingComma: none
```
to your `.prettierrc` file.
<!-- prettier-ignore -->
```jsx
// Input
<div
[ngClass]="{
'px-lg': ctx.spacing == 'lg',
'px-md': ctx.spacing == 'md',
'px-xs': ctx.spacing == 'xs',
}"
></div>
// Prettier stable
<div
[ngClass]="{
'px-lg': ctx.spacing == 'lg',
'px-md': ctx.spacing == 'md',
'px-xs': ctx.spacing == 'xs'
}"
></div>
// Prettier main
<div
[ngClass]="{
'px-lg': ctx.spacing == 'lg',
'px-md': ctx.spacing == 'md',
'px-xs': ctx.spacing == 'xs',
}"
></div>
```
-1
View File
@@ -114,7 +114,6 @@ function embed(path, options) {
};
if (options.parser === "angular") {
textToDocOptions.parser = "__ng_interpolation";
textToDocOptions.trailingComma = "none";
} else if (options.parser === "vue") {
textToDocOptions.parser = isVueSfcWithTypescriptScript(
path,
+1 -5
View File
@@ -18,11 +18,7 @@ function createAngularPrinter({ parser }) {
formatAttributeValue(
getUnescapedAttributeValue(path.node),
textToDoc,
{
parser,
// angular does not allow trailing comma
trailingComma: "none",
},
{ parser },
shouldHugJsExpression,
);
}
@@ -24,7 +24,6 @@ function printAngularControlFlowBlockParameters(
{
parser: "__ng_directive",
__isInHtmlAttribute: false,
trailingComma: "none",
},
shouldHugJsExpression,
);
-1
View File
@@ -19,7 +19,6 @@ async function printAngularInterpolation(text, textToDoc) {
await formatAttributeValue(part, textToDoc, {
parser: "__ng_interpolation",
__isInHtmlInterpolation: true, // to avoid unexpected `}}`
trailingComma: "none",
}),
]),
line,
+6 -1
View File
@@ -82,7 +82,12 @@ function printCallArguments(path, options, print) {
const isDynamicImport =
node.type === "ImportExpression" || node.callee.type === "Import";
const maybeTrailingComma =
!isDynamicImport && shouldPrintComma(options, "all") ? "," : "";
// Angular does not allow trailing comma
!options.parser.startsWith("__ng_") &&
!isDynamicImport &&
shouldPrintComma(options, "all")
? ","
: "";
function allArgsBrokenOut() {
return group(
@@ -451,10 +451,10 @@ printWidth: 80
[target]="{a: 1}"
[target]="{a: 1}"
[target]="{
trailingComma: 'notAllowed'
trailingComma: 'notAllowed',
}"
[target]="[
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
]"
[target]="true"
[target]="undefined"
@@ -540,14 +540,14 @@ printWidth: 80
listRow.NextScheduledSendStatus == 3
"
[target]="{
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: true
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: true,
}"
[error]="'We couldn\\\\\\'t find anything with that name.'"
*ngIf="form.controls.details?.controls.amount?.errors.min"
[ngClass]="{
'btn-success': (dialog$ | async).level === dialogLevelEnum.SUCCESS,
'btn-warning': (dialog$ | async).level === dialogLevelEnum.WARNING,
'btn-svg': (dialog$ | async).level === dialogLevelEnum.DANGER
'btn-svg': (dialog$ | async).level === dialogLevelEnum.DANGER,
}"
[stickout]="+toolAssembly.stickoutMm"
test="{{ 'test' | translate }}"
@@ -730,10 +730,10 @@ printWidth: 80
[target]="{ a: 1 }"
[target]="{ a: 1 }"
[target]="{
trailingComma: 'notAllowed'
trailingComma: 'notAllowed',
}"
[target]="[
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
]"
[target]="true"
[target]="undefined"
@@ -819,14 +819,14 @@ printWidth: 80
listRow.NextScheduledSendStatus == 3
"
[target]="{
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: true
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: true,
}"
[error]="'We couldn\\\\\\'t find anything with that name.'"
*ngIf="form.controls.details?.controls.amount?.errors.min"
[ngClass]="{
'btn-success': (dialog$ | async).level === dialogLevelEnum.SUCCESS,
'btn-warning': (dialog$ | async).level === dialogLevelEnum.WARNING,
'btn-svg': (dialog$ | async).level === dialogLevelEnum.DANGER
'btn-svg': (dialog$ | async).level === dialogLevelEnum.DANGER,
}"
[stickout]="+toolAssembly.stickoutMm"
test="{{ 'test' | translate }}"
@@ -1053,20 +1053,20 @@ printWidth: 1
]
"
[target]="[
1
1,
]"
[target]="{
a: 1
a: 1,
}"
[target]="{
a: 1
a: 1,
}"
[target]="{
trailingComma:
'notAllowed'
'notAllowed',
}"
[target]="[
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
]"
[target]="
true
@@ -1210,7 +1210,7 @@ printWidth: 1
1,
2,
3,
666666666666666666666666666666666666
666666666666666666666666666666666666,
];
let i = index
"
@@ -1320,7 +1320,7 @@ printWidth: 1
3
"
[target]="{
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: true
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: true,
}"
[error]="
'We couldn\\\\\\'t find anything with that name.'
@@ -1355,7 +1355,7 @@ printWidth: 1
| async
)
.level ===
dialogLevelEnum.DANGER
dialogLevelEnum.DANGER,
}"
[stickout]="
+toolAssembly.stickoutMm
@@ -1636,10 +1636,10 @@ trailingComma: "es5"
[target]="{ a: 1 }"
[target]="{ a: 1 }"
[target]="{
trailingComma: 'notAllowed'
trailingComma: 'notAllowed',
}"
[target]="[
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong,
]"
[target]="true"
[target]="undefined"
@@ -1725,14 +1725,14 @@ trailingComma: "es5"
listRow.NextScheduledSendStatus == 3
"
[target]="{
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: true
longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong: true,
}"
[error]="'We couldn\\\\\\'t find anything with that name.'"
*ngIf="form.controls.details?.controls.amount?.errors.min"
[ngClass]="{
'btn-success': (dialog$ | async).level === dialogLevelEnum.SUCCESS,
'btn-warning': (dialog$ | async).level === dialogLevelEnum.WARNING,
'btn-svg': (dialog$ | async).level === dialogLevelEnum.DANGER
'btn-svg': (dialog$ | async).level === dialogLevelEnum.DANGER,
}"
[stickout]="+toolAssembly.stickoutMm"
test="{{ 'test' | translate }}"
@@ -3395,21 +3395,21 @@ printWidth: 1
<div>
{{
[
1
1,
]
}}
</div>
<div>
{{
{
a: 1
a: 1,
}
}}
</div>
<div>
{{
{
a: 1
a: 1,
}
}}
</div>
@@ -3599,8 +3599,8 @@ printWidth: 1
| translate
: {
count:
array.length
})
array.length,
}),
}
}}
</p>
@@ -3609,7 +3609,7 @@ printWidth: 1
{
a:
1 +
{}
{},
}
}}
</p>
@@ -3618,14 +3618,14 @@ printWidth: 1
{
a:
a ===
{}
{},
}
}}
</p>
<p>
{{
{
a: !{}
a: !{},
}
}}
</p>
@@ -3634,7 +3634,7 @@ printWidth: 1
{
a: a
? b
: {}
: {},
}
}}
</p>
@@ -8391,7 +8391,7 @@ can be found in the LICENSE file at http://angular.io/license
<div
[ngClass]="{
special:
isSpecial
isSpecial,
}"
></div>
</div>
@@ -9371,7 +9371,7 @@ bindon-ngModel
[ngClass]="{
bad: false,
curly: true,
special: true
special: true,
}"
>
Curly
@@ -0,0 +1,622 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`trailing-comma.html - {"trailingComma":"all"} format 1`] = `
====================================options=====================================
parsers: ["angular"]
printWidth: 80
trailingComma: "all"
| printWidth
=====================================input======================================
<div
(action)="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
(action)="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
(action)="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
[binding]="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
[binding]="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
[binding]="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
*directive="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
*directive="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
*directive="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
></div>
=====================================output=====================================
<div
(action)="
({
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
object,
property,
})
"
(action)="
([
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
array,
element,
])
"
(action)="
call(
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
call,
argument
)
"
[binding]="{
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
object,
property,
}"
[binding]="[
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
array,
element,
]"
[binding]="
call(
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
call,
argument
)
"
*directive="{
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
object,
property,
}"
*directive="[
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
array,
element,
]"
*directive="
call(
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
call,
argument
)
"
></div>
================================================================================
`;
exports[`trailing-comma.html - {"trailingComma":"es5"} format 1`] = `
====================================options=====================================
parsers: ["angular"]
printWidth: 80
trailingComma: "es5"
| printWidth
=====================================input======================================
<div
(action)="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
(action)="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
(action)="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
[binding]="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
[binding]="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
[binding]="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
*directive="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
*directive="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
*directive="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
></div>
=====================================output=====================================
<div
(action)="
({
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
object,
property,
})
"
(action)="
([
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
array,
element,
])
"
(action)="
call(
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
call,
argument
)
"
[binding]="{
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
object,
property,
}"
[binding]="[
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
array,
element,
]"
[binding]="
call(
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
call,
argument
)
"
*directive="{
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
object,
property,
}"
*directive="[
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
array,
element,
]"
*directive="
call(
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
call,
argument
)
"
></div>
================================================================================
`;
exports[`trailing-comma.html - {"trailingComma":"none"} format 1`] = `
====================================options=====================================
parsers: ["angular"]
printWidth: 80
trailingComma: "none"
| printWidth
=====================================input======================================
<div
(action)="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
(action)="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
(action)="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
[binding]="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
[binding]="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
[binding]="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
*directive="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
*directive="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
*directive="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
></div>
=====================================output=====================================
<div
(action)="
({
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
object,
property
})
"
(action)="
([
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
array,
element
])
"
(action)="
call(
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
call,
argument
)
"
[binding]="{
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
object,
property
}"
[binding]="[
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
array,
element
]"
[binding]="
call(
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
call,
argument
)
"
*directive="{
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
object,
property
}"
*directive="[
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
array,
element
]"
*directive="
call(
long,
long,
long,
long,
long,
long,
long,
long,
long,
long,
call,
argument
)
"
></div>
================================================================================
`;
@@ -0,0 +1,3 @@
runFormatTest(import.meta, ["angular"], { trailingComma: "none" });
runFormatTest(import.meta, ["angular"], { trailingComma: "es5" });
runFormatTest(import.meta, ["angular"], { trailingComma: "all" });
@@ -0,0 +1,56 @@
<div
(action)="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
(action)="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
(action)="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
[binding]="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
[binding]="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
[binding]="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
*directive="
{long, long, long, long, long, long, long, long, long, long,
object,
property,
}
"
*directive="
[long, long, long, long, long, long, long, long, long, long,
array,
element,
]
"
*directive="
call(long, long, long, long, long, long, long, long, long, long,
call,
argument
)
"
></div>