import type { ColorValue, OpaqueColorValue } from 'react-native' import type { SafeReturnType, UnionToIntersection } from './common' import type { TransformStyles } from './core' import type { BreakpointsOrMediaQueries, ToDeepUnistyles } from './stylesheet' type ExtractTransformArray = T extends object ? { [K in keyof T]: ExtractBreakpoints } : never type ExtractBreakpoints = T extends object ? keyof T extends BreakpointsOrMediaQueries ? T[keyof T] : T extends Array> ? Array> : T extends Array ? T : { [K in keyof T]: ExtractBreakpoints } : T // Helper type to check if the base styles (without variants) are truly empty or just {} type IsEmptyObject = T extends Record ? true : keyof T extends never ? true : false type ParseNestedObject = T extends (...args: infer A) => infer R ? (...args: A) => ParseNestedObject : T extends object ? T extends { variants: infer R; compoundVariants: infer C } ? ParseVariants> & FlattenCompoundVariants & ParseNestedObject, false> extends never ? ParseVariants> & FlattenCompoundVariants & ParseNestedObject, false> : ParseVariants> & FlattenCompoundVariants & ParseNestedObject, false> : T extends { variants: infer R } ? IsEmptyObject, false>> extends true ? ParseVariants> : ParseVariants> & ParseNestedObject, false> extends never ? ParseVariants> & ParseNestedObject, false> : ParseVariants> & ParseNestedObject, false> : T extends { compoundVariants: object } ? ParseNestedObject, false> : { [K in keyof T as K extends '_web' ? never : K]: T[K] extends object ? T[K] extends OpaqueColorValue ? ColorValue : ExtractBreakpoints : T[K] extends string ? ShouldFlatten extends true ? string : T[K] : T[K] } : T type FlattenVariants = T extends object ? { [K in keyof T]: T[K] extends object ? { [key in keyof T[K]]: T[K][key] extends object ? ParseNestedObject : never } : never } : never type FlattenCompoundVariants = T extends Array ? FlattenCompoundVariants : T extends { styles: infer S } ? ParseNestedObject : never type IsNonEmpty = T extends object ? (keyof T extends never ? false : true) : false type IntersectCategoryValues = T extends object ? T extends Array ? T : UnionToIntersection extends infer R ? R extends never ? T[keyof T] : R : never : never type MergeVariantCategories = T extends object ? UnionToIntersection< { [K in keyof T]: IsNonEmpty extends true ? T[K] : never }[keyof T] > extends infer R ? R extends never ? NonNullable : R : never : never type ParseVariants = T extends object ? T[keyof T] extends object ? T[keyof T] extends Array ? T : MergeVariantCategories<{ [K in keyof T]: T[K] extends object ? IntersectCategoryValues : never }> : T : T type ParseStyleKeys = T extends object ? { [K in keyof T]: ParseNestedObject } : never export type ReactNativeStyleSheet = ParseStyleKeys>