Skip to content

Commit eca09eb

Browse files
authored
Merge pull request #1054 from jpudysz/feature/ts-infer
feat: infer atomic styles from variants
2 parents 19f8fb6 + 78c354c commit eca09eb

File tree

1 file changed

+24
-9
lines changed

1 file changed

+24
-9
lines changed

src/types/breakpoints.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ type ParseNestedObject<T, ShouldFlatten> = T extends (...args: infer A) => infer
2626
? (...args: A) => ParseNestedObject<R, false>
2727
: T extends object
2828
? T extends { variants: infer R, compoundVariants: infer C }
29-
// // if intersection of Base, Variants and Compound Variants is never, then flatten variants and compound variants to generic "string"
3029
? (ParseVariants<FlattenVariants<R, false>> & FlattenCompoundVariants<C, false> & ParseNestedObject<Omit<T, 'variants' | 'compoundVariants'>, false>) extends never
3130
? ParseVariants<FlattenVariants<R, true>> & FlattenCompoundVariants<C, true> & ParseNestedObject<Omit<T, 'variants' | 'compoundVariants'>, false>
3231
: ParseVariants<FlattenVariants<R, false>> & FlattenCompoundVariants<C, false> & ParseNestedObject<Omit<T, 'variants' | 'compoundVariants'>, false>
@@ -69,21 +68,37 @@ type FlattenCompoundVariants<T, ShouldFlatten> = T extends Array<infer _>
6968
? ParseNestedObject<S, ShouldFlatten>
7069
: never
7170

72-
type IsEmptyVariant<T> = T extends object
73-
? keyof T extends never
74-
? true
71+
type IsNonEmpty<T> = T extends object ? (keyof T extends never ? false : true) : false
72+
73+
type IntersectCategoryValues<T> = T extends object
74+
? T extends Array<any>
75+
? T
76+
: UnionToIntersection<T[keyof T]> extends infer R
77+
? R extends never
78+
? T[keyof T]
79+
: R
80+
: never
81+
: never
82+
83+
type MergeVariantCategories<T> = T extends object
84+
? UnionToIntersection<
85+
{
86+
[K in keyof T]: IsNonEmpty<T[K]> extends true ? T[K] : never
87+
}[keyof T]
88+
> extends infer R
89+
? R extends never
90+
? NonNullable<T[keyof T]>
91+
: R
7592
: never
7693
: never
7794

7895
type ParseVariants<T> = T extends object
7996
? T[keyof T] extends object
8097
? T[keyof T] extends Array<any>
8198
? T
82-
: UnionToIntersection<ParseVariants<T[keyof T]>> extends never
83-
? NonNullable<ParseVariants<T[keyof T]>>
84-
: IsEmptyVariant<T[keyof T]> extends never
85-
? ParseVariants<T[keyof T]>
86-
: UnionToIntersection<ParseVariants<T[keyof T]>>
99+
: MergeVariantCategories<{
100+
[K in keyof T]: T[K] extends object ? IntersectCategoryValues<T[K]> : never
101+
}>
87102
: T
88103
: T
89104

0 commit comments

Comments
 (0)