UNPKG

redink

Version:
125 lines (93 loc) 11.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _rethinkdb = require('rethinkdb'); var _rethinkdb2 = _interopRequireDefault(_rethinkdb); var _applyOptions = require('./applyOptions'); var _applyOptions2 = _interopRequireDefault(_applyOptions); var _hasOwnProperty = require('./hasOwnProperty'); var _hasOwnProperty2 = _interopRequireDefault(_hasOwnProperty); var _requiresIndex = require('./requiresIndex'); var _requiresIndex2 = _interopRequireDefault(_requiresIndex); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } var mergeWithIndex = function mergeWithIndex(table, record, field, index, options) { var row = table; row = row.getAll(record('id'), { index: index }); row = row.coerceTo('array'); row = (0, _applyOptions2.default)(row, options); return _defineProperty({}, field, row); }; var mergeWithManyRecords = function mergeWithManyRecords(table, record, field, options) { var row = table; row = row.getAll(_rethinkdb2.default.args(record(field)('id'))); row = row.coerceTo('array'); row = (0, _applyOptions2.default)(row, options); return _defineProperty({}, field, row); }; var mergeWithSingleRecord = function mergeWithSingleRecord(table, record, field, options) { var row = table; row = row.get(record(field)('id')); row = (0, _applyOptions2.default)(row, options); return _defineProperty({}, field, row); }; /** * Determines which relationships to sideload in the table based off the schema's relationships * and `options.include`. * * ``` * // example options * const options = { * include: { * pets: true, * company: true, * blogs: { * filter: (blog) => blog('title').contains('javascript'), * pluck: { * title: true, * createdOn: true, * }, * include: { // THIS WON'T WORK (yet) * author: true * }, * }, * }, * }; * ``` * * Missing relationship keys in `options` are interpreted as `false`. * * @param {Object} table * @param {Object} schema * @param {Object} options * @returns {Function} */ exports.default = function (table, schema, options) { if (!('include' in options)) return table; var relationships = schema.relationships; var fields = Object.keys(relationships); var fieldsToMerge = function fieldsToMerge(record) { return (0, _rethinkdb2.default)({}).merge(_rethinkdb2.default.args(fields.map(function (field) { if (!(0, _hasOwnProperty2.default)(options.include, field) || !Boolean(options.include[field])) return {}; var _relationships$field = relationships[field]; var type = _relationships$field.type; var relation = _relationships$field.relation; var inverse = _relationships$field.inverse; var relatedTable = _rethinkdb2.default.table(type); var inverseField = inverse.field; var fieldOptions = options.include[field]; if (relation === 'hasMany') { if ((0, _requiresIndex2.default)(relation, inverse.relation)) { return mergeWithIndex(relatedTable, record, field, inverseField, fieldOptions); } return record.hasFields(field).branch(mergeWithManyRecords(relatedTable, record, field, fieldOptions), {}); } return record.hasFields(field).branch(mergeWithSingleRecord(relatedTable, record, field, fieldOptions), {}); }))); }; // eslint-disable-next-line table = table.merge(fieldsToMerge); return table; }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9tZXJnZVJlbGF0aW9uc2hpcHMuanMiXSwibmFtZXMiOlsibWVyZ2VXaXRoSW5kZXgiLCJ0YWJsZSIsInJlY29yZCIsImZpZWxkIiwiaW5kZXgiLCJvcHRpb25zIiwicm93IiwiZ2V0QWxsIiwiY29lcmNlVG8iLCJtZXJnZVdpdGhNYW55UmVjb3JkcyIsImFyZ3MiLCJtZXJnZVdpdGhTaW5nbGVSZWNvcmQiLCJnZXQiLCJzY2hlbWEiLCJyZWxhdGlvbnNoaXBzIiwiZmllbGRzIiwiT2JqZWN0Iiwia2V5cyIsImZpZWxkc1RvTWVyZ2UiLCJtZXJnZSIsIm1hcCIsImluY2x1ZGUiLCJCb29sZWFuIiwidHlwZSIsInJlbGF0aW9uIiwiaW52ZXJzZSIsInJlbGF0ZWRUYWJsZSIsImludmVyc2VGaWVsZCIsImZpZWxkT3B0aW9ucyIsImhhc0ZpZWxkcyIsImJyYW5jaCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0FBRUEsSUFBTUEsaUJBQWlCLFNBQWpCQSxjQUFpQixDQUFDQyxLQUFELEVBQVFDLE1BQVIsRUFBZ0JDLEtBQWhCLEVBQXVCQyxLQUF2QixFQUE4QkMsT0FBOUIsRUFBMEM7QUFDL0QsTUFBSUMsTUFBTUwsS0FBVjs7QUFFQUssUUFBTUEsSUFBSUMsTUFBSixDQUFXTCxPQUFPLElBQVAsQ0FBWCxFQUF5QixFQUFFRSxZQUFGLEVBQXpCLENBQU47QUFDQUUsUUFBTUEsSUFBSUUsUUFBSixDQUFhLE9BQWIsQ0FBTjtBQUNBRixRQUFNLDRCQUFhQSxHQUFiLEVBQWtCRCxPQUFsQixDQUFOOztBQUVBLDZCQUFVRixLQUFWLEVBQWtCRyxHQUFsQjtBQUNELENBUkQ7O0FBVUEsSUFBTUcsdUJBQXVCLFNBQXZCQSxvQkFBdUIsQ0FBQ1IsS0FBRCxFQUFRQyxNQUFSLEVBQWdCQyxLQUFoQixFQUF1QkUsT0FBdkIsRUFBbUM7QUFDOUQsTUFBSUMsTUFBTUwsS0FBVjs7QUFFQUssUUFBTUEsSUFBSUMsTUFBSixDQUFXLG9CQUFFRyxJQUFGLENBQU9SLE9BQU9DLEtBQVAsRUFBYyxJQUFkLENBQVAsQ0FBWCxDQUFOO0FBQ0FHLFFBQU1BLElBQUlFLFFBQUosQ0FBYSxPQUFiLENBQU47QUFDQUYsUUFBTSw0QkFBYUEsR0FBYixFQUFrQkQsT0FBbEIsQ0FBTjs7QUFFQSw2QkFBVUYsS0FBVixFQUFrQkcsR0FBbEI7QUFDRCxDQVJEOztBQVVBLElBQU1LLHdCQUF3QixTQUF4QkEscUJBQXdCLENBQUNWLEtBQUQsRUFBUUMsTUFBUixFQUFnQkMsS0FBaEIsRUFBdUJFLE9BQXZCLEVBQW1DO0FBQy9ELE1BQUlDLE1BQU1MLEtBQVY7O0FBRUFLLFFBQU1BLElBQUlNLEdBQUosQ0FBUVYsT0FBT0MsS0FBUCxFQUFjLElBQWQsQ0FBUixDQUFOO0FBQ0FHLFFBQU0sNEJBQWFBLEdBQWIsRUFBa0JELE9BQWxCLENBQU47O0FBRUEsNkJBQVVGLEtBQVYsRUFBa0JHLEdBQWxCO0FBQ0QsQ0FQRDs7QUFTQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0JBK0JlLFVBQUNMLEtBQUQsRUFBUVksTUFBUixFQUFnQlIsT0FBaEIsRUFBNEI7QUFDekMsTUFBSSxFQUFFLGFBQWFBLE9BQWYsQ0FBSixFQUE2QixPQUFPSixLQUFQOztBQURZLE1BR2pDYSxhQUhpQyxHQUdmRCxNQUhlLENBR2pDQyxhQUhpQzs7QUFJekMsTUFBTUMsU0FBU0MsT0FBT0MsSUFBUCxDQUFZSCxhQUFaLENBQWY7O0FBRUEsTUFBTUksZ0JBQWdCLFNBQWhCQSxhQUFnQixDQUFDaEIsTUFBRDtBQUFBLFdBQVkseUJBQUUsRUFBRixFQUFNaUIsS0FBTixDQUFZLG9CQUFFVCxJQUFGLENBQU9LLE9BQU9LLEdBQVAsQ0FBVyxpQkFBUztBQUN2RSxVQUNFLENBQUMsOEJBQWVmLFFBQVFnQixPQUF2QixFQUFnQ2xCLEtBQWhDLENBQUQsSUFDQSxDQUFDbUIsUUFBUWpCLFFBQVFnQixPQUFSLENBQWdCbEIsS0FBaEIsQ0FBUixDQUZILEVBR0UsT0FBTyxFQUFQOztBQUpxRSxpQ0FNbkNXLGNBQWNYLEtBQWQsQ0FObUM7QUFBQSxVQU0vRG9CLElBTitELHdCQU0vREEsSUFOK0Q7QUFBQSxVQU16REMsUUFOeUQsd0JBTXpEQSxRQU55RDtBQUFBLFVBTS9DQyxPQU4rQyx3QkFNL0NBLE9BTitDOztBQU92RSxVQUFNQyxlQUFlLG9CQUFFekIsS0FBRixDQUFRc0IsSUFBUixDQUFyQjtBQUNBLFVBQU1JLGVBQWVGLFFBQVF0QixLQUE3QjtBQUNBLFVBQU15QixlQUFldkIsUUFBUWdCLE9BQVIsQ0FBZ0JsQixLQUFoQixDQUFyQjs7QUFFQSxVQUFJcUIsYUFBYSxTQUFqQixFQUE0QjtBQUMxQixZQUFJLDZCQUFjQSxRQUFkLEVBQXdCQyxRQUFRRCxRQUFoQyxDQUFKLEVBQStDO0FBQzdDLGlCQUFPeEIsZUFDTDBCLFlBREssRUFFTHhCLE1BRkssRUFHTEMsS0FISyxFQUlMd0IsWUFKSyxFQUtMQyxZQUxLLENBQVA7QUFPRDs7QUFFRCxlQUFPMUIsT0FBTzJCLFNBQVAsQ0FBaUIxQixLQUFqQixFQUF3QjJCLE1BQXhCLENBQ0xyQixxQkFDRWlCLFlBREYsRUFFRXhCLE1BRkYsRUFHRUMsS0FIRixFQUlFeUIsWUFKRixDQURLLEVBT0wsRUFQSyxDQUFQO0FBU0Q7O0FBRUQsYUFBTzFCLE9BQU8yQixTQUFQLENBQWlCMUIsS0FBakIsRUFBd0IyQixNQUF4QixDQUNMbkIsc0JBQ0VlLFlBREYsRUFFRXhCLE1BRkYsRUFHRUMsS0FIRixFQUlFeUIsWUFKRixDQURLLEVBT0wsRUFQSyxDQUFQO0FBU0QsS0ExQ29ELENBQVAsQ0FBWixDQUFaO0FBQUEsR0FBdEI7O0FBNENBO0FBQ0EzQixVQUFRQSxNQUFNa0IsS0FBTixDQUFZRCxhQUFaLENBQVI7O0FBRUEsU0FBT2pCLEtBQVA7QUFDRCxDIiwiZmlsZSI6Im1lcmdlUmVsYXRpb25zaGlwcy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByIGZyb20gJ3JldGhpbmtkYic7XG5pbXBvcnQgYXBwbHlPcHRpb25zIGZyb20gJy4vYXBwbHlPcHRpb25zJztcbmltcG9ydCBoYXNPd25Qcm9wZXJ0eSBmcm9tICcuL2hhc093blByb3BlcnR5JztcbmltcG9ydCByZXF1aXJlc0luZGV4IGZyb20gJy4vcmVxdWlyZXNJbmRleCc7XG5cbmNvbnN0IG1lcmdlV2l0aEluZGV4ID0gKHRhYmxlLCByZWNvcmQsIGZpZWxkLCBpbmRleCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcm93ID0gdGFibGU7XG5cbiAgcm93ID0gcm93LmdldEFsbChyZWNvcmQoJ2lkJyksIHsgaW5kZXggfSk7XG4gIHJvdyA9IHJvdy5jb2VyY2VUbygnYXJyYXknKTtcbiAgcm93ID0gYXBwbHlPcHRpb25zKHJvdywgb3B0aW9ucyk7XG5cbiAgcmV0dXJuIHsgW2ZpZWxkXTogcm93IH07XG59O1xuXG5jb25zdCBtZXJnZVdpdGhNYW55UmVjb3JkcyA9ICh0YWJsZSwgcmVjb3JkLCBmaWVsZCwgb3B0aW9ucykgPT4ge1xuICBsZXQgcm93ID0gdGFibGU7XG5cbiAgcm93ID0gcm93LmdldEFsbChyLmFyZ3MocmVjb3JkKGZpZWxkKSgnaWQnKSkpO1xuICByb3cgPSByb3cuY29lcmNlVG8oJ2FycmF5Jyk7XG4gIHJvdyA9IGFwcGx5T3B0aW9ucyhyb3csIG9wdGlvbnMpO1xuXG4gIHJldHVybiB7IFtmaWVsZF06IHJvdyB9O1xufTtcblxuY29uc3QgbWVyZ2VXaXRoU2luZ2xlUmVjb3JkID0gKHRhYmxlLCByZWNvcmQsIGZpZWxkLCBvcHRpb25zKSA9PiB7XG4gIGxldCByb3cgPSB0YWJsZTtcblxuICByb3cgPSByb3cuZ2V0KHJlY29yZChmaWVsZCkoJ2lkJykpO1xuICByb3cgPSBhcHBseU9wdGlvbnMocm93LCBvcHRpb25zKTtcblxuICByZXR1cm4geyBbZmllbGRdOiByb3cgfTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGljaCByZWxhdGlvbnNoaXBzIHRvIHNpZGVsb2FkIGluIHRoZSB0YWJsZSBiYXNlZCBvZmYgdGhlIHNjaGVtYSdzIHJlbGF0aW9uc2hpcHNcbiAqIGFuZCBgb3B0aW9ucy5pbmNsdWRlYC5cbiAqXG4gKiBgYGBcbiAqIC8vIGV4YW1wbGUgb3B0aW9uc1xuICogY29uc3Qgb3B0aW9ucyA9IHtcbiAqICAgaW5jbHVkZToge1xuICogICAgIHBldHM6IHRydWUsXG4gKiAgICAgY29tcGFueTogdHJ1ZSxcbiAqICAgICBibG9nczoge1xuICogICAgICAgZmlsdGVyOiAoYmxvZykgPT4gYmxvZygndGl0bGUnKS5jb250YWlucygnamF2YXNjcmlwdCcpLFxuICogICAgICAgcGx1Y2s6IHtcbiAqICAgICAgICAgdGl0bGU6IHRydWUsXG4gKiAgICAgICAgIGNyZWF0ZWRPbjogdHJ1ZSxcbiAqICAgICAgIH0sXG4gKiAgICAgICBpbmNsdWRlOiB7IC8vIFRISVMgV09OJ1QgV09SSyAoeWV0KVxuICogICAgICAgICBhdXRob3I6IHRydWVcbiAqICAgICAgIH0sXG4gKiAgICAgfSxcbiAqICAgfSxcbiAqIH07XG4gKiBgYGBcbiAqXG4gKiBNaXNzaW5nIHJlbGF0aW9uc2hpcCBrZXlzIGluIGBvcHRpb25zYCBhcmUgaW50ZXJwcmV0ZWQgYXMgYGZhbHNlYC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdGFibGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBzY2hlbWFcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259XG4gKi9cbmV4cG9ydCBkZWZhdWx0ICh0YWJsZSwgc2NoZW1hLCBvcHRpb25zKSA9PiB7XG4gIGlmICghKCdpbmNsdWRlJyBpbiBvcHRpb25zKSkgcmV0dXJuIHRhYmxlO1xuXG4gIGNvbnN0IHsgcmVsYXRpb25zaGlwcyB9ID0gc2NoZW1hO1xuICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhyZWxhdGlvbnNoaXBzKTtcblxuICBjb25zdCBmaWVsZHNUb01lcmdlID0gKHJlY29yZCkgPT4gcih7fSkubWVyZ2Uoci5hcmdzKGZpZWxkcy5tYXAoZmllbGQgPT4ge1xuICAgIGlmIChcbiAgICAgICFoYXNPd25Qcm9wZXJ0eShvcHRpb25zLmluY2x1ZGUsIGZpZWxkKSB8fFxuICAgICAgIUJvb2xlYW4ob3B0aW9ucy5pbmNsdWRlW2ZpZWxkXSlcbiAgICApIHJldHVybiB7fTtcblxuICAgIGNvbnN0IHsgdHlwZSwgcmVsYXRpb24sIGludmVyc2UgfSA9IHJlbGF0aW9uc2hpcHNbZmllbGRdO1xuICAgIGNvbnN0IHJlbGF0ZWRUYWJsZSA9IHIudGFibGUodHlwZSk7XG4gICAgY29uc3QgaW52ZXJzZUZpZWxkID0gaW52ZXJzZS5maWVsZDtcbiAgICBjb25zdCBmaWVsZE9wdGlvbnMgPSBvcHRpb25zLmluY2x1ZGVbZmllbGRdO1xuXG4gICAgaWYgKHJlbGF0aW9uID09PSAnaGFzTWFueScpIHtcbiAgICAgIGlmIChyZXF1aXJlc0luZGV4KHJlbGF0aW9uLCBpbnZlcnNlLnJlbGF0aW9uKSkge1xuICAgICAgICByZXR1cm4gbWVyZ2VXaXRoSW5kZXgoXG4gICAgICAgICAgcmVsYXRlZFRhYmxlLFxuICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICBmaWVsZCxcbiAgICAgICAgICBpbnZlcnNlRmllbGQsXG4gICAgICAgICAgZmllbGRPcHRpb25zLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVjb3JkLmhhc0ZpZWxkcyhmaWVsZCkuYnJhbmNoKFxuICAgICAgICBtZXJnZVdpdGhNYW55UmVjb3JkcyhcbiAgICAgICAgICByZWxhdGVkVGFibGUsXG4gICAgICAgICAgcmVjb3JkLFxuICAgICAgICAgIGZpZWxkLFxuICAgICAgICAgIGZpZWxkT3B0aW9ucyxcbiAgICAgICAgKSxcbiAgICAgICAge30sXG4gICAgICApO1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQuaGFzRmllbGRzKGZpZWxkKS5icmFuY2goXG4gICAgICBtZXJnZVdpdGhTaW5nbGVSZWNvcmQoXG4gICAgICAgIHJlbGF0ZWRUYWJsZSxcbiAgICAgICAgcmVjb3JkLFxuICAgICAgICBmaWVsZCxcbiAgICAgICAgZmllbGRPcHRpb25zLFxuICAgICAgKSxcbiAgICAgIHt9LFxuICAgICk7XG4gIH0pKSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gIHRhYmxlID0gdGFibGUubWVyZ2UoZmllbGRzVG9NZXJnZSk7XG5cbiAgcmV0dXJuIHRhYmxlO1xufTtcbiJdfQ==