UNPKG

@rickyli79/rich-json

Version:

Serialize and Deserialize javascript objects

136 lines (135 loc) 5.57 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.addCustomerSerializer = exports.createCustomerSerializer = exports.resetCustomerSerializers = exports.customerSerializers = exports.getBuildinSerializers = exports.calMarkId = exports.isNativeProperty = exports.getNativeKeys = exports.getMarkKey = exports.isBrowser = exports.isNodeJs = exports.simEval = void 0; const BigInt_Serializer_1 = require("./buildin-serializer/BigInt.Serializer"); const Buffer_Serializer_1 = require("./buildin-serializer/Buffer.Serializer"); const Date_Serializer_1 = require("./buildin-serializer/Date.Serializer"); const Error_Serializer_1 = require("./buildin-serializer/Error.Serializer"); const Function_Serializer_1 = require("./buildin-serializer/Function.Serializer"); const Map_Serializer_1 = require("./buildin-serializer/Map.Serializer"); const Number_Serializer_1 = require("./buildin-serializer/Number.Serializer"); const RegExp_Serializer_1 = require("./buildin-serializer/RegExp.Serializer"); const Set_Serializer_1 = require("./buildin-serializer/Set.Serializer"); const URL_Serializer_1 = require("./buildin-serializer/URL.Serializer"); const WrapRunner_Serializer_1 = require("./buildin-serializer/WrapRunner.Serializer"); function simEval(code) { // eslint-disable-next-line no-new-func return new Function(`return ${code}`)(); } exports.simEval = simEval; function getIsNodejs() { return (typeof process !== 'undefined') && (Object.prototype.toString.call(process) === '[object process]') && (!!(process.versions && process.versions.node)); } exports.isNodeJs = getIsNodejs(); function getIsBrowser() { return (typeof window !== 'undefined') && (Object.prototype.toString.call(window) === '[object Window]') && (typeof window.alert === 'function') && (typeof window.console === 'object'); } exports.isBrowser = getIsBrowser(); function getMarkKey(num, sp) { return sp + num.toString(36) + sp; } exports.getMarkKey = getMarkKey; const NATIVE_TYPE = 'T'; const NATIVE_CONTENT = 'C'; const NATIVE_CLASSNAME = 'N'; function getNativeKeys(sp, mark) { const type = sp + NATIVE_TYPE + sp; const content = sp + NATIVE_CONTENT + sp; const className = sp + NATIVE_CLASSNAME + sp; const required = [type, content]; const required_length = required.length + 1; const all = [type, content, className]; const all_length = all.length + 1; if (mark !== undefined) { required.push(mark); all.push(mark); } return { sp, mark, type, content, className, required, required_length, all, all_length, }; } exports.getNativeKeys = getNativeKeys; function isNativeProperty(value, nativeKeys) { if (value === null || Array.isArray(value) || typeof (value) !== 'object') return false; const keys = Object.keys(value); if (nativeKeys.mark && value[nativeKeys.mark] !== 1) return false; if (keys.length > nativeKeys.all_length || keys.length < nativeKeys.required_length) return false; if (!nativeKeys.required.every(i => keys.includes(i))) return false; if (nativeKeys.mark && !keys.every(i => nativeKeys.all.includes(i))) return false; return true; } exports.isNativeProperty = isNativeProperty; function calMarkId(value, nativeKeys, usedMark) { if (!isNativeProperty(value, nativeKeys)) return; const keys = Object.keys(value); const [extraKey] = keys.filter(i => !nativeKeys.all.includes(i)); if (extraKey === undefined || value[extraKey] !== 1) return; usedMark.push(extraKey); } exports.calMarkId = calMarkId; function getBuildinSerializers() { return [ BigInt_Serializer_1.BigIntSerializer.getInstance(), Number_Serializer_1.NumberSerializer.getInstance(), Function_Serializer_1.FunctionSerializer.getInstance(), Date_Serializer_1.DateSerializer.getInstance(), Buffer_Serializer_1.BufferSerializer.getInstance(), URL_Serializer_1.URLSerializer.getInstance(), Set_Serializer_1.SetSerializer.getInstance(), Map_Serializer_1.MapSerializer.getInstance(), RegExp_Serializer_1.RegExpSerializer.getInstance(), Error_Serializer_1.ErrorSerializer.getInstance(), WrapRunner_Serializer_1.WrapRunnerSerializer.getInstance(), ]; } exports.getBuildinSerializers = getBuildinSerializers; exports.customerSerializers = []; function resetCustomerSerializers() { exports.customerSerializers.splice(0); return exports.customerSerializers; } exports.resetCustomerSerializers = resetCustomerSerializers; function createCustomerSerializer(pars) { return { className: pars.className ?? pars.class.name, class: pars.class, fromContent: pars.fromContent, toContent: pars.toContent, isType: pars.isType ?? ((clz) => { return (value) => { return value instanceof clz; }; })(pars.class), serializContent: pars.serializContent ?? true, }; } exports.createCustomerSerializer = createCustomerSerializer; function addCustomerSerializer(pars) { const serializer = createCustomerSerializer(pars); const c = exports.customerSerializers.find(i => i.className === serializer.className); if (c) { throw new Error(`duplicate serializer : ${c.className}`); } exports.customerSerializers.push(serializer); } exports.addCustomerSerializer = addCustomerSerializer;