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