UNPKG

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.9 kB
{"version":3,"file":"index.min.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":["isClassConstructor","k","prototype","constructor","isClassObject","name","compareNotFalsy","a","b","getFunctionName","R","toString","replace","split","functionToString","trim","cyrb53","str","seed","Math","imul","h1","h2","ch","i","length","charCodeAt","extractObjectFromClass","o","exclude","Object","getOwnPropertyNames","map","prop","includes","getTypeofDetailed","round","typeof_","output","is","entry","id","Array","some","el","description","test","isNaN","isFinite","isArray","t","isObject","MongoDateAdapter","prefix","key","item","Date","fromJSON","current","MongoRegExpAdapter","RegExp","parent","$options","toJSON","_this","flags","source","Serialize","options","JSON","stringify","parse","Symbol","stringifyFunction","parseFunction","register","WriteOnlyFunctionAdapter","Set","from","BigInt","content","rand","random","substr","NaN","rs","registrar","unshift","r","__prefix__","__key__","arg","getKey","unregister","filter","obj","clonedObj","deepCloneAndFindAndReplace","keys","getAndSortKeys","add","sort","hash","clone","deepEqual","o1","o2","t1","t2","el1","every","entries","repr","_","v","type","undefinedProxy","__name__","p","bind","FullFunctionAdapter","Function","UndefinedAdapter"],"mappings":"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"}