/** * Utility functions for safe JSON serialization * Handles circular references and provides type-safe serialization */ /** * Creates a JSON-safe copy of an object by removing circular references * Uses a replacer function with WeakSet to efficiently track visited objects * * @param obj - The object to make JSON-safe * @returns A new object that can be safely serialized to JSON */ export const createSafeJSON = (obj: T): T => { const seen = new WeakSet(); return JSON.parse( JSON.stringify(obj, (key, value) => { if (typeof value === 'object' && value !== null) { if (seen.has(value)) { return '[Circular Reference]'; } seen.add(value); } return value; }), ); }; /** * Safe JSON stringifier that handles circular references * Useful for logging or debugging purposes * * @param obj - The object to stringify * @param space - Number of spaces to use for indentation (optional) * @returns JSON string representation of the object */ export const safeStringify = (obj: any, space?: number): string => { const seen = new WeakSet(); return JSON.stringify( obj, (key, value) => { if (typeof value === 'object' && value !== null) { if (seen.has(value)) { return '[Circular Reference]'; } seen.add(value); } return value; }, space, ); }; /** * Removes specific properties that might contain circular references * More targeted approach for known problematic properties * * @param obj - The object to clean * @param excludeProps - Array of property names to exclude * @returns A new object without the specified properties */ export const excludeCircularProps = >( obj: T, excludeProps: string[], ): Omit => { const result = { ...obj }; excludeProps.forEach((prop) => { delete result[prop]; }); return result; };