merge-anything 5.1.0 → 5.1.1

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.
@@ -6,7 +6,7 @@ import type { PrettyPrint } from './typeUtils/PrettyPrint';
6
6
  *
7
7
  * This TS Utility can be used as standalone as well
8
8
  */
9
- export declare type Merge<T extends object, Ts extends List<object>> = PrettyPrint<Assign<T, Ts>>;
9
+ export declare type Merge<T extends Record<string | number | symbol, unknown>, Ts extends List<Record<string | number | symbol, unknown>>> = PrettyPrint<Assign<T, Ts>>;
10
10
  /**
11
11
  * Merge anything recursively.
12
12
  * Objects get merged, special objects (classes etc.) are re-assigned "as is".
@@ -34,8 +34,8 @@ declare type Cast<A1, A2> = A1 extends A2 ? A1 : A2;
34
34
  * ```
35
35
  */
36
36
  declare type Extends<A1, A2> = [A1] extends [never] ? 0 : A1 extends A2 ? 1 : 0;
37
- declare type __Assign<O extends object, Os extends List<object>, I extends Iteration = IterationOf<0>> = Extends<Pos<I>, Length<Os>> extends 1 ? O : __Assign<MergeDeep<O, Os[Pos<I>]>, Os, Next<I>>;
38
- declare type _Assign<O extends object, Os extends List<object>> = __Assign<O, Os> extends infer X ? Cast<X, object> : never;
37
+ declare type __Assign<O extends Record<string | number | symbol, unknown>, Os extends List<Record<string | number | symbol, unknown>>, I extends Iteration = IterationOf<0>> = Extends<Pos<I>, Length<Os>> extends 1 ? O : __Assign<MergeDeep<O, Os[Pos<I>]>, Os, Next<I>>;
38
+ declare type _Assign<O extends Record<string | number | symbol, unknown>, Os extends List<Record<string | number | symbol, unknown>>> = __Assign<O, Os> extends infer X ? Cast<X, Record<string | number | symbol, unknown>> : never;
39
39
  /**
40
40
  * Assign a list of [[Object]] into `O` with [[MergeDeep]]. Merges from right to
41
41
  * left, first items get overridden by the next ones (last-in overrides).
@@ -46,5 +46,5 @@ declare type _Assign<O extends object, Os extends List<object>> = __Assign<O, Os
46
46
  * ```ts
47
47
  * ```
48
48
  */
49
- export declare type Assign<O extends object, Os extends List<object>> = O extends unknown ? Os extends unknown ? _Assign<O, Os> : never : never;
49
+ export declare type Assign<O extends Record<string | number | symbol, unknown>, Os extends List<Record<string | number | symbol, unknown>>> = O extends unknown ? (Os extends unknown ? _Assign<O, Os> : never) : never;
50
50
  export {};
@@ -1,30 +1,29 @@
1
1
  /**
2
- * Make an object properties (all) `never`. We use this to intersect `object`s and
3
- * preserve the combine modifiers like `+readonly` and `?optional`.
2
+ * Get the keys of `O` that are optional
3
+ * @param O
4
+ * @returns [[Key]]
5
+ * @example
6
+ * ```ts
7
+ * ```
4
8
  */
5
- declare type Anyfy<O extends object> = {
6
- [K in keyof O]: any;
7
- };
9
+ declare type OptionalKeys<O extends object> = O extends unknown ? {
10
+ [K in keyof O]-?: {} extends Pick<O, K> ? K : never;
11
+ }[keyof O] : never;
8
12
  /**
9
- * Get in `O` the type of a field of key `K`
10
- * @param O to extract from
11
- * @param K to extract at
12
- * @returns [[Any]]
13
+ * Get the keys of `O` that are required
14
+ * @param O
15
+ * @returns [[Key]]
13
16
  * @example
14
17
  * ```ts
15
- * type User = {
16
- * info: { name: string; age: number; payment: {} }
17
- * id: number
18
- * }
19
- *
20
- * type test0 = At<User, 'id'> // number
21
18
  * ```
22
19
  */
