@cisstech/nge
Version:
NG Essentials is a collection of libraries for Angular developers.
162 lines • 20 kB
JavaScript
import { deepCopy } from './copy';
class Serializer {
static serialize(instance) {
const record = {};
const prototype = instance.constructor.prototype;
const properties = prototype.__properties_infos__;
Object.keys(properties).forEach((propertyName) => {
if (!(propertyName in instance)) {
return;
}
const property = properties[propertyName];
const exportName = (property.aliases ?? []).pop() ?? propertyName;
const value = instance[propertyName];
if (value == null) {
return;
}
switch (typeof value) {
case 'string':
case 'number':
case 'boolean':
if (value != null) {
record[exportName] = value;
}
break;
case 'object':
if (property.type) {
if (Array.isArray(value)) {
record[exportName] = value
.map((e) => {
return Serializer.serialize(e);
})
.filter((e) => e != null);
}
else if (property.indexed) {
record[exportName] = Object.keys(value).reduce((obj, key) => {
if (value[key] === undefined) {
return obj;
}
obj[key] = Serializer.serialize(value[key]);
return obj;
}, {});
}
else {
record[exportName] = Serializer.serialize(value);
}
}
else {
if (Array.isArray(value)) {
record[exportName] = value.filter((obj) => obj != null);
}
else {
record[exportName] = deepCopy(value);
}
}
break;
}
});
return record;
}
static deserialize(target, props) {
const record = {
...props,
};
const prototype = target.prototype;
const info = prototype.__class_info__;
if (info.resolver) {
target = info.resolver(props);
}
const properties = prototype.__properties_infos__;
Object.keys(properties).forEach((propertyName) => {
const property = properties[propertyName];
const aliases = property.aliases ?? [];
const value = props[propertyName] ??
Object.keys(props).find((k) => {
return !!aliases.find((alias) => alias === k);
});
if (value == null) {
return;
}
switch (typeof value) {
case 'object':
if (property.type) {
if (Array.isArray(value)) {
record[propertyName] = value.map((e) => {
return Serializer.deserialize(property.type, e);
});
}
else if (property.indexed) {
Object.keys(value).forEach((k) => {
value[k] = Serializer.deserialize(property.type, value[k]);
});
record[propertyName] = value;
}
else {
record[propertyName] = Serializer.deserialize(property.type, value);
}
}
else {
record[propertyName] = value;
}
break;
default:
record[propertyName] = value;
break;
}
});
return new target(record);
}
}
export class Builder {
/**
* Creates new instance of `T` class.
* @param props properties to pass to the constructor of the instance.
* @returns new instance of `T`
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
static create(props) {
throw new Error('This is an abstract method. It needs to be overridden.');
}
save() {
throw new Error('This is an abstract method. It needs to be overridden.');
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
with(props) {
throw new Error('This is an abstract method. It needs to be overridden.');
}
}
export function Entity(info) {
return function (target) {
const prototype = target.prototype;
info = info ?? {};
prototype.__class_info__ = prototype.__class_info__ ?? info;
prototype.__class_info__ = {
...prototype.__class_info__,
...info,
};
prototype.save = function () {
return Serializer.serialize(this);
};
prototype.with = function (props) {
return new target({
...this,
...props,
});
};
target.create = function (props) {
return Serializer.deserialize(target, props);
};
return target;
};
}
export function Property(info) {
return (instance, name) => {
info = info ?? {
aliases: [],
};
const prototype = instance.constructor.prototype;
prototype.__properties_infos__ = prototype.__properties_infos__ ?? {};
prototype.__properties_infos__[name] = info;
};
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nZS91dGlscy9zcmMvYnVpbGRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBWWpDLE1BQU0sVUFBVTtJQUNkLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBYTtRQUM1QixNQUFNLE1BQU0sR0FBd0IsRUFBRSxDQUFBO1FBQ3RDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFBO1FBQ2hELE1BQU0sVUFBVSxHQUFpQyxTQUFTLENBQUMsb0JBQW9CLENBQUE7UUFFL0UsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxZQUFZLEVBQUUsRUFBRTtZQUMvQyxJQUFJLENBQUMsQ0FBQyxZQUFZLElBQUksUUFBUSxDQUFDLEVBQUUsQ0FBQztnQkFDaEMsT0FBTTtZQUNSLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDekMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLFlBQVksQ0FBQTtZQUVqRSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUE7WUFDcEMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ2xCLE9BQU07WUFDUixDQUFDO1lBQ0QsUUFBUSxPQUFPLEtBQUssRUFBRSxDQUFDO2dCQUNyQixLQUFLLFFBQVEsQ0FBQztnQkFDZCxLQUFLLFFBQVEsQ0FBQztnQkFDZCxLQUFLLFNBQVM7b0JBQ1osSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7d0JBQ2xCLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUE7b0JBQzVC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QUFBO1FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxVQUFVLEtBQTBCO1lBQ2xELE9BQU8sVUFBVSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUE7UUFDOUMsQ0FBQyxDQUFBO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDZixDQUFDLENBQUE7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUFtQjtJQUMxQyxPQUFPLENBQUMsUUFBYSxFQUFFLElBQXFCLEVBQUUsRUFBRTtRQUM5QyxJQUFJLEdBQUcsSUFBSSxJQUFJO1lBQ2IsT0FBTyxFQUFFLEVBQUU7U0FDWixDQUFBO1FBRUQsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUE7UUFDaEQsU0FBUyxDQUFDLG9CQUFvQixHQUFHLFNBQVMsQ0FBQyxvQkFBb0IsSUFBSSxFQUFFLENBQUE7UUFDckUsU0FBUyxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQTtJQUM3QyxDQUFDLENBQUE7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVlcENvcHkgfSBmcm9tICcuL2NvcHknXG5cbmludGVyZmFjZSBDbGFzc0luZm8ge1xuICByZXNvbHZlcj86IChwcm9wczogUmVjb3JkPHN0cmluZywgYW55PikgPT4gRnVuY3Rpb25cbn1cblxuaW50ZXJmYWNlIFByb3BlcnR5SW5mbyB7XG4gIHR5cGU/OiBGdW5jdGlvblxuICBpbmRleGVkPzogYm9vbGVhblxuICBhbGlhc2VzPzogc3RyaW5nW11cbn1cblxuY2xhc3MgU2VyaWFsaXplciB7XG4gIHN0YXRpYyBzZXJpYWxpemUoaW5zdGFuY2U6IGFueSk6IFJlY29yZDxzdHJpbmcsIGFueT4ge1xuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9XG4gICAgY29uc3QgcHJvdG90eXBlID0gaW5zdGFuY2UuY29uc3RydWN0b3IucHJvdG90eXBlXG4gICAgY29uc3QgcHJvcGVydGllczogUmVjb3JkPHN0cmluZywgUHJvcGVydHlJbmZvPiA9IHByb3RvdHlwZS5fX3Byb3BlcnRpZXNfaW5mb3NfX1xuXG4gICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICBpZiAoIShwcm9wZXJ0eU5hbWUgaW4gaW5zdGFuY2UpKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXVxuICAgICAgY29uc3QgZXhwb3J0TmFtZSA9IChwcm9wZXJ0eS5hbGlhc2VzID8/IFtdKS5wb3AoKSA/PyBwcm9wZXJ0eU5hbWVcblxuICAgICAgY29uc3QgdmFsdWUgPSBpbnN0YW5jZVtwcm9wZXJ0eU5hbWVdXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cbiAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICByZWNvcmRbZXhwb3J0TmFtZV0gPSB2YWx1ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlICdvYmplY3QnOlxuICAgICAgICAgIGlmIChwcm9wZXJ0eS50eXBlKSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmVjb3JkW2V4cG9ydE5hbWVdID0gdmFsdWVcbiAgICAgICAgICAgICAgICAubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gU2VyaWFsaXplci5zZXJpYWxpemUoZSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUgIT0gbnVsbClcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaW5kZXhlZCkge1xuICAgICAgICAgICAgICByZWNvcmRbZXhwb3J0TmFtZV0gPSBPYmplY3Qua2V5cyh2YWx1ZSkucmVkdWNlKFxuICAgICAgICAgICAgICAgIChvYmosIGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlW2tleV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBvYmpba2V5XSA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbHVlW2tleV0pXG4gICAgICAgICAgICAgICAgICByZXR1cm4gb2JqXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlY29yZFtleHBvcnROYW1lXSA9IFNlcmlhbGl6ZXIuc2VyaWFsaXplKHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmVjb3JkW2V4cG9ydE5hbWVdID0gdmFsdWUuZmlsdGVyKChvYmopID0+IG9iaiAhPSBudWxsKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVjb3JkW2V4cG9ydE5hbWVdID0gZGVlcENvcHkodmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gcmVjb3JkXG4gIH1cblxuICBzdGF0aWMgZGVzZXJpYWxpemUodGFyZ2V0OiBhbnksIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgcmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0ge1xuICAgICAgLi4ucHJvcHMsXG4gICAgfVxuICAgIGNvbnN0IHByb3RvdHlwZSA9IHRhcmdldC5wcm90b3R5cGVcbiAgICBjb25zdCBpbmZvOiBDbGFzc0luZm8gPSBwcm90b3R5cGUuX19jbGFzc19pbmZvX19cbiAgICBpZiAoaW5mby5yZXNvbHZlcikge1xuICAgICAgdGFyZ2V0ID0gaW5mby5yZXNvbHZlcihwcm9wcylcbiAgICB9XG5cbiAgICBjb25zdCBwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBQcm9wZXJ0eUluZm8+ID0gcHJvdG90eXBlLl9fcHJvcGVydGllc19pbmZvc19fXG4gICAgT2JqZWN0LmtleXMocHJvcGVydGllcykuZm9yRWFjaCgocHJvcGVydHlOYW1lKSA9PiB7XG4gICAgICBjb25zdCBwcm9wZXJ0eSA9IHByb3BlcnRpZXNbcHJvcGVydHlOYW1lXVxuICAgICAgY29uc3QgYWxpYXNlcyA9IHByb3BlcnR5LmFsaWFzZXMgPz8gW11cbiAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgcHJvcHNbcHJvcGVydHlOYW1lXSA/P1xuICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZmluZCgoaykgPT4ge1xuICAgICAgICAgIHJldHVybiAhIWFsaWFzZXMuZmluZCgoYWxpYXMpID0+IGFsaWFzID09PSBrKVxuICAgICAgICB9KVxuXG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHtcbiAgICAgICAgY2FzZSAnb2JqZWN0JzpcbiAgICAgICAgICBpZiAocHJvcGVydHkudHlwZSkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJlY29yZFtwcm9wZXJ0eU5hbWVdID0gdmFsdWUubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNlcmlhbGl6ZXIuZGVzZXJpYWxpemUocHJvcGVydHkudHlwZSwgZSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkuaW5kZXhlZCkge1xuICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgICAgIHZhbHVlW2tdID0gU2VyaWFsaXplci5kZXNlcmlhbGl6ZShwcm9wZXJ0eS50eXBlLCB2YWx1ZVtrXSlcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgcmVjb3JkW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVjb3JkW3Byb3BlcnR5TmFtZV0gPSBTZXJpYWxpemVyLmRlc2VyaWFsaXplKHByb3BlcnR5LnR5cGUsIHZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZWNvcmRbcHJvcGVydHlOYW1lXSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgcmVjb3JkW3Byb3BlcnR5TmFtZV0gPSB2YWx1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gbmV3IHRhcmdldChyZWNvcmQpXG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEJ1aWxkZXI8VD4ge1xuICAvKipcbiAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2Ugb2YgYFRgIGNsYXNzLlxuICAgKiBAcGFyYW0gcHJvcHMgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgaW5zdGFuY2UuXG4gICAqIEByZXR1cm5zIG5ldyBpbnN0YW5jZSBvZiBgVGBcbiAgICovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgc3RhdGljIGNyZWF0ZTxUPihwcm9wczogUGFydGlhbDxUPik6IFQge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QuIEl0IG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4uJylcbiAgfVxuXG4gIHNhdmUoKTogUmVjb3JkPGtleW9mIFQsIGFueT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QuIEl0IG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4uJylcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgd2l0aChwcm9wczogUGFydGlhbDxUPik6IFQge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBpcyBhbiBhYnN0cmFjdCBtZXRob2QuIEl0IG5lZWRzIHRvIGJlIG92ZXJyaWRkZW4uJylcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gRW50aXR5KGluZm8/OiBDbGFzc0luZm8pOiBDbGFzc0RlY29yYXRvciB7XG4gIHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBhbnkpIHtcbiAgICBjb25zdCBwcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlXG4gICAgaW5mbyA9IGluZm8gPz8ge31cbiAgICBwcm90b3R5cGUuX19jbGFzc19pbmZvX18gPSBwcm90b3R5cGUuX19jbGFzc19pbmZvX18gPz8gaW5mb1xuICAgIHByb3RvdHlwZS5fX2NsYXNzX2luZm9fXyA9IHtcbiAgICAgIC4uLnByb3RvdHlwZS5fX2NsYXNzX2luZm9fXyxcbiAgICAgIC4uLmluZm8sXG4gICAgfVxuXG4gICAgcHJvdG90eXBlLnNhdmUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gU2VyaWFsaXplci5zZXJpYWxpemUodGhpcylcbiAgICB9XG5cbiAgICBwcm90b3R5cGUud2l0aCA9IGZ1bmN0aW9uIChwcm9wczogYW55KSB7XG4gICAgICByZXR1cm4gbmV3IHRhcmdldCh7XG4gICAgICAgIC4uLnRoaXMsXG4gICAgICAgIC4uLnByb3BzLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICB0YXJnZXQuY3JlYXRlID0gZnVuY3Rpb24gKHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICByZXR1cm4gU2VyaWFsaXplci5kZXNlcmlhbGl6ZSh0YXJnZXQsIHByb3BzKVxuICAgIH1cbiAgICByZXR1cm4gdGFyZ2V0XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIFByb3BlcnR5KGluZm8/OiBQcm9wZXJ0eUluZm8pOiBQcm9wZXJ0eURlY29yYXRvciB7XG4gIHJldHVybiAoaW5zdGFuY2U6IGFueSwgbmFtZTogc3RyaW5nIHwgc3ltYm9sKSA9PiB7XG4gICAgaW5mbyA9IGluZm8gPz8ge1xuICAgICAgYWxpYXNlczogW10sXG4gICAgfVxuXG4gICAgY29uc3QgcHJvdG90eXBlID0gaW5zdGFuY2UuY29uc3RydWN0b3IucHJvdG90eXBlXG4gICAgcHJvdG90eXBlLl9fcHJvcGVydGllc19pbmZvc19fID0gcHJvdG90eXBlLl9fcHJvcGVydGllc19pbmZvc19fID8/IHt9XG4gICAgcHJvdG90eXBlLl9fcHJvcGVydGllc19pbmZvc19fW25hbWVdID0gaW5mb1xuICB9XG59XG4iXX0=