UNPKG

@graphity/mapper

Version:

Decorator-based transformer of plain object to class constructors for Javascript(& Typescript).

103 lines (78 loc) 10.9 kB
"use strict"; 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==