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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (111) hide show
  1. package/lib/datastore/datastore.d.ts +29 -3
  2. package/lib/datastore/datastore.js +308 -147
  3. package/lib/datastore/datastore.js.map +1 -1
  4. package/lib/predicates/index.d.ts +77 -7
  5. package/lib/predicates/index.js +142 -122
  6. package/lib/predicates/index.js.map +1 -1
  7. package/lib/predicates/next.d.ts +51 -10
  8. package/lib/predicates/next.js +111 -91
  9. package/lib/predicates/next.js.map +1 -1
  10. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +28 -30
  11. package/lib/storage/adapter/AsyncStorageAdapter.js +135 -532
  12. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  13. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  14. package/lib/storage/adapter/IndexedDBAdapter.d.ts +28 -29
  15. package/lib/storage/adapter/IndexedDBAdapter.js +490 -885
  16. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  17. package/lib/storage/adapter/StorageAdapterBase.d.ts +134 -0
  18. package/lib/storage/adapter/StorageAdapterBase.js +439 -0
  19. package/lib/storage/adapter/StorageAdapterBase.js.map +1 -0
  20. package/lib/storage/relationship.d.ts +9 -0
  21. package/lib/storage/relationship.js +9 -0
  22. package/lib/storage/relationship.js.map +1 -1
  23. package/lib/storage/storage.d.ts +1 -1
  24. package/lib/storage/storage.js +4 -3
  25. package/lib/storage/storage.js.map +1 -1
  26. package/lib/sync/index.d.ts +15 -1
  27. package/lib/sync/index.js +80 -13
  28. package/lib/sync/index.js.map +1 -1
  29. package/lib/sync/outbox.js +14 -7
  30. package/lib/sync/outbox.js.map +1 -1
  31. package/lib/sync/processors/mutation.d.ts +10 -1
  32. package/lib/sync/processors/mutation.js +33 -12
  33. package/lib/sync/processors/mutation.js.map +1 -1
  34. package/lib/sync/processors/subscription.d.ts +7 -1
  35. package/lib/sync/processors/subscription.js +196 -135
  36. package/lib/sync/processors/subscription.js.map +1 -1
  37. package/lib/sync/processors/sync.d.ts +1 -1
  38. package/lib/sync/processors/sync.js.map +1 -1
  39. package/lib/sync/utils.d.ts +66 -2
  40. package/lib/sync/utils.js +264 -16
  41. package/lib/sync/utils.js.map +1 -1
  42. package/lib/types.d.ts +9 -1
  43. package/lib/types.js.map +1 -1
  44. package/lib/util.d.ts +16 -0
  45. package/lib/util.js +31 -2
  46. package/lib/util.js.map +1 -1
  47. package/lib-esm/datastore/datastore.d.ts +29 -3
  48. package/lib-esm/datastore/datastore.js +310 -149
  49. package/lib-esm/datastore/datastore.js.map +1 -1
  50. package/lib-esm/predicates/index.d.ts +77 -7
  51. package/lib-esm/predicates/index.js +143 -123
  52. package/lib-esm/predicates/index.js.map +1 -1
  53. package/lib-esm/predicates/next.d.ts +51 -10
  54. package/lib-esm/predicates/next.js +111 -91
  55. package/lib-esm/predicates/next.js.map +1 -1
  56. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +28 -30
  57. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +138 -535
  58. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  59. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  60. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +28 -29
  61. package/lib-esm/storage/adapter/IndexedDBAdapter.js +489 -884
  62. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  63. package/lib-esm/storage/adapter/StorageAdapterBase.d.ts +134 -0
  64. package/lib-esm/storage/adapter/StorageAdapterBase.js +437 -0
  65. package/lib-esm/storage/adapter/StorageAdapterBase.js.map +1 -0
  66. package/lib-esm/storage/relationship.d.ts +9 -0
  67. package/lib-esm/storage/relationship.js +9 -0
  68. package/lib-esm/storage/relationship.js.map +1 -1
  69. package/lib-esm/storage/storage.d.ts +1 -1
  70. package/lib-esm/storage/storage.js +4 -3
  71. package/lib-esm/storage/storage.js.map +1 -1
  72. package/lib-esm/sync/index.d.ts +15 -1
  73. package/lib-esm/sync/index.js +82 -15
  74. package/lib-esm/sync/index.js.map +1 -1
  75. package/lib-esm/sync/outbox.js +14 -7
  76. package/lib-esm/sync/outbox.js.map +1 -1
  77. package/lib-esm/sync/processors/mutation.d.ts +10 -1
  78. package/lib-esm/sync/processors/mutation.js +33 -12
  79. package/lib-esm/sync/processors/mutation.js.map +1 -1
  80. package/lib-esm/sync/processors/subscription.d.ts +7 -1
  81. package/lib-esm/sync/processors/subscription.js +197 -136
  82. package/lib-esm/sync/processors/subscription.js.map +1 -1
  83. package/lib-esm/sync/processors/sync.d.ts +1 -1
  84. package/lib-esm/sync/processors/sync.js.map +1 -1
  85. package/lib-esm/sync/utils.d.ts +66 -2
  86. package/lib-esm/sync/utils.js +261 -18
  87. package/lib-esm/sync/utils.js.map +1 -1
  88. package/lib-esm/types.d.ts +9 -1
  89. package/lib-esm/types.js.map +1 -1
  90. package/lib-esm/util.d.ts +16 -0
  91. package/lib-esm/util.js +32 -3
  92. package/lib-esm/util.js.map +1 -1
  93. package/package.json +12 -11
  94. package/src/datastore/datastore.ts +288 -159
  95. package/src/predicates/index.ts +145 -175
  96. package/src/predicates/next.ts +114 -81
  97. package/src/storage/adapter/AsyncStorageAdapter.ts +97 -563
  98. package/src/storage/adapter/AsyncStorageDatabase.ts +2 -2
  99. package/src/storage/adapter/IndexedDBAdapter.ts +318 -770
  100. package/src/storage/adapter/StorageAdapterBase.ts +545 -0
  101. package/src/storage/relationship.ts +9 -0
  102. package/src/storage/storage.ts +12 -9
  103. package/src/sync/index.ts +108 -20
  104. package/src/sync/outbox.ts +17 -11
  105. package/src/sync/processors/mutation.ts +35 -4
  106. package/src/sync/processors/subscription.ts +124 -10
  107. package/src/sync/processors/sync.ts +4 -1
  108. package/src/sync/utils.ts +285 -15
  109. package/src/types.ts +15 -2
  110. package/src/util.ts +40 -1
  111. package/CHANGELOG.md +0 -904
