any-serialize
Version:
Serialize / Deserialize any JavaScript objects, as long as you provides how-to. I have already provided `Date`, `RegExp`, `Set` and `Function`.
1 lines • 30.6 kB
Source Map (JSON)
{"version":3,"file":"index.mjs","sources":["../src/utils.ts","../src/type.ts","../src/mongo.ts","../src/index.ts"],"sourcesContent":["export type StringifyFunction = (\n obj: any,\n ...args: any[]\n) => string\n\nexport type ParseFunction = (\n repr: string,\n reviver: (k: string, v: any) => any\n) => any\n\nexport interface IRegistration {\n item?: Function | RegExpConstructor\n prefix?: string\n key?: string\n toJSON?: (_this: any, parent: any) => any,\n fromJSON?: ((current: any, parent: any) => any) | null\n}\n\nexport function isClassConstructor (k: any): k is { prototype: { constructor: any } } {\n return !!(k.prototype && k.prototype.constructor)\n}\n\nexport function isClassObject (k: any): k is { constructor: { name: string }} {\n return !!(k.constructor && typeof k.constructor.name === 'string')\n}\n\nexport function compareNotFalsy (a: any, b: any) {\n return !!a && a === b\n}\n\nexport function getFunctionName (R: Function) {\n return R.toString().replace(/^function /, '').split('(')[0]\n}\n\nexport function functionToString (R: Function) {\n return R.toString().replace(/^.+?\\{/s, '').replace(/\\}.*?$/s, '').trim().replace(/[\\t\\n\\r ]*/g, ' ')\n}\n\n/**\n * https://stackoverflow.com/questions/7616461/generate-a-hash-from-string-in-javascript\n *\n * https://stackoverflow.com/a/52171480/9023855\n *\n * @param str\n * @param seed\n */\nexport function cyrb53 (str: string, seed = 0) {\n let h1 = 0xdeadbeef ^ seed; let h2 = 0x41c6ce57 ^ seed\n for (let i = 0, ch; i < str.length; i++) {\n ch = str.charCodeAt(i)\n h1 = Math.imul(h1 ^ ch, 2654435761)\n h2 = Math.imul(h2 ^ ch, 1597334677)\n }\n h1 = Math.imul(h1 ^ h1 >>> 16, 2246822507) ^ Math.imul(h2 ^ h2 >>> 13, 3266489909)\n h2 = Math.imul(h2 ^ h2 >>> 16, 2246822507) ^ Math.imul(h1 ^ h1 >>> 13, 3266489909)\n return 4294967296 * (2097151 & h2) + (h1 >>> 0)\n}\n\n/**\n * https://stackoverflow.com/questions/34699529/convert-javascript-class-instance-to-plain-object-preserving-methods\n */\nexport function extractObjectFromClass (o: any, exclude: string[] = []) {\n const content = {} as any\n\n Object.getOwnPropertyNames(o).map((prop) => {\n const val = o[prop]\n if (['constructor', ...exclude].includes(prop)) {\n return\n }\n content[prop] = val\n })\n\n return o\n}\n","export type TypeNativeSerializable = 'string' | 'number' | 'boolean'\nexport type TypeNativeNonSerializable = 'bigint' | 'symbol' | 'undefined' | 'function' | 'object'\nexport type TypeExtra = 'Null' | 'Array' | 'Named' | 'Constructor' | 'NaN' | 'Infinity'\nexport type TypeAll = TypeNativeSerializable | TypeNativeNonSerializable | TypeExtra\n\nexport function getTypeofDetailed (a: any) {\n const typeof_ = typeof a\n const output: {\n typeof_: TypeNativeSerializable | TypeNativeNonSerializable\n is: TypeAll[]\n id?: Function\n description?: string\n entry: any\n } = {\n typeof_,\n is: [],\n entry: a\n }\n\n if (typeof_ === 'object') {\n if (!a) {\n output.is = ['Null']\n } else {\n /**\n * constructor will return Class constructor\n * or Object constructor for an Object\n *\n * The actual constructor name can be accessed via\n * `constructor.name`\n *\n * constructor can checked for equality as well, for example\n * Object === Object\n *\n * Not sure what happens when you `extends` Object or Array\n * in which case, it might be better to check `constructor.name`\n */\n output.id = a.constructor\n if (output.id === Object) {\n output.is = ['object']\n } else if (output.id === Array) {\n output.is = ['Array']\n /**\n * Array.isArray() also includes classes that extend Array\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/isArray\n *\n * Given a TypedArray instance, false is always returned\n */\n // } else if (Array.isArray(a)) {\n // output.is = ['NamedArray']\n } else {\n output.is = ['Named']\n }\n }\n } else if (typeof_ === 'function') {\n /**\n * Checking for Class constructor is a difficult topic.\n * https://stackoverflow.com/questions/40922531/how-to-check-if-a-javascript-function-is-a-constructor\n *\n * Probably the safest way is by checking prototype.\n *\n * new a() is more failsafe, but is dangerous. (because you ran a function)\n */\n if (!a.prototype) {\n /**\n * Arrow function doesn't have a prototype\n */\n output.is = ['function']\n } else {\n output.id = a.prototype.constructor\n\n if (Object.getOwnPropertyNames(a.prototype).some((el) => el !== 'constructor')) {\n output.description = 'Can also be a class constructor in some cases'\n if (/[A-Z]/.test(a.prototype.constructor.name[0])) {\n output.is = ['Constructor', 'function']\n } else {\n output.is = ['function', 'Constructor']\n }\n } else {\n output.is = ['Constructor']\n }\n }\n } else if (typeof_ === 'number') {\n if (isNaN(a)) {\n output.is = ['NaN'] // JSON.stringify returns null\n } else if (!isFinite(a)) {\n output.is = ['Infinity'] // JSON.stringify returns null\n } else if (Math.round(a) === a) {\n output.description = 'Integer' // JSON.stringify cannot distinguish, nor do JavaScript\n }\n }\n\n if (output.is.length === 0) {\n output.is = [typeof_]\n }\n\n return output\n}\n\nexport function isArray (a: any, t?: ReturnType<typeof getTypeofDetailed>): a is any[] {\n return (t || getTypeofDetailed(a)).is[0] === 'Array'\n}\n\nexport function isObject (a: any, t?: ReturnType<typeof getTypeofDetailed>): a is Record<string, any> {\n return (t || getTypeofDetailed(a).is[0]) === 'object'\n}\n","import { IRegistration } from './utils'\n\nexport const MongoDateAdapter: IRegistration = {\n prefix: '',\n key: '$date',\n item: Date,\n fromJSON: (current) => new Date(current)\n}\n\nexport const MongoRegExpAdapter: IRegistration = {\n prefix: '',\n key: '$regex',\n item: RegExp,\n fromJSON (current: string, parent: { $options?: string }) {\n return new RegExp(current, parent.$options)\n },\n toJSON (_this: any, parent: any) {\n parent.$options = _this.flags\n return _this.source\n }\n}\n","import {\n StringifyFunction, ParseFunction, IRegistration,\n isClassConstructor, getFunctionName, compareNotFalsy, cyrb53, extractObjectFromClass\n} from './utils'\nimport { getTypeofDetailed, isArray, isObject } from './type'\n\nexport class Serialize {\n private registrar: {\n R?: Function\n key: any\n toJSON?: (_this: any, parent: any) => any\n fromJSON?: (current: any, parent: any) => any\n }[] = []\n\n private prefix = '__'\n private stringifyFunction: StringifyFunction = JSON.stringify\n private parseFunction: ParseFunction = JSON.parse\n\n private undefinedProxy = Symbol('undefined')\n\n constructor (\n /**\n * For how to write a replacer and reviver, see\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON\n */\n options: {\n prefix?: string\n stringify?: StringifyFunction,\n parse?: ParseFunction\n } = {}\n ) {\n this.prefix = typeof options.prefix === 'string' ? options.prefix : this.prefix\n this.stringifyFunction = options.stringify || this.stringifyFunction\n this.parseFunction = options.parse || this.parseFunction\n\n this.register(\n { item: Date },\n {\n item: RegExp,\n toJSON (_this: any) {\n const { source, flags } = _this\n return { source, flags }\n },\n fromJSON (current: any) {\n const { source, flags } = current\n return new RegExp(source, flags)\n }\n },\n WriteOnlyFunctionAdapter,\n {\n item: Set,\n toJSON (_this) {\n return Array.from(_this)\n }\n },\n {\n key: 'Infinity',\n toJSON (_this: number) {\n return _this.toString()\n },\n fromJSON (current: string) {\n return Number(current)\n }\n },\n {\n key: 'bigint',\n toJSON (_this: BigInt) {\n return _this.toString()\n },\n fromJSON (current: string) {\n return BigInt(current)\n }\n },\n {\n key: 'symbol',\n toJSON (_this: Symbol) {\n return {\n content: _this.toString(),\n rand: Math.random().toString(36).substr(2)\n }\n },\n fromJSON ({ content }) {\n return Symbol(content.replace(/^Symbol\\(/i, '').replace(/\\)$/, ''))\n }\n },\n {\n key: 'NaN',\n toJSON: () => 'NaN',\n fromJSON: () => NaN\n }\n )\n }\n\n /**\n *\n * @param rs Accepts Class constructors or IRegistration\n */\n register (...rs: ({ new(...args: any[]): any } | IRegistration)[]) {\n this.registrar.unshift(\n ...rs.map((r) => {\n if (typeof r === 'function') {\n const { __prefix__: prefix, __key__: key, fromJSON, toJSON } = r as any\n\n return {\n item: r,\n prefix,\n key,\n fromJSON,\n toJSON\n }\n }\n\n return r\n }).map(({\n item: R, prefix, key, toJSON, fromJSON\n }) => {\n // @ts-ignore\n fromJSON = typeof fromJSON === 'undefined'\n ? (arg: any) => isClassConstructor(R) ? new R(arg) : arg\n : (fromJSON || undefined)\n key = this.getKey(prefix, key || (isClassConstructor(R)\n ? R.prototype.constructor.name\n : typeof R === 'function' ? getFunctionName(R) : R))\n\n return {\n R,\n key,\n toJSON,\n fromJSON\n }\n })\n )\n }\n\n unregister (...rs: ({ new(...args: any[]): any } | IRegistration)[]) {\n this.registrar = this.registrar.filter(({ R, key }) => {\n return !rs.some((r) => {\n if (typeof r === 'function') {\n return !!R && r.constructor === R.constructor\n } else {\n return compareNotFalsy(r.key, key) || (!!r.item && !!R && compareNotFalsy(r.item.constructor, R.constructor))\n }\n })\n })\n }\n\n /**\n *\n * @param obj Uses `JSON.stringify` with sorter Array by default\n */\n stringify (obj: any) {\n const clonedObj = this.deepCloneAndFindAndReplace([obj], 'jsonCompatible')[0]\n\n const keys = new Set<string>()\n const getAndSortKeys = (a: any) => {\n if (a) {\n if (typeof a === 'object' && a.constructor.name === 'Object') {\n for (const k of Object.keys(a)) {\n keys.add(k)\n getAndSortKeys(a[k])\n }\n } else if (Array.isArray(a)) {\n a.map((el) => getAndSortKeys(el))\n }\n }\n }\n getAndSortKeys(clonedObj)\n return this.stringifyFunction(clonedObj, Array.from(keys).sort())\n }\n\n hash (obj: any) {\n return cyrb53(this.stringify(obj)).toString(36)\n }\n\n clone<T> (obj: T): T {\n return this.deepCloneAndFindAndReplace([obj], 'clone')[0]\n }\n\n deepEqual (o1: any, o2: any): boolean {\n const t1 = getTypeofDetailed(o1)\n const t2 = getTypeofDetailed(o2)\n\n if (t1.typeof_ === 'function' || t1.typeof_ === 'object') {\n if (isArray(o1, t1)) {\n return o1.map((el1, k) => {\n return this.deepEqual(el1, o2[k])\n }).every((el) => el)\n } else if (isObject(o1, t1)) {\n return Object.entries(o1).map(([k, el1]) => {\n return this.deepEqual(el1, o2[k])\n }).every((el) => el)\n } else {\n return this.hash(o1) === this.hash(o2)\n }\n } else if (t1.is[0] === 'NaN' && t2.is[0] === 'NaN') {\n /**\n * Cannot compare directly because of infamous `NaN !== NaN`\n */\n return this.hash(o1) === this.hash(o2)\n }\n\n return o1 === o2\n }\n\n /**\n *\n * @param repr Uses `JSON.parse` by default\n */\n parse (repr: string) {\n return this.parseFunction(repr, (_, v) => {\n if (v && typeof v === 'object') {\n for (const { key, fromJSON } of this.registrar) {\n if (v[key]) {\n return typeof fromJSON === 'function' ? fromJSON(v[key], v) : v\n }\n }\n }\n return v\n })\n }\n\n private getKey (prefix: any, name: any) {\n return (typeof prefix === 'string' ? prefix : this.prefix) + (name || '')\n }\n\n /**\n *\n * @param o\n * @param type Type of findAndReplace\n */\n private deepCloneAndFindAndReplace (o: any, type: 'jsonCompatible' | 'clone') {\n const t = getTypeofDetailed(o)\n\n if (t.is[0] === 'Array') {\n const obj = [] as any[]\n o.map((el: any, i: number) => {\n const v = this.deepCloneAndFindAndReplace(el, type)\n /**\n * `undefined` can't be ignored in serialization, and will be JSON.stringify as `null`\n */\n if (v === this.undefinedProxy) {\n obj[i] = undefined\n } else {\n obj[i] = v\n }\n })\n\n return obj\n } else if (t.is[0] === 'object') {\n const obj = {} as any\n Object.entries(o).map(([k, el]) => {\n const v = this.deepCloneAndFindAndReplace(el, type)\n if (v === undefined) {\n\n } else if (v === this.undefinedProxy) {\n obj[k] = undefined\n } else {\n obj[k] = v\n }\n })\n\n return obj\n } else if (t.is[0] === 'Named') {\n const k = this.getKey(o.__prefix__, o.__name__ || o.constructor.name)\n\n for (const { R, key, toJSON, fromJSON } of this.registrar) {\n if ((!!R && compareNotFalsy(o.constructor, R)) ||\n compareNotFalsy(k, key)) {\n if (!fromJSON && type === 'clone') {\n continue\n }\n\n const p = {} as any\n p[key] = (\n (toJSON || (!!R && R.prototype.toJSON) || o.toJSON || o.toString).bind(o)\n )(o, p)\n\n if (p[key] === undefined) {\n return undefined\n } else if (type === 'clone') {\n return fromJSON!(p[key], p)\n } else {\n return p\n }\n }\n }\n\n if (type === 'clone') {\n return o\n } else {\n return {\n [k]: extractObjectFromClass(o)\n }\n }\n } else if (t.is[0] === 'Constructor' || t.is[0] === 'function' || t.is[0] === 'Infinity' ||\n t.is[0] === 'bigint' || t.is[0] === 'symbol' || t.is[0] === 'NaN') {\n let is = t.is[0]\n if (is === 'Constructor') {\n is = 'function'\n }\n\n /**\n * functions should be attempted to be deep-cloned first\n * because functions are objects and can be attach properties\n */\n if (type === 'clone' && is !== 'function') {\n return o\n }\n\n const k = this.getKey(undefined, is)\n const { R, toJSON, fromJSON } = this.registrar.filter(({ key }) => key === k)[0] || {}\n\n if (type === 'clone' && !fromJSON) {\n return o\n }\n\n const p = {} as any\n p[k] = (\n (toJSON || (!!R && R.prototype.toJSON) || o.toJSON || o.toString).bind(o)\n )(o, p)\n\n if (type === 'clone') {\n return fromJSON!(p[k], p)\n } else if (p[k] === undefined) {\n return undefined\n } else {\n return p\n }\n } else if (t.is[0] === 'undefined') {\n if (type === 'clone') {\n return this.undefinedProxy\n }\n\n const k = this.getKey(undefined, t.is[0])\n const { R, toJSON } = this.registrar.filter(({ key }) => key === k)[0] || {}\n\n const p = {} as any\n p[k] = (\n (toJSON || (!!R && R.prototype.toJSON) || (() => {})).bind(o)\n )(o, p)\n\n return p[k] === undefined ? undefined : p\n }\n\n return o\n }\n}\n\nexport const FullFunctionAdapter: IRegistration = {\n key: 'function',\n toJSON: (_this) => _this.toString().trim().replace(/\\[native code\\]/g, ' ').replace(/[\\t\\n\\r ]+/g, ' '),\n fromJSON: (content: string) => {\n // eslint-disable-next-line no-new-func\n return new Function(`return ${content}`)()\n }\n}\n\nexport const WriteOnlyFunctionAdapter: IRegistration = {\n ...FullFunctionAdapter,\n fromJSON: null\n}\n\nexport const UndefinedAdapter: IRegistration = {\n key: 'undefined',\n toJSON: () => 'undefined',\n fromJSON: () => undefined\n}\n\nexport * from './mongo'\nexport * from './utils'\n"],"names":[],"mappings":"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"}