@expo/entity 0.38.0 → 0.40.0

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 (206) hide show
  1. package/build/AuthorizationResultBasedEntityAssociationLoader.d.ts +99 -0
  2. package/build/AuthorizationResultBasedEntityAssociationLoader.js +124 -0
  3. package/build/AuthorizationResultBasedEntityAssociationLoader.js.map +1 -0
  4. package/build/AuthorizationResultBasedEntityLoader.d.ts +1 -1
  5. package/build/AuthorizationResultBasedEntityLoader.js.map +1 -1
  6. package/build/{EntityMutator.d.ts → AuthorizationResultBasedEntityMutator.d.ts} +5 -17
  7. package/build/{EntityMutator.js → AuthorizationResultBasedEntityMutator.js} +22 -48
  8. package/build/AuthorizationResultBasedEntityMutator.js.map +1 -0
  9. package/build/EnforcingEntityAssociationLoader.d.ts +79 -0
  10. package/build/EnforcingEntityAssociationLoader.js +62 -0
  11. package/build/EnforcingEntityAssociationLoader.js.map +1 -0
  12. package/build/EnforcingEntityCreator.d.ts +24 -0
  13. package/build/EnforcingEntityCreator.js +32 -0
  14. package/build/EnforcingEntityCreator.js.map +1 -0
  15. package/build/EnforcingEntityDeleter.d.ts +17 -0
  16. package/build/EnforcingEntityDeleter.js +22 -0
  17. package/build/EnforcingEntityDeleter.js.map +1 -0
  18. package/build/EnforcingEntityUpdater.d.ts +24 -0
  19. package/build/EnforcingEntityUpdater.js +32 -0
  20. package/build/EnforcingEntityUpdater.js.map +1 -0
  21. package/build/Entity.d.ts +8 -12
  22. package/build/Entity.js +9 -34
  23. package/build/Entity.js.map +1 -1
  24. package/build/EntityAssociationLoader.d.ts +12 -91
  25. package/build/EntityAssociationLoader.js +20 -126
  26. package/build/EntityAssociationLoader.js.map +1 -1
  27. package/build/EntityCompanionProvider.d.ts +2 -2
  28. package/build/EntityCompanionProvider.js.map +1 -1
  29. package/build/EntityCreator.d.ts +27 -0
  30. package/build/EntityCreator.js +39 -0
  31. package/build/EntityCreator.js.map +1 -0
  32. package/build/EntityDatabaseAdapter.js +2 -2
  33. package/build/EntityDatabaseAdapter.js.map +1 -1
  34. package/build/EntityDeleter.d.ts +27 -0
  35. package/build/EntityDeleter.js +40 -0
  36. package/build/EntityDeleter.js.map +1 -0
  37. package/build/EntityLoader.d.ts +4 -14
  38. package/build/EntityLoader.js +7 -20
  39. package/build/EntityLoader.js.map +1 -1
  40. package/build/EntityLoaderFactory.d.ts +2 -2
  41. package/build/EntityLoaderFactory.js +4 -2
  42. package/build/EntityLoaderFactory.js.map +1 -1
  43. package/build/EntityMutatorFactory.d.ts +4 -4
  44. package/build/EntityMutatorFactory.js +4 -4
  45. package/build/EntityMutatorFactory.js.map +1 -1
  46. package/build/EntitySecondaryCacheLoader.d.ts +3 -3
  47. package/build/EntitySecondaryCacheLoader.js +1 -3
  48. package/build/EntitySecondaryCacheLoader.js.map +1 -1
  49. package/build/EntityUpdater.d.ts +27 -0
  50. package/build/EntityUpdater.js +40 -0
  51. package/build/EntityUpdater.js.map +1 -0
  52. package/build/ReadonlyEntity.d.ts +2 -2
  53. package/build/ReadonlyEntity.js +4 -6
  54. package/build/ReadonlyEntity.js.map +1 -1
  55. package/build/ViewerScopedEntityLoaderFactory.d.ts +2 -2
  56. package/build/ViewerScopedEntityLoaderFactory.js.map +1 -1
  57. package/build/ViewerScopedEntityMutatorFactory.d.ts +4 -4
  58. package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
  59. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +1 -0
  60. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +273 -0
  61. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +1 -0
  62. package/build/__tests__/{EntityLoader-constructor-test.js → AuthorizationResultBasedEntityLoader-constructor-test.js} +11 -11
  63. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +1 -0
  64. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +1 -0
  65. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js +401 -0
  66. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +1 -0
  67. package/build/__tests__/EnforcingEntityAssociationLoader-test.d.ts +1 -0
  68. package/build/__tests__/EnforcingEntityAssociationLoader-test.js +115 -0
  69. package/build/__tests__/EnforcingEntityAssociationLoader-test.js.map +1 -0
  70. package/build/__tests__/Entity-test.js +23 -5
  71. package/build/__tests__/Entity-test.js.map +1 -1
  72. package/build/__tests__/EntityAssociationLoader-test.js +14 -184
  73. package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
  74. package/build/__tests__/EntityCommonUseCases-test.js +34 -12
  75. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  76. package/build/__tests__/EntityCompanion-test.js +17 -7
  77. package/build/__tests__/EntityCompanion-test.js.map +1 -1
  78. package/build/__tests__/EntityDatabaseAdapter-test.js.map +1 -1
  79. package/build/__tests__/EntityEdges-test.js +41 -23
  80. package/build/__tests__/EntityEdges-test.js.map +1 -1
  81. package/build/__tests__/EntityLoader-test.js +22 -386
  82. package/build/__tests__/EntityLoader-test.js.map +1 -1
  83. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +4 -3
  84. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
  85. package/build/__tests__/EntityMutator-test.js +67 -70
  86. package/build/__tests__/EntityMutator-test.js.map +1 -1
  87. package/build/__tests__/EntityPrivacyPolicy-test.js +17 -7
  88. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  89. package/build/__tests__/EntitySecondaryCacheLoader-test.js +7 -7
  90. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  91. package/build/__tests__/EntitySelfReferentialEdges-test.js +36 -24
  92. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  93. package/build/__tests__/ReadonlyEntity-test.js +1 -1
  94. package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
  95. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +4 -2
  96. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
  97. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +7 -4
  98. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
  99. package/build/__tests__/entityUtils-test.js +8 -0
  100. package/build/__tests__/entityUtils-test.js.map +1 -1
  101. package/build/entityUtils.d.ts +7 -0
  102. package/build/entityUtils.js +20 -10
  103. package/build/entityUtils.js.map +1 -1
  104. package/build/errors/EntityCacheAdapterError.js +17 -7
  105. package/build/errors/EntityCacheAdapterError.js.map +1 -1
  106. package/build/errors/EntityDatabaseAdapterError.js +17 -7
  107. package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
  108. package/build/errors/EntityInvalidFieldValueError.js +17 -7
  109. package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
  110. package/build/errors/EntityNotAuthorizedError.js +17 -7
  111. package/build/errors/EntityNotAuthorizedError.js.map +1 -1
  112. package/build/errors/EntityNotFoundError.js +17 -7
  113. package/build/errors/EntityNotFoundError.js.map +1 -1
  114. package/build/index.d.ts +19 -11
  115. package/build/index.js +24 -7
  116. package/build/index.js.map +1 -1
  117. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  118. package/build/internal/__tests__/EntityDataManager-test.js +42 -32
  119. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  120. package/build/internal/__tests__/ReadThroughEntityCache-test.js +17 -7
  121. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  122. package/build/rules/AlwaysAllowPrivacyPolicyRule.js +17 -7
  123. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  124. package/build/rules/AlwaysDenyPrivacyPolicyRule.js +17 -7
  125. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  126. package/build/rules/AlwaysSkipPrivacyPolicyRule.js +17 -7
  127. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  128. package/build/utils/EntityPrivacyUtils.d.ts +32 -4
  129. package/build/utils/EntityPrivacyUtils.js +68 -24
  130. package/build/utils/EntityPrivacyUtils.js.map +1 -1
  131. package/build/utils/__tests__/EntityPrivacyUtils-test.js +148 -23
  132. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +1 -1
  133. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +8 -5
  134. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +1 -1
  135. package/build/utils/collections/__tests__/maps-test.js +1 -1
  136. package/build/utils/collections/__tests__/maps-test.js.map +1 -1
  137. package/build/utils/collections/maps.js +2 -2
  138. package/build/utils/collections/maps.js.map +1 -1
  139. package/build/utils/mergeEntityMutationTriggerConfigurations.js +1 -2
  140. package/build/utils/mergeEntityMutationTriggerConfigurations.js.map +1 -1
  141. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js +1 -1
  142. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +1 -1
  143. package/build/utils/testing/StubDatabaseAdapter.js +17 -7
  144. package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
  145. package/build/utils/testing/StubQueryContextProvider.d.ts +1 -3
  146. package/build/utils/testing/StubQueryContextProvider.js +1 -3
  147. package/build/utils/testing/StubQueryContextProvider.js.map +1 -1
  148. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +2 -1
  149. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +1 -1
  150. package/build/utils/testing/describeFieldTestCase.js +1 -1
  151. package/build/utils/testing/describeFieldTestCase.js.map +1 -1
  152. package/package.json +19 -3
  153. package/src/AuthorizationResultBasedEntityAssociationLoader.ts +492 -0
  154. package/src/AuthorizationResultBasedEntityLoader.ts +2 -2
  155. package/src/{EntityMutator.ts → AuthorizationResultBasedEntityMutator.ts} +62 -58
  156. package/src/EnforcingEntityAssociationLoader.ts +390 -0
  157. package/src/EnforcingEntityCreator.ts +55 -0
  158. package/src/EnforcingEntityDeleter.ts +44 -0
  159. package/src/EnforcingEntityUpdater.ts +55 -0
  160. package/src/Entity.ts +20 -65
  161. package/src/EntityAssociationLoader.ts +38 -495
  162. package/src/EntityCompanionProvider.ts +5 -2
  163. package/src/EntityCreator.ts +73 -0
  164. package/src/EntityDeleter.ts +73 -0
  165. package/src/EntityLoader.ts +10 -49
  166. package/src/EntityLoaderFactory.ts +20 -3
  167. package/src/EntityMutatorFactory.ts +32 -7
  168. package/src/EntitySecondaryCacheLoader.ts +5 -7
  169. package/src/EntityUpdater.ts +73 -0
  170. package/src/ReadonlyEntity.ts +14 -13
  171. package/src/ViewerScopedEntityLoaderFactory.ts +9 -2
  172. package/src/ViewerScopedEntityMutatorFactory.ts +29 -4
  173. package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +354 -0
  174. package/src/__tests__/{EntityLoader-constructor-test.ts → AuthorizationResultBasedEntityLoader-constructor-test.ts} +17 -10
  175. package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +730 -0
  176. package/src/__tests__/EnforcingEntityAssociationLoader-test.ts +253 -0
  177. package/src/__tests__/Entity-test.ts +24 -5
  178. package/src/__tests__/EntityAssociationLoader-test.ts +16 -259
  179. package/src/__tests__/EntityCommonUseCases-test.ts +20 -8
  180. package/src/__tests__/EntityCompanion-test.ts +1 -1
  181. package/src/__tests__/EntityDatabaseAdapter-test.ts +6 -6
  182. package/src/__tests__/EntityEdges-test.ts +24 -16
  183. package/src/__tests__/EntityLoader-test.ts +25 -675
  184. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +4 -3
  185. package/src/__tests__/EntityMutator-test.ts +116 -103
  186. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +7 -7
  187. package/src/__tests__/EntitySelfReferentialEdges-test.ts +36 -24
  188. package/src/__tests__/ReadonlyEntity-test.ts +1 -1
  189. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +4 -2
  190. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +7 -4
  191. package/src/__tests__/entityUtils-test.ts +12 -0
  192. package/src/entityUtils.ts +24 -9
  193. package/src/index.ts +19 -11
  194. package/src/internal/EntityFieldTransformationUtils.ts +2 -2
  195. package/src/internal/__tests__/EntityDataManager-test.ts +29 -29
  196. package/src/utils/EntityPrivacyUtils.ts +188 -107
  197. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +169 -29
  198. package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +8 -5
  199. package/src/utils/collections/__tests__/maps-test.ts +1 -1
  200. package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +1 -1
  201. package/src/utils/testing/StubDatabaseAdapter.ts +1 -1
  202. package/src/utils/testing/StubQueryContextProvider.ts +1 -3
  203. package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +3 -1
  204. package/build/EntityMutator.js.map +0 -1
  205. package/build/__tests__/EntityLoader-constructor-test.js.map +0 -1
  206. /package/build/__tests__/{EntityLoader-constructor-test.d.ts → AuthorizationResultBasedEntityLoader-constructor-test.d.ts} +0 -0
