import type { RenderedLeanSchema, RenderedLeanSchemaFields, } from '@wix/metro-public-utils'; import { ConverterType, Payload } from './serializer/domain.js'; import { schemaSerializer } from './serializer/serializer.js'; import { protobufConverters } from './serializer/protobuf-converters/converters.js'; import { typeToConverterSet } from './serializer/utils.js'; const ambassadorConverters = typeToConverterSet([...protobufConverters]); export type { GoogleProtoDuration } from './serializer/protobuf-converters/types.js'; export function serializer( rootSchema: RenderedLeanSchemaFields, depSchemas: RenderedLeanSchema = {}, ) { const transform = schemaSerializer( rootSchema, depSchemas, ambassadorConverters, ); return { fromJSON(jsonOrString: Payload | string): T { const jsonOrText = safeJsonParse(jsonOrString) || jsonOrString; return transform(jsonOrText, ConverterType.FROM_JSON) as T; }, toJSON(json: T) { return transform(json, ConverterType.TO_JSON) as Payload; }, }; } function safeJsonParse(someString: string): any { try { return JSON.parse(someString); } catch (error) {} }