From 8d588414616305384cd0a0305869f55545a82291 Mon Sep 17 00:00:00 2001 From: Yaroslav Serhieiev Date: Thu, 12 Oct 2023 10:14:26 +0300 Subject: [PATCH] perf: reduce footprint --- src/utils/get.ts | 14 ++++++++++++++ src/utils/merge.ts | 23 +++++++++++++++++++++++ src/utils/set.ts | 15 +++++++++++++++ 3 files changed, 52 insertions(+) create mode 100644 src/utils/get.ts create mode 100644 src/utils/merge.ts create mode 100644 src/utils/set.ts diff --git a/src/utils/get.ts b/src/utils/get.ts new file mode 100644 index 0000000..1d2714b --- /dev/null +++ b/src/utils/get.ts @@ -0,0 +1,14 @@ +export function get(obj: unknown, pathArray: string[], defaultValue: unknown): unknown { + if (!obj) { + return defaultValue; + } + + let result = obj as any; + for (const key of pathArray) { + if (result[key] === undefined) { + return defaultValue; + } + result = result[key]; + } + return result; +} diff --git a/src/utils/merge.ts b/src/utils/merge.ts new file mode 100644 index 0000000..d685e53 --- /dev/null +++ b/src/utils/merge.ts @@ -0,0 +1,23 @@ +function canAccessProperties(obj: unknown): obj is Record { + return !!obj && (typeof obj === 'object' || typeof obj === 'function'); +} + +export function deepMerge(target: unknown, source: unknown): unknown { + if (!canAccessProperties(target) || !canAccessProperties(source)) { + return source; + } + + const keys = Object.keys(source); + for (const key of keys) { + if (canAccessProperties(source[key])) { + if (!target[key]) { + target[key] = {}; + } + deepMerge(target[key], source[key]); + } else { + target[key] = source[key]; + } + } + + return target; +} diff --git a/src/utils/set.ts b/src/utils/set.ts new file mode 100644 index 0000000..158a7b3 --- /dev/null +++ b/src/utils/set.ts @@ -0,0 +1,15 @@ +export function set(obj: unknown, pathArray: string[], value: unknown): void { + let temp: any = obj ?? {}; + for (let i = 0; i < pathArray.length; i++) { + const key = pathArray[i]; + if (i === pathArray.length - 1) { + // If it's the last key in the path + temp[key] = value; + } else { + if (temp[key] === undefined) { + temp[key] = {}; + } + temp = temp[key]; + } + } +}