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 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
- * And if it fails, `A2` will be enforced anyway.
7
- * Can also be used to add constraints on parameters.
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
- * ```ts
13
- * type test0 = Cast<'42', string> // '42'
14
- * type test1 = Cast<'42', number> // number
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
- * `extends` is that it forces a [[Boolean]] return.
21
- * @param A1
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
- * ```ts
26
- * type test0 = Extends<'a' | 'b', 'b'> // Boolean
27
- * type test1 = Extends<'a', 'a' | 'b'> // True
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
- * type test2 = Extends<{a: string}, {a: any}> // True
30
- * type test3 = Extends<{a: any}, {a: any, b: any}> // False
31
+ * type test4 = Extends<never, never> // False
32
+ * /// Nothing cannot extend nothing, use `Equals`
33
+ * ```
31
34
  *
32
- * type test4 = Extends<never, never> // False
33
- * /// Nothing cannot extend nothing, use `Equals`
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
- * left, first items get overridden by the next ones (last-in overrides).
42
- * @param O to assign to
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
- * ```ts
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
- * (to use [[Prev]], [[Next]], & [[Pos]])
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
- * ```ts
222
- * type i = IterationOf<0> // ["-1", "1", "0", 0, "0"]
217
+ * ;```ts
218
+ * type i = IterationOf<0> // ["-1", "1", "0", 0, "0"]
223
219
  *
224
- * type next = Next<i> // ["0", "2", "1", 1, "+"]
225
- * type prev = Prev<i> // ["-2", "0", "-1", -1, "-"]
220
+ * type next = Next<i> // ["0", "2", "1", 1, "+"]
221
+ * type prev = Prev<i> // ["-2", "0", "-1", -1, "-"]
226
222
  *
227
- * type nnext = Pos<next> // +1
228
- * type nprev = Pos<prev> // -1
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
- * @param I to query
235
- * @returns `number`
233
+ *
236
234
  * @example
237
- * ```ts
238
- * type i = IterationOf<'20'>
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
- * type test0 = Pos<i> // 20
241
- * type test1 = Pos<Next<i>> // 21
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
- * @param I to move
248
- * @returns [[Iteration]]
248
+ *
249
249
  * @example
250
- * ```ts
251
- * type i = IterationOf<'20'>
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
- * type test0 = Pos<i> // 20
254
- * type test1 = Pos<Next<i>> // 21
255
- * ```
257
+ * @param I To move
258
+ * @returns {undefined | undefined} Iteration
256
259
  */
257
260
  export type Next<I extends Iteration> = IterationMap[I[3]];
@@ -1,29 +1,35 @@
1
1
  /**
2
2
  * A [[List]]
3
- * @param T its type
4
- * @returns [[List]]
3
+ *
5
4
  * @example
6
- * ```ts
7
- * type list0 = [1, 2, 3]
8
- * type list1 = number[]
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
- * @param L to get length
15
- * @returns [[String]] or `number`
16
+ *
16
17
  * @example
17
- * ```ts
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
- * @param L
24
- * @returns [[List]]
27
+ *
25
28
  * @example
26
- * ```ts
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
- * @param O
4
- * @returns [[Key]]
3
+ *
5
4
  * @example
6
- * ```ts
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
- * @param O
15
- * @returns [[Key]]
16
+ *
16
17
  * @example
17
- * ```ts
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
- * equivalent to the spread operator in JavaScript. [[Union]]s and [[Optional]]
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
- * @param O to complete
34
- * @param O1 to copy from
35
- * @returns [[Object]]
36
+ *
36
37
  * @example
37
- * ```ts
38
- * import { PrettyPrint } from './PrettyPrint'
39
- *
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
42
- *
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
- * }
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.5",
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.0"
14
+ "is-what": "^5.5.2"
21
15
  },
22
16
  "devDependencies": {
23
- "@cycraft/eslint": "^0.4.3",
17
+ "@cycraft/eslint": "^0.4.11",
24
18
  "@cycraft/tsconfig": "^0.1.2",
25
- "del-cli": "^6.0.0",
26
- "np": "^10.2.0",
27
- "vitest": "^3.0.6"
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
+ }