ts-gems 2.4.1 → 2.6.0

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.
@@ -0,0 +1,19 @@
1
+ import { IsDeepExcluded } from './helpers.js';
2
+
3
+ /**
4
+ * Combination of Partial and Writable but deeply
5
+ */
6
+ export type DeepBuildable<T> = _DeepBuildable<T>;
7
+ type _DeepBuildable<T> =
8
+ IsDeepExcluded<T> extends true ? T
9
+ : { -readonly [P in keyof T]?: _DeepBuildable<Exclude<T[P], undefined>> };
10
+
11
+ /**
12
+ * Combination of Partial and Writable but deeply including arrays
13
+ */
14
+ export type HighDeepBuildable<T> = _HighDeepBuildable<T>;
15
+ type _HighDeepBuildable<T> =
16
+ T extends (infer U)[] ? _HighDeepBuildable<U>[]
17
+ : IsDeepExcluded<T> extends true ? T
18
+ : T extends (infer U)[] ? _HighDeepBuildable<U>[]
19
+ : { -readonly [P in keyof T]?: _HighDeepBuildable<Exclude<T[P], undefined>> };
@@ -0,0 +1,21 @@
1
+ import { DeepRequired, HighDeepRequired } from './deep-required.js';
2
+ import { IsDeepExcluded } from './helpers.js';
3
+
4
+ /**
5
+ * Make all properties in T nullable deeply
6
+ */
7
+ export type DeepNullish<T> = _DeepNullish<DeepRequired<T>>;
8
+ type _DeepNullish<T> =
9
+ IsDeepExcluded<T> extends true ? T
10
+ : { [P in keyof T]: _DeepNullish<Exclude<T[P], undefined>> | null | undefined };
11
+
12
+
13
+ /**
14
+ * Make all properties in T nullable deeply including arrays
15
+ */
16
+ export type HighDeepNullish<T> = _HighDeepNullish<HighDeepRequired<T>>;
17
+ type _HighDeepNullish<T> =
18
+ T extends (infer U)[] ? _HighDeepNullish<U>[]
19
+ : IsDeepExcluded<T> extends true ? T
20
+ : { [P in keyof T]: _HighDeepNullish<Exclude<T[P], undefined>> | null | undefined };
21
+
@@ -1,88 +1,76 @@
1
- import { Builtin } from './common';
2
- import { IfTuple } from './type-check';
3
- import { JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys } from './keys';
1
+ import { IsDeepExcluded } from './helpers.js';
2
+ import { OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys } from './keys';
4
3
 
5
4
  /**
6
5
  * Omit all optional properties in T deeply
7
6
  */
8
7
  export type DeepOmitOptional<T> = _DeepOmitOptional<T>;
9
8
  type _DeepOmitOptional<T, K extends keyof T = Exclude<keyof T, OptionalKeys<T>>> =
10
- T extends Builtin ? T
11
- : T extends Promise<infer U> ? Promise<DeepOmitOptional<U>>
12
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitOptional<V>>
13
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitOptional<V>>
14
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitOptional<V>>
15
- : T extends Set<infer U> ? Set<DeepOmitOptional<U>>
16
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitOptional<U>>
17
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitOptional<U>>
18
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitOptional<T[K]> }
19
- : T extends (infer U)[] ? DeepOmitOptional<U>[]
20
- : { [P in K]: DeepOmitOptional<Exclude<T[P], undefined>> };
9
+ IsDeepExcluded<T> extends true ? T
10
+ : { [P in K]: _DeepOmitOptional<Exclude<T[P], undefined>> };
11
+
12
+ /**
13
+ * Omit all optional properties in T deeply including arrays
14
+ */
15
+ export type HighDeepOmitOptional<T> = _HighDeepOmitOptional<T>;
16
+ type _HighDeepOmitOptional<T, K extends keyof T = Exclude<keyof T, OptionalKeys<T>>> =
17
+ T extends (infer U)[] ? _HighDeepOmitOptional<U>[]
18
+ : IsDeepExcluded<T> extends true ? T
19
+ : { [P in K]: _HighDeepOmitOptional<Exclude<T[P], undefined>> };
20
+
21
21
 
22
22
  /**
23
23
  * Omit all required properties in T deeply
24
24
  */
25
25
  export type DeepOmitRequired<T> = _DeepOmitRequired<T>;
