@aws-amplify/datastore 4.1.1 → 4.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (26) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +52 -28
  3. package/lib/storage/adapter/AsyncStorageAdapter.js +212 -476
  4. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  5. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  6. package/lib/storage/adapter/IndexedDBAdapter.d.ts +53 -28
  7. package/lib/storage/adapter/IndexedDBAdapter.js +589 -892
  8. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  9. package/lib/storage/adapter/StorageAdapterBase.d.ts +146 -0
  10. package/lib/storage/adapter/StorageAdapterBase.js +479 -0
  11. package/lib/storage/adapter/StorageAdapterBase.js.map +1 -0
  12. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +52 -28
  13. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +215 -479
  14. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  15. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  16. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +53 -28
  17. package/lib-esm/storage/adapter/IndexedDBAdapter.js +588 -891
  18. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  19. package/lib-esm/storage/adapter/StorageAdapterBase.d.ts +146 -0
  20. package/lib-esm/storage/adapter/StorageAdapterBase.js +477 -0
  21. package/lib-esm/storage/adapter/StorageAdapterBase.js.map +1 -0
  22. package/package.json +6 -6
  23. package/src/storage/adapter/AsyncStorageAdapter.ts +239 -543
  24. package/src/storage/adapter/AsyncStorageDatabase.ts +2 -2
  25. package/src/storage/adapter/IndexedDBAdapter.ts +423 -786
  26. package/src/storage/adapter/StorageAdapterBase.ts +639 -0
@@ -1,9 +1,9 @@
1
- import { __asyncValues, __awaiter, __generator, __read, __spread, __values } from "tslib";
1
+ import { __asyncValues, __awaiter, __extends, __generator, __read, __spread, __values } from "tslib";
2
2
  import { ConsoleLogger as Logger } from '@aws-amplify/core';
3
3
  import * as idb from 'idb';
4
- import { ModelPredicateCreator } from '../../predicates';
5
4
  import { isPredicateObj, isPredicateGroup, OpType, QueryOne, } from '../../types';
6
- import { getIndex, getIndexFromAssociation, isModelConstructor, isPrivateMode, traverseModel, validatePredicate, inMemoryPagination, keysEqual, getStorename, getIndexKeys, extractPrimaryKeyValues, isSafariCompatabilityMode, } from '../../util';
5
+ import { getIndex, isPrivateMode, traverseModel, validatePredicate, inMemoryPagination, keysEqual, getStorename, isSafariCompatabilityMode, } from '../../util';
6
+ import { StorageAdapterBase } from './StorageAdapterBase';
7
7
  var logger = new Logger('DataStore');
8
8
  /**
9
9
  * The point after which queries composed of multiple simple OR conditions
@@ -27,12 +27,13 @@ var logger = new Logger('DataStore');
27
27
  *
28
28
  */
29
29
  var MULTI_OR_CONDITION_SCAN_BREAKPOINT = 7;
