UNPKG

sveltekit-superforms

Version:

Making SvelteKit validation and displaying of forms easier than ever!

43 lines (42 loc) 3.13 kB
import type { FieldPath } from './index.js'; export declare function splitPath<T extends object>(path: string): FieldPath<T>; export declare function mergePath(path: (string | number | symbol)[]): string; /** * Lists all paths in an object as string accessors. */ export type FormPath<T extends object> = (string & StringPath<T>) | FormPathLeaves<T>; /** * Like FormPath, but only with non-objects as accessible properties. * Similar to the leaves in a node tree, if you look at the object as a tree structure. */ export type FormPathLeaves<T extends object> = string & StringPathLeaves<T>; export type StringPath<T extends object> = NonNullable<T> extends (infer U)[] ? NonNullable<U> extends object ? `[${number}]` | `[${number}]${U extends unknown[] ? '' : '.'}${NonNullable<U> extends Date | Set<unknown> ? never : StringPath<NonNullable<U>> & string}` : `[${number}]` | `[${number}].${U & string}` : NonNullable<T> extends object ? keyof T | { [K in keyof T]-?: K extends string ? NonNullable<T[K]> extends object ? `${K}${NonNullable<T[K]> extends unknown[] ? '' : '.'}${NonNullable<T[K]> extends Date | Set<unknown> ? never : StringPath<NonNullable<T[K]>> & string}` : never : never; }[keyof T] : never; export type StringPathLeaves<T extends object, Arr extends string = never> = NonNullable<T> extends (infer U)[] ? NonNullable<U> extends object ? (Arr extends never ? never : `.${Arr}`) | `[${number}]${NonNullable<U> extends unknown[] ? '' : '.'}${StringPathLeaves<NonNullable<U>, Arr> & string}` : `[${number}]` | (Arr extends never ? never : `.${Arr}`) : NonNullable<T> extends object ? { [K in keyof T]: NonNullable<T[K]> extends object ? NonNullable<T[K]> extends Date | Set<unknown> ? K : never : K; }[keyof T] | { [K in keyof T]-?: K extends string ? NonNullable<T[K]> extends object ? `${K}${NonNullable<T[K]> extends unknown[] ? '' : '.'}${StringPathLeaves<NonNullable<T[K]>, Arr> & string}` : never : never; }[keyof T] : never; export type FormPathType<T, P extends string> = P extends keyof T ? T[P] : P extends number ? T : P extends `.${infer Rest}` ? FormPathType<NonNullable<T>, Rest> : P extends `${number}]${infer Rest}` ? NonNullable<T> extends (infer U)[] ? FormPathType<U, Rest> : { invalid_path: P; Type: T; } : P extends `${infer K}[${infer Rest}` ? K extends keyof NonNullable<T> ? FormPathType<NonNullable<T>[K], Rest> : FormPathType<T, Rest> : P extends `${infer K}.${infer Rest}` ? K extends keyof NonNullable<T> ? FormPathType<NonNullable<T>[K], Rest> : NonNullable<T> extends (infer U)[] ? FormPathType<U, Rest> : { invalid_path: P; Type: T; } : P extends `[${infer K}].${infer Rest}` ? K extends number ? T extends (infer U)[] ? FormPathType<U, Rest> : { invalid_path: P; Type: T; } : P extends `${number}` ? NonNullable<T> extends (infer U)[] ? U : { invalid_path: P; Type: T; } : P extends keyof NonNullable<T> ? NonNullable<T>[P] : P extends `${number}` ? NonNullable<T> extends (infer U)[] ? U : { invalid_path: P; Type: T; } : { invalid_path: P; Type: T; } : P extends '' ? T : { invalid_path: P; Type: T; };