ts-gems 1.0.0 → 1.1.2

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/lib/common.d.ts CHANGED
@@ -23,7 +23,7 @@ type JsonType = BasicPrimitive | null | object | (BasicPrimitive | object)[]
23
23
  * Builtin
24
24
  * @desc Type representing Builtin types in JavaScript
25
25
  */
26
- export type Builtin = Primitive | Function | String | Number | Date | Error | RegExp | JSON | Math |
26
+ export type Builtin = Primitive | Function | String | Number | Date | Error | RegExp |
27
27
  ArrayBuffer | DataView | Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array |
28
28
  Int32Array | Uint32Array | Float32Array | Float64Array;
29
29
 
@@ -17,7 +17,7 @@ type _DeepPartial<T> =
17
17
  : T extends WeakSet<infer U> ? WeakSet<DeepPartial<U>>
18
18
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPartial<T[K]> }
19
19
  : T extends (infer U)[] ? DeepPartial<U>[]
20
- : { [P in keyof T]?: DeepPartial<T[P]> };
20
+ : { [P in keyof T]?: DeepPartial<Exclude<T[P], undefined>> };
21
21
 
22
22
  /**
23
23
  * Combination of Partial and Writable but deeply
@@ -34,7 +34,7 @@ type _DeepBuildable<T> =
34
34
  : T extends WeakSet<infer U> ? WeakSet<DeepBuildable<U>>
35
35
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepBuildable<T[K]> }
36
36
  : T extends (infer U)[] ? DeepBuildable<U>[]
37
- : { -readonly [P in keyof T]?: DeepBuildable<T[P]> };
37
+ : { -readonly [P in keyof T]?: DeepBuildable<Exclude<T[P], undefined>> };
38
38
 
39
39
  /**
40
40
  * Make all properties in T required deeply
@@ -51,7 +51,7 @@ type _DeepRequired<T> =
51
51
  : T extends WeakSet<infer U> ? WeakSet<DeepRequired<U>>
52
52
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepRequired<T[K]> }
53
53
  : T extends (infer U)[] ? DeepRequired<U>[]
54
- : { [P in keyof T]-?: DeepRequired<T[P]> };
54
+ : { [P in keyof T]-?: DeepRequired<Exclude<T[P], undefined>> };
55
55
 
56
56
 
57
57
  /**
@@ -69,7 +69,7 @@ type _DeepReadonly<T> =
69
69
  : T extends WeakSet<infer U> ? WeakSet<DeepReadonly<U>>
70
70
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepReadonly<T[K]> }
71
71
  : T extends (infer U)[] ? DeepReadonly<U>[]
72
- : { readonly [P in keyof T]: DeepReadonly<T[P]> };
72
+ : { readonly [P in keyof T]: DeepReadonly<Exclude<T[P], undefined>> };
73
73
 
74
74
  /**
75
75
  * Make all properties in T writable deeply
@@ -86,12 +86,12 @@ type _DeepWritable<T> =
86
86
  : T extends WeakSet<infer U> ? WeakSet<DeepWritable<U>>
87
87
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepWritable<T[K]> }
88
88
  : T extends (infer U)[] ? DeepWritable<U>[]
89
- : { -readonly [P in keyof T]: DeepWritable<T[P]> };
89
+ : { -readonly [P in keyof T]: DeepWritable<Exclude<T[P], undefined>> };
90
90
 
91
91
  /**
92
92
  * Make all properties in T nullable deeply
93
93
  */
94
- export type DeepNullish<T> = _DeepNullish<T>;
94
+ export type DeepNullish<T> = _DeepNullish<DeepRequired<T>>;
95
95
  type _DeepNullish<T> =
96
96
  T extends Builtin ? T | null | undefined
97
97
  : T extends Promise<infer U> ? Promise<DeepNullish<U>>
@@ -102,5 +102,5 @@ type _DeepNullish<T> =
102
102
  : T extends ReadonlySet<infer U> ? ReadonlySet<DeepNullish<U>>
103
103
  : T extends WeakSet<infer U> ? WeakSet<DeepNullish<U>>
104
104
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepNullish<T[K]> }
105
- : T extends (infer U)[] ? DeepNullish<U>[]
106
- : { [P in keyof T]-?: DeepNullish<T[P]> };
105
+ : T extends (infer U)[] ? DeepNullish<U>[] | null | undefined
106
+ : { [P in keyof T]: DeepNullish<T[P]>| null | undefined };
@@ -17,7 +17,7 @@ type _DeepOmitOptional<T, K extends keyof T = Exclude<keyof T, OptionalKeys<T>>>
17
17
  : T extends WeakSet<infer U> ? WeakSet<DeepOmitOptional<U>>
