UNPKG

@safejs/serializer

Version:

Serializer is a superset of JSON that includes recursive objects, dates, regular expressions, functions and others which you also can expand by yourself

76 lines 3.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseDeserializer = void 0; const refs_1 = require("../refs"); const types_1 = require("../types"); class BaseDeserializer { static deserialize(str, extraSerializers = {}) { const [value, ...refsList] = JSON.parse(str); const resRefs = BaseDeserializer.replaceRefsRefs(refsList, extraSerializers); return BaseDeserializer.replaceRefs(value, resRefs, extraSerializers); } static replaceRefsRefs(refsList, extraSerializers) { const resRefs = new Map(refsList.map((ref, idx) => [refs_1.refs.create(idx), ref])); const prevRefs = new Map(); const refsInitilizes = new Map(); // prepare ref links (deserialize without initialize) for (const [refId, ref] of resRefs.entries()) { const serializerId = resRefs.get(ref === null || ref === void 0 ? void 0 : ref[0]); if (serializerId) { const serializer = extraSerializers[serializerId]; if (serializer) { resRefs.set(refId, serializer.deserialize(ref === null || ref === void 0 ? void 0 : ref[1])); if (types_1.isRecursiveExtraSerializer(serializer)) { refsInitilizes.set(refId, serializer); prevRefs.set(refId, ref === null || ref === void 0 ? void 0 : ref[1]); } } else { console.warn("Serilizer not found"); } } } // replace refs for (const [refId, ref] of resRefs.entries()) { if (refsInitilizes.has(refId)) { refsInitilizes .get(refId) .initialize(ref, BaseDeserializer.replaceRefs(prevRefs.get(refId), resRefs, extraSerializers)); } else { resRefs.set(refId, BaseDeserializer.replaceRefs(ref, resRefs, extraSerializers)); } } return resRefs; } static replaceRefs(value, known, serialziers) { const knownValue = known.get(value); if (knownValue) { if (serialziers[knownValue] && types_1.isConstantExtraSerializer(serialziers[knownValue])) { return serialziers[knownValue].deserialize(value); } return knownValue; } if (typeof value === "object" && value !== null) { if (Array.isArray(value)) { const serializerId = known.get(value === null || value === void 0 ? void 0 : value[0]); if (serializerId && serialziers.hasOwnProperty(serializerId) && !types_1.isConstantExtraSerializer(serialziers[serializerId])) { const serializer = serialziers[serializerId]; const rs = serializer.deserialize(value === null || value === void 0 ? void 0 : value[1]); if (types_1.isRecursiveExtraSerializer(serializer)) { serializer.initialize(rs, BaseDeserializer.replaceRefs(value === null || value === void 0 ? void 0 : value[1], known, serialziers)); } return rs; } } for (const [key, v] of Object.entries(value)) { value[key] = BaseDeserializer.replaceRefs(v, known, serialziers); } } return value; } } exports.BaseDeserializer = BaseDeserializer; //# sourceMappingURL=base-deserializer.js.map