redux-firestore
Version:
Redux bindings for Firestore.
703 lines (702 loc) • 31 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(e) { return e && e.__esModule ? e : { default: e }; }
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _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(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _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(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
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 (_ref0) {
var _ref1 = _slicedToArray(_ref0, 2),
path = _ref1[0],
id = _ref1[1];
return getDoc(path, id);
});
return (0, _orderBy2.default)(docs, fields, direction).map(function () {
var _ref10 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},
id = _ref10.id,
path = _ref10.path;
return path && id && [path, id];
});
});
};
var xfLimit = function xfLimit(_ref11) {
var limit = _ref11.limit,
endAt = _ref11.endAt,
endBefore = _ref11.endBefore;
if (!limit) return _identity2.default;
var fromRight = (endAt || endBefore) !== undefined;
return fromRight ? function () {
var _ref12 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [],
_ref13 = _slicedToArray(_ref12, 1),
arr = _ref13[0];
return [(0, _takeRight2.default)(arr, limit)];
} : function () {
var _ref14 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [],
_ref15 = _slicedToArray(_ref14, 1),
arr = _ref15[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 (_ref16, idx) {
var _ref17 = _slicedToArray(_ref16, 2),
field = _ref17[0],
_ref17$ = _ref17[1],
sort = _ref17$ === void 0 ? 'asc' : _ref17$;
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 (_ref18) {
var _ref19 = _slicedToArray(_ref18, 2),
path = _ref19[0],
id = _ref19[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, _ref20) {
var _ref20$databaseOverri = _ref20.databaseOverrides,
databaseOverrides = _ref20$databaseOverri === void 0 ? {} : _ref20$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(_ref21) {
var payload = _ref21.payload;
var db = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var dbo = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var _ref22 = payload.data || {},
reads = _ref22.reads,
writes = _ref22.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, _ref23) {
var path = _ref23.path,
id = _ref23.id,
data = _ref23.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, _ref24) {
var action = _ref24.action,
key = _ref24.key,
path = _ref24.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 (_ref25) {
var _path = _ref25.path,
id = _ref25.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, _ref26) {
var action = _ref26.action,
key = _ref26.key,
path = _ref26.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, _ref27) {
var action = _ref27.action,
key = _ref27.key,
path = _ref27.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 _ref28 = payload.ordered || {},
_ref28$oldIndex = _ref28.oldIndex,
oldIndex = _ref28$oldIndex === void 0 ? 0 : _ref28$oldIndex,
_ref28$newIndex = _ref28.newIndex,
newIndex = _ref28$newIndex === void 0 ? 0 : _ref28$newIndex;
if (newIndex !== oldIndex) {
var tuple = payload.data && [payload.data.path, payload.data.id] || draft[key].ordered[oldIndex];
var _ref29 = draft[key] || {
ordered: []
},
ordered = _ref29.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, _ref30) {
var action = _ref30.action,
key = _ref30.key,
path = _ref30.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, _ref31) {
var writes = _ref31.writes;
return [].concat(_toConsumableArray(results), _toConsumableArray(writes.map(function (_ref32) {
var collection = _ref32.collection,
_path = _ref32.path,
doc = _ref32.doc,
id = _ref32.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, _ref33) {
var action = _ref33.action,
key = _ref33.key,
path = _ref33.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, _ref34) {
var action = _ref34.action,
key = _ref34.key,
path = _ref34.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, _ref35) {
var action = _ref35.action,
key = _ref35.key,
path = _ref35.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, _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
});
reprocessQueries(draft, path);
return draft;
});
};
var mutation = function mutation(state, _ref37) {
var action = _ref37.action,
key = _ref37.key,
path = _ref37.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 (_ref38) {
var _path = _ref38.path;
return _path;
})));
updatePaths.forEach(function (_path) {
reprocessQueries(draft, _path);
});
}
_promise === null || _promise === void 0 || _promise.resolve();
return draft;
});
return result;
} catch (error) {
_promise === null || _promise === void 0 || _promise.reject(error);
return state;
}
};
var HANDLERS = (_HANDLERS = {}, _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_HANDLERS, _constants.actionTypes.SET_LISTENER, initialize), _constants.actionTypes.LISTENER_RESPONSE, initialize), _constants.actionTypes.GET_SUCCESS, initialize), _constants.actionTypes.UNSET_LISTENER, conclude), _constants.actionTypes.DOCUMENT_ADDED, modify), _constants.actionTypes.DOCUMENT_MODIFIED, modify), _constants.actionTypes.DELETE_SUCCESS, deletion), _constants.actionTypes.DOCUMENT_REMOVED, remove), _constants.actionTypes.OPTIMISTIC_ADDED, optimistic), _constants.actionTypes.OPTIMISTIC_MODIFIED, optimistic), _defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_defineProperty(_HANDLERS, _constants.actionTypes.OPTIMISTIC_REMOVED, reset), _constants.actionTypes.MUTATE_FAILURE, failure), _constants.actionTypes.DELETE_FAILURE, failure), _constants.actionTypes.UPDATE_FAILURE, failure), _constants.actionTypes.SET_FAILURE, failure), _constants.actionTypes.ADD_FAILURE, failure), _constants.actionTypes.MUTATE_START, mutation));
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
});
}