You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
4.2 KiB
95 lines
4.2 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.allowErrorProps = exports.registerSymbol = exports.registerCustom = exports.registerClass = exports.parse = exports.stringify = exports.deserialize = exports.serialize = exports.SuperJSON = void 0;
|
|
const class_registry_js_1 = require("./class-registry.cjs");
|
|
const registry_js_1 = require("./registry.cjs");
|
|
const custom_transformer_registry_js_1 = require("./custom-transformer-registry.cjs");
|
|
const plainer_js_1 = require("./plainer.cjs");
|
|
const copy_anything_1 = require("copy-anything");
|
|
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 class_registry_js_1.ClassRegistry();
|
|
this.symbolRegistry = new registry_js_1.Registry(s => s.description ?? '');
|
|
this.customTransformerRegistry = new custom_transformer_registry_js_1.CustomTransformerRegistry();
|
|
this.allowedErrorProps = [];
|
|
this.dedupe = dedupe;
|
|
}
|
|
serialize(object) {
|
|
const identities = new Map();
|
|
const output = plainer_js_1.walker(object, identities, this, this.dedupe);
|
|
const res = {
|
|
json: output.transformedValue,
|
|
};
|
|
if (output.annotations) {
|
|
res.meta = {
|
|
...res.meta,
|
|
values: output.annotations,
|
|
};
|
|
}
|
|
const equalityAnnotations = plainer_js_1.generateReferentialEqualityAnnotations(identities, this.dedupe);
|
|
if (equalityAnnotations) {
|
|
res.meta = {
|
|
...res.meta,
|
|
referentialEqualities: equalityAnnotations,
|
|
};
|
|
}
|
|
if (res.meta)
|
|
res.meta.v = 1;
|
|
return res;
|
|
}
|
|
deserialize(payload, options) {
|
|
const { json, meta } = payload;
|
|
let result = options?.inPlace ? json : copy_anything_1.copy(json);
|
|
if (meta?.values) {
|
|
result = plainer_js_1.applyValueAnnotations(result, meta.values, meta.v ?? 0, this);
|
|
}
|
|
if (meta?.referentialEqualities) {
|
|
result = plainer_js_1.applyReferentialEqualityAnnotations(result, meta.referentialEqualities, meta.v ?? 0);
|
|
}
|
|
return result;
|
|
}
|
|
stringify(object) {
|
|
return JSON.stringify(this.serialize(object));
|
|
}
|
|
parse(string) {
|
|
return this.deserialize(JSON.parse(string), { inPlace: true });
|
|
}
|
|
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);
|
|
}
|
|
}
|
|
exports.default = SuperJSON;
|
|
exports.SuperJSON = SuperJSON;
|
|
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);
|
|
exports.serialize = SuperJSON.serialize;
|
|
exports.deserialize = SuperJSON.deserialize;
|
|
exports.stringify = SuperJSON.stringify;
|
|
exports.parse = SuperJSON.parse;
|
|
exports.registerClass = SuperJSON.registerClass;
|
|
exports.registerCustom = SuperJSON.registerCustom;
|
|
exports.registerSymbol = SuperJSON.registerSymbol;
|
|
exports.allowErrorProps = SuperJSON.allowErrorProps;
|
|
//# sourceMappingURL=index.js.map
|