"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Serializer = exports.SerializeIterable = exports.SerializeObject = void 0; exports.serialize = serialize; class SerializeObject { serializeEntry(key, value) { this.serializeKey(key); this.serializeValue(value); } } exports.SerializeObject = SerializeObject; class SerializeIterable { } exports.SerializeIterable = SerializeIterable; class Serializer { serializeAny(_value) { throw new Error("Method not implemented."); } serializeBoolean(_value) { throw new Error('Method not implemented.'); } serializeNumber(_value) { throw new Error('Method not implemented.'); } serializeBigInt(_value) { throw new Error('Method not implemented.'); } serializeString(_value) { throw new Error('Method not implemented.'); } serializeSymbol(_value) { throw new Error('Method not implemented.'); } serializeNull() { throw new Error('Method not implemented.'); } serializeObject() { throw new Error('Method not implemented.'); } serializeClass(_name) { throw new Error('Method not implemented.'); } } exports.Serializer = Serializer; const isPlainObject = (value) => (value === null || value === void 0 ? void 0 : value.constructor) === Object; class UnhandledTypeError extends TypeError { constructor(serializer, value) { super(`unhandled type: "${typeof value}" for serializer ${serializer.constructor.name}`); } } function serializeObject(serializer, obj) { for (const key in obj) { serializer.serializeEntry(key, obj[key]); } return serializer.end(); } function serializeClass(serializer, value) { const name = value.constructor.name; const ser = serializer.serializeClass(name); return serializeObject(ser, value); } function serialize(serializer, value) { switch (typeof value) { case "string": return serializer.serializeString(value); case "number": return serializer.serializeNumber(value); case "bigint": return serializer.serializeBigInt(value); case "boolean": return serializer.serializeBoolean(value); case "symbol": return serializer.serializeSymbol(value); case "undefined": return serializer.serializeNull(); case "object": switch (true) { case value == null: return serializer.serializeNull(); case !isPlainObject(value): return serializeClass(serializer, value); default: return serializeObject(serializer.serializeObject(), value); } default: throw new UnhandledTypeError(serializer, value); } }