lib/JsonEncoder.ts (56 lines of code) (raw):
import { ObjectId } from "mongodb";
export default class JsonEncoder {
static encode(obj: any) {
if (obj instanceof ObjectId) {
return {
$type: 'ObjectId',
$value: obj.toHexString(),
$date: obj.getTimestamp().getTime()
};
}
if (obj instanceof Date) {
return {
$type: 'Date',
$value: obj.toISOString()
};
}
if (obj instanceof RegExp) {
return {
$type: 'RegExp',
$value: {
$pattern: obj.source,
$flags: obj.flags
}
};
}
if (Array.isArray(obj)) {
return [...obj.map(JsonEncoder.encode)];
}
if (obj && typeof obj === 'object') {
for (const [key, value] of Object.entries(obj)) {
obj[key] = JsonEncoder.encode(value);
}
}
return obj;
}
static decode(obj: any) {
if (obj && obj.$type === 'ObjectId') {
return new ObjectId(obj.$value);
}
if (obj && obj.$type === "Date") {
return new Date(obj.$value);
}
if (obj && obj.$type === "RegExp") {
return new RegExp(obj.$value.$pattern, obj.$value.$flags);
}
if (Array.isArray(obj)) {
return [...obj.map(JsonEncoder.decode)];
}
if (obj && typeof obj === 'object') {
for (const [key, value] of Object.entries(obj)) {
obj[key] = JsonEncoder.decode(value);
}
}
return obj;
}
}