redux-firestore
Version:
Redux bindings for Firestore.
703 lines (702 loc) • 32 kB
JavaScript
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = cacheReducer;
var _identity2 = _interopRequireDefault(require("lodash/identity"));
var _isEmpty2 = _interopRequireDefault(require("lodash/isEmpty"));
var _takeRight2 = _interopRequireDefault(require("lodash/takeRight"));
var _isEqual2 = _interopRequireDefault(require("lodash/isEqual"));
var _get2 = _interopRequireDefault(require("lodash/get"));
var _isMatch2 = _interopRequireDefault(require("lodash/isMatch"));
var _findIndex2 = _interopRequireDefault(require("lodash/findIndex"));
var _setWith2 = _interopRequireDefault(require("lodash/setWith"));
var _zip4 = _interopRequireDefault(require("lodash/zip"));
var _partialRight2 = _interopRequireDefault(require("lodash/partialRight"));
var _map2 = _interopRequireDefault(require("lodash/map"));
var _take2 = _interopRequireDefault(require("lodash/take"));
var _orderBy2 = _interopRequireDefault(require("lodash/orderBy"));
var _flow2 = _interopRequireDefault(require("lodash/flow"));
var _filter2 = _interopRequireDefault(require("lodash/filter"));
var _unset2 = _interopRequireDefault(require("lodash/unset"));
var _set2 = _interopRequireDefault(require("lodash/set"));
var _immer = _interopRequireDefault(require("immer"));
var _firestore = require("firebase/firestore");
var _constants = require("../constants");
var _query = require("../utils/query");
var _HANDLERS;
var _excluded = ["collection", "path", "doc", "id", "data"];
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
var isTimestamp = function isTimestamp(a) {
return a instanceof Object && a.seconds !== undefined;
};
var PROCESSES = {
'<': function _(a, b) {
return a < b;
},
'<=': function _(a, b) {
return a <= b;
},
'==': function _(a, b) {
return a === b;
},
'!=': function _(a, b) {
return a !== b;
},
'>=': function _(a, b) {
return a >= b;
},
'>': function _(a, b) {
return a > b;
},
'array-contains': function arrayContains(a, b) {
return a.includes(b);
},
in: function _in(a, b) {
return Array.isArray(b) && b.includes(a);
},
'array-contains-any': function arrayContainsAny(a, b) {
return b.some(function (b1) {
return a.includes(b1);
});
},
'not-in': function notIn(a, b) {
return !b.includes(a);
},
'*': function _() {
return true;
}
};
var PROCESSES_TIMESTAMP = {
'<': function _(a, b) {
return a.seconds < b.seconds || a.seconds === b.seconds && a.nanoseconds < b.nanoseconds;
},
'<=': function _(a, b) {
return a.seconds < b.seconds || a.seconds === b.seconds && a.nanoseconds <= b.nanoseconds;
},
'==': function _(a, b) {
return a.seconds === b.seconds && a.nanoseconds === b.nanoseconds;
},
'!=': function _(a, b) {
return a.seconds !== b.seconds || a.nanoseconds !== b.nanoseconds;
},
'>=': function _(a, b) {
return a.seconds > b.seconds || a.seconds === b.seconds && a.nanoseconds >= b.nanoseconds;
},
'>': function _(a, b) {
return a.seconds > b.seconds || a.seconds === b.seconds && a.nanoseconds > b.nanoseconds;
},
'array-contains': function arrayContains(a, b) {
return a.includes(b);
},
in: function _in(a, b) {
return Array.isArray(b) && b.includes(a);
},
'array-contains-any': function arrayContainsAny(a, b) {
return b.some(function (b1) {
return a.includes(b1);
});
},
'not-in': function notIn(a, b) {
return !b.includes(a);
},
'*': function _() {
return true;
}
};
var xfVerbose = function xfVerbose(title) {
return (0, _partialRight2.default)(_map2.default, function (data) {
return data;
});
};
var xfAllIds = function xfAllIds(_ref) {
var path = _ref.collection;
return function allIdsTransducer(state) {
var _state$database = state.database,
db = _state$database === void 0 ? {} : _state$database,
_state$databaseOverri = state.databaseOverrides,
dbo = _state$databaseOverri === void 0 ? {} : _state$databaseOverri;
var allIds = new Set([].concat(_toConsumableArray(Object.keys(db[path] || {})), _toConsumableArray(Object.keys(dbo[path] || {}))));
return [Array.from(allIds).map(function (id) {
return [path, id];
})];
};
};
var xfWhere = function xfWhere(_ref2, getDoc) {
var where = _ref2.where;
if (!where) return [(0, _partialRight2.default)(_map2.default, _identity2.default)];
var isFlat = typeof where[0] === 'string';
var clauses = isFlat ? [where] : where;
return clauses.map(function (_ref3) {
var _ref4 = _slicedToArray(_ref3, 3),
field = _ref4[0],
op = _ref4[1],
val = _ref4[2];
var fnc = isTimestamp(val) ? PROCESSES_TIMESTAMP[op] : PROCESSES[op] || function () {
return true;
};
return (0, _partialRight2.default)(_map2.default, function (tuples) {
return (0, _filter2.default)(tuples, function () {
var _ref5 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [],
_ref6 = _slicedToArray(_ref5, 2),
path = _ref6[0],
id = _ref6[1];
if (!path || !id) return false;
var value;
if (field === '__name__') {
value = id;
} else if (field.includes('.')) {
value = field.split('.').reduce(function (obj, subField) {
return obj && obj[subField];
}, getDoc(path, id));
} else {
value = getDoc(path, id)[field];
}
if (value === undefined) value = null;
return fnc(value, val);
});
});
});
};
var xfOrder = function xfOrder(_ref7, getDoc) {
var order = _ref7.orderBy;
if (!order) return _identity2.default;
var isFlat = typeof order[0] === 'string';
var orders = isFlat ? [order] : order;
var _zip2 = _zip4.default.apply(void 0, _toConsumableArray(orders.map(function (_ref8) {
var _ref9 = _slicedToArray(_ref8, 2),
field = _ref9[0],
dir = _ref9[1];
return [function (data) {
if (typeof data[field] === 'string') return data[field].toLowerCase();
if (isTimestamp(data[field])) return data[field].seconds;
return data[field];
}, dir || 'asc'];
}))),
_zip3 = _slicedToArray(_zip2, 2),
fields = _zip3[0],
direction = _zip3[1];
return (0, _partialRight2.default)(_map2.default, function (tuples) {
var docs = tuples.map(function (_ref10) {
var _ref11 = _slicedToArray(_ref10, 2),
path = _ref11[0],
id = _ref11[1];
return getDoc(path, id);
});
return (0, _orderBy2.default)(docs, fields, direction).map(function () {
var _ref12 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
id = _ref12.id,
path = _ref12.path;
return path && id && [path, id];
});
});
};
var xfLimit = function xfLimit(_ref13) {
var limit = _ref13.limit,
endAt = _ref13.endAt,
endBefore = _ref13.endBefore;
if (!limit) return _identity2.default;
var fromRight = (endAt || endBefore) !== undefined;
return fromRight ? function () {
var _ref14 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [],
_ref15 = _slicedToArray(_ref14, 1),
arr = _ref15[0];
return [(0, _takeRight2.default)(arr, limit)];
} : function () {
var _ref16 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [],
_ref17 = _slicedToArray(_ref16, 1),
arr = _ref17[0];
return [(0, _take2.default)(arr, limit)];
};
};
var xfPaginate = function xfPaginate(query, getDoc) {
var order = query.orderBy,
limit = query.limit,
startAt = query.startAt,
startAfter = query.startAfter,
endAt = query.endAt,
endBefore = query.endBefore;
var start = startAt || startAfter;
var end = endAt || endBefore;
var isAfter = startAfter !== undefined;
var isBefore = endBefore !== undefined;
var needsPagination = start || end || false;
if (!needsPagination || !order) return _identity2.default;
var isFlat = typeof order[0] === 'string';
var orders = isFlat ? [order] : order;
var isPaginateMatched = function isPaginateMatched(document, at) {
var before = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
var after = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
return orders.find(function (_ref18, idx) {
var _ref19 = _slicedToArray(_ref18, 2),
field = _ref19[0],
_ref19$ = _ref19[1],
sort = _ref19$ === void 0 ? 'asc' : _ref19$;
var value = Array.isArray(at) ? at[idx] : at;
if (value === undefined) return false;
var isTime = isTimestamp(document[field]);
var proc = isTime ? PROCESSES_TIMESTAMP : PROCESSES;
var compare = process['=='];
if (startAt || endAt) compare = proc[sort === 'desc' ? '<=' : '>='];
if (startAfter || endBefore) compare = proc[sort === 'desc' ? '<' : '>'];
var isMatched = compare(document[field], value);
return isMatched;
}) !== undefined;
};
return (0, _partialRight2.default)(_map2.default, function (tuples) {
var results = [];
var started = start === undefined;
tuples.forEach(function (_ref20) {
var _ref21 = _slicedToArray(_ref20, 2),
path = _ref21[0],
id = _ref21[1];
if (limit && results.length >= limit) return;
if (!started && start) {
if (isPaginateMatched(getDoc(path, id), start, undefined, isAfter)) {
started = true;
}
}
if (started && end) {
if (isPaginateMatched(getDoc(path, id), end, isBefore, undefined)) {
started = false;
}
}
if (started) {
results.push([path, id]);
}
});
return results;
});
};
function processOptimistic(query, state) {
var database = state.database,
databaseOverrides = state.databaseOverrides;
var _query$via = query.via,
via = _query$via === void 0 ? 'memory' : _query$via,
collection = query.collection;
var db = database && database[collection] || {};
var dbo = databaseOverrides && databaseOverrides[collection];
var getDoc = function getDoc(path, id) {
var data = db[id] || {};
var override = dbo === null || dbo === void 0 ? void 0 : dbo[id];
return override ? _objectSpread(_objectSpread({}, data), override) : data;
};
var process = (0, _flow2.default)([xfAllIds(query), xfVerbose('xfAllIds')].concat(_toConsumableArray(xfWhere(query, getDoc)), [xfVerbose('xfWhere'), xfOrder(query, getDoc), xfVerbose('xfOrder'), xfPaginate(query, getDoc), xfVerbose('xfPaginate'), xfLimit(query), xfVerbose('xfLimit')]));
var ordered = process(state)[0];
return via === 'memory' && ordered.length === 0 ? undefined : ordered;
}
var skipReprocessing = function skipReprocessing(query, _ref22) {
var _ref22$databaseOverri = _ref22.databaseOverrides,
databaseOverrides = _ref22$databaseOverri === void 0 ? {} : _ref22$databaseOverri;
var collection = query.collection,
via = query.via;
var fromFirestore = ['cache', 'server'].includes(via);
var hasNoOverrides = (0, _isEmpty2.default)(databaseOverrides[collection]);
if (fromFirestore && hasNoOverrides) return true;
return false;
};
function reprocessQueries(draft, path) {
var _draft$databaseOverri;
var queries = [];
var paths = Array.isArray(path) ? path : [path];
var overrides = (_draft$databaseOverri = draft.databaseOverrides) === null || _draft$databaseOverri === void 0 ? void 0 : _draft$databaseOverri[path];
Object.keys(draft).forEach(function (key) {
var _draft$key$ordered;
if (['database', 'databaseOverrides'].includes(key)) return;
if (!paths.includes(draft[key].collection)) return;
if (skipReprocessing(draft[key], draft)) return;
queries.push(key);
var ordered = processOptimistic(draft[key], draft);
if (!draft[key].ordered || (ordered !== null && ordered !== void 0 ? ordered : []).toString() !== ((_draft$key$ordered = draft[key].ordered) !== null && _draft$key$ordered !== void 0 ? _draft$key$ordered : []).toString()) {
(0, _set2.default)(draft, [key, 'ordered'], ordered);
(0, _set2.default)(draft, [key, 'via'], !(0, _isEmpty2.default)(overrides) ? 'optimistic' : 'memory');
}
});
}
var primaryValue = function primaryValue(arr) {
return typeof arr[0] === 'string' && arr[0].indexOf('::') === 0 ? null : arr;
};
var nestedMap = function nestedMap(obj, key, val) {
delete obj[key];
var fields = key.split('.');
fields.reduce(function (deep, field, idx) {
if (deep[field] === undefined) deep[field] = {};
if (idx === fields.length - 1) deep[field] = val;
return deep[field];
}, obj);
return obj;
};
var arrayUnion = function arrayUnion(key, val, cached) {
return key !== '::arrayUnion' ? null : (cached() || []).concat([val]);
};
var arrayRemove = function arrayRemove(key, val, cached) {
return key === '::arrayRemove' && (cached() || []).filter(function (item) {
return item !== val;
});
};
var increment = function increment(key, val, cached) {
return key === '::increment' && typeof val === 'number' && (cached() || 0) + val;
};
var serverTimestamp = function serverTimestamp(key) {
return key === '::serverTimestamp' && _firestore.Timestamp.now();
};
function atomize(mutation, cached) {
return Object.keys(mutation).reduce(function (data, key) {
var val = data[key];
if (key.includes('.')) {
nestedMap(data, key, val);
} else if (Array.isArray(val) && val.length > 0) {
data[key] = primaryValue(val) || serverTimestamp(val[0]) || arrayUnion(val[0], val[1], function () {
return cached(key);
}) || arrayRemove(val[0], val[1], function () {
return cached(key);
}) || increment(val[0], val[1], function () {
return cached(key);
});
}
return data;
}, JSON.parse(JSON.stringify(mutation)));
}
function translateMutationToOverrides(_ref23) {
var payload = _ref23.payload;
var db = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var dbo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var _ref24 = payload.data || {},
reads = _ref24.reads,
writes = _ref24.writes;
if (!writes) {
writes = Array.isArray(payload.data) ? payload.data : [payload.data];
} else if (!Array.isArray(writes)) {
writes = [writes];
}
var optimistic = {};
if (reads) {
optimistic = Object.keys(reads).reduce(function (result, key) {
var _reads$key, _reads$key2, _reads$key3, _reads$key4;
if (typeof reads[key] === 'function') {
return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, key, reads[key]()));
}
var path = ((_reads$key = reads[key]) === null || _reads$key === void 0 ? void 0 : _reads$key.path) || ((_reads$key2 = reads[key]) === null || _reads$key2 === void 0 ? void 0 : _reads$key2.collection);
var id = ((_reads$key3 = reads[key]) === null || _reads$key3 === void 0 ? void 0 : _reads$key3.id) || ((_reads$key4 = reads[key]) === null || _reads$key4 === void 0 ? void 0 : _reads$key4.doc);
var collection = db[path] || {};
var overrides = dbo[path] || {};
return _objectSpread(_objectSpread({}, result), {}, _defineProperty({}, key, _objectSpread(_objectSpread({
id: id,
path: path
}, collection[id]), overrides[id] || {})));
}, {});
}
var overrides = writes.map(function (writer) {
return typeof writer === 'function' ? writer(optimistic) : writer;
}).filter(function (data) {
return !data || !(0, _isEmpty2.default)(data);
}).reduce(function (flat, result) {
return [].concat(_toConsumableArray(flat), _toConsumableArray(Array.isArray(result) ? result : [result]));
}, []).map(function (write) {
var collection = write.collection,
path = write.path,
doc = write.doc,
id = write.id,
data = write.data,
rest = _objectWithoutProperties(write, _excluded);
var coll = path || collection;
var docId = id || doc;
return _objectSpread({
path: coll,
id: docId
}, atomize(collection ? data : rest, function (key) {
var database = Object.keys(db).length > 0 ? db : {};
var location = database[coll] || {};
return (location[docId] || {})[key];
}));
});
return overrides;
}
function cleanOverride(draft, _ref25) {
var path = _ref25.path,
id = _ref25.id,
data = _ref25.data;
if (!path || !id) return;
var override = (0, _get2.default)(draft, ['databaseOverrides', path, id], false);
if (!override || data && !(0, _isMatch2.default)(data, override)) return;
var keys = Object.keys(override);
var props = !data ? keys : keys.filter(function (key) {
var current = (0, _get2.default)(data, key);
var optimistic = override[key];
if (current === null || current === undefined) {
return current === optimistic;
}
if (Array.isArray(current)) {
return current.every(function (val, idx) {
return val === optimistic[idx];
});
}
if (_typeof(current) === 'object') {
return Object.keys(current).every(function (currentKey) {
return current[currentKey] === optimistic[currentKey];
});
}
return (0, _isEqual2.default)(data[key], override[key]);
});
var isDone = props.length === Object.keys(override).length;
var dataIsEmpty = isDone && Object.keys(draft.databaseOverrides[path] || {}).length === 1;
if (dataIsEmpty) {
(0, _unset2.default)(draft, ['databaseOverrides', path]);
} else if (isDone) {
(0, _unset2.default)(draft, ['databaseOverrides', path, id]);
} else {
props.forEach(function (prop) {
(0, _unset2.default)(draft, ['databaseOverrides', path, id, prop]);
});
}
}
var initialize = function initialize(state, _ref26) {
var action = _ref26.action,
key = _ref26.key,
path = _ref26.path;
return (0, _immer.default)(state, function (draft) {
var _draft$databaseOverri2, _action$payload$order;
if (!draft.database) {
(0, _set2.default)(draft, ['database'], {});
(0, _set2.default)(draft, ['databaseOverrides'], {});
}
var hasOptimistic = !(0, _isEmpty2.default)((_draft$databaseOverri2 = draft.databaseOverrides) === null || _draft$databaseOverri2 === void 0 ? void 0 : _draft$databaseOverri2[path]);
var via = {
undefined: hasOptimistic ? 'optimistic' : 'memory',
true: 'cache',
false: 'server'
}[action.payload.fromCache];
if (action.payload.data) {
Object.keys(action.payload.data).forEach(function (id) {
(0, _setWith2.default)(draft, ['database', path, id], action.payload.data[id], Object);
cleanOverride(draft, {
path: path,
id: id,
data: action.payload.data[id]
});
});
}
var ordered = ((_action$payload$order = action.payload.ordered) === null || _action$payload$order === void 0 ? void 0 : _action$payload$order.map(function (_ref27) {
var _path = _ref27.path,
id = _ref27.id;
return [_path, id];
})) || processOptimistic(action.meta, draft);
(0, _set2.default)(draft, [action.meta.storeAs], _objectSpread(_objectSpread({
ordered: ordered
}, action.meta), {}, {
via: via
}));
reprocessQueries(draft, path);
return draft;
});
};
var conclude = function conclude(state, _ref28) {
var action = _ref28.action,
key = _ref28.key,
path = _ref28.path;
return (0, _immer.default)(state, function (draft) {
if (draft[key]) {
if (!action.payload.preserveCache) {
(0, _unset2.default)(draft, [key]);
}
reprocessQueries(draft, path);
}
return draft;
});
};
var modify = function modify(state, _ref29) {
var action = _ref29.action,
key = _ref29.key,
path = _ref29.path;
return (0, _immer.default)(state, function (draft) {
(0, _setWith2.default)(draft, ['database', path, action.meta.doc], action.payload.data, Object);
cleanOverride(draft, {
path: path,
id: action.meta.doc,
data: action.payload.data
});
var payload = action.payload;
var _ref30 = payload.ordered || {},
_ref30$oldIndex = _ref30.oldIndex,
oldIndex = _ref30$oldIndex === void 0 ? 0 : _ref30$oldIndex,
_ref30$newIndex = _ref30.newIndex,
newIndex = _ref30$newIndex === void 0 ? 0 : _ref30$newIndex;
if (newIndex !== oldIndex) {
var tuple = payload.data && [payload.data.path, payload.data.id] || draft[key].ordered[oldIndex];
var _ref31 = draft[key] || {
ordered: []
},
ordered = _ref31.ordered;
var idx = (0, _findIndex2.default)(ordered, [1, action.meta.doc]);
var isIndexChange = idx !== -1;
var isAddition = oldIndex === -1 || isIndexChange;
var isRemoval = newIndex === -1 || isIndexChange;
if (isRemoval && idx > -1) {
ordered.splice(idx, 0);
} else if (isAddition) {
ordered.splice(newIndex, 0, tuple);
}
(0, _set2.default)(draft, [key, 'ordered'], ordered);
}
if (action.meta.reprocess !== false) {
reprocessQueries(draft, path);
}
return draft;
});
};
var failure = function failure(state, _ref32) {
var action = _ref32.action,
key = _ref32.key,
path = _ref32.path;
return (0, _immer.default)(state, function (draft) {
if (action.payload.data || action.payload.args) {
var write = action.payload.data ? [{
writes: [action.payload.data]
}] : action.payload.args;
var allPaths = write.reduce(function (results, _ref33) {
var writes = _ref33.writes;
return [].concat(_toConsumableArray(results), _toConsumableArray(writes.map(function (_ref34) {
var collection = _ref34.collection,
_path = _ref34.path,
doc = _ref34.doc,
id = _ref34.id;
cleanOverride(draft, {
path: _path || collection,
id: id || doc
});
return path || collection;
})));
}, []);
var uniquePaths = Array.from(new Set(allPaths));
if (uniquePaths.length > 0) {
reprocessQueries(draft, uniquePaths);
}
}
return draft;
});
};
var deletion = function deletion(state, _ref35) {
var action = _ref35.action,
key = _ref35.key,
path = _ref35.path;
return (0, _immer.default)(state, function (draft) {
if (draft.database && draft.database[path]) {
(0, _unset2.default)(draft, ['database', path, action.meta.doc]);
}
cleanOverride(draft, {
path: path,
id: action.meta.doc
});
if (draft[key] && draft[key].ordered) {
var idx = (0, _findIndex2.default)(draft[key].ordered, [1, action.meta.doc]);
draft[key].ordered.splice(idx, 1);
}
reprocessQueries(draft, path);
return draft;
});
};
var remove = function remove(state, _ref36) {
var action = _ref36.action,
key = _ref36.key,
path = _ref36.path;
return (0, _immer.default)(state, function (draft) {
cleanOverride(draft, {
path: path,
id: action.meta.doc,
data: action.payload.data
});
if (draft[key] && draft[key].ordered) {
var idx = (0, _findIndex2.default)(draft[key].ordered, [1, action.meta.doc]);
var wasNotAlreadyRemoved = idx !== -1;
if (wasNotAlreadyRemoved) {
draft[key].ordered.splice(idx, 1);
}
}
reprocessQueries(draft, path);
return draft;
});
};
var optimistic = function optimistic(state, _ref37) {
var action = _ref37.action,
key = _ref37.key,
path = _ref37.path;
return (0, _immer.default)(state, function (draft) {
(0, _setWith2.default)(draft, ['databaseOverrides', path, action.meta.doc], action.payload.data, Object);
reprocessQueries(draft, path);
return draft;
});
};
var reset = function reset(state, _ref38) {
var action = _ref38.action,
key = _ref38.key,
path = _ref38.path;
return (0, _immer.default)(state, function (draft) {
cleanOverride(draft, {
path: path,
id: action.meta.doc
});
reprocessQueries(draft, path);
return draft;
});
};
var mutation = function mutation(state, _ref39) {
var action = _ref39.action,
key = _ref39.key,
path = _ref39.path;
var _promise = action._promise;
try {
var result = (0, _immer.default)(state, function (draft) {
if (action.payload && action.payload.data) {
var optimisiticUpdates = translateMutationToOverrides(action, draft.database) || [];
optimisiticUpdates.forEach(function (data) {
(0, _setWith2.default)(draft, ['databaseOverrides', data.path, data.id], data, Object);
});
var updatePaths = _toConsumableArray(new Set(optimisiticUpdates.map(function (_ref40) {
var _path = _ref40.path;
return _path;
})));
updatePaths.forEach(function (_path) {
reprocessQueries(draft, _path);
});
}
_promise === null || _promise === void 0 ? void 0 : _promise.resolve();
return draft;
});
return result;
} catch (error) {
_promise === null || _promise === void 0 ? void 0 : _promise.reject(error);
return state;
}
};
var HANDLERS = (_HANDLERS = {}, _defineProperty(_HANDLERS, _constants.actionTypes.SET_LISTENER, initialize), _defineProperty(_HANDLERS, _constants.actionTypes.LISTENER_RESPONSE, initialize), _defineProperty(_HANDLERS, _constants.actionTypes.GET_SUCCESS, initialize), _defineProperty(_HANDLERS, _constants.actionTypes.UNSET_LISTENER, conclude), _defineProperty(_HANDLERS, _constants.actionTypes.DOCUMENT_ADDED, modify), _defineProperty(_HANDLERS, _constants.actionTypes.DOCUMENT_MODIFIED, modify), _defineProperty(_HANDLERS, _constants.actionTypes.DELETE_SUCCESS, deletion), _defineProperty(_HANDLERS, _constants.actionTypes.DOCUMENT_REMOVED, remove), _defineProperty(_HANDLERS, _constants.actionTypes.OPTIMISTIC_ADDED, optimistic), _defineProperty(_HANDLERS, _constants.actionTypes.OPTIMISTIC_MODIFIED, optimistic), _defineProperty(_HANDLERS, _constants.actionTypes.OPTIMISTIC_REMOVED, reset), _defineProperty(_HANDLERS, _constants.actionTypes.MUTATE_FAILURE, failure), _defineProperty(_HANDLERS, _constants.actionTypes.DELETE_FAILURE, failure), _defineProperty(_HANDLERS, _constants.actionTypes.UPDATE_FAILURE, failure), _defineProperty(_HANDLERS, _constants.actionTypes.SET_FAILURE, failure), _defineProperty(_HANDLERS, _constants.actionTypes.ADD_FAILURE, failure), _defineProperty(_HANDLERS, _constants.actionTypes.MUTATE_START, mutation), _HANDLERS);
function cacheReducer() {
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var action = arguments.length > 1 ? arguments[1] : undefined;
var fnc = HANDLERS[action.type];
if (!fnc) return state;
var key = !action.meta || !action.meta.collection ? null : action.meta.storeAs || (0, _query.getBaseQueryName)(action.meta);
var path = !action.meta ? null : action.meta.collection;
return fnc(state, {
action: action,
key: key,
path: path
});
}
;