You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.3 KiB
JavaScript
53 lines
1.3 KiB
JavaScript
"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;
|
|
};
|