26
26
  type _DeepOmitRequired<T, J extends keyof T = Exclude<keyof T, RequiredKeys<T>>> =
27
- T extends Builtin ? T
28
- : T extends Promise<infer U> ? Promise<DeepOmitRequired<U>>
29
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitRequired<V>>
30
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitRequired<V>>
31
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitRequired<V>>
32
- : T extends Set<infer U> ? Set<DeepOmitRequired<U>>
33
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitRequired<U>>
34
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitRequired<U>>
35
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitRequired<T[K]> }
36
- : T extends (infer U)[] ? DeepOmitRequired<U>[]
37
- : { [P in J]: DeepOmitRequired<Exclude<T[P], undefined>> };
27
+ IsDeepExcluded<T> extends true ? T
28
+ : { [P in J]: _DeepOmitRequired<Exclude<T[P], undefined>> };
29
+
30
+
31
+ /**
32
+ * Omit all required properties in T deeply including arrays
33
+ */
34
+ export type HighDeepOmitRequired<T> = _HighDeepOmitRequired<T>;
35
+ type _HighDeepOmitRequired<T, J extends keyof T = Exclude<keyof T, RequiredKeys<T>>> =
36
+ T extends (infer U)[] ? _HighDeepOmitRequired<U>[]
37
+ : IsDeepExcluded<T> extends true ? T
38
+ : { [P in J]: _HighDeepOmitRequired<Exclude<T[P], undefined>> };
39
+
38
40
 
39
41
  /**
40
42
  * Omit all readonly properties in T deeply
41
43
  */
42
44
  export type DeepOmitReadonly<T> = _DeepOmitReadonly<T>;
43
45
  type _DeepOmitReadonly<T, J extends keyof T = Exclude<keyof T, ReadonlyKeys<T>>> =
44
- T extends Builtin ? T
45
- : T extends Promise<infer U> ? Promise<DeepOmitReadonly<U>>
46
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitReadonly<V>>
47
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitReadonly<V>>
48
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitReadonly<V>>
49
- : T extends Set<infer U> ? Set<DeepOmitReadonly<U>>
50
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitReadonly<U>>
51
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitReadonly<U>>
52
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitReadonly<T[K]> }
53
- : T extends (infer U)[] ? DeepOmitReadonly<U>[]
54
- : { [P in J]: DeepOmitReadonly<Exclude<T[P], undefined>> };
46
+ IsDeepExcluded<T> extends true ? T
47
+ : { [P in J]: _DeepOmitReadonly<Exclude<T[P], undefined>> };
48
+
49
+
50
+ /**
51
+ * Omit all readonly properties in T deeply including arrays
52
+ */
53
+ export type HighDeepOmitReadonly<T> = _HighDeepOmitReadonly<T>;
54
+ type _HighDeepOmitReadonly<T, J extends keyof T = Exclude<keyof T, ReadonlyKeys<T>>> =
55
+ T extends (infer U)[] ? _HighDeepOmitReadonly<U>[]
56
+ : IsDeepExcluded<T> extends true ? T
57
+ : { [P in J]: _HighDeepOmitReadonly<Exclude<T[P], undefined>> };
58
+
55
59
 
56
60
  /**
57
61
  * Omit all writable properties in T deeply
58
62
  */
59
63
  export type DeepOmitWritable<T> = _DeepOmitWritable<T>
60
64
  type _DeepOmitWritable<T, K extends keyof T = Exclude<keyof T, WritableKeys<T>>> =
61
- T extends Builtin ? T
62
- : T extends Promise<infer U> ? Promise<DeepOmitWritable<U>>
63
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitWritable<V>>
64
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitWritable<V>>
65
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitWritable<V>>
66
- : T extends Set<infer U> ? Set<DeepOmitWritable<U>>
67
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitWritable<U>>
68
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitWritable<U>>
69
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitWritable<T[K]> }
70
- : T extends (infer U)[] ? DeepOmitWritable<U>[]
71
- : { [P in K]: DeepOmitWritable<Exclude<T[P], undefined>> }
65
+ IsDeepExcluded<T> extends true ? T
66
+ : { [P in K]: _DeepOmitWritable<Exclude<T[P], undefined>> }
67
+
72
68
 
73
69
  /**
74
- * Omit all JSON friendly properties in T deeply
70
+ * Omit all writable properties in T deeply including arrays
75
71
  */
