@skimp/json-file
Version:
The json-file module for the skimp domain modelling framework
64 lines • 2.73 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Serialiser = void 0;
const utils_1 = require("@cleavera/utils");
const core_1 = require("@skimp/core");
const schema_1 = require("@skimp/schema");
class Serialiser {
serialise(model) {
const schema = model.constructor;
let fields = schema_1.SCHEMA_REGISTER.getFields(schema);
const type = schema_1.SCHEMA_REGISTER.getSchemaResourceName(schema);
const relationships = core_1.MODEL_REGISTER.getRelationships(model);
if ((0, utils_1.isNull)(type)) {
throw new schema_1.SchemaNotRegisteredException(schema);
}
if ((0, utils_1.isNull)(fields)) {
fields = [];
}
const out = {
type,
data: fields.reduce((result, field) => {
const mappedField = schema_1.SCHEMA_REGISTER.mapToField(schema, field);
if ((0, utils_1.isNull)(mappedField)) {
throw new schema_1.FieldNotConfiguredException(schema, field);
}
result[mappedField] = schema_1.SCHEMA_REGISTER.serialise(schema, field, model[field]);
return result;
}, {})
};
if (!(0, utils_1.isEmpty)(relationships ?? [])) {
out.relationships = relationships.map((relationship) => {
return relationship.toString();
});
}
return JSON.stringify(out, null, '\t');
}
deserialise(body) {
const json = JSON.parse(body);
const schema = schema_1.SCHEMA_REGISTER.getSchema(json.type);
if ((0, utils_1.isNull)(schema)) {
throw new schema_1.ResourceNotRegisteredException(json.type);
}
let fields = schema_1.SCHEMA_REGISTER.getFields(schema);
if ((0, utils_1.isNull)(fields)) {
fields = [];
}
const model = new schema();
fields.forEach((field) => {
const mappedField = schema_1.SCHEMA_REGISTER.mapToField(schema, field);
if ((0, utils_1.isNull)(mappedField)) {
throw new schema_1.FieldNotConfiguredException(schema, field);
}
model[field] = schema_1.SCHEMA_REGISTER.deserialise(schema, field, json.data[mappedField]);
});
if (!(0, utils_1.isUndefined)(json.relationships)) {
json.relationships.forEach((relationship) => {
core_1.MODEL_REGISTER.addRelationship(model, core_1.ResourceLocation.FromString(relationship));
});
}
return model;
}
}
exports.Serialiser = Serialiser;
//# sourceMappingURL=serialiser.js.map