@@ -1,107 +1,133 @@
1
- import { __asyncValues, __awaiter, __generator, __values } from "tslib";
2
- import { ConsoleLogger as Logger } from '@aws-amplify/core';
1
+ import { __asyncValues, __awaiter, __extends, __generator, __values } from "tslib";
3
2
  import AsyncStorageDatabase from './AsyncStorageDatabase';
4
- import { ModelPredicateCreator } from '../../predicates';
5
- import { isPredicateObj, OpType, QueryOne, } from '../../types';
6
- import { DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR, getIndex, getIndexFromAssociation, isModelConstructor, traverseModel, validatePredicate, inMemoryPagination, keysEqual, getStorename, getIndexKeys, extractPrimaryKeyValues, IDENTIFIER_KEY_SEPARATOR, } from '../../util';
7
- var logger = new Logger('DataStore');
8
- var AsyncStorageAdapter = /** @class */ (function () {
3
+ import { OpType, QueryOne, } from '../../types';
4
+ import { DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR, traverseModel, validatePredicate, inMemoryPagination, keysEqual, getStorename, getIndexKeys, } from '../../util';
5
+ import { StorageAdapterBase } from './StorageAdapterBase';
6
+ var AsyncStorageAdapter = /** @class */ (function (_super) {
7
+ __extends(AsyncStorageAdapter, _super);
9
8
  function AsyncStorageAdapter() {
9
+ return _super !== null && _super.apply(this, arguments) || this;
10
10
  }
11
- AsyncStorageAdapter.prototype.getStorenameForModel = function (modelConstructor) {
12
- var namespace = this.namespaceResolver(modelConstructor);
13
- var modelName = modelConstructor.name;
14
- return getStorename(namespace, modelName);
11
+ // no-ops for this adapter
12
+ AsyncStorageAdapter.prototype.preSetUpChecks = function () {
13
+ return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
14
+ return [2 /*return*/];
15
+ }); });
15
16
  };
16
- // Retrieves primary key values from a model
17
- AsyncStorageAdapter.prototype.getIndexKeyValuesFromModel = function (model) {
18
- var modelConstructor = Object.getPrototypeOf(model)
19
- .constructor;
20
- var namespaceName = this.namespaceResolver(modelConstructor);
21
- var keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
22
- return extractPrimaryKeyValues(model, keys);
17
+ AsyncStorageAdapter.prototype.preOpCheck = function () {
18
+ return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) {
19
+ return [2 /*return*/];
20
+ }); });
23
21
  };