76
- export type DeepOmitJson<T> = _DeepOmitJson<T>
77
- type _DeepOmitJson<T, K extends keyof T = Exclude<keyof T, JsonKeys<T>>> =
78
- T extends Builtin ? T
79
- : T extends Promise<infer U> ? Promise<DeepOmitJson<U>>
80
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitJson<V>>
81
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitJson<V>>
82
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitJson<V>>
83
- : T extends Set<infer U> ? Set<DeepOmitJson<U>>
84
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitJson<U>>
85
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitJson<U>>
86
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitJson<T[K]> }
87
- : T extends (infer U)[] ? DeepOmitJson<U>[]
88
- : { [P in K]: DeepOmitJson<Exclude<T[P], undefined>> };
72
+ export type HighDeepOmitWritable<T> = _HighDeepOmitWritable<T>
73
+ type _HighDeepOmitWritable<T, K extends keyof T = Exclude<keyof T, WritableKeys<T>>> =
74
+ T extends (infer U)[] ? _HighDeepOmitWritable<U>[]
75
+ : IsDeepExcluded<T> extends true ? T
76
+ : { [P in K]: _HighDeepOmitWritable<Exclude<T[P], undefined>> }
@@ -0,0 +1,18 @@
1
+ import { IsDeepExcluded } from './helpers.js';
2
+
3
+ /**
4
+ * Partial but deeply
5
+ */
6
+ export type DeepPartial<T> = _DeepPartial<T>;
7
+ type _DeepPartial<T> =
8
+ IsDeepExcluded<T> extends true ? T
9
+ : { [P in keyof T]?: _DeepPartial<Exclude<T[P], undefined>> };
10
+
11
+ /**
12
+ * Partial but deeply including arrays
13
+ */
14
+ export type HighDeepPartial<T> = _HighDeepPartial<T>;
15
+ type _HighDeepPartial<T> =
16
+ T extends (infer U)[] ? _HighDeepPartial<U>[]
17
+ : IsDeepExcluded<T> extends true ? T
18
+ : { [P in keyof T]?: _HighDeepPartial<Exclude<T[P], undefined>> };
@@ -1,5 +1,4 @@
1
- import { Builtin } from './common';
2
- import { IfClass, IfTuple } from './type-check';
1
+ import { IsDeepExcluded } from './helpers.js';
3
2
  import { JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys } from './keys';
4
3
 
5
4
  /**
@@ -7,72 +6,36 @@ import { JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys } from
7
6
  */
8
7
  export type DeepPickOptional<T> = _DeepPickOptional<T>;
9
8
  type _DeepPickOptional<T, K extends keyof T = OptionalKeys<T>> =
10
- T extends Builtin ? T
11
- : IfTuple<T> extends true ? T
12
- : IfClass<T> extends true ? T
13
- : T extends Promise<infer U> ? Promise<DeepPickOptional<U>>
14
- : T extends Map<any, any> ? T
15
- : T extends ReadonlyMap<any, any> ? T
16
- : T extends WeakMap<any, any> ? T
17
- : T extends Set<any> ? T
18
- : T extends ReadonlySet<any> ? T
19
- : T extends WeakSet<any> ? T
20
- : T extends any[] ? T
21
- : { [P in K]?: DeepPickOptional<Exclude<T[P], undefined>> };
9
+ IsDeepExcluded<T> extends true ? T
10
+ : { [P in K]?: _DeepPickOptional<Exclude<T[P], undefined>> };
22
11
 
23
12
  /**
24
- * Pick all optional properties in T deeply
13
+ * Pick all optional properties in T deeply including arrays
25
14
  */
26
- export type StrictDeepPickOptional<T> = _StrictDeepPickOptional<T>;
27
- type _StrictDeepPickOptional<T, K extends keyof T = OptionalKeys<T>> =
28
- T extends Builtin ? T
29
- : IfTuple<T> extends true ? T
30
- : IfClass<T> extends true ? T
31
- : T extends Promise<infer U> ? Promise<StrictDeepPickOptional<U>>
32
- : T extends Map<infer K, infer V> ? Map<K, StrictDeepPickOptional<V>>
33
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, StrictDeepPickOptional<V>>
34
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, StrictDeepPickOptional<V>>
35
- : T extends Set<infer U> ? Set<StrictDeepPickOptional<U>>
36
- : T extends ReadonlySet<infer U> ? ReadonlySet<StrictDeepPickOptional<U>>
37
- : T extends WeakSet<infer U> ? WeakSet<StrictDeepPickOptional<U>>
38
- : T extends (infer U)[] ? StrictDeepPickOptional<U>[]
39
- : { [P in K]?: StrictDeepPickOptional<Exclude<T[P], undefined>> };
15
+ export type HighDeepPickOptional<T> = _HighDeepPickOptional<T>;
16
+ type _HighDeepPickOptional<T, K extends keyof T = OptionalKeys<T>> =
17
+ T extends (infer U)[] ? _HighDeepPickOptional<U>[]
18
+ : IsDeepExcluded<T> extends true ? T
19
+ : { [P in K]?: _HighDeepPickOptional<Exclude<T[P], undefined>> };
20
+
40
21
 
