@aws-amplify/datastore 3.12.6-next.13 → 3.12.6-next.32

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 (162) hide show
  1. package/CHANGELOG.md +58 -0
  2. package/lib/authModeStrategies/multiAuthStrategy.js +17 -64
  3. package/lib/authModeStrategies/multiAuthStrategy.js.map +1 -1
  4. package/lib/datastore/datastore.js +682 -469
  5. package/lib/datastore/datastore.js.map +1 -1
  6. package/lib/index.js +2 -4
  7. package/lib/index.js.map +1 -1
  8. package/lib/predicates/index.js +12 -2
  9. package/lib/predicates/index.js.map +1 -1
  10. package/lib/storage/adapter/AsyncStorageAdapter.js +393 -298
  11. package/lib/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  12. package/lib/storage/adapter/AsyncStorageDatabase.js +97 -122
  13. package/lib/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  14. package/lib/storage/adapter/InMemoryStore.js +16 -67
  15. package/lib/storage/adapter/InMemoryStore.js.map +1 -1
  16. package/lib/storage/adapter/InMemoryStore.native.js +2 -4
  17. package/lib/storage/adapter/InMemoryStore.native.js.map +1 -1
  18. package/lib/storage/adapter/IndexedDBAdapter.js +497 -404
  19. package/lib/storage/adapter/IndexedDBAdapter.js.map +1 -1
  20. package/lib/storage/adapter/getDefaultAdapter/index.js +3 -5
  21. package/lib/storage/adapter/getDefaultAdapter/index.js.map +1 -1
  22. package/lib/storage/adapter/getDefaultAdapter/index.native.js +2 -4
  23. package/lib/storage/adapter/getDefaultAdapter/index.native.js.map +1 -1
  24. package/lib/storage/storage.js +129 -151
  25. package/lib/storage/storage.js.map +1 -1
  26. package/lib/sync/datastoreConnectivity.js +13 -17
  27. package/lib/sync/datastoreConnectivity.js.map +1 -1
  28. package/lib/sync/datastoreReachability/index.native.js +2 -4
  29. package/lib/sync/datastoreReachability/index.native.js.map +1 -1
  30. package/lib/sync/index.js +544 -488
  31. package/lib/sync/index.js.map +1 -1
  32. package/lib/sync/merger.js +21 -80
  33. package/lib/sync/merger.js.map +1 -1
  34. package/lib/sync/outbox.js +95 -162
  35. package/lib/sync/outbox.js.map +1 -1
  36. package/lib/sync/processors/errorMaps.js +4 -34
  37. package/lib/sync/processors/errorMaps.js.map +1 -1
  38. package/lib/sync/processors/mutation.js +285 -312
  39. package/lib/sync/processors/mutation.js.map +1 -1
  40. package/lib/sync/processors/subscription.js +218 -259
  41. package/lib/sync/processors/subscription.js.map +1 -1
  42. package/lib/sync/processors/sync.js +141 -212
  43. package/lib/sync/processors/sync.js.map +1 -1
  44. package/lib/sync/utils.js +50 -61
  45. package/lib/sync/utils.js.map +1 -1
  46. package/lib/types.js +13 -39
  47. package/lib/types.js.map +1 -1
  48. package/lib/util.js +429 -242
  49. package/lib/util.js.map +1 -1
  50. package/lib-esm/authModeStrategies/multiAuthStrategy.d.ts +11 -0
  51. package/lib-esm/authModeStrategies/multiAuthStrategy.js +13 -57
  52. package/lib-esm/authModeStrategies/multiAuthStrategy.js.map +1 -1
  53. package/lib-esm/datastore/datastore.d.ts +107 -17
  54. package/lib-esm/datastore/datastore.js +649 -433
  55. package/lib-esm/datastore/datastore.js.map +1 -1
  56. package/lib-esm/index.d.ts +3 -19
  57. package/lib-esm/predicates/index.d.ts +3 -2
  58. package/lib-esm/predicates/index.js +13 -3
  59. package/lib-esm/predicates/index.js.map +1 -1
  60. package/lib-esm/storage/adapter/AsyncStorageAdapter.d.ts +4 -3
  61. package/lib-esm/storage/adapter/AsyncStorageAdapter.js +356 -258
  62. package/lib-esm/storage/adapter/AsyncStorageAdapter.js.map +1 -1
  63. package/lib-esm/storage/adapter/AsyncStorageDatabase.d.ts +14 -4
  64. package/lib-esm/storage/adapter/AsyncStorageDatabase.js +67 -92
  65. package/lib-esm/storage/adapter/AsyncStorageDatabase.js.map +1 -1
  66. package/lib-esm/storage/adapter/InMemoryStore.js +1 -52
  67. package/lib-esm/storage/adapter/InMemoryStore.js.map +1 -1
  68. package/lib-esm/storage/adapter/IndexedDBAdapter.d.ts +26 -4
  69. package/lib-esm/storage/adapter/IndexedDBAdapter.js +446 -346
  70. package/lib-esm/storage/adapter/IndexedDBAdapter.js.map +1 -1
  71. package/lib-esm/storage/adapter/index.d.ts +1 -1
  72. package/lib-esm/storage/storage.d.ts +1 -1
  73. package/lib-esm/storage/storage.js +94 -113
  74. package/lib-esm/storage/storage.js.map +1 -1
  75. package/lib-esm/sync/datastoreConnectivity.d.ts +1 -0
  76. package/lib-esm/sync/datastoreConnectivity.js +10 -11
  77. package/lib-esm/sync/datastoreConnectivity.js.map +1 -1
  78. package/lib-esm/sync/index.d.ts +31 -5
  79. package/lib-esm/sync/index.js +525 -466
  80. package/lib-esm/sync/index.js.map +1 -1
  81. package/lib-esm/sync/merger.d.ts +9 -3
  82. package/lib-esm/sync/merger.js +14 -73
  83. package/lib-esm/sync/merger.js.map +1 -1
  84. package/lib-esm/sync/outbox.d.ts +2 -2
  85. package/lib-esm/sync/outbox.js +79 -146
  86. package/lib-esm/sync/outbox.js.map +1 -1
  87. package/lib-esm/sync/processors/errorMaps.js +1 -31
  88. package/lib-esm/sync/processors/errorMaps.js.map +1 -1
  89. package/lib-esm/sync/processors/mutation.d.ts +2 -0
  90. package/lib-esm/sync/processors/mutation.js +271 -295
  91. package/lib-esm/sync/processors/mutation.js.map +1 -1
  92. package/lib-esm/sync/processors/subscription.d.ts +2 -0
  93. package/lib-esm/sync/processors/subscription.js +214 -245
  94. package/lib-esm/sync/processors/subscription.js.map +1 -1
  95. package/lib-esm/sync/processors/sync.d.ts +2 -1
  96. package/lib-esm/sync/processors/sync.js +127 -195
  97. package/lib-esm/sync/processors/sync.js.map +1 -1
  98. package/lib-esm/sync/utils.d.ts +3 -2
  99. package/lib-esm/sync/utils.js +45 -57
  100. package/lib-esm/sync/utils.js.map +1 -1
  101. package/lib-esm/types.d.ts +65 -26
  102. package/lib-esm/types.js +10 -38
  103. package/lib-esm/types.js.map +1 -1
  104. package/lib-esm/util.d.ts +67 -24
  105. package/lib-esm/util.js +420 -233
  106. package/lib-esm/util.js.map +1 -1
  107. package/package.json +14 -7
  108. package/src/authModeStrategies/multiAuthStrategy.ts +12 -1
  109. package/src/datastore/datastore.ts +798 -397
  110. package/src/predicates/index.ts +32 -10
  111. package/src/storage/adapter/AsyncStorageAdapter.ts +309 -93
  112. package/src/storage/adapter/AsyncStorageDatabase.ts +74 -26
  113. package/src/storage/adapter/IndexedDBAdapter.ts +358 -134
  114. package/src/storage/adapter/index.ts +1 -1
  115. package/src/storage/storage.ts +69 -22
  116. package/src/sync/datastoreConnectivity.ts +6 -0
  117. package/src/sync/index.ts +521 -412
  118. package/src/sync/merger.ts +20 -4
  119. package/src/sync/outbox.ts +22 -9
  120. package/src/sync/processors/mutation.ts +188 -150
  121. package/src/sync/processors/subscription.ts +289 -253
  122. package/src/sync/processors/sync.ts +151 -138
  123. package/src/sync/utils.ts +67 -12
  124. package/src/types.ts +182 -30
  125. package/src/util.ts +505 -176
  126. package/build.js +0 -5
  127. package/dist/aws-amplify-datastore.js +0 -98255
  128. package/dist/aws-amplify-datastore.js.map +0 -1
  129. package/dist/aws-amplify-datastore.min.js +0 -66
  130. package/dist/aws-amplify-datastore.min.js.map +0 -1
  131. package/index.js +0 -7
  132. package/lib/authModeStrategies/defaultAuthStrategy.d.ts +0 -2
  133. package/lib/authModeStrategies/index.d.ts +0 -2
  134. package/lib/authModeStrategies/multiAuthStrategy.d.ts +0 -2
  135. package/lib/datastore/datastore.d.ts +0 -66
  136. package/lib/index.d.ts +0 -31
  137. package/lib/predicates/index.d.ts +0 -15
  138. package/lib/predicates/sort.d.ts +0 -8
  139. package/lib/ssr/index.d.ts +0 -3
  140. package/lib/storage/adapter/AsyncStorageAdapter.d.ts +0 -40
  141. package/lib/storage/adapter/AsyncStorageDatabase.d.ts +0 -29
  142. package/lib/storage/adapter/InMemoryStore.d.ts +0 -11
  143. package/lib/storage/adapter/InMemoryStore.native.d.ts +0 -1
  144. package/lib/storage/adapter/IndexedDBAdapter.d.ts +0 -37
  145. package/lib/storage/adapter/getDefaultAdapter/index.d.ts +0 -3
  146. package/lib/storage/adapter/getDefaultAdapter/index.native.d.ts +0 -3
  147. package/lib/storage/adapter/index.d.ts +0 -9
  148. package/lib/storage/storage.d.ts +0 -49
  149. package/lib/sync/datastoreConnectivity.d.ts +0 -15
  150. package/lib/sync/datastoreReachability/index.d.ts +0 -3
  151. package/lib/sync/datastoreReachability/index.native.d.ts +0 -3
  152. package/lib/sync/index.d.ts +0 -63
  153. package/lib/sync/merger.d.ts +0 -11
  154. package/lib/sync/outbox.d.ts +0 -27
  155. package/lib/sync/processors/errorMaps.d.ts +0 -17
  156. package/lib/sync/processors/mutation.d.ts +0 -56
  157. package/lib/sync/processors/subscription.d.ts +0 -31
  158. package/lib/sync/processors/sync.d.ts +0 -27
  159. package/lib/sync/utils.d.ts +0 -41
  160. package/lib/types.d.ts +0 -462
  161. package/lib/util.d.ts +0 -113
  162. package/webpack.config.dev.js +0 -6
