@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.
- package/lib/datastore/datastore.d.ts +29 -3
- package/lib/datastore/datastore.js +308 -147
- package/lib/datastore/datastore.js.map +1 -1
- package/lib/predicates/index.d.ts +77 -7
- package/lib/predicates/index.js +142 -122
- package/lib/predicates/index.js.map +1 -1
- package/lib/predicates/next.d.ts +51 -10
- package/lib/predicates/next.js +111 -91
- package/lib/predicates/next.js.map +1 -1
- package/lib/storage/adapter/AsyncStorageAdapter.d.ts +28 -30
- package/lib/storage/adapter/AsyncStorageAdapter.js +135 -532
- package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
- package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
- package/lib/storage/adapter/IndexedDBAdapter.d.ts +28 -29
- package/lib/storage/adapter/IndexedDBAdapter.js +490 -885
- package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
- package/lib/storage/adapter/StorageAdapterBase.d.ts +134 -0
- package/lib/storage/adapter/StorageAdapterBase.js +439 -0
- package/lib/storage/adapter/StorageAdapterBase.js.map +1 -0
- package/lib/storage/relationship.d.ts +9 -0
- package/lib/storage/relationship.js +9 -0
- package/lib/storage/relationship.js.map +1 -1
- package/lib/storage/storage.d.ts +1 -1
- package/lib/storage/storage.js +4 -3
- package/lib/storage/storage.js.map +1 -1
- package/lib/sync/index.d.ts +15 -1
- package/lib/sync/index.js +80 -13
- package/lib/sync/index.js.map +1 -1
- package/lib/sync/outbox.js +14 -7
- package/lib/sync/outbox.js.map +1 -1
- package/lib/sync/processors/mutation.d.ts +10 -1
- package/lib/sync/processors/mutation.js +33 -12
- package/lib/sync/processors/mutation.js.map +1 -1
- package/lib/sync/processors/subscription.d.ts +7 -1
- package/lib/sync/processors/subscription.js +196 -135
- package/lib/sync/processors/subscription.js.map +1 -1
- package/lib/sync/processors/sync.d.ts +1 -1
- package/lib/sync/processors/sync.js.map +1 -1
- package/lib/sync/utils.d.ts +66 -2
- package/lib/sync/utils.js +264 -16
- package/lib/sync/utils.js.map +1 -1
- package/lib/types.d.ts +9 -1
- package/lib/types.js.map +1 -1
- package/lib/util.d.ts +16 -0
- package/lib/util.js +31 -2
- package/lib/util.js.map +1 -1
- package/lib-esm/datastore/datastore.d.ts +29 -3
- package/lib-esm/datastore/datastore.js +310 -149
- package/lib-esm/datastore/datastore.js.map +1 -1
- package/lib-esm/predicates/index.d.ts +77 -7
- package/lib-esm/predicates/index.js +143 -123
- package/lib-esm/predicates/index.js.map +1 -1
- package/lib-esm/predicates/next.d.ts +51 -10
- package/lib-esm/predicates/next.js +111 -91
- package/lib-esm/predicates/next.js.map +1 -1
- package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +28 -30
- package/lib-esm/storage/adapter/AsyncStorageAdapter.js +138 -535
- package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
- package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
- package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +28 -29
- package/lib-esm/storage/adapter/IndexedDBAdapter.js +489 -884
- package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
- package/lib-esm/storage/adapter/StorageAdapterBase.d.ts +134 -0
- package/lib-esm/storage/adapter/StorageAdapterBase.js +437 -0
- package/lib-esm/storage/adapter/StorageAdapterBase.js.map +1 -0
- package/lib-esm/storage/relationship.d.ts +9 -0
- package/lib-esm/storage/relationship.js +9 -0
- package/lib-esm/storage/relationship.js.map +1 -1
- package/lib-esm/storage/storage.d.ts +1 -1
- package/lib-esm/storage/storage.js +4 -3
- package/lib-esm/storage/storage.js.map +1 -1
- package/lib-esm/sync/index.d.ts +15 -1
- package/lib-esm/sync/index.js +82 -15
- package/lib-esm/sync/index.js.map +1 -1
- package/lib-esm/sync/outbox.js +14 -7
- package/lib-esm/sync/outbox.js.map +1 -1
- package/lib-esm/sync/processors/mutation.d.ts +10 -1
- package/lib-esm/sync/processors/mutation.js +33 -12
- package/lib-esm/sync/processors/mutation.js.map +1 -1
- package/lib-esm/sync/processors/subscription.d.ts +7 -1
- package/lib-esm/sync/processors/subscription.js +197 -136
- package/lib-esm/sync/processors/subscription.js.map +1 -1
- package/lib-esm/sync/processors/sync.d.ts +1 -1
- package/lib-esm/sync/processors/sync.js.map +1 -1
- package/lib-esm/sync/utils.d.ts +66 -2
- package/lib-esm/sync/utils.js +261 -18
- package/lib-esm/sync/utils.js.map +1 -1
- package/lib-esm/types.d.ts +9 -1
- package/lib-esm/types.js.map +1 -1
- package/lib-esm/util.d.ts +16 -0
- package/lib-esm/util.js +32 -3
- package/lib-esm/util.js.map +1 -1
- package/package.json +12 -11
- package/src/datastore/datastore.ts +288 -159
- package/src/predicates/index.ts +145 -175
- package/src/predicates/next.ts +114 -81
- package/src/storage/adapter/AsyncStorageAdapter.ts +97 -563
- package/src/storage/adapter/AsyncStorageDatabase.ts +2 -2
- package/src/storage/adapter/IndexedDBAdapter.ts +318 -770
- package/src/storage/adapter/StorageAdapterBase.ts +545 -0
- package/src/storage/relationship.ts +9 -0
- package/src/storage/storage.ts +12 -9
- package/src/sync/index.ts +108 -20
- package/src/sync/outbox.ts +17 -11
- package/src/sync/processors/mutation.ts +35 -4
- package/src/sync/processors/subscription.ts +124 -10
- package/src/sync/processors/sync.ts +4 -1
- package/src/sync/utils.ts +285 -15
- package/src/types.ts +15 -2
- package/src/util.ts +40 -1
- 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 {
|
|
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
|
-
|
|
31
|
-
var
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
52
|
-
|
|
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*/,
|
|
70
|
-
return isPrivate;
|
|
71
|
-
})];
|
|
59
|
+
case 0: return [4 /*yield*/, this.checkPrivate()];
|
|
72
60
|
case 1:
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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.
|
|
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
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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 (
|
|
126
|
-
switch (
|
|
127
|
-
case 0: return [4 /*yield*/, this.
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
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
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
})
|
|
269
|
-
|
|
270
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
325
|
+
var _a, storeName, namespaceName, queryByKey, predicates, hasSort, hasPagination, records;
|
|
429
326
|
var _this = this;
|
|
430
|
-
return __generator(this, function (
|
|
431
|
-
switch (
|
|
327
|
+
return __generator(this, function (_b) {
|
|
328
|
+
switch (_b.label) {
|
|
432
329
|
case 0: return [4 /*yield*/, this.checkPrivate()];
|
|
433
330
|
case 1:
|
|
434
|
-
|
|
435
|
-
|
|
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 = (
|
|
364
|
+
records = (_b.sent());
|
|
474
365
|
return [4 /*yield*/, this.load(namespaceName, modelConstructor.name, records)];
|
|
475
|
-
case 3: return [2 /*return*/,
|
|
366
|
+
case 3: return [2 /*return*/, _b.sent()];
|
|
476
367
|
}
|
|
477
368
|
});
|
|
478
369
|
});
|
|
479
370
|
};
|
|
480
|
-
IndexedDBAdapter.prototype.
|
|
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.
|
|
485
|
-
case 1:
|
|
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.
|
|
393
|
+
IndexedDBAdapter.prototype.batchSave = function (modelConstructor, items) {
|
|
491
394
|
return __awaiter(this, void 0, void 0, function () {
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
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.
|
|
501
|
-
var
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
return
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
|
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 = (
|
|
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(
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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,
|
|
694
|
-
var
|
|
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 = (
|
|
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 (
|
|
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 (
|
|
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
|
-
|
|
746
|
-
|
|
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 (
|
|
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
|