{"version":3,"file":"jsonplus.cjs","names":["stringify"],"sources":["../../src/serde/jsonplus.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable no-instanceof/no-instanceof */\nimport { load } from \"@langchain/core/load\";\nimport { SerializerProtocol } from \"./base.js\";\nimport { stringify } from \"./utils/fast-safe-stringify/index.js\";\n\nfunction isLangChainSerializedObject(value: Record<string, unknown>) {\n  return (\n    value !== null &&\n    value.lc === 1 &&\n    value.type === \"constructor\" &&\n    Array.isArray(value.id)\n  );\n}\n\n/**\n * The replacer in stringify does not allow delegation to built-in LangChain\n * serialization methods, and instead immediately calls `.toJSON()` and\n * continues to stringify subfields.\n *\n * We therefore must start from the most nested elements in the input and\n * deserialize upwards rather than top-down.\n */\nasync function _reviver(value: any): Promise<any> {\n  if (value && typeof value === \"object\") {\n    if (Array.isArray(value)) {\n      const revivedArray = await Promise.all(\n        value.map((item) => _reviver(item))\n      );\n      return revivedArray;\n    } else {\n      const revivedObj: any = {};\n      for (const [k, v] of Object.entries(value)) {\n        revivedObj[k] = await _reviver(v);\n      }\n\n      if (revivedObj.lc === 2 && revivedObj.type === \"undefined\") {\n        return undefined;\n      } else if (\n        revivedObj.lc === 2 &&\n        revivedObj.type === \"constructor\" &&\n        Array.isArray(revivedObj.id)\n      ) {\n        try {\n          const constructorName = revivedObj.id[revivedObj.id.length - 1];\n          let constructor: any;\n\n          switch (constructorName) {\n            case \"Set\":\n              constructor = Set;\n              break;\n            case \"Map\":\n              constructor = Map;\n              break;\n            case \"RegExp\":\n              constructor = RegExp;\n              break;\n            case \"Error\":\n              constructor = Error;\n              break;\n            case \"Uint8Array\":\n              constructor = Uint8Array;\n              break;\n            default:\n              return revivedObj;\n          }\n          if (revivedObj.method) {\n            return (constructor as any)[revivedObj.method](\n              ...(revivedObj.args || [])\n            );\n          } else {\n            return new (constructor as any)(...(revivedObj.args || []));\n          }\n        } catch {\n          return revivedObj;\n        }\n      } else if (isLangChainSerializedObject(revivedObj)) {\n        return load(JSON.stringify(revivedObj));\n      }\n\n      return revivedObj;\n    }\n  }\n  return value;\n}\n\nfunction _encodeConstructorArgs(\n  // oxlint-disable-next-line @typescript-eslint/no-unsafe-function-type\n  constructor: Function,\n  method?: string,\n  args?: any[],\n  kwargs?: Record<string, any>\n): object {\n  return {\n    lc: 2,\n    type: \"constructor\",\n    id: [constructor.name],\n    method: method ?? null,\n    args: args ?? [],\n    kwargs: kwargs ?? {},\n  };\n}\n\nfunction _default(obj: any): any {\n  if (obj === undefined) {\n    return {\n      lc: 2,\n      type: \"undefined\",\n    };\n  } else if (obj instanceof Set || obj instanceof Map) {\n    return _encodeConstructorArgs(obj.constructor, undefined, [\n      Array.from(obj),\n    ]);\n  } else if (obj instanceof RegExp) {\n    return _encodeConstructorArgs(RegExp, undefined, [obj.source, obj.flags]);\n  } else if (obj instanceof Error) {\n    return _encodeConstructorArgs(obj.constructor, undefined, [obj.message]);\n    // TODO: Remove special case\n  } else if (obj?.lg_name === \"Send\") {\n    return {\n      node: obj.node,\n      args: obj.args,\n    };\n  } else if (obj instanceof Uint8Array) {\n    return _encodeConstructorArgs(Uint8Array, \"from\", [Array.from(obj)]);\n  } else {\n    return obj;\n  }\n}\n\nexport class JsonPlusSerializer implements SerializerProtocol {\n  protected _dumps(obj: any): Uint8Array {\n    const encoder = new TextEncoder();\n    return encoder.encode(\n      stringify(obj, (_: string, value: any) => {\n        return _default(value);\n      })\n    );\n  }\n\n  async dumpsTyped(obj: any): Promise<[string, Uint8Array]> {\n    if (obj instanceof Uint8Array) {\n      return [\"bytes\", obj];\n    } else {\n      return [\"json\", this._dumps(obj)];\n    }\n  }\n\n  protected async _loads(data: string): Promise<any> {\n    const parsed = JSON.parse(data);\n    return _reviver(parsed);\n  }\n\n  async loadsTyped(type: string, data: Uint8Array | string): Promise<any> {\n    if (type === \"bytes\") {\n      return typeof data === \"string\" ? new TextEncoder().encode(data) : data;\n    } else if (type === \"json\") {\n      return this._loads(\n        typeof data === \"string\" ? data : new TextDecoder().decode(data)\n      );\n    } else {\n      throw new Error(`Unknown serialization type: ${type}`);\n    }\n  }\n}\n"],"mappings":"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"}