30
- var DB_NAME = 'amplify-datastore';
31
- var IndexedDBAdapter = /** @class */ (function () {
30
+ //
31
+ var DB_VERSION = 3;
32
+ var IndexedDBAdapter = /** @class */ (function (_super) {
33
+ __extends(IndexedDBAdapter, _super);
32
34
  function IndexedDBAdapter() {
33
- var _this = this;
34
- this.dbName = DB_NAME;
35
- this.safariCompatabilityMode = false;
35
+ var _this = _super !== null && _super.apply(this, arguments) || this;
36
+ _this.safariCompatabilityMode = false;
36
37
  /**
37
38
  * Checks the given path against the browser's IndexedDB implementation for
38
39
  * necessary compatibility transformations, applying those transforms if needed.
@@ -41,241 +42,168 @@ var IndexedDBAdapter = /** @class */ (function () {
41
42
  * @returns An array or string, depending on and given key,
42
43
  * that is ensured to be compatible with the IndexedDB implementation's nuances.
43
44
  */
44
- this.canonicalKeyPath = function (keyArr) {
45
+ _this.canonicalKeyPath = function (keyArr) {
45
46
  if (_this.safariCompatabilityMode) {
46
47
  return keyArr.length > 1 ? keyArr : keyArr[0];
47
48
  }
48
49
  return keyArr;
49
50
  };
51
+ return _this;
52
+ //#endregion
50
53
  }
51
- IndexedDBAdapter.prototype.getStorenameForModel = function (modelConstructor) {
52
- var namespace = this.namespaceResolver(modelConstructor);
53
- var modelName = modelConstructor.name;
54
- return getStorename(namespace, modelName);
55
- };
56
- // Retrieves primary key values from a model
57
- IndexedDBAdapter.prototype.getIndexKeyValuesFromModel = function (model) {
58
- var modelConstructor = Object.getPrototypeOf(model)
59
- .constructor;
60
- var namespaceName = this.namespaceResolver(modelConstructor);
61
- var keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
62
- return extractPrimaryKeyValues(model, keys);
63
- };
64
- IndexedDBAdapter.prototype.checkPrivate = function () {
54
+ // checks are called by StorageAdapterBase class
55
+ IndexedDBAdapter.prototype.preSetUpChecks = function () {
65
56
  return __awaiter(this, void 0, void 0, function () {
66
- var isPrivate;
67
57
  return __generator(this, function (_a) {
68
58
  switch (_a.label) {
69
- case 0: return [4 /*yield*/, isPrivateMode().then(function (isPrivate) {
70
- return isPrivate;
71
- })];
59
+ case 0: return [4 /*yield*/, this.checkPrivate()];
72
60
  case 1:
73
- isPrivate = _a.sent();
74
- if (isPrivate) {
75
- logger.error("IndexedDB not supported in this browser's private mode");
76
- return [2 /*return*/, Promise.reject("IndexedDB not supported in this browser's private mode")];
77
- }
78
- else {
79
- return [2 /*return*/, Promise.resolve()];
80
- }
61
+ _a.sent();
62
+ return [4 /*yield*/, this.setSafariCompatabilityMode()];
63
+ case 2:
64
+ _a.sent();
81
65
  return [2 /*return*/];
82
66
  }
83
67
  });
84
68
  });
85
69
  };
86
- /**
87
- * Whether the browser's implementation of IndexedDB is coercing single-field
88
- * indexes to a scalar key.
89
- *
90
- * If this returns `true`, we need to treat indexes containing a single field
91
- * as scalars.
92
- *
93
- * See PR description for reference:
94
- * https://github.com/aws-amplify/amplify-js/pull/10527
95
- */
96
- IndexedDBAdapter.prototype.setSafariCompatabilityMode = function () {
70
+ IndexedDBAdapter.prototype.preOpCheck = function () {
97
71
  return __awaiter(this, void 0, void 0, function () {
98
- var _a;
99
- return __generator(this, function (_b) {
100
- switch (_b.label) {
101
- case 0:
102
- _a = this;
103
- return [4 /*yield*/, isSafariCompatabilityMode()];
72
+ return __generator(this, function (_a) {
73
+ switch (_a.label) {
74
+ case 0: return [4 /*yield*/, this.checkPrivate()];
104
75
  case 1:
105
- _a.safariCompatabilityMode = _b.sent();
106
- if (this.safariCompatabilityMode === true) {
107
- logger.debug('IndexedDB Adapter is running in Safari Compatability Mode');
108
- }
76
+ _a.sent();
109
77
  return [2 /*return*/];
110
78
  }
111
79
  });
112
80
  });
113
81
  };
114
- IndexedDBAdapter.prototype.getNamespaceAndModelFromStorename = function (storeName) {
115
- var _a = __read(storeName.split('_')), namespaceName = _a[0], modelNameArr = _a.slice(1);
116
- return {
117
- namespaceName: namespaceName,
118
- modelName: modelNameArr.join('_'),
119
- };
120
- };
121
- IndexedDBAdapter.prototype.setUp = function (theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName, sessionId) {
82
+ /**
83
+ * Initialize IndexedDB database
84
+ * Create new DB if one doesn't exist
85
+ * Upgrade outdated DB
86
+ *
87
+ * Called by `StorageAdapterBase.setUp()`
88
+ *
89
+ * @returns IDB Database instance
90
+ */
91
+ IndexedDBAdapter.prototype.initDb = function () {
122
92
  return __awaiter(this, void 0, void 0, function () {
123
- var VERSION, _a, error_1;
124
93
  var _this = this;
125
- return __generator(this, function (_b) {
126
- switch (_b.label) {
127
- case 0: return [4 /*yield*/, this.checkPrivate()];
128
- case 1:
129
- _b.sent();
130
- return [4 /*yield*/, this.setSafariCompatabilityMode()];
131
- case 2:
132
- _b.sent();
133
- if (!!this.initPromise) return [3 /*break*/, 3];
134
- this.initPromise = new Promise(function (res, rej) {
135
- _this.resolve = res;
136
- _this.reject = rej;
137
- });
138
- return [3 /*break*/, 5];
139
- case 3: return [4 /*yield*/, this.initPromise];
140
- case 4:
141
- _b.sent();
142
- _b.label = 5;
143
- case 5:
144
- if (sessionId) {
145
- this.dbName = DB_NAME + "-" + sessionId;
146
- }
147
- this.schema = theSchema;
148
- this.namespaceResolver = namespaceResolver;
149
- this.modelInstanceCreator = modelInstanceCreator;
150
- this.getModelConstructorByModelName = getModelConstructorByModelName;
151
- _b.label = 6;
152
- case 6:
153
- _b.trys.push([6, 9, , 10]);
154
- if (!!this.db) return [3 /*break*/, 8];
155
- VERSION = 3;
156
- _a = this;
157
- return [4 /*yield*/, idb.openDB(this.dbName, VERSION, {
158
- upgrade: function (db, oldVersion, newVersion, txn) { return __awaiter(_this, void 0, void 0, function () {
159
- var _a, _b, storeName, origStore, tmpName, _c, namespaceName, modelName, modelInCurrentSchema, newStore, cursor, count, e_1_1, error_2;
160
- var e_1, _d;
161
- var _this = this;
162
- return __generator(this, function (_e) {
163
- switch (_e.label) {
164
- case 0:
165
- if (oldVersion === 0) {
166
- Object.keys(theSchema.namespaces).forEach(function (namespaceName) {
167
- var namespace = theSchema.namespaces[namespaceName];
168
- Object.keys(namespace.models).forEach(function (modelName) {
169
- var storeName = getStorename(namespaceName, modelName);
170
- _this.createObjectStoreForModel(db, namespaceName, storeName, modelName);
171
- });
94
+ return __generator(this, function (_a) {
95
+ switch (_a.label) {
96
+ case 0: return [4 /*yield*/, idb.openDB(this.dbName, DB_VERSION, {
97
+ upgrade: function (db, oldVersion, newVersion, txn) { return __awaiter(_this, void 0, void 0, function () {
98
+ var _a, _b, storeName, origStore, tmpName, _c, namespaceName, modelName, modelInCurrentSchema, newStore, cursor, count, e_1_1, error_1;
99
+ var e_1, _d;
100
+ var _this = this;
101
+ return __generator(this, function (_e) {
102
+ switch (_e.label) {
103
+ case 0:
104
+ // create new database
105
+ if (oldVersion === 0) {
106
+ Object.keys(this.schema.namespaces).forEach(function (namespaceName) {
107
+ var namespace = _this.schema.namespaces[namespaceName];
108
+ Object.keys(namespace.models).forEach(function (modelName) {
109
+ var storeName = getStorename(namespaceName, modelName);
110
+ _this.createObjectStoreForModel(db, namespaceName, storeName, modelName);
172
111
  });
173
- return [2 /*return*/];
174
- }
175
- if (!((oldVersion === 1 || oldVersion === 2) && newVersion === 3)) return [3 /*break*/, 16];
176
- _e.label = 1;
177
- case 1:
178
- _e.trys.push([1, 14, , 15]);
179
- _e.label = 2;
180
- case 2:
181
- _e.trys.push([2, 11, 12, 13]);
182
- _a = __values(txn.objectStoreNames), _b = _a.next();
183
- _e.label = 3;
184
- case 3:
185
- if (!!_b.done) return [3 /*break*/, 10];
186
- storeName = _b.value;
187
- origStore = txn.objectStore(storeName);
188
- tmpName = "tmp_" + storeName;
189
- origStore.name = tmpName;
190
- _c = this.getNamespaceAndModelFromStorename(storeName), namespaceName = _c.namespaceName, modelName = _c.modelName;
191
- modelInCurrentSchema = modelName in this.schema.namespaces[namespaceName].models;
192
- if (!modelInCurrentSchema) {
193
- // delete original
194
- db.deleteObjectStore(tmpName);
195
- return [3 /*break*/, 9];
196
- }
197
- newStore = this.createObjectStoreForModel(db, namespaceName, storeName, modelName);
198
- return [4 /*yield*/, origStore.openCursor()];
199
- case 4:
200
- cursor = _e.sent();
201
- count = 0;
202
- _e.label = 5;
203
- case 5:
204
- if (!(cursor && cursor.value)) return [3 /*break*/, 8];
205
- // we don't pass key, since they are all new entries in the new store
206
- return [4 /*yield*/, newStore.put(cursor.value)];
207
- case 6:
208
- // we don't pass key, since they are all new entries in the new store
209
- _e.sent();
210
- return [4 /*yield*/, cursor.continue()];
211
- case 7:
212
- cursor = _e.sent();
213
- count++;
214
- return [3 /*break*/, 5];
215
- case 8:
112
+ });
113
+ return [2 /*return*/];
114
+ }
115
+ if (!((oldVersion === 1 || oldVersion === 2) && newVersion === 3)) return [3 /*break*/, 16];
116
+ _e.label = 1;
117
+ case 1:
118
+ _e.trys.push([1, 14, , 15]);
119
+ _e.label = 2;
120
+ case 2:
121
+ _e.trys.push([2, 11, 12, 13]);
122
+ _a = __values(txn.objectStoreNames), _b = _a.next();
123
+ _e.label = 3;
124
+ case 3:
125
+ if (!!_b.done) return [3 /*break*/, 10];
126
+ storeName = _b.value;
127
+ origStore = txn.objectStore(storeName);
128
+ tmpName = "tmp_" + storeName;
129
+ origStore.name = tmpName;
130
+ _c = this.getNamespaceAndModelFromStorename(storeName), namespaceName = _c.namespaceName, modelName = _c.modelName;
131
+ modelInCurrentSchema = modelName in this.schema.namespaces[namespaceName].models;
132
+ if (!modelInCurrentSchema) {
216
133
  // delete original
217
134
  db.deleteObjectStore(tmpName);
218
- logger.debug(count + " " + storeName + " records migrated");
219
- _e.label = 9;
220
- case 9:
221
- _b = _a.next();
222
- return [3 /*break*/, 3];
223
- case 10: return [3 /*break*/, 13];
224
- case 11:
225
- e_1_1 = _e.sent();
226
- e_1 = { error: e_1_1 };
227
- return [3 /*break*/, 13];
228
- case 12:
229
- try {
230
- if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
231
- }
232
- finally { if (e_1) throw e_1.error; }
233
- return [7 /*endfinally*/];
234
- case 13:
235
- // add new models created after IndexedDB, but before migration
236
- // this case may happen when a user has not opened an app for
237
- // some time and a new model is added during that time
238
- Object.keys(theSchema.namespaces).forEach(function (namespaceName) {
239
- var namespace = theSchema.namespaces[namespaceName];
240
- var objectStoreNames = new Set(txn.objectStoreNames);
241
- Object.keys(namespace.models)
242
- .map(function (modelName) {
243
- return [
244
- modelName,
245
- getStorename(namespaceName, modelName),
246
- ];
247
- })
248
- .filter(function (_a) {
249
- var _b = __read(_a, 2), storeName = _b[1];
250
- return !objectStoreNames.has(storeName);
251
- })
252
- .forEach(function (_a) {
253
- var _b = __read(_a, 2), modelName = _b[0], storeName = _b[1];
254
- _this.createObjectStoreForModel(db, namespaceName, storeName, modelName);
255
- });
135
+ return [3 /*break*/, 9];
136
+ }
137
+ newStore = this.createObjectStoreForModel(db, namespaceName, storeName, modelName);
138
+ return [4 /*yield*/, origStore.openCursor()];
139
+ case 4:
140
+ cursor = _e.sent();
141
+ count = 0;
142
+ _e.label = 5;
143
+ case 5:
144
+ if (!(cursor && cursor.value)) return [3 /*break*/, 8];
145
+ // we don't pass key, since they are all new entries in the new store
146
+ return [4 /*yield*/, newStore.put(cursor.value)];
147
+ case 6:
148
+ // we don't pass key, since they are all new entries in the new store
149
+ _e.sent();
150
+ return [4 /*yield*/, cursor.continue()];
151
+ case 7:
152
+ cursor = _e.sent();
153
+ count++;
154
+ return [3 /*break*/, 5];
155
+ case 8:
156
+ // delete original
157
+ db.deleteObjectStore(tmpName);
158
+ logger.debug(count + " " + storeName + " records migrated");
159
+ _e.label = 9;
160
+ case 9:
161
+ _b = _a.next();
162
+ return [3 /*break*/, 3];
163
+ case 10: return [3 /*break*/, 13];
164
+ case 11:
165
+ e_1_1 = _e.sent();
166
+ e_1 = { error: e_1_1 };
167
+ return [3 /*break*/, 13];
168
+ case 12:
169
+ try {
170
+ if (_b && !_b.done && (_d = _a.return)) _d.call(_a);
171
+ }
172
+ finally { if (e_1) throw e_1.error; }
173
+ return [7 /*endfinally*/];
174
+ case 13:
175
+ // add new models created after IndexedDB, but before migration
176
+ // this case may happen when a user has not opened an app for
177
+ // some time and a new model is added during that time
178
+ Object.keys(this.schema.namespaces).forEach(function (namespaceName) {
179
+ var namespace = _this.schema.namespaces[namespaceName];
180
+ var objectStoreNames = new Set(txn.objectStoreNames);
181
+ Object.keys(namespace.models)
182
+ .map(function (modelName) {
183
+ return [modelName, getStorename(namespaceName, modelName)];
184
+ })
185
+ .filter(function (_a) {
186
+ var _b = __read(_a, 2), storeName = _b[1];
187
+ return !objectStoreNames.has(storeName);
188
+ })
189
+ .forEach(function (_a) {
190
+ var _b = __read(_a, 2), modelName = _b[0], storeName = _b[1];
191
+ _this.createObjectStoreForModel(db, namespaceName, storeName, modelName);
256
192
  });
257
- return [3 /*break*/, 15];
258
- case 14:
259
- error_2 = _e.sent();
260
- logger.error('Error migrating IndexedDB data', error_2);
261
- txn.abort();
262
- throw error_2;
263
- case 15: return [2 /*return*/];
264
- case 16: return [2 /*return*/];
265
- }
266
- });
267
- }); },
268
- })];
269
- case 7:
270
- _a.db = _b.sent();
271
- this.resolve();
272
- _b.label = 8;
273
- case 8: return [3 /*break*/, 10];
274
- case 9:
275
- error_1 = _b.sent();
276
- this.reject(error_1);
277
- return [3 /*break*/, 10];
278
- case 10: return [2 /*return*/];
193
+ });
194
+ return [3 /*break*/, 15];
195
+ case 14:
196
+ error_1 = _e.sent();
197
+ logger.error('Error migrating IndexedDB data', error_1);
198
+ txn.abort();
199
+ throw error_1;
200
+ case 15: return [2 /*return*/];
201
+ case 16: return [2 /*return*/];
202
+ }
203
+ });
204
+ }); },
205
+ })];
206
+ case 1: return [2 /*return*/, _a.sent()];
279
207
  }
280
208
  });
281
209
  });
@@ -302,45 +230,41 @@ var IndexedDBAdapter = /** @class */ (function () {
302
230
  });
303
231
  });
304
232
  };
233
+ IndexedDBAdapter.prototype.clear = function () {
234
+ var _a;
235
+ return __awaiter(this, void 0, void 0, function () {
236
+ return __generator(this, function (_b) {
237
+ switch (_b.label) {
238
+ case 0: return [4 /*yield*/, this.checkPrivate()];
239
+ case 1:
240
+ _b.sent();
241
+ (_a = this.db) === null || _a === void 0 ? void 0 : _a.close();
242
+ return [4 /*yield*/, idb.deleteDB(this.dbName)];
243
+ case 2:
244
+ _b.sent();
245
+ this.db = undefined;
246
+ this.initPromise = undefined;
247
+ return [2 /*return*/];
248
+ }
249
+ });
250
+ });
251
+ };
305
252
  IndexedDBAdapter.prototype.save = function (model, condition) {
306
253
  var e_2, _a;
307
254
  return __awaiter(this, void 0, void 0, function () {
308
- var modelConstructor, storeName, namespaceName, connectedModels, set, connectionStoreNames, tx, store, keyValues, fromDB, predicates, _b, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, keys, store_1, itemKeyValues, fromDB_1, opType, modelKeyValues, key, e_2_1;
309
- var _this = this;
255
+ var _b, storeName, set, connectionStoreNames, modelKeyValues, tx, store, fromDB, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, keys, store_1, itemKeyValues, fromDB_1, opType, key, e_2_1;
310
256
  return __generator(this, function (_c) {
311
257
  switch (_c.label) {
312
258
  case 0: return [4 /*yield*/, this.checkPrivate()];
313
259
  case 1:
314
260
  _c.sent();
315
- modelConstructor = Object.getPrototypeOf(model)
316
- .constructor;
317
- storeName = this.getStorenameForModel(modelConstructor);
318
- namespaceName = this.namespaceResolver(modelConstructor);
319
- connectedModels = traverseModel(modelConstructor.name, model, this.schema.namespaces[namespaceName], this.modelInstanceCreator, this.getModelConstructorByModelName);
320
- set = new Set();
321
- connectionStoreNames = Object.values(connectedModels).map(function (_a) {
322
- var modelName = _a.modelName, item = _a.item, instance = _a.instance;
323
- var storeName = getStorename(namespaceName, modelName);
324
- set.add(storeName);
325
- var keys = getIndexKeys(_this.schema.namespaces[namespaceName], modelName);
326
- return { storeName: storeName, item: item, instance: instance, keys: keys };
327
- });
261
+ _b = this.saveMetadata(model), storeName = _b.storeName, set = _b.set, connectionStoreNames = _b.connectionStoreNames, modelKeyValues = _b.modelKeyValues;
328
262
  tx = this.db.transaction(__spread([storeName], Array.from(set.values())), 'readwrite');
329
263
  store = tx.objectStore(storeName);
330
- keyValues = this.getIndexKeyValuesFromModel(model);
331
- return [4 /*yield*/, this._get(store, keyValues)];
264
+ return [4 /*yield*/, this._get(store, modelKeyValues)];
332
265
  case 2:
333
266
  fromDB = _c.sent();
334
- if (condition && fromDB) {
335
- predicates = ModelPredicateCreator.getPredicates(condition);
336
- _b = predicates || {}, predicateObjs = _b.predicates, type = _b.type;
337
- isValid = validatePredicate(fromDB, type, predicateObjs);
338
- if (!isValid) {
339
- msg = 'Conditional update failed';
340
- logger.error(msg, { model: fromDB, condition: predicateObjs });
341
- throw new Error(msg);
342
- }
343
- }
267
+ this.validateSaveCondition(condition, fromDB);
344
268
  result = [];
345
269
  _c.label = 3;
346
270
  case 3:
@@ -353,15 +277,11 @@ var IndexedDBAdapter = /** @class */ (function () {
353
277
  resItem = connectionStoreNames_1_1.value;
354
278
  storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance, keys = resItem.keys;
355
279
  store_1 = tx.objectStore(storeName_1);
356
- itemKeyValues = keys.map(function (key) {
357
- var value = item[key];
358
- return value;
359
- });
280
+ itemKeyValues = keys.map(function (key) { return item[key]; });
360
281
  return [4 /*yield*/, this._get(store_1, itemKeyValues)];
361
282
  case 6:
362
283
  fromDB_1 = _c.sent();
363
- opType = fromDB_1 === undefined ? OpType.INSERT : OpType.UPDATE;
364
- modelKeyValues = this.getIndexKeyValuesFromModel(model);
284
+ opType = fromDB_1 ? OpType.UPDATE : OpType.INSERT;
365
285
  if (!(keysEqual(itemKeyValues, modelKeyValues) ||
366
286
  opType === OpType.INSERT)) return [3 /*break*/, 9];
367
287
  return [4 /*yield*/, store_1
@@ -400,45 +320,16 @@ var IndexedDBAdapter = /** @class */ (function () {
400
320
  });
401
321
  });
402
322
  };
403
- IndexedDBAdapter.prototype.load = function (namespaceName, srcModelName, records) {
404
- return __awaiter(this, void 0, void 0, function () {
405
- var namespace, relations, connectionStoreNames, modelConstructor;
406
- var _this = this;
407
- return __generator(this, function (_a) {
408
- namespace = this.schema.namespaces[namespaceName];
409
- relations = namespace.relationships[srcModelName].relationTypes;
410
- connectionStoreNames = relations.map(function (_a) {
411
- var modelName = _a.modelName;
412
- return getStorename(namespaceName, modelName);
413
- });
414
- modelConstructor = this.getModelConstructorByModelName(namespaceName, srcModelName);
415
- if (connectionStoreNames.length === 0) {
416
- return [2 /*return*/, records.map(function (record) {
417
- return _this.modelInstanceCreator(modelConstructor, record);
418
- })];
419
- }
420
- return [2 /*return*/, records.map(function (record) {
421
- return _this.modelInstanceCreator(modelConstructor, record);
422
- })];
423
- });
424
- });
425
- };
426
323
  IndexedDBAdapter.prototype.query = function (modelConstructor, predicate, pagination) {
427
324
  return __awaiter(this, void 0, void 0, function () {
428
- var storeName, namespaceName, predicates, keyPath, queryByKey, hasSort, hasPagination, records;
325
+ var _a, storeName, namespaceName, queryByKey, predicates, hasSort, hasPagination, records;
429
326
  var _this = this;
430
- return __generator(this, function (_a) {
431
- switch (_a.label) {
327
+ return __generator(this, function (_b) {
328
+ switch (_b.label) {
432
329
  case 0: return [4 /*yield*/, this.checkPrivate()];
433
330
  case 1:
434
- _a.sent();
435
- storeName = this.getStorenameForModel(modelConstructor);
436
- namespaceName = this.namespaceResolver(modelConstructor);
437
- predicates = predicate && ModelPredicateCreator.getPredicates(predicate);
438
- keyPath = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
439
- queryByKey = predicates && this.keyValueFromPredicate(predicates, keyPath);
440
- hasSort = pagination && pagination.sort;
441
- hasPagination = pagination && pagination.limit;
331
+ _b.sent();
332
+ _a = this.queryMetadata(modelConstructor, predicate, pagination), storeName = _a.storeName, namespaceName = _a.namespaceName, queryByKey = _a.queryByKey, predicates = _a.predicates, hasSort = _a.hasSort, hasPagination = _a.hasPagination;
442
333
  return [4 /*yield*/, (function () { return __awaiter(_this, void 0, void 0, function () {
443
334
  var record, filtered, all;
444
335
  return __generator(this, function (_a) {
@@ -470,80 +361,424 @@ var IndexedDBAdapter = /** @class */ (function () {
470
361
  });
471
362
  }); })()];
472
363
  case 2:
473
- records = (_a.sent());
364
+ records = (_b.sent());
474
365
  return [4 /*yield*/, this.load(namespaceName, modelConstructor.name, records)];
475
- case 3: return [2 /*return*/, _a.sent()];
366
+ case 3: return [2 /*return*/, _b.sent()];
476
367
  }
477
368
  });
478
369
  });
479
370
  };
480
- IndexedDBAdapter.prototype.getByKey = function (storeName, keyValue) {
371
+ IndexedDBAdapter.prototype.queryOne = function (modelConstructor, firstOrLast) {
372
+ if (firstOrLast === void 0) { firstOrLast = QueryOne.FIRST; }
481
373
  return __awaiter(this, void 0, void 0, function () {
374
+ var storeName, cursor, result;
482
375
  return __generator(this, function (_a) {
483
376
  switch (_a.label) {
484
- case 0: return [4 /*yield*/, this._get(storeName, keyValue)];
485
- case 1: return [2 /*return*/, _a.sent()];
377
+ case 0: return [4 /*yield*/, this.checkPrivate()];
378
+ case 1:
379
+ _a.sent();
380
+ storeName = this.getStorenameForModel(modelConstructor);
381
+ return [4 /*yield*/, this.db
382
+ .transaction([storeName], 'readonly')
383
+ .objectStore(storeName)
384
+ .openCursor(undefined, firstOrLast === QueryOne.FIRST ? 'next' : 'prev')];
385
+ case 2:
386
+ cursor = _a.sent();
387
+ result = cursor ? cursor.value : undefined;
388
+ return [2 /*return*/, result && this.modelInstanceCreator(modelConstructor, result)];
486
389
  }
487
390
  });
488
391
  });
489
392
  };
490
- IndexedDBAdapter.prototype.getAll = function (storeName) {
393
+ IndexedDBAdapter.prototype.batchSave = function (modelConstructor, items) {
491
394
  return __awaiter(this, void 0, void 0, function () {
492
- return __generator(this, function (_a) {
493
- switch (_a.label) {
494
- case 0: return [4 /*yield*/, this.db.getAll(storeName)];
495
- case 1: return [2 /*return*/, _a.sent()];
395
+ var modelName, namespaceName, storeName, result, txn, store, _loop_1, this_1, items_1, items_1_1, item, e_3_1;
396
+ var e_3, _a;
397
+ var _this = this;
398
+ return __generator(this, function (_b) {
399
+ switch (_b.label) {
400
+ case 0: return [4 /*yield*/, this.checkPrivate()];
401
+ case 1:
402
+ _b.sent();
403
+ if (items.length === 0) {
404
+ return [2 /*return*/, []];
405
+ }
406
+ modelName = modelConstructor.name;
407
+ namespaceName = this.namespaceResolver(modelConstructor);
408
+ storeName = this.getStorenameForModel(modelConstructor);
409
+ result = [];
410
+ txn = this.db.transaction(storeName, 'readwrite');
411
+ store = txn.store;
412
+ _loop_1 = function (item) {
413
+ var model, connectedModels, keyValues, _deleted, index, key, instance;
414
+ return __generator(this, function (_a) {
415
+ switch (_a.label) {
416
+ case 0:
417
+ model = this_1.modelInstanceCreator(modelConstructor, item);
418
+ connectedModels = traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
419
+ keyValues = this_1.getIndexKeyValuesFromModel(model);
420
+ _deleted = item._deleted;
421
+ index = store.index('byPk');
422
+ return [4 /*yield*/, index.getKey(this_1.canonicalKeyPath(keyValues))];
423
+ case 1:
424
+ key = _a.sent();
425
+ if (!!_deleted) return [3 /*break*/, 3];
426
+ instance = connectedModels.find(function (_a) {
427
+ var instance = _a.instance;
428
+ var instanceKeyValues = _this.getIndexKeyValuesFromModel(instance);
429
+ return keysEqual(instanceKeyValues, keyValues);
430
+ }).instance;
431
+ result.push([
432
+ instance,
433
+ key ? OpType.UPDATE : OpType.INSERT,
434
+ ]);
435
+ return [4 /*yield*/, store.put(instance, key)];
436
+ case 2:
437
+ _a.sent();
438
+ return [3 /*break*/, 5];
439
+ case 3:
440
+ result.push([item, OpType.DELETE]);
441
+ if (!key) return [3 /*break*/, 5];
442
+ return [4 /*yield*/, store.delete(key)];
443
+ case 4:
444
+ _a.sent();
445
+ _a.label = 5;
446
+ case 5: return [2 /*return*/];
447
+ }
448
+ });
449
+ };
450
+ this_1 = this;
451
+ _b.label = 2;
452
+ case 2:
453
+ _b.trys.push([2, 7, 8, 9]);
454
+ items_1 = __values(items), items_1_1 = items_1.next();
455
+ _b.label = 3;
456
+ case 3:
457
+ if (!!items_1_1.done) return [3 /*break*/, 6];
458
+ item = items_1_1.value;
459
+ return [5 /*yield**/, _loop_1(item)];
460
+ case 4:
461
+ _b.sent();
462
+ _b.label = 5;
463
+ case 5:
464
+ items_1_1 = items_1.next();
465
+ return [3 /*break*/, 3];
466
+ case 6: return [3 /*break*/, 9];
467
+ case 7:
468
+ e_3_1 = _b.sent();
469
+ e_3 = { error: e_3_1 };
470
+ return [3 /*break*/, 9];
471
+ case 8:
472
+ try {
473
+ if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
474
+ }
475
+ finally { if (e_3) throw e_3.error; }
476
+ return [7 /*endfinally*/];
477
+ case 9: return [4 /*yield*/, txn.done];
478
+ case 10:
479
+ _b.sent();
480
+ return [2 /*return*/, result];
496
481
  }
497
482
  });
498
483
  });
499
484
  };
500
- IndexedDBAdapter.prototype.keyValueFromPredicate = function (predicates, keyPath) {
501
- var e_3, _a;
502
- var predicateObjs = predicates.predicates;
503
- if (predicateObjs.length !== keyPath.length) {
504
- return;
505
- }
506
- var keyValues = [];
507
- var _loop_1 = function (key) {
508
- var predicateObj = predicateObjs.find(function (p) {
509
- // it's a relevant predicate object only if it's an equality
510
- // operation for a key field from the key:
511
- return isPredicateObj(p) &&
512
- p.field === key &&
513
- p.operator === 'eq' &&
514
- // it's only valid if it's not nullish.
515
- // (IDB will throw a fit if it's nullish.)
516
- p.operand !== null &&
517
- p.operand !== undefined;
518
- });
519
- predicateObj && keyValues.push(predicateObj.operand);
520
- };
521
- try {
522
- for (var keyPath_1 = __values(keyPath), keyPath_1_1 = keyPath_1.next(); !keyPath_1_1.done; keyPath_1_1 = keyPath_1.next()) {
523
- var key = keyPath_1_1.value;
524
- _loop_1(key);
525
- }
526
- }
527
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
528
- finally {
529
- try {
530
- if (keyPath_1_1 && !keyPath_1_1.done && (_a = keyPath_1.return)) _a.call(keyPath_1);
531
- }
532
- finally { if (e_3) throw e_3.error; }
533
- }
534
- return keyValues.length === keyPath.length ? keyValues : undefined;
535
- };
536
- /**
537
- * Tries to generate an index fetcher for the given predicates. Assumes
538
- * that the given predicate conditions are contained by an AND group and
539
- * should therefore all match a single record.
540
- *
541
- * @param storeName The table to query.
542
- * @param predicates The predicates to try to AND together.
485
+ IndexedDBAdapter.prototype.deleteItem = function (deleteQueue) {
486
+ var e_4, _a, e_5, _b;
487
+ return __awaiter(this, void 0, void 0, function () {
488
+ var connectionStoreNames, tx, _c, _d, deleteItem, storeName, items, store, items_2, items_2_1, item, key, keyValues, itemKey, e_5_1, e_4_1;
489
+ return __generator(this, function (_e) {
490
+ switch (_e.label) {
491
+ case 0:
492
+ connectionStoreNames = deleteQueue.map(function (_a) {
493
+ var storeName = _a.storeName;
494
+ return storeName;
495
+ });
496
+ tx = this.db.transaction(__spread(connectionStoreNames), 'readwrite');
497
+ _e.label = 1;
498
+ case 1:
499
+ _e.trys.push([1, 22, 23, 28]);
500
+ _c = __asyncValues(deleteQueue);
501
+ _e.label = 2;
502
+ case 2: return [4 /*yield*/, _c.next()];
503
+ case 3:
504
+ if (!(_d = _e.sent(), !_d.done)) return [3 /*break*/, 21];
505
+ deleteItem = _d.value;
506
+ storeName = deleteItem.storeName, items = deleteItem.items;
507
+ store = tx.objectStore(storeName);
508
+ _e.label = 4;
509
+ case 4:
510
+ _e.trys.push([4, 14, 15, 20]);
511
+ items_2 = __asyncValues(items);
512
+ _e.label = 5;
513
+ case 5: return [4 /*yield*/, items_2.next()];
514
+ case 6:
515
+ if (!(items_2_1 = _e.sent(), !items_2_1.done)) return [3 /*break*/, 13];
516
+ item = items_2_1.value;
517
+ if (!item) return [3 /*break*/, 12];
518
+ key = void 0;
519
+ if (!(typeof item === 'object')) return [3 /*break*/, 8];
520
+ keyValues = this.getIndexKeyValuesFromModel(item);
521
+ return [4 /*yield*/, store
522
+ .index('byPk')
523
+ .getKey(this.canonicalKeyPath(keyValues))];
524
+ case 7:
525
+ key = _e.sent();
526
+ return [3 /*break*/, 10];
527
+ case 8:
528
+ itemKey = item.toString();
529
+ return [4 /*yield*/, store.index('byPk').getKey(itemKey)];
530
+ case 9:
531
+ key = _e.sent();
532
+ _e.label = 10;
533
+ case 10:
534
+ if (!(key !== undefined)) return [3 /*break*/, 12];
535
+ return [4 /*yield*/, store.delete(key)];
536
+ case 11:
537
+ _e.sent();
538
+ _e.label = 12;
539
+ case 12: return [3 /*break*/, 5];
540
+ case 13: return [3 /*break*/, 20];
541
+ case 14:
542
+ e_5_1 = _e.sent();
543
+ e_5 = { error: e_5_1 };
544
+ return [3 /*break*/, 20];
545
+ case 15:
546
+ _e.trys.push([15, , 18, 19]);
547
+ if (!(items_2_1 && !items_2_1.done && (_b = items_2.return))) return [3 /*break*/, 17];
548
+ return [4 /*yield*/, _b.call(items_2)];
549
+ case 16:
550
+ _e.sent();
551
+ _e.label = 17;
552
+ case 17: return [3 /*break*/, 19];
553
+ case 18:
554
+ if (e_5) throw e_5.error;
555
+ return [7 /*endfinally*/];
556
+ case 19: return [7 /*endfinally*/];
557
+ case 20: return [3 /*break*/, 2];
558
+ case 21: return [3 /*break*/, 28];
559
+ case 22:
560
+ e_4_1 = _e.sent();
561
+ e_4 = { error: e_4_1 };
562
+ return [3 /*break*/, 28];
563
+ case 23:
564
+ _e.trys.push([23, , 26, 27]);
565
+ if (!(_d && !_d.done && (_a = _c.return))) return [3 /*break*/, 25];
566
+ return [4 /*yield*/, _a.call(_c)];
567
+ case 24:
568
+ _e.sent();
569
+ _e.label = 25;
570
+ case 25: return [3 /*break*/, 27];
571
+ case 26:
572
+ if (e_4) throw e_4.error;
573
+ return [7 /*endfinally*/];
574
+ case 27: return [7 /*endfinally*/];
575
+ case 28: return [2 /*return*/];
576
+ }
577
+ });
578
+ });
579
+ };
580
+ /**
581
+ * Gets related Has One record for `model`
582
+ *
583
+ * @param model
584
+ * @param srcModel
585
+ * @param namespace
586
+ * @param rel
587
+ * @returns
588
+ */
589
+ IndexedDBAdapter.prototype.getHasOneChild = function (model, srcModel, namespace, rel) {
590
+ return __awaiter(this, void 0, void 0, function () {
591
+ var hasOneIndex, modelName, targetNames, storeName, values, recordToDelete;
592
+ return __generator(this, function (_a) {
593
+ switch (_a.label) {
594
+ case 0:
595
+ hasOneIndex = 'byPk';
596
+ modelName = rel.modelName, targetNames = rel.targetNames;
597
+ storeName = getStorename(namespace, modelName);
598
+ values = targetNames
599
+ .filter(function (targetName) { var _a; return (_a = model[targetName]) !== null && _a !== void 0 ? _a : false; })
600
+ .map(function (targetName) { return model[targetName]; });
601
+ if (values.length === 0)
602
+ return [2 /*return*/];
603
+ return [4 /*yield*/, this.db
604
+ .transaction(storeName, 'readwrite')
605
+ .objectStore(storeName)
606
+ .index(hasOneIndex)
607
+ .get(this.canonicalKeyPath(values))];
608
+ case 1:
609
+ recordToDelete = (_a.sent());
610
+ return [2 /*return*/, recordToDelete];
611
+ }
612
+ });
613
+ });
614
+ };
615
+ /**
616
+ * Backwards compatability for pre-CPK codegen
617
+ * TODO - deprecate this in v6; will need to re-gen MIPR for older unit
618
+ * tests that hit this path
619
+ */
620
+ IndexedDBAdapter.prototype.getHasOneChildLegacy = function (model, srcModel, namespace, rel) {
621
+ return __awaiter(this, void 0, void 0, function () {
622
+ var hasOneIndex, modelName, targetName, storeName, index, values, value, recordToDelete;
623
+ return __generator(this, function (_a) {
624
+ switch (_a.label) {
625
+ case 0:
626
+ hasOneIndex = 'byPk';
627
+ modelName = rel.modelName, targetName = rel.targetName;
628
+ storeName = getStorename(namespace, modelName);
629
+ if (targetName && targetName in model) {
630
+ index = hasOneIndex;
631
+ value = model[targetName];
632
+ if (value === null) {
633
+ return [2 /*return*/];
634
+ }
635
+ values = [value];
636
+ }
637
+ else {
638
+ // backwards compatability for older versions of codegen that did not emit targetName for HAS_ONE relations
639
+ index = getIndex(this.schema.namespaces[namespace].relationships[modelName]
640
+ .relationTypes, srcModel);
641
+ values = this.getIndexKeyValuesFromModel(model);
642
+ }
643
+ if (!values || !index)
644
+ return [2 /*return*/];
645
+ return [4 /*yield*/, this.db
646
+ .transaction(storeName, 'readwrite')
647
+ .objectStore(storeName)
648
+ .index(index)
649
+ .get(this.canonicalKeyPath(values))];
650
+ case 1:
651
+ recordToDelete = (_a.sent());
652
+ return [2 /*return*/, recordToDelete];
653
+ }
654
+ });
655
+ });
656
+ };
657
+ /**
658
+ * Gets related Has Many records by given `storeName`, `index`, and `keyValues`
659
+ *
660
+ * @param storeName
661
+ * @param index
662
+ * @param keyValues
663
+ * @returns
664
+ */
665
+ IndexedDBAdapter.prototype.getHasManyChildren = function (storeName, index, keyValues) {
666
+ return __awaiter(this, void 0, void 0, function () {
667
+ var childRecords;
668
+ return __generator(this, function (_a) {
669
+ switch (_a.label) {
670
+ case 0: return [4 /*yield*/, this.db
671
+ .transaction(storeName, 'readwrite')
672
+ .objectStore(storeName)
673
+ .index(index)
674
+ .getAll(this.canonicalKeyPath(keyValues))];
675
+ case 1:
676
+ childRecords = _a.sent();
677
+ return [2 /*return*/, childRecords];
678
+ }
679
+ });
680
+ });
681
+ };
682
+ //#region platform-specific helper methods
683
+ IndexedDBAdapter.prototype.checkPrivate = function () {
684
+ return __awaiter(this, void 0, void 0, function () {
685
+ var isPrivate;
686
+ return __generator(this, function (_a) {
687
+ switch (_a.label) {
688
+ case 0: return [4 /*yield*/, isPrivateMode().then(function (isPrivate) {
689
+ return isPrivate;
690
+ })];
691
+ case 1:
692
+ isPrivate = _a.sent();
693
+ if (isPrivate) {
694
+ logger.error("IndexedDB not supported in this browser's private mode");
695
+ return [2 /*return*/, Promise.reject("IndexedDB not supported in this browser's private mode")];
696
+ }
697
+ else {
698
+ return [2 /*return*/, Promise.resolve()];
699
+ }
700
+ return [2 /*return*/];
701
+ }
702
+ });
703
+ });
704
+ };
705
+ /**
706
+ * Whether the browser's implementation of IndexedDB is coercing single-field
707
+ * indexes to a scalar key.
708
+ *
709
+ * If this returns `true`, we need to treat indexes containing a single field
710
+ * as scalars.
711
+ *
712
+ * See PR description for reference:
713
+ * https://github.com/aws-amplify/amplify-js/pull/10527
714
+ */
715
+ IndexedDBAdapter.prototype.setSafariCompatabilityMode = function () {
716
+ return __awaiter(this, void 0, void 0, function () {
717
+ var _a;
718
+ return __generator(this, function (_b) {
719
+ switch (_b.label) {
720
+ case 0:
721
+ _a = this;
722
+ return [4 /*yield*/, isSafariCompatabilityMode()];
723
+ case 1:
724
+ _a.safariCompatabilityMode = _b.sent();
725
+ if (this.safariCompatabilityMode === true) {
726
+ logger.debug('IndexedDB Adapter is running in Safari Compatability Mode');
727
+ }
728
+ return [2 /*return*/];
729
+ }
730
+ });
731
+ });
732
+ };
733
+ IndexedDBAdapter.prototype.getNamespaceAndModelFromStorename = function (storeName) {
734
+ var _a = __read(storeName.split('_')), namespaceName = _a[0], modelNameArr = _a.slice(1);
735
+ return {
736
+ namespaceName: namespaceName,
737
+ modelName: modelNameArr.join('_'),
738
+ };
739
+ };
740
+ IndexedDBAdapter.prototype.createObjectStoreForModel = function (db, namespaceName, storeName, modelName) {
741
+ var store = db.createObjectStore(storeName, {
742
+ autoIncrement: true,
743
+ });
744
+ var indexes = this.schema.namespaces[namespaceName].relationships[modelName].indexes;
745
+ indexes.forEach(function (_a) {
746
+ var _b = __read(_a, 3), idxName = _b[0], keyPath = _b[1], options = _b[2];
747
+ store.createIndex(idxName, keyPath, options);
748
+ });
749
+ return store;
750
+ };
751
+ IndexedDBAdapter.prototype.getByKey = function (storeName, keyValue) {
752
+ return __awaiter(this, void 0, void 0, function () {
753
+ return __generator(this, function (_a) {
754
+ switch (_a.label) {
755
+ case 0: return [4 /*yield*/, this._get(storeName, keyValue)];
756
+ case 1: return [2 /*return*/, _a.sent()];
757
+ }
758
+ });
759
+ });
760
+ };
761
+ IndexedDBAdapter.prototype.getAll = function (storeName) {
762
+ return __awaiter(this, void 0, void 0, function () {
763
+ return __generator(this, function (_a) {
764
+ switch (_a.label) {
765
+ case 0: return [4 /*yield*/, this.db.getAll(storeName)];
766
+ case 1: return [2 /*return*/, _a.sent()];
767
+ }
768
+ });
769
+ });
770
+ };
771
+ /**
772
+ * Tries to generate an index fetcher for the given predicates. Assumes
773
+ * that the given predicate conditions are contained by an AND group and
774
+ * should therefore all match a single record.
775
+ *
776
+ * @param storeName The table to query.
777
+ * @param predicates The predicates to try to AND together.
543
778
  * @param transaction
544
779
  */
545
780
  IndexedDBAdapter.prototype.matchingIndexQueries = function (storeName, predicates, transaction) {
546
- var e_4, _a, e_5, _b;
781
+ var e_6, _a, e_7, _b;
547
782
  var _this = this;
548
783
  // could be expanded later to include `exec()` and a `cardinality` estimate?
549
784
  var queries = [];
@@ -554,21 +789,21 @@ var IndexedDBAdapter = /** @class */ (function () {
554
789
  predicateIndex.set(String(predicate.field), predicate);
555
790
  }
556
791
  }
557
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
792
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
558
793
  finally {
559
794
  try {
560
795
  if (predicates_1_1 && !predicates_1_1.done && (_a = predicates_1.return)) _a.call(predicates_1);
561
796
  }
562
- finally { if (e_4) throw e_4.error; }
797
+ finally { if (e_6) throw e_6.error; }
563
798
  }
564
799
  var store = transaction.objectStore(storeName);
565
800
  var _loop_2 = function (name_1) {
566
- var e_6, _a;
801
+ var e_8, _a;
567
802
  var idx = store.index(name_1);
568
803
  var keypath = Array.isArray(idx.keyPath) ? idx.keyPath : [idx.keyPath];
569
804
  var matchingPredicateValues = [];
570
805
  try {
571
- for (var keypath_1 = (e_6 = void 0, __values(keypath)), keypath_1_1 = keypath_1.next(); !keypath_1_1.done; keypath_1_1 = keypath_1.next()) {
806
+ for (var keypath_1 = (e_8 = void 0, __values(keypath)), keypath_1_1 = keypath_1.next(); !keypath_1_1.done; keypath_1_1 = keypath_1.next()) {
572
807
  var field = keypath_1_1.value;
573
808
  var p = predicateIndex.get(field);
574
809
  if (p && p.operand !== null && p.operand !== undefined) {
@@ -579,12 +814,12 @@ var IndexedDBAdapter = /** @class */ (function () {
579
814
  }
580
815
  }
581
816
  }
582
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
817
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
583
818
  finally {
584
819
  try {
585
820
  if (keypath_1_1 && !keypath_1_1.done && (_a = keypath_1.return)) _a.call(keypath_1);
586
821
  }
587
- finally { if (e_6) throw e_6.error; }
822
+ finally { if (e_8) throw e_8.error; }
588
823
  }
589
824
  // if we have a matching predicate field for each component of this index,
590
825
  // we can build a query for it. otherwise, we can't.
@@ -606,12 +841,12 @@ var IndexedDBAdapter = /** @class */ (function () {
606
841
  _loop_2(name_1);
607
842
  }
608
843
  }
609
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
844
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
610
845
  finally {
611
846
  try {
612
847
  if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
613
848
  }
614
- finally { if (e_5) throw e_5.error; }
849
+ finally { if (e_7) throw e_7.error; }
615
850
  }
616
851
  return queries;
617
852
  };
@@ -700,8 +935,8 @@ var IndexedDBAdapter = /** @class */ (function () {
700
935
  };
701
936
  IndexedDBAdapter.prototype.filterOnPredicate = function (storeName, predicates) {
702
937
  return __awaiter(this, void 0, void 0, function () {
703
- var predicateObjs, type, _a, groupType, indexedQueries, candidateResults, distinctResults, indexedQueries_1, indexedQueries_1_1, query, resultGroup, resultGroup_1, resultGroup_1_1, item, distinctificationString, e_7_1, filtered;
704
- var e_7, _b, e_8, _c;
938
+ var predicateObjs, type, _a, groupType, indexedQueries, candidateResults, distinctResults, indexedQueries_1, indexedQueries_1_1, query, resultGroup, resultGroup_1, resultGroup_1_1, item, distinctificationString, e_9_1, filtered;
939
+ var e_9, _b, e_10, _c;
705
940
  return __generator(this, function (_d) {
706
941
  switch (_d.label) {
707
942
  case 0:
@@ -733,18 +968,18 @@ var IndexedDBAdapter = /** @class */ (function () {
733
968
  case 6:
734
969
  resultGroup = _d.sent();
735
970
  try {
736
- for (resultGroup_1 = (e_8 = void 0, __values(resultGroup)), resultGroup_1_1 = resultGroup_1.next(); !resultGroup_1_1.done; resultGroup_1_1 = resultGroup_1.next()) {
971
+ for (resultGroup_1 = (e_10 = void 0, __values(resultGroup)), resultGroup_1_1 = resultGroup_1.next(); !resultGroup_1_1.done; resultGroup_1_1 = resultGroup_1.next()) {
737
972
  item = resultGroup_1_1.value;
738
973
  distinctificationString = JSON.stringify(item);
739
974
  distinctResults.set(distinctificationString, item);
740
975
  }
741
976
  }
742
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
977
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
743
978
  finally {
744
979
  try {
745
980
  if (resultGroup_1_1 && !resultGroup_1_1.done && (_c = resultGroup_1.return)) _c.call(resultGroup_1);
746
981
  }
747
- finally { if (e_8) throw e_8.error; }
982
+ finally { if (e_10) throw e_10.error; }
748
983
  }
749
984
  _d.label = 7;
750
985
  case 7:
@@ -752,14 +987,14 @@ var IndexedDBAdapter = /** @class */ (function () {
752
987
  return [3 /*break*/, 5];
753
988
  case 8: return [3 /*break*/, 11];
754
989
  case 9:
755
- e_7_1 = _d.sent();
756
- e_7 = { error: e_7_1 };
990
+ e_9_1 = _d.sent();
991
+ e_9 = { error: e_9_1 };
757
992
  return [3 /*break*/, 11];
758
993
  case 10:
759
994
  try {
760
995
  if (indexedQueries_1_1 && !indexedQueries_1_1.done && (_b = indexedQueries_1.return)) _b.call(indexedQueries_1);
761
996
  }
762
- finally { if (e_7) throw e_7.error; }
997
+ finally { if (e_9) throw e_9.error; }
763
998
  return [7 /*endfinally*/];
764
999
  case 11:
765
1000
  // we could conceivably check for special conditions and return early here.
@@ -831,545 +1066,7 @@ var IndexedDBAdapter = /** @class */ (function () {
831
1066
  });
832
1067
  });
833
1068
  };
834
- IndexedDBAdapter.prototype.queryOne = function (modelConstructor, firstOrLast) {
835
- if (firstOrLast === void 0) { firstOrLast = QueryOne.FIRST; }
836
- return __awaiter(this, void 0, void 0, function () {
837
- var storeName, cursor, result;
838
- return __generator(this, function (_a) {
839
- switch (_a.label) {
840
- case 0: return [4 /*yield*/, this.checkPrivate()];
841
- case 1:
842
- _a.sent();
843
- storeName = this.getStorenameForModel(modelConstructor);
844
- return [4 /*yield*/, this.db
845
- .transaction([storeName], 'readonly')
846
- .objectStore(storeName)
847
- .openCursor(undefined, firstOrLast === QueryOne.FIRST ? 'next' : 'prev')];
848
- case 2:
849
- cursor = _a.sent();
850
- result = cursor ? cursor.value : undefined;
851
- return [2 /*return*/, result && this.modelInstanceCreator(modelConstructor, result)];
852
- }
853
- });
854
- });
855
- };
856
- IndexedDBAdapter.prototype.delete = function (modelOrModelConstructor, condition) {
857
- return __awaiter(this, void 0, void 0, function () {
858
- var deleteQueue, modelConstructor, nameSpace, storeName, models, relations, deletedModels, deletedModels, model, modelConstructor, namespaceName, storeName, tx, store, keyValues, fromDB, msg, predicates, _a, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
859
- return __generator(this, function (_b) {
860
- switch (_b.label) {
861
- case 0: return [4 /*yield*/, this.checkPrivate()];
862
- case 1:
863
- _b.sent();
864
- deleteQueue = [];
865
- if (!isModelConstructor(modelOrModelConstructor)) return [3 /*break*/, 9];
866
- modelConstructor = modelOrModelConstructor;
867
- nameSpace = this.namespaceResolver(modelConstructor);
868
- storeName = this.getStorenameForModel(modelConstructor);
869
- return [4 /*yield*/, this.query(modelConstructor, condition)];
870
- case 2:
871
- models = _b.sent();
872
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
873
- .relationTypes;
874
- if (!(condition !== undefined)) return [3 /*break*/, 5];
875
- return [4 /*yield*/, this.deleteTraverse(relations, models, modelConstructor.name, nameSpace, deleteQueue)];
876
- case 3:
877
- _b.sent();
878
- return [4 /*yield*/, this.deleteItem(deleteQueue)];
879
- case 4:
880
- _b.sent();
881
- deletedModels = deleteQueue.reduce(function (acc, _a) {
882
- var items = _a.items;
883
- return acc.concat(items);
884
- }, []);
885
- return [2 /*return*/, [models, deletedModels]];
886
- case 5: return [4 /*yield*/, this.deleteTraverse(relations, models, modelConstructor.name, nameSpace, deleteQueue)];
887
- case 6:
888
- _b.sent();
889
- // Delete all
890
- return [4 /*yield*/, this.db
891
- .transaction([storeName], 'readwrite')
892
- .objectStore(storeName)
893
- .clear()];
894
- case 7:
895
- // Delete all
896
- _b.sent();
897
- deletedModels = deleteQueue.reduce(function (acc, _a) {
898
- var items = _a.items;
899
- return acc.concat(items);
900
- }, []);
901
- return [2 /*return*/, [models, deletedModels]];
902
- case 8: return [3 /*break*/, 17];
903
- case 9:
904
- model = modelOrModelConstructor;
905
- modelConstructor = Object.getPrototypeOf(model)
906
- .constructor;
907
- namespaceName = this.namespaceResolver(modelConstructor);
908
- storeName = this.getStorenameForModel(modelConstructor);
909
- if (!condition) return [3 /*break*/, 13];
910
- tx = this.db.transaction([storeName], 'readwrite');
911
- store = tx.objectStore(storeName);
912
- keyValues = this.getIndexKeyValuesFromModel(model);
913
- return [4 /*yield*/, this._get(store, keyValues)];
914
- case 10:
915
- fromDB = _b.sent();
916
- if (fromDB === undefined) {
917
- msg = 'Model instance not found in storage';
918
- logger.warn(msg, { model: model });
919
- return [2 /*return*/, [[model], []]];
920
- }
921
- predicates = ModelPredicateCreator.getPredicates(condition);
922
- _a = predicates, predicateObjs = _a.predicates, type = _a.type;
923
- isValid = validatePredicate(fromDB, type, predicateObjs);
924
- if (!isValid) {
925
- msg = 'Conditional update failed';
926
- logger.error(msg, { model: fromDB, condition: predicateObjs });
927
- throw new Error(msg);
928
- }
929
- return [4 /*yield*/, tx.done];
930
- case 11:
931
- _b.sent();
932
- relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
933
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
934
- case 12:
935
- _b.sent();
936
- return [3 /*break*/, 15];
937
- case 13:
938
- relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
939
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
940
- case 14:
941
- _b.sent();
942
- _b.label = 15;
943
- case 15: return [4 /*yield*/, this.deleteItem(deleteQueue)];
944
- case 16:
945
- _b.sent();
946
- deletedModels = deleteQueue.reduce(function (acc, _a) {
947
- var items = _a.items;
948
- return acc.concat(items);
949
- }, []);
950
- return [2 /*return*/, [[model], deletedModels]];
951
- case 17: return [2 /*return*/];
952
- }
953
- });
954
- });
955
- };
956
- IndexedDBAdapter.prototype.deleteItem = function (deleteQueue) {
957
- var e_9, _a, e_10, _b;
958
- return __awaiter(this, void 0, void 0, function () {
959
- var connectionStoreNames, tx, _c, _d, deleteItem, storeName, items, store, items_1, items_1_1, item, key, keyValues, itemKey, e_10_1, e_9_1;
960
- return __generator(this, function (_e) {
961
- switch (_e.label) {
962
- case 0:
963
- connectionStoreNames = deleteQueue.map(function (_a) {
964
- var storeName = _a.storeName;
965
- return storeName;
966
- });
967
- tx = this.db.transaction(__spread(connectionStoreNames), 'readwrite');
968
- _e.label = 1;
969
- case 1:
970
- _e.trys.push([1, 22, 23, 28]);
971
- _c = __asyncValues(deleteQueue);
972
- _e.label = 2;
973
- case 2: return [4 /*yield*/, _c.next()];
974
- case 3:
975
- if (!(_d = _e.sent(), !_d.done)) return [3 /*break*/, 21];
976
- deleteItem = _d.value;
977
- storeName = deleteItem.storeName, items = deleteItem.items;
978
- store = tx.objectStore(storeName);
979
- _e.label = 4;
980
- case 4:
981
- _e.trys.push([4, 14, 15, 20]);
982
- items_1 = __asyncValues(items);
983
- _e.label = 5;
984
- case 5: return [4 /*yield*/, items_1.next()];
985
- case 6:
986
- if (!(items_1_1 = _e.sent(), !items_1_1.done)) return [3 /*break*/, 13];
987
- item = items_1_1.value;
988
- if (!item) return [3 /*break*/, 12];
989
- key = void 0;
990
- if (!(typeof item === 'object')) return [3 /*break*/, 8];
991
- keyValues = this.getIndexKeyValuesFromModel(item);
992
- return [4 /*yield*/, store
993
- .index('byPk')
994
- .getKey(this.canonicalKeyPath(keyValues))];
995
- case 7:
996
- key = _e.sent();
997
- return [3 /*break*/, 10];
998
- case 8:
999
- itemKey = item.toString();
1000
- return [4 /*yield*/, store.index('byPk').getKey(itemKey)];
1001
- case 9:
1002
- key = _e.sent();
1003
- _e.label = 10;
1004
- case 10:
1005
- if (!(key !== undefined)) return [3 /*break*/, 12];
1006
- return [4 /*yield*/, store.delete(key)];
1007
- case 11:
1008
- _e.sent();
1009
- _e.label = 12;
1010
- case 12: return [3 /*break*/, 5];
1011
- case 13: return [3 /*break*/, 20];
1012
- case 14:
1013
- e_10_1 = _e.sent();
1014
- e_10 = { error: e_10_1 };
1015
- return [3 /*break*/, 20];
1016
- case 15:
1017
- _e.trys.push([15, , 18, 19]);
1018
- if (!(items_1_1 && !items_1_1.done && (_b = items_1.return))) return [3 /*break*/, 17];
1019
- return [4 /*yield*/, _b.call(items_1)];
1020
- case 16:
1021
- _e.sent();
1022
- _e.label = 17;
1023
- case 17: return [3 /*break*/, 19];
1024
- case 18:
1025
- if (e_10) throw e_10.error;
1026
- return [7 /*endfinally*/];
1027
- case 19: return [7 /*endfinally*/];
1028
- case 20: return [3 /*break*/, 2];
1029
- case 21: return [3 /*break*/, 28];
1030
- case 22:
1031
- e_9_1 = _e.sent();
1032
- e_9 = { error: e_9_1 };
1033
- return [3 /*break*/, 28];
1034
- case 23:
1035
- _e.trys.push([23, , 26, 27]);
1036
- if (!(_d && !_d.done && (_a = _c.return))) return [3 /*break*/, 25];
1037
- return [4 /*yield*/, _a.call(_c)];
1038
- case 24:
1039
- _e.sent();
1040
- _e.label = 25;
1041
- case 25: return [3 /*break*/, 27];
1042
- case 26:
1043
- if (e_9) throw e_9.error;
1044
- return [7 /*endfinally*/];
1045
- case 27: return [7 /*endfinally*/];
1046
- case 28: return [2 /*return*/];
1047
- }
1048
- });
1049
- });
1050
- };
1051
- IndexedDBAdapter.prototype.deleteTraverse = function (relations, models, srcModel, nameSpace, deleteQueue) {
1052
- var relations_1, relations_1_1, models_1, models_1_1, models_2, models_2_1;
1053
- var e_11, _a, e_12, _b, e_13, _c;
1054
- return __awaiter(this, void 0, void 0, function () {
1055
- var rel, relationType, modelName, targetName, targetNames, associatedWith, storeName, _d, model, hasOneIndex, values, recordToDelete, index, values, value, recordToDelete, modelsToDelete, _e, e_12_1, model, index, keyValues, childRecords, childModels, e_13_1, e_11_1;
1056
- var _this = this;
1057
- return __generator(this, function (_f) {
1058
- switch (_f.label) {
1059
- case 0:
1060
- _f.trys.push([0, 42, 43, 48]);
1061
- relations_1 = __asyncValues(relations);
1062
- _f.label = 1;
1063
- case 1: return [4 /*yield*/, relations_1.next()];
1064
- case 2:
1065
- if (!(relations_1_1 = _f.sent(), !relations_1_1.done)) return [3 /*break*/, 41];
1066
- rel = relations_1_1.value;
1067
- relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
1068
- storeName = getStorename(nameSpace, modelName);
1069
- _d = relationType;
1070
- switch (_d) {
1071
- case 'HAS_ONE': return [3 /*break*/, 3];
1072
- case 'HAS_MANY': return [3 /*break*/, 23];
1073
- case 'BELONGS_TO': return [3 /*break*/, 38];
1074
- }
1075
- return [3 /*break*/, 39];
1076
- case 3:
1077
- _f.trys.push([3, 16, 17, 22]);
1078
- models_1 = __asyncValues(models);
1079
- _f.label = 4;
1080
- case 4: return [4 /*yield*/, models_1.next()];
1081
- case 5:
1082
- if (!(models_1_1 = _f.sent(), !models_1_1.done)) return [3 /*break*/, 15];
1083
- model = models_1_1.value;
1084
- hasOneIndex = 'byPk';
1085
- if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 8];
1086
- values = targetNames
1087
- .filter(function (targetName) { var _a; return (_a = model[targetName]) !== null && _a !== void 0 ? _a : false; })
1088
- .map(function (targetName) { return model[targetName]; });
1089
- if (values.length === 0)
1090
- return [3 /*break*/, 15];
1091
- return [4 /*yield*/, this.db
1092
- .transaction(storeName, 'readwrite')
1093
- .objectStore(storeName)
1094
- .index(hasOneIndex)
1095
- .get(this.canonicalKeyPath(values))];
1096
- case 6:
1097
- recordToDelete = (_f.sent());
1098
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
1099
- .relationTypes, recordToDelete ? [recordToDelete] : [], modelName, nameSpace, deleteQueue)];
1100
- case 7:
1101
- _f.sent();
1102
- return [3 /*break*/, 15];
1103
- case 8:
1104
- index = void 0;
1105
- values = void 0;
1106
- if (targetName && targetName in model) {
1107
- index = hasOneIndex;
1108
- value = model[targetName];
1109
- if (value === null)
1110
- return [3 /*break*/, 15];
1111
- values = [value];
1112
- }
1113
- else {
1114
- // backwards compatability for older versions of codegen that did not emit targetName for HAS_ONE relations
1115
- // TODO: can we deprecate this? it's been ~2 years since codegen started including targetName for HAS_ONE
1116
- // If we deprecate, we'll need to re-gen the MIPR in __tests__/schema.ts > newSchema
1117
- // otherwise some unit tests will fail
1118
- index = getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
1119
- .relationTypes, srcModel);
1120
- values = this.getIndexKeyValuesFromModel(model);
1121
- }
1122
- if (!values || !index)
1123
- return [3 /*break*/, 15];
1124
- return [4 /*yield*/, this.db
1125
- .transaction(storeName, 'readwrite')
1126
- .objectStore(storeName)
1127
- .index(index)
1128
- .get(this.canonicalKeyPath(values))];
1129
- case 9:
1130
- recordToDelete = (_f.sent());
1131
- if (!recordToDelete) return [3 /*break*/, 11];
1132
- return [4 /*yield*/, this.load(nameSpace, modelName, [recordToDelete])];
1133
- case 10:
1134
- _e = _f.sent();
1135
- return [3 /*break*/, 12];
1136
- case 11:
1137
- _e = [];
1138
- _f.label = 12;
1139
- case 12:
1140
- modelsToDelete = _e;
1141
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
1142
- .relationTypes, modelsToDelete, modelName, nameSpace, deleteQueue)];
1143
- case 13:
1144
- _f.sent();
1145
- _f.label = 14;
1146
- case 14: return [3 /*break*/, 4];
1147
- case 15: return [3 /*break*/, 22];
1148
- case 16:
1149
- e_12_1 = _f.sent();
1150
- e_12 = { error: e_12_1 };
1151
- return [3 /*break*/, 22];
1152
- case 17:
1153
- _f.trys.push([17, , 20, 21]);
1154
- if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 19];
1155
- return [4 /*yield*/, _b.call(models_1)];
1156
- case 18:
1157
- _f.sent();
1158
- _f.label = 19;
1159
- case 19: return [3 /*break*/, 21];
1160
- case 20:
1161
- if (e_12) throw e_12.error;
1162
- return [7 /*endfinally*/];
1163
- case 21: return [7 /*endfinally*/];
1164
- case 22: return [3 /*break*/, 40];
1165
- case 23:
1166
- _f.trys.push([23, 31, 32, 37]);
1167
- models_2 = __asyncValues(models);
1168
- _f.label = 24;
1169
- case 24: return [4 /*yield*/, models_2.next()];
1170
- case 25:
1171
- if (!(models_2_1 = _f.sent(), !models_2_1.done)) return [3 /*break*/, 30];
1172
- model = models_2_1.value;
1173
- index =
1174
- // explicit bi-directional @hasMany and @manyToMany
1175
- getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
1176
- .relationTypes, srcModel) ||
1177
- // uni and/or implicit @hasMany
1178
- getIndexFromAssociation(this.schema.namespaces[nameSpace].relationships[modelName]
1179
- .indexes, associatedWith);
1180
- keyValues = this.getIndexKeyValuesFromModel(model);
1181
- return [4 /*yield*/, this.db
1182
- .transaction(storeName, 'readwrite')
1183
- .objectStore(storeName)
1184
- .index(index)
1185
- .getAll(this.canonicalKeyPath(keyValues))];
1186
- case 26:
1187
- childRecords = _f.sent();
1188
- return [4 /*yield*/, this.load(nameSpace, modelName, childRecords)];
1189
- case 27:
1190
- childModels = _f.sent();
1191
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
1192
- .relationTypes, childModels, modelName, nameSpace, deleteQueue)];
1193
- case 28:
1194
- _f.sent();
1195
- _f.label = 29;
1196
- case 29: return [3 /*break*/, 24];
1197
- case 30: return [3 /*break*/, 37];
1198
- case 31:
1199
- e_13_1 = _f.sent();
1200
- e_13 = { error: e_13_1 };
1201
- return [3 /*break*/, 37];
1202
- case 32:
1203
- _f.trys.push([32, , 35, 36]);
1204
- if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 34];
1205
- return [4 /*yield*/, _c.call(models_2)];
1206
- case 33:
1207
- _f.sent();
1208
- _f.label = 34;
1209
- case 34: return [3 /*break*/, 36];
1210
- case 35:
1211
- if (e_13) throw e_13.error;
1212
- return [7 /*endfinally*/];
1213
- case 36: return [7 /*endfinally*/];
1214
- case 37: return [3 /*break*/, 40];
1215
- case 38:
1216
- // Intentionally blank
1217
- return [3 /*break*/, 40];
1218
- case 39: throw new Error("Invalid relation type " + relationType);
1219
- case 40: return [3 /*break*/, 1];
1220
- case 41: return [3 /*break*/, 48];
1221
- case 42:
1222
- e_11_1 = _f.sent();
1223
- e_11 = { error: e_11_1 };
1224
- return [3 /*break*/, 48];
1225
- case 43:
1226
- _f.trys.push([43, , 46, 47]);
1227
- if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 45];
1228
- return [4 /*yield*/, _a.call(relations_1)];
1229
- case 44:
1230
- _f.sent();
1231
- _f.label = 45;
1232
- case 45: return [3 /*break*/, 47];
1233
- case 46:
1234
- if (e_11) throw e_11.error;
1235
- return [7 /*endfinally*/];
1236
- case 47: return [7 /*endfinally*/];
1237
- case 48:
1238
- deleteQueue.push({
1239
- storeName: getStorename(nameSpace, srcModel),
1240
- items: models.map(function (record) {
1241
- return _this.modelInstanceCreator(_this.getModelConstructorByModelName(nameSpace, srcModel), record);
1242
- }),
1243
- });
1244
- return [2 /*return*/];
1245
- }
1246
- });
1247
- });
1248
- };
1249
- IndexedDBAdapter.prototype.clear = function () {
1250
- var _a;
1251
- return __awaiter(this, void 0, void 0, function () {
1252
- return __generator(this, function (_b) {
1253
- switch (_b.label) {
1254
- case 0: return [4 /*yield*/, this.checkPrivate()];
1255
- case 1:
1256
- _b.sent();
1257
- (_a = this.db) === null || _a === void 0 ? void 0 : _a.close();
1258
- return [4 /*yield*/, idb.deleteDB(this.dbName)];
1259
- case 2:
1260
- _b.sent();
1261
- this.db = undefined;
1262
- this.initPromise = undefined;
1263
- return [2 /*return*/];
1264
- }
1265
- });
1266
- });
1267
- };
1268
- IndexedDBAdapter.prototype.batchSave = function (modelConstructor, items) {
1269
- return __awaiter(this, void 0, void 0, function () {
1270
- var result, storeName, txn, store, _loop_3, this_1, items_2, items_2_1, item, e_14_1;
1271
- var e_14, _a;
1272
- var _this = this;
1273
- return __generator(this, function (_b) {
1274
- switch (_b.label) {
1275
- case 0:
1276
- if (items.length === 0) {
1277
- return [2 /*return*/, []];
1278
- }
1279
- return [4 /*yield*/, this.checkPrivate()];
1280
- case 1:
1281
- _b.sent();
1282
- result = [];
1283
- storeName = this.getStorenameForModel(modelConstructor);
1284
- txn = this.db.transaction(storeName, 'readwrite');
1285
- store = txn.store;
1286
- _loop_3 = function (item) {
1287
- var namespaceName, modelName, model, connectedModels, keyValues, _deleted, index, key, instance;
1288
- return __generator(this, function (_a) {
1289
- switch (_a.label) {
1290
- case 0:
1291
- namespaceName = this_1.namespaceResolver(modelConstructor);
1292
- modelName = modelConstructor.name;
1293
- model = this_1.modelInstanceCreator(modelConstructor, item);
1294
- connectedModels = traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
1295
- keyValues = this_1.getIndexKeyValuesFromModel(model);
1296
- _deleted = item._deleted;
1297
- index = store.index('byPk');
1298
- return [4 /*yield*/, index.getKey(this_1.canonicalKeyPath(keyValues))];
1299
- case 1:
1300
- key = _a.sent();
1301
- if (!!_deleted) return [3 /*break*/, 3];
1302
- instance = connectedModels.find(function (_a) {
1303
- var instance = _a.instance;
1304
- var instanceKeyValues = _this.getIndexKeyValuesFromModel(instance);
1305
- return keysEqual(instanceKeyValues, keyValues);
1306
- }).instance;
1307
- result.push([
1308
- instance,
1309
- key ? OpType.UPDATE : OpType.INSERT,
1310
- ]);
1311
- return [4 /*yield*/, store.put(instance, key)];
1312
- case 2:
1313
- _a.sent();
1314
- return [3 /*break*/, 5];
1315
- case 3:
1316
- result.push([item, OpType.DELETE]);
1317
- if (!key) return [3 /*break*/, 5];
1318
- return [4 /*yield*/, store.delete(key)];
1319
- case 4:
1320
- _a.sent();
1321
- _a.label = 5;
1322
- case 5: return [2 /*return*/];
1323
- }
1324
- });
1325
- };
1326
- this_1 = this;
1327
- _b.label = 2;
1328
- case 2:
1329
- _b.trys.push([2, 7, 8, 9]);
1330
- items_2 = __values(items), items_2_1 = items_2.next();
1331
- _b.label = 3;
1332
- case 3:
1333
- if (!!items_2_1.done) return [3 /*break*/, 6];
1334
- item = items_2_1.value;
1335
- return [5 /*yield**/, _loop_3(item)];
1336
- case 4:
1337
- _b.sent();
1338
- _b.label = 5;
1339
- case 5:
1340
- items_2_1 = items_2.next();
1341
- return [3 /*break*/, 3];
1342
- case 6: return [3 /*break*/, 9];
1343
- case 7:
1344
- e_14_1 = _b.sent();
1345
- e_14 = { error: e_14_1 };
1346
- return [3 /*break*/, 9];
1347
- case 8:
1348
- try {
1349
- if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
1350
- }
1351
- finally { if (e_14) throw e_14.error; }
1352
- return [7 /*endfinally*/];
1353
- case 9: return [4 /*yield*/, txn.done];
1354
- case 10:
1355
- _b.sent();
1356
- return [2 /*return*/, result];
1357
- }
1358
- });
1359
- });
1360
- };
1361
- IndexedDBAdapter.prototype.createObjectStoreForModel = function (db, namespaceName, storeName, modelName) {
1362
- var store = db.createObjectStore(storeName, {
1363
- autoIncrement: true,
1364
- });
1365
- var indexes = this.schema.namespaces[namespaceName].relationships[modelName].indexes;
1366
- indexes.forEach(function (_a) {
1367
- var _b = __read(_a, 3), idxName = _b[0], keyPath = _b[1], options = _b[2];
1368
- store.createIndex(idxName, keyPath, options);
1369
- });
1370
- return store;
1371
- };
1372
1069
  return IndexedDBAdapter;
1373
- }());
1070
+ }(StorageAdapterBase));
1374
1071
  export default new IndexedDBAdapter();
1375
1072
  //# sourceMappingURL=IndexedDBAdapter.js.map