summaryrefslogtreecommitdiff
path: root/src/util/object.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/object.ts')
-rw-r--r--src/util/object.ts30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/util/object.ts b/src/util/object.ts
new file mode 100644
index 0000000..1ecc89b
--- /dev/null
+++ b/src/util/object.ts
@@ -0,0 +1,30 @@
+/**
+ * Simple object check.
+ */
+export function isObject(item: any) {
+ return item && typeof item === "object" && !Array.isArray(item);
+}
+
+/**
+ * Deep merge two objects.
+ */
+export function deepMerge<T>(
+ target: Record<any, any>,
+ ...sources: Record<any, any>[]
+): T {
+ if (!sources.length) return target;
+ const source = sources.shift();
+
+ if (isObject(target) && isObject(source)) {
+ for (const key in source) {
+ if (isObject(source[key])) {
+ if (!target[key]) Object.assign(target, { [key]: {} });
+ deepMerge(target[key], source[key]);
+ } else {
+ Object.assign(target, { [key]: source[key] });
+ }
+ }
+ }
+
+ return deepMerge(target, ...sources) as T;
+}