@rickyli79/rich-json
Version:
Serialize and Deserialize javascript objects
136 lines (135 loc) • 5.57 kB
JavaScript
;
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;