atomaric 0.0.32 → 0.0.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/types/model.d.ts +1 -1
- package/types/paths.ts +109 -0
package/package.json
CHANGED
package/types/model.d.ts
CHANGED
package/types/paths.ts
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
export type Path<T, Sep extends string> = T extends any ? PathInternal<T, Sep> : never;
|
|
2
|
+
// export type PathValue<T, Sep extends string, ValuePath extends Path<T, Sep>> = TPathValue<T, Sep, ValuePath>;
|
|
3
|
+
|
|
4
|
+
/////////////////////////////////////////////////////////////////////////
|
|
5
|
+
/////////////////////////////////////////////////////////////////////////
|
|
6
|
+
/////////////////////////////////////////////////////////////////////////
|
|
7
|
+
/////////////////////////////////////////////////////////////////////////
|
|
8
|
+
/////////////////////////////////////////////////////////////////////////
|
|
9
|
+
/////////////////////////////////////////////////////////////////////////
|
|
10
|
+
/////////////////////////////////////////////////////////////////////////
|
|
11
|
+
/////////////////////////////////////////////////////////////////////////
|
|
12
|
+
|
|
13
|
+
type PathInternal<T, Sep extends string, TraversedTypes = T> = T extends ReadonlyArray<infer V>
|
|
14
|
+
? IsTuple<T> extends true
|
|
15
|
+
? {
|
|
16
|
+
[K in TupleKeys<T>]-?: PathImpl<K & string, Sep, T[K], TraversedTypes>;
|
|
17
|
+
}[TupleKeys<T>]
|
|
18
|
+
: PathImpl<ArrayKey, Sep, V, TraversedTypes>
|
|
19
|
+
: {
|
|
20
|
+
[K in keyof T]-?: PathImpl<K & string, Sep, T[K], TraversedTypes>;
|
|
21
|
+
}[keyof T];
|
|
22
|
+
|
|
23
|
+
export type TupleKeys<T extends ReadonlyArray<any>> = Exclude<keyof T, keyof any[]>;
|
|
24
|
+
|
|
25
|
+
type PathImpl<K extends string | number, Sep extends string, V, TraversedTypes> = V extends
|
|
26
|
+
| Primitive
|
|
27
|
+
| BrowserNativeObject
|
|
28
|
+
? `${K}`
|
|
29
|
+
: true extends AnyIsEqual<TraversedTypes, V>
|
|
30
|
+
? `${K}`
|
|
31
|
+
: `${K}` | `${K}${Sep}${PathInternal<V, Sep, TraversedTypes | V>}`;
|
|
32
|
+
|
|
33
|
+
export type ArrayKey = number;
|
|
34
|
+
export type Primitive = null | undefined | string | number | boolean | symbol | bigint;
|
|
35
|
+
export type IsTuple<T extends ReadonlyArray<any>> = number extends T['length'] ? false : true;
|
|
36
|
+
export type BrowserNativeObject = Date | FileList | File;
|
|
37
|
+
|
|
38
|
+
type AnyIsEqual<T1, T2> = T1 extends T2 ? (IsEqual<T1, T2> extends true ? true : never) : never;
|
|
39
|
+
export type IsEqual<T1, T2> = T1 extends T2
|
|
40
|
+
? (<G>() => G extends T1 ? 1 : 2) extends <G>() => G extends T2 ? 1 : 2
|
|
41
|
+
? true
|
|
42
|
+
: false
|
|
43
|
+
: false;
|
|
44
|
+
|
|
45
|
+
////////////////////////////////////////////////////////////////////////////
|
|
46
|
+
////////////////////////////////////////////////////////////////////////////
|
|
47
|
+
////////////////////////////////////////////////////////////////////////////
|
|
48
|
+
////////////////////////////////////////////////////////////////////////////
|
|
49
|
+
////////////////////////////////////////////////////////////////////////////
|
|
50
|
+
////////////////////////////////////////////////////////////////////////////
|
|
51
|
+
////////////////////////////////////////////////////////////////////////////
|
|
52
|
+
////////////////////////////////////////////////////////////////////////////
|
|
53
|
+
////////////////////////////////////////////////////////////////////////////
|
|
54
|
+
////////////////////////////////////////////////////////////////////////////
|
|
55
|
+
////////////////////////////////////////////////////////////////////////////
|
|
56
|
+
////////////////////////////////////////////////////////////////////////////
|
|
57
|
+
////////////////////////////////////////////////////////////////////////////
|
|
58
|
+
|
|
59
|
+
export type PathValue<T, Sep extends string, P extends Path<T, Sep> | ArrayPath<T, Sep>> = T extends any
|
|
60
|
+
? P extends `${infer K}${Sep}${infer R}`
|
|
61
|
+
? K extends keyof T
|
|
62
|
+
? R extends Path<T[K], Sep>
|
|
63
|
+
? PathValue<T[K], Sep, R>
|
|
64
|
+
: never
|
|
65
|
+
: K extends `${ArrayKey}`
|
|
66
|
+
? T extends ReadonlyArray<infer V>
|
|
67
|
+
? PathValue<V, Sep, R & Path<V, Sep>>
|
|
68
|
+
: never
|
|
69
|
+
: never
|
|
70
|
+
: P extends keyof T
|
|
71
|
+
? T[P]
|
|
72
|
+
: P extends `${ArrayKey}`
|
|
73
|
+
? T extends ReadonlyArray<infer V>
|
|
74
|
+
? V
|
|
75
|
+
: never
|
|
76
|
+
: never
|
|
77
|
+
: never;
|
|
78
|
+
|
|
79
|
+
export type ArrayPath<T, Sep extends string> = T extends any ? ArrayPathInternal<T, Sep> : never;
|
|
80
|
+
|
|
81
|
+
type ArrayPathInternal<T, Sep extends string, TraversedTypes = T> = T extends ReadonlyArray<infer V>
|
|
82
|
+
? IsTuple<T> extends true
|
|
83
|
+
? {
|
|
84
|
+
[K in TupleKeys<T>]-?: ArrayPathImpl<K & string, Sep, T[K], TraversedTypes>;
|
|
85
|
+
}[TupleKeys<T>]
|
|
86
|
+
: ArrayPathImpl<ArrayKey, Sep, V, TraversedTypes>
|
|
87
|
+
: {
|
|
88
|
+
[K in keyof T]-?: ArrayPathImpl<K & string, Sep, T[K], TraversedTypes>;
|
|
89
|
+
}[keyof T];
|
|
90
|
+
|
|
91
|
+
type ArrayPathImpl<K extends string | number, Sep extends string, V, TraversedTypes> = V extends
|
|
92
|
+
| Primitive
|
|
93
|
+
| BrowserNativeObject
|
|
94
|
+
? IsAny<V> extends true
|
|
95
|
+
? string
|
|
96
|
+
: never
|
|
97
|
+
: V extends ReadonlyArray<infer U>
|
|
98
|
+
? U extends Primitive | BrowserNativeObject
|
|
99
|
+
? IsAny<V> extends true
|
|
100
|
+
? string
|
|
101
|
+
: never
|
|
102
|
+
: true extends AnyIsEqual<TraversedTypes, V>
|
|
103
|
+
? never
|
|
104
|
+
: `${K}` | `${K}${Sep}${ArrayPathInternal<V, Sep, TraversedTypes | V>}`
|
|
105
|
+
: true extends AnyIsEqual<TraversedTypes, V>
|
|
106
|
+
? never
|
|
107
|
+
: `${K}${Sep}${ArrayPathInternal<V, Sep, TraversedTypes | V>}`;
|
|
108
|
+
|
|
109
|
+
export type IsAny<T> = 0 extends 1 & T ? true : false;
|