@@ -87,13 +87,15 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE', () => {
87
87
  const companionProvider = createUnitTestEntityCompanionProvider();
88
88
  const viewerContext = new TestViewerContext(companionProvider);
89
89
 
90
- const parentCategory = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
90
+ const parentCategory = await CategoryEntity.creator(viewerContext).enforcing().createAsync();
91
91
  const subCategory = await CategoryEntity.creator(viewerContext)
92
+ .enforcing()
92
93
  .setField('parent_category_id', parentCategory.getID())
93
- .enforceCreateAsync();
94
+ .createAsync();
94
95
  const subSubCategory = await CategoryEntity.creator(viewerContext)
96
+ .enforcing()
95
97
  .setField('parent_category_id', subCategory.getID())
96
- .enforceCreateAsync();
98
+ .createAsync();
97
99
 
98
100
  await expect(
99
101
  CategoryEntity.loader(viewerContext)
@@ -109,7 +111,7 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE', () => {
109
111
  .loadByIDNullableAsync(subSubCategory.getID()),
110
112
  ).resolves.not.toBeNull();
111
113
 
112
- await CategoryEntity.enforceDeleteAsync(parentCategory);
114
+ await CategoryEntity.deleter(parentCategory).enforcing().deleteAsync();
113
115
 
114
116
  await expect(
115
117
  CategoryEntity.loader(viewerContext)
@@ -132,15 +134,17 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE', () => {
132
134
  const companionProvider = createUnitTestEntityCompanionProvider();
133
135
  const viewerContext = new TestViewerContext(companionProvider);
134
136
 
135
- const categoryA = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
137
+ const categoryA = await CategoryEntity.creator(viewerContext).enforcing().createAsync();
136
138
  const categoryB = await CategoryEntity.creator(viewerContext)
139
+ .enforcing()
137
140
  .setField('parent_category_id', categoryA.getID())
138
- .enforceCreateAsync();
141
+ .createAsync();
139
142
  await CategoryEntity.updater(categoryA)
143
+ .enforcing()
140
144
  .setField('parent_category_id', categoryB.getID())
141
- .enforceUpdateAsync();
145
+ .updateAsync();
142
146
 
143
- await CategoryEntity.enforceDeleteAsync(categoryA);
147
+ await CategoryEntity.deleter(categoryA).enforcing().deleteAsync();
144
148
 
145
149
  await expect(
146
150
  CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(categoryA.getID()),
@@ -158,13 +162,15 @@ describe('EntityEdgeDeletionBehavior.SET_NULL', () => {
158
162
  const companionProvider = createUnitTestEntityCompanionProvider();
159
163
  const viewerContext = new TestViewerContext(companionProvider);
160
164
 
161
- const parentCategory = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
165
+ const parentCategory = await CategoryEntity.creator(viewerContext).enforcing().createAsync();
162
166
  const subCategory = await CategoryEntity.creator(viewerContext)
167
+ .enforcing()
163
168
  .setField('parent_category_id', parentCategory.getID())
164
- .enforceCreateAsync();
169
+ .createAsync();
165
170
  const subSubCategory = await CategoryEntity.creator(viewerContext)
171
+ .enforcing()
166
172
  .setField('parent_category_id', subCategory.getID())
167
- .enforceCreateAsync();
173
+ .createAsync();
168
174
 
169
175
  await expect(
170
176
  CategoryEntity.loader(viewerContext)
@@ -180,7 +186,7 @@ describe('EntityEdgeDeletionBehavior.SET_NULL', () => {
180
186
  .loadByIDNullableAsync(subSubCategory.getID()),
181
187
  ).resolves.not.toBeNull();
182
188
 
183
- await CategoryEntity.enforceDeleteAsync(parentCategory);
189
+ await CategoryEntity.deleter(parentCategory).enforcing().deleteAsync();
184
190
 
185
191
  await expect(
186
192
  CategoryEntity.loader(viewerContext)
@@ -205,15 +211,17 @@ describe('EntityEdgeDeletionBehavior.SET_NULL', () => {
205
211
  const companionProvider = createUnitTestEntityCompanionProvider();
206
212
  const viewerContext = new TestViewerContext(companionProvider);
207
213
 
208
- const categoryA = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
214
+ const categoryA = await CategoryEntity.creator(viewerContext).enforcing().createAsync();
209
215
  const categoryB = await CategoryEntity.creator(viewerContext)
216
+ .enforcing()
210
217
  .setField('parent_category_id', categoryA.getID())
211
- .enforceCreateAsync();
218
+ .createAsync();
212
219
  await CategoryEntity.updater(categoryA)
220
+ .enforcing()
213
221
  .setField('parent_category_id', categoryB.getID())
214
- .enforceUpdateAsync();
222
+ .updateAsync();
215
223
 
216
- await CategoryEntity.enforceDeleteAsync(categoryA);
224
+ await CategoryEntity.deleter(categoryA).enforcing().deleteAsync();
217
225
 
218
226
  const loadedCategoryB = await CategoryEntity.loader(viewerContext)
219
227
  .enforcing()
@@ -231,13 +239,15 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
231
239
  const companionProvider = createUnitTestEntityCompanionProvider();
232
240
  const viewerContext = new TestViewerContext(companionProvider);
233
241
 
234
- const parentCategory = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
242
+ const parentCategory = await CategoryEntity.creator(viewerContext).enforcing().createAsync();
235
243
  const subCategory = await CategoryEntity.creator(viewerContext)
244
+ .enforcing()
236
245
  .setField('parent_category_id', parentCategory.getID())
237
- .enforceCreateAsync();
246
+ .createAsync();
238
247
  const subSubCategory = await CategoryEntity.creator(viewerContext)
248
+ .enforcing()
239
249
  .setField('parent_category_id', subCategory.getID())
240
- .enforceCreateAsync();
250
+ .createAsync();
241
251
 
242
252
  await expect(
243
253
  CategoryEntity.loader(viewerContext)
@@ -271,7 +281,7 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
271
281
  );
272
282
  expect(subSubCategoryCachedBefore.get(subCategory.getID())?.status).toEqual(CacheStatus.HIT);
273
283
 
274
- await CategoryEntity.enforceDeleteAsync(parentCategory);
284
+ await CategoryEntity.deleter(parentCategory).enforcing().deleteAsync();
275
285
 
276
286
  const subCategoryCachedAfter = await categoryCacheAdapter.loadManyAsync('parent_category_id', [
277
287
  parentCategory.getID(),
@@ -307,13 +317,15 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
307
317
  const companionProvider = createUnitTestEntityCompanionProvider();
308
318
  const viewerContext = new TestViewerContext(companionProvider);
309
319
 
310
- const categoryA = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
320
+ const categoryA = await CategoryEntity.creator(viewerContext).enforcing().createAsync();
311
321
  const categoryB = await CategoryEntity.creator(viewerContext)
322
+ .enforcing()
312
323
  .setField('parent_category_id', categoryA.getID())
313
- .enforceCreateAsync();
324
+ .createAsync();
314
325
  await CategoryEntity.updater(categoryA)
326
+ .enforcing()
315
327
  .setField('parent_category_id', categoryB.getID())
316
- .enforceUpdateAsync();
328
+ .updateAsync();
317
329
 
318
330
  await expect(
319
331
  CategoryEntity.loader(viewerContext)
@@ -338,7 +350,7 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
338
350
  expect(categoriesCachedBefore.get(categoryA.getID())?.status).toEqual(CacheStatus.HIT);
339
351
  expect(categoriesCachedBefore.get(categoryB.getID())?.status).toEqual(CacheStatus.HIT);
340
352
 
341
- await CategoryEntity.enforceDeleteAsync(categoryA);
353
+ await CategoryEntity.deleter(categoryA).enforcing().deleteAsync();
342
354
 
343
355
  const categoriesCachedAfter = await categoryCacheAdapter.loadManyAsync('parent_category_id', [
344
356
  categoryA.getID(),
@@ -127,7 +127,7 @@ describe(ReadonlyEntity, () => {
127
127
  }).toThrow();
128
128
  });
129
129
 
130
- it('returns correct viewerCo}ntext from instantiation', () => {
130
+ it('returns correct viewerContext from instantiation', () => {
131
131
  const viewerContext = instance(mock(ViewerContext));
132
132
  const data = {
133
133
  id: 'what',
@@ -14,15 +14,17 @@ describe('Two entities backed by the same table', () => {
14
14
  const viewerContext = new ViewerContext(companionProvider);
15
15
 
16
16
  const one = await OneTestEntity.creator(viewerContext)
17
+ .enforcing()
17
18
  .setField('entity_type', EntityType.ONE)
18
19
  .setField('common_other_field', 'wat')
19
- .enforceCreateAsync();
20
+ .createAsync();
20
21
 
21
22
  const two = await TwoTestEntity.creator(viewerContext)
23
+ .enforcing()
22
24
  .setField('entity_type', EntityType.TWO)
23
25
  .setField('other_field', 'blah')
24
26
  .setField('common_other_field', 'wat')
25
- .enforceCreateAsync();
27
+ .createAsync();
26
28
 
27
29
  expect(one).toBeInstanceOf(OneTestEntity);
28
30
  expect(two).toBeInstanceOf(TwoTestEntity);
@@ -13,8 +13,9 @@ describe('Two entities backed by the same table', () => {
13
13
  const viewerContext = new ViewerContext(companionProvider);
14
14
 
15
15
  const entity1 = await OneTestEntity.creator(viewerContext)
16
+ .enforcing()
16
17
  .setField('fake_field', 'hello')
17
- .enforceCreateAsync();
18
+ .createAsync();
18
19
  expect(entity1).toBeInstanceOf(OneTestEntity);
19
20
 
20
21
  const entity2 = await TwoTestEntity.loader(viewerContext)
@@ -23,9 +24,10 @@ describe('Two entities backed by the same table', () => {
23
24
  expect(entity2).toBeInstanceOf(TwoTestEntity);
24
25
 
25
26
  const updated2 = await TwoTestEntity.updater(entity2)
27
+ .enforcing()
26
28
  .setField('fake_field', 'world')
27
29
  .setField('other_field', 'wat')
28
- .enforceUpdateAsync();
30
+ .updateAsync();
29
31
  expect(updated2.getAllFields()).toMatchObject({
30
32
  id: updated2.getID(),
31
33
  other_field: 'wat',
@@ -46,9 +48,10 @@ describe('Two entities backed by the same table', () => {
46
48
  const viewerContext = new ViewerContext(companionProvider);
47
49
 
48
50
  const entity = await TwoTestEntity.creator(viewerContext)
51
+ .enforcing()
49
52
  .setField('fake_field', 'hello')
50
53
  .setField('other_field', 'huh')
51
- .enforceCreateAsync();
54
+ .createAsync();
52
55
 
53
56
  const loadedEntity = await TwoTestEntity.loader(viewerContext)
54
57
  .enforcing()
@@ -62,7 +65,7 @@ describe('Two entities backed by the same table', () => {
62
65
  const loaded1 = await OneTestEntity.loader(viewerContext)
63
66
  .enforcing()
64
67
  .loadByIDAsync(entity.getID());
65
- await OneTestEntity.updater(loaded1).setField('fake_field', 'world').enforceUpdateAsync();
68
+ await OneTestEntity.updater(loaded1).enforcing().setField('fake_field', 'world').updateAsync();
66
69
 
67
70
  const loaded2 = await TwoTestEntity.loader(viewerContext)
68
71
  .enforcing()
@@ -7,6 +7,7 @@ import {
7
7
  successfulResultsFilterMap,
8
8
  failedResultsFilterMap,
9
9
  pick,
10
+ partitionArray,
10
11
  } from '../entityUtils';
11
12
 
12
13
  describe(enforceResultsAsync, () => {
@@ -97,3 +98,14 @@ describe(pick, () => {
97
98
  });
98
99
  });
99
100
  });
101
+
102
+ describe(partitionArray, () => {
103
+ it('partitions array', () => {
104
+ type A = true;
105
+ type B = false;
106
+ const arr: (A | B)[] = [true, false, true, true, false];
107
+ const [as, bs] = partitionArray<A, B>(arr, (val: A | B): val is A => val === true);
108
+ expect(as).toMatchObject([true, true, true]);
109
+ expect(bs).toMatchObject([false, false]);
110
+ });
111
+ });
@@ -71,22 +71,37 @@ export const failedResultsFilterMap = <K, T>(
71
71
  return ret;
72
72
  };
73
73
 
74
+ export type PartitionArrayPredicate<T, U> = (val: T | U) => val is T;
75
+
74
76
  /**
75
- * Partition array of values and errors into an array of values and an array of errors.
76
- * @param valuesAndErrors - array of values and errors
77
+ * Partition an array of values into two arrays based on evaluation of a binary predicate.
78
+ * @param values - array of values to partition
79
+ * @param predicate - binary predicate to evaluate partition group of each value
77
80
  */
78
- export const partitionErrors = <T>(valuesAndErrors: (T | Error)[]): [T[], Error[]] => {
79
- const values: T[] = [];
80
- const errors: Error[] = [];
81
+ export const partitionArray = <T, U>(
82
+ values: (T | U)[],
83
+ predicate: PartitionArrayPredicate<T, U>,
84
+ ): [T[], U[]] => {
85
+ const ts: T[] = [];
86
+ const us: U[] = [];
81
87
 
82
- for (const valueOrError of valuesAndErrors) {
83
- if (isError(valueOrError)) {
84
- errors.push(valueOrError);
88
+ for (const value of values) {
89
+ if (predicate(value)) {
90
+ ts.push(value);
85
91
  } else {
86
- values.push(valueOrError);
92
+ us.push(value);
87
93
  }
88
94
  }
89
95
 
96
+ return [ts, us];
97
+ };
98
+
99
+ /**
100
+ * Partition array of values and errors into an array of values and an array of errors.
101
+ * @param valuesAndErrors - array of values and errors
102
+ */
103
+ export const partitionErrors = <T>(valuesAndErrors: (T | Error)[]): [T[], Error[]] => {
104
+ const [errors, values] = partitionArray<Error, T>(valuesAndErrors, isError);
90
105
  return [values, errors];
91
106
  };
92
107
 
package/src/index.ts CHANGED
@@ -4,31 +4,38 @@
4
4
  * @module @expo/entity
5
5
  */
6
6
 
7
+ export { default as AuthorizationResultBasedEntityAssociationLoader } from './AuthorizationResultBasedEntityAssociationLoader';
8
+ export * from './AuthorizationResultBasedEntityAssociationLoader';
7
9
  export { default as AuthorizationResultBasedEntityLoader } from './AuthorizationResultBasedEntityLoader';
10
+ export * from './AuthorizationResultBasedEntityMutator';
8
11
  export { default as ComposedEntityCacheAdapter } from './ComposedEntityCacheAdapter';
9
12
  export { default as ComposedSecondaryEntityCache } from './ComposedSecondaryEntityCache';
13
+ export { default as EnforcingEntityAssociationLoader } from './EnforcingEntityAssociationLoader';
14
+ export { default as EnforcingEntityCreator } from './EnforcingEntityCreator';
15
+ export { default as EnforcingEntityDeleter } from './EnforcingEntityDeleter';
10
16
  export { default as EnforcingEntityLoader } from './EnforcingEntityLoader';
17
+ export { default as EnforcingEntityUpdater } from './EnforcingEntityUpdater';
11
18
  export { default as Entity } from './Entity';
12
19
  export * from './Entity';
13
20
  export { default as EntityAssociationLoader } from './EntityAssociationLoader';
14
- export * from './EntityAssociationLoader';
15
21
  export { default as EntityCompanion } from './EntityCompanion';
16
22
  export * from './EntityCompanion';
17
23
  export { default as EntityCompanionProvider } from './EntityCompanionProvider';
18
24
  export * from './EntityCompanionProvider';
19
25
  export { default as EntityConfiguration } from './EntityConfiguration';
26
+ export { default as EntityCreator } from './EntityCreator';
20
27
  export { default as EntityDatabaseAdapter } from './EntityDatabaseAdapter';
21
28
  export * from './EntityDatabaseAdapter';
29
+ export { default as EntityDeleter } from './EntityDeleter';
22
30
  export * from './EntityFieldDefinition';
23
31
  export * from './EntityFields';
24
32
  export { default as EntityLoader } from './EntityLoader';
25
33
  export { default as EntityLoaderFactory } from './EntityLoaderFactory';
26
34
  export { default as EntityLoaderUtils } from './EntityLoaderUtils';
27
35
  export * from './EntityMutationInfo';
28
- export { default as EntityMutationTriggerConfiguration } from './EntityMutationTriggerConfiguration';
36
+ export { type default as EntityMutationTriggerConfiguration } from './EntityMutationTriggerConfiguration';
29
37
  export * from './EntityMutationTriggerConfiguration';
30
38
  export { default as EntityMutationValidator } from './EntityMutationValidator';
31
- export * from './EntityMutator';
32
39
  export { default as EntityMutatorFactory } from './EntityMutatorFactory';
33
40
  export { default as EntityPrivacyPolicy } from './EntityPrivacyPolicy';
34
41
  export * from './EntityPrivacyPolicy';
@@ -36,19 +43,20 @@ export * from './EntityQueryContext';
36
43
  export { default as EntityQueryContextProvider } from './EntityQueryContextProvider';
37
44
  export { default as EntitySecondaryCacheLoader } from './EntitySecondaryCacheLoader';
38
45
  export * from './EntitySecondaryCacheLoader';
46
+ export { default as EntityUpdater } from './EntityUpdater';
47
+ export * from './entityUtils';
39
48
  export { default as GenericEntityCacheAdapter } from './GenericEntityCacheAdapter';
40
49
  export { default as GenericSecondaryEntityCache } from './GenericSecondaryEntityCache';
41
- export { default as IEntityCacheAdapter } from './IEntityCacheAdapter';
42
- export { default as IEntityCacheAdapterProvider } from './IEntityCacheAdapterProvider';
43
- export { default as IEntityDatabaseAdapterProvider } from './IEntityDatabaseAdapterProvider';
44
- export { default as IEntityGenericCacher } from './IEntityGenericCacher';
50
+ export { type default as IEntityCacheAdapter } from './IEntityCacheAdapter';
51
+ export { type default as IEntityCacheAdapterProvider } from './IEntityCacheAdapterProvider';
52
+ export { type default as IEntityDatabaseAdapterProvider } from './IEntityDatabaseAdapterProvider';
53
+ export { type default as IEntityGenericCacher } from './IEntityGenericCacher';
45
54
  export { default as ReadonlyEntity } from './ReadonlyEntity';
46
55
  export { default as ViewerContext } from './ViewerContext';
47
56
  export { default as ViewerScopedEntityCompanion } from './ViewerScopedEntityCompanion';
48
57
  export { default as ViewerScopedEntityCompanionProvider } from './ViewerScopedEntityCompanionProvider';
49
58
  export { default as ViewerScopedEntityLoaderFactory } from './ViewerScopedEntityLoaderFactory';
50
59
  export { default as ViewerScopedEntityMutatorFactory } from './ViewerScopedEntityMutatorFactory';
51
- export * from './entityUtils';
52
60
  export { default as EntityCacheAdapterError } from './errors/EntityCacheAdapterError';
53
61
  export * from './errors/EntityCacheAdapterError';
54
62
  export { default as EntityDatabaseAdapterError } from './errors/EntityDatabaseAdapterError';
@@ -64,7 +72,7 @@ export { default as EntityTableDataCoordinator } from './internal/EntityTableDat
64
72
  export { default as ReadThroughEntityCache } from './internal/ReadThroughEntityCache';
65
73
  export * from './internal/ReadThroughEntityCache';
66
74
  export * from './metrics/EntityMetricsUtils';
67
- export { default as IEntityMetricsAdapter } from './metrics/IEntityMetricsAdapter';
75
+ export { type default as IEntityMetricsAdapter } from './metrics/IEntityMetricsAdapter';
68
76
  export * from './metrics/IEntityMetricsAdapter';
69
77
  export { default as NoOpEntityMetricsAdapter } from './metrics/NoOpEntityMetricsAdapter';
70
78
  export { default as AlwaysAllowPrivacyPolicyRule } from './rules/AlwaysAllowPrivacyPolicyRule';
@@ -75,10 +83,10 @@ export * from './rules/PrivacyPolicyRule';
75
83
  export * from './utils/EntityPrivacyUtils';
76
84
  export * from './utils/mergeEntityMutationTriggerConfigurations';
77
85
  export * from './utils/collections/maps';
86
+ export * from './utils/testing/createUnitTestEntityCompanionProvider';
87
+ export { default as describeFieldTestCase } from './utils/testing/describeFieldTestCase';
78
88
  export * from './utils/testing/PrivacyPolicyRuleTestUtils';
79
89
  export * from './utils/testing/StubCacheAdapter';
80
90
  export { default as StubDatabaseAdapter } from './utils/testing/StubDatabaseAdapter';
81
91
  export { default as StubDatabaseAdapterProvider } from './utils/testing/StubDatabaseAdapterProvider';
82
92
  export { default as StubQueryContextProvider } from './utils/testing/StubQueryContextProvider';
83
- export * from './utils/testing/createUnitTestEntityCompanionProvider';
84
- export { default as describeFieldTestCase } from './utils/testing/describeFieldTestCase';
@@ -26,7 +26,7 @@ export const getDatabaseFieldForEntityField = <TFields extends Record<string, an
26
26
  ): string => {
27
27
  const databaseField = entityConfiguration.entityToDBFieldsKeyMapping.get(entityField);
28
28
  invariant(databaseField, `database field mapping missing for ${String(entityField)}`);
29
- return databaseField!;
29
+ return databaseField;
30
30
  };
31
31
 
32
32
  export const transformDatabaseObjectToFields = <TFields extends Record<string, any>>(
@@ -60,7 +60,7 @@ export const transformFieldsToDatabaseObject = <TFields extends Record<string, a
60
60
  const val = fields[k]!;
61
61
  const databaseKey = entityConfiguration.entityToDBFieldsKeyMapping.get(k as any);
62
62
  invariant(databaseKey, `must be database key for field: ${k}`);
63
- databaseObject[databaseKey!] = maybeTransformFieldValueToDatabaseValue(
63
+ databaseObject[databaseKey] = maybeTransformFieldValueToDatabaseValue(
64
64
  entityConfiguration,
65
65
  fieldTransformerMap,
66
66
  k,
@@ -74,11 +74,11 @@ describe(EntityDataManager, () => {
74
74
  const entityDataManager = new EntityDataManager(
75
75
  databaseAdapter,
76
76
  entityCache,
77
- StubQueryContextProvider,
77
+ new StubQueryContextProvider(),
78
78
  new NoOpEntityMetricsAdapter(),
79
79
  TestEntity.name,
80
80
  );
81
- const queryContext = StubQueryContextProvider.getQueryContext();
81
+ const queryContext = new StubQueryContextProvider().getQueryContext();
82
82
 
83
83
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
84
84
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
@@ -122,11 +122,11 @@ describe(EntityDataManager, () => {
122
122
  const entityDataManager = new EntityDataManager(
123
123
  databaseAdapter,
124
124
  entityCache,
125
- StubQueryContextProvider,
125
+ new StubQueryContextProvider(),
126
126
  new NoOpEntityMetricsAdapter(),
127
127
  TestEntity.name,
128
128
  );
129
- const queryContext = StubQueryContextProvider.getQueryContext();
129
+ const queryContext = new StubQueryContextProvider().getQueryContext();
130
130
 
131
131
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
132
132
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
@@ -170,16 +170,16 @@ describe(EntityDataManager, () => {
170
170
  const entityDataManager = new EntityDataManager(
171
171
  databaseAdapter,
172
172
  entityCache,
173
- StubQueryContextProvider,
173
+ new StubQueryContextProvider(),
174
174
  new NoOpEntityMetricsAdapter(),
175
175
  TestEntity.name,
176
176
  );
177
- const queryContext = StubQueryContextProvider.getQueryContext();
177
+ const queryContext = new StubQueryContextProvider().getQueryContext();
178
178
  // use second data manager to ensure that cache is hit instead of data loader
179
179
  const entityDataManager2 = new EntityDataManager(
180
180
  databaseAdapter,
181
181
  entityCache,
182
- StubQueryContextProvider,
182
+ new StubQueryContextProvider(),
183
183
  new NoOpEntityMetricsAdapter(),
184
184
  TestEntity.name,
185
185
  );
@@ -214,11 +214,11 @@ describe(EntityDataManager, () => {
214
214
  const entityDataManager = new EntityDataManager(
215
215
  databaseAdapter,
216
216
  entityCache,
217
- StubQueryContextProvider,
217
+ new StubQueryContextProvider(),
218
218
  new NoOpEntityMetricsAdapter(),
219
219
  TestEntity.name,
220
220
  );
221
- const queryContext = StubQueryContextProvider.getQueryContext();
221
+ const queryContext = new StubQueryContextProvider().getQueryContext();
222
222
 
223
223
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
224
224
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
@@ -250,11 +250,11 @@ describe(EntityDataManager, () => {
250
250
  const entityDataManager = new EntityDataManager(
251
251
  databaseAdapter,
252
252
  entityCache,
253
- StubQueryContextProvider,
253
+ new StubQueryContextProvider(),
254
254
  new NoOpEntityMetricsAdapter(),
255
255
  TestEntity.name,
256
256
  );
257
- const queryContext = StubQueryContextProvider.getQueryContext();
257
+ const queryContext = new StubQueryContextProvider().getQueryContext();
258
258
 
259
259
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
260
260
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
@@ -294,11 +294,11 @@ describe(EntityDataManager, () => {
294
294
  const entityDataManager = new EntityDataManager(
295
295
  databaseAdapter,
296
296
  entityCache,
297
- StubQueryContextProvider,
297
+ new StubQueryContextProvider(),
298
298
  new NoOpEntityMetricsAdapter(),
299
299
  TestEntity.name,
300
300
  );
301
- const queryContext = StubQueryContextProvider.getQueryContext();
301
+ const queryContext = new StubQueryContextProvider().getQueryContext();
302
302
 
303
303
  const objectInQuestion = objects.get(testEntityConfiguration.tableName)![1]!;
304
304
 
@@ -306,11 +306,11 @@ describe(EntityDataManager, () => {
306
306
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
307
307
 
308
308
  await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
309
- objectInQuestion['testIndexedField']!,
309
+ objectInQuestion['testIndexedField'],
310
310
  ]);
311
311
  await entityDataManager.invalidateObjectFieldsAsync(objectInQuestion);
312
312
  await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
313
- objectInQuestion['testIndexedField']!,
313
+ objectInQuestion['testIndexedField'],
314
314
  ]);
315
315
 
316
316
  expect(dbSpy).toHaveBeenCalledTimes(2);
@@ -333,11 +333,11 @@ describe(EntityDataManager, () => {
333
333
  const entityDataManager = new EntityDataManager(
334
334
  databaseAdapter,
335
335
  entityCache,
336
- StubQueryContextProvider,
336
+ new StubQueryContextProvider(),
337
337
  new NoOpEntityMetricsAdapter(),
338
338
  TestEntity.name,
339
339
  );
340
- const queryContext = StubQueryContextProvider.getQueryContext();
340
+ const queryContext = new StubQueryContextProvider().getQueryContext();
341
341
 
342
342
  const objectInQuestion = objects.get(testEntityConfiguration.tableName)![1]!;
343
343
 
@@ -345,11 +345,11 @@ describe(EntityDataManager, () => {
345
345
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
346
346
 
347
347
  await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'testIndexedField', [
348
- objectInQuestion['testIndexedField']!,
348
+ objectInQuestion['testIndexedField'],
349
349
  ]);
350
350
  await entityDataManager.invalidateObjectFieldsAsync(objectInQuestion);
351
351
  await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', [
352
- objectInQuestion['customIdField']!,
352
+ objectInQuestion['customIdField'],
353
353
  ]);
354
354
 
355
355
  expect(dbSpy).toHaveBeenCalledTimes(2);
@@ -372,7 +372,7 @@ describe(EntityDataManager, () => {
372
372
  const entityDataManager = new EntityDataManager(
373
373
  databaseAdapter,
374
374
  entityCache,
375
- StubQueryContextProvider,
375
+ new StubQueryContextProvider(),
376
376
  new NoOpEntityMetricsAdapter(),
377
377
  TestEntity.name,
378
378
  );
@@ -380,7 +380,7 @@ describe(EntityDataManager, () => {
380
380
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
381
381
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
382
382
 
383
- const entityDatas = await StubQueryContextProvider.runInTransactionAsync(
383
+ const entityDatas = await new StubQueryContextProvider().runInTransactionAsync(
384
384
  async (queryContext) => {
385
385
  return await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', [
386
386
  '1',
@@ -411,11 +411,11 @@ describe(EntityDataManager, () => {
411
411
  const entityDataManager = new EntityDataManager(
412
412
  databaseAdapter,
413
413
  entityCache,
414
- StubQueryContextProvider,
414
+ new StubQueryContextProvider(),
415
415
  new NoOpEntityMetricsAdapter(),
416
416
  TestEntity.name,
417
417
  );
418
- const queryContext = StubQueryContextProvider.getQueryContext();
418
+ const queryContext = new StubQueryContextProvider().getQueryContext();
419
419
 
420
420
  const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyByFieldEqualityConjunctionAsync');
421
421
  const cacheSpy = jest.spyOn(entityCache, 'readManyThroughAsync');
@@ -457,11 +457,11 @@ describe(EntityDataManager, () => {
457
457
  const entityDataManager = new EntityDataManager(
458
458
  databaseAdapter,
459
459
  entityCache,
460
- StubQueryContextProvider,
460
+ new StubQueryContextProvider(),
461
461
  new NoOpEntityMetricsAdapter(),
462
462
  TestEntity.name,
463
463
  );
464
- const queryContext = StubQueryContextProvider.getQueryContext();
464
+ const queryContext = new StubQueryContextProvider().getQueryContext();
465
465
 
466
466
  await expect(
467
467
  entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', ['2']),
@@ -484,11 +484,11 @@ describe(EntityDataManager, () => {
484
484
  const entityDataManager = new EntityDataManager(
485
485
  databaseAdapter,
486
486
  entityCache,
487
- StubQueryContextProvider,
487
+ new StubQueryContextProvider(),
488
488
  metricsAdapter,
489
489
  TestEntity.name,
490
490
  );
491
- const queryContext = StubQueryContextProvider.getQueryContext();
491
+ const queryContext = new StubQueryContextProvider().getQueryContext();
492
492
 
493
493
  await entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', ['1']);
494
494
  verify(
@@ -587,11 +587,11 @@ describe(EntityDataManager, () => {
587
587
  const entityDataManager = new EntityDataManager(
588
588
  databaseAdapter,
589
589
  entityCache,
590
- StubQueryContextProvider,
590
+ new StubQueryContextProvider(),
591
591
  new NoOpEntityMetricsAdapter(),
592
592
  TestEntity.name,
593
593
  );
594
- const queryContext = StubQueryContextProvider.getQueryContext();
594
+ const queryContext = new StubQueryContextProvider().getQueryContext();
595
595
 
596
596
  await expect(
597
597
  entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'nullableField', [null as any]),