UNPKG

@clerk/shared

Version:

Internal package utils used by the Clerk SDKs

36 lines (34 loc) 1.54 kB
//#region src/utils/fastDeepMerge.ts const DANGEROUS_KEYS = new Set([ "__proto__", "constructor", "prototype" ]); /** * Merges 2 objects without creating new object references * The merged props will appear on the `target` object * If `target` already has a value for a given key it will not be overwritten */ const fastDeepMergeAndReplace = (source, target) => { if (!source || !target) return; for (const key in source) { if (DANGEROUS_KEYS.has(key)) continue; if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== null && typeof source[key] === `object`) { if (target[key] === void 0) target[key] = new (Object.getPrototypeOf(source[key])).constructor(); fastDeepMergeAndReplace(source[key], target[key]); } else if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== void 0) target[key] = source[key]; } }; const fastDeepMergeAndKeep = (source, target) => { if (!source || !target) return; for (const key in source) { if (DANGEROUS_KEYS.has(key)) continue; if (Object.prototype.hasOwnProperty.call(source, key) && source[key] !== null && typeof source[key] === `object`) { if (target[key] === void 0) target[key] = new (Object.getPrototypeOf(source[key])).constructor(); fastDeepMergeAndKeep(source[key], target[key]); } else if (Object.prototype.hasOwnProperty.call(source, key) && target[key] === void 0) target[key] = source[key]; } }; //#endregion exports.fastDeepMergeAndKeep = fastDeepMergeAndKeep; exports.fastDeepMergeAndReplace = fastDeepMergeAndReplace;