41
22
  /**
42
- * Pick all required properties in T deeply even in Maps, Sets etc
23
+ * Pick all required properties in T deeply
43
24
  */
44
25
  export type DeepPickRequired<T> = _DeepPickRequired<T>;
45
26
  type _DeepPickRequired<T, J extends keyof T = RequiredKeys<T>> =
46
- T extends Builtin ? T
47
- : IfTuple<T> extends true ? T
48
- : IfClass<T> extends true ? T
49
- : T extends Promise<infer U> ? Promise<DeepPickRequired<U>>
50
- : T extends Map<any, any> ? T
51
- : T extends ReadonlyMap<any, any> ? T
52
- : T extends WeakMap<any, any> ? T
53
- : T extends Set<any> ? T
54
- : T extends ReadonlySet<any> ? T
55
- : T extends WeakSet<any> ? T
56
- : T extends any[] ? T
57
- : { [P in J]-?: DeepPickRequired<Exclude<T[P], undefined>> };
27
+ IsDeepExcluded<T> extends true ? T
28
+ : { [P in J]-?: DeepPickRequired<Exclude<T[P], undefined>> };
29
+
58
30
 
59
31
  /**
60
- * Pick all required properties in T deeply even in Maps, Sets etc
32
+ * Pick all required properties in T deeply including arrays
61
33
  */
62
- export type StrictDeepPickRequired<T> = _StrictDeepPickRequired<T>;
63
- type _StrictDeepPickRequired<T, J extends keyof T = RequiredKeys<T>> =
64
- T extends Builtin ? T
65
- : IfTuple<T> extends true ? T
66
- : IfClass<T> extends true ? T
67
- : T extends Promise<infer U> ? Promise<StrictDeepPickRequired<U>>
68
- : T extends Map<infer K, infer V> ? Map<K, StrictDeepPickRequired<V>>
69
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, StrictDeepPickRequired<V>>
70
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, StrictDeepPickRequired<V>>
71
- : T extends Set<infer U> ? Set<StrictDeepPickRequired<U>>
72
- : T extends ReadonlySet<infer U> ? ReadonlySet<StrictDeepPickRequired<U>>
73
- : T extends WeakSet<infer U> ? WeakSet<StrictDeepPickRequired<U>>
74
- : T extends (infer U)[] ? StrictDeepPickRequired<U>[]
75
- : { [P in J]-?: StrictDeepPickRequired<Exclude<T[P], undefined>> };
34
+ export type HighDeepPickRequired<T> = _HighDeepPickRequired<T>;
35
+ type _HighDeepPickRequired<T, J extends keyof T = RequiredKeys<T>> =
36
+ T extends (infer U)[] ? _HighDeepPickRequired<U>[]
37
+ : IsDeepExcluded<T> extends true ? T
38
+ : { [P in J]-?: _HighDeepPickRequired<Exclude<T[P], undefined>> };
76
39
 
77
40
 
78
41
  /**
@@ -80,87 +43,42 @@ type _StrictDeepPickRequired<T, J extends keyof T = RequiredKeys<T>> =
80
43
  */
81
44
  export type DeepPickReadonly<T> = _DeepPickReadonly<T>;
82
45
  type _DeepPickReadonly<T, K extends keyof T = ReadonlyKeys<T>> =
