import type { ColorValue, OpaqueColorValue } from 'react-native' import type { SafeReturnType } 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> : { [K in keyof T]: ExtractBreakpoints } : T type ParseNestedObject = T extends (...args: infer A) => infer R ? (...args: A) => ParseNestedObject : T extends object ? T extends { variants: infer R, compoundVariants: infer C } // // if intersection of Base, Variants and Compound Variants is never, then flatten variants and compound variants to generic "string" ? (ParseVariants> & FlattenCompoundVariants & ParseNestedObject, false>) extends never ? ParseVariants> & FlattenCompoundVariants & ParseNestedObject, false> : ParseVariants> & FlattenCompoundVariants & ParseNestedObject, false> : T extends { variants: infer R } // if intersection of Base and Variants is never, then flatten variants to generic "string" ? (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 ParseVariants = T extends object ? T[keyof T] extends object ? UnionToIntersection> extends never ? ParseVariants : UnionToIntersection> : T : T type UnionToIntersection = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never type ParseStyleKeys = T extends object ? { [K in keyof T]: ParseNestedObject } : never export type ReactNativeStyleSheet = ParseStyleKeys>