From 3ecb63d5004b3cbcb2184a80e869bd9879a63e72 Mon Sep 17 00:00:00 2001 From: garronej Date: Mon, 8 Nov 2021 19:33:06 +0100 Subject: [PATCH] Fix deepClone so we can overwrite with undefined in when we mock kcContext --- src/lib/tools/deepAssign.ts | 28 +--------------------------- src/lib/tools/deepClone.ts | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 29 deletions(-) diff --git a/src/lib/tools/deepAssign.ts b/src/lib/tools/deepAssign.ts index 71a24064..03f6bb2f 100644 --- a/src/lib/tools/deepAssign.ts +++ b/src/lib/tools/deepAssign.ts @@ -1,32 +1,6 @@ import { assert } from "tsafe/assert"; import { is } from "tsafe/is"; - -function deepClone(src: T): T { - const generateId = (() => { - const prefix = "xIfKdLsIIdJdLdOeJqePe"; - - let counter = 0; - - return () => `${prefix}${counter++}`; - })(); - - const map = new Map(); - - return JSON.parse( - JSON.stringify(src, (...[, value]) => { - if (typeof value === "function") { - const id = generateId(); - - map.set(id, value); - - return id; - } - - return value; - }), - (...[, value]) => (typeof value === "string" && map.has(value) ? map.get(value) : value), - ); -} +import { deepClone } from "./deepClone"; //Warning: Be mindful that because of array this is not idempotent. export function deepAssign(params: { target: Record; source: Record }) { diff --git a/src/lib/tools/deepClone.ts b/src/lib/tools/deepClone.ts index 5ef3c467..18ad7aff 100644 --- a/src/lib/tools/deepClone.ts +++ b/src/lib/tools/deepClone.ts @@ -1,3 +1,17 @@ -export function deepClone(arg: T): T { - return JSON.parse(JSON.stringify(arg)); +import "minimal-polyfills/Object.fromEntries"; + +export function deepClone(o: T): T { + if (!(o instanceof Object)) { + return o; + } + + if (typeof o === "function") { + return o; + } + + if (o instanceof Array) { + return o.map(deepClone) as any; + } + + return Object.fromEntries(Object.entries(o).map(([key, value]) => [key, deepClone(value)])) as any; }