83
- T extends Builtin ? T
84
- : IfTuple<T> extends true ? T
85
- : IfClass<T> extends true ? T
86
- : T extends Promise<infer U> ? Promise<DeepPickReadonly<U>>
87
- : T extends Map<any, any> ? T
88
- : T extends ReadonlyMap<any, any> ? T
89
- : T extends WeakMap<any, any> ? T
90
- : T extends Set<any> ? T
91
- : T extends ReadonlySet<any> ? T
92
- : T extends WeakSet<any> ? T
93
- : T extends any[] ? T
94
- : { [P in K]: DeepPickReadonly<Exclude<T[P], undefined>> };
46
+ IsDeepExcluded<T> extends true ? T
47
+ : { [P in K]: DeepPickReadonly<Exclude<T[P], undefined>> };
95
48
 
96
49
  /**
97
- * Pick all readonly properties in T deeply even in Maps, Sets etc
50
+ * Pick all readonly properties in T deeply including arrays
98
51
  */
99
- export type StrictDeepPickReadonly<T> = _StrictDeepPickReadonly<T>;
100
- type _StrictDeepPickReadonly<T, J extends keyof T = ReadonlyKeys<T>> =
101
- T extends Builtin ? T
102
- // : IfTuple<T> extends true ? T
103
- // : IfClass<T> extends true ? T
104
- : T extends Promise<infer U> ? Promise<StrictDeepPickReadonly<U>>
105
- : T extends Map<infer K, infer V> ? Map<K, StrictDeepPickReadonly<V>>
106
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, StrictDeepPickReadonly<V>>
107
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, StrictDeepPickReadonly<V>>
108
- : T extends Set<infer U> ? Set<StrictDeepPickReadonly<U>>
109
- : T extends ReadonlySet<infer U> ? ReadonlySet<StrictDeepPickReadonly<U>>
110
- : T extends WeakSet<infer U> ? WeakSet<StrictDeepPickReadonly<U>>
111
- : T extends (infer U)[] ? StrictDeepPickReadonly<U>[]
112
- : { [P in J]: StrictDeepPickReadonly<Exclude<T[P], undefined>> };
52
+ export type HighDeepPickReadonly<T> = _HighDeepPickReadonly<T>;
53
+ type _HighDeepPickReadonly<T, K extends keyof T = ReadonlyKeys<T>> =
54
+ T extends (infer U)[] ? _HighDeepPickReadonly<U>[]
55
+ : IsDeepExcluded<T> extends true ? T
56
+ : { [P in K]: _HighDeepPickReadonly<Exclude<T[P], undefined>> };
57
+
113
58
 
114
59
  /**
115
60
  * Pick all writable properties in T deeply
116
61
  */
117
62
  export type DeepPickWritable<T> = _DeepPickWritable<T>;
118
63
  type _DeepPickWritable<T, K extends keyof T = WritableKeys<T>> =
119
- T extends Builtin ? T
120
- : IfTuple<T> extends true ? T
121
- : IfClass<T> extends true ? T
122
- : T extends Promise<infer U> ? Promise<DeepPickWritable<U>>
123
- : T extends Map<any, any> ? T
124
- : T extends ReadonlyMap<any, any> ? T
125
- : T extends WeakMap<any, any> ? T
126
- : T extends Set<any> ? T
127
- : T extends ReadonlySet<any> ? T
128
- : T extends WeakSet<any> ? T
129
- : T extends any[] ? T
130
- : { [P in K]: DeepPickWritable<Exclude<T[P], undefined>> };
64
+ IsDeepExcluded<T> extends true ? T
65
+ : { [P in K]: DeepPickWritable<Exclude<T[P], undefined>> };
131
66
 
132
67
  /**
133
- * Pick all writable properties in T deeply even in Maps, Sets etc
68
+ * Pick all writable properties in T deeply including arrays
134
69
  */
135
- export type StrictDeepPickWritable<T> = _StrictDeepPickWritable<T>
136
- type _StrictDeepPickWritable<T, K extends keyof T = WritableKeys<T>> =
137
- T extends Builtin ? T
138
- : IfTuple<T> extends true ? T
139
- : IfClass<T> extends true ? T
140
- : T extends Promise<infer U> ? Promise<StrictDeepPickWritable<U>>
141
- : T extends Map<infer K, infer V> ? Map<K, StrictDeepPickWritable<V>>
142
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, StrictDeepPickWritable<V>>
143
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, StrictDeepPickWritable<V>>
144
- : T extends Set<infer U> ? Set<StrictDeepPickWritable<U>>
145
- : T extends ReadonlySet<infer U> ? ReadonlySet<StrictDeepPickWritable<U>>
146
- : T extends WeakSet<infer U> ? WeakSet<StrictDeepPickWritable<U>>
147
- : T extends (infer U)[] ? StrictDeepPickWritable<U>[]
148
- : { -readonly [P in K]: StrictDeepPickWritable<Exclude<T[P], undefined>> }
70
+ export type HighDeepPickWritable<T> = _HighDeepPickWritable<T>;
71
+ type _HighDeepPickWritable<T, K extends keyof T = WritableKeys<T>> =
72
+ T extends (infer U)[] ? _HighDeepPickWritable<U>[]
73
+ : IsDeepExcluded<T> extends true ? T
74
+ : { [P in K]: _HighDeepPickWritable<Exclude<T[P], undefined>> };
75
+
149
76
 