@@ -1,64 +1,8 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
- var __asyncValues = (this && this.__asyncValues) || function (o) {
39
- if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
40
- var m = o[Symbol.asyncIterator], i;
41
- return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
42
- function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
43
- function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
44
- };
45
- var __values = (this && this.__values) || function(o) {
46
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
47
- if (m) return m.call(o);
48
- if (o && typeof o.length === "number") return {
49
- next: function () {
50
- if (o && i >= o.length) o = void 0;
51
- return { value: o && o[i++], done: !o };
52
- }
53
- };
54
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
55
- };
56
- var __importDefault = (this && this.__importDefault) || function (mod) {
57
- return (mod && mod.__esModule) ? mod : { "default": mod };
58
- };
59
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
60
4
  var core_1 = require("@aws-amplify/core");
61
- var AsyncStorageDatabase_1 = __importDefault(require("./AsyncStorageDatabase"));
5
+ var AsyncStorageDatabase_1 = tslib_1.__importDefault(require("./AsyncStorageDatabase"));
62
6
  var predicates_1 = require("../../predicates");
63
7
  var types_1 = require("../../types");
64
8
  var util_1 = require("../../util");
@@ -69,17 +13,25 @@ var AsyncStorageAdapter = /** @class */ (function () {
69
13
  AsyncStorageAdapter.prototype.getStorenameForModel = function (modelConstructor) {
70
14
  var namespace = this.namespaceResolver(modelConstructor);
71
15
  var modelName = modelConstructor.name;
72
- return this.getStorename(namespace, modelName);
16
+ return util_1.getStorename(namespace, modelName);
73
17
  };
74
- AsyncStorageAdapter.prototype.getStorename = function (namespace, modelName) {
75
- var storeName = namespace + "_" + modelName;
76
- return storeName;
18
+ // Retrieves primary key values from a model
19
+ AsyncStorageAdapter.prototype.getIndexKeyValuesFromModel = function (model) {
20
+ var modelConstructor = Object.getPrototypeOf(model)
21
+ .constructor;
22
+ var namespaceName = this.namespaceResolver(modelConstructor);
23
+ var keys = util_1.getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
24
+ return util_1.extractPrimaryKeyValues(model, keys);
25
+ };
26
+ // Retrieves concatenated primary key values from a model
27
+ AsyncStorageAdapter.prototype.getIndexKeyValuesPath = function (model) {
28
+ return this.getIndexKeyValuesFromModel(model).join(util_1.DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
77
29
  };
78
30
  AsyncStorageAdapter.prototype.setUp = function (theSchema, namespaceResolver, modelInstanceCreator, getModelConstructorByModelName) {
79
- return __awaiter(this, void 0, void 0, function () {
31
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
80
32
  var error_1;
81
33
  var _this = this;
82
- return __generator(this, function (_a) {
34
+ return tslib_1.__generator(this, function (_a) {
83
35
  switch (_a.label) {
84
36
  case 0:
85
37
  if (!!this.initPromise) return [3 /*break*/, 1];
@@ -119,25 +71,27 @@ var AsyncStorageAdapter = /** @class */ (function () {
119
71
  };
120
72
  AsyncStorageAdapter.prototype.save = function (model, condition) {
121
73
  var e_1, _a;
122
- return __awaiter(this, void 0, void 0, function () {
123
- var modelConstructor, storeName, connectedModels, namespaceName, set, connectionStoreNames, fromDB, predicates, predicateObjs, type, isValid, msg, result, connectionStoreNames_1, connectionStoreNames_1_1, resItem, storeName_1, item, instance, id, fromDB_1, opType, e_1_1;
74
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
75
+ var modelConstructor, storeName, namespaceName, connectedModels, set, connectionStoreNames, keyValuesPath, fromDB, predicates, 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;
124
76
  var _this = this;
125
- return __generator(this, function (_b) {
77
+ return tslib_1.__generator(this, function (_b) {
126
78
  switch (_b.label) {
127
79
  case 0:
128
80
  modelConstructor = Object.getPrototypeOf(model)
129
81
  .constructor;
130
82
  storeName = this.getStorenameForModel(modelConstructor);
131
- connectedModels = util_1.traverseModel(modelConstructor.name, model, this.schema.namespaces[this.namespaceResolver(modelConstructor)], this.modelInstanceCreator, this.getModelConstructorByModelName);
132
83
  namespaceName = this.namespaceResolver(modelConstructor);
84
+ connectedModels = util_1.traverseModel(modelConstructor.name, model, this.schema.namespaces[namespaceName], this.modelInstanceCreator, this.getModelConstructorByModelName);
133
85
  set = new Set();
134
86
  connectionStoreNames = Object.values(connectedModels).map(function (_a) {
135
87
  var modelName = _a.modelName, item = _a.item, instance = _a.instance;
136
- var storeName = _this.getStorename(namespaceName, modelName);
88
+ var storeName = util_1.getStorename(namespaceName, modelName);
137
89
  set.add(storeName);
138
- return { storeName: storeName, item: item, instance: instance };
90
+ var keys = util_1.getIndexKeys(_this.schema.namespaces[namespaceName], modelName);
91
+ return { storeName: storeName, item: item, instance: instance, keys: keys };
139
92
  });
140
- return [4 /*yield*/, this.db.get(model.id, storeName)];
93
+ keyValuesPath = this.getIndexKeyValuesPath(model);
94
+ return [4 /*yield*/, this.db.get(keyValuesPath, storeName)];
141
95
  case 1:
142
96
  fromDB = _b.sent();
143
97
  if (condition && fromDB) {
@@ -154,20 +108,23 @@ var AsyncStorageAdapter = /** @class */ (function () {
154
108
  _b.label = 2;
155
109
  case 2:
156
110
  _b.trys.push([2, 9, 10, 15]);
157
- connectionStoreNames_1 = __asyncValues(connectionStoreNames);
111
+ connectionStoreNames_1 = tslib_1.__asyncValues(connectionStoreNames);
158
112
  _b.label = 3;
159
113
  case 3: return [4 /*yield*/, connectionStoreNames_1.next()];
160
114
  case 4:
161
115
  if (!(connectionStoreNames_1_1 = _b.sent(), !connectionStoreNames_1_1.done)) return [3 /*break*/, 8];
162
116
  resItem = connectionStoreNames_1_1.value;
163
- storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance;
164
- id = item.id;
165
- return [4 /*yield*/, this.db.get(id, storeName_1)];
117
+ storeName_1 = resItem.storeName, item = resItem.item, instance = resItem.instance, keys = resItem.keys;
118
+ itemKeyValues = keys.map(function (key) { return item[key]; });
119
+ itemKeyValuesPath = itemKeyValues.join(util_1.DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
120
+ return [4 /*yield*/, this.db.get(itemKeyValuesPath, storeName_1)];
166
121
  case 5:
167
122
  fromDB_1 = _b.sent();
168
123
  opType = fromDB_1 ? types_1.OpType.UPDATE : types_1.OpType.INSERT;
169
- if (!(id === model.id || opType === types_1.OpType.INSERT)) return [3 /*break*/, 7];
170
- return [4 /*yield*/, this.db.save(item, storeName_1)];
124
+ modelKeyValues = this.getIndexKeyValuesFromModel(model);
125
+ if (!(util_1.keysEqual(itemKeyValues, modelKeyValues) ||
126
+ opType === types_1.OpType.INSERT)) return [3 /*break*/, 7];
127
+ return [4 /*yield*/, this.db.save(item, storeName_1, keys, itemKeyValuesPath)];
171
128
  case 6:
172
129
  _b.sent();
173
130
  result.push([instance, opType]);
@@ -198,17 +155,17 @@ var AsyncStorageAdapter = /** @class */ (function () {
198
155
  AsyncStorageAdapter.prototype.load = function (namespaceName, srcModelName, records) {
199
156
  var records_1, records_1_1, records_2, records_2_1;
200
157
  var e_2, _a, e_3, _b, e_4, _c;
201
- return __awaiter(this, void 0, void 0, function () {
202
- var namespace, relations, connectionStoreNames, modelConstructor, relations_1, relations_1_1, relation, fieldName, modelName, targetName, relationType, storeName, modelConstructor_1, _d, recordItem, getByfield, connectionRecord, e_3_1, recordItem, connectionRecord, e_4_1, e_2_1;
158
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
159
+ var namespace, relations, connectionStoreNames, modelConstructor, relations_1, relations_1_1, relation, fieldName, modelName, targetName, targetNames, relationType, storeName, modelConstructor_1, _d, recordItem, getByFields, allPresent, keys, connectionRecord, getByfield, key, connectionRecord, e_3_1, recordItem, allPresent, keys, connectionRecord, key, connectionRecord, e_4_1, e_2_1;
203
160
  var _this = this;
204
- return __generator(this, function (_e) {
161
+ return tslib_1.__generator(this, function (_e) {
205
162
  switch (_e.label) {
206
163
  case 0:
207
164
  namespace = this.schema.namespaces[namespaceName];
208
165
  relations = namespace.relationships[srcModelName].relationTypes;
209
166
  connectionStoreNames = relations.map(function (_a) {
210
167
  var modelName = _a.modelName;
211
- return _this.getStorename(namespaceName, modelName);
168
+ return util_1.getStorename(namespaceName, modelName);
212
169
  });
213
170
  modelConstructor = this.getModelConstructorByModelName(namespaceName, srcModelName);
214
171
  if (connectionStoreNames.length === 0) {
@@ -218,121 +175,171 @@ var AsyncStorageAdapter = /** @class */ (function () {
218
175
  }
219
176
  _e.label = 1;
220
177
  case 1:
221
- _e.trys.push([1, 34, 35, 40]);
222
- relations_1 = __asyncValues(relations);
178
+ _e.trys.push([1, 38, 39, 44]);
179
+ relations_1 = tslib_1.__asyncValues(relations);
223
180
  _e.label = 2;
224
181
  case 2: return [4 /*yield*/, relations_1.next()];
225
182
  case 3:
226
- if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 33];
183
+ if (!(relations_1_1 = _e.sent(), !relations_1_1.done)) return [3 /*break*/, 37];
227
184
  relation = relations_1_1.value;
228
- fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, relationType = relation.relationType;
229
- storeName = this.getStorename(namespaceName, modelName);
185
+ fieldName = relation.fieldName, modelName = relation.modelName, targetName = relation.targetName, targetNames = relation.targetNames, relationType = relation.relationType;
186
+ storeName = util_1.getStorename(namespaceName, modelName);
230
187
  modelConstructor_1 = this.getModelConstructorByModelName(namespaceName, modelName);
231
188
  _d = relationType;
232
189
  switch (_d) {
233
190
  case 'HAS_ONE': return [3 /*break*/, 4];
234
- case 'BELONGS_TO': return [3 /*break*/, 17];
235
- case 'HAS_MANY': return [3 /*break*/, 30];
191
+ case 'BELONGS_TO': return [3 /*break*/, 19];
192
+ case 'HAS_MANY': return [3 /*break*/, 34];
236
193
  }
237
- return [3 /*break*/, 31];
194
+ return [3 /*break*/, 35];
238
195
  case 4:
239
- _e.trys.push([4, 10, 11, 16]);
240
- records_1 = __asyncValues(records);
196
+ _e.trys.push([4, 12, 13, 18]);
197
+ records_1 = tslib_1.__asyncValues(records);
241
198
  _e.label = 5;
242
199
  case 5: return [4 /*yield*/, records_1.next()];
243
200
  case 6:
244
- if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 9];
201
+ if (!(records_1_1 = _e.sent(), !records_1_1.done)) return [3 /*break*/, 11];
245
202
  recordItem = records_1_1.value;
246
- getByfield = recordItem[targetName] ? targetName : fieldName;
247
- if (!recordItem[getByfield])
248
- return [3 /*break*/, 9];
249
- return [4 /*yield*/, this.db.get(recordItem[getByfield], storeName)];
203
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 8];
204
+ getByFields = [];
205
+ allPresent = void 0;
206
+ // iterate through all targetnames to make sure they are all present in the recordItem
207
+ allPresent = targetNames.every(function (targetName) {
208
+ return recordItem[targetName] != null;
209
+ });
210
+ if (!allPresent) {
211
+ return [3 /*break*/, 11];
212
+ }
213
+ getByFields = targetNames;
214
+ keys = getByFields
215
+ .map(function (getByField) { return recordItem[getByField]; })
216
+ .join(util_1.DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
217
+ return [4 /*yield*/, this.db.get(keys, storeName)];
250
218
  case 7:
251
219
  connectionRecord = _e.sent();
252
220
  recordItem[fieldName] =
253
221
  connectionRecord &&
254
222
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
255
- _e.label = 8;
256
- case 8: return [3 /*break*/, 5];
257
- case 9: return [3 /*break*/, 16];
258
- case 10:
223
+ return [3 /*break*/, 10];
224
+ case 8:
225
+ getByfield = recordItem[targetName]
226
+ ? targetName
227
+ : fieldName;
228
+ if (!recordItem[getByfield])
229
+ return [3 /*break*/, 11];
230
+ key = recordItem[getByfield];
231
+ return [4 /*yield*/, this.db.get(key, storeName)];
232
+ case 9:
233
+ connectionRecord = _e.sent();
234
+ recordItem[fieldName] =
235
+ connectionRecord &&
236
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
237
+ _e.label = 10;
238
+ case 10: return [3 /*break*/, 5];
239
+ case 11: return [3 /*break*/, 18];
240
+ case 12:
259
241
  e_3_1 = _e.sent();
260
242
  e_3 = { error: e_3_1 };
261
- return [3 /*break*/, 16];
262
- case 11:
263
- _e.trys.push([11, , 14, 15]);
264
- if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 13];
243
+ return [3 /*break*/, 18];
244
+ case 13:
245
+ _e.trys.push([13, , 16, 17]);
246
+ if (!(records_1_1 && !records_1_1.done && (_b = records_1.return))) return [3 /*break*/, 15];
265
247
  return [4 /*yield*/, _b.call(records_1)];
266
- case 12:
267
- _e.sent();
268
- _e.label = 13;
269
- case 13: return [3 /*break*/, 15];
270
248
  case 14:
249
+ _e.sent();
250
+ _e.label = 15;
251
+ case 15: return [3 /*break*/, 17];
252
+ case 16:
271
253
  if (e_3) throw e_3.error;
272
254
  return [7 /*endfinally*/];
273
- case 15: return [7 /*endfinally*/];
274
- case 16: return [3 /*break*/, 32];
275
- case 17:
276
- _e.trys.push([17, 23, 24, 29]);
277
- records_2 = __asyncValues(records);
278
- _e.label = 18;
279
- case 18: return [4 /*yield*/, records_2.next()];
255
+ case 17: return [7 /*endfinally*/];
256
+ case 18: return [3 /*break*/, 36];
280
257
  case 19:
281
- if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 22];
258
+ _e.trys.push([19, 27, 28, 33]);
259
+ records_2 = tslib_1.__asyncValues(records);
260
+ _e.label = 20;
261
+ case 20: return [4 /*yield*/, records_2.next()];
262
+ case 21:
263
+ if (!(records_2_1 = _e.sent(), !records_2_1.done)) return [3 /*break*/, 26];
282
264
  recordItem = records_2_1.value;
283
- if (!recordItem[targetName]) return [3 /*break*/, 21];
284
- return [4 /*yield*/, this.db.get(recordItem[targetName], storeName)];
285
- case 20:
265
+ if (!(targetNames === null || targetNames === void 0 ? void 0 : targetNames.length)) return [3 /*break*/, 23];
266
+ allPresent = void 0;
267
+ // iterate through all targetnames to make sure they are all present in the recordItem
268
+ allPresent = targetNames.every(function (targetName) {
269
+ return recordItem[targetName] != null;
270
+ });
271
+ // If not present, there is not yet a connected record
272
+ if (!allPresent) {
273
+ return [3 /*break*/, 26];
274
+ }
275
+ keys = targetNames
276
+ .map(function (targetName) { return recordItem[targetName]; })
277
+ .join(util_1.DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
278
+ return [4 /*yield*/, this.db.get(keys, storeName)];
279
+ case 22:
286
280
  connectionRecord = _e.sent();
287
281
  recordItem[fieldName] =
288
282
  connectionRecord &&
289
283
  this.modelInstanceCreator(modelConstructor_1, connectionRecord);
290
- delete recordItem[targetName];
291
- _e.label = 21;
292
- case 21: return [3 /*break*/, 18];
293
- case 22: return [3 /*break*/, 29];
284
+ targetNames === null || targetNames === void 0 ? void 0 : targetNames.map(function (targetName) {
285
+ delete recordItem[targetName];
286
+ });
287
+ return [3 /*break*/, 25];
294
288
  case 23:
289
+ if (!recordItem[targetName]) return [3 /*break*/, 25];
290
+ key = recordItem[targetName];
291
+ return [4 /*yield*/, this.db.get(key, storeName)];
292
+ case 24:
293
+ connectionRecord = _e.sent();
294
+ recordItem[fieldName] =
295
+ connectionRecord &&
296
+ this.modelInstanceCreator(modelConstructor_1, connectionRecord);
297
+ delete recordItem[targetName];
298
+ _e.label = 25;
299
+ case 25: return [3 /*break*/, 20];
300
+ case 26: return [3 /*break*/, 33];
301
+ case 27:
295
302
  e_4_1 = _e.sent();
296
303
  e_4 = { error: e_4_1 };
297
- return [3 /*break*/, 29];
298
- case 24:
299
- _e.trys.push([24, , 27, 28]);
300
- if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 26];
304
+ return [3 /*break*/, 33];
305
+ case 28:
306
+ _e.trys.push([28, , 31, 32]);
307
+ if (!(records_2_1 && !records_2_1.done && (_c = records_2.return))) return [3 /*break*/, 30];
301
308
  return [4 /*yield*/, _c.call(records_2)];
302
- case 25:
309
+ case 29:
303
310
  _e.sent();
304
- _e.label = 26;
305
- case 26: return [3 /*break*/, 28];
306
- case 27:
311
+ _e.label = 30;
312
+ case 30: return [3 /*break*/, 32];
313
+ case 31:
307
314
  if (e_4) throw e_4.error;
308
315
  return [7 /*endfinally*/];
309
- case 28: return [7 /*endfinally*/];
310
- case 29: return [3 /*break*/, 32];
311
- case 30:
316
+ case 32: return [7 /*endfinally*/];
317
+ case 33: return [3 /*break*/, 36];
318
+ case 34:
312
319
  // TODO: Lazy loading
313
- return [3 /*break*/, 32];
314
- case 31:
320
+ return [3 /*break*/, 36];
321
+ case 35:
315
322
  util_1.exhaustiveCheck(relationType);
316
- return [3 /*break*/, 32];
317
- case 32: return [3 /*break*/, 2];
318
- case 33: return [3 /*break*/, 40];
319
- case 34:
323
+ return [3 /*break*/, 36];
324
+ case 36: return [3 /*break*/, 2];
325
+ case 37: return [3 /*break*/, 44];
326
+ case 38:
320
327
  e_2_1 = _e.sent();
321
328
  e_2 = { error: e_2_1 };
322
- return [3 /*break*/, 40];
323
- case 35:
324
- _e.trys.push([35, , 38, 39]);
325
- if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 37];
329
+ return [3 /*break*/, 44];
330
+ case 39:
331
+ _e.trys.push([39, , 42, 43]);
332
+ if (!(relations_1_1 && !relations_1_1.done && (_a = relations_1.return))) return [3 /*break*/, 41];
326
333
  return [4 /*yield*/, _a.call(relations_1)];
327
- case 36:
334
+ case 40:
328
335
  _e.sent();
329
- _e.label = 37;
330
- case 37: return [3 /*break*/, 39];
331
- case 38:
336
+ _e.label = 41;
337
+ case 41: return [3 /*break*/, 43];
338
+ case 42:
332
339
  if (e_2) throw e_2.error;
333
340
  return [7 /*endfinally*/];
334
- case 39: return [7 /*endfinally*/];
335
- case 40: return [2 /*return*/, records.map(function (record) {
341
+ case 43: return [7 /*endfinally*/];
342
+ case 44: return [2 /*return*/, records.map(function (record) {
336
343
  return _this.modelInstanceCreator(modelConstructor, record);
337
344
  })];
338
345
  }
@@ -340,25 +347,26 @@ var AsyncStorageAdapter = /** @class */ (function () {
340
347
  });
341
348
  };
342
349
  AsyncStorageAdapter.prototype.query = function (modelConstructor, predicate, pagination) {
343
- return __awaiter(this, void 0, void 0, function () {
344
- var storeName, namespaceName, predicates, queryById, hasSort, hasPagination, records;
350
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
351
+ var storeName, namespaceName, predicates, keys, queryByKey, hasSort, hasPagination, records;
345
352
  var _this = this;
346
- return __generator(this, function (_a) {
353
+ return tslib_1.__generator(this, function (_a) {
347
354
  switch (_a.label) {
348
355
  case 0:
349
356
  storeName = this.getStorenameForModel(modelConstructor);
350
357
  namespaceName = this.namespaceResolver(modelConstructor);
351
358
  predicates = predicate && predicates_1.ModelPredicateCreator.getPredicates(predicate);
352
- queryById = predicates && this.idFromPredicate(predicates);
359
+ keys = util_1.getIndexKeys(this.schema.namespaces[namespaceName], modelConstructor.name);
360
+ queryByKey = predicates && this.keyValueFromPredicate(predicates, keys);
353
361
  hasSort = pagination && pagination.sort;
354
362
  hasPagination = pagination && pagination.limit;
355
- return [4 /*yield*/, (function () { return __awaiter(_this, void 0, void 0, function () {
363
+ return [4 /*yield*/, (function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
356
364
  var record, filtered, all;
357
- return __generator(this, function (_a) {
365
+ return tslib_1.__generator(this, function (_a) {
358
366
  switch (_a.label) {
359
367
  case 0:
360
- if (!queryById) return [3 /*break*/, 2];
361
- return [4 /*yield*/, this.getById(storeName, queryById)];
368
+ if (!queryByKey) return [3 /*break*/, 2];
369
+ return [4 /*yield*/, this.getByKey(storeName, queryByKey)];
362
370
  case 1:
363
371
  record = _a.sent();
364
372
  return [2 /*return*/, record ? [record] : []];
@@ -386,12 +394,12 @@ var AsyncStorageAdapter = /** @class */ (function () {
386
394
  });
387
395
  });
388
396
  };
389
- AsyncStorageAdapter.prototype.getById = function (storeName, id) {
390
- return __awaiter(this, void 0, void 0, function () {
397
+ AsyncStorageAdapter.prototype.getByKey = function (storeName, keyValuePath) {
398
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
391
399
  var record;
392
- return __generator(this, function (_a) {
400
+ return tslib_1.__generator(this, function (_a) {
393
401
  switch (_a.label) {
394
- case 0: return [4 /*yield*/, this.db.get(id, storeName)];
402
+ case 0: return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
395
403
  case 1:
396
404
  record = _a.sent();
397
405
  return [2 /*return*/, record];
@@ -400,8 +408,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
400
408
  });
401
409
  };
402
410
  AsyncStorageAdapter.prototype.getAll = function (storeName) {
403
- return __awaiter(this, void 0, void 0, function () {
404
- return __generator(this, function (_a) {
411
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
412
+ return tslib_1.__generator(this, function (_a) {
405
413
  switch (_a.label) {
406
414
  case 0: return [4 /*yield*/, this.db.getAll(storeName)];
407
415
  case 1: return [2 /*return*/, _a.sent()];
@@ -409,16 +417,38 @@ var AsyncStorageAdapter = /** @class */ (function () {
409
417
  });
410
418
  });
411
419
  };
412
- AsyncStorageAdapter.prototype.idFromPredicate = function (predicates) {
420
+ AsyncStorageAdapter.prototype.keyValueFromPredicate = function (predicates, keys) {
421
+ var e_5, _a;
413
422
  var predicateObjs = predicates.predicates;
414
- var idPredicate = predicateObjs.length === 1 &&
415
- predicateObjs.find(function (p) { return types_1.isPredicateObj(p) && p.field === 'id' && p.operator === 'eq'; });
416
- return idPredicate && idPredicate.operand;
423
+ if (predicateObjs.length !== keys.length) {
424
+ return;
425
+ }
426
+ var keyValues = [];
427
+ var _loop_1 = function (key) {
428
+ var predicateObj = predicateObjs.find(function (p) { return types_1.isPredicateObj(p) && p.field === key && p.operator === 'eq'; });
429
+ predicateObj && keyValues.push(predicateObj.operand);
430
+ };
431
+ try {
432
+ for (var keys_1 = tslib_1.__values(keys), keys_1_1 = keys_1.next(); !keys_1_1.done; keys_1_1 = keys_1.next()) {
433
+ var key = keys_1_1.value;
434
+ _loop_1(key);
435
+ }
436
+ }
437
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
438
+ finally {
439
+ try {
440
+ if (keys_1_1 && !keys_1_1.done && (_a = keys_1.return)) _a.call(keys_1);
441
+ }
442
+ finally { if (e_5) throw e_5.error; }
443
+ }
444
+ return keyValues.length === keys.length
445
+ ? keyValues.join(util_1.DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR)
446
+ : undefined;
417
447
  };
418
448
  AsyncStorageAdapter.prototype.filterOnPredicate = function (storeName, predicates) {
419
- return __awaiter(this, void 0, void 0, function () {
449
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
420
450
  var predicateObjs, type, all, filtered;
421
- return __generator(this, function (_a) {
451
+ return tslib_1.__generator(this, function (_a) {
422
452
  switch (_a.label) {
423
453
  case 0:
424
454
  predicateObjs = predicates.predicates, type = predicates.type;
@@ -451,9 +481,9 @@ var AsyncStorageAdapter = /** @class */ (function () {
451
481
  };
452
482
  AsyncStorageAdapter.prototype.queryOne = function (modelConstructor, firstOrLast) {
453
483
  if (firstOrLast === void 0) { firstOrLast = types_1.QueryOne.FIRST; }
454
- return __awaiter(this, void 0, void 0, function () {
484
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
455
485
  var storeName, result;
456
- return __generator(this, function (_a) {
486
+ return tslib_1.__generator(this, function (_a) {
457
487
  switch (_a.label) {
458
488
  case 0:
459
489
  storeName = this.getStorenameForModel(modelConstructor);
@@ -466,9 +496,9 @@ var AsyncStorageAdapter = /** @class */ (function () {
466
496
  });
467
497
  };
468
498
  AsyncStorageAdapter.prototype.delete = function (modelOrModelConstructor, condition) {
469
- return __awaiter(this, void 0, void 0, function () {
470
- var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, nameSpace, storeName, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
471
- return __generator(this, function (_a) {
499
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
500
+ var deleteQueue, modelConstructor, nameSpace, models, relations, deletedModels, deletedModels, model, modelConstructor, namespaceName, storeName, keyValuePath, fromDB, msg, predicates, predicateObjs, type, isValid, msg, relations, relations, deletedModels;
501
+ return tslib_1.__generator(this, function (_a) {
472
502
  switch (_a.label) {
473
503
  case 0:
474
504
  deleteQueue = [];
@@ -508,10 +538,11 @@ var AsyncStorageAdapter = /** @class */ (function () {
508
538
  model = modelOrModelConstructor;
509
539
  modelConstructor = Object.getPrototypeOf(model)
510
540
  .constructor;
511
- nameSpace = this.namespaceResolver(modelConstructor);
541
+ namespaceName = this.namespaceResolver(modelConstructor);
512
542
  storeName = this.getStorenameForModel(modelConstructor);
513
543
  if (!condition) return [3 /*break*/, 11];
514
- return [4 /*yield*/, this.db.get(model.id, storeName)];
544
+ keyValuePath = this.getIndexKeyValuesPath(model);
545
+ return [4 /*yield*/, this.db.get(keyValuePath, storeName)];
515
546
  case 9:
516
547
  fromDB = _a.sent();
517
548
  if (fromDB === undefined) {
@@ -527,16 +558,14 @@ var AsyncStorageAdapter = /** @class */ (function () {
527
558
  logger.error(msg, { model: fromDB, condition: predicateObjs });
528
559
  throw new Error(msg);
529
560
  }
530
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
531
- .relationTypes;
532
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
561
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
562
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
533
563
  case 10:
534
564
  _a.sent();
535
565
  return [3 /*break*/, 13];
536
566
  case 11:
537
- relations = this.schema.namespaces[nameSpace].relationships[modelConstructor.name]
538
- .relationTypes;
539
- return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, nameSpace, deleteQueue)];
567
+ relations = this.schema.namespaces[namespaceName].relationships[modelConstructor.name].relationTypes;
568
+ return [4 /*yield*/, this.deleteTraverse(relations, [model], modelConstructor.name, namespaceName, deleteQueue)];
540
569
  case 12:
541
570
  _a.sent();
542
571
  _a.label = 13;
@@ -555,14 +584,14 @@ var AsyncStorageAdapter = /** @class */ (function () {
555
584
  };
556
585
  AsyncStorageAdapter.prototype.deleteItem = function (deleteQueue) {
557
586
  var deleteQueue_1, deleteQueue_1_1;
558
- var e_5, _a, e_6, _b;
559
- return __awaiter(this, void 0, void 0, function () {
560
- var deleteItem, storeName, items, items_1, items_1_1, item, id, e_6_1, e_5_1;
561
- return __generator(this, function (_c) {
587
+ var e_6, _a, e_7, _b;
588
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
589
+ var deleteItem, storeName, items, items_1, items_1_1, item, keyValuesPath, e_7_1, e_6_1;
590
+ return tslib_1.__generator(this, function (_c) {
562
591
  switch (_c.label) {
563
592
  case 0:
564
593
  _c.trys.push([0, 17, 18, 23]);
565
- deleteQueue_1 = __asyncValues(deleteQueue);
594
+ deleteQueue_1 = tslib_1.__asyncValues(deleteQueue);
566
595
  _c.label = 1;
567
596
  case 1: return [4 /*yield*/, deleteQueue_1.next()];
568
597
  case 2:
@@ -572,7 +601,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
572
601
  _c.label = 3;
573
602
  case 3:
574
603
  _c.trys.push([3, 9, 10, 15]);
575
- items_1 = __asyncValues(items);
604
+ items_1 = tslib_1.__asyncValues(items);
576
605
  _c.label = 4;
577
606
  case 4: return [4 /*yield*/, items_1.next()];
578
607
  case 5:
@@ -580,16 +609,16 @@ var AsyncStorageAdapter = /** @class */ (function () {
580
609
  item = items_1_1.value;
581
610
  if (!item) return [3 /*break*/, 7];
582
611
  if (!(typeof item === 'object')) return [3 /*break*/, 7];
583
- id = item['id'];
584
- return [4 /*yield*/, this.db.delete(id, storeName)];
612
+ keyValuesPath = this.getIndexKeyValuesPath(item);
613
+ return [4 /*yield*/, this.db.delete(keyValuesPath, storeName)];
585
614
  case 6:
586
615
  _c.sent();
587
616
  _c.label = 7;
588
617
  case 7: return [3 /*break*/, 4];
589
618
  case 8: return [3 /*break*/, 15];
590
619
  case 9:
591
- e_6_1 = _c.sent();
592
- e_6 = { error: e_6_1 };
620
+ e_7_1 = _c.sent();
621
+ e_7 = { error: e_7_1 };
593
622
  return [3 /*break*/, 15];
594
623
  case 10:
595
624
  _c.trys.push([10, , 13, 14]);
@@ -600,14 +629,14 @@ var AsyncStorageAdapter = /** @class */ (function () {
600
629
  _c.label = 12;
601
630
  case 12: return [3 /*break*/, 14];
602
631
  case 13:
603
- if (e_6) throw e_6.error;
632
+ if (e_7) throw e_7.error;
604
633
  return [7 /*endfinally*/];
605
634
  case 14: return [7 /*endfinally*/];
606
635
  case 15: return [3 /*break*/, 1];
607
636
  case 16: return [3 /*break*/, 23];
608
637
  case 17:
609
- e_5_1 = _c.sent();
610
- e_5 = { error: e_5_1 };
638
+ e_6_1 = _c.sent();
639
+ e_6 = { error: e_6_1 };
611
640
  return [3 /*break*/, 23];
612
641
  case 18:
613
642
  _c.trys.push([18, , 21, 22]);
@@ -618,7 +647,7 @@ var AsyncStorageAdapter = /** @class */ (function () {
618
647
  _c.label = 20;
619
648
  case 20: return [3 /*break*/, 22];
620
649
  case 21:
621
- if (e_5) throw e_5.error;
650
+ if (e_6) throw e_6.error;
622
651
  return [7 /*endfinally*/];
623
652
  case 22: return [7 /*endfinally*/];
624
653
  case 23: return [2 /*return*/];
@@ -636,22 +665,22 @@ var AsyncStorageAdapter = /** @class */ (function () {
636
665
  */
637
666
  AsyncStorageAdapter.prototype.deleteTraverse = function (relations, models, srcModel, nameSpace, deleteQueue) {
638
667
  var relations_2, relations_2_1, models_1, models_1_1, models_2, models_2_1;
639
- var e_7, _a, e_8, _b, e_9, _c;
640
- return __awaiter(this, void 0, void 0, function () {
641
- var rel, relationType, modelName, targetName, storeName, index, _d, model, hasOneIndex, hasOneCustomField, value, allRecords, recordToDelete, e_8_1, model, allRecords, childrenArray, e_9_1, e_7_1;
668
+ var e_8, _a, e_9, _b, e_10, _c;
669
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
670
+ 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, recordToDelete, e_9_1, model, keyValues, allRecords, indices, childrenArray, e_10_1, e_8_1;
642
671
  var _this = this;
643
- return __generator(this, function (_e) {
672
+ return tslib_1.__generator(this, function (_e) {
644
673
  switch (_e.label) {
645
674
  case 0:
646
- _e.trys.push([0, 35, 36, 41]);
647
- relations_2 = __asyncValues(relations);
675
+ _e.trys.push([0, 38, 39, 44]);
676
+ relations_2 = tslib_1.__asyncValues(relations);
648
677
  _e.label = 1;
649
678
  case 1: return [4 /*yield*/, relations_2.next()];
650
679
  case 2:
651
- if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 34];
680
+ if (!(relations_2_1 = _e.sent(), !relations_2_1.done)) return [3 /*break*/, 37];
652
681
  rel = relations_2_1.value;
653
- relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName;
654
- storeName = this.getStorename(nameSpace, modelName);
682
+ relationType = rel.relationType, modelName = rel.modelName, targetName = rel.targetName, targetNames = rel.targetNames, associatedWith = rel.associatedWith;
683
+ storeName = util_1.getStorename(nameSpace, modelName);
655
684
  index = util_1.getIndex(this.schema.namespaces[nameSpace].relationships[modelName]
656
685
  .relationTypes, srcModel) ||
657
686
  // if we were unable to find an index via relationTypes
@@ -661,114 +690,176 @@ var AsyncStorageAdapter = /** @class */ (function () {
661
690
  _d = relationType;
662
691
  switch (_d) {
663
692
  case 'HAS_ONE': return [3 /*break*/, 3];
664
- case 'HAS_MANY': return [3 /*break*/, 17];
665
- case 'BELONGS_TO': return [3 /*break*/, 31];
693
+ case 'HAS_MANY': return [3 /*break*/, 20];
694
+ case 'BELONGS_TO': return [3 /*break*/, 34];
666
695
  }
667
- return [3 /*break*/, 32];
696
+ return [3 /*break*/, 35];
668
697
  case 3:
669
- _e.trys.push([3, 10, 11, 16]);
670
- models_1 = __asyncValues(models);
698
+ _e.trys.push([3, 13, 14, 19]);
699
+ models_1 = tslib_1.__asyncValues(models);
671
700
  _e.label = 4;
672
701
  case 4: return [4 /*yield*/, models_1.next()];
673
702
  case 5:
674
- if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 9];
703
+ if (!(models_1_1 = _e.sent(), !models_1_1.done)) return [3 /*break*/, 12];
675
704
  model = models_1_1.value;
676
- hasOneIndex = index || 'byId';
677
- hasOneCustomField = targetName in model;
678
- value = hasOneCustomField ? model[targetName] : model.id;
679
- if (!value)
680
- return [3 /*break*/, 9];
705
+ if (!(targetNames && (targetNames === null || targetNames === void 0 ? void 0 : targetNames.length))) return [3 /*break*/, 8];
706
+ if (index) {
707
+ hasOneIndex_1 = index.split(util_1.IDENTIFIER_KEY_SEPARATOR);
708
+ }
709
+ else if (associatedWith) {
710
+ if (Array.isArray(associatedWith)) {
711
+ hasOneIndex_1 = associatedWith;
712
+ }
713
+ else {
714
+ hasOneIndex_1 = [associatedWith];
715
+ }
716
+ }
717
+ hasConnectedModelFields = targetNames.every(function (targetName) {
718
+ return model.hasOwnProperty(targetName);
719
+ });
720
+ keyValuesPath = this.getIndexKeyValuesPath(model);
721
+ isUnidirectionalConnection = hasOneIndex_1 === associatedWith;
722
+ if (hasConnectedModelFields && isUnidirectionalConnection) {
723
+ // Values will be that of the child model
724
+ values_1 = targetNames.map(function (targetName) { return model[targetName]; });
725
+ }
726
+ else {
727
+ // values will be that of the parent model
728
+ values_1 = keyValuesPath.split(util_1.DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
729
+ }
730
+ if (values_1.length === 0)
731
+ return [3 /*break*/, 12];
681
732
  return [4 /*yield*/, this.db.getAll(storeName)];
682
733
  case 6:
683
734
  allRecords = _e.sent();
684
- recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex] === value; });
735
+ recordToDelete = void 0;
736
+ // values === targetNames
737
+ if (hasConnectedModelFields) {
738
+ /**
739
+ * Retrieve record by finding the record where all
740
+ * targetNames are present on the connected model.
741
+ *
742
+ */
743
+ // recordToDelete = allRecords.filter(childItem =>
744
+ // values.every(value => childItem[value] != null)
745
+ // ) as T[];
746
+ recordToDelete = allRecords.filter(function (childItem) {
747
+ return hasOneIndex_1.every(function (index) { return values_1.includes(childItem[index]); });
748
+ });
749
+ }
750
+ else {
751
+ // values === keyValuePath
752
+ recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_1] === values_1; });
753
+ }
685
754
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
686
755
  .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
687
756
  case 7:
688
757
  _e.sent();
689
- _e.label = 8;
690
- case 8: return [3 /*break*/, 4];
691
- case 9: return [3 /*break*/, 16];
758
+ return [3 /*break*/, 11];
759
+ case 8:
760
+ hasOneIndex_2 = index || associatedWith;
761
+ hasOneCustomField = targetName in model;
762
+ keyValuesPath = this.getIndexKeyValuesPath(model);
763
+ value_1 = hasOneCustomField
764
+ ? model[targetName]
765
+ : keyValuesPath;
766
+ if (!value_1)
767
+ return [3 /*break*/, 12];
768
+ return [4 /*yield*/, this.db.getAll(storeName)];
769
+ case 9:
770
+ allRecords = _e.sent();
771
+ recordToDelete = allRecords.filter(function (childItem) { return childItem[hasOneIndex_2] === value_1; });
772
+ return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
773
+ .relationTypes, recordToDelete, modelName, nameSpace, deleteQueue)];
692
774
  case 10:
693
- e_8_1 = _e.sent();
694
- e_8 = { error: e_8_1 };
695
- return [3 /*break*/, 16];
696
- case 11:
697
- _e.trys.push([11, , 14, 15]);
698
- if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 13];
699
- return [4 /*yield*/, _b.call(models_1)];
700
- case 12:
701
775
  _e.sent();
702
- _e.label = 13;
703
- case 13: return [3 /*break*/, 15];
776
+ _e.label = 11;
777
+ case 11: return [3 /*break*/, 4];
778
+ case 12: return [3 /*break*/, 19];
779
+ case 13:
780
+ e_9_1 = _e.sent();
781
+ e_9 = { error: e_9_1 };
782
+ return [3 /*break*/, 19];
704
783
  case 14:
705
- if (e_8) throw e_8.error;
706
- return [7 /*endfinally*/];
707
- case 15: return [7 /*endfinally*/];
708
- case 16: return [3 /*break*/, 33];
784
+ _e.trys.push([14, , 17, 18]);
785
+ if (!(models_1_1 && !models_1_1.done && (_b = models_1.return))) return [3 /*break*/, 16];
786
+ return [4 /*yield*/, _b.call(models_1)];
787
+ case 15:
788
+ _e.sent();
789
+ _e.label = 16;
790
+ case 16: return [3 /*break*/, 18];
709
791
  case 17:
710
- _e.trys.push([17, 24, 25, 30]);
711
- models_2 = __asyncValues(models);
712
- _e.label = 18;
713
- case 18: return [4 /*yield*/, models_2.next()];
714
- case 19:
715
- if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 23];
792
+ if (e_9) throw e_9.error;
793
+ return [7 /*endfinally*/];
794
+ case 18: return [7 /*endfinally*/];
795
+ case 19: return [3 /*break*/, 36];
796
+ case 20:
797
+ _e.trys.push([20, 27, 28, 33]);
798
+ models_2 = tslib_1.__asyncValues(models);
799
+ _e.label = 21;
800
+ case 21: return [4 /*yield*/, models_2.next()];
801
+ case 22:
802
+ if (!(models_2_1 = _e.sent(), !models_2_1.done)) return [3 /*break*/, 26];
716
803
  model = models_2_1.value;
804
+ keyValues = this.getIndexKeyValuesFromModel(model);
717
805
  return [4 /*yield*/, this.db.getAll(storeName)];
718
- case 20:
806
+ case 23:
719
807
  allRecords = _e.sent();
720
- childrenArray = allRecords.filter(function (childItem) { return childItem[index] === model.id; });
808
+ indices = index.split(util_1.IDENTIFIER_KEY_SEPARATOR);
809
+ childrenArray = allRecords.filter(function (childItem) {
810
+ return indices.every(function (index) { return keyValues.includes(childItem[index]); });
811
+ });
721
812
  return [4 /*yield*/, this.deleteTraverse(this.schema.namespaces[nameSpace].relationships[modelName]
722
813
  .relationTypes, childrenArray, modelName, nameSpace, deleteQueue)];
723
- case 21:
724
- _e.sent();
725
- _e.label = 22;
726
- case 22: return [3 /*break*/, 18];
727
- case 23: return [3 /*break*/, 30];
728
814
  case 24:
729
- e_9_1 = _e.sent();
730
- e_9 = { error: e_9_1 };
731
- return [3 /*break*/, 30];
732
- case 25:
733
- _e.trys.push([25, , 28, 29]);
734
- if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 27];
735
- return [4 /*yield*/, _c.call(models_2)];
736
- case 26:
737
815
  _e.sent();
738
- _e.label = 27;
739
- case 27: return [3 /*break*/, 29];
816
+ _e.label = 25;
817
+ case 25: return [3 /*break*/, 21];
818
+ case 26: return [3 /*break*/, 33];
819
+ case 27:
820
+ e_10_1 = _e.sent();
821
+ e_10 = { error: e_10_1 };
822
+ return [3 /*break*/, 33];
740
823
  case 28:
741
- if (e_9) throw e_9.error;
824
+ _e.trys.push([28, , 31, 32]);
825
+ if (!(models_2_1 && !models_2_1.done && (_c = models_2.return))) return [3 /*break*/, 30];
826
+ return [4 /*yield*/, _c.call(models_2)];
827
+ case 29:
828
+ _e.sent();
829
+ _e.label = 30;
830
+ case 30: return [3 /*break*/, 32];
831
+ case 31:
832
+ if (e_10) throw e_10.error;
742
833
  return [7 /*endfinally*/];
743
- case 29: return [7 /*endfinally*/];
744
- case 30: return [3 /*break*/, 33];
745
- case 31:
834
+ case 32: return [7 /*endfinally*/];
835
+ case 33: return [3 /*break*/, 36];
836
+ case 34:
746
837
  // Intentionally blank
747
- return [3 /*break*/, 33];
748
- case 32:
749
- util_1.exhaustiveCheck(relationType);
750
- return [3 /*break*/, 33];
751
- case 33: return [3 /*break*/, 1];
752
- case 34: return [3 /*break*/, 41];
838
+ return [3 /*break*/, 36];
753
839
  case 35:
754
- e_7_1 = _e.sent();
755
- e_7 = { error: e_7_1 };
756
- return [3 /*break*/, 41];
757
- case 36:
758
- _e.trys.push([36, , 39, 40]);
759
- if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 38];
840
+ util_1.exhaustiveCheck(relationType);
841
+ return [3 /*break*/, 36];
842
+ case 36: return [3 /*break*/, 1];
843
+ case 37: return [3 /*break*/, 44];
844
+ case 38:
845
+ e_8_1 = _e.sent();
846
+ e_8 = { error: e_8_1 };
847
+ return [3 /*break*/, 44];
848
+ case 39:
849
+ _e.trys.push([39, , 42, 43]);
850
+ if (!(relations_2_1 && !relations_2_1.done && (_a = relations_2.return))) return [3 /*break*/, 41];
760
851
  return [4 /*yield*/, _a.call(relations_2)];
761
- case 37:
852
+ case 40:
762
853
  _e.sent();
763
- _e.label = 38;
764
- case 38: return [3 /*break*/, 40];
765
- case 39:
766
- if (e_7) throw e_7.error;
854
+ _e.label = 41;
855
+ case 41: return [3 /*break*/, 43];
856
+ case 42:
857
+ if (e_8) throw e_8.error;
767
858
  return [7 /*endfinally*/];
768
- case 40: return [7 /*endfinally*/];
769
- case 41:
859
+ case 43: return [7 /*endfinally*/];
860
+ case 44:
770
861
  deleteQueue.push({
771
- storeName: this.getStorename(nameSpace, srcModel),
862
+ storeName: util_1.getStorename(nameSpace, srcModel),
772
863
  items: models.map(function (record) {
773
864
  return _this.modelInstanceCreator(_this.getModelConstructorByModelName(nameSpace, srcModel), record);
774
865
  }),
@@ -779,8 +870,8 @@ var AsyncStorageAdapter = /** @class */ (function () {
779
870
  });
780
871
  };
781
872
  AsyncStorageAdapter.prototype.clear = function () {
782
- return __awaiter(this, void 0, void 0, function () {
783
- return __generator(this, function (_a) {
873
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
874
+ return tslib_1.__generator(this, function (_a) {
784
875
  switch (_a.label) {
785
876
  case 0: return [4 /*yield*/, this.db.clear()];
786
877
  case 1:
@@ -793,40 +884,44 @@ var AsyncStorageAdapter = /** @class */ (function () {
793
884
  });
794
885
  };
795
886
  AsyncStorageAdapter.prototype.batchSave = function (modelConstructor, items) {
796
- return __awaiter(this, void 0, void 0, function () {
797
- var modelName, namespaceName, storeName, batch, _loop_1, this_1, items_2, items_2_1, item;
798
- var e_10, _a;
799
- return __generator(this, function (_b) {
887
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
888
+ var modelName, namespaceName, storeName, keys, batch, _loop_2, this_1, items_2, items_2_1, item;
889
+ var e_11, _a;
890
+ var _this = this;
891
+ return tslib_1.__generator(this, function (_b) {
800
892
  switch (_b.label) {
801
893
  case 0:
802
894
  modelName = modelConstructor.name;
803
895
  namespaceName = this.namespaceResolver(modelConstructor);
804
- storeName = this.getStorename(namespaceName, modelName);
896
+ storeName = util_1.getStorename(namespaceName, modelName);
897
+ keys = util_1.getIndexKeys(this.schema.namespaces[namespaceName], modelName);
805
898
  batch = [];
806
- _loop_1 = function (item) {
807
- var id = item.id;
808
- var connectedModels = util_1.traverseModel(modelConstructor.name, this_1.modelInstanceCreator(modelConstructor, item), this_1.schema.namespaces[this_1.namespaceResolver(modelConstructor)], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
899
+ _loop_2 = function (item) {
900
+ var model = this_1.modelInstanceCreator(modelConstructor, item);
901
+ var connectedModels = util_1.traverseModel(modelName, model, this_1.schema.namespaces[namespaceName], this_1.modelInstanceCreator, this_1.getModelConstructorByModelName);
902
+ var keyValuesPath = this_1.getIndexKeyValuesPath(model);
809
903
  var instance = connectedModels.find(function (_a) {
810
904
  var instance = _a.instance;
811
- return instance.id === id;
905
+ var instanceKeyValuesPath = _this.getIndexKeyValuesPath(instance);
906
+ return util_1.keysEqual([instanceKeyValuesPath], [keyValuesPath]);
812
907
  }).instance;
813
908
  batch.push(instance);
814
909
  };
815
910
  this_1 = this;
816
911
  try {
817
- for (items_2 = __values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
912
+ for (items_2 = tslib_1.__values(items), items_2_1 = items_2.next(); !items_2_1.done; items_2_1 = items_2.next()) {
818
913
  item = items_2_1.value;
819
- _loop_1(item);
914
+ _loop_2(item);
820
915
  }
821
916
  }
822
- catch (e_10_1) { e_10 = { error: e_10_1 }; }
917
+ catch (e_11_1) { e_11 = { error: e_11_1 }; }
823
918
  finally {
824
919
  try {
825
920
  if (items_2_1 && !items_2_1.done && (_a = items_2.return)) _a.call(items_2);
826
921
  }
827
- finally { if (e_10) throw e_10.error; }
922
+ finally { if (e_11) throw e_11.error; }
828
923
  }
829
- return [4 /*yield*/, this.db.batchSave(storeName, batch)];
924
+ return [4 /*yield*/, this.db.batchSave(storeName, batch, keys)];
830
925
  case 1: return [2 /*return*/, _b.sent()];
831
926
  }
832
927
  });