18
18
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitOptional<T[K]> }
19
19
  : T extends (infer U)[] ? DeepOmitOptional<U>[]
20
- : { [P in K]: DeepOmitOptional<T[P]> };
20
+ : { [P in K]: DeepOmitOptional<Exclude<T[P], undefined>> };
21
21
 
22
22
  /**
23
23
  * Omit all required properties in T deeply
@@ -34,7 +34,7 @@ type _DeepOmitRequired<T, J extends keyof T = Exclude<keyof T, RequiredKeys<T>>>
34
34
  : T extends WeakSet<infer U> ? WeakSet<DeepOmitRequired<U>>
35
35
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitRequired<T[K]> }
36
36
  : T extends (infer U)[] ? DeepOmitRequired<U>[]
37
- : { [P in J]: DeepOmitRequired<T[P]> };
37
+ : { [P in J]: DeepOmitRequired<Exclude<T[P], undefined>> };
38
38
 
39
39
  /**
40
40
  * Omit all readonly properties in T deeply
@@ -51,7 +51,7 @@ type _DeepOmitReadonly<T, J extends keyof T = Exclude<keyof T, ReadonlyKeys<T>>>
51
51
  : T extends WeakSet<infer U> ? WeakSet<DeepOmitReadonly<U>>
52
52
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitReadonly<T[K]> }
53
53
  : T extends (infer U)[] ? DeepOmitReadonly<U>[]
54
- : { [P in J]: DeepOmitReadonly<T[P]> };
54
+ : { [P in J]: DeepOmitReadonly<Exclude<T[P], undefined>> };
55
55
 
56
56
  /**
57
57
  * Omit all writable properties in T deeply
@@ -68,10 +68,10 @@ type _DeepOmitWritable<T, K extends keyof T = Exclude<keyof T, WritableKeys<T>>>
68
68
  : T extends WeakSet<infer U> ? WeakSet<DeepOmitWritable<U>>
69
69
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitWritable<T[K]> }
70
70
  : T extends (infer U)[] ? DeepOmitWritable<U>[]
71
- : { [P in K]: DeepOmitWritable<T[P]> }
71
+ : { [P in K]: DeepOmitWritable<Exclude<T[P], undefined>> }
72
72
 
73
73
  /**
74
- * Omit all JSON properties in T deeply
74
+ * Omit all JSON friendly properties in T deeply
75
75
  */
76
76
  export type DeepOmitJson<T> = _DeepOmitJson<T>
77
77
  type _DeepOmitJson<T, K extends keyof T = Exclude<keyof T, JsonKeys<T>>> =
@@ -85,4 +85,4 @@ type _DeepOmitJson<T, K extends keyof T = Exclude<keyof T, JsonKeys<T>>> =
85
85
  : T extends WeakSet<infer U> ? WeakSet<DeepOmitJson<U>>
86
86
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitJson<T[K]> }
87
87
  : T extends (infer U)[] ? DeepOmitJson<U>[]
88
- : { [P in K]: DeepOmitJson<T[P]> };
88
+ : { [P in K]: DeepOmitJson<Exclude<T[P], undefined>> };
@@ -17,7 +17,7 @@ type _DeepPickOptional<T, K extends keyof T = OptionalKeys<T>> =
17
17
  : T extends WeakSet<infer U> ? WeakSet<DeepPickOptional<U>>
18
18
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickOptional<T[K]> }
19
19
  : T extends (infer U)[] ? DeepPickOptional<U>[]
20
- : { [P in K]: DeepPickOptional<T[P]> };
20
+ : { [P in K]: DeepPickOptional<Exclude<T[P], undefined>> };
21
21
 