150
77
  /**
151
78
  * Pick all JSON friendly properties in T deeply
152
79
  */
153
80
  export type DeepPickJson<T> = _DeepPickJson<T>
154
81
  type _DeepPickJson<T, Keys extends keyof T = JsonKeys<T>> =
155
- T extends Builtin ? T
156
- : IfTuple<T> extends true ? T
157
- : IfClass<T> extends true ? T
158
- : T extends Promise<infer U> ? Promise<DeepPickJson<U>>
159
- : T extends Map<any, any> ? T
160
- : T extends ReadonlyMap<any, any> ? T
161
- : T extends WeakMap<any, any> ? T
162
- : T extends Set<any> ? T
163
- : T extends ReadonlySet<any> ? T
164
- : T extends WeakSet<any> ? T
165
- : T extends any[] ? T
166
- : { [P in Keys]: DeepPickJson<Exclude<T[P], undefined>> };
82
+ T extends (infer U)[] ? _DeepPickJson<U>[]
83
+ : IsDeepExcluded<T> extends true ? T
84
+ : { [P in Keys]: DeepPickJson<Exclude<T[P], undefined>> };
@@ -0,0 +1,19 @@
1
+ import { IsDeepExcluded } from './helpers.js';
2
+
3
+ /**
4
+ * Make all properties in T readonly deeply
5
+ */
6
+ export type DeepReadonly<T> = _DeepReadonly<T>;
7
+ type _DeepReadonly<T> =
8
+ IsDeepExcluded<T> extends true ? T
9
+ : { readonly [P in keyof T]: _DeepReadonly<Exclude<T[P], undefined>> };
10
+
11
+ /**
12
+ * Make all properties in T readonly deeply
13
+ */
14
+ export type HighDeepReadonly<T> = _HighDeepReadonly<T>;
15
+ type _HighDeepReadonly<T> =
16
+ T extends (infer U)[] ? _HighDeepReadonly<U>[]
17
+ : IsDeepExcluded<T> extends true ? T
18
+ : { readonly [P in keyof T]: _HighDeepReadonly<Exclude<T[P], undefined>> };
19
+
@@ -0,0 +1,19 @@
1
+ import { IsDeepExcluded } from './helpers.js';
2
+
3
+ /**
4
+ * Make all properties in T required deeply
5
+ */
6
+ export type DeepRequired<T> = _DeepRequired<T>;
7
+ type _DeepRequired<T> =
8
+ IsDeepExcluded<T> extends true ? T
9
+ : { [P in keyof T]-?: _DeepRequired<Exclude<T[P], undefined>> };
10
+
11
+
12
+ /**
13
+ * Make all properties in T required deeply including arrays
14
+ */
15
+ export type HighDeepRequired<T> = _HighDeepRequired<T>;
16
+ type _HighDeepRequired<T> =
17
+ T extends (infer U)[] ? _HighDeepRequired<U>[]
18
+ : IsDeepExcluded<T> extends true ? T
19
+ : { [P in keyof T]-?: _HighDeepRequired<Exclude<T[P], undefined>> };
@@ -0,0 +1,19 @@
1
+ import { IsDeepExcluded } from './helpers.js';
2
+
3
+ /**
4
+ * Make all properties in T writable deeply
5
+ */
6
+ export type DeepWritable<T> = _DeepWritable<T>;
7
+ type _DeepWritable<T> =
8
+ IsDeepExcluded<T> extends true ? T
9
+ : { -readonly [P in keyof T]: _DeepWritable<Exclude<T[P], undefined>> };
10
+
11
+
12
+ /**
13
+ * Make all properties in T writable deeply including arrays
14
+ */
15
+ export type HighDeepWritable<T> = _HighDeepWritable<T>;
16
+ type _HighDeepWritable<T> =
17
+ T extends (infer U)[] ? _HighDeepWritable<U>[]
18
+ : IsDeepExcluded<T> extends true ? T
19
+ : { -readonly [P in keyof T]: _HighDeepWritable<Exclude<T[P], undefined>> };
@@ -0,0 +1,19 @@
1
+ import { Builtin } from './common.js';
2
+ import { IfClass, IfTuple } from './type-check.js';
3
+
4
+ /**
5
+ * Returns true if T is excluded from deep operations
6
+ */
7
+ export type IsDeepExcluded<T> = _IsHighDeepObject<T>;
8
+ type _IsHighDeepObject<T> =
9
+ T extends Builtin ? true
10
+ : IfTuple<T> extends true ? true
11
+ : IfClass<T> extends true ? true
12
+ : T extends Map<any, any> ? true
13
+ : T extends ReadonlyMap<any, any> ? true
14
+ : T extends WeakMap<any, any> ? true
15
+ : T extends Set<any> ? true
16
+ : T extends ReadonlySet<any> ? true
17
+ : T extends WeakSet<any> ? true
18
+ : T extends any[] ? true
19
+ : false;
package/lib/index.d.ts CHANGED
@@ -2,8 +2,13 @@ export * from "./common";
2
2
  export * from "./keys";
