redink
Version:
RethinkDB model layer
170 lines (137 loc) • 11 kB
JavaScript
;
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==