22
22
  /**
23
23
  * Pick all required properties in T deeply
@@ -34,7 +34,7 @@ type _DeepPickRequired<T, J extends keyof T = RequiredKeys<T>> =
34
34
  : T extends WeakSet<infer U> ? WeakSet<DeepPickRequired<U>>
35
35
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickRequired<T[K]> }
36
36
  : T extends (infer U)[] ? DeepPickRequired<U>[]
37
- : { [P in J]: DeepPickRequired<T[P]> };
37
+ : { [P in J]: DeepPickRequired<Exclude<T[P], undefined>> };
38
38
 
39
39
  /**
40
40
  * Pick all readonly properties in T deeply
@@ -51,7 +51,7 @@ type _DeepPickReadonly<T, J extends keyof T = ReadonlyKeys<T>> =
51
51
  : T extends WeakSet<infer U> ? WeakSet<DeepPickReadonly<U>>
52
52
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickReadonly<T[K]> }
53
53
  : T extends (infer U)[] ? DeepPickReadonly<U>[]
54
- : { [P in J]: DeepPickReadonly<T[P]> };
54
+ : { [P in J]: DeepPickReadonly<Exclude<T[P], undefined>> };
55
55
 
56
56
  /**
57
57
  * Pick all writable properties in T deeply
@@ -68,10 +68,10 @@ type _DeepPickWritable<T, K extends keyof T = WritableKeys<T>> =
68
68
  : T extends WeakSet<infer U> ? WeakSet<DeepPickWritable<U>>
69
69
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickWritable<T[K]> }
70
70
  : T extends (infer U)[] ? DeepPickWritable<U>[]
71
- : { [P in K]: DeepPickWritable<T[P]> }
71
+ : { [P in K]: DeepPickWritable<Exclude<T[P], undefined>> }
72
72
 
73
73
  /**
74
- * Pick all JSON properties in T deeply
74
+ * Pick all JSON friendly properties in T deeply
75
75
  */
76
76
  export type DeepPickJson<T> = _DeepPickJson<T>
77
77
  type _DeepPickJson<T, K extends keyof T = JsonKeys<T>> =
@@ -85,4 +85,4 @@ type _DeepPickJson<T, K extends keyof T = JsonKeys<T>> =
85
85
  : T extends WeakSet<infer U> ? WeakSet<DeepPickJson<U>>
86
86
  : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickJson<T[K]> }
87
87
  : T extends (infer U)[] ? DeepPickJson<U>[]
88
- : { [P in K]: DeepPickJson<T[P]> };
88
+ : { [P in K]: DeepPickJson<Exclude<T[P], undefined>> };
package/lib/index.d.ts CHANGED
@@ -4,3 +4,6 @@ export * from "./type-check";
4
4
  export * from "./modify";
5
5
  export * from "./deep-pick";
6
6
  export * from "./deep-omit";
7
+ export * from "./deep-modify";
8
+ export * from "./pick";
9
+ export * from "./omit";
package/lib/keys.ts CHANGED
@@ -12,27 +12,33 @@ export type KeysOf<T> = keyof T;
12
12
  */
13
13
  export type ValuesOf<T> = T[keyof T];
14
14
 
15
+ /**
16
+ * RequiredKeys
17
+ * @desc Returns required keys of an object
18
+ */
19
+ export type RequiredKeys<T> = {
20
+ [K in keyof T]-?: IfUndefined<T[K]> extends true
21
+ ? never
22
+ : T extends { [K1 in K]: any } ? K : never
23
+ }[keyof T];
15
24
 
16
25
  /**
17
26
  * OptionalKeys
18
27
  * @desc Returns optional keys of an object
19
28
  */
20
- export type OptionalKeys<T> = ValuesOf<{
21
- [K in keyof T]-?: {} extends Pick<T, K> ? K : never;
22
- }>;
29
+ export type OptionalKeys<T> = {
30
+ [K in keyof T]-?: IfUndefined<T[K]> extends true
31
+ ? never
32
+ : T extends { [K1 in K]: any } ? never : K
33
+ }[keyof T];
23
34
 
24
- /**
25
- * RequiredKeys
26
- * @desc Returns required keys of an object
27
- */
28
- export type RequiredKeys<T> = Exclude<keyof T, OptionalKeys<T>>;
29
35
 
30
36
  /**
31
37
  * @desc Returns readonly keys of an object
32
38
  */
33
- export type ReadonlyKeys<T> = ValuesOf<{
39
+ export type ReadonlyKeys<T> = {
34
40
  [K in keyof T]-?: IfEquals<{ [Q in K]: T[K] }, { -readonly [Q in K]: T[K] }, never, K>
35
- }>;
41
+ }[keyof T];
36
42
 
37
43
  /**
38
44
  * @desc Returns non function keys of an object
@@ -41,13 +47,18 @@ export type NonFunctionKeys<T> = Exclude<keyof T, FunctionKeys<T>>;
41
47
 
42
48
 
43
49
  /**
44
- * @desc Returns non function keys of an object
50
+ * @desc Returns JSON friendly keys of an object
45
51
  */
