{"version":3,"sources":["../../src/serializer/utils.ts"],"names":["SerializerSelfRefIdentifier","SerializerRefIdentifier","ClassConstructorPlaceholder","RefPlaceholder","EmptyPlaceholder","Symbol","partialResult","node","factory","value","createEmpty","updateInstance","SerializerError","rawValue","__value","final","finalInstance","fromPlain","ref","isSerializerNode","data","R","isPlainObject","hasProp","isRootNode","extractClassName","registry","Map","register","name","has","set","target","get","index","indexOf","push","filter","Boolean","join","isObjectType","isFunction","Function","primitiveToSerializableClass","ClassByValueType","string","String","number","Number","bigint","BigInt","boolean","symbol","undefined","Undefined","null","Null","object","Object","function","type","traverseObject","obj","handler","stopFn","seen","SafeWeakSet","traverse","_obj","path","add","key","entries","concat","isSerializationRequired","primitive","includes","traverseWithUpdate","Array","isArray","idx","update","newValue","Set","values","delete","shallowCopy","assign","slice","isDirectInstanceOf","Date","deepCopy","source","clone","copy","result","setProp","toBoundedFunction","fn","binds","getFunctionBinds","getProp"],"mappings":"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","file":"utils.cjs","sourcesContent":["/**\n * Copyright 2025 © BeeAI a Series of LF Projects, LLC\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as R from \"remeda\";\nimport { SafeWeakSet } from \"@/internals/helpers/weakRef.js\";\nimport { AnyConstructable, AnyFn, ClassConstructor, NamedFunction } from \"@/internals/types.js\";\nimport { SerializeFactory } from \"@/serializer/serializer.js\";\nimport { getProp, hasProp, setProp } from \"@/internals/helpers/object.js\";\nimport { isDirectInstanceOf } from \"@/internals/helpers/prototype.js\";\nimport { SerializerError } from \"@/serializer/error.js\";\nimport { isFunction, isObjectType } from \"remeda\";\n\nexport const SerializerSelfRefIdentifier = \"__self_ref\";\nexport const SerializerRefIdentifier = \"__ref\";\nexport class ClassConstructorPlaceholder {}\nexport class RefPlaceholder<T = unknown> {\n  private static EmptyPlaceholder = Symbol();\n  private partialResult: T = RefPlaceholder.EmptyPlaceholder as T;\n\n  constructor(\n    protected readonly node: SerializerNode,\n    protected readonly factory: SerializeFactory<T>,\n  ) {}\n\n  get value() {\n    if (this.partialResult !== RefPlaceholder.EmptyPlaceholder) {\n      return this.partialResult;\n    }\n\n    const { createEmpty, updateInstance } = this.factory;\n    if (!createEmpty || !updateInstance) {\n      throw new SerializerError(\"Circular dependency has been detected!\");\n    }\n\n    this.partialResult = createEmpty();\n    return this.partialResult;\n  }\n\n  get rawValue() {\n    return this.node.__value;\n  }\n\n  async final() {\n    const finalInstance = await this.factory.fromPlain(this.node.__value, this.factory.ref);\n    if (this.partialResult === RefPlaceholder.EmptyPlaceholder) {\n      return finalInstance;\n    }\n\n    await this.factory.updateInstance!(this.partialResult, finalInstance);\n    return this.partialResult;\n  }\n}\n\nexport interface SerializerNode {\n  __class: string;\n  __ref: string;\n  __value: unknown;\n  __serializer: true;\n}\nexport function isSerializerNode(data: unknown): data is SerializerNode {\n  return R.isPlainObject(data) && hasProp(data as unknown as SerializerNode, \"__serializer\");\n}\n\nexport interface RootNode<T = any> {\n  __version: string;\n  __root: T;\n}\n\nexport function isRootNode<T>(data: unknown): data is RootNode<T> {\n  return (\n    R.isPlainObject(data) &&\n    hasProp(data as unknown as RootNode<T>, \"__root\") &&\n    hasProp(data as unknown as RootNode<T>, \"__version\")\n  );\n}\n\nexport const extractClassName = (() => {\n  const registry = new Map<string, unknown[]>();\n  const register = (name: string, factory: any) => {\n    if (!registry.has(name)) {\n      registry.set(name, []);\n    }\n    const target = registry.get(name)!;\n    let index = target.indexOf(factory);\n    if (index === -1) {\n      index = target.push(factory) - 1;\n    }\n    return [name, index].filter(Boolean).join(\"\");\n  };\n\n  return (value: unknown): string => {\n    if (R.isObjectType(value) && \"constructor\" in value) {\n      const name = value.constructor.name;\n      return register(name, value.constructor);\n    }\n    if (R.isFunction(value)) {\n      const name = value.name || value.constructor?.name || Function.name;\n      return register(name, value);\n    }\n    return extractClassName(primitiveToSerializableClass(value));\n  };\n})();\n\nconst ClassByValueType = {\n  string: String,\n  number: Number,\n  bigint: BigInt,\n  boolean: Boolean,\n  symbol: Symbol,\n  undefined: class Undefined {},\n  null: class Null {},\n  object: Object,\n  function: Function,\n} as const;\n\nexport function primitiveToSerializableClass(value: unknown) {\n  const type = value === null ? \"null\" : typeof value;\n  return ClassByValueType[type];\n}\n\ntype TraverseObjectFn = (el: { key: string; path: readonly string[]; value: any }) => Promise<void>;\nexport async function traverseObject(\n  obj: unknown,\n  handler: TraverseObjectFn,\n  stopFn?: (_obj: unknown) => boolean,\n) {\n  const seen = new SafeWeakSet();\n\n  const traverse = async (_obj: unknown, path: readonly string[] = []) => {\n    if (!R.isPlainObject(_obj) || seen.has(_obj)) {\n      return;\n    }\n    seen.add(_obj);\n\n    if (stopFn?.(_obj)) {\n      return;\n    }\n\n    for (const [key, value] of Object.entries(_obj)) {\n      await traverse(value, path.concat(key));\n      await handler({\n        key,\n        value,\n        path: path.concat(key),\n      });\n    }\n  };\n\n  return await traverse(obj, []);\n}\n\nexport function isSerializationRequired(factory: ClassConstructor | NamedFunction) {\n  const primitive: unknown[] = [ClassByValueType.string, ClassByValueType.boolean];\n  return !primitive.includes(factory);\n}\n\nexport function* traverseWithUpdate<T = unknown>(\n  _obj: unknown,\n): Generator<{ value: T; update: (value: T) => void }> {\n  if (Array.isArray(_obj)) {\n    for (const [idx, value] of _obj.entries()) {\n      yield {\n        value,\n        update: (newValue) => {\n          _obj[idx] = newValue;\n        },\n      };\n    }\n  } else if (R.isPlainObject(_obj)) {\n    for (const [key, value] of R.entries(_obj)) {\n      yield {\n        value: value as T,\n        update: (newValue) => {\n          _obj[key] = newValue;\n        },\n      };\n    }\n  } else if (_obj instanceof Map) {\n    for (const [key, value] of _obj.entries()) {\n      yield {\n        value,\n        update: (newValue) => {\n          _obj.set(key, newValue);\n        },\n      };\n    }\n  } else if (_obj instanceof Set) {\n    for (const value of _obj.values()) {\n      yield {\n        value,\n        update: (newValue) => {\n          _obj.delete(value);\n          _obj.add(newValue);\n        },\n      };\n    }\n  }\n}\n\nexport function shallowCopy<T>(value: T): T {\n  if (R.isPlainObject(value)) {\n    return Object.assign({}, value);\n  } else if (R.isArray(value)) {\n    return value.slice() as T;\n  } else if (isDirectInstanceOf(value, Map)) {\n    return new Map(value.entries()) as T;\n  } else if (isDirectInstanceOf(value, Set)) {\n    return new Set(value.values()) as T;\n  } else if (isDirectInstanceOf(value, Date)) {\n    return new Date(value) as T;\n  }\n  return value;\n}\n\nexport async function deepCopy<T>(source: T): Promise<T> {\n  if (isObjectType(source) && \"clone\" in source && isFunction(source.clone)) {\n    return await (source as any).clone();\n  }\n  const copy = shallowCopy(source);\n  await traverseObject(source, async ({ value, path }) => {\n    const result = await deepCopy(value);\n    setProp(copy, path, result);\n  });\n  return copy;\n}\n\ntype Bounded =\n  | {\n      name: string;\n      value: any;\n    }\n  | AnyConstructable;\n\nexport function toBoundedFunction<T extends AnyFn>(fn: T, binds: [Bounded, ...Bounded[]]) {\n  Object.assign(fn, { [toBoundedFunction.symbol]: binds });\n  return fn;\n}\ntoBoundedFunction.symbol = Symbol(\"bounded\");\n\n// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\nexport function getFunctionBinds<T extends Function>(fn: T) {\n  const target = getProp(fn, [toBoundedFunction.symbol], []);\n  return target as Bounded[];\n}\n"]}