keycloak_theme/src/tools/deepAssign.ts

52 lines
1.4 KiB
TypeScript
Raw Normal View History

import { assert } from "tsafe/assert";
import { is } from "tsafe/is";
import { deepClone } from "./deepClone";
2021-07-03 02:39:39 +02:00
//Warning: Be mindful that because of array this is not idempotent.
2024-05-20 15:48:51 +02:00
export function deepAssign(params: {
target: Record<string, unknown>;
source: Record<string, unknown>;
}) {
const { target } = params;
const source = deepClone(params.source);
Object.keys(source).forEach(key => {
var dereferencedSource = source[key];
2024-05-20 15:48:51 +02:00
if (
target[key] === undefined ||
dereferencedSource instanceof Function ||
!(dereferencedSource instanceof Object)
) {
Object.defineProperty(target, key, {
2024-05-20 15:48:51 +02:00
enumerable: true,
writable: true,
configurable: true,
value: dereferencedSource
});
return;
}
const dereferencedTarget = target[key];
if (dereferencedSource instanceof Array) {
assert(is<unknown[]>(dereferencedTarget));
assert(is<unknown[]>(dereferencedSource));
dereferencedSource.forEach(entry => dereferencedTarget.push(entry));
return;
}
assert(is<Record<string, unknown>>(dereferencedTarget));
assert(is<Record<string, unknown>>(dereferencedSource));
deepAssign({
2024-05-20 15:48:51 +02:00
target: dereferencedTarget,
source: dereferencedSource
});
});
}