@@ -171,3 +171,54 @@ export function isSubSchemasArrayKey(key: string): key is SubSchemasArrayKey {
171
171
export function isSubSchemasRecordKey ( key : string ) : key is SubSchemasRecordKey {
172
172
return SET_OF_RECORDS_OF_SUB_SCHEMAS . has ( key as SubSchemasRecordKey ) ;
173
173
}
174
+
175
+ export const UNCHANGED = Symbol ( "unchanged" ) ;
176
+
177
+ export function reconcileSchemaValues (
178
+ target : SchemaValue | undefined ,
179
+ source : SchemaValue | undefined
180
+ ) : SchemaValue | undefined | typeof UNCHANGED {
181
+ if ( target === source ) {
182
+ return UNCHANGED ;
183
+ }
184
+ if ( typeof target === "object" && typeof source === "object" ) {
185
+ const isTArr = Array . isArray ( target ) ;
186
+ const isSArr = Array . isArray ( source ) ;
187
+ if ( isTArr && isSArr ) {
188
+ const l = Math . min ( target . length , source . length ) ;
189
+ let i = 0 ;
190
+ for ( ; i < l ; i ++ ) {
191
+ const v = reconcileSchemaValues ( target [ i ] , source [ i ] ) ;
192
+ if ( v !== UNCHANGED ) {
193
+ target [ i ] = v ;
194
+ }
195
+ }
196
+ for ( ; i < source . length ; i ++ ) {
197
+ target . push ( source [ i ] ) ;
198
+ }
199
+ target . splice ( source . length ) ;
200
+ return UNCHANGED ;
201
+ }
202
+ if ( ! isTArr && ! isSArr && target !== null && source !== null ) {
203
+ const tKeys = Object . keys ( target ) ;
204
+ let l = tKeys . length ;
205
+ for ( let i = 0 ; i < l ; i ++ ) {
206
+ const key = tKeys [ i ] ! ;
207
+ if ( ! ( key in source ) ) {
208
+ delete target [ key ] ;
209
+ }
210
+ }
211
+ const sKeys = Object . keys ( source ) ;
212
+ l = sKeys . length ;
213
+ for ( let i = 0 ; i < l ; i ++ ) {
214
+ const key = sKeys [ i ] ! ;
215
+ const v = reconcileSchemaValues ( target [ key ] , source [ key ] ) ;
216
+ if ( v !== UNCHANGED ) {
217
+ target [ key ] = v ;
218
+ }
219
+ }
220
+ return UNCHANGED ;
221
+ }
222
+ }
223
+ return source ;
224
+ }
0 commit comments