import { ClassRegistry } from './class-registry.js'; import { Registry } from './registry.js'; import { CustomTransformerRegistry, } from './custom-transformer-registry.js'; import { applyReferentialEqualityAnnotations, applyValueAnnotations, generateReferentialEqualityAnnotations, walker, } from './plainer.js'; import { copy } from 'copy-anything'; export default class SuperJSON { /** * @param dedupeReferentialEqualities If true, SuperJSON will make sure only one instance of referentially equal objects are serialized and the rest are replaced with `null`. */ constructor({ dedupe = false, } = {}) { this.classRegistry = new ClassRegistry(); this.symbolRegistry = new Registry(s => s.description ?? ''); this.customTransformerRegistry = new CustomTransformerRegistry(); this.allowedErrorProps = []; this.dedupe = dedupe; } serialize(object) { const identities = new Map(); const output = walker(object, identities, this, this.dedupe); const res = { json: output.transformedValue, }; if (output.annotations) { res.meta = { ...res.meta, values: output.annotations, }; } const equalityAnnotations = generateReferentialEqualityAnnotations(identities, this.dedupe); if (equalityAnnotations) { res.meta = { ...res.meta, referentialEqualities: equalityAnnotations, }; } return res; } deserialize(payload) { const { json, meta } = payload; let result = copy(json); if (meta?.values) { result = applyValueAnnotations(result, meta.values, this); } if (meta?.referentialEqualities) { result = applyReferentialEqualityAnnotations(result, meta.referentialEqualities); } return result; } stringify(object) { return JSON.stringify(this.serialize(object)); } parse(string) { return this.deserialize(JSON.parse(string)); } registerClass(v, options) { this.classRegistry.register(v, options); } registerSymbol(v, identifier) { this.symbolRegistry.register(v, identifier); } registerCustom(transformer, name) { this.customTransformerRegistry.register({ name, ...transformer, }); } allowErrorProps(...props) { this.allowedErrorProps.push(...props); } } SuperJSON.defaultInstance = new SuperJSON(); SuperJSON.serialize = SuperJSON.defaultInstance.serialize.bind(SuperJSON.defaultInstance); SuperJSON.deserialize = SuperJSON.defaultInstance.deserialize.bind(SuperJSON.defaultInstance); SuperJSON.stringify = SuperJSON.defaultInstance.stringify.bind(SuperJSON.defaultInstance); SuperJSON.parse = SuperJSON.defaultInstance.parse.bind(SuperJSON.defaultInstance); SuperJSON.registerClass = SuperJSON.defaultInstance.registerClass.bind(SuperJSON.defaultInstance); SuperJSON.registerSymbol = SuperJSON.defaultInstance.registerSymbol.bind(SuperJSON.defaultInstance); SuperJSON.registerCustom = SuperJSON.defaultInstance.registerCustom.bind(SuperJSON.defaultInstance); SuperJSON.allowErrorProps = SuperJSON.defaultInstance.allowErrorProps.bind(SuperJSON.defaultInstance); export { SuperJSON }; export const serialize = SuperJSON.serialize; export const deserialize = SuperJSON.deserialize; export const stringify = SuperJSON.stringify; export const parse = SuperJSON.parse; export const registerClass = SuperJSON.registerClass; export const registerCustom = SuperJSON.registerCustom; export const registerSymbol = SuperJSON.registerSymbol; export const allowErrorProps = SuperJSON.allowErrorProps; //# sourceMappingURL=index.js.map