3
3
  export * from "./type-check";
4
4
  export * from "./modify";
5
- export * from "./deep-pick";
5
+ export * from "./deep-buildable";
6
+ export * from "./deep-nullish";
6
7
  export * from "./deep-omit";
7
- export * from "./deep-modify";
8
+ export * from "./deep-partial";
9
+ export * from "./deep-pick";
10
+ export * from "./deep-readonly";
11
+ export * from "./deep-required";
12
+ export * from "./deep-writable";
8
13
  export * from "./pick";
9
14
  export * from "./omit";
package/lib/modify.d.ts CHANGED
@@ -29,3 +29,8 @@ export type ReadonlySome<T, K extends keyof T> = Readonly<Pick<T, K>> & Omit<T,
29
29
  * Marks given keys as writable
30
30
  */
31
31
  export type WritableSome<T, K extends keyof T> = Writable<Pick<T, K>> & Omit<T, K>;
32
+
33
+ /**
34
+ * Merges two types without merging types of elements.
35
+ */
36
+ export type Combine<A, B> = A & Exclude<B, keyof A>;
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "lodash",
13
13
  "underscore"
14
14
  ],
15
- "version": "2.4.1",
15
+ "version": "2.6.0",
16
16
  "types": "lib/index.d.ts",
17
17
  "main": "lib/index.js",
18
18
  "module": "lib/index.js",
@@ -32,10 +32,10 @@
32
32
  "lib/"
33
33
  ],
34
34
  "devDependencies": {
35
- "@types/jest": "^29.5.3",
36
- "eslint": "^8.45.0",
37
- "jest": "^29.6.1",
35
+ "@types/jest": "^29.5.4",
36
+ "eslint": "^8.49.0",
37
+ "jest": "^29.7.0",
38
38
  "ts-jest": "^29.1.1",
39
- "typescript": "^5.1.6"
39
+ "typescript": "^5.2.2"
40
40
  }
41
41
  }
