import type { ArrayKey, BrowserNativeObject, IsTuple, Primitive, TupleKeys } from "./pathCommon"; export type FieldValues = Record; type PathImpl = V extends Primitive | BrowserNativeObject ? `${K}` : `${K}` | `${K}.${Path}`; export type Path = T extends ReadonlyArray ? IsTuple extends true ? { [K in TupleKeys]-?: PathImpl; }[TupleKeys] : PathImpl : { [K in keyof T]-?: PathImpl; }[keyof T]; export type FieldPath = Path; type ArrayPathImpl = V extends Primitive | BrowserNativeObject ? never : V extends ReadonlyArray ? U extends Primitive | BrowserNativeObject ? never : `${K}` | `${K}.${ArrayPath}` : `${K}.${ArrayPath}`; export type ArrayPath = T extends ReadonlyArray ? IsTuple extends true ? { [K in TupleKeys]-?: ArrayPathImpl; }[TupleKeys] : ArrayPathImpl : { [K in keyof T]-?: ArrayPathImpl; }[keyof T]; export type FieldArrayPath = ArrayPath; export type PathValue | ArrayPath> = T extends any ? P extends `${infer K}.${infer R}` ? K extends keyof T ? R extends Path ? PathValue : never : K extends `${ArrayKey}` ? T extends ReadonlyArray ? PathValue> : never : never : P extends keyof T ? T[P] : P extends `${ArrayKey}` ? T extends ReadonlyArray ? V : never : never : never; export type FieldPathValue> = PathValue; export type FieldArrayPathValue> = PathValue; export type FieldPathValues[] | readonly FieldPath[]> = {} & { [K in keyof TPath]: FieldPathValue>; }; export type FieldPathByValue = { [Key in FieldPath]: FieldPathValue extends TValue ? Key : never; }[FieldPath]; export {};