24
- // Retrieves concatenated primary key values from a model
25
- AsyncStorageAdapter.prototype.getIndexKeyValuesPath = function (model) {
26
- return this.getIndexKeyValuesFromModel(model).join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
27
- };
28
- AsyncStorageAdapter.prototype.setUp = function (theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName) {
22
+ /**
23
+ * Open AsyncStorage database
24
+ * Create new DB if one doesn't exist
25
+ *
26
+ * Called by `StorageAdapterBase.setUp()`
27
+ *
28
+ * @returns AsyncStorageDatabase instance
29
+ */
30
+ AsyncStorageAdapter.prototype.initDb = function () {
29
31
  return __awaiter(this, void 0, void 0, function () {
30
- var error_1;
31
- var _this = this;
32
+ var db;
32
33
  return __generator(this, function (_a) {
33
34
  switch (_a.label) {
34
35
  case 0:
35
- if (!!this.initPromise) return [3 /*break*/, 1];
36
- this.initPromise = new Promise(function (res, rej) {
37
- _this.resolve = res;
38
- _this.reject = rej;
39
- });
40
- return [3 /*break*/, 3];
41
- case 1: return [4 /*yield*/, this.initPromise];
42
- case 2:
36
+ db = new AsyncStorageDatabase();
37
+ return [4 /*yield*/, db.init()];
38
+ case 1:
43
39
  _a.sent();
44
- return [2 /*return*/];
45
- case 3:
46
- this.schema = theSchema;
47
- this.namespaceResolver = namespaceResolver;
48
- this.modelInstanceCreator = modelInstanceCreator;
49
- this.getModelConstructorByModelName = getModelConstructorByModelName;
50
- _a.label = 4;
51
- case 4:
52
- _a.trys.push([4, 7, , 8]);
53
- if (!!this.db) return [3 /*break*/, 6];
54
- this.db = new AsyncStorageDatabase();
55
- return [4 /*yield*/, this.db.init()];
56
- case 5:
40
+ return [2 /*return*/, db];
41
+ }
42
+ });
43
+ });
44
+ };
45
+ AsyncStorageAdapter.prototype.clear = function () {
46
+ return __awaiter(this, void 0, void 0, function () {
47
+ return __generator(this, function (_a) {
48
+ switch (_a.label) {
49
+ case 0: return [4 /*yield*/, this.db.clear()];
50
+ case 1:
57
51
  _a.sent();
58
- this.resolve();
59
- _a.label = 6;
60
- case 6: return [3 /*break*/, 8];
61
- case 7:
62
- error_1 = _a.sent();
63
- this.reject(error_1);
64
- return [3 /*break*/, 8];
65
- case 8: return [2 /*return*/];
52
+ this.db = undefined;
53
+ this.initPromise = undefined;
54
+ return [2 /*return*/];
66
55
  }
67
56
  });
68
57
  });
69
58
  };
70
- AsyncStorageAdapter.prototype.save = function (model, condition) {
71
- var e_1, _a;
59
+ AsyncStorageAdapter.prototype.batchSave = function (modelConstructor, items) {
72
60
  return __awaiter(this, void 0, void 0, function () {
73
- var modelConstructor, storeName, namespaceName, connectedModels, set, connectionStoreNames, keyValuesPath, fromDB, predicates, _b, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, keys, itemKeyValues, itemKeyValuesPath, fromDB_1, opType, modelKeyValues, e_1_1;
61
+ var modelName, namespaceName, storeName, keys, batch, _loop_1, this_1, items_1, items_1_1, item;
62
+ var e_1, _a;
74
63
  var _this = this;
64
+ return __generator(this, function (_b) {
65
+ switch (_b.label) {
66
+ case 0:
67
+ if (items.length === 0) {
68
+ return [2 /*return*/, []];
69
+ }
70
+ modelName = modelConstructor.name;
71
+ namespaceName = this.namespaceResolver(modelConstructor);
72
+ storeName = getStorename(namespaceName, modelName);
73
+ keys = getIndexKeys(this.schema.namespaces[namespaceName], modelName);
74
+ batch = [];
75
+ _loop_1 = function (item) {
76
+ var model = this_1.modelInstanceCreator(modelConstructor, item);
77
+ var connectedModels = traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
78
+ var keyValuesPath = this_1.getIndexKeyValuesPath(model);
79
+ var instance = connectedModels.find(function (_a) {
80
+ var instance = _a.instance;
81
+ var instanceKeyValuesPath = _this.getIndexKeyValuesPath(instance);
82
+ return keysEqual([instanceKeyValuesPath], [keyValuesPath]);
83
+ }).instance;
84
+ batch.push(instance);
85
+ };
86
+ this_1 = this;
87
+ try {
88
+ for (items_1 = __values(items), items_1_1 = items_1.next(); !items_1_1.done; items_1_1 = items_1.next()) {
89
+ item = items_1_1.value;
90
+ _loop_1(item);
91
+ }
92
+ }
93
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
94
+ finally {
95
+ try {
96
+ if (items_1_1 && !items_1_1.done && (_a = items_1.return)) _a.call(items_1);
97
+ }
98
+ finally { if (e_1) throw e_1.error; }
99
+ }
100
+ return [4 /*yield*/, this.db.batchSave(storeName, batch, keys)];
101
+ case 1: return [2 /*return*/, _b.sent()];
102
+ }
103
+ });
104
+ });
105
+ };
106
+ AsyncStorageAdapter.prototype._get = function (storeName, keyArr) {
107
+ return __awaiter(this, void 0, void 0, function () {
108
+ var itemKeyValuesPath;
109
+ return __generator(this, function (_a) {
110
+ switch (_a.label) {
111
+ case 0:
112
+ itemKeyValuesPath = keyArr.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
113
+ return [4 /*yield*/, this.db.get(itemKeyValuesPath, storeName)];
114
+ case 1: return [2 /*return*/, _a.sent()];
115
+ }
116
+ });
117
+ });
118
+ };
119
+ AsyncStorageAdapter.prototype.save = function (model, condition) {
120
+ var e_2, _a;
121
+ return __awaiter(this, void 0, void 0, function () {
122
+ var _b, storeName, connectionStoreNames, modelKeyValues, fromDB, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, keys, itemKeyValues, fromDB_1, opType, e_2_1;
75
123
  return __generator(this, function (_c) {
76
124
  switch (_c.label) {
77
125
  case 0:
78
- modelConstructor = Object.getPrototypeOf(model)
79
- .constructor;
80
- storeName = this.getStorenameForModel(modelConstructor);
81
- namespaceName = this.namespaceResolver(modelConstructor);
82
- connectedModels = traverseModel(modelConstructor.name, model, this.schema.namespaces[namespaceName], this.modelInstanceCreator, this.getModelConstructorByModelName);
83
- set = new Set();
84
- connectionStoreNames = Object.values(connectedModels).map(function (_a) {
85
- var modelName = _a.modelName, item = _a.item, instance = _a.instance;
86
- var storeName = getStorename(namespaceName, modelName);
87
- set.add(storeName);
88
- var keys = getIndexKeys(_this.schema.namespaces[namespaceName], modelName);
89
- return { storeName: storeName, item: item, instance: instance, keys: keys };
90
- });
91
- keyValuesPath = this.getIndexKeyValuesPath(model);
92
- return [4 /*yield*/, this.db.get(keyValuesPath, storeName)];
126
+ _b = this.saveMetadata(model), storeName = _b.storeName, connectionStoreNames = _b.connectionStoreNames, modelKeyValues = _b.modelKeyValues;
127
+ return [4 /*yield*/, this._get(storeName, modelKeyValues)];
93
128
  case 1:
94
129
  fromDB = _c.sent();
95
- if (condition && fromDB) {
96
- predicates = ModelPredicateCreator.getPredicates(condition);
97
- _b = predicates, predicateObjs = _b.predicates, type = _b.type;
98
- isValid = validatePredicate(fromDB, type, predicateObjs);
99
- if (!isValid) {
100
- msg = 'Conditional update failed';
101
- logger.error(msg, { model: fromDB, condition: predicateObjs });
102
- throw new Error(msg);
103
- }
104
- }
130
+ this.validateSaveCondition(condition, fromDB);
105
131
  result = [];
106
132
  _c.label = 2;
107
133
  case 2:
@@ -114,15 +140,13 @@ var AsyncStorageAdapter = /** @class */ (function () {
114
140
  resItem = connectionStoreNames_1_1.value;
115
141
  storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance, keys = resItem.keys;
116
142
  itemKeyValues = keys.map(function (key) { return item[key]; });
117
- itemKeyValuesPath = itemKeyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
118
- return [4 /*yield*/, this.db.get(itemKeyValuesPath, storeName_1)];
143
+ return [4 /*yield*/, this._get(storeName_1, itemKeyValues)];
119
144
  case 5:
120
145
  fromDB_1 = _c.sent();
121
146
  opType = fromDB_1 ? OpType.UPDATE : OpType.INSERT;
122
- modelKeyValues = this.getIndexKeyValuesFromModel(model);
123
147
  if (!(keysEqual(itemKeyValues, modelKeyValues) ||
124
148
  opType === OpType.INSERT)) return [3 /*break*/, 7];
125
- return [4 /*yield*/, this.db.save(item, storeName_1, keys, itemKeyValuesPath)];
149
+ return [4 /*yield*/, this.db.save(item, storeName_1, keys, itemKeyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR))];
126
150
  case 6:
127
151
  _c.sent();
128
152
  result.push([instance, opType]);
@@ -130,8 +154,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
130
154
  case 7: return [3 /*break*/, 3];
131
155
  case 8: return [3 /*break*/, 15];
132
156
  case 9:
133
- e_1_1 = _c.sent();
134
- e_1 = { error: e_1_1 };
157
+ e_2_1 = _c.sent();
158
+ e_2 = { error: e_2_1 };
135
159
  return [3 /*break*/, 15];
136
160
  case 10:
137
161
  _c.trys.push([10, , 13, 14]);
@@ -142,7 +166,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
142
166
  _c.label = 12;
143
167
  case 12: return [3 /*break*/, 14];
144
168
  case 13:
145
- if (e_1) throw e_1.error;
169
+ if (e_2) throw e_2.error;
146
170
  return [7 /*endfinally*/];
147
171
  case 14: return [7 /*endfinally*/];
148
172
  case 15: return [2 /*return*/, result];
@@ -150,50 +174,22 @@ var AsyncStorageAdapter = /** @class */ (function () {
150
174
  });
151
175
  });
152
176
  };
153
- AsyncStorageAdapter.prototype.load = function (namespaceName, srcModelName, records) {
154
- return __awaiter(this, void 0, void 0, function () {
155
- var namespace, relations, connectionStoreNames, modelConstructor;
156
- var _this = this;
157
- return __generator(this, function (_a) {
158
- namespace = this.schema.namespaces[namespaceName];
159
- relations = namespace.relationships[srcModelName].relationTypes;
160
- connectionStoreNames = relations.map(function (_a) {
161
- var modelName = _a.modelName;
162
- return getStorename(namespaceName, modelName);
163
- });
164
- modelConstructor = this.getModelConstructorByModelName(namespaceName, srcModelName);
165
- if (connectionStoreNames.length === 0) {
166
- return [2 /*return*/, records.map(function (record) {
167
- return _this.modelInstanceCreator(modelConstructor, record);
168
- })];
169
- }
170
- return [2 /*return*/, records.map(function (record) {
171
- return _this.modelInstanceCreator(modelConstructor, record);
172
- })];
173
- });
174
- });
175
- };
176
177
  AsyncStorageAdapter.prototype.query = function (modelConstructor, predicate, pagination) {
177
178
  return __awaiter(this, void 0, void 0, function () {
178
- var storeName, namespaceName, predicates, keys, queryByKey, hasSort, hasPagination, records;
179
+ var _a, storeName, namespaceName, queryByKey, predicates, hasSort, hasPagination, records;
179
180
  var _this = this;
180
- return __generator(this, function (_a) {
181
- switch (_a.label) {
181
+ return __generator(this, function (_b) {
182
+ switch (_b.label) {
182
183
  case 0:
183
- storeName = this.getStorenameForModel(modelConstructor);
184
- namespaceName = this.namespaceResolver(modelConstructor);
185
- predicates = predicate && ModelPredicateCreator.getPredicates(predicate);
186
- keys = getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
187
- queryByKey = predicates && this.keyValueFromPredicate(predicates, keys);
188
- hasSort = pagination && pagination.sort;
189
- hasPagination = pagination && pagination.limit;
184
+ _a = this.queryMetadata(modelConstructor, predicate, pagination), storeName = _a.storeName, namespaceName = _a.namespaceName, queryByKey = _a.queryByKey, predicates = _a.predicates, hasSort = _a.hasSort, hasPagination = _a.hasPagination;
190
185
  return [4 /*yield*/, (function () { return __awaiter(_this, void 0, void 0, function () {
191
- var record, filtered, all;
186
+ var keyValues, record, filtered, all;
192
187
  return __generator(this, function (_a) {
193
188
  switch (_a.label) {
194
189
  case 0:
195
190
  if (!queryByKey) return [3 /*break*/, 2];
196
- return [4 /*yield*/, this.getByKey(storeName, queryByKey)];
191
+ keyValues = queryByKey.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
192
+ return [4 /*yield*/, this.getByKey(storeName, keyValues)];
197
193
  case 1:
198
194
  record = _a.sent();
199
195
  return [2 /*return*/, record ? [record] : []];
@@ -214,22 +210,19 @@ var AsyncStorageAdapter = /** @class */ (function () {
214
210
  });
215
211
  }); })()];
216
212
  case 1:
217
- records = (_a.sent());
213
+ records = (_b.sent());
218
214
  return [4 /*yield*/, this.load(namespaceName, modelConstructor.name, records)];
219
- case 2: return [2 /*return*/, _a.sent()];
215
+ case 2: return [2 /*return*/, _b.sent()];
220
216
  }
221
217
  });
222
218
  });
223
219
  };
224
220
  AsyncStorageAdapter.prototype.getByKey = function (storeName, keyValuePath) {
225
221
  return __awaiter(this, void 0, void 0, function () {
226
- var record;
227
222
  return __generator(this, function (_a) {
228
223
  switch (_a.label) {
229
224
  case 0: return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
230
- case 1:
231
- record = _a.sent();
232
- return [2 /*return*/, record];
225
+ case 1: return [2 /*return*/, _a.sent()];
233
226
  }
234
227
  });
235
228
  });
@@ -244,34 +237,6 @@ var AsyncStorageAdapter = /** @class */ (function () {
244
237
  });
245
238
  });
246
239
  };
247
- AsyncStorageAdapter.prototype.keyValueFromPredicate = function (predicates, keys) {
248
- var e_2, _a;
249
- var predicateObjs = predicates.predicates;
250
- if (predicateObjs.length !== keys.length) {
251
- return;
252
- }
253
- var keyValues = [];
254
- var _loop_1 = function (key) {
255
- var predicateObj = predicateObjs.find(function (p) { return isPredicateObj(p) && p.field === key && p.operator === 'eq'; });
256
- predicateObj && keyValues.push(predicateObj.operand);
257
- };
258
- try {
259
- for (var keys_1 = __values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
260
- var key = keys_1_1.value;
261
- _loop_1(key);
262
- }
263
- }
264
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
265
- finally {
266
- try {
267
- if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
268
- }
269
- finally { if (e_2) throw e_2.error; }
270
- }
271
- return keyValues.length === keys.length
272
- ? keyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR)
273
- : undefined;
274
- };
275
240
  AsyncStorageAdapter.prototype.filterOnPredicate = function (storeName, predicates) {
276
241
  return __awaiter(this, void 0, void 0, function () {
277
242
  var predicateObjs, type, all, filtered;
@@ -309,97 +274,10 @@ var AsyncStorageAdapter = /** @class */ (function () {
309
274
  });
310
275
  });
311
276
  };
312
- AsyncStorageAdapter.prototype.delete = function (modelOrModelConstructor, condition) {
313
- return __awaiter(this, void 0, void 0, function () {
314
- var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, nameSpace, storeName, keyValuePath, fromDB, msg, predicates, _a, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
315
- return __generator(this, function (_b) {
316
- switch (_b.label) {
317
- case 0:
318
- deleteQueue = [];
319
- if (!isModelConstructor(modelOrModelConstructor)) return [3 /*break*/, 8];
320
- modelConstructor = modelOrModelConstructor;
321
- nameSpace = this.namespaceResolver(modelConstructor);
322
- return [4 /*yield*/, this.query(modelConstructor, condition)];
323
- case 1:
324
- models = _b.sent();
325
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
326
- .relationTypes;
327
- if (!(condition !== undefined)) return [3 /*break*/, 4];
328
- return [4 /*yield*/, this.deleteTraverse(relations, models, modelConstructor.name, nameSpace, deleteQueue)];
329
- case 2:
330
- _b.sent();
331
- return [4 /*yield*/, this.deleteItem(deleteQueue)];
332
- case 3:
333
- _b.sent();
334
- deletedModels = deleteQueue.reduce(function (acc, _a) {
335
- var items = _a.items;
336
- return acc.concat(items);
337
- }, []);
338
- return [2 /*return*/, [models, deletedModels]];
339
- case 4: return [4 /*yield*/, this.deleteTraverse(relations, models, modelConstructor.name, nameSpace, deleteQueue)];
340
- case 5:
341
- _b.sent();
342
- return [4 /*yield*/, this.deleteItem(deleteQueue)];
343
- case 6:
344
- _b.sent();
345
- deletedModels = deleteQueue.reduce(function (acc, _a) {
346
- var items = _a.items;
347
- return acc.concat(items);
348
- }, []);
349
- return [2 /*return*/, [models, deletedModels]];
350
- case 7: return [3 /*break*/, 15];
351
- case 8:
352
- model = modelOrModelConstructor;
353
- modelConstructor = Object.getPrototypeOf(model)
354
- .constructor;
355
- nameSpace = this.namespaceResolver(modelConstructor);
356
- storeName = this.getStorenameForModel(modelConstructor);
357
- if (!condition) return [3 /*break*/, 11];
358
- keyValuePath = this.getIndexKeyValuesPath(model);
359
- return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
360
- case 9:
361
- fromDB = _b.sent();
362
- if (fromDB === undefined) {
363
- msg = 'Model instance not found in storage';
364
- logger.warn(msg, { model: model });
365
- return [2 /*return*/, [[model], []]];
366
- }
367
- predicates = ModelPredicateCreator.getPredicates(condition);
368
- _a = predicates, predicateObjs = _a.predicates, type = _a.type;
369
- isValid = validatePredicate(fromDB, type, predicateObjs);
370
- if (!isValid) {
371
- msg = 'Conditional update failed';
372
- logger.error(msg, { model: fromDB, condition: predicateObjs });
373
- throw new Error(msg);
374
- }
375
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name].relationTypes;
376
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
377
- case 10:
378
- _b.sent();
379
- return [3 /*break*/, 13];
380
- case 11:
381
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name].relationTypes;
382
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
383
- case 12:
384
- _b.sent();
385
- _b.label = 13;
386
- case 13: return [4 /*yield*/, this.deleteItem(deleteQueue)];
387
- case 14:
388
- _b.sent();
389
- deletedModels = deleteQueue.reduce(function (acc, _a) {
390
- var items = _a.items;
391
- return acc.concat(items);
392
- }, []);
393
- return [2 /*return*/, [[model], deletedModels]];
394
- case 15: return [2 /*return*/];
395
- }
396
- });
397
- });
398
- };
399
277
  AsyncStorageAdapter.prototype.deleteItem = function (deleteQueue) {
400
278
  var e_3, _a, e_4, _b;
401
279
  return __awaiter(this, void 0, void 0, function () {
402
- var _c, _d, deleteItem, storeName, items, items_1, items_1_1, item, keyValuesPath, e_4_1, e_3_1;
280
+ var _c, _d, deleteItem, storeName, items, items_2, items_2_1, item, keyValuesPath, e_4_1, e_3_1;
403
281
  return __generator(this, function (_e) {
404
282
  switch (_e.label) {
405
283
  case 0:
@@ -414,12 +292,12 @@ var AsyncStorageAdapter = /** @class */ (function () {
414
292
  _e.label = 3;
415
293
  case 3:
416
294
  _e.trys.push([3, 9, 10, 15]);
417
- items_1 = __asyncValues(items);
295
+ items_2 = __asyncValues(items);
418
296
  _e.label = 4;
419
- case 4: return [4 /*yield*/, items_1.next()];
297
+ case 4: return [4 /*yield*/, items_2.next()];
420
298
  case 5:
421
- if (!(items_1_1 = _e.sent(), !items_1_1.done)) return [3 /*break*/, 8];
422
- item = items_1_1.value;
299
+ if (!(items_2_1 = _e.sent(), !items_2_1.done)) return [3 /*break*/, 8];
300
+ item = items_2_1.value;
423
301
  if (!item) return [3 /*break*/, 7];
424
302
  if (!(typeof item === 'object')) return [3 /*break*/, 7];
425
303
  keyValuesPath = this.getIndexKeyValuesPath(item);
@@ -435,8 +313,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
435
313
  return [3 /*break*/, 15];
436
314
  case 10:
437
315
  _e.trys.push([10, , 13, 14]);
438
- if (!(items_1_1 && !items_1_1.done && (_b = items_1.return))) return [3 /*break*/, 12];
439
- return [4 /*yield*/, _b.call(items_1)];
316
+ if (!(items_2_1 && !items_2_1.done && (_b = items_2.return))) return [3 /*break*/, 12];
317
+ return [4 /*yield*/, _b.call(items_2)];
440
318
  case 11:
441
319
  _e.sent();
442
320
  _e.label = 12;
@@ -468,293 +346,18 @@ var AsyncStorageAdapter = /** @class */ (function () {
468
346
  });
469
347
  });
470
348
  };
349
+ //#region platform-specific helper methods
471
350
  /**
472
- * Populates the delete Queue with all the items to delete
473
- * @param relations
474
- * @param models
475
- * @param srcModel
476
- * @param nameSpace
477
- * @param deleteQueue
351
+ * Retrieves concatenated primary key values from a model
352
+ *
353
+ * @param model
354
+ * @returns
478
355
  */
479
- AsyncStorageAdapter.prototype.deleteTraverse = function (relations, models, srcModel, nameSpace, deleteQueue) {
480
- var relations_1, relations_1_1, models_1, models_1_1, models_2, models_2_1;
481
- var e_5, _a, e_6, _b, e_7, _c;
482
- return __awaiter(this, void 0, void 0, function () {
483
- var rel, relationType, modelName, targetName, targetNames, associatedWith, storeName, index, _d, model, hasOneIndex_1, hasConnectedModelFields, keyValuesPath, values_1, isUnidirectionalConnection, allRecords, recordToDelete, hasOneIndex_2, hasOneCustomField, keyValuesPath, value_1, allRecords, recordsToDelete, modelsToDelete, _e, e_6_1, model, keyValues, allRecords, indices, childRecords, childModels, e_7_1, e_5_1;
484
- var _this = this;
485
- return __generator(this, function (_f) {
486
- switch (_f.label) {
487
- case 0:
488
- _f.trys.push([0, 42, 43, 48]);
489
- relations_1 = __asyncValues(relations);
490
- _f.label = 1;
491
- case 1: return [4 /*yield*/, relations_1.next()];
492
- case 2:
493
- if (!(relations_1_1 = _f.sent(), !relations_1_1.done)) return [3 /*break*/, 41];
494
- rel = relations_1_1.value;
495
- relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
496
- storeName = getStorename(nameSpace, modelName);
497
- index = getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
498
- .relationTypes, srcModel) ||
499
- // if we were unable to find an index via relationTypes
500
- // i.e. for keyName connections, attempt to find one by the
501
- // associatedWith property
502
- getIndexFromAssociation(this.schema.namespaces[nameSpace].relationships[modelName].indexes, rel.associatedWith);
503
- _d = relationType;
504
- switch (_d) {
505
- case 'HAS_ONE': return [3 /*break*/, 3];
506
- case 'HAS_MANY': return [3 /*break*/, 23];
507
- case 'BELONGS_TO': return [3 /*break*/, 38];
508
- }
509
- return [3 /*break*/, 39];
510
- case 3:
511
- _f.trys.push([3, 16, 17, 22]);
512
- models_1 = __asyncValues(models);
513
- _f.label = 4;
514
- case 4: return [4 /*yield*/, models_1.next()];
515
- case 5:
516
- if (!(models_1_1 = _f.sent(), !models_1_1.done)) return [3 /*break*/, 15];
517
- model = models_1_1.value;
518
- if (!(targetNames && (targetNames === null || targetNames === void 0 ? void 0 : targetNames.length))) return [3 /*break*/, 8];
519
- if (index) {
520
- hasOneIndex_1 = index.split(IDENTIFIER_KEY_SEPARATOR);
521
- }
522
- else if (associatedWith) {
523
- if (Array.isArray(associatedWith)) {
524
- hasOneIndex_1 = associatedWith;
525
- }
526
- else {
527
- hasOneIndex_1 = [associatedWith];
528
- }
529
- }
530
- hasConnectedModelFields = targetNames.every(function (targetName) {
531
- return model.hasOwnProperty(targetName);
532
- });
533
- keyValuesPath = this.getIndexKeyValuesPath(model);
534
- isUnidirectionalConnection = hasOneIndex_1 === associatedWith;
535
- if (hasConnectedModelFields && isUnidirectionalConnection) {
536
- // Values will be that of the child model
537
- values_1 = targetNames
538
- .filter(function (targetName) { var _a; return (_a = model[targetName]) !== null && _a !== void 0 ? _a : false; })
539
- .map(function (targetName) { return model[targetName]; });
540
- }
541
- else {
542
- // values will be that of the parent model
543
- values_1 = keyValuesPath.split(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
544
- }
545
- if (values_1.length === 0)
546
- return [3 /*break*/, 15];
547
- return [4 /*yield*/, this.db.getAll(storeName)];
548
- case 6:
549
- allRecords = _f.sent();
550
- recordToDelete = void 0;
551
- // values === targetNames
552
- if (hasConnectedModelFields) {
553
- /**
554
- * Retrieve record by finding the record where all
555
- * targetNames are present on the connected model.
556
- *
557
- */
558
- // recordToDelete = allRecords.filter(childItem =>
559
- // values.every(value => childItem[value] != null)
560
- // ) as T[];
561
- recordToDelete = allRecords.filter(function (childItem) {
562
- return hasOneIndex_1.every(function (index) { return values_1.includes(childItem[index]); });
563
- });
564
- }
565
- else {
566
- // values === keyValuePath
567
- recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_1] === values_1; });
568
- }
569
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
570
- .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
571
- case 7:
572
- _f.sent();
573
- return [3 /*break*/, 14];
574
- case 8:
575
- hasOneIndex_2 = index || associatedWith;
576
- hasOneCustomField = targetName in model;
577
- keyValuesPath = this.getIndexKeyValuesPath(model);
578
- value_1 = hasOneCustomField
579
- ? model[targetName]
580
- : keyValuesPath;
581
- if (!value_1)
582
- return [3 /*break*/, 15];
583
- return [4 /*yield*/, this.db.getAll(storeName)];
584
- case 9:
585
- allRecords = _f.sent();
586
- recordsToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_2] === value_1; });
587
- if (!recordsToDelete.length) return [3 /*break*/, 11];
588
- return [4 /*yield*/, this.load(nameSpace, modelName, recordsToDelete)];
589
- case 10:
590
- _e = _f.sent();
591
- return [3 /*break*/, 12];
592
- case 11:
593
- _e = [];
594
- _f.label = 12;
595
- case 12:
596
- modelsToDelete = _e;
597
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
598
- .relationTypes, modelsToDelete, modelName, nameSpace, deleteQueue)];
599
- case 13:
600
- _f.sent();
601
- _f.label = 14;
602
- case 14: return [3 /*break*/, 4];
603
- case 15: return [3 /*break*/, 22];
604
- case 16:
605
- e_6_1 = _f.sent();
606
- e_6 = { error: e_6_1 };
607
- return [3 /*break*/, 22];
608
- case 17:
609
- _f.trys.push([17, , 20, 21]);
610
- if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 19];
611
- return [4 /*yield*/, _b.call(models_1)];
612
- case 18:
613
- _f.sent();
614
- _f.label = 19;
615
- case 19: return [3 /*break*/, 21];
616
- case 20:
617
- if (e_6) throw e_6.error;
618
- return [7 /*endfinally*/];
619
- case 21: return [7 /*endfinally*/];
620
- case 22: return [3 /*break*/, 40];
621
- case 23:
622
- _f.trys.push([23, 31, 32, 37]);
623
- models_2 = __asyncValues(models);
624
- _f.label = 24;
625
- case 24: return [4 /*yield*/, models_2.next()];
626
- case 25:
627
- if (!(models_2_1 = _f.sent(), !models_2_1.done)) return [3 /*break*/, 30];
628
- model = models_2_1.value;
629
- keyValues = this.getIndexKeyValuesFromModel(model);
630
- return [4 /*yield*/, this.db.getAll(storeName)];
631
- case 26:
632
- allRecords = _f.sent();
633
- indices = index.split(IDENTIFIER_KEY_SEPARATOR);
634
- childRecords = allRecords.filter(function (childItem) {
635
- return indices.every(function (index) { return keyValues.includes(childItem[index]); });
636
- });
637
- return [4 /*yield*/, this.load(nameSpace, modelName, childRecords)];
638
- case 27:
639
- childModels = _f.sent();
640
- return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
641
- .relationTypes, childModels, modelName, nameSpace, deleteQueue)];
642
- case 28:
643
- _f.sent();
644
- _f.label = 29;
645
- case 29: return [3 /*break*/, 24];
646
- case 30: return [3 /*break*/, 37];
647
- case 31:
648
- e_7_1 = _f.sent();
649
- e_7 = { error: e_7_1 };
650
- return [3 /*break*/, 37];
651
- case 32:
652
- _f.trys.push([32, , 35, 36]);
653
- if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 34];
654
- return [4 /*yield*/, _c.call(models_2)];
655
- case 33:
656
- _f.sent();
657
- _f.label = 34;
658
- case 34: return [3 /*break*/, 36];
659
- case 35:
660
- if (e_7) throw e_7.error;
661
- return [7 /*endfinally*/];
662
- case 36: return [7 /*endfinally*/];
663
- case 37: return [3 /*break*/, 40];
664
- case 38:
665
- // Intentionally blank
666
- return [3 /*break*/, 40];
667
- case 39: throw new Error("Invalid relationType " + relationType);
668
- case 40: return [3 /*break*/, 1];
669
- case 41: return [3 /*break*/, 48];
670
- case 42:
671
- e_5_1 = _f.sent();
672
- e_5 = { error: e_5_1 };
673
- return [3 /*break*/, 48];
674
- case 43:
675
- _f.trys.push([43, , 46, 47]);
676
- if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 45];
677
- return [4 /*yield*/, _a.call(relations_1)];
678
- case 44:
679
- _f.sent();
680
- _f.label = 45;
681
- case 45: return [3 /*break*/, 47];
682
- case 46:
683
- if (e_5) throw e_5.error;
684
- return [7 /*endfinally*/];
685
- case 47: return [7 /*endfinally*/];
686
- case 48:
687
- deleteQueue.push({
688
- storeName: getStorename(nameSpace, srcModel),
689
- items: models.map(function (record) {
690
- return _this.modelInstanceCreator(_this.getModelConstructorByModelName(nameSpace, srcModel), record);
691
- }),
692
- });
693
- return [2 /*return*/];
694
- }
695
- });
696
- });
697
- };
698
- AsyncStorageAdapter.prototype.clear = function () {
699
- return __awaiter(this, void 0, void 0, function () {
700
- return __generator(this, function (_a) {
701
- switch (_a.label) {
702
- case 0: return [4 /*yield*/, this.db.clear()];
703
- case 1:
704
- _a.sent();
705
- this.db = undefined;
706
- this.initPromise = undefined;
707
- return [2 /*return*/];
708
- }
709
- });
710
- });
711
- };
712
- AsyncStorageAdapter.prototype.batchSave = function (modelConstructor, items) {
713
- return __awaiter(this, void 0, void 0, function () {
714
- var modelName, namespaceName, storeName, keys, batch, _loop_2, this_1, items_2, items_2_1, item;
715
- var e_8, _a;
716
- var _this = this;
717
- return __generator(this, function (_b) {
718
- switch (_b.label) {
719
- case 0:
720
- modelName = modelConstructor.name;
721
- namespaceName = this.namespaceResolver(modelConstructor);
722
- storeName = getStorename(namespaceName, modelName);
723
- keys = getIndexKeys(this.schema.namespaces[namespaceName], modelName);
724
- batch = [];
725
- _loop_2 = function (item) {
726
- var model = this_1.modelInstanceCreator(modelConstructor, item);
727
- var connectedModels = traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
728
- var keyValuesPath = this_1.getIndexKeyValuesPath(model);
729
- var instance = connectedModels.find(function (_a) {
730
- var instance = _a.instance;
731
- var instanceKeyValuesPath = _this.getIndexKeyValuesPath(instance);
732
- return keysEqual([instanceKeyValuesPath], [keyValuesPath]);
733
- }).instance;
734
- batch.push(instance);
735
- };
736
- this_1 = this;
737
- try {
738
- for (items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
739
- item = items_2_1.value;
740
- _loop_2(item);
741
- }
742
- }
743
- catch (e_8_1) { e_8 = { error: e_8_1 }; }
744
- finally {
745
- try {
746
- if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
747
- }
748
- finally { if (e_8) throw e_8.error; }
749
- }
750
- return [4 /*yield*/, this.db.batchSave(storeName, batch, keys)];
751
- case 1: return [2 /*return*/, _b.sent()];
752
- }
753
- });
754
- });
356
+ AsyncStorageAdapter.prototype.getIndexKeyValuesPath = function (model) {
357
+ return this.getIndexKeyValuesFromModel(model).join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
755
358
  };
756
359
  return AsyncStorageAdapter;
757
- }());
360
+ }(StorageAdapterBase));
758
361
  export { AsyncStorageAdapter };
759
362
  export default new AsyncStorageAdapter();
760
363
  //# sourceMappingURL=AsyncStorageAdapter.js.map