Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions .changeset/honest-eagles-learn.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
"@biomejs/biome": patch
---

Fixed [#7806](https://github.com/biomejs/biome/issues/7806): Prefer breaking after the assignment operator for conditional types with generic parameters to match Prettier.

```diff
-type True = unknown extends Type<
- "many",
- "generic",
- "parameters",
- "one",
- "two",
- "three"
->
- ? true
- : false;
+type True =
+ unknown extends Type<"many", "generic", "parameters", "one", "two", "three">
+ ? true
+ : false;
```
27 changes: 24 additions & 3 deletions crates/biome_js_formatter/src/utils/assignment_like.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ use biome_js_syntax::{
JsInitializerClause, JsLiteralMemberName, JsObjectAssignmentPattern,
JsObjectAssignmentPatternProperty, JsObjectBindingPattern, JsPropertyClassMember,
JsPropertyClassMemberFields, JsPropertyObjectMember, JsSyntaxKind, JsVariableDeclarator,
TsInitializedPropertySignatureClassMember, TsInitializedPropertySignatureClassMemberFields,
TsPropertySignatureClassMember, TsPropertySignatureClassMemberFields, TsTypeAliasDeclaration,
TsTypeArguments, TsUnionType,
TsConditionalType, TsInitializedPropertySignatureClassMember,
TsInitializedPropertySignatureClassMemberFields, TsPropertySignatureClassMember,
TsPropertySignatureClassMemberFields, TsTypeAliasDeclaration, TsTypeArguments, TsUnionType,
};
use biome_js_syntax::{AnyJsLiteralExpression, JsUnaryExpression};
use biome_rowan::{AstNode, SyntaxNodeOptionExt, SyntaxResult, declare_node_union};
Expand Down Expand Up @@ -931,13 +931,34 @@ impl AnyJsAssignmentLike {
}
has_leading_comments
}
RightAssignmentLike::AnyTsType(AnyTsType::TsConditionalType(conditional_type)) => {
comments.has_leading_own_line_comment(conditional_type.syntax())
|| should_break_before_conditional_type(conditional_type)?
}
right => comments.has_leading_own_line_comment(right.syntax()),
};

Ok(result)
}
}

fn is_generic(ty: &AnyTsType) -> bool {
match ty {
AnyTsType::TsReferenceType(reference) => reference.type_arguments().is_some(),
AnyTsType::TsFunctionType(function) => function.type_parameters().is_some(),
_ => false,
}
}

fn should_break_before_conditional_type(
conditional_type: &TsConditionalType,
) -> SyntaxResult<bool> {
Ok(
is_generic(&conditional_type.check_type()?)
|| is_generic(&conditional_type.extends_type()?),
)
}

