@graphity/mapper
Version:
Decorator-based transformer of plain object to class constructors for Javascript(& Typescript).
103 lines (78 loc) • 10.9 kB
JavaScript
;
require("core-js/modules/es.array.iterator");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Mapper = void 0;
function applyTransformTo(value, transformers) {
const dupTransformers = transformers.slice();
let result = value;
while (dupTransformers.length) {
const transformer = dupTransformers.shift();
if (transformer && transformer.to) {
result = transformer.to(result);
}
}
return result;
}
function applyTransformFrom(value, transformers) {
const dupTransformers = transformers.slice().reverse();
let result = value;
while (dupTransformers.length) {
const transformer = dupTransformers.shift();
if (transformer && transformer.from) {
result = transformer.from(result);
}
}
return result;
}
class Mapper {
constructor(options) {
this.options = options;
}
toEntity(rows) {
if (!Array.isArray(rows)) {
return this.toEntity([rows])[0];
}
return rows.map(row => {
const entity = {};
for (const column of this.options.columns) {
const defaultValue = typeof column.default === 'function' ? column.default() : column.default;
const value = typeof row[column.sourceKey] !== 'undefined' ? applyTransformTo(row[column.sourceKey], column.transformers) : defaultValue;
const isNull = value === null || typeof value === 'undefined';
if (!column.nullable && isNull) {
throw new Error(`column(${column.property}) is not nullable.`);
}
if (column.nullable) {
entity[column.property] = !isNull ? value : null;
} else {
entity[column.property] = value;
}
}
Object.setPrototypeOf(entity, this.options.ctor.prototype);
return entity;
});
}
assign(entity) {
if (!Array.isArray(entity)) {
return Object.setPrototypeOf(entity, this.options.ctor.prototype);
}
return entity.map(row => this.assign(row));
}
toPlain(entities) {
if (!Array.isArray(entities)) {
return this.toPlain([entities])[0];
}
return entities.map(entity => {
const row = {};
for (const column of this.options.columns) {
if (typeof entity[column.property] !== 'undefined') {
row[column.sourceKey] = applyTransformFrom(entity[column.property], column.transformers);
}
}
return row;
});
}
}
exports.Mapper = Mapper;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tYXBwZXIvbWFwcGVyLnRzIl0sIm5hbWVzIjpbImFwcGx5VHJhbnNmb3JtVG8iLCJ2YWx1ZSIsInRyYW5zZm9ybWVycyIsImR1cFRyYW5zZm9ybWVycyIsInNsaWNlIiwicmVzdWx0IiwibGVuZ3RoIiwidHJhbnNmb3JtZXIiLCJzaGlmdCIsInRvIiwiYXBwbHlUcmFuc2Zvcm1Gcm9tIiwicmV2ZXJzZSIsImZyb20iLCJNYXBwZXIiLCJjb25zdHJ1Y3RvciIsIm9wdGlvbnMiLCJ0b0VudGl0eSIsInJvd3MiLCJBcnJheSIsImlzQXJyYXkiLCJtYXAiLCJyb3ciLCJlbnRpdHkiLCJjb2x1bW4iLCJjb2x1bW5zIiwiZGVmYXVsdFZhbHVlIiwiZGVmYXVsdCIsInNvdXJjZUtleSIsImlzTnVsbCIsIm51bGxhYmxlIiwiRXJyb3IiLCJwcm9wZXJ0eSIsIk9iamVjdCIsInNldFByb3RvdHlwZU9mIiwiY3RvciIsInByb3RvdHlwZSIsImFzc2lnbiIsInRvUGxhaW4iLCJlbnRpdGllcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBR0EsU0FBU0EsZ0JBQVQsQ0FBMEJDLEtBQTFCLEVBQXNDQyxZQUF0QyxFQUE2RTtBQUMzRSxRQUFNQyxlQUFlLEdBQUdELFlBQVksQ0FBQ0UsS0FBYixFQUF4QjtBQUNBLE1BQUlDLE1BQU0sR0FBR0osS0FBYjs7QUFDQSxTQUFPRSxlQUFlLENBQUNHLE1BQXZCLEVBQStCO0FBQzdCLFVBQU1DLFdBQVcsR0FBR0osZUFBZSxDQUFDSyxLQUFoQixFQUFwQjs7QUFDQSxRQUFJRCxXQUFXLElBQUlBLFdBQVcsQ0FBQ0UsRUFBL0IsRUFBbUM7QUFDakNKLE1BQUFBLE1BQU0sR0FBR0UsV0FBVyxDQUFDRSxFQUFaLENBQWVKLE1BQWYsQ0FBVDtBQUNEO0FBQ0Y7O0FBQ0QsU0FBT0EsTUFBUDtBQUNEOztBQUVELFNBQVNLLGtCQUFULENBQTRCVCxLQUE1QixFQUF3Q0MsWUFBeEMsRUFBK0U7QUFDN0UsUUFBTUMsZUFBZSxH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TyxLQUFLRCxPQUFMLENBQWEsQ0FBQ0MsUUFBRCxDQUFiLEVBQXNDLENBQXRDLENBQVA7QUFDRDs7QUFDRCxXQUFPQSxRQUFRLENBQUNsQixHQUFULENBQWNFLE1BQUQsSUFBWTtBQUM5QixZQUFNRCxHQUFRLEdBQUcsRUFBakI7O0FBQ0EsV0FBSyxNQUFNRSxNQUFYLElBQXFCLEtBQUtSLE9BQUwsQ0FBYVMsT0FBbEMsRUFBMkM7QUFDekMsWUFBSSxPQUFPRixNQUFNLENBQUNDLE1BQU0sQ0FBQ1EsUUFBUixDQUFiLEtBQW1DLFdBQXZDLEVBQW9EO0FBQ2xEVixVQUFBQSxHQUFHLENBQUNFLE1BQU0sQ0FBQ0ksU0FBUixDQUFILEdBQXdCakIsa0JBQWtCLENBQUNZLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDUSxRQUFSLENBQVAsRUFBMEJSLE1BQU0sQ0FBQ3JCLFlBQWpDLENBQTFDO0FBQ0Q7QUFDRjs7QUFDRCxhQUFPbUIsR0FBUDtBQUNELEtBUk0sQ0FBUDtBQVNEOztBQTVEeUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYXBwZXJPcHRpb25zLCBWYWx1ZVRyYW5zZm9ybWVyIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9tYXBwZXInXG5pbXBvcnQgeyBNYXliZUFycmF5IH0gZnJvbSAnLi4vaW50ZXJmYWNlcy91dGlscydcblxuZnVuY3Rpb24gYXBwbHlUcmFuc2Zvcm1Ubyh2YWx1ZTogYW55LCB0cmFuc2Zvcm1lcnM6IFZhbHVlVHJhbnNmb3JtZXI8YW55PltdKSB7XG4gIGNvbnN0IGR1cFRyYW5zZm9ybWVycyA9IHRyYW5zZm9ybWVycy5zbGljZSgpXG4gIGxldCByZXN1bHQgPSB2YWx1ZVxuICB3aGlsZSAoZHVwVHJhbnNmb3JtZXJzLmxlbmd0aCkge1xuICAgIGNvbnN0IHRyYW5zZm9ybWVyID0gZHVwVHJhbnNmb3JtZXJzLnNoaWZ0KClcbiAgICBpZiAodHJhbnNmb3JtZXIgJiYgdHJhbnNmb3JtZXIudG8pIHtcbiAgICAgIHJlc3VsdCA9IHRyYW5zZm9ybWVyLnRvKHJlc3VsdClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5mdW5jdGlvbiBhcHBseVRyYW5zZm9ybUZyb20odmFsdWU6IGFueSwgdHJhbnNmb3JtZXJzOiBWYWx1ZVRyYW5zZm9ybWVyPGFueT5bXSkge1xuICBjb25zdCBkdXBUcmFuc2Zvcm1lcnMgPSB0cmFuc2Zvcm1lcnMuc2xpY2UoKS5yZXZlcnNlKClcbiAgbGV0IHJlc3VsdCA9IHZhbHVlXG4gIHdoaWxlIChkdXBUcmFuc2Zvcm1lcnMubGVuZ3RoKSB7XG4gICAgY29uc3QgdHJhbnNmb3JtZXIgPSBkdXBUcmFuc2Zvcm1lcnMuc2hpZnQoKVxuICAgIGlmICh0cmFuc2Zvcm1lciAmJiB0cmFuc2Zvcm1lci5mcm9tKSB7XG4gICAgICByZXN1bHQgPSB0cmFuc2Zvcm1lci5mcm9tKHJlc3VsdClcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdFxufVxuXG5leHBvcnQgY2xhc3MgTWFwcGVyPFRFbnRpdHksIFRTb3VyY2UgPSBhbnk+IHtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IE1hcHBlck9wdGlvbnM8VEVudGl0eT4pIHtcbiAgfVxuXG4gIHB1YmxpYyB0b0VudGl0eShyb3dzOiBUU291cmNlW10pOiBURW50aXR5W11cbiAgcHVibGljIHRvRW50aXR5KHJvd3M6IFRTb3VyY2UpOiBURW50aXR5XG4gIHB1YmxpYyB0b0VudGl0eShyb3dzOiBNYXliZUFycmF5PFRTb3VyY2U+KTogTWF5YmVBcnJheTxURW50aXR5PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHJvd3MpKSB7XG4gICAgICByZXR1cm4gdGhpcy50b0VudGl0eShbcm93c10pWzBdXG4gICAgfVxuICAgIHJldHVybiByb3dzLm1hcCgocm93OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IGVudGl0eTogUGFydGlhbDxURW50aXR5PiA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLm9wdGlvbnMuY29sdW1ucykge1xuICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0eXBlb2YgY29sdW1uLmRlZmF1bHQgPT09ICdmdW5jdGlvbicgPyBjb2x1bW4uZGVmYXVsdCgpIDogY29sdW1uLmRlZmF1bHRcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2Ygcm93W2NvbHVtbi5zb3VyY2VLZXldICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgID8gYXBwbHlUcmFuc2Zvcm1Ubyhyb3dbY29sdW1uLnNvdXJjZUtleV0sIGNvbHVtbi50cmFuc2Zvcm1lcnMpXG4gICAgICAgICAgOiBkZWZhdWx0VmFsdWVcbiAgICAgICAgY29uc3QgaXNOdWxsID0gdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJ1xuICAgICAgICBpZiAoIWNvbHVtbi5udWxsYWJsZSAmJiBpc051bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGNvbHVtbigke2NvbHVtbi5wcm9wZXJ0eX0pIGlzIG5vdCBudWxsYWJsZS5gKVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb2x1bW4ubnVsbGFibGUpIHtcbiAgICAgICAgICBlbnRpdHlbY29sdW1uLnByb3BlcnR5XSA9ICFpc051bGwgPyB2YWx1ZSA6IG51bGxcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBlbnRpdHlbY29sdW1uLnByb3BlcnR5XSA9IHZhbHVlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKGVudGl0eSwgdGhpcy5vcHRpb25zLmN0b3IucHJvdG90eXBlKVxuICAgICAgcmV0dXJuIGVudGl0eSBhcyBURW50aXR5XG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBhc3NpZ24oZW50aXR5OiBQYXJ0aWFsPFRFbnRpdHk+W10pOiBURW50aXR5W11cbiAgcHVibGljIGFzc2lnbihlbnRpdHk6IFBhcnRpYWw8VEVudGl0eT4pOiBURW50aXR5XG4gIHB1YmxpYyBhc3NpZ24oZW50aXR5OiBNYXliZUFycmF5PFBhcnRpYWw8VEVudGl0eT4+KTogTWF5YmVBcnJheTxURW50aXR5PiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVudGl0eSkpIHtcbiAgICAgIHJldHVybiBPYmplY3Quc2V0UHJvdG90eXBlT2YoZW50aXR5LCB0aGlzLm9wdGlvbnMuY3Rvci5wcm90b3R5cGUpXG4gICAgfVxuICAgIHJldHVybiBlbnRpdHkubWFwKChyb3cpID0+IHRoaXMuYXNzaWduKHJvdykpXG4gIH1cblxuICBwdWJsaWMgdG9QbGFpbihlbnRpdGllczogVEVudGl0eVtdKTogVFNvdXJjZVtdXG4gIHB1YmxpYyB0b1BsYWluKGVudGl0aWVzOiBURW50aXR5KTogVFNvdXJjZVxuICBwdWJsaWMgdG9QbGFpbihlbnRpdGllczogUGFydGlhbDxURW50aXR5PltdKTogVFNvdXJjZVtdXG4gIHB1YmxpYyB0b1BsYWluKGVudGl0aWVzOiBQYXJ0aWFsPFRFbnRpdHk+KTogVFNvdXJjZVxuICBwdWJsaWMgdG9QbGFpbihlbnRpdGllczogYW55KTogTWF5YmVBcnJheTxUU291cmNlPiB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGVudGl0aWVzKSkge1xuICAgICAgcmV0dXJuIHRoaXMudG9QbGFpbihbZW50aXRpZXNdIGFzIFRFbnRpdHlbXSlbMF1cbiAgICB9XG4gICAgcmV0dXJuIGVudGl0aWVzLm1hcCgoZW50aXR5KSA9PiB7XG4gICAgICBjb25zdCByb3c6IGFueSA9IHt9XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLm9wdGlvbnMuY29sdW1ucykge1xuICAgICAgICBpZiAodHlwZW9mIGVudGl0eVtjb2x1bW4ucHJvcGVydHldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgIHJvd1tjb2x1bW4uc291cmNlS2V5XSA9IGFwcGx5VHJhbnNmb3JtRnJvbShlbnRpdHlbY29sdW1uLnByb3BlcnR5XSwgY29sdW1uLnRyYW5zZm9ybWVycylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHJvd1xuICAgIH0pXG4gIH1cbn1cbiJdfQ==