From 05b235338c9ae1f5df4fb559d7d95cb251259a6d Mon Sep 17 00:00:00 2001 From: Bobbie Goede Date: Fri, 13 Sep 2024 12:40:39 +0200 Subject: [PATCH] fix: `deepCopy` should never merge arrays --- packages/shared/src/messages.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/shared/src/messages.ts b/packages/shared/src/messages.ts index 719a0361..9ba149b9 100644 --- a/packages/shared/src/messages.ts +++ b/packages/shared/src/messages.ts @@ -12,6 +12,7 @@ export function deepCopy(src: any, des: any): void { while (stack.length) { const { src, des } = stack.pop()! + // using `Object.keys` which skips prototype properties Object.keys(src).forEach(key => { // if src[key] is an object/array, set des[key] // to empty object/array to prevent setting by reference @@ -19,14 +20,14 @@ export function deepCopy(src: any, des: any): void { des[key] = Array.isArray(src[key]) ? [] : {} } - if (isObject(des[key]) && isObject(src[key])) { - // src[key] and des[key] are both objects, merge them - stack.push({ src: src[key], des: des[key] }) - } else { + if (isNotObjectOrIsArray(des[key]) || isNotObjectOrIsArray(src[key])) { // replace with src[key] when: // src[key] or des[key] is not an object, or // src[key] or des[key] is an array des[key] = src[key] + } else { + // src[key] and des[key] are both objects, merge them + stack.push({ src: src[key], des: des[key] }) } }) }