@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
@@ -6,7 +6,11 @@ import {
6
6
  PersistentModel,
7
7
  QueryOne,
8
8
  } from '../../types';
9
- import { monotonicUlidFactory } from '../../util';
9
+ import {
10
+ DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR,
11
+ indexNameFromKeys,
12
+ monotonicUlidFactory,
13
+ } from '../../util';
10
14
  import { createInMemoryStore } from './InMemoryStore';
11
15
 
12
16
  const DB_NAME = '@AmplifyDatastore';
@@ -23,6 +27,11 @@ class AsyncStorageDatabase {
23
27
 
24
28
  private storage = createInMemoryStore();
25
29
 
30
+ /**
31
+ * Collection index is map of stores (i.e. sync, metadata, mutation event, and data)
32
+ * @param storeName {string} - Name of the store
33
+ * @returns Map of ulid->id
34
+ */
26
35
  private getCollectionIndex(storeName: string) {
27
36
  if (!this._collectionInMemoryIndex.has(storeName)) {
28
37
  this._collectionInMemoryIndex.set(storeName, new Map());
@@ -31,6 +40,11 @@ class AsyncStorageDatabase {
31
40
  return this._collectionInMemoryIndex.get(storeName);
32
41
  }
33
42
 
43
+ /**
44
+ * Return ULID for store if it exists, otherwise create a new one
45
+ * @param storeName {string} - Name of the store
46
+ * @returns ulid
47
+ */
34
48
  private getMonotonicFactory(storeName: string): ULID {
35
49
  if (!monotonicFactoriesMap.has(storeName)) {
36
50
  monotonicFactoriesMap.set(storeName, monotonicUlidFactory());
@@ -85,39 +99,63 @@ class AsyncStorageDatabase {
85
99
  }
86
100
  }
87
101
 
88
- async save<T extends PersistentModel>(item: T, storeName: string) {
102
+ async save<T extends PersistentModel>(
103
+ item: T,
104
+ storeName: string,
105
+ keys: string[],
106
+ keyValuesPath: string
107
+ ) {
108
+ const idxName = indexNameFromKeys(keys);
109
+
89
110
  const ulid =
90
- this.getCollectionIndex(storeName).get(item.id) ||
111
+ this.getCollectionIndex(storeName).get(idxName) ||
91
112
  this.getMonotonicFactory(storeName)();
92
113
 
93
- const itemKey = this.getKeyForItem(storeName, item.id, ulid);
114
+ // Retrieve db key for item
115
+ const itemKey = this.getKeyForItem(storeName, keyValuesPath, ulid);
94
116
 
95
- this.getCollectionIndex(storeName).set(item.id, ulid);
117
+ // Set key in collection index
118
+ this.getCollectionIndex(storeName).set(keyValuesPath, ulid);
96
119
 
120
+ // Save item in db
97
121
  await this.storage.setItem(itemKey, JSON.stringify(item));
98
122
  }
99
123
 
100
124
  async batchSave<T extends PersistentModel>(
101
125
  storeName: string,
102
- items: ModelInstanceMetadata[]
126
+ items: ModelInstanceMetadata[],
127
+ keys: string[]
103
128
  ): Promise<[T, OpType][]> {
104
129
  if (items.length === 0) {
105
130
  return [];
106
131
  }
107
132
 
108
133
  const result: [T, OpType][] = [];
109
-
110
134
  const collection = this.getCollectionIndex(storeName);
111
135
 
112
136
  const keysToDelete = new Set<string>();
113
137
  const keysToSave = new Set<string>();
114
138
  const allItemsKeys = [];
115
139
  const itemsMap: Record<string, { ulid: string; model: T }> = {};
140
+
141
+ /* Populate allItemKeys, keysToDelete, and keysToSave */
116
142
  for (const item of items) {
117
- const { id, _deleted } = item;
118
- const ulid = collection.get(id) || this.getMonotonicFactory(storeName)();
143
+ // Extract keys from concatenated key path, map to item values
144
+ const keyValues = keys.map(field => item[field]);
119
145
 
120
- const key = this.getKeyForItem(storeName, id, ulid);
146
+ const { _deleted } = item;
147
+
148
+ // If id is in the store, retrieve, otherwise generate new ULID
149
+ const ulid =
150
+ collection.get(keyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR)) ||
151
+ this.getMonotonicFactory(storeName)();
152
+
153
+ // Generate the "longer key" for the item
154
+ const key = this.getKeyForItem(
155
+ storeName,
156
+ keyValues.join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR),
157
+ ulid
158
+ );
121
159
 
122
160
  allItemsKeys.push(key);
123
161
  itemsMap[key] = { ulid, model: <T>(<unknown>item) };
@@ -136,6 +174,7 @@ class AsyncStorageDatabase {
136
174
  .filter(([, v]) => !!v)
137
175
  .reduce((set, [k]) => set.add(k), new Set<string>());
138
176
 
177
+ // Delete
139
178
  await new Promise((resolve, reject) => {
140
179
  if (keysToDelete.size === 0) {
141
180
  resolve();
@@ -144,9 +183,15 @@ class AsyncStorageDatabase {
144
183
 
145
184
  const keysToDeleteArray = Array.from(keysToDelete);
146
185
 
147
- keysToDeleteArray.forEach(key =>
148
- collection.delete(itemsMap[key].model.id)
149
- );
186
+ keysToDeleteArray.forEach(key => {
187
+ // key: full db key
188
+ // keys: PK and/or SK keys
189
+ const primaryKeyValues: string = keys
190
+ .map(field => itemsMap[key].model[field])
191
+ .join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
192
+
193
+ collection.delete(primaryKeyValues);
194
+ });
150
195
 
151
196
  this.storage.multiRemove(keysToDeleteArray, (errors?: Error[]) => {
152
197
  if (errors && errors.length > 0) {
@@ -157,6 +202,7 @@ class AsyncStorageDatabase {
157
202
  });
158
203
  });
159
204
 
205
+ // Save
160
206
  await new Promise((resolve, reject) => {
161
207
  if (keysToSave.size === 0) {
162
208
  resolve();
@@ -169,12 +215,14 @@ class AsyncStorageDatabase {
169
215
  ]);
170
216
 
171
217
  keysToSave.forEach(key => {
172
- const {
173
- model: { id },
174
- ulid,
175
- } = itemsMap[key];
218
+ const { model, ulid } = itemsMap[key];
219
+
220
+ // Retrieve values from model, use as key for collection index
221
+ const keyValues: string = keys
222
+ .map(field => model[field])
223
+ .join(DEFAULT_PRIMARY_KEY_VALUE_SEPARATOR);
176
224
 
177
- collection.set(id, ulid);
225
+ collection.set(keyValues, ulid);
178
226
  });
179
227
 
180
228
  this.storage.multiSet(entriesToSet, (errors?: Error[]) => {
@@ -201,11 +249,11 @@ class AsyncStorageDatabase {
201
249
  }
202
250
 
203
251
  async get<T extends PersistentModel>(
204
- id: string,
252
+ keyValuePath: string,
205
253
  storeName: string
206
254
  ): Promise<T> {
207
- const ulid = this.getCollectionIndex(storeName).get(id);
208
- const itemKey = this.getKeyForItem(storeName, id, ulid);
255
+ const ulid = this.getCollectionIndex(storeName).get(keyValuePath);
256
+ const itemKey = this.getKeyForItem(storeName, keyValuePath, ulid);
209
257
  const recordAsString = await this.storage.getItem(itemKey);
210
258
  const record = recordAsString && JSON.parse(recordAsString);
211
259
  return record;
@@ -227,6 +275,7 @@ class AsyncStorageDatabase {
227
275
  return [id, ulid];
228
276
  })();
229
277
  const itemKey = this.getKeyForItem(storeName, itemId, ulid);
278
+
230
279
  const itemString = itemKey && (await this.storage.getItem(itemKey));
231
280
 
232
281
  const result = itemString ? JSON.parse(itemString) || undefined : undefined;
@@ -272,11 +321,10 @@ class AsyncStorageDatabase {
272
321
  return records;
273
322
  }
274
323
 
275
- async delete(id: string, storeName: string) {
276
- const ulid = this.getCollectionIndex(storeName).get(id);
277
- const itemKey = this.getKeyForItem(storeName, id, ulid);
278
-
279
- this.getCollectionIndex(storeName).delete(id);
324
+ async delete(key: string, storeName: string) {
325
+ const ulid = this.getCollectionIndex(storeName).get(key);
326
+ const itemKey = this.getKeyForItem(storeName, key, ulid);
327
+ this.getCollectionIndex(storeName).delete(key);
280
328
  await this.storage.removeItem(itemKey);
281
329
  }
282
330