@decaf-ts/decorator-validation
Version:
simple decorator based validation engine
77 lines • 2.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.JSONSerializer = void 0;
const decoration_1 = require("@decaf-ts/decoration");
const Model_1 = require("./../model/Model.cjs");
const constants_1 = require("./constants.cjs");
const serialization_1 = require("./serialization.cjs");
/**
* @summary Concrete implementation of a {@link Serializer} in JSON format
* @description JS's native JSON.stringify (used here) is not deterministic
* and therefore should not be used for hashing purposes
*
* To keep dependencies low, we will not implement this, but we recommend
* implementing a similar {@link JSONSerializer} using 'deterministic-json' libraries
*
* @class JSONSerializer
* @implements Serializer
*
* @category Model
*/
class JSONSerializer {
constructor() { }
/**
* @summary prepares the model for serialization
* @description returns a shallow copy of the object, containing an enumerable {@link ModelKeys#ANCHOR} property
* so the object can be recognized upon deserialization
*
* @param {T} model
* @protected
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
preSerialize(model, ...args) {
// TODO: nested preserialization (so increase performance when deserializing)
// TODO: Verify why there is no metadata
const toSerialize = Object.assign({}, model);
let metadata;
try {
metadata = decoration_1.Metadata.modelName(model.constructor);
// eslint-disable-next-line @typescript-eslint/no-unused-vars
}
catch (error) {
metadata = undefined;
}
toSerialize[constants_1.ModelKeys.ANCHOR] = metadata || model.constructor.name;
return toSerialize;
}
/**
* @summary Rebuilds a model from a serialization
* @param {string} str
*
* @throws {Error} If it fails to parse the string, or to build the model
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
deserialize(str, ...args) {
const deserialization = JSON.parse(str);
const className = deserialization[constants_1.ModelKeys.ANCHOR];
if (!className)
throw new Error("Could not find class reference in serialized model");
const model = Model_1.Model.build(deserialization, className);
return model;
}
/**
* @summary Serializes a model
* @param {T} model
*
* @throws {Error} if fails to serialize
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
serialize(model, ...args) {
return JSON.stringify(this.preSerialize(model));
}
}
exports.JSONSerializer = JSONSerializer;
serialization_1.Serialization["cache"] = {
json: new JSONSerializer(),
};
//# sourceMappingURL=serializers.js.map