"use strict"; const defaultValue = require("default-value"); const nanoid = require("nanoid"); const jsonStringifyPreReplacer = require("../json-stringify-pre-replacer"); module.exports = function serialize(instance, options = {}) { let customSerializer = defaultValue(options.serializer, (value) => value); /* FIXME: Remove `serializer` argument and let this be specified on fields / type aliases instead? */ let seenItems = new Map(); let data = jsonStringifyPreReplacer(instance, (key, value) => { if (value == null) { return value; } else if (value._guardedCollectionType === "set") { return { _d_sT: "gS", entries: Array.from(value._source.values()) }; } else if (value._guardedCollectionType === "map") { return { _d_sT: "gM", entries: Array.from(value._source.entries()) }; } else if (value._type != null && value._type._isCustomType === true) { if (!seenItems.has(value)) { let objectID = nanoid(); seenItems.set(value, objectID); value._type._ensureHash(); return { _d_sT: "cT", type: value._type._typeHash, data: value._data, id: objectID }; } else { return { _d_sT: "cTR", id: seenItems.get(value) }; } } else { return customSerializer(value); } }); return data; };