UNPKG

zod-auto-form

Version:

Auto-generate typed React forms from Zod schemas

18 lines (17 loc) 1.31 kB
import type z from "zod"; type Primitive = string | number | boolean | bigint | symbol | null | undefined; type IsPrimitive<T> = T extends Primitive ? true : false; type ArrayIndex = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9; type DeepPaths<T, Level extends number = 0> = T extends ReadonlyArray<infer U> ? Level extends 10 ? never : `[${ArrayIndex}]` | `[${ArrayIndex}].${DeepPaths<U, Level extends 0 ? 1 : Level>}` : T extends object ? { [K in keyof T & (string | number)]: IsPrimitive<T[K]> extends true ? `${K}` : `${K}` | `${K}.${DeepPaths<T[K], Level extends 0 ? 1 : Level>}`; }[keyof T & (string | number)] : never; export type FieldPath<T extends z.ZodSchema> = DeepPaths<z.infer<T>>; export type FieldVisibilityRule<T extends z.ZodSchema> = { sourceFields: FieldPath<T>[]; targetField: FieldPath<T> | FieldPath<T>[]; when: (values: Record<FieldPath<T>, any>) => boolean; type: "hide" | "disable" | "show"; }; export type FieldVisibilityRules<T extends z.ZodSchema> = FieldVisibilityRule<T>[]; export type PathToArray<T extends string> = T extends `${infer First}[${infer Index}].${infer Rest}` ? [First, Index, ...PathToArray<Rest>] : T extends `${infer First}[${infer Index}]` ? [First, Index] : T extends `${infer First}.${infer Rest}` ? [First, ...PathToArray<Rest>] : [T]; export {};