ts-gems 3.12.0 → 4.0.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.
@@ -1,5 +1,5 @@
1
1
  import { IfNoDeepValue } from './helpers.js';
2
- import { IfNever } from './type-check.js';
2
+ import { IfNever, IfTuple } from './type-check.js';
3
3
 
4
4
  /**
5
5
  * OmitNever<T> is a type that omits all properties with a value of type "never".
@@ -41,14 +41,18 @@ export type DeepOmitNever<T> = {
41
41
  * Omit all "never" and "undefined" properties in T deeply including arrays
42
42
  */
43
43
  export type DeeperOmitNever<T> = {
44
- [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]: NonNullable<
45
- // Deep process arrays
46
- T[K]
47
- > extends (infer U)[]
48
- ? DeeperOmitNever<U>[]
49
- : // Do not deep process No-Deep values
50
- IfNoDeepValue<NonNullable<T[K]>> extends true
51
- ? T[K]
52
- : // Deep process objects
53
- DeeperOmitNever<NonNullable<T[K]>>;
44
+ [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]: IfTuple<
45
+ NonNullable<T[K]>
46
+ > extends true // Leave fixed-length tuples untouched
47
+ ? T[K]
48
+ : NonNullable<
49
+ // Deep process arrays
50
+ T[K]
51
+ > extends readonly (infer U)[]
52
+ ? DeeperOmitNever<U>[]
53
+ : // Do not deep process No-Deep values
54
+ IfNoDeepValue<NonNullable<T[K]>> extends true
55
+ ? T[K]
56
+ : // Deep process objects
57
+ DeeperOmitNever<NonNullable<T[K]>>;
54
58
  };
@@ -1,5 +1,5 @@
1
1
  import { IfNoDeepValue } from './helpers.js';
2
- import { IfNever } from './type-check.js';
2
+ import { IfNever, IfTuple } from './type-check.js';
3
3
 
4
4
  /**
5
5
  * OmitUndefined<T> is a type that omits all properties with a value of type "undefined".
@@ -25,13 +25,15 @@ export type DeepOmitUndefined<T> = {
25
25
  * Omit all "never" and "undefined" properties in T deeply including arrays
26
26
  */
27
27
  export type DeeperOmitUndefined<T> = {
28
- [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]: NonNullable<
29
- T[K]
30
- > extends (infer U)[] // Deep process arrays
31
- ? DeeperOmitUndefined<U>[]
32
- : // Do not deep process No-Deep values
33
- IfNoDeepValue<NonNullable<T[K]>> extends true
34
- ? T[K]
35
- : // Deep process objects
36
- DeeperOmitUndefined<NonNullable<T[K]>>;
28
+ [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]: IfTuple<
29
+ NonNullable<T[K]>
30
+ > extends true // Leave fixed-length tuples untouched
31
+ ? T[K]
32
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
33
+ ? DeeperOmitUndefined<U>[]
34
+ : // Do not deep process No-Deep values
35
+ IfNoDeepValue<NonNullable<T[K]>> extends true
36
+ ? T[K]
37
+ : // Deep process objects
38
+ DeeperOmitUndefined<NonNullable<T[K]>>;
37
39
  };
package/lib/omit.d.ts CHANGED
@@ -1,27 +1,38 @@
1
1
  import { IfNoDeepValue } from './helpers.js';
2
2
  import { Or } from './logical.js';
3
- import { IfFunction, IfNever } from './type-check.js';
3
+ import { IfFunction, IfNever, IfTuple } from './type-check.js';
4
4
 
5
5
  /**
6
6
  * Construct a type with the properties of T except for those in type K,
7
7
  * while preserving strict type checking.
8
8
  */
9
9
  export type StrictOmit<T, X extends keyof T> = {
10
- [K in keyof T as K extends X ? never : K]: T[K];
10
+ [
11
+ K in keyof T as Or<
12
+ // Omit never keys
13
+ IfNever<Exclude<T[K], undefined>>,
14
+ // Omit X
15
+ K extends X ? true : false
16
+ > extends true
17
+ ? never
18
+ : K
19
+ ]: T[K];
11
20
  };
12
21
 
13
22
  /**
14
23
  * Omit all function properties in T
15
24
  */