46
- export type JsonKeys<T> = ValuesOf<{
47
- [K in keyof T]-?: IfUndefined<T[K]> extends false ?
48
- K extends symbol ? never :
49
- IfJson<T[K]> extends true ?
50
- K : never : never;
52
+ export type JsonKeys<T> = _JsonKeys<T>;
53
+ type _JsonKeys<T, J = Required<T>> = ValuesOf<{
54
+ [K in keyof J]: IfUndefined<J[K]> extends true
55
+ ? never
56
+ : K extends symbol
57
+ ? never
58
+ : IfJson<J[K]> extends true
59
+ ? K
60
+ : never
61
+
51
62
  }>;
52
63
 
53
64
  /**
package/lib/omit.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ import {JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys} from './keys';
2
+
3
+ /**
4
+ * Omit all optional properties in T
5
+ */
6
+ export type OmitOptional<T> = Omit<T, OptionalKeys<T>>;
7
+
8
+ /**
9
+ * Omit all required properties in T
10
+ */
11
+ export type OmitRequired<T> = Omit<T, RequiredKeys<T>>;
12
+
13
+ /**
14
+ * Omit all readonly properties in T
15
+ */
16
+ export type OmitReadonly<T> = Omit<T, ReadonlyKeys<T>>;
17
+
18
+
19
+ /**
20
+ * Omit all writable properties in T
21
+ */
22
+ export type OmitWritable<T> = Omit<T, WritableKeys<T>>;
23
+
24
+ /**
25
+ * Omit all JSON friendly properties in T
26
+ */
27
+ export type OmitJson<T> = Omit<T, JsonKeys<T>>;
package/lib/pick.d.ts ADDED
@@ -0,0 +1,27 @@
1
+ import {JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys} from './keys';
2
+
3
+ /**
4
+ * Pick all optional properties in T
5
+ */
6
+ export type PickOptional<T> = Pick<T, OptionalKeys<T>>;
7
+
8
+ /**
9
+ * Pick all required properties in T
10
+ */
11
+ export type PickRequired<T> = Pick<T, RequiredKeys<T>>;
12
+
13
+ /**
14
+ * Pick all readonly properties in T
15
+ */
16
+ export type PickReadonly<T> = Pick<T, ReadonlyKeys<T>>;
17
+
18
+
19
+ /**
20
+ * Pick all writable properties in T
21
+ */
22
+ export type PickWritable<T> = Pick<T, WritableKeys<T>>;
23
+
24
+ /**
25
+ * Pick all JSON friendly properties (no symbols) in T
26
+ */
27
+ export type PickJson<T> = Pick<T, JsonKeys<T>>;
@@ -69,17 +69,15 @@ export type IfPrimitiveOrAny<T, Y = true, N = false> =
69
69
  * Returns Y if typeof T is JSON like, N otherwise
70
70
  */
71
71
  export type IfJson<T, Y = true, N = false> =
72
- IfNever<T> extends true ? N :
73
- IfClass<T> extends true ? N :
74
- IfFunction<T> extends true ? N :
75
- IfUndefined<T> extends true ? N :
76
- IfEquals<T, number> extends true ? Y :
77
- IfEquals<T, string> extends true ? Y :
78
- IfEquals<T, boolean> extends true ? Y :
79
- IfEquals<T, null> extends true ? Y :
80
- IfObject<T, Y> extends true ? Y :
81
- T extends (infer U)[] ? IfJson<U> extends true ? Y : N
82
- : N;
72
+ IfNull<T> extends true ? Y :
73
+ IfNever<T> extends true ? N :
74
+ IfUnknown<T> extends true ? N :
75
+ IfClass<T> extends true ? N :
76
+ IfFunction<T> extends true ? N :
77
+ IfUndefined<T> extends true ? N :
78
+ T extends symbol ? N :
79
+ T extends (infer U)[] ? IfJson<U> extends true ? Y : N
80
+ : Y;
83
81
 
84
82
  export type IfJsonOrAny<T, Y = true, N = false> =
85
83
  IfAny<T> extends true ? Y : IfJson<T, Y, N>;
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "lodash",
13
13
  "underscore"
14
14
  ],
15
- "version": "1.0.0",
15
+ "version": "1.1.2",
16
16
  "types": "lib/index.d.ts",
17
17
  "repository": "git@github.com:panates/ts-gems.git",
18
18
  "author": "Eray Hanoglu <e.hanoglu@panates.com>",
@@ -32,9 +32,10 @@
32
32
  "typescript": ">=4.0.0"
33
33
  },
34
34
  "devDependencies": {
35
- "@types/jest": "^27.0.3",
35
+ "@types/jest": "^27.4.0",
36
+ "jest": "^27.4.7",
36
37
  "prettier": "^2.5.1",
37
- "ts-jest": "^27.1.2",
38
- "typescript": "^4.5.4"
38
+ "ts-jest": "^27.1.3",
39
+ "typescript": "^4.5.5"
39
40
  }
40
41
  }