{"version":3,"sources":["../../../src/utils/classes.ts"],"sourcesContent":["import util from 'node:util'\n\nimport { wrapInTryCatch } from './functions'\nimport type { JSONValueOf } from './types'\n\nif (util?.inspect?.defaultOptions) {\n\tutil.inspect.defaultOptions.depth = Number.MAX_SAFE_INTEGER\n\tutil.inspect.defaultOptions.getters = true\n\tutil.inspect.defaultOptions.numericSeparator = true\n}\n\nconst customInspectSymbol = Symbol.for('nodejs.util.inspect.custom')\n\ntype Accessor<Keys extends object> = {\n\tget: <Key extends keyof Keys>(key: Key, keysObj: Keys) => Keys[Key]\n\tset: <Key extends keyof Keys>(key: Key, value: Keys[Key], keysObj: Keys) => void\n}\n\nfunction WrapWithProperties(): { new <Keys extends Record<string, unknown>>(): Keys } {\n\treturn class {\n\t\t[customInspectSymbol](_, options, inspect) {\n\t\t\toptions.getters = true\n\t\t\toptions.numericSeparator = true\n\t\t\toptions.depth = Number.MAX_SAFE_INTEGER\n\t\t\treturn options.stylize(this.constructor.name, options) + ' ' + inspect((this as any).toJSON?.() ?? this, options)\n\t\t}\n\t} as any\n}\n\n// @ts-expect-error invalid extends\nclass __Root<Keys extends object> extends WrapWithProperties()<Keys> {}\n\nexport class DataClass<Keys extends object> extends __Root<Keys> {\n\tconstructor(\n\t\tkeys: Keys,\n\t\taccess: Accessor<Keys> = {\n\t\t\tget: (key, keys) => keys[key],\n\t\t\tset: (key, value, keys) => {\n\t\t\t\tkeys[key] = value\n\t\t\t},\n\t\t},\n\t) {\n\t\tsuper()\n\t\tObject.keys(keys).forEach((key) => {\n\t\t\tObject.defineProperty(this, key, {\n\t\t\t\tget: () => access.get(key as keyof Keys, keys),\n\t\t\t\tset: (value) => {\n\t\t\t\t\taccess.set(key as keyof Keys, value, keys)\n\t\t\t\t},\n\t\t\t\tenumerable: true,\n\t\t\t\tconfigurable: true,\n\t\t\t})\n\t\t})\n\t}\n\n\ttoJSON(): JSONValueOf<Keys> {\n\t\tconst json: Record<string, any> = {}\n\t\tObject.keys(this).forEach((key) => {\n\t\t\tconst value = this[key]\n\t\t\tif (typeof value === 'function' || value === undefined) return\n\t\t\tjson[key] =  wrapInTryCatch(() => (value as any)?.toJSON?.() ?? structuredClone(value), value)\n\t\t})\n\t\treturn json as any\n\t}\n\n\ttoString() {\n\t\treturn JSON.stringify(this.toJSON())\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAiB;AAEjB,uBAA+B;AAG/B,IAAI,iBAAAA,SAAM,SAAS,gBAAgB;AAClC,mBAAAA,QAAK,QAAQ,eAAe,QAAQ,OAAO;AAC3C,mBAAAA,QAAK,QAAQ,eAAe,UAAU;AACtC,mBAAAA,QAAK,QAAQ,eAAe,mBAAmB;AAChD;AAEA,MAAM,sBAAsB,uBAAO,IAAI,4BAA4B;AAOnE,SAAS,qBAA6E;AACrF,SAAO,MAAM;AAAA,IACZ,CAAC,mBAAmB,EAAE,GAAG,SAAS,SAAS;AAC1C,cAAQ,UAAU;AAClB,cAAQ,mBAAmB;AAC3B,cAAQ,QAAQ,OAAO;AACvB,aAAO,QAAQ,QAAQ,KAAK,YAAY,MAAM,OAAO,IAAI,MAAM,QAAS,KAAa,SAAS,KAAK,MAAM,OAAO;AAAA,IACjH;AAAA,EACD;AACD;AAGA,MAAM,eAAoC,mBAAmB,EAAQ;AAAC;AAE/D,MAAM,kBAAuC,OAAa;AAAA,EAChE,YACC,MACA,SAAyB;AAAA,IACxB,KAAK,CAAC,KAAKC,UAASA,MAAK,GAAG;AAAA,IAC5B,KAAK,CAAC,KAAK,OAAOA,UAAS;AAC1B,MAAAA,MAAK,GAAG,IAAI;AAAA,IACb;AAAA,EACD,GACC;AACD,UAAM;AACN,WAAO,KAAK,IAAI,EAAE,QAAQ,CAAC,QAAQ;AAClC,aAAO,eAAe,MAAM,KAAK;AAAA,QAChC,KAAK,MAAM,OAAO,IAAI,KAAmB,IAAI;AAAA,QAC7C,KAAK,CAAC,UAAU;AACf,iBAAO,IAAI,KAAmB,OAAO,IAAI;AAAA,QAC1C;AAAA,QACA,YAAY;AAAA,QACZ,cAAc;AAAA,MACf,CAAC;AAAA,IACF,CAAC;AAAA,EACF;AAAA,EAEA,SAA4B;AAC3B,UAAM,OAA4B,CAAC;AACnC,WAAO,KAAK,IAAI,EAAE,QAAQ,CAAC,QAAQ;AAClC,YAAM,QAAQ,KAAK,GAAG;AACtB,UAAI,OAAO,UAAU,cAAc,UAAU,OAAW;AACxD,WAAK,GAAG,QAAK,iCAAe,MAAO,OAAe,SAAS,KAAK,gBAAgB,KAAK,GAAG,KAAK;AAAA,IAC9F,CAAC;AACD,WAAO;AAAA,EACR;AAAA,EAEA,WAAW;AACV,WAAO,KAAK,UAAU,KAAK,OAAO,CAAC;AAAA,EACpC;AACD;","names":["util","keys"]}