@aws-amplify/datastore 4.0.12 → 4.0.13-push-notification-dryrun.43

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 (111) hide show
  1. package/lib/datastore/datastore.d.ts +29 -3
  2. package/lib/datastore/datastore.js +308 -147
  3. package/lib/datastore/datastore.js.map +1 -1
  4. package/lib/predicates/index.d.ts +77 -7
  5. package/lib/predicates/index.js +142 -122
  6. package/lib/predicates/index.js.map +1 -1
  7. package/lib/predicates/next.d.ts +51 -10
  8. package/lib/predicates/next.js +111 -91
  9. package/lib/predicates/next.js.map +1 -1
  10. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +28 -30
  11. package/lib/storage/adapter/AsyncStorageAdapter.js +135 -532
  12. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  13. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  14. package/lib/storage/adapter/IndexedDBAdapter.d.ts +28 -29
  15. package/lib/storage/adapter/IndexedDBAdapter.js +490 -885
  16. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  17. package/lib/storage/adapter/StorageAdapterBase.d.ts +134 -0
  18. package/lib/storage/adapter/StorageAdapterBase.js +439 -0
  19. package/lib/storage/adapter/StorageAdapterBase.js.map +1 -0
  20. package/lib/storage/relationship.d.ts +9 -0
  21. package/lib/storage/relationship.js +9 -0
  22. package/lib/storage/relationship.js.map +1 -1
  23. package/lib/storage/storage.d.ts +1 -1
  24. package/lib/storage/storage.js +4 -3
  25. package/lib/storage/storage.js.map +1 -1
  26. package/lib/sync/index.d.ts +15 -1
  27. package/lib/sync/index.js +80 -13
  28. package/lib/sync/index.js.map +1 -1
  29. package/lib/sync/outbox.js +14 -7
  30. package/lib/sync/outbox.js.map +1 -1
  31. package/lib/sync/processors/mutation.d.ts +10 -1
  32. package/lib/sync/processors/mutation.js +33 -12
  33. package/lib/sync/processors/mutation.js.map +1 -1
  34. package/lib/sync/processors/subscription.d.ts +7 -1
  35. package/lib/sync/processors/subscription.js +196 -135
  36. package/lib/sync/processors/subscription.js.map +1 -1
  37. package/lib/sync/processors/sync.d.ts +1 -1
  38. package/lib/sync/processors/sync.js.map +1 -1
  39. package/lib/sync/utils.d.ts +66 -2
  40. package/lib/sync/utils.js +264 -16
  41. package/lib/sync/utils.js.map +1 -1
  42. package/lib/types.d.ts +9 -1
  43. package/lib/types.js.map +1 -1
  44. package/lib/util.d.ts +16 -0
  45. package/lib/util.js +31 -2
  46. package/lib/util.js.map +1 -1
  47. package/lib-esm/datastore/datastore.d.ts +29 -3
  48. package/lib-esm/datastore/datastore.js +310 -149
  49. package/lib-esm/datastore/datastore.js.map +1 -1
  50. package/lib-esm/predicates/index.d.ts +77 -7
  51. package/lib-esm/predicates/index.js +143 -123
  52. package/lib-esm/predicates/index.js.map +1 -1
  53. package/lib-esm/predicates/next.d.ts +51 -10
  54. package/lib-esm/predicates/next.js +111 -91
  55. package/lib-esm/predicates/next.js.map +1 -1
  56. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +28 -30
  57. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +138 -535
  58. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  59. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  60. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +28 -29
  61. package/lib-esm/storage/adapter/IndexedDBAdapter.js +489 -884
  62. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  63. package/lib-esm/storage/adapter/StorageAdapterBase.d.ts +134 -0
  64. package/lib-esm/storage/adapter/StorageAdapterBase.js +437 -0
  65. package/lib-esm/storage/adapter/StorageAdapterBase.js.map +1 -0
  66. package/lib-esm/storage/relationship.d.ts +9 -0
  67. package/lib-esm/storage/relationship.js +9 -0
  68. package/lib-esm/storage/relationship.js.map +1 -1
  69. package/lib-esm/storage/storage.d.ts +1 -1
  70. package/lib-esm/storage/storage.js +4 -3
  71. package/lib-esm/storage/storage.js.map +1 -1
  72. package/lib-esm/sync/index.d.ts +15 -1
  73. package/lib-esm/sync/index.js +82 -15
  74. package/lib-esm/sync/index.js.map +1 -1
  75. package/lib-esm/sync/outbox.js +14 -7
  76. package/lib-esm/sync/outbox.js.map +1 -1
  77. package/lib-esm/sync/processors/mutation.d.ts +10 -1
  78. package/lib-esm/sync/processors/mutation.js +33 -12
  79. package/lib-esm/sync/processors/mutation.js.map +1 -1
  80. package/lib-esm/sync/processors/subscription.d.ts +7 -1
  81. package/lib-esm/sync/processors/subscription.js +197 -136
  82. package/lib-esm/sync/processors/subscription.js.map +1 -1
  83. package/lib-esm/sync/processors/sync.d.ts +1 -1
  84. package/lib-esm/sync/processors/sync.js.map +1 -1
  85. package/lib-esm/sync/utils.d.ts +66 -2
  86. package/lib-esm/sync/utils.js +261 -18
  87. package/lib-esm/sync/utils.js.map +1 -1
  88. package/lib-esm/types.d.ts +9 -1
  89. package/lib-esm/types.js.map +1 -1
  90. package/lib-esm/util.d.ts +16 -0
  91. package/lib-esm/util.js +32 -3
  92. package/lib-esm/util.js.map +1 -1
  93. package/package.json +12 -11
  94. package/src/datastore/datastore.ts +288 -159
  95. package/src/predicates/index.ts +145 -175
  96. package/src/predicates/next.ts +114 -81
  97. package/src/storage/adapter/AsyncStorageAdapter.ts +97 -563
  98. package/src/storage/adapter/AsyncStorageDatabase.ts +2 -2
  99. package/src/storage/adapter/IndexedDBAdapter.ts +318 -770
  100. package/src/storage/adapter/StorageAdapterBase.ts +545 -0
  101. package/src/storage/relationship.ts +9 -0
  102. package/src/storage/storage.ts +12 -9
  103. package/src/sync/index.ts +108 -20
  104. package/src/sync/outbox.ts +17 -11
  105. package/src/sync/processors/mutation.ts +35 -4
  106. package/src/sync/processors/subscription.ts +124 -10
  107. package/src/sync/processors/sync.ts +4 -1
  108. package/src/sync/utils.ts +285 -15
  109. package/src/types.ts +15 -2
  110. package/src/util.ts +40 -1
  111. package/CHANGELOG.md +0 -904
