import { type MergeOptions } from './merge.ts'; export type AnyConstructor = ({ new (...args: any[]): any; }); export interface HandleCloningOf { (original: T, seen: WeakMap): T; } export declare const cloneHandlers: Map>; export interface HandleEquatingOf { (a: unknown, b: unknown, seen?: WeakMap): boolean; } export interface HandleMergeOf { (a: T, b: U, opts?: MergeOptions): T & U; } export declare const mergeHandlers: Map; export declare const equalityHandlers: Map; /** * Checks if a property key is dangerous for prototype pollution * * @param key - The property key to check * @returns true if the key is dangerous and should be skipped * * @example * isDangerousKey('__proto__'); // true * isDangerousKey('constructor'); // true * isDangerousKey('normalProp'); // false */ export declare const isDangerousKey: (key: string | symbol | number) => boolean; /** * Filters out dangerous properties from an object's keys to prevent prototype pollution * * @param obj - The object to get safe keys from * @returns Array of safe property keys * * @example * const obj = { a: 1, __proto__: {}, constructor: Function }; * getSafeKeys(obj); // ['a'] */ export declare const getSafeKeys: (obj: T) => (keyof T)[]; /** * Filters out dangerous properties when iterating over object entries * * @param obj - The object to get safe entries from * @returns Array of safe [key, value] pairs * * @example * const obj = { a: 1, __proto__: {}, b: 2 }; * getSafeEntries(obj); // [['a', 1], ['b', 2]] */ export declare const getSafeEntries: (obj: T) => Array<[keyof T, T[keyof T]]>; /** * Helper type to detect if a type is a primitive value */ type IsPrimitive = T extends string | number | boolean | symbol | null | undefined | bigint ? true : false; /** * Helper type to detect if a type is an array */ type IsArray = T extends Array ? true : false; /** * Helper type to detect if a type is a Map */ type IsMap = T extends Map ? true : false; /** * Helper type to detect if a type is a Set */ type IsSet = T extends Set ? true : false; /** * Helper type to detect if a type is a special collection (Array, Map, Set) */ type IsSpecialCollection = IsArray extends true ? true : IsMap extends true ? true : IsSet extends true ? true : false; /** * Helper type to merge two array types */ type MergeArrays = Target extends Array ? Source extends Array ? Array : Source : Source; /** * Helper type to merge two Map types */ type MergeMaps = Target extends Map ? Source extends Map ? Map : Source : Source; /** * Helper type to merge two Set types */ type MergeSets = Target extends Set ? Source extends Set ? Set : Source : Source; /** * Helper type to merge special collections (Arrays, Maps, Sets) */ type MergeSpecialCollections = IsArray extends true ? MergeArrays : IsMap extends true ? MergeMaps : IsSet extends true ? MergeSets : Source; /** * Helper type to merge two property values based on their types */ type MergePropertyValues = IsPrimitive extends true ? Source : IsSpecialCollection extends true ? MergeSpecialCollections : IsSpecialCollection extends true ? Source : Target extends object ? Source extends object ? MergeTypes : Source : Source; /** * Smart merge type that properly handles nested object merging with support for Arrays, Maps, and Sets * * @example * type Result = MergeTypes< * { a: number; nested: { x: string } }, * { b: string; nested: { y: number } } * >; * // Result: { a: number; b: string; nested: { x: string; y: number } } */ export type MergeTypes = { [K in keyof Target | keyof Source]: K extends keyof Source ? K extends keyof Target ? MergePropertyValues : Source[K] : K extends keyof Target ? Target[K] : never; }; type AddHandleForClone = (target: InstanceType, seen?: WeakMap) => InstanceType; type AddHandlerForMerge = (target: InstanceType, source: InstanceType, opts?: MergeOptions) => InstanceType; type AddHandlerForEquals = (target: InstanceType, source: InstanceType) => boolean; interface AddHandlerFor { (fn: 'clone', cnstr: T, handler: AddHandleForClone): void; (fn: 'merge', cnstr: T, handler: AddHandlerForMerge): void; (fn: 'equals', cnstr: T, handler: AddHandlerForEquals): void; } /** * Add a handler for a specific function * @param fn - the function to add the handler for * @param cnstr - the constructor to add the handler for * @param handler - the handler to add * @example * addHandlerFor('clone', FooClass, (original, seen) => new FooClass(original.bar, original.baz)); * addHandlerFor('equals', FooClass, (a, b, seen) => equals(a.bar, b.bar, seen) && equals(a.baz, b.baz, seen)); * addHandlerFor('merge', FooClass, (target, source, opts) => merge(target.bar, source.bar, opts)); */ export declare const addHandlerFor: AddHandlerFor; export {};