11import type { FieldPath } from './index.js' ;
22
3- export function splitPath < T extends object > ( path : StringPath < T > ) {
3+ /*
4+ type Expand<T> = T extends (...args: infer A) => infer R
5+ ? (...args: Expand<A>) => Expand<R>
6+ : T extends infer O
7+ ? { [K in keyof O]: O[K] }
8+ : never;
9+
10+ type ExpandRecursively<T> = T extends (...args: infer A) => infer R
11+ ? (...args: ExpandRecursively<A>) => ExpandRecursively<R>
12+ : T extends object
13+ ? T extends infer O
14+ ? { [K in keyof O]: ExpandRecursively<O[K]> }
15+ : never
16+ : T;
17+
18+ type FilterObjects<T extends object> = {
19+ [K in keyof T]: T[K] extends object ? never : K;
20+ }[keyof T];
21+ */
22+
23+ export function splitPath < T extends object > (
24+ path : StringPath < T > | StringPathLeaves < T >
25+ ) {
426 return path
527 . toString ( )
628 . split ( / [ [ \] . ] + / )
729 . filter ( ( p ) => p ) as FieldPath < T > ;
830}
931
32+ /**
33+ * Lists all paths in an object as string accessors.
34+ */
1035export type StringPath < T extends object > = NonNullable < T > extends ( infer U ) [ ]
1136 ? NonNullable < U > extends object
1237 ?
@@ -33,6 +58,38 @@ export type StringPath<T extends object> = NonNullable<T> extends (infer U)[]
3358 } [ keyof T ]
3459 : never ;
3560
61+ /**
62+ * Like StringPath, but only with non-objects as accessible properties.
63+ * As the leaves in a node tree, if you look at the object as a tree structure.
64+ */
65+ export type StringPathLeaves < T extends object > =
66+ NonNullable < T > extends ( infer U ) [ ]
67+ ? NonNullable < U > extends object
68+ ? `[${number } ]${U extends unknown [ ]
69+ ? ''
70+ : '.' } ${NonNullable < U > extends Date
71+ ? never
72+ : StringPathLeaves < NonNullable < U > > & string } `
73+ : `[${number } ]`
74+ : NonNullable < T > extends object
75+ ?
76+ | {
77+ // Same as FilterObjects but inlined for better intellisense
78+ [ K in keyof T ] : T [ K ] extends object ? never : K ;
79+ } [ keyof T ]
80+ | {
81+ [ K in keyof T ] -?: K extends string
82+ ? NonNullable < T [ K ] > extends object
83+ ? `${K } ${NonNullable < T [ K ] > extends unknown [ ]
84+ ? ''
85+ : '.' } ${NonNullable < T [ K ] > extends Date
86+ ? never
87+ : StringPathLeaves < NonNullable < T [ K ] > > & string } `
88+ : never
89+ : never ;
90+ } [ keyof T ]
91+ : never ;
92+
3693export type StringPathType < T , P extends string > = P extends keyof T
3794 ? T [ P ]
3895 : P extends number
0 commit comments