{"version":3,"file":"serialize.cjs","names":["isFunction","isArray","stringLiterals","string","number","int","boolean","none","any","object","record","array","tuple","union","literal","func","rpc"],"sources":["../../../src/common/schema/serialize.ts"],"sourcesContent":["// Serialization and Deserialization for Schema Types\n\nimport type { Type, TypeMeta } from './schema'\nimport { isArray, isFunction } from '../data/is'\nimport { any, array, boolean, func, int, literal, none, number, object, record, rpc, string, stringLiterals, tuple, union } from './schema'\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/**\n * Plain JSON representation of a schema type\n */\nexport interface SerializedType {\n  type: string\n  default?: any\n  optional?: boolean\n  meta?: TypeMeta\n  object?: Record<string, SerializedType>\n  itemType?: SerializedType\n  union?: SerializedType[]\n  enumValues?: any[]\n  args?: SerializedType[]\n  ret?: SerializedType\n  info?: SerializedType\n  tupleTypes?: SerializedType[]\n  literalValue?: any\n}\n\n// =============================================================================\n// Serialization\n// =============================================================================\n\n/**\n * Serializes a schema Type to a plain JSON object.\n * Functions in _check and _default will not be serialized.\n *\n * @param schema - The schema Type to serialize\n * @returns A plain JSON object representing the schema\n */\nexport function serializeSchema(schema: Type<any>): SerializedType {\n  const result: SerializedType = {\n    type: schema.type,\n  }\n\n  if (schema._optional !== undefined) {\n    result.optional = schema._optional\n  }\n\n  if (schema._meta !== undefined) {\n    result.meta = schema._meta\n  }\n\n  // Serialize default value if it's not a function\n  if (schema._default !== undefined && !isFunction(schema._default)) {\n    result.default = schema._default\n  }\n\n  // Serialize object properties\n  if (schema._object !== undefined) {\n    result.object = {}\n    for (const [key, value] of Object.entries(schema._object)) {\n      result.object[key] = serializeSchema(value as Type<any>)\n    }\n  }\n\n  // Serialize array/record item type\n  if (schema._type !== undefined) {\n    if (isArray(schema._type)) {\n      // Tuple types\n      result.tupleTypes = (schema._type as Type<any>[]).map(t => serializeSchema(t))\n    }\n    else {\n      // Array or record item type\n      result.itemType = serializeSchema(schema._type as Type<any>)\n    }\n  }\n\n  // Serialize union types\n  if (schema._union !== undefined) {\n    result.union = (schema._union as Type<any>[]).map(t => serializeSchema(t))\n  }\n\n  // Serialize enum values\n  if (schema._enumValues !== undefined) {\n    result.enumValues = schema._enumValues\n  }\n\n  // Serialize function arguments\n  if (schema._args !== undefined) {\n    result.args = (schema._args as Type<any>[]).map(t => serializeSchema(t))\n  }\n\n  // Serialize function return type\n  if (schema._ret !== undefined) {\n    result.ret = serializeSchema(schema._ret as Type<any>)\n  }\n\n  // Serialize RPC info type\n  if (schema._info !== undefined) {\n    result.info = serializeSchema(schema._info as Type<any>)\n  }\n\n  // Serialize literal value (for literal types)\n  if (schema.type === 'literal' && schema._default !== undefined) {\n    result.literalValue = schema._default\n  }\n\n  return result\n}\n\n// =============================================================================\n// Deserialization\n// =============================================================================\n\n/**\n * Deserializes a plain JSON object back to a schema Type.\n * Note: Custom _check functions cannot be restored and will use default validators.\n *\n * @param serialized - The serialized schema object\n * @returns A reconstructed Type instance\n */\nexport function deserializeSchema(serialized: SerializedType): Type<any> {\n  let schema: Type<any>\n\n  // Create base type based on type name\n  switch (serialized.type) {\n    case 'string':\n      if (serialized.enumValues) {\n        schema = stringLiterals(serialized.enumValues as any)\n      }\n      else {\n        schema = string()\n      }\n      break\n    case 'number':\n      schema = number()\n      break\n    case 'int':\n      schema = int()\n      break\n    case 'boolean':\n      schema = boolean()\n      break\n    case 'none':\n      schema = none()\n      break\n    case 'any':\n      schema = any()\n      break\n    case 'object':\n      if (serialized.object) {\n        const obj: any = {}\n        for (const [key, value] of Object.entries(serialized.object)) {\n          obj[key] = deserializeSchema(value)\n        }\n        schema = object(obj)\n      }\n      else {\n        schema = object({})\n      }\n      break\n    case 'record':\n      if (serialized.itemType) {\n        schema = record(deserializeSchema(serialized.itemType))\n      }\n      else {\n        schema = record(any())\n      }\n      break\n    case 'array':\n      if (serialized.itemType) {\n        schema = array(deserializeSchema(serialized.itemType))\n      }\n      else {\n        schema = array(any())\n      }\n      break\n    case 'tuple':\n      if (serialized.tupleTypes) {\n        const types = serialized.tupleTypes.map(t => deserializeSchema(t))\n        schema = tuple(types as any)\n      }\n      else {\n        schema = tuple([])\n      }\n      break\n    case 'union':\n      if (serialized.union) {\n        const types = serialized.union.map(t => deserializeSchema(t))\n        schema = union(types as any)\n      }\n      else {\n        schema = union([])\n      }\n      break\n    case 'literal':\n      if (serialized.literalValue !== undefined) {\n        schema = literal(serialized.literalValue)\n      }\n      else {\n        schema = any()\n      }\n      break\n    case 'function':\n      if (serialized.args && serialized.ret) {\n        const args = serialized.args.map(t => deserializeSchema(t))\n        const ret = deserializeSchema(serialized.ret)\n        schema = func(args as any, ret)\n      }\n      else {\n        schema = func([], any())\n      }\n      break\n    case 'rpc':\n      if (serialized.info && serialized.ret) {\n        const info = deserializeSchema(serialized.info)\n        const ret = deserializeSchema(serialized.ret)\n        schema = rpc(info, ret)\n      }\n      else if (serialized.ret) {\n        const ret = deserializeSchema(serialized.ret)\n        schema = rpc(undefined, ret)\n      }\n      else {\n        schema = rpc()\n      }\n      break\n    default:\n      // Unknown type, create a generic any() type\n      schema = any()\n      break\n  }\n\n  // Apply optional flag\n  if (serialized.optional) {\n    schema = schema.optional()\n  }\n\n  // Apply default value (only if not a function)\n  if (serialized.default !== undefined) {\n    schema = schema.default(serialized.default)\n  }\n\n  // Apply metadata\n  if (serialized.meta) {\n    schema = schema.meta(serialized.meta)\n  }\n\n  return schema\n}\n"],"mappings":"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"}