//needed to convert ES6 maps from/to json type SerializablePrimitive = string | number | boolean | null; type SerializableArray = Serializable[]; type SerializableObject = { [key: string]: Serializable }; type Serializable = SerializablePrimitive | SerializableArray | SerializableObject | SerializedMap; interface SerializedMap { __type: "Map"; value: [Serializable, Serializable][]; } function isSerializedMap(value: unknown): value is SerializedMap { return ( typeof value === "object" && value !== null && "__type" in value && (value as SerializedMap).__type === "Map" && "value" in value && Array.isArray((value as SerializedMap).value) ); } function isMap(value: unknown): value is Map { return value instanceof Map; } function convertMapToSerializable(map: Map): SerializedMap { const serializedEntries: [Serializable, Serializable][] = []; map.forEach((value, key) => { serializedEntries.push([convertToSerializable(key), convertToSerializable(value)]); }); return { __type: "Map", value: serializedEntries, }; } function convertToSerializable(value: unknown): Serializable { if (isMap(value)) { return convertMapToSerializable(value); } if (Array.isArray(value)) { return value.map((item) => convertToSerializable(item)); } if (typeof value === "object" && value !== null) { const result: SerializableObject = {}; for (const [k, v] of Object.entries(value)) { result[k] = convertToSerializable(v); } return result; } return value as Serializable; } function reviveMap(data: SerializedMap): Map { return new Map(data.value.map(([key, value]) => [reviveFromSerializable(key), reviveFromSerializable(value)])); } function reviveFromSerializable(value: unknown): unknown { if (isSerializedMap(value)) { return reviveMap(value); } if (Array.isArray(value)) { return value.map((item) => reviveFromSerializable(item)); } if (typeof value === "object" && value !== null) { const result: Record = {}; for (const [k, v] of Object.entries(value)) { result[k] = reviveFromSerializable(v); } return result; } return value; } export function stringifyMap(value: unknown): string { return JSON.stringify(convertToSerializable(value)); } export function parseMap(jsonString: string): unknown { return reviveFromSerializable(JSON.parse(jsonString)); }