@@ -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 { 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,70 +361,322 @@ 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) { return isPredicateObj(p) && p.field === key && p.operator === 'eq'; });
509
- predicateObj && keyValues.push(predicateObj.operand);
510
- };
511
- try {
512
- for (var keyPath_1 = __values(keyPath), keyPath_1_1 = keyPath_1.next(); !keyPath_1_1.done; keyPath_1_1 = keyPath_1.next()) {
513
- var key = keyPath_1_1.value;
514
- _loop_1(key);
515
- }
516
- }
517
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
518
- finally {
519
- try {
520
- if (keyPath_1_1 && !keyPath_1_1.done && (_a = keyPath_1.return)) _a.call(keyPath_1);
521
- }
522
- finally { if (e_3) throw e_3.error; }
523
- }
524
- return keyValues.length === keyPath.length ? keyValues : undefined;
525
- };
526
- /**
527
- * Tries to generate an index fetcher for the given predicates. Assumes
528
- * that the given predicate conditions are contained by an AND group and
529
- * should therefore all match a single record.
530
- *
531
- * @param storeName The table to query.
532
- * @param predicates The predicates to try to AND together.
533
- * @param transaction
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
+ //#region platform-specific helper methods
581
+ IndexedDBAdapter.prototype.checkPrivate = function () {
582
+ return __awaiter(this, void 0, void 0, function () {
583
+ var isPrivate;
584
+ return __generator(this, function (_a) {
585
+ switch (_a.label) {
586
+ case 0: return [4 /*yield*/, isPrivateMode().then(function (isPrivate) {
587
+ return isPrivate;
588
+ })];
589
+ case 1:
590
+ isPrivate = _a.sent();
591
+ if (isPrivate) {
592
+ logger.error("IndexedDB not supported in this browser's private mode");
593
+ return [2 /*return*/, Promise.reject("IndexedDB not supported in this browser's private mode")];
594
+ }
595
+ else {
596
+ return [2 /*return*/, Promise.resolve()];
597
+ }
598
+ return [2 /*return*/];
599
+ }
600
+ });
601
+ });
602
+ };
603
+ /**
604
+ * Whether the browser's implementation of IndexedDB is coercing single-field
605
+ * indexes to a scalar key.
606
+ *
607
+ * If this returns `true`, we need to treat indexes containing a single field
608
+ * as scalars.
609
+ *
610
+ * See PR description for reference:
611
+ * https://github.com/aws-amplify/amplify-js/pull/10527
612
+ */
613
+ IndexedDBAdapter.prototype.setSafariCompatabilityMode = function () {
614
+ return __awaiter(this, void 0, void 0, function () {
615
+ var _a;
616
+ return __generator(this, function (_b) {
617
+ switch (_b.label) {
618
+ case 0:
619
+ _a = this;
620
+ return [4 /*yield*/, isSafariCompatabilityMode()];
621
+ case 1:
622
+ _a.safariCompatabilityMode = _b.sent();
623
+ if (this.safariCompatabilityMode === true) {
624
+ logger.debug('IndexedDB Adapter is running in Safari Compatability Mode');
625
+ }
626
+ return [2 /*return*/];
627
+ }
628
+ });
629
+ });
630
+ };
631
+ IndexedDBAdapter.prototype.getNamespaceAndModelFromStorename = function (storeName) {
632
+ var _a = __read(storeName.split('_')), namespaceName = _a[0], modelNameArr = _a.slice(1);
633
+ return {
634
+ namespaceName: namespaceName,
635
+ modelName: modelNameArr.join('_'),
636
+ };
637
+ };
638
+ IndexedDBAdapter.prototype.createObjectStoreForModel = function (db, namespaceName, storeName, modelName) {
639
+ var store = db.createObjectStore(storeName, {
640
+ autoIncrement: true,
641
+ });
642
+ var indexes = this.schema.namespaces[namespaceName].relationships[modelName].indexes;
643
+ indexes.forEach(function (_a) {
644
+ var _b = __read(_a, 3), idxName = _b[0], keyPath = _b[1], options = _b[2];
645
+ store.createIndex(idxName, keyPath, options);
646
+ });
647
+ return store;
648
+ };
649
+ IndexedDBAdapter.prototype.getByKey = function (storeName, keyValue) {
650
+ return __awaiter(this, void 0, void 0, function () {
651
+ return __generator(this, function (_a) {
652
+ switch (_a.label) {
653
+ case 0: return [4 /*yield*/, this._get(storeName, keyValue)];
654
+ case 1: return [2 /*return*/, _a.sent()];
655
+ }
656
+ });
657
+ });
658
+ };
659
+ IndexedDBAdapter.prototype.getAll = function (storeName) {
660
+ return __awaiter(this, void 0, void 0, function () {
661
+ return __generator(this, function (_a) {
662
+ switch (_a.label) {
663
+ case 0: return [4 /*yield*/, this.db.getAll(storeName)];
664
+ case 1: return [2 /*return*/, _a.sent()];
665
+ }
666
+ });
667
+ });
668
+ };
669
+ /**
670
+ * Tries to generate an index fetcher for the given predicates. Assumes
671
+ * that the given predicate conditions are contained by an AND group and
672
+ * should therefore all match a single record.
673
+ *
674
+ * @param storeName The table to query.
675
+ * @param predicates The predicates to try to AND together.
676
+ * @param transaction
534
677
  */
