@@ -26,7 +26,7 @@ export function filterProperties<T>(obj: Record<string, T>, fn: (o: T) => boolea
26
26
return result ;
27
27
}
28
28
29
- export function merge < T > ( src : T , target : T ) : T {
29
+ export function merge < T > ( src : T , target : T , shallow ?: boolean ) : T {
30
30
if ( typeof src !== "object" || typeof target !== "object" ) {
31
31
return target ;
32
32
}
@@ -42,7 +42,12 @@ export function merge<T>(src: T, target: T): T {
42
42
if ( Array . isArray ( srcProp ) !== Array . isArray ( targetProp ) ) {
43
43
throw new Error ( "Mismatch on property: " + k + JSON . stringify ( targetProp ) ) ;
44
44
}
45
- src [ k ] = merge ( src [ k ] , target [ k ] ) ;
45
+ if ( shallow && "name" in src [ k ] && "name" in target [ k ] ) {
46
+ src [ k ] = target [ k ] ;
47
+ }
48
+ else {
49
+ src [ k ] = merge ( src [ k ] , target [ k ] , shallow ) ;
50
+ }
46
51
}
47
52
}
48
53
else {
@@ -53,17 +58,19 @@ export function merge<T>(src: T, target: T): T {
53
58
return src ;
54
59
}
55
60
56
- function mergeNamedArrays < T extends { name : string } > ( srcProp : T [ ] , targetProp : T [ ] ) {
61
+ function mergeNamedArrays < T extends { name : string ; "new-type" : string ; } > ( srcProp : T [ ] , targetProp : T [ ] ) {
57
62
const map : any = { } ;
58
63
for ( const e1 of srcProp ) {
59
- if ( e1 . name ) {
60
- map [ e1 . name ] = e1 ;
64
+ const name = e1 . name || e1 [ "new-type" ] ;
65
+ if ( name ) {
66
+ map [ name ] = e1 ;
61
67
}
62
68
}
63
69
64
70
for ( const e2 of targetProp ) {
65
- if ( e2 . name && map [ e2 . name ] ) {
66
- merge ( map [ e2 . name ] , e2 ) ;
71
+ const name = e2 . name || e2 [ "new-type" ] ;
72
+ if ( name && map [ name ] ) {
73
+ merge ( map [ name ] , e2 ) ;
67
74
}
68
75
else {
69
76
srcProp . push ( e2 ) ;
@@ -116,7 +123,7 @@ export function isArray(value: any): value is ReadonlyArray<{}> {
116
123
return Array . isArray ? Array . isArray ( value ) : value instanceof Array ;
117
124
}
118
125
119
- export function flatMap < T , U > ( array : ReadonlyArray < T > | undefined , mapfn : ( x : T , i : number ) => U | ReadonlyArray < U > | undefined ) : U [ ] {
126
+ export function flatMap < T , U > ( array : ReadonlyArray < T > | undefined , mapfn : ( x : T , i : number ) => U | ReadonlyArray < U > | undefined ) : U [ ] {
120
127
let result : U [ ] | undefined ;
121
128
if ( array ) {
122
129
result = [ ] ;
@@ -137,4 +144,4 @@ export function flatMap<T, U>(array: ReadonlyArray<T> | undefined, mapfn: (x: T,
137
144
138
145
export function concat < T > ( a : T [ ] | undefined , b : T [ ] | undefined ) : T [ ] {
139
146
return ! a ? b || [ ] : a . concat ( b || [ ] ) ;
140
- }
147
+ }
0 commit comments