{"version":3,"sources":["../../src/serializer/utils.ts"],"names":["SerializerSelfRefIdentifier","SerializerRefIdentifier","RefPlaceholder","EmptyPlaceholder","Symbol","partialResult","constructor","node","factory","value","createEmpty","updateInstance","SerializerError","final","finalInstance","fromPlain","__value","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","toBoundedFunction","fn","binds","getFunctionBinds","getProp"],"mappings":"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","file":"utils.cjs","sourcesContent":["/**\n * Copyright 2025 IBM Corp.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\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 { Cache } from \"@/cache/decoratorCache.js\";\nimport { getProp, hasProp } from \"@/internals/helpers/object.js\";\nimport { isDirectInstanceOf } from \"@/internals/helpers/prototype.js\";\nimport { SerializerError } from \"@/serializer/error.js\";\n\nexport const SerializerSelfRefIdentifier = \"__self_ref\";\nexport const SerializerRefIdentifier = \"__ref\";\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  @Cache()\n  get final() {\n    const finalInstance = this.factory.fromPlain(this.node.__value);\n    if (this.partialResult === RefPlaceholder.EmptyPlaceholder) {\n      return finalInstance;\n    }\n\n    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 }) => void;\nexport function traverseObject(\n  obj: unknown,\n  handler: TraverseObjectFn,\n  stopFn?: (_obj: unknown) => boolean,\n) {\n  const seen = new SafeWeakSet();\n\n  const traverse = (_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      traverse(value, path.concat(key));\n\n      handler({\n        key,\n        value,\n        path: path.concat(key),\n      });\n    }\n  };\n\n  return 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\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"]}