UNPKG

@northscaler/service-support

Version:

Artifacts that assist in writing service layers effectively

64 lines (54 loc) 11.2 kB
'use strict'; const formatDate = require('../formatters/date-formatter'); const formatEnumeration = require('../formatters/enumeration-formatter'); const DateFormat = require('../enums/DateFormat'); const Enumeration = require('@northscaler/enum-support'); /** * Extracts a [data transfer object (DTO)](https://martinfowler.com/eaaCatalog/dataTransferObject.html) from the given entity. * The entity normally is an instance of a class with data properties whose names begin with the underscore character (`_`). * By default, this will descend recursively through the given object and drop the leading underscore prefix from its keys and convert any convertible values, mainly `Date`s to ISO-8601 strings and [`Enumeration` instances](https://www.npmjs.com/package/@northscaler/enum-support) to just their `name`s. * All methods found are excluded from the returned DTO. * Each formatter is customizable. * * @param {*} entity The entity from which to extract a data transfer object (DTO). * @param {object} arg1 The argument to be deconstructed. * @param {string|RegExp} [arg1.keyReplacementRegEx=/^_/] The key replacement regular expression given to the `replace` method of `String`; if falsey, no key replacement is performed. * @param {string|function} [arg1.keyReplacement=''] The key replacement given to the `replace` method of `String`. * @param {function} [arg1.dateFormatter] The formatter of `Date`s; defaults to `toISOString()` on `Date`. * @param {function} [arg1.enumerationFormatter] The formatter of [`Enumeration` instances](https://www.npmjs.com/package/@northscaler/enum-support); defaults to returning the `name`. */ function extractDtoFromEntity(entity, { keyReplacementRegEx = /^_/, keyReplacement = '', dateFormatter = date => formatDate({ date, format: DateFormat.ISO_8601 }), enumerationFormatter = enumeration => formatEnumeration({ enumeration, useName: true }) } = {}) { if (keyReplacementRegEx) keyReplacementRegEx = new RegExp(keyReplacementRegEx); function recurse(entity) { // makes the code below more readable return extractDtoFromEntity(entity, { keyReplacementRegEx, keyReplacement, dateFormatter, enumerationFormatter }); } if (!entity) return entity; if (Array.isArray(entity)) return entity.map(it => recurse(it)); if (Enumeration.isEnumerationInstance(entity)) return enumerationFormatter(entity); if (typeof entity !== 'object') return entity; return Object.keys(entity).reduce((dto, key) => { const newKey = keyReplacementRegEx ? key.replace(keyReplacementRegEx, keyReplacement) : key; const type = typeof entity[key]; if (!entity[key]) dto[newKey] = entity[key];else if (Array.isArray(entity[key])) dto[newKey] = entity[key].map(it => recurse(it));else if (entity[key] instanceof Date) dto[newKey] = dateFormatter(entity[key]);else if (Enumeration.isEnumerationInstance(entity[key])) dto[newKey] = enumerationFormatter(entity[key]);else if (type === 'object') dto[newKey] = recurse(entity[key]);else if (type !== 'function') dto[newKey] = entity[key]; // skip functions return dto; }, {}); } module.exports = extractDtoFromEntity; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tYWluL3NlcnZpY2UvZXh0cmFjdER0b0Zyb21FbnRpdHkuanMiXSwibmFtZXMiOlsiZm9ybWF0RGF0ZSIsInJlcXVpcmUiLCJmb3JtYXRFbnVtZXJhdGlvbiIsIkRhdGVGb3JtYXQiLCJFbnVtZXJhdGlvbiIsImV4dHJhY3REdG9Gcm9tRW50aXR5IiwiZW50aXR5Iiwia2V5UmVwbGFjZW1lbnRSZWdFeCIsImtleVJlcGxhY2VtZW50IiwiZGF0ZUZvcm1hdHRlciIsImRhdGUiLCJmb3JtYXQiLCJJU09fODYwMSIsImVudW1lcmF0aW9uRm9ybWF0dGVyIiwiZW51bWVyYXRpb24iLCJ1c2VOYW1lIiwiUmVnRXhwIiwicmVjdXJzZSIsIkFycmF5IiwiaXNBcnJheSIsIm1hcCIsIml0IiwiaXNFbnVtZXJhdGlvbkluc3RhbmNlIiwiT2JqZWN0Iiwia2V5cyIsInJlZHVjZSIsImR0byIsImtleSIsIm5ld0tleSIsInJlcGxhY2UiLCJ0eXBlIiwiRGF0ZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiJBQUFBOztBQUVBLE1BQU1BLFVBQVUsR0FBR0MsT0FBTyxDQUFDLDhCQUFELENBQTFCOztBQUNBLE1BQU1DLGlCQUFpQixHQUFHRCxPQUFPLENBQUMscUNBQUQsQ0FBakM7O0FBQ0EsTUFBTUUsVUFBVSxHQUFHRixPQUFPLENBQUMscUJBQUQsQ0FBMUI7O0FBQ0EsTUFBTUcsV0FBVyxHQUFHSCxPQUFPLENBQUMsMkJBQUQsQ0FBM0I7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUFDQSxTQUFTSSxvQkFBVCxDQUErQkMsTUFBL0IsRUFBdUM7QUFDckNDLEVBQUFBLG1CQUFtQixHQUFHLElBRGU7QUFFckNDLEVBQUFBLGNBQWMsR0FBRyxFQUZvQjtBQUdyQ0MsRUFBQUEsYUFBYSxHQUFHQyxJQUFJLElBQUlWLFVBQVUsQ0FBQztBQUFFVSxJQUFB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OlsiJ3VzZSBzdHJpY3QnXG5cbmNvbnN0IGZvcm1hdERhdGUgPSByZXF1aXJlKCcuLi9mb3JtYXR0ZXJzL2RhdGUtZm9ybWF0dGVyJylcbmNvbnN0IGZvcm1hdEVudW1lcmF0aW9uID0gcmVxdWlyZSgnLi4vZm9ybWF0dGVycy9lbnVtZXJhdGlvbi1mb3JtYXR0ZXInKVxuY29uc3QgRGF0ZUZvcm1hdCA9IHJlcXVpcmUoJy4uL2VudW1zL0RhdGVGb3JtYXQnKVxuY29uc3QgRW51bWVyYXRpb24gPSByZXF1aXJlKCdAbm9ydGhzY2FsZXIvZW51bS1zdXBwb3J0JylcblxuLyoqXG4gKiBFeHRyYWN0cyBhIFtkYXRhIHRyYW5zZmVyIG9iamVjdCAoRFRPKV0oaHR0cHM6Ly9tYXJ0aW5mb3dsZXIuY29tL2VhYUNhdGFsb2cvZGF0YVRyYW5zZmVyT2JqZWN0Lmh0bWwpIGZyb20gdGhlIGdpdmVuIGVudGl0eS5cbiAqIFRoZSBlbnRpdHkgbm9ybWFsbHkgaXMgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB3aXRoIGRhdGEgcHJvcGVydGllcyB3aG9zZSBuYW1lcyBiZWdpbiB3aXRoIHRoZSB1bmRlcnNjb3JlIGNoYXJhY3RlciAoYF9gKS5cbiAqIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCBkZXNjZW5kIHJlY3Vyc2l2ZWx5IHRocm91Z2ggdGhlIGdpdmVuIG9iamVjdCBhbmQgZHJvcCB0aGUgbGVhZGluZyB1bmRlcnNjb3JlIHByZWZpeCBmcm9tIGl0cyBrZXlzIGFuZCBjb252ZXJ0IGFueSBjb252ZXJ0aWJsZSB2YWx1ZXMsIG1haW5seSBgRGF0ZWBzIHRvIElTTy04NjAxIHN0cmluZ3MgYW5kIFtgRW51bWVyYXRpb25gIGluc3RhbmNlc10oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvQG5vcnRoc2NhbGVyL2VudW0tc3VwcG9ydCkgdG8ganVzdCB0aGVpciBgbmFtZWBzLlxuICogQWxsIG1ldGhvZHMgZm91bmQgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIHJldHVybmVkIERUTy5cbiAqIEVhY2ggZm9ybWF0dGVyIGlzIGN1c3RvbWl6YWJsZS5cbiAqXG4gKiBAcGFyYW0geyp9IGVudGl0eSBUaGUgZW50aXR5IGZyb20gd2hpY2ggdG8gZXh0cmFjdCBhIGRhdGEgdHJhbnNmZXIgb2JqZWN0IChEVE8pLlxuICogQHBhcmFtIHtvYmplY3R9IGFyZzEgVGhlIGFyZ3VtZW50IHRvIGJlIGRlY29uc3RydWN0ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ3xSZWdFeHB9IFthcmcxLmtleVJlcGxhY2VtZW50UmVnRXg9L15fL10gVGhlIGtleSByZXBsYWNlbWVudCByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gdG8gdGhlIGByZXBsYWNlYCBtZXRob2Qgb2YgYFN0cmluZ2A7IGlmIGZhbHNleSwgbm8ga2V5IHJlcGxhY2VtZW50IGlzIHBlcmZvcm1lZC5cbiAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9ufSBbYXJnMS5rZXlSZXBsYWNlbWVudD0nJ10gVGhlIGtleSByZXBsYWNlbWVudCBnaXZlbiB0byB0aGUgYHJlcGxhY2VgIG1ldGhvZCBvZiBgU3RyaW5nYC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFthcmcxLmRhdGVGb3JtYXR0ZXJdIFRoZSBmb3JtYXR0ZXIgb2YgYERhdGVgczsgZGVmYXVsdHMgdG8gYHRvSVNPU3RyaW5nKClgIG9uIGBEYXRlYC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IFthcmcxLmVudW1lcmF0aW9uRm9ybWF0dGVyXSBUaGUgZm9ybWF0dGVyIG9mIFtgRW51bWVyYXRpb25gIGluc3RhbmNlc10oaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvQG5vcnRoc2NhbGVyL2VudW0tc3VwcG9ydCk7IGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYG5hbWVgLlxuICovXG5mdW5jdGlvbiBleHRyYWN0RHRvRnJvbUVudGl0eSAoZW50aXR5LCB7XG4gIGtleVJlcGxhY2VtZW50UmVnRXggPSAvXl8vLFxuICBrZXlSZXBsYWNlbWVudCA9ICcnLFxuICBkYXRlRm9ybWF0dGVyID0gZGF0ZSA9PiBmb3JtYXREYXRlKHsgZGF0ZSwgZm9ybWF0OiBEYXRlRm9ybWF0LklTT184NjAxIH0pLFxuICBlbnVtZXJhdGlvbkZvcm1hdHRlciA9IGVudW1lcmF0aW9uID0+IGZvcm1hdEVudW1lcmF0aW9uKHsgZW51bWVyYXRpb24sIHVzZU5hbWU6IHRydWUgfSlcbn0gPSB7fSkge1xuICBpZiAoa2V5UmVwbGFjZW1lbnRSZWdFeCkga2V5UmVwbGFjZW1lbnRSZWdFeCA9IG5ldyBSZWdFeHAoa2V5UmVwbGFjZW1lbnRSZWdFeClcblxuICBmdW5jdGlvbiByZWN1cnNlIChlbnRpdHkpIHsgLy8gbWFrZXMgdGhlIGNvZGUgYmVsb3cgbW9yZSByZWFkYWJsZVxuICAgIHJldHVybiBleHRyYWN0RHRvRnJvbUVudGl0eShlbnRpdHksIHtcbiAgICAgIGtleVJlcGxhY2VtZW50UmVnRXgsXG4gICAgICBrZXlSZXBsYWNlbWVudCxcbiAgICAgIGRhdGVGb3JtYXR0ZXIsXG4gICAgICBlbnVtZXJhdGlvbkZvcm1hdHRlclxuICAgIH0pXG4gIH1cblxuICBpZiAoIWVudGl0eSkgcmV0dXJuIGVudGl0eVxuICBpZiAoQXJyYXkuaXNBcnJheShlbnRpdHkpKSByZXR1cm4gZW50aXR5Lm1hcChpdCA9PiByZWN1cnNlKGl0KSlcbiAgaWYgKEVudW1lcmF0aW9uLmlzRW51bWVyYXRpb25JbnN0YW5jZShlbnRpdHkpKSByZXR1cm4gZW51bWVyYXRpb25Gb3JtYXR0ZXIoZW50aXR5KVxuICBpZiAodHlwZW9mIGVudGl0eSAhPT0gJ29iamVjdCcpIHJldHVybiBlbnRpdHlcblxuICByZXR1cm4gT2JqZWN0LmtleXMoZW50aXR5KS5yZWR1Y2UoKGR0bywga2V5KSA9PiB7XG4gICAgY29uc3QgbmV3S2V5ID0ga2V5UmVwbGFjZW1lbnRSZWdFeCA/IGtleS5yZXBsYWNlKGtleVJlcGxhY2VtZW50UmVnRXgsIGtleVJlcGxhY2VtZW50KSA6IGtleVxuXG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBlbnRpdHlba2V5XVxuICAgIGlmICghZW50aXR5W2tleV0pIGR0b1tuZXdLZXldID0gZW50aXR5W2tleV1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGVudGl0eVtrZXldKSkgZHRvW25ld0tleV0gPSBlbnRpdHlba2V5XS5tYXAoaXQgPT4gcmVjdXJzZShpdCkpXG4gICAgZWxzZSBpZiAoZW50aXR5W2tleV0gaW5zdGFuY2VvZiBEYXRlKSBkdG9bbmV3S2V5XSA9IGRhdGVGb3JtYXR0ZXIoZW50aXR5W2tleV0pXG4gICAgZWxzZSBpZiAoRW51bWVyYXRpb24uaXNFbnVtZXJhdGlvbkluc3RhbmNlKGVudGl0eVtrZXldKSkgZHRvW25ld0tleV0gPSBlbnVtZXJhdGlvbkZvcm1hdHRlcihlbnRpdHlba2V5XSlcbiAgICBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JykgZHRvW25ld0tleV0gPSByZWN1cnNlKGVudGl0eVtrZXldKVxuICAgIGVsc2UgaWYgKHR5cGUgIT09ICdmdW5jdGlvbicpIGR0b1tuZXdLZXldID0gZW50aXR5W2tleV0gLy8gc2tpcCBmdW5jdGlvbnNcblxuICAgIHJldHVybiBkdG9cbiAgfSwge30pXG59XG5cbm1vZHVsZS5leHBvcnRzID0gZXh0cmFjdER0b0Zyb21FbnRpdHlcbiJdfQ==