@koine/utils 2.0.0-beta.183 → 2.0.0-beta.185

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 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,o)=>o?Object.keys(o).reduce((r,l)=>(isObject.isObject(o[l])?(t[l]||(t[l]={}),r[l]=objectMergeWithDefaults(t[l],o[l])):r[l]=void 0===o[l]||null===o[l]?t[l]:o[l],r),{...t}):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, RequiredDeep, Simplify } from "type-fest";
1
+ import type { MergeDeep, SimplifyDeep } from "type-fest";
2
2
  import type { PlainObject } from "./getType";
3
- export type ObjectMergeWithDefaults<Defaults, Overrides, DeleteIfNull extends boolean = false> = Simplify<RequiredDeep<MergeDeep<Overrides, Defaults>>>;
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,o)=>o?Object.keys(o).reduce((r,l)=>(isObject(o[l])?(t[l]||(t[l]={}),r[l]=objectMergeWithDefaults(t[l],o[l])):r[l]=void 0===o[l]||null===o[l]?t[l]:o[l],r),{...t}):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
@@ -1015,5 +1015,5 @@
1015
1015
  "module": "./index.esm.js",
1016
1016
  "main": "./index.cjs.js",
1017
1017
  "types": "./index.esm.d.ts",
1018
- "version": "2.0.0-beta.183"
1018
+ "version": "2.0.0-beta.185"
1019
1019
  }
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
+ };