@@ -1,106 +0,0 @@
1
- import { Builtin } from './common';
2
- import { IfTuple } from './type-check';
3
- import { OptionalKeys } from './keys';
4
-
5
- /**
6
- * Partial but deeply
7
- */
8
- export type DeepPartial<T> = _DeepPartial<T>;
9
- type _DeepPartial<T> =
10
- T extends Builtin ? T
11
- : T extends Promise<infer U> ? Promise<DeepPartial<U>>
12
- : T extends Map<infer K, infer V> ? Map<K, DeepPartial<V>>
13
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPartial<V>>
14
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPartial<V>>
15
- : T extends Set<infer U> ? Set<DeepPartial<U>>
16
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPartial<U>>
17
- : T extends WeakSet<infer U> ? WeakSet<DeepPartial<U>>
18
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPartial<T[K]> }
19
- : T extends (infer U)[] ? DeepPartial<U>[]
20
- : { [P in keyof T]?: DeepPartial<Exclude<T[P], undefined>> };
21
-
22
- /**
23
- * Combination of Partial and Writable but deeply
24
- */
25
- export type DeepBuildable<T> = _DeepBuildable<T>;
26
- type _DeepBuildable<T> =
27
- T extends Builtin ? T
28
- : T extends Promise<infer U> ? Promise<DeepBuildable<U>>
29
- : T extends Map<infer K, infer V> ? Map<K, DeepBuildable<V>>
30
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepBuildable<V>>
31
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepBuildable<V>>
32
- : T extends Set<infer U> ? Set<DeepBuildable<U>>
33
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepBuildable<U>>
34
- : T extends WeakSet<infer U> ? WeakSet<DeepBuildable<U>>
35
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepBuildable<T[K]> }
36
- : T extends (infer U)[] ? DeepBuildable<U>[]
37
- : { -readonly [P in keyof T]?: DeepBuildable<Exclude<T[P], undefined>> };
38
-
39
- /**
40
- * Make all properties in T required deeply
41
- */
42
- export type DeepRequired<T> = _DeepRequired<T>;
43
- type _DeepRequired<T> =
44
- T extends Builtin ? T
45
- : T extends Promise<infer U> ? Promise<DeepRequired<U>>
46
- : T extends Map<infer K, infer V> ? Map<K, DeepRequired<V>>
47
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepRequired<V>>
48
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepRequired<V>>
49
- : T extends Set<infer U> ? Set<DeepRequired<U>>
50
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepRequired<U>>
51
- : T extends WeakSet<infer U> ? WeakSet<DeepRequired<U>>
52
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepRequired<T[K]> }
53
- : T extends (infer U)[] ? DeepRequired<U>[]
54
- : { [P in keyof T]-?: DeepRequired<Exclude<T[P], undefined>> };
55
-
56
-
57
- /**
58
- * Make all properties in T readonly deeply
59
- */
60
- export type DeepReadonly<T> = _DeepReadonly<T>;
61
- type _DeepReadonly<T> =
62
- T extends Builtin ? T
63
- : T extends Promise<infer U> ? Promise<DeepReadonly<U>>
64
- : T extends Map<infer K, infer V> ? Map<K, DeepReadonly<V>>
65
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepReadonly<V>>
66
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepReadonly<V>>
67
- : T extends Set<infer U> ? Set<DeepReadonly<U>>
68
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepReadonly<U>>
69
- : T extends WeakSet<infer U> ? WeakSet<DeepReadonly<U>>
70
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepReadonly<T[K]> }
71
- : T extends (infer U)[] ? DeepReadonly<U>[]
72
- : { readonly [P in keyof T]: DeepReadonly<Exclude<T[P], undefined>> };
73
-
74
- /**
75
- * Make all properties in T writable deeply
76
- */
77
- export type DeepWritable<T> = _DeepWritable<T>;
78
- type _DeepWritable<T> =
79
- T extends Builtin ? T
80
- : T extends Promise<infer U> ? Promise<DeepWritable<U>>
81
- : T extends Map<infer K, infer V> ? Map<K, DeepWritable<V>>
82
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepWritable<V>>
83
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepWritable<V>>
84
- : T extends Set<infer U> ? Set<DeepWritable<U>>
85
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepWritable<U>>
86
- : T extends WeakSet<infer U> ? WeakSet<DeepWritable<U>>
87
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepWritable<T[K]> }
88
- : T extends (infer U)[] ? DeepWritable<U>[]
89
- : { -readonly [P in keyof T]: DeepWritable<Exclude<T[P], undefined>> };
90
-
91
- /**
92
- * Make all properties in T nullable deeply
93
- */
94
- export type DeepNullish<T> = _DeepNullish<DeepRequired<T>>;
95
- type _DeepNullish<T> =
96
- T extends Builtin ? T | null | undefined
97
- : T extends Promise<infer U> ? Promise<DeepNullish<U>>
98
- : T extends Map<infer K, infer V> ? Map<K, DeepNullish<V>>
99
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepNullish<V>>
100
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepNullish<V>>
101
- : T extends Set<infer U> ? Set<DeepNullish<U>>
102
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepNullish<U>>
103
- : T extends WeakSet<infer U> ? WeakSet<DeepNullish<U>>
104
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepNullish<T[K]> }
105
- : T extends (infer U)[] ? DeepNullish<U>[] | null | undefined
106
- : { [P in keyof T]: DeepNullish<Exclude<T[P], undefined>> | null | undefined };