"use strict"; // deepmerge.ts (Deno-lint friendly) Object.defineProperty(exports, "__esModule", { value: true }); exports.deepMerge = deepMerge; function isPlainObject(value) { if (value === null || typeof value !== "object") return false; const proto = Object.getPrototypeOf(value); return proto === Object.prototype || proto === null; } function isUnsafeKey(key) { return key === "__proto__" || key === "constructor" || key === "prototype"; } function mergeTwo(target, source) { const out = { ...target }; for (const key of Reflect.ownKeys(source)) { if (isUnsafeKey(key)) continue; const srcVal = source[key]; const tgtVal = out[key]; if (isPlainObject(tgtVal) && isPlainObject(srcVal)) { out[key] = mergeTwo(tgtVal, srcVal); } else { // arrays + class instances + dates + maps + everything non-plain: overwrite out[key] = srcVal; } } return out; } /** * Deep merge any number of objects. * - Deep merges *plain objects* only. * - Overwrites arrays and class instances. * - Later args win. */ function deepMerge(...objects) { let result = Object.create(null); for (const obj of objects) { if (!isPlainObject(obj)) { // If you pass a non-plain object at the top-level, last wins. result = obj; continue; } result = mergeTwo(result, obj); } return result; }