merge-anything 6.0.5 → 6.0.7
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/README.md +1 -1
- package/dist/typeUtils/Assign.d.ts +35 -30
- package/dist/typeUtils/Iteration.d.ts +31 -28
- package/dist/typeUtils/List.d.ts +20 -14
- package/dist/typeUtils/MergeDeep.d.ts +37 -32
- package/package.json +16 -14
package/README.md
CHANGED
|
@@ -194,7 +194,7 @@ const merged = copy(merge(original, extraInfo))
|
|
|
194
194
|
merged.airport.status = 'lan. 🛬'(merged.airport.status === 'lan. 🛬')(
|
|
195
195
|
// true
|
|
196
196
|
// `original` won't be modified!
|
|
197
|
-
original.airport.status === 'dep. 🛫'
|
|
197
|
+
original.airport.status === 'dep. 🛫',
|
|
198
198
|
) // true
|
|
199
199
|
```
|
|
200
200
|
|
|
@@ -2,49 +2,54 @@ import type { Iteration, IterationOf, Next, Pos } from './Iteration.js';
|
|
|
2
2
|
import type { Length, List } from './List.js';
|
|
3
3
|
import type { MergeDeep } from './MergeDeep.js';
|
|
4
4
|
/**
|
|
5
|
-
* Ask TS to re-check that `A1` extends `A2`.
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* @param A1 to check against
|
|
9
|
-
* @param A2 to cast to
|
|
10
|
-
* @returns `A1 | A2`
|
|
5
|
+
* Ask TS to re-check that `A1` extends `A2`. And if it fails, `A2` will be enforced anyway. Can
|
|
6
|
+
* also be used to add constraints on parameters.
|
|
7
|
+
*
|
|
11
8
|
* @example
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
9
|
+
* ;```ts
|
|
10
|
+
* type test0 = Cast<'42', string> // '42'
|
|
11
|
+
* type test1 = Cast<'42', number> // number
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* @param A1 To check against
|
|
15
|
+
* @param A2 To cast to
|
|
16
|
+
* @returns `A1 | A2`
|
|
16
17
|
*/
|
|
17
18
|
type Cast<A1, A2> = A1 extends A2 ? A1 : A2;
|
|
18
19
|
/**
|
|
19
|
-
* Check whether `A1` is part of `A2` or not. The difference with
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
* @param A2
|
|
23
|
-
* @returns [[Boolean]]
|
|
20
|
+
* Check whether `A1` is part of `A2` or not. The difference with `extends` is that it forces a
|
|
21
|
+
* [[Boolean]] return.
|
|
22
|
+
*
|
|
24
23
|
* @example
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* ```ts
|
|
25
|
+
* type test0 = Extends<'a' | 'b', 'b'> // Boolean
|
|
26
|
+
* type test1 = Extends<'a', 'a' | 'b'> // True
|
|
27
|
+
*
|
|
28
|
+
* type test2 = Extends<{a: string}, {a: any}> // True
|
|
29
|
+
* type test3 = Extends<{a: any}, {a: any, b: any}> // False
|
|
28
30
|
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
+
* type test4 = Extends<never, never> // False
|
|
32
|
+
* /// Nothing cannot extend nothing, use `Equals`
|
|
33
|
+
* ```
|
|
31
34
|
*
|
|
32
|
-
*
|
|
33
|
-
*
|
|
34
|
-
*
|
|
35
|
+
* @param A1
|
|
36
|
+
* @param A2
|
|
37
|
+
* @returns {undefined | undefined} Boolean
|
|
35
38
|
*/
|
|
36
39
|
type Extends<A1, A2> = [A1] extends [never] ? 0 : A1 extends A2 ? 1 : 0;
|
|
37
40
|
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
41
|
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
42
|
/**
|
|
40
|
-
* Assign a list of [[Object]] into `O` with [[MergeDeep]]. Merges from right to
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
* @param Os to assign
|
|
44
|
-
* @returns [[Object]]
|
|
43
|
+
* Assign a list of [[Object]] into `O` with [[MergeDeep]]. Merges from right to left, first items
|
|
44
|
+
* get overridden by the next ones (last-in overrides).
|
|
45
|
+
*
|
|
45
46
|
* @example
|
|
46
|
-
*
|
|
47
|
-
*
|
|
47
|
+
* ;```ts
|
|
48
|
+
* ```
|
|
49
|
+
*
|
|
50
|
+
* @param O To assign to
|
|
51
|
+
* @param Os To assign
|
|
52
|
+
* @returns {undefined | undefined} Object
|
|
48
53
|
*/
|
|
49
54
|
export 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
55
|
export {};
|
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* An entry of `IterationMap`
|
|
3
|
-
*/
|
|
1
|
+
/** An entry of `IterationMap` */
|
|
4
2
|
export type Iteration = [
|
|
5
3
|
value: number,
|
|
6
4
|
sign: '-' | '0' | '+',
|
|
@@ -213,45 +211,50 @@ export type IterationMap = {
|
|
|
213
211
|
'100': [100, '+', '99', '__', '-100'];
|
|
214
212
|
};
|
|
215
213
|
/**
|
|
216
|
-
* Transform a number into an [[Iteration]]
|
|
217
|
-
*
|
|
218
|
-
* @param N to transform
|
|
219
|
-
* @returns [[Iteration]]
|
|
214
|
+
* Transform a number into an [[Iteration]] (to use [[Prev]], [[Next]], & [[Pos]])
|
|
215
|
+
*
|
|
220
216
|
* @example
|
|
221
|
-
*
|
|
222
|
-
*
|
|
217
|
+
* ;```ts
|
|
218
|
+
* type i = IterationOf<0> // ["-1", "1", "0", 0, "0"]
|
|
223
219
|
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
220
|
+
* type next = Next<i> // ["0", "2", "1", 1, "+"]
|
|
221
|
+
* type prev = Prev<i> // ["-2", "0", "-1", -1, "-"]
|
|
226
222
|
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
223
|
+
* type nnext = Pos<next> // +1
|
|
224
|
+
* type nprev = Pos<prev> // -1
|
|
225
|
+
* ```
|
|
226
|
+
*
|
|
227
|
+
* @param N To transform
|
|
228
|
+
* @returns {undefined | undefined} Iteration
|
|
230
229
|
*/
|
|
231
230
|
export type IterationOf<N extends number> = `${N}` extends keyof IterationMap ? IterationMap[`${N}`] : IterationMap['__'];
|
|
232
231
|
/**
|
|
233
232
|
* Get the position of `I` (**number**)
|
|
234
|
-
*
|
|
235
|
-
* @returns `number`
|
|
233
|
+
*
|
|
236
234
|
* @example
|
|
237
|
-
*
|
|
238
|
-
*
|
|
235
|
+
* ;```ts
|
|
236
|
+
* type i = IterationOf<'20'>
|
|
237
|
+
*
|
|
238
|
+
* type test0 = Pos<i> // 20
|
|
239
|
+
* type test1 = Pos<Next<i>> // 21
|
|
240
|
+
* ```
|
|
239
241
|
*
|
|
240
|
-
*
|
|
241
|
-
*
|
|
242
|
-
* ```
|
|
242
|
+
* @param I To query
|
|
243
|
+
* @returns `number`
|
|
243
244
|
*/
|
|
244
245
|
export type Pos<I extends Iteration> = I[0];
|
|
245
246
|
/**
|
|
246
247
|
* Move `I`'s position forward
|
|
247
|
-
*
|
|
248
|
-
* @returns [[Iteration]]
|
|
248
|
+
*
|
|
249
249
|
* @example
|
|
250
|
-
*
|
|
251
|
-
*
|
|
250
|
+
* ;```ts
|
|
251
|
+
* type i = IterationOf<'20'>
|
|
252
|
+
*
|
|
253
|
+
* type test0 = Pos<i> // 20
|
|
254
|
+
* type test1 = Pos<Next<i>> // 21
|
|
255
|
+
* ```
|
|
252
256
|
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
* ```
|
|
257
|
+
* @param I To move
|
|
258
|
+
* @returns {undefined | undefined} Iteration
|
|
256
259
|
*/
|
|
257
260
|
export type Next<I extends Iteration> = IterationMap[I[3]];
|
package/dist/typeUtils/List.d.ts
CHANGED
|
@@ -1,29 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* A [[List]]
|
|
3
|
-
*
|
|
4
|
-
* @returns [[List]]
|
|
3
|
+
*
|
|
5
4
|
* @example
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
5
|
+
* ;```ts
|
|
6
|
+
* type list0 = [1, 2, 3]
|
|
7
|
+
* type list1 = number[]
|
|
8
|
+
* ```
|
|
9
|
+
*
|
|
10
|
+
* @param T Its type
|
|
11
|
+
* @returns {undefined | undefined} List
|
|
10
12
|
*/
|
|
11
13
|
export type List<T = unknown> = readonly T[];
|
|
12
14
|
/**
|
|
13
15
|
* Get the length of `L`
|
|
14
|
-
*
|
|
15
|
-
* @returns [[String]] or `number`
|
|
16
|
+
*
|
|
16
17
|
* @example
|
|
17
|
-
*
|
|
18
|
-
*
|
|
18
|
+
* ;```ts
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @param L To get length
|
|
22
|
+
* @returns {undefined | undefined} String or `number`
|
|
19
23
|
*/
|
|
20
24
|
export type Length<L extends List> = L['length'];
|
|
21
25
|
/**
|
|
22
26
|
* Return the last item out of a [[List]]
|
|
23
|
-
*
|
|
24
|
-
* @returns [[List]]
|
|
27
|
+
*
|
|
25
28
|
* @example
|
|
26
|
-
*
|
|
27
|
-
*
|
|
29
|
+
* ;```ts
|
|
30
|
+
* ```
|
|
31
|
+
*
|
|
32
|
+
* @param L
|
|
33
|
+
* @returns {undefined | undefined} List
|
|
28
34
|
*/
|
|
29
35
|
export type Pop<L extends List> = L extends readonly [] ? never : L extends [...unknown[], infer Last] ? Last : L extends (infer T)[] ? T : never;
|
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Get the keys of `O` that are optional
|
|
3
|
-
*
|
|
4
|
-
* @returns [[Key]]
|
|
3
|
+
*
|
|
5
4
|
* @example
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* ;```ts
|
|
6
|
+
* ```
|
|
7
|
+
*
|
|
8
|
+
* @param O
|
|
9
|
+
* @returns {undefined | undefined} Key
|
|
8
10
|
*/
|
|
9
11
|
type OptionalKeys<O extends object> = O extends unknown ? {
|
|
10
12
|
[K in keyof O]-?: {} extends Pick<O, K> ? K : never;
|
|
11
13
|
}[keyof O] : never;
|
|
12
14
|
/**
|
|
13
15
|
* Get the keys of `O` that are required
|
|
14
|
-
*
|
|
15
|
-
* @returns [[Key]]
|
|
16
|
+
*
|
|
16
17
|
* @example
|
|
17
|
-
*
|
|
18
|
-
*
|
|
18
|
+
* ;```ts
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* @param O
|
|
22
|
+
* @returns {undefined | undefined} Key
|
|
19
23
|
*/
|
|
20
24
|
type RequiredKeys<O extends object> = O extends unknown ? {
|
|
21
25
|
[K in keyof O]-?: {} extends Pick<O, K> ? never : K;
|
|
@@ -25,33 +29,34 @@ type MergeObjectDeeply<O extends Record<string | number | symbol, unknown>, O1 e
|
|
|
25
29
|
};
|
|
26
30
|
type MergeObjectsOrReturnFallback<O, O1, Fallback> = O extends Record<string | number | symbol, unknown> ? O1 extends Record<string | number | symbol, unknown> ? MergeObjectDeeply<O, O1> : Fallback : Fallback;
|
|
27
31
|
/**
|
|
28
|
-
* Accurately merge the fields of `O` with the ones of `O1`. It is
|
|
29
|
-
*
|
|
30
|
-
* fields will be handled gracefully.
|
|
32
|
+
* Accurately merge the fields of `O` with the ones of `O1`. It is equivalent to the spread operator
|
|
33
|
+
* in JavaScript. [[Union]]s and [[Optional]] fields will be handled gracefully.
|
|
31
34
|
*
|
|
32
35
|
* (⚠️ needs `--strictNullChecks` enabled)
|
|
33
|
-
*
|
|
34
|
-
* @param O1 to copy from
|
|
35
|
-
* @returns [[Object]]
|
|
36
|
+
*
|
|
36
37
|
* @example
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
*
|
|
38
|
+
* ;```ts
|
|
39
|
+
* import { PrettyPrint } from './PrettyPrint'
|
|
40
|
+
*
|
|
41
|
+
* type A1 = { a: number; b?: number; d?: number; e?: number; x: string; y?: number; z: string; } // prettier-ignore
|
|
42
|
+
* type A2 = { a?: number; c?: number; d?: number; e: number; x: number | undefined; y?: string; z?: number; } // prettier-ignore
|
|
43
|
+
*
|
|
44
|
+
* type Result = PrettyPrint<MergeDeep<A1, A2>>
|
|
45
|
+
* {
|
|
46
|
+
* a: number;
|
|
47
|
+
* b?: number | undefined;
|
|
48
|
+
* c?: number | undefined;
|
|
49
|
+
* d?: number | undefined;
|
|
50
|
+
* e: number;
|
|
51
|
+
* x: number | undefined;
|
|
52
|
+
* y?: string | number | undefined;
|
|
53
|
+
* z: string | number;
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*
|
|
57
|
+
* @param O To complete
|
|
58
|
+
* @param O1 To copy from
|
|
59
|
+
* @returns {undefined | undefined} Object
|
|
55
60
|
*/
|
|
56
61
|
export 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;
|
|
57
62
|
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "merge-anything",
|
|
3
|
-
"version": "6.0.
|
|
3
|
+
"version": "6.0.7",
|
|
4
4
|
"description": "Merge objects & other types recursively. A simple & small integration.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
@@ -10,21 +10,17 @@
|
|
|
10
10
|
"engines": {
|
|
11
11
|
"node": ">=18"
|
|
12
12
|
},
|
|
13
|
-
"scripts": {
|
|
14
|
-
"lint": "tsc --noEmit && eslint ./src",
|
|
15
|
-
"test": "vitest run",
|
|
16
|
-
"build": "del-cli dist && tsc",
|
|
17
|
-
"release": "npm run lint && npm run build && np"
|
|
18
|
-
},
|
|
19
13
|
"dependencies": {
|
|
20
|
-
"is-what": "^5.2
|
|
14
|
+
"is-what": "^5.5.2"
|
|
21
15
|
},
|
|
22
16
|
"devDependencies": {
|
|
23
|
-
"@cycraft/eslint": "^0.4.
|
|
17
|
+
"@cycraft/eslint": "^0.4.11",
|
|
24
18
|
"@cycraft/tsconfig": "^0.1.2",
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
19
|
+
"bumpp": "^12.3.0",
|
|
20
|
+
"del-cli": "^7.0.0",
|
|
21
|
+
"eslint": "^9.20.1",
|
|
22
|
+
"typescript": "^5.9.3",
|
|
23
|
+
"vitest": "^5.0.2"
|
|
28
24
|
},
|
|
29
25
|
"files": [
|
|
30
26
|
"dist"
|
|
@@ -59,5 +55,11 @@
|
|
|
59
55
|
"url": "https://github.com/mesqueeb/merge-anything.git"
|
|
60
56
|
},
|
|
61
57
|
"homepage": "https://github.com/mesqueeb/merge-anything#readme",
|
|
62
|
-
"bugs": "https://github.com/mesqueeb/merge-anything/issues"
|
|
63
|
-
|
|
58
|
+
"bugs": "https://github.com/mesqueeb/merge-anything/issues",
|
|
59
|
+
"scripts": {
|
|
60
|
+
"lint": "tsc --noEmit && eslint ./src",
|
|
61
|
+
"test": "vitest run",
|
|
62
|
+
"build": "del-cli dist && tsc",
|
|
63
|
+
"release": "pnpm run lint && pnpm run build && pnpm test && bumpp --no-push --all && pnpm publish --no-git-checks && npx jsr publish && git push --follow-tags && gh release create $(git describe --tags --abbrev=0) --generate-notes --notes \"$(git log --pretty='- %s %h' $(git describe --tags --abbrev=0 HEAD~1 2>/dev/null || git rev-list --max-parents=0 HEAD)..HEAD~1)\""
|
|
64
|
+
}
|
|
65
|
+
}
|