Skip to content

Commit b833569

Browse files
authored
feat: allow source to accept type undefined (#2)
1 parent 223aebe commit b833569

2 files changed

Lines changed: 18 additions & 18 deletions

File tree

src/index.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { isObject, isArray, isUndefined, isNull } from '@hypernym/utils'
2-
import type { MergeRecord, MergeOptions, Merge } from './types'
2+
import type { MergeSource, MergeOptions, Merge } from './types'
33

44
/**
55
* Type-safe deep merge utility.
@@ -18,13 +18,13 @@ import type { MergeRecord, MergeOptions, Merge } from './types'
1818
*
1919
* @see [Repository](https://github.com/hypernym-studio/merge)
2020
*/
21-
export function merge<T extends MergeRecord[], O extends MergeOptions>(
21+
export function merge<T extends MergeSource[], O extends MergeOptions>(
2222
sources: [...T],
2323
options?: O & MergeOptions & { depth?: O['depth'] },
2424
): Merge<T, O> {
2525
const { rules, depth = 6 } = options || {}
2626

27-
return sources.reduce((prev: MergeRecord, curr: MergeRecord) => {
27+
return sources.reduce((prev: MergeSource, curr: MergeSource) => {
2828
if (prev && curr) {
2929
Object.keys(curr).forEach((key) => {
3030
if (['__proto__', 'constructor', 'prototype'].includes(key)) return

src/types.ts

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,9 @@ type LastSource<T extends any[], K extends PropertyKey> = T extends [
1111
: LastSource<R, K>
1212
: never
1313

14-
type ExtractValue<T extends MergeRecord[], K extends PropertyKey> = T extends [
15-
infer F extends MergeRecord,
16-
...infer R extends MergeRecord[],
14+
type ExtractValue<T extends MergeSource[], K extends PropertyKey> = T extends [
15+
infer F extends MergeSource,
16+
...infer R extends MergeSource[],
1717
]
1818
? K extends keyof F
1919
? [F[K], ...ExtractValue<R, K>]
@@ -25,21 +25,19 @@ type SkipRules<O extends MergeOptions> =
2525
| (O['rules'] extends { null: 'skip' } ? null : never)
2626

2727
type LastValue<
28-
T extends MergeRecord[],
28+
T extends MergeSource[],
2929
K extends PropertyKey,
3030
O extends MergeOptions,
3131
> = T extends [...infer R, infer L]
32-
? L extends MergeRecord
33-
? K extends keyof L
34-
? Exclude<L[K], SkipRules<O>> extends never
35-
? LastValue<R extends MergeRecord[] ? R : [], K, O>
36-
: Exclude<L[K], SkipRules<O>>
37-
: LastValue<R extends MergeRecord[] ? R : [], K, O>
38-
: LastValue<R extends MergeRecord[] ? R : [], K, O>
32+
? K extends keyof L
33+
? Exclude<L[K], SkipRules<O>> extends never
34+
? LastValue<R extends MergeSource[] ? R : [], K, O>
35+
: Exclude<L[K], SkipRules<O>>
36+
: LastValue<R extends MergeSource[] ? R : [], K, O>
3937
: never
4038

4139
type ArrayValue<
42-
T extends MergeRecord[],
40+
T extends MergeSource[],
4341
K extends PropertyKey,
4442
O extends MergeOptions,
4543
> = O['rules'] extends { array: 'override' }
@@ -67,14 +65,16 @@ export type MergePrimitives =
6765

6866
export type MergeRecord = Record<PropertyKey, any>
6967

68+
export type MergeSource = MergeRecord | undefined
69+
7070
export type MergeAllKeys<T extends any[]> = T extends [infer K, ...infer R]
7171
? keyof K | MergeAllKeys<R extends any[] ? R : []>
7272
: never
7373

7474
export type MergeArray<T> = T extends any[] ? T[number] : never
7575

7676
export type MergeValue<
77-
T extends MergeRecord[],
77+
T extends MergeSource[],
7878
K extends PropertyKey,
7979
O extends MergeOptions,
8080
> = O['depth'] extends 0
@@ -104,14 +104,14 @@ export type MergeExpand<T> = T extends infer U
104104
: never
105105

106106
export type MergeTypes<
107-
T extends MergeRecord[],
107+
T extends MergeSource[],
108108
O extends MergeOptions = MergeOptions,
109109
> = MergeExpand<{
110110
[K in MergeAllKeys<T>]: Exclude<MergeValue<T, K, O>, SkipRules<O>>
111111
}>
112112

113113
export type Merge<
114-
T extends MergeRecord[],
114+
T extends MergeSource[],
115115
O extends MergeOptions = MergeOptions,
116116
> = MergeTypes<T, O>
117117

0 commit comments

Comments
 (0)