/** * Deep merge utility for objects * * Provides a pure, reusable deep merge function with optional security filtering. * * @module utils/deepMerge */ /** * Options for deep merge behavior */ export interface DeepMergeOptions { /** * Properties to skip during merge (e.g., dangerous properties like __proto__) */ skipProperties?: string[]; /** * Read-only fields that should be skipped during merge */ readOnlyFields?: Set; } /** * Deep merge two objects * * Merge semantics: * - Plain objects are merged recursively * - Arrays replace entirely (not merged element-by-element) * - Primitives replace * - Dangerous/read-only properties are optionally skipped * * @param target - The target object to merge into * @param source - The source object to merge from * @param options - Optional merge behavior configuration * @returns New merged object (does not mutate inputs) * * @example * ```typescript * // Basic merge * const result = deepMerge({ a: 1 }, { b: 2 }); * // => { a: 1, b: 2 } * * // Nested merge * const result = deepMerge( * { settings: { theme: 'light', size: 10 } }, * { settings: { theme: 'dark' } } * ); * // => { settings: { theme: 'dark', size: 10 } } * * // With security filtering * const result = deepMerge(target, source, { * skipProperties: ['__proto__', 'constructor'], * readOnlyFields: new Set(['id', 'type']) * }); * * // With type preservation * interface Config { theme: string; size: number; } * const result = deepMerge(defaultConfig, userConfig); * ``` */ export declare function deepMerge>(target: T, source: Partial | Record, options?: DeepMergeOptions): T; /** * Default dangerous properties that should never be merged * These can be used to prevent prototype pollution attacks */ export declare const DANGEROUS_PROPERTIES: string[]; /** * Create a deep merge function with preset options * * Useful for creating a configured merger that can be reused * * @param options - Preset options for all merges * @returns A configured deep merge function * * @example * ```typescript * const secureMerge = createDeepMerge({ * skipProperties: DANGEROUS_PROPERTIES, * readOnlyFields: new Set(['id', 'type']) * }); * * const result = secureMerge(target, source); * ``` */ export declare function createDeepMerge(options: DeepMergeOptions): (target: Record, source: Record) => Record; //# sourceMappingURL=deepMerge.d.ts.map