@koine/utils 2.0.0-beta.182 → 2.0.0-beta.184
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/index.d.ts +1 -1
- package/objectMergeWithDefaults.cjs.js +1 -1
- package/objectMergeWithDefaults.d.ts +12 -5
- package/objectMergeWithDefaults.esm.js +1 -1
- package/package.json +1 -1
- package/types.d.ts +63 -1
package/index.d.ts
CHANGED
|
@@ -155,7 +155,7 @@ export { uppercase } from "./uppercase";
|
|
|
155
155
|
export { uuid } from "./uuid";
|
|
156
156
|
export { uuidNumeric } from "./uuidNumeric";
|
|
157
157
|
export { wait } from "./wait";
|
|
158
|
-
export type { AnythingFalsy, FlatObjectFirstLevel, KeysStartsWith, KeysTailsStartsWith, PickStartsWith, PickStartsWithTails, Reverse, TestType, } from "./types";
|
|
158
|
+
export type { AnythingFalsy, FlatObjectFirstLevel, KeysStartsWith, KeysTailsStartsWith, NonNullableObjectDeep, NullableObjectDeep, OmitNever, PickStartsWith, PickStartsWithTails, RequiredNonNullableObjectDeep, RequiredObjectDeep, Reverse, TestType, } from "./types";
|
|
159
159
|
/**
|
|
160
160
|
* These types should not be documented by using [`excludeExternals` TypeDoc flag](https://typedoc.org/options/input/#excludeexternals)
|
|
161
161
|
*/
|
|
@@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
4
4
|
|
|
5
5
|
var isObject = require('./isObject.cjs.js');
|
|
6
6
|
|
|
7
|
-
let objectMergeWithDefaults=(t,
|
|
7
|
+
let objectMergeWithDefaults=(t,l,r)=>l?Object.keys(l).reduce((u,o)=>{if(isObject.isObject(l[o]))t[o]||(t[o]={}),u[o]=objectMergeWithDefaults(t[o],l[o]);else {let e=l[o];null===e&&r?delete u[o]:u[o]=null==e?t[o]:e;}return u},{...t}):t;
|
|
8
8
|
|
|
9
9
|
exports.default = objectMergeWithDefaults;
|
|
10
10
|
exports.objectMergeWithDefaults = objectMergeWithDefaults;
|
|
@@ -1,6 +1,12 @@
|
|
|
1
|
-
import type { MergeDeep,
|
|
1
|
+
import type { MergeDeep, SimplifyDeep } from "type-fest";
|
|
2
2
|
import type { PlainObject } from "./getType";
|
|
3
|
-
|
|
3
|
+
type PrepareMergeableObject<Source extends PlainObject, WhereToCheckValues extends PlainObject, ExcludeType = never> = {
|
|
4
|
+
[K in Extract<keyof Source, string> as NonNullable<Source[K]> extends never ? never : K extends keyof WhereToCheckValues ? WhereToCheckValues[K] extends ExcludeType | never ? never : K : K]-?: Exclude<Source[K], undefined> extends infer NewSource ? NewSource extends Array<any> | Readonly<Array<any>> ? NewSource : NewSource extends PlainObject ? NonNullable<WhereToCheckValues[K]> extends PlainObject ? PrepareMergeableObject<NewSource, WhereToCheckValues[K], ExcludeType> : PrepareMergeableObject<NewSource, {}> : NewSource : never;
|
|
5
|
+
} extends infer O ? O : never;
|
|
6
|
+
/**
|
|
7
|
+
* Type representation of {@link objectMergeWithDefaults}
|
|
8
|
+
*/
|
|
9
|
+
export type ObjectMergeWithDefaults<Defaults extends PlainObject, Overrides extends PlainObject, DeleteIfNull extends boolean = false> = SimplifyDeep<MergeDeep<DeleteIfNull extends true ? PrepareMergeableObject<Defaults, Overrides, null> : Defaults, PrepareMergeableObject<Overrides, Overrides, null | undefined>>>;
|
|
4
10
|
/**
|
|
5
11
|
* Merge object _overrides_ onto object _defaults_, immutably
|
|
6
12
|
*
|
|
@@ -10,8 +16,9 @@ export type ObjectMergeWithDefaults<Defaults, Overrides, DeleteIfNull extends bo
|
|
|
10
16
|
* makes it harder to remove a property defined on the defaults
|
|
11
17
|
*
|
|
12
18
|
* @category object
|
|
13
|
-
* @param defaults
|
|
14
|
-
* @param overrides
|
|
19
|
+
* @param defaults The default values
|
|
20
|
+
* @param overrides The values to override and/or extend the defaults
|
|
21
|
+
* @param deleteIfNull When `true` the overrides' object keys whose value is an explicit `null` will delete the keys of the output merge object
|
|
15
22
|
*/
|
|
16
|
-
export declare let objectMergeWithDefaults: <D extends PlainObject, O extends PlainObject, DeleteIfNull extends boolean>(defaults: D, overrides?: O) => ObjectMergeWithDefaults<D, O, DeleteIfNull>;
|
|
23
|
+
export declare let objectMergeWithDefaults: <D extends PlainObject, O extends PlainObject, DeleteIfNull extends boolean = false>(defaults: D, overrides?: O, deleteIfNull?: DeleteIfNull) => ObjectMergeWithDefaults<D, O, DeleteIfNull>;
|
|
17
24
|
export default objectMergeWithDefaults;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { isObject } from './isObject.esm.js';
|
|
2
2
|
|
|
3
|
-
let objectMergeWithDefaults=(t,
|
|
3
|
+
let objectMergeWithDefaults=(t,l,r)=>l?Object.keys(l).reduce((u,o)=>{if(isObject(l[o]))t[o]||(t[o]={}),u[o]=objectMergeWithDefaults(t[o],l[o]);else {let e=l[o];null===e&&r?delete u[o]:u[o]=null==e?t[o]:e;}return u},{...t}):t;
|
|
4
4
|
|
|
5
5
|
export { objectMergeWithDefaults as default, objectMergeWithDefaults };
|
package/package.json
CHANGED
package/types.d.ts
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import type { Replace } from "type-fest";
|
|
1
|
+
import type { Replace, Simplify } from "type-fest";
|
|
2
2
|
/**
|
|
3
3
|
* Type to test types
|
|
4
4
|
*
|
|
5
|
+
* @category type
|
|
5
6
|
* @example
|
|
6
7
|
*
|
|
7
8
|
* ```ts
|
|
@@ -16,6 +17,8 @@ import type { Replace } from "type-fest";
|
|
|
16
17
|
export type TestType<RightImplementation extends true, WrongImplementation extends true = true> = RightImplementation | WrongImplementation;
|
|
17
18
|
/**
|
|
18
19
|
* Whatever that in javascript returns `false` when checked in an `if` condition
|
|
20
|
+
*
|
|
21
|
+
* @category type
|
|
19
22
|
*/
|
|
20
23
|
export type AnythingFalsy = null | undefined | 0 | "";
|
|
21
24
|
/**
|
|
@@ -23,6 +26,7 @@ export type AnythingFalsy = null | undefined | 0 | "";
|
|
|
23
26
|
* root.
|
|
24
27
|
*
|
|
25
28
|
* @borrows [SO' answer by jcalz](https://stackoverflow.com/a/78779784/1938970)
|
|
29
|
+
* @category type
|
|
26
30
|
*/
|
|
27
31
|
export type FlatObjectFirstLevel<T extends object> = {
|
|
28
32
|
[K in keyof T]: (x: T[K]) => void;
|
|
@@ -32,17 +36,23 @@ export type FlatObjectFirstLevel<T extends object> = {
|
|
|
32
36
|
/**
|
|
33
37
|
* Pick the keys of an object `T` that starts with `S`. It produces a mapped type
|
|
34
38
|
* with a subset of `T` whose keys start with `S`.
|
|
39
|
+
*
|
|
40
|
+
* @category type
|
|
35
41
|
*/
|
|
36
42
|
export type PickStartsWith<T extends object, S extends string> = {
|
|
37
43
|
[K in keyof T as K extends `${S}${string}` ? K : never]: T[K];
|
|
38
44
|
};
|
|
39
45
|
/**
|
|
40
46
|
* Returns a union of all the keys of an object `T` which starts with `S`.
|
|
47
|
+
*
|
|
48
|
+
* @category type
|
|
41
49
|
*/
|
|
42
50
|
export type KeysStartsWith<T extends object, S extends string> = keyof PickStartsWith<T, S>;
|
|
43
51
|
/**
|
|
44
52
|
* Pick the keys of an object `T` that starts with `S`. It produces a mapped type
|
|
45
53
|
* with a subset of `T` whose keys start with `S` *and have `S`* removed.
|
|
54
|
+
*
|
|
55
|
+
* @category type
|
|
46
56
|
*/
|
|
47
57
|
export type PickStartsWithTails<T extends object, S extends string> = {
|
|
48
58
|
[K in keyof T as K extends `${S}${string}` ? Replace<K, S, ""> : never]: T[K];
|
|
@@ -50,9 +60,61 @@ export type PickStartsWithTails<T extends object, S extends string> = {
|
|
|
50
60
|
/**
|
|
51
61
|
* Returns a union of all the keys of an object `T` which starts with `S`.
|
|
52
62
|
* The strings in the produced union *have `S` removed*.
|
|
63
|
+
*
|
|
64
|
+
* @category type
|
|
53
65
|
*/
|
|
54
66
|
export type KeysTailsStartsWith<T extends object, S extends string> = keyof PickStartsWithTails<T, S>;
|
|
55
67
|
/**
|
|
56
68
|
* @borrows [SO's answer by 钵钵鸡实力代购](https://stackoverflow.com/a/64994122/1938970)
|
|
57
69
|
*/
|
|
58
70
|
export type Reverse<Tuple> = Tuple extends [infer Head, ...infer Rest] ? [...Reverse<Rest>, Head] : [];
|
|
71
|
+
/**
|
|
72
|
+
* Make _nullable_ all properties of objec T (deeply)
|
|
73
|
+
* @use `{ key: $ | null }`
|
|
74
|
+
*
|
|
75
|
+
* @category type
|
|
76
|
+
*/
|
|
77
|
+
export type NullableObjectDeep<T extends object> = {
|
|
78
|
+
[K in keyof T]: T[K] extends object ? NullableObjectDeep<T[K]> | null : T[K] | null;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Make _non nullable_ all properties of objec T (deeply)
|
|
82
|
+
* @use `{ key: NonNullable<$> }`
|
|
83
|
+
*
|
|
84
|
+
* @category type
|
|
85
|
+
*/
|
|
86
|
+
export type NonNullableObjectDeep<T extends object> = {
|
|
87
|
+
[K in keyof T]: T[K] extends object ? NonNullableObjectDeep<NonNullable<T[K]>> : NonNullable<T[K]>;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* Make _required_ all properties of objec T (deeply)
|
|
91
|
+
* @use `{ key-?: Exclude<$, undefined> }`
|
|
92
|
+
*
|
|
93
|
+
* @category type
|
|
94
|
+
*/
|
|
95
|
+
export type RequiredObjectDeep<T extends object> = Simplify<{
|
|
96
|
+
[K in keyof T]-?: T[K] extends object ? Exclude<RequiredObjectDeep<T[K]>, undefined> : Exclude<T[K], undefined>;
|
|
97
|
+
}>;
|
|
98
|
+
/**
|
|
99
|
+
* Make _required_ and _non nullable_ all properties of objec T (deeply)
|
|
100
|
+
* @use `{ key-?: NonNullable<$> }`
|
|
101
|
+
*
|
|
102
|
+
* @category type
|
|
103
|
+
*/
|
|
104
|
+
export type RequiredNonNullableObjectDeep<T extends object> = Simplify<{
|
|
105
|
+
[K in keyof T]-?: T[K] extends object ? NonNullable<RequiredNonNullableObjectDeep<T[K]>> : NonNullable<T[K]>;
|
|
106
|
+
}>;
|
|
107
|
+
/**
|
|
108
|
+
* Construct a type with the properties of T except for those whose value is `never`
|
|
109
|
+
*
|
|
110
|
+
* @category type
|
|
111
|
+
*
|
|
112
|
+
@example
|
|
113
|
+
```ts
|
|
114
|
+
type A = OmitNever<"a" | never>; // A = "a"
|
|
115
|
+
type B = OmitNever<{ a: never; b: 1 }> // B = { b: 1; }
|
|
116
|
+
```
|
|
117
|
+
*/
|
|
118
|
+
export type OmitNever<T> = {
|
|
119
|
+
[K in keyof T as T[K] extends never ? never : K]: T[K];
|
|
120
|
+
};
|