UNPKG

redink

Version:
170 lines (137 loc) 11 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _bluebird = require('bluebird'); var _bluebird2 = _interopRequireDefault(_bluebird); var _utils = require('./utils'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var ModelArray = function () { /** * Instantiates a ModelArray. * * ``` * // example `models` object * const models = { * user: { * model: Model, * }, * animal: { * model: Model, * alias: 'pets' * }, * }; * ``` * * @class ModelArray * @param {Object} models - A dictionary of models, including their optional aliases. */ function ModelArray(models) { _classCallCheck(this, ModelArray); this.models = models; } /** * Returns true if a Model with type `type` is found in the model registry. * * @private * @param {String} type * @return {Boolean} */ _createClass(ModelArray, [{ key: 'hasModel', value: function hasModel(type) { return (0, _utils.hasOwnProperty)(this.models, type); } /** * Returns true if a Model with alias `alias` is found in the model registry. * * @private * @param {String} alias * @return {Boolean} */ }, { key: 'hasModelByAlias', value: function hasModelByAlias(alias) { var models = this.models; return Object.keys(models).reduce(function (prev, next) { return [].concat(_toConsumableArray(prev), [models[next].alias]); }, []).includes(alias); } /** * Returns a Model instance by its alias. * * @private * @param {String} alias * @return {Model} */ }, { key: 'getModelByAlias', value: function getModelByAlias(alias) { var models = this.models; var model = void 0; Object.keys(models).forEach(function (type) { if (models[type].alias === alias) { model = models[type].model; return false; } return true; }); return model; } /** * Returns an object of values returned by each function in `actions`. * * ```js * model('user', 'animal:pets').map({ * user(model) { * // model === model('user') * return model.findResource('1'); * }, * pets(model) { * // model === model('animal') * return model.find({ * filter: { age: 5 }, * }); * }, * }).then(results => { * const user = results.user; // Resource * const pets = results.pets; // ResourceArray * }); * ``` * * @async * @param {Object} actions * @returns {Promise<Object>} */ }, { key: 'map', value: function map(actions) { var _this = this; var models = this.models; var execute = {}; Object.keys(actions).forEach(function (action) { var fn = actions[action]; if (typeof fn !== 'function') { throw new TypeError('When mapping over a ModelArray, each action must be a function, instead got type ' + ('\'' + (typeof fn === 'undefined' ? 'undefined' : _typeof(fn)) + '\'.')); } var model = void 0; if (_this.hasModel(action)) { model = models[action].model; } else if (_this.hasModelByAlias(action)) { model = _this.getModelByAlias(action); } if (model) { execute[action] = fn(model); } }); return _bluebird2.default.props(execute); } }]); return ModelArray; }(); exports.default = ModelArray; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Nb2RlbEFycmF5LmpzIl0sIm5hbWVzIjpbIk1vZGVsQXJyYXkiLCJtb2RlbHMiLCJ0eXBlIiwiYWxpYXMiLCJPYmplY3QiLCJrZXlzIiwicmVkdWNlIiwicHJldiIsIm5leHQiLCJpbmNsdWRlcyIsIm1vZGVsIiwiZm9yRWFjaCIsImFjdGlvbnMiLCJleGVjdXRlIiwiZm4iLCJhY3Rpb24iLCJUeXBlRXJyb3IiLCJoYXNNb2RlbCIsImhhc01vZGVsQnlBbGlhcyIsImdldE1vZGVsQnlBbGlhcyIsInByb3BzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7Ozs7QUFDQTs7Ozs7Ozs7SUFFcUJBLFU7QUFDbkI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtQkEsc0JBQVlDLE1BQVosRUFBb0I7QUFBQTs7QUFDbEIsU0FBS0EsTUFBTCxHQUFjQSxNQUFkO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7OzZCQU9TQyxJLEVBQU07QUFDYixhQUFPLDJCQUFlLEtBQUtELE1BQXBCLEVBQTRCQyxJQUE1QixDQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7b0NBT2dCQyxLLEVBQU87QUFDckIsVUFBTUYsU0FBUyxLQUFLQSxNQUFwQjs7QUFFQSxhQUFPRyxPQUFPQyxJQUFQLENBQVlKLE1BQVosRUFDSkssTUFESSxDQUNHLFVBQUNDLElBQUQsRUFBT0MsSUFBUDtBQUFBLDRDQUFvQkQsSUFBcEIsSUFBMEJOLE9BQU9PLElBQVAsRUFBYUwsS0FBdkM7QUFBQSxPQURILEVBQ2tELEVBRGxELEVBRUpNLFFBRkksQ0FFS04sS0FGTCxDQUFQO0FBR0Q7O0FBRUQ7Ozs7Ozs7Ozs7b0NBT2dCQSxLLEVBQU87QUFDckIsVUFBTUYsU0FBUyxLQUFLQSxNQUFwQjtBQUNBLFVBQUlTLGNBQUo7O0FBRUFOLGFBQU9DLElBQVAsQ0FBWUosTUFBWixFQUFvQlUsT0FBcEIsQ0FBNEIsZ0JBQVE7QUFDbEMsWUFBSVYsT0FBT0MsSUFBUCxFQUFhQyxLQUFiLEtBQXVCQSxLQUEzQixFQUFrQztBQUNoQ08sa0JBQVFULE9BQU9DLElBQVAsRUFBYVEsS0FBckI7QUFDQSxpQkFBTyxLQUFQO0FBQ0Q7O0FBRUQsZUFBTyxJQUFQO0FBQ0QsT0FQRDs7QUFTQSxhQUFPQSxLQUFQO0FBQ0Q7O0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7d0JBeUJJRSxPLEVBQVM7QUFBQTs7QUFDWCxVQUFNWCxTQUFTLEtBQUtBLE1BQXBCO0FBQ0EsVUFBTVksVUFBVSxFQUFoQjs7QUFFQVQsYUFBT0MsSUFBUCxDQUFZTyxPQUFaLEVBQXFCRCxPQUFyQixDQUE2QixrQkFBVTtBQUNyQyxZQUFNRyxLQUFLRixRQUFRRyxNQUFSLENBQVg7O0FBRUEsWUFBSSxPQUFPRCxFQUFQLEtBQWMsVUFBbEIsRUFBOEI7QUFDNUIsZ0JBQU0sSUFBSUUsU0FBSixDQUNKLHNHQUNXRixFQURYLHlDQUNXQSxFQURYLFdBREksQ0FBTjtBQUlEOztBQUVELFlBQUlKLGNBQUo7O0FBRUEsWUFBSSxNQUFLTyxRQUFMLENBQWNGLE1BQWQsQ0FBSixFQUEyQjtBQUN6Qkwsa0JBQVFULE9BQU9jLE1BQVAsRUFBZUwsS0FBdkI7QUFDRCxTQUZELE1BRU8sSUFBSSxNQUFLUSxlQUFMLENBQXFCSCxNQUFyQixDQUFKLEVBQWtDO0FBQ3ZDTCxrQkFBUSxNQUFLUyxlQUFMLENBQXFCSixNQUFyQixDQUFSO0FBQ0Q7O0FBRUQsWUFBSUwsS0FBSixFQUFXO0FBQ1RHLGtCQUFRRSxNQUFSLElBQWtCRCxHQUFHSixLQUFILENBQWxCO0FBQ0Q7QUFDRixPQXJCRDs7QUF1QkEsYUFBTyxtQkFBUVUsS0FBUixDQUFjUCxPQUFkLENBQVA7QUFDRDs7Ozs7O2tCQTlIa0JiLFUiLCJmaWxlIjoiTW9kZWxBcnJheS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBQcm9taXNlIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IGhhc093blByb3BlcnR5IH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1vZGVsQXJyYXkge1xuICAvKipcbiAgICogSW5zdGFudGlhdGVzIGEgTW9kZWxBcnJheS5cbiAgICpcbiAgICogYGBgXG4gICAqIC8vIGV4YW1wbGUgYG1vZGVsc2Agb2JqZWN0XG4gICAqIGNvbnN0IG1vZGVscyA9IHtcbiAgICogICB1c2VyOiB7XG4gICAqICAgICBtb2RlbDogTW9kZWwsXG4gICAqICAgfSxcbiAgICogICBhbmltYWw6IHtcbiAgICogICAgIG1vZGVsOiBNb2RlbCxcbiAgICogICAgIGFsaWFzOiAncGV0cydcbiAgICogICB9LFxuICAgKiB9O1xuICAgKiBgYGBcbiAgICpcbiAgICogQGNsYXNzIE1vZGVsQXJyYXlcbiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVscyAtIEEgZGljdGlvbmFyeSBvZiBtb2RlbHMsIGluY2x1ZGluZyB0aGVpciBvcHRpb25hbCBhbGlhc2VzLlxuICAgKi9cbiAgY29uc3RydWN0b3IobW9kZWxzKSB7XG4gICAgdGhpcy5tb2RlbHMgPSBtb2RlbHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0cnVlIGlmIGEgTW9kZWwgd2l0aCB0eXBlIGB0eXBlYCBpcyBmb3VuZCBpbiB0aGUgbW9kZWwgcmVnaXN0cnkuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gICAqIEByZXR1cm4ge0Jvb2xlYW59XG4gICAqL1xuICBoYXNNb2RlbCh0eXBlKSB7XG4gICAgcmV0dXJuIGhhc093blByb3BlcnR5KHRoaXMubW9kZWxzLCB0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRydWUgaWYgYSBNb2RlbCB3aXRoIGFsaWFzIGBhbGlhc2AgaXMgZm91bmQgaW4gdGhlIG1vZGVsIHJlZ2lzdHJ5LlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge1N0cmluZ30gYWxpYXNcbiAgICogQHJldHVybiB7Qm9vbGVhbn1cbiAgICovXG4gIGhhc01vZGVsQnlBbGlhcyhhbGlhcykge1xuICAgIGNvbnN0IG1vZGVscyA9IHRoaXMubW9kZWxzO1xuXG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1vZGVscylcbiAgICAgIC5yZWR1Y2UoKHByZXYsIG5leHQpID0+IFsuLi5wcmV2LCBtb2RlbHNbbmV4dF0uYWxpYXNdLCBbXSlcbiAgICAgIC5pbmNsdWRlcyhhbGlhcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIE1vZGVsIGluc3RhbmNlIGJ5IGl0cyBhbGlhcy5cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICogQHBhcmFtIHtTdHJpbmd9IGFsaWFzXG4gICAqIEByZXR1cm4ge01vZGVsfVxuICAgKi9cbiAgZ2V0TW9kZWxCeUFsaWFzKGFsaWFzKSB7XG4gICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHM7XG4gICAgbGV0IG1vZGVsO1xuXG4gICAgT2JqZWN0LmtleXMobW9kZWxzKS5mb3JFYWNoKHR5cGUgPT4ge1xuICAgICAgaWYgKG1vZGVsc1t0eXBlXS5hbGlhcyA9PT0gYWxpYXMpIHtcbiAgICAgICAgbW9kZWwgPSBtb2RlbHNbdHlwZV0ubW9kZWw7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiBvYmplY3Qgb2YgdmFsdWVzIHJldHVybmVkIGJ5IGVhY2ggZnVuY3Rpb24gaW4gYGFjdGlvbnNgLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBtb2RlbCgndXNlcicsICdhbmltYWw6cGV0cycpLm1hcCh7XG4gICAqICAgdXNlcihtb2RlbCkge1xuICAgKiAgICAgLy8gbW9kZWwgPT09IG1vZGVsKCd1c2VyJylcbiAgICogICAgIHJldHVybiBtb2RlbC5maW5kUmVzb3VyY2UoJzEnKTtcbiAgICogICB9LFxuICAgKiAgIHBldHMobW9kZWwpIHtcbiAgICogICAgIC8vIG1vZGVsID09PSBtb2RlbCgnYW5pbWFsJylcbiAgICogICAgIHJldHVybiBtb2RlbC5maW5kKHtcbiAgICogICAgICAgZmlsdGVyOiB7IGFnZTogNSB9LFxuICAgKiAgICAgfSk7XG4gICAqICAgfSxcbiAgICogfSkudGhlbihyZXN1bHRzID0+IHtcbiAgICogICBjb25zdCB1c2VyID0gcmVzdWx0cy51c2VyOyAvLyBSZXNvdXJjZVxuICAgKiAgIGNvbnN0IHBldHMgPSByZXN1bHRzLnBldHM7IC8vIFJlc291cmNlQXJyYXlcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAYXN5bmNcbiAgICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn1cbiAgICovXG4gIG1hcChhY3Rpb25zKSB7XG4gICAgY29uc3QgbW9kZWxzID0gdGhpcy5tb2RlbHM7XG4gICAgY29uc3QgZXhlY3V0ZSA9IHt9O1xuXG4gICAgT2JqZWN0LmtleXMoYWN0aW9ucykuZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgY29uc3QgZm4gPSBhY3Rpb25zW2FjdGlvbl07XG5cbiAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAnV2hlbiBtYXBwaW5nIG92ZXIgYSBNb2RlbEFycmF5LCBlYWNoIGFjdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24sIGluc3RlYWQgZ290IHR5cGUgJyArXG4gICAgICAgICAgYCcke3R5cGVvZiBmbn0nLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgbGV0IG1vZGVsO1xuXG4gICAgICBpZiAodGhpcy5oYXNNb2RlbChhY3Rpb24pKSB7XG4gICAgICAgIG1vZGVsID0gbW9kZWxzW2FjdGlvbl0ubW9kZWw7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzTW9kZWxCeUFsaWFzKGFjdGlvbikpIHtcbiAgICAgICAgbW9kZWwgPSB0aGlzLmdldE1vZGVsQnlBbGlhcyhhY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgZXhlY3V0ZVthY3Rpb25dID0gZm4obW9kZWwpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIFByb21pc2UucHJvcHMoZXhlY3V0ZSk7XG4gIH1cbn1cbiJdfQ==