535
678
  IndexedDBAdapter.prototype.matchingIndexQueries = function (storeName, predicates, transaction) {
536
- var e_4, _a, e_5, _b;
679
+ var e_6, _a, e_7, _b;
537
680
  var _this = this;
538
681
  // could be expanded later to include `exec()` and a `cardinality` estimate?
539
682
  var queries = [];
@@ -544,37 +687,37 @@ var IndexedDBAdapter = /** @class */ (function () {
544
687
  predicateIndex.set(String(predicate.field), predicate);
545
688
  }
546
689
  }
547
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
690
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
548
691
  finally {
549
692
  try {
550
693
  if (predicates_1_1 && !predicates_1_1.done && (_a = predicates_1.return)) _a.call(predicates_1);
551
694
  }
552
- finally { if (e_4) throw e_4.error; }
695
+ finally { if (e_6) throw e_6.error; }
553
696
  }
554
697
  var store = transaction.objectStore(storeName);
555
698
  var _loop_2 = function (name_1) {
556
- var e_6, _a;
699
+ var e_8, _a;
557
700
  var idx = store.index(name_1);
558
701
  var keypath = Array.isArray(idx.keyPath) ? idx.keyPath : [idx.keyPath];
559
702
  var matchingPredicateValues = [];
560
703
  try {
561
- 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()) {
704
+ 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()) {
562
705
  var field = keypath_1_1.value;
563
706
  var p = predicateIndex.get(field);
564
- if (p) {
565
- matchingPredicateValues.push(String(p.operand));
707
+ if (p && p.operand !== null && p.operand !== undefined) {
708
+ matchingPredicateValues.push(p.operand);
566
709
  }
567
710
  else {
568
711
  break;
569
712
  }
570
713
  }
571
714
  }
572
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
715
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
573
716
  finally {
574
717
  try {
575
718
  if (keypath_1_1 && !keypath_1_1.done && (_a = keypath_1.return)) _a.call(keypath_1);
576
719
  }
577
- finally { if (e_6) throw e_6.error; }
720
+ finally { if (e_8) throw e_8.error; }
578
721
  }
579
722
  // if we have a matching predicate field for each component of this index,
580
723
  // we can build a query for it. otherwise, we can't.
@@ -596,12 +739,12 @@ var IndexedDBAdapter = /** @class */ (function () {
596
739
  _loop_2(name_1);
597
740
  }
598
741
  }
599
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
742
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
600
743
  finally {
601
744
  try {
602
745
  if (_d && !_d.done && (_b = _c.return)) _b.call(_c);
603
746
  }
604
- finally { if (e_5) throw e_5.error; }
747
+ finally { if (e_7) throw e_7.error; }
605
748
  }
606
749
  return queries;
607
750
  };
@@ -690,8 +833,8 @@ var IndexedDBAdapter = /** @class */ (function () {
690
833
  };
691
834
  IndexedDBAdapter.prototype.filterOnPredicate = function (storeName, predicates) {
692
835
  return __awaiter(this, void 0, void 0, function () {
693
- 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;
694
- var e_7, _b, e_8, _c;
836
+ 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;
837
+ var e_9, _b, e_10, _c;
695
838
  return __generator(this, function (_d) {
696
839
  switch (_d.label) {
697
840
  case 0:
@@ -723,18 +866,18 @@ var IndexedDBAdapter = /** @class */ (function () {
723
866
  case 6:
724
867
  resultGroup = _d.sent();
725
868
  try {
726
- 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()) {
869
+ 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()) {
727
870
  item = resultGroup_1_1.value;
728
871
  distinctificationString = JSON.stringify(item);
729
872
  distinctResults.set(distinctificationString, item);
730
873
  }
731
874
  }
732
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
875
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
733
876
  finally {
734
877
  try {
735
878
  if (resultGroup_1_1 && !resultGroup_1_1.done && (_c = resultGroup_1.return)) _c.call(resultGroup_1);
736
879
  }
737
- finally { if (e_8) throw e_8.error; }
880
+ finally { if (e_10) throw e_10.error; }
738
881
  }
739
882
  _d.label = 7;
740
883
  case 7:
@@ -742,14 +885,14 @@ var IndexedDBAdapter = /** @class */ (function () {
742
885
  return [3 /*break*/, 5];
743
886
  case 8: return [3 /*break*/, 11];
744
887
  case 9:
745
- e_7_1 = _d.sent();
746
- e_7 = { error: e_7_1 };
888
+ e_9_1 = _d.sent();
889
+ e_9 = { error: e_9_1 };
747
890
  return [3 /*break*/, 11];
748
891
  case 10:
749
892
  try {
750
893
  if (indexedQueries_1_1 && !indexedQueries_1_1.done && (_b = indexedQueries_1.return)) _b.call(indexedQueries_1);
751
894
  }
752
- finally { if (e_7) throw e_7.error; }
895
+ finally { if (e_9) throw e_9.error; }
753
896
  return [7 /*endfinally*/];
754
897
  case 11:
755
898
  // we could conceivably check for special conditions and return early here.
@@ -821,545 +964,7 @@ var IndexedDBAdapter = /** @class */ (function () {
821
964
  });
822
965
  });
823
966
  };
824
- IndexedDBAdapter.prototype.queryOne = function (modelConstructor, firstOrLast) {
825
- if (firstOrLast === void 0) { firstOrLast = QueryOne.FIRST; }
826
- return __awaiter(this, void 0, void 0, function () {
827
- var storeName, cursor, result;
828
- return __generator(this, function (_a) {
829
- switch (_a.label) {
830
- case 0: return [4 /*yield*/, this.checkPrivate()];
831
- case 1:
832
- _a.sent();
833
- storeName = this.getStorenameForModel(modelConstructor);
834
- return [4 /*yield*/, this.db
835
- .transaction([storeName], 'readonly')
836
- .objectStore(storeName)
837
- .openCursor(undefined, firstOrLast === QueryOne.FIRST ? 'next' : 'prev')];
838
- case 2:
839
- cursor = _a.sent();
840
- result = cursor ? cursor.value : undefined;
841
- return [2 /*return*/, result && this.modelInstanceCreator(modelConstructor, result)];
842
- }
843
- });
844
- });
845
- };
846
- IndexedDBAdapter.prototype.delete = function (modelOrModelConstructor, condition) {
847
- return __awaiter(this, void 0, void 0, function () {
848
- 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;
849
- return __generator(this, function (_b) {
850
- switch (_b.label) {
851
- case 0: return [4 /*yield*/, this.checkPrivate()];
852
- case 1:
853
- _b.sent();
854
- deleteQueue = [];
855
- if (!isModelConstructor(modelOrModelConstructor)) return [3 /*break*/, 9];
856
- modelConstructor = modelOrModelConstructor;
857
- nameSpace = this.namespaceResolver(modelConstructor);
858
- storeName = this.getStorenameForModel(modelConstructor);
859
- return [4 /*yield*/, this.query(modelConstructor, condition)];
860
- case 2:
861
- models = _b.sent();
862
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
863
- .relationTypes;
864
- if (!(condition !== undefined)) return [3 /*break*/, 5];
865
- return [4 /*yield*/, this.deleteTraverse(relations, models, modelConstructor.name, nameSpace, deleteQueue)];
866
- case 3:
867
- _b.sent();
868
- return [4 /*yield*/, this.deleteItem(deleteQueue)];
869
- case 4:
870
- _b.sent();
871
- deletedModels = deleteQueue.reduce(function (acc, _a) {
872
- var items = _a.items;
873
- return acc.concat(items);
874
- }, []);
875
- return [2 /*return*/, [models, deletedModels]];
876
- case 5: return [4 /*yield*/, this.deleteTraverse(relations, models, modelConstructor.name, nameSpace, deleteQueue)];
877
- case 6:
878
- _b.sent();
879
- // Delete all
880
- return [4 /*yield*/, this.db
881
- .transaction([storeName], 'readwrite')
882
- .objectStore(storeName)
883
- .clear()];
884
- case 7:
885
- // Delete all
886
- _b.sent();
887
- deletedModels = deleteQueue.reduce(function (acc, _a) {
888
- var items = _a.items;
889
- return acc.concat(items);
890
- }, []);
891
- return [2 /*return*/, [models, deletedModels]];
892
- case 8: return [3 /*break*/, 17];
893
- case 9:
894
- model = modelOrModelConstructor;
895
- modelConstructor = Object.getPrototypeOf(model)
896
- .constructor;
897
- namespaceName = this.namespaceResolver(modelConstructor);
898
- storeName = this.getStorenameForModel(modelConstructor);
899
- if (!condition) return [3 /*break*/, 13];
900
- tx = this.db.transaction([storeName], 'readwrite');
901
- store = tx.objectStore(storeName);
902
- keyValues = this.getIndexKeyValuesFromModel(model);
903
- return [4 /*yield*/, this._get(store, keyValues)];
904
- case 10:
905
- fromDB = _b.sent();
906
- if (fromDB === undefined) {
907
- msg = 'Model instance not found in storage';
908
- logger.warn(msg, { model: model });
909
- return [2 /*return*/, [[model], []]];
910
- }
911
- predicates = ModelPredicateCreator.getPredicates(condition);
912
- _a = predicates, predicateObjs = _a.predicates, type = _a.type;
913
- isValid = validatePredicate(fromDB, type, predicateObjs);
914
- if (!isValid) {
915
- msg = 'Conditional update failed';
916
- logger.error(msg, { model: fromDB, condition: predicateObjs });
917
- throw new Error(msg);
918
- }
919
- return [4 /*yield*/, tx.done];
920
- case 11:
921
- _b.sent();
922
- relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
923
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
924
- case 12:
925
- _b.sent();
926
- return [3 /*break*/, 15];
927
- case 13:
928
- relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
929
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
930
- case 14:
931
- _b.sent();
932
- _b.label = 15;
933
- case 15: return [4 /*yield*/, this.deleteItem(deleteQueue)];
934
- case 16:
935
- _b.sent();
936
- deletedModels = deleteQueue.reduce(function (acc, _a) {
937
- var items = _a.items;
938
- return acc.concat(items);
939
- }, []);
940
- return [2 /*return*/, [[model], deletedModels]];
941
- case 17: return [2 /*return*/];
942
- }
943
- });
944
- });
945
- };
946
- IndexedDBAdapter.prototype.deleteItem = function (deleteQueue) {
947
- var e_9, _a, e_10, _b;
948
- return __awaiter(this, void 0, void 0, function () {
949
- var connectionStoreNames, tx, _c, _d, deleteItem, storeName, items, store, items_1, items_1_1, item, key, keyValues, itemKey, e_10_1, e_9_1;
950
- return __generator(this, function (_e) {
951
- switch (_e.label) {
952
- case 0:
953
- connectionStoreNames = deleteQueue.map(function (_a) {
954
- var storeName = _a.storeName;
955
- return storeName;
956
- });
957
- tx = this.db.transaction(__spread(connectionStoreNames), 'readwrite');
958
- _e.label = 1;
959
- case 1:
960
- _e.trys.push([1, 22, 23, 28]);
961
- _c = __asyncValues(deleteQueue);
962
- _e.label = 2;
963
- case 2: return [4 /*yield*/, _c.next()];
964
- case 3:
965
- if (!(_d = _e.sent(), !_d.done)) return [3 /*break*/, 21];
966
- deleteItem = _d.value;
967
- storeName = deleteItem.storeName, items = deleteItem.items;
968
- store = tx.objectStore(storeName);
969
- _e.label = 4;
970
- case 4:
971
- _e.trys.push([4, 14, 15, 20]);
972
- items_1 = __asyncValues(items);
973
- _e.label = 5;
974
- case 5: return [4 /*yield*/, items_1.next()];
975
- case 6:
976
- if (!(items_1_1 = _e.sent(), !items_1_1.done)) return [3 /*break*/, 13];
977
- item = items_1_1.value;
978
- if (!item) return [3 /*break*/, 12];
979
- key = void 0;
980
- if (!(typeof item === 'object')) return [3 /*break*/, 8];
981
- keyValues = this.getIndexKeyValuesFromModel(item);
982
- return [4 /*yield*/, store
983
- .index('byPk')
984
- .getKey(this.canonicalKeyPath(keyValues))];
985
- case 7:
986
- key = _e.sent();
987
- return [3 /*break*/, 10];
988
- case 8:
989
- itemKey = item.toString();
990
- return [4 /*yield*/, store.index('byPk').getKey(itemKey)];
991
- case 9:
992
- key = _e.sent();
993
- _e.label = 10;
994
- case 10:
995
- if (!(key !== undefined)) return [3 /*break*/, 12];
996
- return [4 /*yield*/, store.delete(key)];
997
- case 11:
998
- _e.sent();
999
- _e.label = 12;
1000
- case 12: return [3 /*break*/, 5];
1001
- case 13: return [3 /*break*/, 20];
1002
- case 14:
1003
- e_10_1 = _e.sent();
1004
- e_10 = { error: e_10_1 };
1005
- return [3 /*break*/, 20];
1006
- case 15:
1007
- _e.trys.push([15, , 18, 19]);
1008
- if (!(items_1_1 && !items_1_1.done && (_b = items_1.return))) return [3 /*break*/, 17];
1009
- return [4 /*yield*/, _b.call(items_1)];
1010
- case 16:
1011
- _e.sent();
1012
- _e.label = 17;
1013
- case 17: return [3 /*break*/, 19];
1014
- case 18:
1015
- if (e_10) throw e_10.error;
1016
- return [7 /*endfinally*/];
1017
- case 19: return [7 /*endfinally*/];
1018
- case 20: return [3 /*break*/, 2];
1019
- case 21: return [3 /*break*/, 28];
1020
- case 22:
1021
- e_9_1 = _e.sent();
1022
- e_9 = { error: e_9_1 };
1023
- return [3 /*break*/, 28];
1024
- case 23:
1025
- _e.trys.push([23, , 26, 27]);
1026
- if (!(_d && !_d.done && (_a = _c.return))) return [3 /*break*/, 25];
1027
- return [4 /*yield*/, _a.call(_c)];
1028
- case 24:
1029
- _e.sent();
1030
- _e.label = 25;
1031
- case 25: return [3 /*break*/, 27];
1032
- case 26:
1033
- if (e_9) throw e_9.error;
1034
- return [7 /*endfinally*/];
1035
- case 27: return [7 /*endfinally*/];
1036
- case 28: return [2 /*return*/];
1037
- }
1038
- });
1039
- });
1040
- };
1041
- IndexedDBAdapter.prototype.deleteTraverse = function (relations, models, srcModel, nameSpace, deleteQueue) {
1042
- var relations_1, relations_1_1, models_1, models_1_1, models_2, models_2_1;
1043
- var e_11, _a, e_12, _b, e_13, _c;
1044
- return __awaiter(this, void 0, void 0, function () {
1045
- 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;
1046
- var _this = this;
1047
- return __generator(this, function (_f) {
1048
- switch (_f.label) {
1049
- case 0:
1050
- _f.trys.push([0, 42, 43, 48]);
1051
- relations_1 = __asyncValues(relations);
1052
- _f.label = 1;
1053
- case 1: return [4 /*yield*/, relations_1.next()];
1054
- case 2:
1055
- if (!(relations_1_1 = _f.sent(), !relations_1_1.done)) return [3 /*break*/, 41];
1056
- rel = relations_1_1.value;
1057
- relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
1058
- storeName = getStorename(nameSpace, modelName);
1059
- _d = relationType;
1060
- switch (_d) {
1061
- case 'HAS_ONE': return [3 /*break*/, 3];
1062
- case 'HAS_MANY': return [3 /*break*/, 23];
1063
- case 'BELONGS_TO': return [3 /*break*/, 38];
1064
- }
1065
- return [3 /*break*/, 39];
1066
- case 3:
1067
- _f.trys.push([3, 16, 17, 22]);
1068
- models_1 = __asyncValues(models);
1069
- _f.label = 4;
1070
- case 4: return [4 /*yield*/, models_1.next()];
1071
- case 5:
1072
- if (!(models_1_1 = _f.sent(), !models_1_1.done)) return [3 /*break*/, 15];
1073
- model = models_1_1.value;
1074
- hasOneIndex = 'byPk';
1075
- if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 8];
1076
- values = targetNames
1077
- .filter(function (targetName) { var _a; return (_a = model[targetName]) !== null && _a !== void 0 ? _a : false; })
1078
- .map(function (targetName) { return model[targetName]; });
1079
- if (values.length === 0)
1080
- return [3 /*break*/, 15];
1081
- return [4 /*yield*/, this.db
1082
- .transaction(storeName, 'readwrite')
1083
- .objectStore(storeName)
1084
- .index(hasOneIndex)
1085
- .get(this.canonicalKeyPath(values))];
1086
- case 6:
1087
- recordToDelete = (_f.sent());
1088
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
1089
- .relationTypes, recordToDelete ? [recordToDelete] : [], modelName, nameSpace, deleteQueue)];
1090
- case 7:
1091
- _f.sent();
1092
- return [3 /*break*/, 15];
1093
- case 8:
1094
- index = void 0;
1095
- values = void 0;
1096
- if (targetName && targetName in model) {
1097
- index = hasOneIndex;
1098
- value = model[targetName];
1099
- if (value === null)
1100
- return [3 /*break*/, 15];
1101
- values = [value];
1102
- }
1103
- else {
1104
- // backwards compatability for older versions of codegen that did not emit targetName for HAS_ONE relations
1105
- // TODO: can we deprecate this? it's been ~2 years since codegen started including targetName for HAS_ONE
1106
- // If we deprecate, we'll need to re-gen the MIPR in __tests__/schema.ts > newSchema
1107
- // otherwise some unit tests will fail
1108
- index = getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
1109
- .relationTypes, srcModel);
1110
- values = this.getIndexKeyValuesFromModel(model);
1111
- }
1112
- if (!values || !index)
1113
- return [3 /*break*/, 15];
1114
- return [4 /*yield*/, this.db
1115
- .transaction(storeName, 'readwrite')
1116
- .objectStore(storeName)
1117
- .index(index)
1118
- .get(this.canonicalKeyPath(values))];
1119
- case 9:
1120
- recordToDelete = (_f.sent());
1121
- if (!recordToDelete) return [3 /*break*/, 11];
1122
- return [4 /*yield*/, this.load(nameSpace, modelName, [recordToDelete])];
1123
- case 10:
1124
- _e = _f.sent();
1125
- return [3 /*break*/, 12];
1126
- case 11:
1127
- _e = [];
1128
- _f.label = 12;
1129
- case 12:
1130
- modelsToDelete = _e;
1131
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
1132
- .relationTypes, modelsToDelete, modelName, nameSpace, deleteQueue)];
1133
- case 13:
1134
- _f.sent();
1135
- _f.label = 14;
1136
- case 14: return [3 /*break*/, 4];
1137
- case 15: return [3 /*break*/, 22];
1138
- case 16:
1139
- e_12_1 = _f.sent();
1140
- e_12 = { error: e_12_1 };
1141
- return [3 /*break*/, 22];
1142
- case 17:
1143
- _f.trys.push([17, , 20, 21]);
1144
- if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 19];
1145
- return [4 /*yield*/, _b.call(models_1)];
1146
- case 18:
1147
- _f.sent();
1148
- _f.label = 19;
1149
- case 19: return [3 /*break*/, 21];
1150
- case 20:
1151
- if (e_12) throw e_12.error;
1152
- return [7 /*endfinally*/];
1153
- case 21: return [7 /*endfinally*/];
1154
- case 22: return [3 /*break*/, 40];
1155
- case 23:
1156
- _f.trys.push([23, 31, 32, 37]);
1157
- models_2 = __asyncValues(models);
1158
- _f.label = 24;
1159
- case 24: return [4 /*yield*/, models_2.next()];
1160
- case 25:
1161
- if (!(models_2_1 = _f.sent(), !models_2_1.done)) return [3 /*break*/, 30];
1162
- model = models_2_1.value;
1163
- index =
1164
- // explicit bi-directional @hasMany and @manyToMany
1165
- getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
1166
- .relationTypes, srcModel) ||
1167
- // uni and/or implicit @hasMany
1168
- getIndexFromAssociation(this.schema.namespaces[nameSpace].relationships[modelName]
1169
- .indexes, associatedWith);
1170
- keyValues = this.getIndexKeyValuesFromModel(model);
1171
- return [4 /*yield*/, this.db
1172
- .transaction(storeName, 'readwrite')
1173
- .objectStore(storeName)
1174
- .index(index)
1175
- .getAll(this.canonicalKeyPath(keyValues))];
1176
- case 26:
1177
- childRecords = _f.sent();
1178
- return [4 /*yield*/, this.load(nameSpace, modelName, childRecords)];
1179
- case 27:
1180
- childModels = _f.sent();
1181
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
1182
- .relationTypes, childModels, modelName, nameSpace, deleteQueue)];
1183
- case 28:
1184
- _f.sent();
1185
- _f.label = 29;
1186
- case 29: return [3 /*break*/, 24];
1187
- case 30: return [3 /*break*/, 37];
1188
- case 31:
1189
- e_13_1 = _f.sent();
1190
- e_13 = { error: e_13_1 };
1191
- return [3 /*break*/, 37];
1192
- case 32:
1193
- _f.trys.push([32, , 35, 36]);
1194
- if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 34];
1195
- return [4 /*yield*/, _c.call(models_2)];
1196
- case 33:
1197
- _f.sent();
1198
- _f.label = 34;
1199
- case 34: return [3 /*break*/, 36];
1200
- case 35:
1201
- if (e_13) throw e_13.error;
1202
- return [7 /*endfinally*/];
1203
- case 36: return [7 /*endfinally*/];
1204
- case 37: return [3 /*break*/, 40];
1205
- case 38:
1206
- // Intentionally blank
1207
- return [3 /*break*/, 40];
1208
- case 39: throw new Error("Invalid relation type " + relationType);
1209
- case 40: return [3 /*break*/, 1];
1210
- case 41: return [3 /*break*/, 48];
1211
- case 42:
1212
- e_11_1 = _f.sent();
1213
- e_11 = { error: e_11_1 };
1214
- return [3 /*break*/, 48];
1215
- case 43:
1216
- _f.trys.push([43, , 46, 47]);
1217
- if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 45];
1218
- return [4 /*yield*/, _a.call(relations_1)];
1219
- case 44:
1220
- _f.sent();
1221
- _f.label = 45;
1222
- case 45: return [3 /*break*/, 47];
1223
- case 46:
1224
- if (e_11) throw e_11.error;
1225
- return [7 /*endfinally*/];
1226
- case 47: return [7 /*endfinally*/];
1227
- case 48:
1228
- deleteQueue.push({
1229
- storeName: getStorename(nameSpace, srcModel),
1230
- items: models.map(function (record) {
1231
- return _this.modelInstanceCreator(_this.getModelConstructorByModelName(nameSpace, srcModel), record);
1232
- }),
1233
- });
1234
- return [2 /*return*/];
1235
- }
1236
- });
1237
- });
1238
- };
1239
- IndexedDBAdapter.prototype.clear = function () {
1240
- var _a;
1241
- return __awaiter(this, void 0, void 0, function () {
1242
- return __generator(this, function (_b) {
1243
- switch (_b.label) {
1244
- case 0: return [4 /*yield*/, this.checkPrivate()];
1245
- case 1:
1246
- _b.sent();
1247
- (_a = this.db) === null || _a === void 0 ? void 0 : _a.close();
1248
- return [4 /*yield*/, idb.deleteDB(this.dbName)];
1249
- case 2:
1250
- _b.sent();
1251
- this.db = undefined;
1252
- this.initPromise = undefined;
1253
- return [2 /*return*/];
1254
- }
1255
- });
1256
- });
1257
- };
1258
- IndexedDBAdapter.prototype.batchSave = function (modelConstructor, items) {
1259
- return __awaiter(this, void 0, void 0, function () {
1260
- var result, storeName, txn, store, _loop_3, this_1, items_2, items_2_1, item, e_14_1;
1261
- var e_14, _a;
1262
- var _this = this;
1263
- return __generator(this, function (_b) {
1264
- switch (_b.label) {
1265
- case 0:
1266
- if (items.length === 0) {
1267
- return [2 /*return*/, []];
1268
- }
1269
- return [4 /*yield*/, this.checkPrivate()];
1270
- case 1:
1271
- _b.sent();
1272
- result = [];
1273
- storeName = this.getStorenameForModel(modelConstructor);
1274
- txn = this.db.transaction(storeName, 'readwrite');
1275
- store = txn.store;
1276
- _loop_3 = function (item) {
1277
- var namespaceName, modelName, model, connectedModels, keyValues, _deleted, index, key, instance;
1278
- return __generator(this, function (_a) {
1279
- switch (_a.label) {
1280
- case 0:
1281
- namespaceName = this_1.namespaceResolver(modelConstructor);
1282
- modelName = modelConstructor.name;
1283
- model = this_1.modelInstanceCreator(modelConstructor, item);
1284
- connectedModels = traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
1285
- keyValues = this_1.getIndexKeyValuesFromModel(model);
1286
- _deleted = item._deleted;
1287
- index = store.index('byPk');
1288
- return [4 /*yield*/, index.getKey(this_1.canonicalKeyPath(keyValues))];
1289
- case 1:
1290
- key = _a.sent();
1291
- if (!!_deleted) return [3 /*break*/, 3];
1292
- instance = connectedModels.find(function (_a) {
1293
- var instance = _a.instance;
1294
- var instanceKeyValues = _this.getIndexKeyValuesFromModel(instance);
1295
- return keysEqual(instanceKeyValues, keyValues);
1296
- }).instance;
1297
- result.push([
1298
- instance,
1299
- key ? OpType.UPDATE : OpType.INSERT,
1300
- ]);
1301
- return [4 /*yield*/, store.put(instance, key)];
1302
- case 2:
1303
- _a.sent();
1304
- return [3 /*break*/, 5];
1305
- case 3:
1306
- result.push([item, OpType.DELETE]);
1307
- if (!key) return [3 /*break*/, 5];
1308
- return [4 /*yield*/, store.delete(key)];
1309
- case 4:
1310
- _a.sent();
1311
- _a.label = 5;
1312
- case 5: return [2 /*return*/];
1313
- }
1314
- });
1315
- };
1316
- this_1 = this;
1317
- _b.label = 2;
1318
- case 2:
1319
- _b.trys.push([2, 7, 8, 9]);
1320
- items_2 = __values(items), items_2_1 = items_2.next();
1321
- _b.label = 3;
1322
- case 3:
1323
- if (!!items_2_1.done) return [3 /*break*/, 6];
1324
- item = items_2_1.value;
1325
- return [5 /*yield**/, _loop_3(item)];
1326
- case 4:
1327
- _b.sent();
1328
- _b.label = 5;
1329
- case 5:
1330
- items_2_1 = items_2.next();
1331
- return [3 /*break*/, 3];
1332
- case 6: return [3 /*break*/, 9];
1333
- case 7:
1334
- e_14_1 = _b.sent();
1335
- e_14 = { error: e_14_1 };
1336
- return [3 /*break*/, 9];
1337
- case 8:
1338
- try {
1339
- if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
1340
- }
1341
- finally { if (e_14) throw e_14.error; }
1342
- return [7 /*endfinally*/];
1343
- case 9: return [4 /*yield*/, txn.done];
1344
- case 10:
1345
- _b.sent();
1346
- return [2 /*return*/, result];
1347
- }
1348
- });
1349
- });
1350
- };
1351
- IndexedDBAdapter.prototype.createObjectStoreForModel = function (db, namespaceName, storeName, modelName) {
1352
- var store = db.createObjectStore(storeName, {
1353
- autoIncrement: true,
1354
- });
1355
- var indexes = this.schema.namespaces[namespaceName].relationships[modelName].indexes;
1356
- indexes.forEach(function (_a) {
1357
- var _b = __read(_a, 3), idxName = _b[0], keyPath = _b[1], options = _b[2];
1358
- store.createIndex(idxName, keyPath, options);
1359
- });
1360
- return store;
1361
- };
1362
967
  return IndexedDBAdapter;
1363
- }());
968
+ }(StorageAdapterBase));
1364
969
  export default new IndexedDBAdapter();
1365
970
  //# sourceMappingURL=IndexedDBAdapter.js.map