16
25
  export type OmitFunctions<T> = {
17
- [K in keyof T as Or<
18
- // Omit never keys
19
- IfNever<Exclude<T[K], undefined>>,
20
- // Omit functions
21
- IfFunction<NonNullable<T[K]>>
22
- > extends true
23
- ? never
24
- : K]: T[K];
26
+ [
27
+ K in keyof T as Or<
28
+ // Omit never keys
29
+ IfNever<Exclude<T[K], undefined>>,
30
+ // Omit functions
31
+ IfFunction<NonNullable<T[K]>>
32
+ > extends true
33
+ ? never
34
+ : K
35
+ ]: T[K];
25
36
  };
26
37
 
27
38
  /**
@@ -38,11 +49,9 @@ export type OmitTypes<T, X> = {
38
49
  * Omit all function properties in T
39
50
  */
40
51
  export type DeepOmitTypes<T, X> = {
41
- [K in keyof T as IfNever<
42
- Exclude<T[K], undefined | X>,
43
- never,
44
- K
45
- >]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
52
+ [
53
+ K in keyof T as IfNever<Exclude<T[K], undefined | X>, never, K>
54
+ ]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
46
55
  ? Exclude<T[K], X>
47
56
  : // Deep process objects
48
57
  DeepOmitTypes<NonNullable<T[K]>, X>;
@@ -52,17 +61,17 @@ export type DeepOmitTypes<T, X> = {
52
61
  * Omit all function properties in T deeply including arrays
53
62
  */
54
63
  export type DeeperOmitTypes<T, X> = {
55
- [K in keyof T as IfNever<
56
- Exclude<T[K], undefined | X>,
57
- never,
58
- K
59
- >]: NonNullable<
60
- // Deep process arrays // Do not deep process No-Deep values
61
- T[K]
62
- > extends (infer U)[]
63
- ? DeeperOmitTypes<U, X>[]
64
- : IfNoDeepValue<NonNullable<T[K]>> extends true
65
- ? Exclude<T[K], X>
66
- : // Deep process objects
67
- DeeperOmitTypes<NonNullable<T[K]>, X>;
64
+ [K in keyof T as IfNever<Exclude<T[K], undefined | X>, never, K>]: IfTuple<
65
+ NonNullable<T[K]>
66
+ > extends true // Leave fixed-length tuples untouched
67
+ ? Exclude<T[K], X>
68
+ : NonNullable<
69
+ // Deep process arrays // Do not deep process No-Deep values
70
+ T[K]
71
+ > extends readonly (infer U)[]
72
+ ? DeeperOmitTypes<U, X>[]
73
+ : IfNoDeepValue<NonNullable<T[K]>> extends true
74
+ ? Exclude<T[K], X>
75
+ : // Deep process objects
76
+ DeeperOmitTypes<NonNullable<T[K]>, X>;
68
77
  };
package/lib/partial.d.ts CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  OmitRequired,
8
8
  PickRequired,
9
9
  } from './required.js';
10
- import { IfNever } from './type-check.js';
10
+ import { IfNever, IfTuple } from './type-check.js';
11
11
 
12
12
  /**
13
13
  * Marks given keys as optional
@@ -32,16 +32,17 @@ export type DeepPartial<T> = {
32
32
  * Partial but deeply including arrays
33
33
  */
34
34
  export type DeeperPartial<T> = {
35
- [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]?: NonNullable<
36
- // Deep process arrays
37
- T[K]
38
- > extends (infer U)[]
39
- ? DeeperPartial<U>[]
40
- : // Do not deep process No-Deep values
41
- IfNoDeepValue<NonNullable<T[K]>> extends true
42
- ? T[K]
43
- : // Deep process objects
44
- DeeperPartial<NonNullable<T[K]>>;
35
+ [K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>]?: IfTuple<
36
+ NonNullable<T[K]>
37
+ > extends true // Leave fixed-length tuples untouched
38
+ ? T[K]
39
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
40
+ ? DeeperPartial<U>[]
41
+ : // Do not deep process No-Deep values
42
+ IfNoDeepValue<NonNullable<T[K]>> extends true
43
+ ? T[K]
44
+ : // Deep process objects
45
+ DeeperPartial<NonNullable<T[K]>>;
45
46
  };
46
47
 
47
48
  /**
package/lib/pick.d.ts CHANGED
@@ -13,62 +13,70 @@ import {
13
13
  * while preserving strict type checking.
14
14
  */
15
15
  export type StrictPick<T, X extends keyof T> = {
16
- [K in keyof T as Or<
17
- // Omit never keys
18
- IfNever<Exclude<T[K], undefined>>,
19
- // Omit X
20
- K extends X ? false : true
21
- > extends true
22
- ? never
23
- : K]: T[K];
16
+ [
17
+ K in keyof T as Or<
18
+ // Omit never keys
19
+ IfNever<Exclude<T[K], undefined>>,
20
+ // Omit X
21
+ K extends X ? false : true
22
+ > extends true
23
+ ? never
24
+ : K
25
+ ]: T[K];
24
26
  };
25
27
 
26
28
  /**
27
29
  * Pick all function properties in T
28
30
  */
29
31
  export type PickFunctions<T> = {
30
- [K in keyof T as Or<
31
- // Omit never keys
32
- IfNever<Exclude<T[K], undefined>>,
33
- // Omit non functions
34
- IfFunction<NonNullable<T[K]>, false, true>
35
- > extends true
36
- ? never
37
- : K]: T[K];
32
+ [
33
+ K in keyof T as Or<
34
+ // Omit never keys
35
+ IfNever<Exclude<T[K], undefined>>,
36
+ // Omit non functions
37
+ IfFunction<NonNullable<T[K]>, false, true>
38
+ > extends true
39
+ ? never
40
+ : K
41
+ ]: T[K];
38
42
  };
39
43
 
40
44
  /**
41
45
  * Pick all function properties in T
42
46
  */
43
47
  export type PickTypes<T, X> = {
44
- [K in keyof T as Or<
45
- // Omit never keys
46
- IfNever<Exclude<T[K], undefined>>,
47
- // Omit types which not exists in X
48
- T[K] extends X ? false : X extends T[K] ? false : true
49
- > extends true
50
- ? never
51
- : K]: T[K];
48
+ [
49
+ K in keyof T as Or<
50
+ // Omit never keys
51
+ IfNever<Exclude<T[K], undefined>>,
52
+ // Omit types which not exists in X
53
+ T[K] extends X ? false : X extends T[K] ? false : true
54
+ > extends true
55
+ ? never
56
+ : K
57
+ ]: T[K];
52
58
  };
53
59
 
54
60
  /**
55
61
  * Pick all function properties in T
56
62
  */
57
63
  export type StrictPickTypes<T, X> = {
58
- [K in keyof T as Or<
59
- // Omit never keys
60
- IfNever<Exclude<T[K], undefined>>,
61
- // Omit unknown
62
- IfUnknown<T[K]>,
63
- // Omit any
64
- IfAny<T[K]>,
65
- // Omit {}
66
- IfEmptyObject<T[K]>,
67
- // Omit types which not exists in X
68
- T[K] extends X ? false : X extends T[K] ? false : true
69
- > extends true
70
- ? never
71
- : K]: T[K];
64
+ [
65
+ K in keyof T as Or<
66
+ // Omit never keys
67
+ IfNever<Exclude<T[K], undefined>>,
68
+ // Omit unknown
69
+ IfUnknown<T[K]>,
70
+ // Omit any
71
+ IfAny<T[K]>,
72
+ // Omit {}
73
+ IfEmptyObject<T[K]>,
74
+ // Omit types which not exists in X
75
+ T[K] extends X ? false : X extends T[K] ? false : true
76
+ > extends true
77
+ ? never
78
+ : K
79
+ ]: T[K];
72
80
  };
73
81
 
74
82
  /**
package/lib/readonly.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { IfNoDeepValue } from './helpers.js';
2
2
  import { Or } from './logical.js';
3
- import { IfEquals, IfNever } from './type-check.js';
3
+ import { IfEquals, IfNever, IfTuple } from './type-check.js';
4
4
 
5
5
  /**
6
6
  * Marks given keys as readonly
@@ -12,11 +12,9 @@ export type ReadonlySome<T, K extends keyof T> = Readonly<Pick<T, K>> &
12
12
  * Make all properties in T readonly deeply
13
13
  */
14
14
  export type DeepReadonly<T> = {
15
- readonly [K in keyof T as IfNever<
16
- Exclude<T[K], undefined>,
17
- never,
18
- K
19
- >]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
15
+ readonly [
16
+ K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>
17
+ ]: IfNoDeepValue<Exclude<T[K], undefined>> extends true // Do not deep process No-Deep values
20
18
  ? T[K]
21
19
  : // Deep process objects
22
20
  DeepReadonly<Exclude<T[K], undefined>>;
@@ -26,17 +24,17 @@ export type DeepReadonly<T> = {
26
24
  * Make all properties in T readonly deeply
27
25
  */
28
26
  export type DeeperReadonly<T> = {
29
- readonly [K in keyof T as IfNever<
30
- Exclude<T[K], undefined>,
31
- never,
32
- K
33
- >]: NonNullable<T[K]> extends (infer U)[] // Deep process arrays
34
- ? DeeperReadonly<U>[]
35
- : // Do not deep process No-Deep values
36
- IfNoDeepValue<Exclude<T[K], undefined>> extends true
37
- ? T[K]
38
- : // Deep process objects
39
- DeeperReadonly<Exclude<T[K], undefined>>;
27
+ readonly [
28
+ K in keyof T as IfNever<Exclude<T[K], undefined>, never, K>
29
+ ]: IfTuple<NonNullable<T[K]>> extends true // Leave fixed-length tuples untouched
30
+ ? T[K]
31
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
32
+ ? DeeperReadonly<U>[]
33
+ : // Do not deep process No-Deep values
34
+ IfNoDeepValue<Exclude<T[K], undefined>> extends true
35
+ ? T[K]
36
+ : // Deep process objects
37
+ DeeperReadonly<Exclude<T[K], undefined>>;
40
38
  };
41
39
 
42
40
  /**
@@ -48,42 +46,48 @@ export type ReadonlyKeys<T> = keyof PickReadonly<T>;
48
46
  * Pick all readonly properties in T
49
47
  */
50
48
  export type PickReadonly<T> = {
51
- [K in keyof T as Or<
52
- // Omit never keys
53
- IfNever<Exclude<T[K], undefined>>,
54
- // Omit required
55
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
56
- > extends true
57
- ? never
58
- : K]: T[K];
49
+ [
50
+ K in keyof T as Or<
51
+ // Omit never keys
52
+ IfNever<Exclude<T[K], undefined>>,
53
+ // Omit required
54
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
55
+ > extends true
56
+ ? never
57
+ : K
58
+ ]: T[K];
59
59
  };
60
60
 
61
61
  /**
62
62
  * Omit all readonly properties in T
63
63
  */
64
64
  export type OmitReadonly<T> = {
65
- [K in keyof T as Or<
66
- // Omit never keys
67
- IfNever<Exclude<T[K], undefined>>,
68
- // Omit required
69
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
70
- > extends true
71
- ? never
72
- : K]: T[K];
65
+ [
66
+ K in keyof T as Or<
67
+ // Omit never keys
68
+ IfNever<Exclude<T[K], undefined>>,
69
+ // Omit required
70
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
71
+ > extends true
72
+ ? never
73
+ : K
74
+ ]: T[K];
73
75
  };
74
76
 
75
77
  /**
76
78
  * Pick all readonly properties in T deeply
77
79
  */
78
80
  export type DeepPickReadonly<T> = {
79
- [K in keyof T as Or<
80
- // Omit never keys
81
- IfNever<Exclude<T[K], undefined>>,
82
- // Omit required
83
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
84
- > extends true
85
- ? never
86
- : K]: IfNoDeepValue<NonNullable<T[K]>> extends true // Do not deep process No-Deep values
81
+ [
82
+ K in keyof T as Or<
83
+ // Omit never keys
84
+ IfNever<Exclude<T[K], undefined>>,
85
+ // Omit required
86
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
87
+ > extends true
88
+ ? never
89
+ : K
90
+ ]: IfNoDeepValue<NonNullable<T[K]>> extends true // Do not deep process No-Deep values
87
91
  ? T[K]
88
92
  : // Deep process objects
89
93
  DeepPickReadonly<NonNullable<T[K]>>;
@@ -93,14 +97,16 @@ export type DeepPickReadonly<T> = {
93
97
  * Pick all readonly properties in T deeply
94
98
  */
95
99
  export type DeepOmitReadonly<T> = {
96
- [K in keyof T as Or<
97
- // Omit never keys
98
- IfNever<NonNullable<T[K]>>,
99
- // Omit required
100
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
101
- > extends true
102
- ? never
103
- : K]: IfNoDeepValue<NonNullable<T[K]>> extends true // Do not deep process No-Deep values
100
+ [
101
+ K in keyof T as Or<
102
+ // Omit never keys
103
+ IfNever<Exclude<T[K], undefined>>,
104
+ // Omit required
105
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
106
+ > extends true
107
+ ? never
108
+ : K
109
+ ]: IfNoDeepValue<NonNullable<T[K]>> extends true // Do not deep process No-Deep values
104
110
  ? T[K]
105
111
  : // Deep process objects
106
112
  DeepOmitReadonly<NonNullable<T[K]>>;
@@ -110,38 +116,46 @@ export type DeepOmitReadonly<T> = {
110
116
  * Pick all readonly properties in T deeply including arrays
111
117
  */
112
118
  export type DeeperPickReadonly<T> = {
113
- [K in keyof T as Or<
114
- // Omit never keys
115
- IfNever<Exclude<T[K], undefined>>,
116
- // Omit required
117
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
118
- > extends true
119
- ? never
120
- : K]: NonNullable<T[K]> extends (infer U)[] // Deep process arrays
121
- ? DeeperPickReadonly<U>[]
122
- : // Do not deep process No-Deep values
123
- IfNoDeepValue<NonNullable<T[K]>> extends true
124
- ? T[K]
125
- : // Deep process objects
126
- DeeperPickReadonly<NonNullable<T[K]>>;
119
+ [
120
+ K in keyof T as Or<
121
+ // Omit never keys
122
+ IfNever<Exclude<T[K], undefined>>,
123
+ // Omit required
124
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }, false, true>
125
+ > extends true
126
+ ? never
127
+ : K
128
+ ]: IfTuple<NonNullable<T[K]>> extends true // Leave fixed-length tuples untouched
129
+ ? T[K]
130
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
131
+ ? DeeperPickReadonly<U>[]
132
+ : // Do not deep process No-Deep values
133
+ IfNoDeepValue<NonNullable<T[K]>> extends true
134
+ ? T[K]
135
+ : // Deep process objects
136
+ DeeperPickReadonly<NonNullable<T[K]>>;
127
137
  };
128
138
 
129
139
  /**
130
140
  * Pick all readonly properties in T deeply including arrays
131
141
  */
132
142
  export type DeeperOmitReadonly<T> = {
133
- [K in keyof T as Or<
134
- // Omit never keys
135
- IfNever<Exclude<T[K], undefined>>,
136
- // Omit required
137
- IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
138
- > extends true
139
- ? never
140
- : K]: NonNullable<T[K]> extends (infer U)[] // Deep process arrays
141
- ? DeeperOmitReadonly<U>[]
142
- : // Do not deep process No-Deep values
143
- IfNoDeepValue<NonNullable<T[K]>> extends true
144
- ? T[K]
145
- : // Deep process objects
146
- DeeperOmitReadonly<NonNullable<T[K]>>;
143
+ [
144
+ K in keyof T as Or<
145
+ // Omit never keys
146
+ IfNever<Exclude<T[K], undefined>>,
147
+ // Omit required
148
+ IfEquals<{ [Q in K]: T[K] }, { readonly [Q in K]: T[K] }>
149
+ > extends true
150
+ ? never
151
+ : K
152
+ ]: IfTuple<NonNullable<T[K]>> extends true // Leave fixed-length tuples untouched
153
+ ? T[K]
154
+ : NonNullable<T[K]> extends readonly (infer U)[] // Deep process arrays
155
+ ? DeeperOmitReadonly<U>[]
156
+ : // Do not deep process No-Deep values
157
+ IfNoDeepValue<NonNullable<T[K]>> extends true
158
+ ? T[K]
159
+ : // Deep process objects
160
+ DeeperOmitReadonly<NonNullable<T[K]>>;
147
161
  };