@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
JavaScript
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
;