{"version":3,"sources":["../../src/internals/serializable.ts"],"names":["Serializable","constructor","Object","getPrototypeOf","register","Cache","init","aliases","Serializer","registerSerializable","undefined","clone","snapshot","createSnapshot","target","create","prototype","loadSnapshot","serialize","extractClassName","deserialize","value","options","__root","deserializeWithMeta","extraClasses","console","warn","current","SerializerError","fromSnapshot","state","fromSerialized","serialized","load","R","isPromise","then"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCO,MAAeA,YAAAA,CAAAA;EAnCtB;;;EAuCEC,WAAc,GAAA;AACZC,IAAAA,MAAAA,CAAOC,cAAe,CAAA,IAAI,CAAEF,CAAAA,WAAAA,CAAYG,QAAQ,EAAA;AAChDC,IAAAA,wBAAAA,CAAMC,KAAK,IAAI,CAAA;AACjB;AAEA,EAAA,OAAiBF,SAAwCG,OAAoB,EAAA;AAC3EC,IAAWC,yBAAAA,CAAAA,oBAAAA,CAAqB,IAAMC,EAAAA,MAAAA,EAAWH,OAAAA,CAAAA;AACnD;EAEAI,KAA0C,GAAA;AACxC,IAAMC,MAAAA,QAAAA,GAAW,KAAKC,cAAc,EAAA;AAEpC,IAAA,MAAMC,MAASZ,GAAAA,MAAAA,CAAOa,MAAO,CAAA,IAAA,CAAKd,YAAYe,SAAS,CAAA;AACvDF,IAAAA,MAAAA,CAAOG,aAAaL,QAAAA,CAAAA;AACpB,IAAOE,OAAAA,MAAAA;AACT;EAEAI,SAAoB,GAAA;AAClB,IAAMN,MAAAA,QAAAA,GAAW,KAAKC,cAAc,EAAA;AACpC,IAAA,OAAOL,0BAAWU,SAAoC,CAAA;AACpDJ,MAAAA,MAAAA,EAAQK,2BAAiB,IAAI,CAAA;AAC7BP,MAAAA;KACF,CAAA;AACF;AAEUQ,EAAAA,WAAAA,CAAYC,OAAeC,OAAiC,EAAA;AACpE,IAAA,MAAM,EAAEC,MAAM,EAAA,GAAKf,0BAAWgB,mBAC5BH,CAAAA,KAAAA,EACAC,SAASG,YAAAA,CAAAA;AAEX,IAAI,IAAA,CAACF,OAAOT,MAAQ,EAAA;AAElBY,MAAAA,OAAAA,CAAQC,KACN,CAAwI,sIAAA,CAAA,CAAA;AAE1I,MAAOJ,OAAAA,MAAAA;AACT;AAEA,IAAMK,MAAAA,OAAAA,GAAUT,2BAAiB,IAAI,CAAA;AACrC,IAAIS,IAAAA,OAAAA,KAAYL,OAAOT,MAAQ,EAAA;AAC7B,MAAA,MAAM,IAAIe,yBACR,CAAA,CAAA,qCAAA,EAAwCN,OAAOT,MAAM,CAAA,oCAAA,EAAuCc,OAAAA,CAAW,EAAA,CAAA,CAAA;AAE3G;AACA,IAAA,OAAOL,MAAOX,CAAAA,QAAAA;AAChB;AAEA,EAAA,OAAOkB,aAELC,KACG,EAAA;AACH,IAAA,MAAMjB,MAASZ,GAAAA,MAAAA,CAAOa,MAAO,CAAA,IAAA,CAAKC,SAAS,CAAA;AAC3CF,IAAAA,MAAAA,CAAOG,aAAac,KAAAA,CAAAA;AACpB1B,IAAAA,wBAAAA,CAAMC,KAAKQ,MAAAA,CAAAA;AACX,IAAOA,OAAAA,MAAAA;AACT;AAEA,EAAA,OAAOkB,cAELC,CAAAA,UAAAA,EACAX,OAA8B,GAAA,EACQ,EAAA;AACtC,IAAA,MAAMR,MAASZ,GAAAA,MAAAA,CAAOa,MAAO,CAAA,IAAA,CAAKC,SAAS,CAAA;AAC3C,IAAA,MAAMe,KAAQjB,GAAAA,MAAAA,CAAOM,WAAYa,CAAAA,UAAAA,EAAYX,OAAAA,CAAAA;AAC7C,IAAMY,MAAAA,IAAAA,GAAOpB,MAAOG,CAAAA,YAAAA,CAAac,KAAAA,CAAAA;AACjC1B,IAAAA,wBAAAA,CAAMC,KAAKQ,MAAAA,CAAAA;AAEX,IAAQqB,OAAAA,YAAAA,CAAEC,UAAUF,IAAAA,CAAAA,GAAQA,KAAKG,IAAK,CAAA,MAAMvB,MAAAA,CAAUA,GAAAA,MAAAA;AAIxD;AACF","file":"serializable.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 { Serializer } from \"@/serializer/serializer.js\";\nimport { ClassConstructor, PromiseOrPlain } from \"@/internals/types.js\";\nimport * as R from \"remeda\";\nimport { extractClassName } from \"@/serializer/utils.js\";\nimport { SerializerError } from \"@/serializer/error.js\";\nimport { Cache } from \"@/cache/decoratorCache.js\";\n\nexport type SerializableClass<T> = ClassConstructor<Serializable<T>> &\n  Pick<typeof Serializable<T>, \"fromSnapshot\" | \"fromSerialized\">;\n\ninterface SerializableStructure<T> {\n  target: string;\n  snapshot: T;\n}\n\ninterface DeserializeOptions {\n  extraClasses?: SerializableClass<unknown>[];\n}\n\nexport abstract class Serializable<T = unknown> {\n  abstract createSnapshot(): T;\n  abstract loadSnapshot(snapshot: T): void;\n\n  constructor() {\n    Object.getPrototypeOf(this).constructor.register();\n    Cache.init(this);\n  }\n\n  protected static register<T>(this: SerializableClass<T>, aliases?: string[]) {\n    Serializer.registerSerializable(this, undefined, aliases);\n  }\n\n  clone<T extends Serializable>(this: T): T {\n    const snapshot = this.createSnapshot();\n\n    const target = Object.create(this.constructor.prototype);\n    target.loadSnapshot(snapshot);\n    return target;\n  }\n\n  serialize(): string {\n    const snapshot = this.createSnapshot();\n    return Serializer.serialize<SerializableStructure<T>>({\n      target: extractClassName(this),\n      snapshot,\n    });\n  }\n\n  protected deserialize(value: string, options?: DeserializeOptions): T {\n    const { __root } = Serializer.deserializeWithMeta<SerializableStructure<T>>(\n      value,\n      options?.extraClasses,\n    );\n    if (!__root.target) {\n      // eslint-disable-next-line\n      console.warn(\n        `Serializable class must be serialized via \"serialize\" method and not via Serializer class. This may lead to incorrect deserialization.`,\n      );\n      return __root as T;\n    }\n\n    const current = extractClassName(this);\n    if (current !== __root.target) {\n      throw new SerializerError(\n        `Snapshot has been created for class '${__root.target}' but you want to use it for class '${current}'.`,\n      );\n    }\n    return __root.snapshot;\n  }\n\n  static fromSnapshot<T, P>(\n    this: new (...args: any[]) => T extends Serializable<P> ? T : never,\n    state: P,\n  ): T {\n    const target = Object.create(this.prototype);\n    target.loadSnapshot(state);\n    Cache.init(target);\n    return target;\n  }\n\n  static fromSerialized<T extends Serializable>(\n    this: abstract new (...args: any[]) => T,\n    serialized: string,\n    options: DeserializeOptions = {},\n  ): PromiseOrPlain<T, T[\"loadSnapshot\"]> {\n    const target = Object.create(this.prototype) as T;\n    const state = target.deserialize(serialized, options);\n    const load = target.loadSnapshot(state);\n    Cache.init(target);\n\n    return (R.isPromise(load) ? load.then(() => target) : target) as PromiseOrPlain<\n      T,\n      T[\"loadSnapshot\"]\n    >;\n  }\n}\n"]}