23
- declare type At<A, K extends string | number | symbol> = unknown extends A ? unknown : K extends keyof A ? A[K] : undefined;
20
+ declare type RequiredKeys<O extends object> = O extends unknown ? {
21
+ [K in keyof O]-?: {} extends Pick<O, K> ? never : K;
22
+ }[keyof O] : never;
24
23
  declare type MergeObjectDeeply<O extends Record<string | number | symbol, unknown>, O1 extends Record<string | number | symbol, unknown>> = {
25
- [K in keyof (Anyfy<O> & O1)]: K extends keyof O1 ? MergeObjectOrReturnValue<At<O, K>, At<O1, K>> : O[K];
24
+ [K in keyof (O & O1)]: K extends RequiredKeys<O1> ? MergeObjectsOrReturnFallback<O[K], O1[K], O1[K]> : K extends OptionalKeys<O1> ? K extends OptionalKeys<O> ? MergeObjectsOrReturnFallback<Exclude<O[K], undefined>, Exclude<O1[K], undefined>, Exclude<O[K], undefined> | Exclude<O1[K], undefined>> : K extends RequiredKeys<O> ? Exclude<O1[K], undefined> extends O[K] ? O[K] : MergeObjectsOrReturnFallback<O[K], Exclude<O1[K], undefined>, O[K] | Exclude<O1[K], undefined>> : O1[K] : O[K];
26
25
  };
27
- declare type MergeObjectOrReturnValue<OK, O1K> = [O1K] extends [never] ? OK : OK extends Record<string | number | symbol, unknown> ? O1K extends Record<string | number | symbol, unknown> ? MergeObjectDeeply<OK, O1K> : O1K : O1K;
26
+ declare type MergeObjectsOrReturnFallback<O, O1, Fallback> = O extends Record<string | number | symbol, unknown> ? O1 extends Record<string | number | symbol, unknown> ? MergeObjectDeeply<O, O1> : Fallback : Fallback;
28
27
  /**
29
28
  * Accurately merge the fields of `O` with the ones of `O1`. It is
30
29
  * equivalent to the spread operator in JavaScript. [[Union]]s and [[Optional]]
@@ -36,32 +35,23 @@ declare type MergeObjectOrReturnValue<OK, O1K> = [O1K] extends [never] ? OK : OK
36
35
  * @returns [[Object]]
37
36
  * @example
38
37
  * ```ts
39
- * type O = {
40
- * name?: string
41
- * age?: number
42
- * zip?: string
43
- * pay: { cvv?: number }
44
- * }
38
+ * import { PrettyPrint } from './PrettyPrint'
45
39
  *
46
- * type O1 = {
47
- * age: number
48
- * zip?: number
49
- * pay: { cvv : number; ccn?: string }
50
- * city: string
51
- * }
40
+ * type A1 = { a: number; b?: number; d?: number; e?: number; x: string; y?: number; z: string; } // prettier-ignore
41
+ * type A2 = { a?: number; c?: number; d?: number; e: number; x: number | undefined; y?: string; z?: number; } // prettier-ignore
52
42
  *
53
- * type test = MergeDeep<O, O1>
54
- * // {
55
- * // name?: string;
56
- * // age: number;
57
- * // zip: number | undefined;
58
- * // pay: {
59
- * // cvv: number;
60
- * // ccn?: string;
61
- * // };
62
- * // city: string;
63
- * // }
43
+ * type Result = PrettyPrint<MergeDeep<A1, A2>>
44
+ * {
45
+ * a: number;
46
+ * b?: number | undefined;
47
+ * c?: number | undefined;
48
+ * d?: number | undefined;
49
+ * e: number;
50
+ * x: number | undefined;
51
+ * y?: string | number | undefined;
52
+ * z: string | number;
53
+ * }
64
54
  * ```
65
55
  */
66
- export declare type MergeDeep<O extends object, O1 extends object> = O extends unknown ? O1 extends unknown ? MergeObjectOrReturnValue<O, O1> : never : never;
56
+ export declare type MergeDeep<O extends Record<string | number | symbol, unknown>, O1 extends Record<string | number | symbol, unknown>> = O extends unknown ? (O1 extends unknown ? MergeObjectDeeply<O, O1> : never) : never;
67
57
  export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "merge-anything",
3
- "version": "5.1.0",
3
+ "version": "5.1.1",
4
4
  "sideEffects": false,
5
5
  "type": "module",
6
6
  "description": "Merge objects & other types recursively. A simple & small integration.",