{"version":3,"file":"SerializerBridge-BaOQOb8q.cjs","names":[],"sources":["../../src/serializers/SerializerRegistry.ts","../../src/serializers/SerializerBridge.ts"],"sourcesContent":["import type {\n    SerializerFn,\n    SerializerContext,\n    SerializerEntry,\n    SerializerConfig,\n    ISerializerRegistry\n} from '../types/index.js';\n\nconst DEFAULT_CONFIG: Required<SerializerConfig> = {\n    maxDepth: 5,\n    circular: 'placeholder',\n    preserveUndefined: false\n};\n\nexport class SerializerRegistry implements ISerializerRegistry {\n    private serializers: Map<Function, SerializerEntry> = new Map();\n    private config: Required<SerializerConfig>;\n\n    constructor(config: SerializerConfig = {}) {\n        this.config = { ...DEFAULT_CONFIG, ...config };\n        this.registerDefaults();\n    }\n\n    private registerDefaults(): void {\n        this.add(Error, (err: Error) => ({\n            name: err.name,\n            message: err.message,\n            stack: err.stack?.split('\\n').slice(0, 10),\n            ...(err.cause ? { cause: this.serialize(err.cause) } : {})\n        }), 100);\n\n        this.add(Date, (date: Date) => ({\n            iso: date.toISOString(),\n            timestamp: date.getTime()\n        }), 90);\n\n        this.add(RegExp, (regex: RegExp) => ({\n            pattern: regex.source,\n            flags: regex.flags\n        }), 90);\n\n        this.add(Map, (map: Map<any, any>, ctx) => {\n            const obj: Record<string, any> = {};\n            map.forEach((value, key) => {\n                const keyStr = typeof key === 'object' ? JSON.stringify(key) : String(key);\n                obj[keyStr] = this.serializeInternal(value, {\n                    ...ctx,\n                    depth: ctx.depth + 1,\n                    path: [...ctx.path, keyStr]\n                });\n            });\n            return { __type: 'Map', entries: obj };\n        }, 80);\n\n        this.add(Set, (set: Set<any>, ctx) => ({\n            __type: 'Set',\n            values: Array.from(set).map((v, i) =>\n                this.serializeInternal(v, {\n                    ...ctx,\n                    depth: ctx.depth + 1,\n                    path: [...ctx.path, `[${i}]`]\n                })\n            )\n        }), 80);\n\n        if (typeof Buffer !== 'undefined') {\n            this.add(Buffer as any, (buf: Buffer) => ({\n                __type: 'Buffer',\n                length: buf.length,\n                preview: buf.slice(0, 50).toString('hex')\n            }), 70);\n        }\n    }\n\n    add<T>(\n        type: new (...args: any[]) => T,\n        serializer: SerializerFn<T>,\n        priority: number = 50\n    ): void {\n        this.serializers.set(type, { type, serializer, priority });\n    }\n\n    remove<T>(type: new (...args: any[]) => T): boolean {\n        return this.serializers.delete(type);\n    }\n\n    has<T>(type: new (...args: any[]) => T): boolean {\n        return this.serializers.has(type);\n    }\n\n    getAll(): SerializerEntry[] {\n        return Array.from(this.serializers.values())\n            .sort((a, b) => (b.priority ?? 50) - (a.priority ?? 50));\n    }\n\n    private findSerializer(value: any): SerializerEntry | null {\n        const sorted = this.getAll();\n        for (const entry of sorted) {\n            if (value instanceof entry.type) {\n                return entry;\n            }\n        }\n        return null;\n    }\n\n    private serializeInternal(value: any, context: SerializerContext): any {\n        if (value === null) return null;\n        if (value === undefined) return this.config.preserveUndefined ? undefined : '[undefined]';\n        if (typeof value === 'function') return `[Function: ${value.name || 'anonymous'}]`;\n        if (typeof value !== 'object') return value;\n\n        if (context.depth >= this.config.maxDepth) {\n            return '[Max Depth]';\n        }\n\n        if (context.seen.has(value)) {\n            switch (this.config.circular) {\n                case 'error':\n                    throw new Error(`Circular reference at ${context.path.join('.')}`);\n                case 'skip':\n                    return undefined;\n                case 'placeholder':\n                default:\n                    return '[Circular]';\n            }\n        }\n        context.seen.add(value);\n\n        const serializer = this.findSerializer(value);\n        if (serializer) {\n            return serializer.serializer(value, context);\n        }\n\n        if (Array.isArray(value)) {\n            return value.map((item, i) =>\n                this.serializeInternal(item, {\n                    ...context,\n                    depth: context.depth + 1,\n                    path: [...context.path, `[${i}]`]\n                })\n            );\n        }\n\n        const result: Record<string, any> = {};\n        for (const [key, val] of Object.entries(value)) {\n            result[key] = this.serializeInternal(val, {\n                ...context,\n                depth: context.depth + 1,\n                path: [...context.path, key]\n            });\n        }\n        return result;\n    }\n\n    serialize(value: any, config?: SerializerConfig): any {\n        const mergedConfig = { ...this.config, ...config };\n        return this.serializeInternal(value, {\n            depth: 0,\n            maxDepth: mergedConfig.maxDepth,\n            path: [],\n            seen: new WeakSet()\n        });\n    }\n}\n\nlet _defaultRegistry: SerializerRegistry | null = null;\n\nexport function getDefaultSerializerRegistry(): SerializerRegistry {\n    if (!_defaultRegistry) {\n        _defaultRegistry = new SerializerRegistry();\n    }\n    return _defaultRegistry;\n}\n","/**\n * @fileoverview SerializerBridge — SerializerRegistry facade.\n * Encapsulates serializer registration, removal, and registry access.\n */\n\nimport type { SerializerFn } from '../types/index.js';\nimport { SerializerRegistry } from './index.js';\n\n/**\n * Bridge for serializer management.\n */\nexport interface SerializerBridge {\n    /** Adds a serializer for a type. */\n    addSerializer<T>(type: new (...args: unknown[]) => T, serializer: SerializerFn<T>, priority?: number): void;\n    removeSerializer<T>(type: new (...args: unknown[]) => T): boolean;\n    /** Returns the underlying registry. */\n    getSerializerRegistry(): SerializerRegistry;\n}\n\n/**\n * Creates a SerializerBridge instance.\n */\nexport function createSerializerBridge(): SerializerBridge {\n    const serializerRegistry = new SerializerRegistry();\n\n    return {\n        addSerializer<T>(type: new (...args: unknown[]) => T, serializer: SerializerFn<T>, priority?: number): void {\n            serializerRegistry.add(type, serializer, priority);\n        },\n\n        removeSerializer<T>(type: new (...args: unknown[]) => T): boolean {\n            return serializerRegistry.remove(type);\n        },\n\n        getSerializerRegistry(): SerializerRegistry {\n            return serializerRegistry;\n        }\n    };\n}\n"],"mappings":"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"}