/// Checks if the function is entitled to be printed with layout [AssignmentLikeLayout::BreakAfterOperator]
pub(crate) fn should_break_after_operator(
right: &AnyJsExpression,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
source: crates/biome_formatter_test/src/snapshot_builder.rs
assertion_line: 211
info: typescript/type-alias/conditional.ts
---
# Input
Expand Down Expand Up @@ -48,35 +49,9 @@ export type Intersect<U1 extends any, U2 extends any> =
```diff
--- Prettier
+++ Biome
@@ -1,18 +1,27 @@
-type FallbackFlags<F extends Flags | undefined> =
- Equals<NonNullableFlag<F>["flags"], {}> extends true
- ? Dict<any>
- : NonNullableFlag<F>["flags"];
+type FallbackFlags<F extends Flags | undefined> = Equals<
+ NonNullableFlag<F>["flags"],
+ {}
+> extends true
+ ? Dict<any>
+ : NonNullableFlag<F>["flags"];

-export type UnPromise<Type extends Promise<unknown>> =
- Type extends Promise<infer Generic> ? Generic : never;
+export type UnPromise<Type extends Promise<unknown>> = Type extends Promise<
+ infer Generic
+>
+ ? Generic
+ : never;

-export type Equals<X, Y> =
- (<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2
- ? true
- : false;
+export type Equals<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
+ T,
+>() => T extends Y ? 1 : 2
+ ? true
+ : false;
@@ -11,8 +11,11 @@
? true
: false;

-export type _Repeat<A extends any, N extends number, L extends List = []> =
- __Repeat<N, A, L> extends infer X ? Cast<X, List> : never;
Expand All @@ -93,24 +68,18 @@ export type Intersect<U1 extends any, U2 extends any> =
# Output

```ts
type FallbackFlags<F extends Flags | undefined> = Equals<
NonNullableFlag<F>["flags"],
{}
> extends true
? Dict<any>
: NonNullableFlag<F>["flags"];

export type UnPromise<Type extends Promise<unknown>> = Type extends Promise<
infer Generic
>
? Generic
: never;
type FallbackFlags<F extends Flags | undefined> =
Equals<NonNullableFlag<F>["flags"], {}> extends true
? Dict<any>
: NonNullableFlag<F>["flags"];

export type Equals<X, Y> = (<T>() => T extends X ? 1 : 2) extends <
T,
>() => T extends Y ? 1 : 2
? true
: false;
export type UnPromise<Type extends Promise<unknown>> =
Type extends Promise<infer Generic> ? Generic : never;

export type Equals<X, Y> =
(<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2
? true
: false;

export type _Repeat<
A extends any,
Expand Down
28 changes: 27 additions & 1 deletion crates/biome_js_formatter/tests/specs/ts/type/conditional.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,30 @@ type T4 = test extends string
// something
? unknown : test extends number ? undefined :
// else
undefined;
undefined;

type T5 =
// comment
test extends string ? test extends number ? unknown : unknown : undefined;

type Echo<T> = T

type T6 = test extends Echo<string> ? test extends number ? unknown : unknown : undefined;

type T7 = test extends Echo<string> ? unknown : test extends number ? undefined : undefined;

type T8 = test extends Echo<string> ?
// something
unknown : test extends number ? undefined :
// else
undefined;

type T9 = test extends Echo<string>
// something
? unknown : test extends number ? undefined :
// else
undefined;

type T10 =
// comment
test extends Echo<string> ? test extends number ? unknown : unknown : undefined;
74 changes: 74 additions & 0 deletions crates/biome_js_formatter/tests/specs/ts/type/conditional.ts.snap
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
---
source: crates/biome_formatter_test/src/snapshot_builder.rs
assertion_line: 211
info: ts/type/conditional.ts
---
# Input
Expand All @@ -22,6 +23,33 @@ type T4 = test extends string
? unknown : test extends number ? undefined :
// else
undefined;

type T5 =
// comment
test extends string ? test extends number ? unknown : unknown : undefined;

type Echo<T> = T

type T6 = test extends Echo<string> ? test extends number ? unknown : unknown : undefined;

type T7 = test extends Echo<string> ? unknown : test extends number ? undefined : undefined;

type T8 = test extends Echo<string> ?
// something
unknown : test extends number ? undefined :
// else
undefined;

type T9 = test extends Echo<string>
// something
? unknown : test extends number ? undefined :
// else
undefined;

type T10 =
// comment
test extends Echo<string> ? test extends number ? unknown : unknown : undefined;

```


Expand Down Expand Up @@ -79,4 +107,50 @@ type T4 = test extends string
? undefined
: // else
undefined;

type T5 =
// comment
test extends string ? (test extends number ? unknown : unknown) : undefined;

type Echo<T> = T;

type T6 =
test extends Echo<string>
? test extends number
? unknown
: unknown
: undefined;

type T7 =
test extends Echo<string>
? unknown
: test extends number
? undefined
: undefined;

type T8 =
test extends Echo<string>
? // something
unknown
: test extends number
? undefined
: // else
undefined;

type T9 =
test extends Echo<string>
? // something
unknown
: test extends number
? undefined
: // else
undefined;

type T10 =
// comment
test extends Echo<string>
? test extends number
? unknown
: unknown
: undefined;
```