1 | import { FieldValues } from '../fields';
|
2 | import { BrowserNativeObject, IsAny, IsEqual, Primitive } from '../utils';
|
3 | import { ArrayKey, IsTuple, TupleKeys } from './common';
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 | type AnyIsEqual<T1, T2> = T1 extends T2 ? IsEqual<T1, T2> extends true ? true : never : never;
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 | type PathImpl<K extends string | number, V, TraversedTypes> = V extends Primitive | BrowserNativeObject ? `${K}` : true extends AnyIsEqual<TraversedTypes, V> ? `${K}` : `${K}` | `${K}.${PathInternal<V, TraversedTypes | V>}`;
|
18 |
|
19 |
|
20 |
|
21 |
|
22 |
|
23 |
|
24 | type PathInternal<T, TraversedTypes = T> = T extends ReadonlyArray<infer V> ? IsTuple<T> extends true ? {
|
25 | [K in TupleKeys<T>]-?: PathImpl<K & string, T[K], TraversedTypes>;
|
26 | }[TupleKeys<T>] : PathImpl<ArrayKey, V, TraversedTypes> : {
|
27 | [K in keyof T]-?: PathImpl<K & string, T[K], TraversedTypes>;
|
28 | }[keyof T];
|
29 |
|
30 |
|
31 |
|
32 |
|
33 |
|
34 |
|
35 |
|
36 |
|
37 | export type Path<T> = T extends any ? PathInternal<T> : never;
|
38 |
|
39 |
|
40 |
|
41 | export type FieldPath<TFieldValues extends FieldValues> = Path<TFieldValues>;
|
42 |
|
43 |
|
44 |
|
45 |
|
46 |
|
47 |
|
48 |
|
49 | type ArrayPathImpl<K extends string | number, V, TraversedTypes> = V extends Primitive | BrowserNativeObject ? IsAny<V> extends true ? string : never : V extends ReadonlyArray<infer U> ? U extends Primitive | BrowserNativeObject ? IsAny<V> extends true ? string : never : true extends AnyIsEqual<TraversedTypes, V> ? never : `${K}` | `${K}.${ArrayPathInternal<V, TraversedTypes | V>}` : true extends AnyIsEqual<TraversedTypes, V> ? never : `${K}.${ArrayPathInternal<V, TraversedTypes | V>}`;
|
50 |
|
51 |
|
52 |
|
53 |
|
54 |
|
55 |
|
56 | type ArrayPathInternal<T, TraversedTypes = T> = T extends ReadonlyArray<infer V> ? IsTuple<T> extends true ? {
|
57 | [K in TupleKeys<T>]-?: ArrayPathImpl<K & string, T[K], TraversedTypes>;
|
58 | }[TupleKeys<T>] : ArrayPathImpl<ArrayKey, V, TraversedTypes> : {
|
59 | [K in keyof T]-?: ArrayPathImpl<K & string, T[K], TraversedTypes>;
|
60 | }[keyof T];
|
61 |
|
62 |
|
63 |
|
64 |
|
65 |
|
66 |
|
67 |
|
68 |
|
69 |
|
70 | export type ArrayPath<T> = T extends any ? ArrayPathInternal<T> : never;
|
71 |
|
72 |
|
73 |
|
74 | export type FieldArrayPath<TFieldValues extends FieldValues> = ArrayPath<TFieldValues>;
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 |
|
81 |
|
82 |
|
83 |
|
84 |
|
85 | export type PathValue<T, P extends Path<T> | ArrayPath<T>> = T extends any ? P extends `${infer K}.${infer R}` ? K extends keyof T ? R extends Path<T[K]> ? PathValue<T[K], R> : never : K extends `${ArrayKey}` ? T extends ReadonlyArray<infer V> ? PathValue<V, R & Path<V>> : never : never : P extends keyof T ? T[P] : P extends `${ArrayKey}` ? T extends ReadonlyArray<infer V> ? V : never : never : never;
|
86 |
|
87 |
|
88 |
|
89 | export type FieldPathValue<TFieldValues extends FieldValues, TFieldPath extends FieldPath<TFieldValues>> = PathValue<TFieldValues, TFieldPath>;
|
90 |
|
91 |
|
92 |
|
93 | export type FieldArrayPathValue<TFieldValues extends FieldValues, TFieldArrayPath extends FieldArrayPath<TFieldValues>> = PathValue<TFieldValues, TFieldArrayPath>;
|
94 |
|
95 |
|
96 |
|
97 |
|
98 |
|
99 |
|
100 |
|
101 |
|
102 |
|
103 |
|
104 | export type FieldPathValues<TFieldValues extends FieldValues, TPath extends FieldPath<TFieldValues>[] | readonly FieldPath<TFieldValues>[]> = {} & {
|
105 | [K in keyof TPath]: FieldPathValue<TFieldValues, TPath[K] & FieldPath<TFieldValues>>;
|
106 | };
|
107 |
|
108 |
|
109 |
|
110 |
|
111 |
|
112 |
|
113 |
|
114 |
|
115 |
|
116 |
|
117 | export type FieldPathByValue<TFieldValues extends FieldValues, TValue> = {
|
118 | [Key in FieldPath<TFieldValues>]: FieldPathValue<TFieldValues, Key> extends TValue ? Key : never;
|
119 | }[FieldPath<TFieldValues>];
|
120 | export {};
|
121 |
|
\ | No newline at end of file |