"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const symbol_1 = require("../helper/symbol");
const type_1 = require("../utils/type");
const geo_1 = require("../geo");
const serverDate_1 = require("../serverDate");
function serialize(val, key) {
return serializeHelper(val, [val], key);
}
exports.serialize = serialize;
function serializeHelper(val, visited, key) {
if (type_1.isInternalObject(val)) {
switch (val._internalType) {
case symbol_1.SYMBOL_GEO_POINT: {
return val.toJSON();
}
case symbol_1.SYMBOL_SERVER_DATE: {
return {
$date: val.offset,
};
}
case symbol_1.SYMBOL_REGEXP: {
return val.parse(key);
}
default: {
return val.toJSON ? val.toJSON() : val;
}
}
}
else if (type_1.isDate(val)) {
return {
$date: +val,
};
}
else if (type_1.isRegExp(val)) {
return {
$regex: val.source,
$options: val.flags,
};
}
else if (type_1.isArray(val)) {
return val.map(item => {
Iif (visited.indexOf(item) > -1) {
throw new Error(`Cannot convert circular structure to JSON`);
}
return serializeHelper(item, [
...visited,
item,
]);
});
}
else if (type_1.isObject(val)) {
const ret = Object.assign({}, val);
for (const key in ret) {
Iif (visited.indexOf(ret[key]) > -1) {
throw new Error(`Cannot convert circular structure to JSON`);
}
ret[key] = serializeHelper(ret[key], [
...visited,
ret[key],
]);
}
return ret;
}
else {
return val;
}
}
function deserialize(object) {
const ret = Object.assign({}, object);
for (const key in ret) {
switch (key) {
case '$date': {
switch (type_1.getType(ret[key])) {
case 'number': {
return new Date(ret[key]);
}
case 'object': {
return new serverDate_1.ServerDate(ret[key]);
}
}
break;
}
case 'type': {
switch (ret.type) {
case 'Point': {
if (type_1.isArray(ret.coordinates) && type_1.isNumber(ret.coordinates[0]) && type_1.isNumber(ret.coordinates[1])) {
return new geo_1.Point(ret.coordinates[0], ret.coordinates[1]);
}
break;
}
}
break;
}
}
}
return object;
}
exports.deserialize = deserialize;
|