@expo/entity 0.39.0 → 0.41.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 (175) hide show
  1. package/build/AuthorizationResultBasedEntityAssociationLoader.d.ts +99 -0
  2. package/build/AuthorizationResultBasedEntityAssociationLoader.js +122 -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 +26 -8
  22. package/build/Entity.js +38 -25
  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/EntityCreator.d.ts +27 -0
  28. package/build/EntityCreator.js +39 -0
  29. package/build/EntityCreator.js.map +1 -0
  30. package/build/EntityDeleter.d.ts +27 -0
  31. package/build/EntityDeleter.js +40 -0
  32. package/build/EntityDeleter.js.map +1 -0
  33. package/build/EntityLoader.d.ts +4 -14
  34. package/build/EntityLoader.js +7 -20
  35. package/build/EntityLoader.js.map +1 -1
  36. package/build/EntityLoaderFactory.d.ts +2 -2
  37. package/build/EntityLoaderFactory.js +4 -2
  38. package/build/EntityLoaderFactory.js.map +1 -1
  39. package/build/EntityMutatorFactory.d.ts +4 -4
  40. package/build/EntityMutatorFactory.js +4 -4
  41. package/build/EntityMutatorFactory.js.map +1 -1
  42. package/build/EntitySecondaryCacheLoader.d.ts +3 -3
  43. package/build/EntitySecondaryCacheLoader.js +1 -3
  44. package/build/EntitySecondaryCacheLoader.js.map +1 -1
  45. package/build/EntityUpdater.d.ts +27 -0
  46. package/build/EntityUpdater.js +40 -0
  47. package/build/EntityUpdater.js.map +1 -0
  48. package/build/ReadonlyEntity.d.ts +24 -5
  49. package/build/ReadonlyEntity.js +33 -7
  50. package/build/ReadonlyEntity.js.map +1 -1
  51. package/build/ViewerScopedEntityLoaderFactory.d.ts +2 -2
  52. package/build/ViewerScopedEntityLoaderFactory.js.map +1 -1
  53. package/build/ViewerScopedEntityMutatorFactory.d.ts +4 -4
  54. package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
  55. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +1 -0
  56. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +242 -0
  57. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +1 -0
  58. package/build/__tests__/{EntityLoader-constructor-test.js → AuthorizationResultBasedEntityLoader-constructor-test.js} +10 -10
  59. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +1 -0
  60. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +1 -0
  61. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js +401 -0
  62. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +1 -0
  63. package/build/__tests__/EnforcingEntityAssociationLoader-test.d.ts +1 -0
  64. package/build/__tests__/EnforcingEntityAssociationLoader-test.js +115 -0
  65. package/build/__tests__/EnforcingEntityAssociationLoader-test.js.map +1 -0
  66. package/build/__tests__/Entity-test.js +63 -5
  67. package/build/__tests__/Entity-test.js.map +1 -1
  68. package/build/__tests__/EntityAssociationLoader-test.js +14 -184
  69. package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
  70. package/build/__tests__/EntityCommonUseCases-test.js +34 -20
  71. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  72. package/build/__tests__/EntityCompanion-test.js +17 -7
  73. package/build/__tests__/EntityCompanion-test.js.map +1 -1
  74. package/build/__tests__/EntityEdges-test.js +57 -71
  75. package/build/__tests__/EntityEdges-test.js.map +1 -1
  76. package/build/__tests__/EntityLoader-test.js +22 -386
  77. package/build/__tests__/EntityLoader-test.js.map +1 -1
  78. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +6 -9
  79. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
  80. package/build/__tests__/EntityMutator-test.js +67 -70
  81. package/build/__tests__/EntityMutator-test.js.map +1 -1
  82. package/build/__tests__/EntityPrivacyPolicy-test.js +17 -7
  83. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  84. package/build/__tests__/EntitySecondaryCacheLoader-test.js +7 -7
  85. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  86. package/build/__tests__/EntitySelfReferentialEdges-test.js +47 -81
  87. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  88. package/build/__tests__/ReadonlyEntity-test.js +40 -7
  89. package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
  90. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +6 -10
  91. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
  92. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +10 -22
  93. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
  94. package/build/errors/EntityCacheAdapterError.js +17 -7
  95. package/build/errors/EntityCacheAdapterError.js.map +1 -1
  96. package/build/errors/EntityDatabaseAdapterError.js +17 -7
  97. package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
  98. package/build/errors/EntityInvalidFieldValueError.js +17 -7
  99. package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
  100. package/build/errors/EntityNotAuthorizedError.js +17 -7
  101. package/build/errors/EntityNotAuthorizedError.js.map +1 -1
  102. package/build/errors/EntityNotFoundError.js +17 -7
  103. package/build/errors/EntityNotFoundError.js.map +1 -1
  104. package/build/index.d.ts +19 -11
  105. package/build/index.js +24 -7
  106. package/build/index.js.map +1 -1
  107. package/build/internal/__tests__/EntityDataManager-test.js +42 -32
  108. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  109. package/build/internal/__tests__/ReadThroughEntityCache-test.js +17 -7
  110. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  111. package/build/rules/AlwaysAllowPrivacyPolicyRule.js +17 -7
  112. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  113. package/build/rules/AlwaysDenyPrivacyPolicyRule.js +17 -7
  114. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  115. package/build/rules/AlwaysSkipPrivacyPolicyRule.js +17 -7
  116. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  117. package/build/utils/EntityPrivacyUtils.js +4 -8
  118. package/build/utils/EntityPrivacyUtils.js.map +1 -1
  119. package/build/utils/__tests__/EntityPrivacyUtils-test.js +38 -28
  120. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +1 -1
  121. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +5 -5
  122. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +1 -1
  123. package/build/utils/testing/StubDatabaseAdapter.js +17 -7
  124. package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
  125. package/build/utils/testing/StubQueryContextProvider.d.ts +1 -3
  126. package/build/utils/testing/StubQueryContextProvider.js +1 -3
  127. package/build/utils/testing/StubQueryContextProvider.js.map +1 -1
  128. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +2 -1
  129. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +1 -1
  130. package/package.json +19 -3
  131. package/src/AuthorizationResultBasedEntityAssociationLoader.ts +490 -0
  132. package/src/AuthorizationResultBasedEntityLoader.ts +1 -1
  133. package/src/{EntityMutator.ts → AuthorizationResultBasedEntityMutator.ts} +62 -58
  134. package/src/EnforcingEntityAssociationLoader.ts +390 -0
  135. package/src/EnforcingEntityCreator.ts +55 -0
  136. package/src/EnforcingEntityDeleter.ts +44 -0
  137. package/src/EnforcingEntityUpdater.ts +55 -0
  138. package/src/Entity.ts +140 -29
  139. package/src/EntityAssociationLoader.ts +38 -495
  140. package/src/EntityCreator.ts +73 -0
  141. package/src/EntityDeleter.ts +73 -0
  142. package/src/EntityLoader.ts +10 -49
  143. package/src/EntityLoaderFactory.ts +20 -3
  144. package/src/EntityMutatorFactory.ts +32 -7
  145. package/src/EntitySecondaryCacheLoader.ts +5 -7
  146. package/src/EntityUpdater.ts +73 -0
  147. package/src/ReadonlyEntity.ts +121 -7
  148. package/src/ViewerScopedEntityLoaderFactory.ts +9 -2
  149. package/src/ViewerScopedEntityMutatorFactory.ts +29 -4
  150. package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +323 -0
  151. package/src/__tests__/{EntityLoader-constructor-test.ts → AuthorizationResultBasedEntityLoader-constructor-test.ts} +16 -9
  152. package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +730 -0
  153. package/src/__tests__/EnforcingEntityAssociationLoader-test.ts +253 -0
  154. package/src/__tests__/Entity-test.ts +77 -5
  155. package/src/__tests__/EntityAssociationLoader-test.ts +15 -260
  156. package/src/__tests__/EntityCommonUseCases-test.ts +24 -15
  157. package/src/__tests__/EntityEdges-test.ts +44 -64
  158. package/src/__tests__/EntityLoader-test.ts +29 -681
  159. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +8 -9
  160. package/src/__tests__/EntityMutator-test.ts +116 -103
  161. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +7 -7
  162. package/src/__tests__/EntitySelfReferentialEdges-test.ts +65 -81
  163. package/src/__tests__/ReadonlyEntity-test.ts +47 -7
  164. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +15 -15
  165. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +19 -22
  166. package/src/index.ts +19 -11
  167. package/src/internal/__tests__/EntityDataManager-test.ts +25 -25
  168. package/src/utils/EntityPrivacyUtils.ts +10 -13
  169. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +21 -23
  170. package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +5 -5
  171. package/src/utils/testing/StubQueryContextProvider.ts +1 -3
  172. package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +3 -1
  173. package/build/EntityMutator.js.map +0 -1
  174. package/build/__tests__/EntityLoader-constructor-test.js.map +0 -1
  175. /package/build/__tests__/{EntityLoader-constructor-test.d.ts → AuthorizationResultBasedEntityLoader-constructor-test.d.ts} +0 -0
@@ -87,42 +87,34 @@ 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).createAsync();
91
91
  const subCategory = await CategoryEntity.creator(viewerContext)
92
92
  .setField('parent_category_id', parentCategory.getID())
93
- .enforceCreateAsync();
93
+ .createAsync();
94
94
  const subSubCategory = await CategoryEntity.creator(viewerContext)
95
95
  .setField('parent_category_id', subCategory.getID())
96
- .enforceCreateAsync();
96
+ .createAsync();
97
97
 
98
98
  await expect(
99
- CategoryEntity.loader(viewerContext)
100
- .enforcing()
101
- .loadByIDNullableAsync(parentCategory.getID()),
99
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(parentCategory.getID()),
102
100
  ).resolves.not.toBeNull();
103
101
  await expect(
104
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(subCategory.getID()),
102
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(subCategory.getID()),
105
103
  ).resolves.not.toBeNull();
106
104
  await expect(
107
- CategoryEntity.loader(viewerContext)
108
- .enforcing()
109
- .loadByIDNullableAsync(subSubCategory.getID()),
105
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(subSubCategory.getID()),
110
106
  ).resolves.not.toBeNull();
111
107
 
112
- await CategoryEntity.enforceDeleteAsync(parentCategory);
108
+ await CategoryEntity.deleter(parentCategory).deleteAsync();
113
109
 
114
110
  await expect(
115
- CategoryEntity.loader(viewerContext)
116
- .enforcing()
117
- .loadByIDNullableAsync(parentCategory.getID()),
111
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(parentCategory.getID()),
118
112
  ).resolves.toBeNull();
119
113
  await expect(
120
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(subCategory.getID()),
114
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(subCategory.getID()),
121
115
  ).resolves.toBeNull();
122
116
  await expect(
123
- CategoryEntity.loader(viewerContext)
124
- .enforcing()
125
- .loadByIDNullableAsync(subSubCategory.getID()),
117
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(subSubCategory.getID()),
126
118
  ).resolves.toBeNull();
127
119
  });
128
120
 
@@ -132,21 +124,21 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE', () => {
132
124
  const companionProvider = createUnitTestEntityCompanionProvider();
133
125
  const viewerContext = new TestViewerContext(companionProvider);
134
126
 
135
- const categoryA = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
127
+ const categoryA = await CategoryEntity.creator(viewerContext).createAsync();
136
128
  const categoryB = await CategoryEntity.creator(viewerContext)
137
129
  .setField('parent_category_id', categoryA.getID())
138
- .enforceCreateAsync();
130
+ .createAsync();
139
131
  await CategoryEntity.updater(categoryA)
140
132
  .setField('parent_category_id', categoryB.getID())
141
- .enforceUpdateAsync();
133
+ .updateAsync();
142
134
 
143
- await CategoryEntity.enforceDeleteAsync(categoryA);
135
+ await CategoryEntity.deleter(categoryA).deleteAsync();
144
136
 
145
137
  await expect(
146
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(categoryA.getID()),
138
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(categoryA.getID()),
147
139
  ).resolves.toBeNull();
148
140
  await expect(
149
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(categoryB.getID()),
141
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(categoryB.getID()),
150
142
  ).resolves.toBeNull();
151
143
  });
152
144
  });
@@ -158,44 +150,38 @@ describe('EntityEdgeDeletionBehavior.SET_NULL', () => {
158
150
  const companionProvider = createUnitTestEntityCompanionProvider();
159
151
  const viewerContext = new TestViewerContext(companionProvider);
160
152
 
161
- const parentCategory = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
153
+ const parentCategory = await CategoryEntity.creator(viewerContext).createAsync();
162
154
  const subCategory = await CategoryEntity.creator(viewerContext)
163
155
  .setField('parent_category_id', parentCategory.getID())
164
- .enforceCreateAsync();
156
+ .createAsync();
165
157
  const subSubCategory = await CategoryEntity.creator(viewerContext)
166
158
  .setField('parent_category_id', subCategory.getID())
167
- .enforceCreateAsync();
159
+ .createAsync();
168
160
 
169
161
  await expect(
170
- CategoryEntity.loader(viewerContext)
171
- .enforcing()
172
- .loadByIDNullableAsync(parentCategory.getID()),
162
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(parentCategory.getID()),
173
163
  ).resolves.not.toBeNull();
174
164
  await expect(
175
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(subCategory.getID()),
165
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(subCategory.getID()),
176
166
  ).resolves.not.toBeNull();
177
167
  await expect(
178
- CategoryEntity.loader(viewerContext)
179
- .enforcing()
180
- .loadByIDNullableAsync(subSubCategory.getID()),
168
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(subSubCategory.getID()),
181
169
  ).resolves.not.toBeNull();
182
170
 
183
- await CategoryEntity.enforceDeleteAsync(parentCategory);
171
+ await CategoryEntity.deleter(parentCategory).deleteAsync();
184
172
 
185
173
  await expect(
186
- CategoryEntity.loader(viewerContext)
187
- .enforcing()
188
- .loadByIDNullableAsync(parentCategory.getID()),
174
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(parentCategory.getID()),
189
175
  ).resolves.toBeNull();
190
176
 
191
- const loadedSubCategory = await CategoryEntity.loader(viewerContext)
192
- .enforcing()
193
- .loadByIDAsync(subCategory.getID());
177
+ const loadedSubCategory = await CategoryEntity.loader(viewerContext).loadByIDAsync(
178
+ subCategory.getID(),
179
+ );
194
180
  expect(loadedSubCategory.getField('parent_category_id')).toBeNull();
195
181
 
196
- const loadedSubSubCategory = await CategoryEntity.loader(viewerContext)
197
- .enforcing()
198
- .loadByIDAsync(subSubCategory.getID());
182
+ const loadedSubSubCategory = await CategoryEntity.loader(viewerContext).loadByIDAsync(
183
+ subSubCategory.getID(),
184
+ );
199
185
  expect(loadedSubSubCategory.getField('parent_category_id')).not.toBeNull();
200
186
  });
201
187
 
@@ -205,19 +191,19 @@ describe('EntityEdgeDeletionBehavior.SET_NULL', () => {
205
191
  const companionProvider = createUnitTestEntityCompanionProvider();
206
192
  const viewerContext = new TestViewerContext(companionProvider);
207
193
 
208
- const categoryA = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
194
+ const categoryA = await CategoryEntity.creator(viewerContext).createAsync();
209
195
  const categoryB = await CategoryEntity.creator(viewerContext)
210
196
  .setField('parent_category_id', categoryA.getID())
211
- .enforceCreateAsync();
197
+ .createAsync();
212
198
  await CategoryEntity.updater(categoryA)
213
199
  .setField('parent_category_id', categoryB.getID())
214
- .enforceUpdateAsync();
200
+ .updateAsync();
215
201
 
216
- await CategoryEntity.enforceDeleteAsync(categoryA);
202
+ await CategoryEntity.deleter(categoryA).deleteAsync();
217
203
 
218
- const loadedCategoryB = await CategoryEntity.loader(viewerContext)
219
- .enforcing()
220
- .loadByIDAsync(categoryB.getID());
204
+ const loadedCategoryB = await CategoryEntity.loader(viewerContext).loadByIDAsync(
205
+ categoryB.getID(),
206
+ );
221
207
  expect(loadedCategoryB.getField('parent_category_id')).toBeNull();
222
208
  });
223
209
  });
@@ -231,28 +217,28 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
231
217
  const companionProvider = createUnitTestEntityCompanionProvider();
232
218
  const viewerContext = new TestViewerContext(companionProvider);
233
219
 
234
- const parentCategory = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
220
+ const parentCategory = await CategoryEntity.creator(viewerContext).createAsync();
235
221
  const subCategory = await CategoryEntity.creator(viewerContext)
236
222
  .setField('parent_category_id', parentCategory.getID())
237
- .enforceCreateAsync();
223
+ .createAsync();
238
224
  const subSubCategory = await CategoryEntity.creator(viewerContext)
239
225
  .setField('parent_category_id', subCategory.getID())
240
- .enforceCreateAsync();
226
+ .createAsync();
241
227
 
242
228
  await expect(
243
- CategoryEntity.loader(viewerContext)
244
- .enforcing()
245
- .loadByIDNullableAsync(parentCategory.getID()),
229
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(parentCategory.getID()),
246
230
  ).resolves.not.toBeNull();
247
231
  await expect(
248
- CategoryEntity.loader(viewerContext)
249
- .enforcing()
250
- .loadByFieldEqualingAsync('parent_category_id', parentCategory.getID()),
232
+ CategoryEntity.loader(viewerContext).loadByFieldEqualingAsync(
233
+ 'parent_category_id',
234
+ parentCategory.getID(),
235
+ ),
251
236
  ).resolves.not.toBeNull();
252
237
  await expect(
253
- CategoryEntity.loader(viewerContext)
254
- .enforcing()
255
- .loadByFieldEqualingAsync('parent_category_id', subCategory.getID()),
238
+ CategoryEntity.loader(viewerContext).loadByFieldEqualingAsync(
239
+ 'parent_category_id',
240
+ subCategory.getID(),
241
+ ),
256
242
  ).resolves.not.toBeNull();
257
243
 
258
244
  const categoryCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(
@@ -271,7 +257,7 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
271
257
  );
272
258
  expect(subSubCategoryCachedBefore.get(subCategory.getID())?.status).toEqual(CacheStatus.HIT);
273
259
 
274
- await CategoryEntity.enforceDeleteAsync(parentCategory);
260
+ await CategoryEntity.deleter(parentCategory).deleteAsync();
275
261
 
276
262
  const subCategoryCachedAfter = await categoryCacheAdapter.loadManyAsync('parent_category_id', [
277
263
  parentCategory.getID(),
@@ -285,17 +271,13 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
285
271
  expect(subSubCategoryCachedAfter.get(subCategory.getID())?.status).toEqual(CacheStatus.MISS);
286
272
 
287
273
  await expect(
288
- CategoryEntity.loader(viewerContext)
289
- .enforcing()
290
- .loadByIDNullableAsync(parentCategory.getID()),
274
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(parentCategory.getID()),
291
275
  ).resolves.toBeNull();
292
276
  await expect(
293
- CategoryEntity.loader(viewerContext).enforcing().loadByIDNullableAsync(subCategory.getID()),
277
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(subCategory.getID()),
294
278
  ).resolves.not.toBeNull();
295
279
  await expect(
296
- CategoryEntity.loader(viewerContext)
297
- .enforcing()
298
- .loadByIDNullableAsync(subSubCategory.getID()),
280
+ CategoryEntity.loader(viewerContext).loadByIDNullableAsync(subSubCategory.getID()),
299
281
  ).resolves.not.toBeNull();
300
282
  });
301
283
 
@@ -307,23 +289,25 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
307
289
  const companionProvider = createUnitTestEntityCompanionProvider();
308
290
  const viewerContext = new TestViewerContext(companionProvider);
309
291
 
310
- const categoryA = await CategoryEntity.creator(viewerContext).enforceCreateAsync();
292
+ const categoryA = await CategoryEntity.creator(viewerContext).createAsync();
311
293
  const categoryB = await CategoryEntity.creator(viewerContext)
312
294
  .setField('parent_category_id', categoryA.getID())
313
- .enforceCreateAsync();
295
+ .createAsync();
314
296
  await CategoryEntity.updater(categoryA)
315
297
  .setField('parent_category_id', categoryB.getID())
316
- .enforceUpdateAsync();
298
+ .updateAsync();
317
299
 
318
300
  await expect(
319
- CategoryEntity.loader(viewerContext)
320
- .enforcing()
321
- .loadByFieldEqualingAsync('parent_category_id', categoryA.getID()),
301
+ CategoryEntity.loader(viewerContext).loadByFieldEqualingAsync(
302
+ 'parent_category_id',
303
+ categoryA.getID(),
304
+ ),
322
305
  ).resolves.not.toBeNull();
323
306
  await expect(
324
- CategoryEntity.loader(viewerContext)
325
- .enforcing()
326
- .loadByFieldEqualingAsync('parent_category_id', categoryB.getID()),
307
+ CategoryEntity.loader(viewerContext).loadByFieldEqualingAsync(
308
+ 'parent_category_id',
309
+ categoryB.getID(),
310
+ ),
327
311
  ).resolves.not.toBeNull();
328
312
 
329
313
  const categoryCacheAdapter = viewerContext.getViewerScopedEntityCompanionForClass(
@@ -338,7 +322,7 @@ describe('EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE', () => {
338
322
  expect(categoriesCachedBefore.get(categoryA.getID())?.status).toEqual(CacheStatus.HIT);
339
323
  expect(categoriesCachedBefore.get(categoryB.getID())?.status).toEqual(CacheStatus.HIT);
340
324
 
341
- await CategoryEntity.enforceDeleteAsync(categoryA);
325
+ await CategoryEntity.deleter(categoryA).deleteAsync();
342
326
 
343
327
  const categoriesCachedAfter = await categoryCacheAdapter.loadManyAsync('parent_category_id', [
344
328
  categoryA.getID(),
@@ -1,7 +1,10 @@
1
1
  import { instance, mock } from 'ts-mockito';
2
2
 
3
- import EntityAssociationLoader from '../EntityAssociationLoader';
4
- import EntityLoader from '../EntityLoader';
3
+ import AuthorizationResultBasedEntityAssociationLoader from '../AuthorizationResultBasedEntityAssociationLoader';
4
+ import AuthorizationResultBasedEntityLoader from '../AuthorizationResultBasedEntityLoader';
5
+ import EnforcingEntityAssociationLoader from '../EnforcingEntityAssociationLoader';
6
+ import EnforcingEntityLoader from '../EnforcingEntityLoader';
7
+ import EntityLoaderUtils from '../EntityLoaderUtils';
5
8
  import ReadonlyEntity from '../ReadonlyEntity';
6
9
  import ViewerContext from '../ViewerContext';
7
10
  import SimpleTestEntity from '../testfixtures/SimpleTestEntity';
@@ -127,7 +130,7 @@ describe(ReadonlyEntity, () => {
127
130
  }).toThrow();
128
131
  });
129
132
 
130
- it('returns correct viewerCo}ntext from instantiation', () => {
133
+ it('returns correct viewerContext from instantiation', () => {
131
134
  const viewerContext = instance(mock(ViewerContext));
132
135
  const data = {
133
136
  id: 'what',
@@ -157,7 +160,7 @@ describe(ReadonlyEntity, () => {
157
160
  });
158
161
 
159
162
  describe('associationLoader', () => {
160
- it('returns a new association loader', () => {
163
+ it('returns a new EnforcingEntityAssociationLoader', () => {
161
164
  const companionProvider = createUnitTestEntityCompanionProvider();
162
165
  const viewerContext = new ViewerContext(companionProvider);
163
166
  const data = {
@@ -169,15 +172,52 @@ describe(ReadonlyEntity, () => {
169
172
  databaseFields: data,
170
173
  selectedFields: data,
171
174
  });
172
- expect(testEntity.associationLoader()).toBeInstanceOf(EntityAssociationLoader);
175
+ expect(testEntity.associationLoader()).toBeInstanceOf(EnforcingEntityAssociationLoader);
176
+ });
177
+ });
178
+
179
+ describe('associationLoaderWithAuthorizationResults', () => {
180
+ it('returns a new AuthorizationResultBasedEntityAssociationLoader', () => {
181
+ const companionProvider = createUnitTestEntityCompanionProvider();
182
+ const viewerContext = new ViewerContext(companionProvider);
183
+ const data = {
184
+ id: 'what',
185
+ };
186
+ const testEntity = new SimpleTestEntity({
187
+ viewerContext,
188
+ id: 'what',
189
+ databaseFields: data,
190
+ selectedFields: data,
191
+ });
192
+ expect(testEntity.associationLoaderWithAuthorizationResults()).toBeInstanceOf(
193
+ AuthorizationResultBasedEntityAssociationLoader,
194
+ );
173
195
  });
174
196
  });
175
197
 
176
198
  describe('loader', () => {
177
- it('creates a new EntityLoader', async () => {
199
+ it('creates a new EnforcingEntityLoader', async () => {
200
+ const companionProvider = createUnitTestEntityCompanionProvider();
201
+ const viewerContext = new ViewerContext(companionProvider);
202
+ expect(SimpleTestEntity.loader(viewerContext)).toBeInstanceOf(EnforcingEntityLoader);
203
+ });
204
+ });
205
+
206
+ describe('loaderWithAuthorizationResults', () => {
207
+ it('creates a new AuthorizationResultBasedEntityLoader', async () => {
208
+ const companionProvider = createUnitTestEntityCompanionProvider();
209
+ const viewerContext = new ViewerContext(companionProvider);
210
+ expect(SimpleTestEntity.loaderWithAuthorizationResults(viewerContext)).toBeInstanceOf(
211
+ AuthorizationResultBasedEntityLoader,
212
+ );
213
+ });
214
+ });
215
+
216
+ describe('loaderUtils', () => {
217
+ it('creates a new EntityLoaderUtils', async () => {
178
218
  const companionProvider = createUnitTestEntityCompanionProvider();
179
219
  const viewerContext = new ViewerContext(companionProvider);
180
- expect(SimpleTestEntity.loader(viewerContext)).toBeInstanceOf(EntityLoader);
220
+ expect(SimpleTestEntity.loaderUtils(viewerContext)).toBeInstanceOf(EntityLoaderUtils);
181
221
  });
182
222
  });
183
223
  });
@@ -16,28 +16,28 @@ describe('Two entities backed by the same table', () => {
16
16
  const one = await OneTestEntity.creator(viewerContext)
17
17
  .setField('entity_type', EntityType.ONE)
18
18
  .setField('common_other_field', 'wat')
19
- .enforceCreateAsync();
19
+ .createAsync();
20
20
 
21
21
  const two = await TwoTestEntity.creator(viewerContext)
22
22
  .setField('entity_type', EntityType.TWO)
23
23
  .setField('other_field', 'blah')
24
24
  .setField('common_other_field', 'wat')
25
- .enforceCreateAsync();
25
+ .createAsync();
26
26
 
27
27
  expect(one).toBeInstanceOf(OneTestEntity);
28
28
  expect(two).toBeInstanceOf(TwoTestEntity);
29
29
 
30
30
  await expect(
31
- TwoTestEntity.loader(viewerContext).enforcing().loadByIDAsync(one.getID()),
31
+ TwoTestEntity.loader(viewerContext).loadByIDAsync(one.getID()),
32
32
  ).rejects.toThrowError('TwoTestEntity must be instantiated with two data');
33
33
 
34
34
  await expect(
35
- OneTestEntity.loader(viewerContext).enforcing().loadByIDAsync(two.getID()),
35
+ OneTestEntity.loader(viewerContext).loadByIDAsync(two.getID()),
36
36
  ).rejects.toThrowError('OneTestEntity must be instantiated with one data');
37
37
 
38
- const manyResults = await OneTestEntity.loader(viewerContext)
39
- .withAuthorizationResults()
40
- .loadManyByFieldEqualingAsync('common_other_field', 'wat');
38
+ const manyResults = await OneTestEntity.loaderWithAuthorizationResults(
39
+ viewerContext,
40
+ ).loadManyByFieldEqualingAsync('common_other_field', 'wat');
41
41
  const successfulManyResults = successfulResults(manyResults);
42
42
  const failedManyResults = failedResults(manyResults);
43
43
 
@@ -49,14 +49,14 @@ describe('Two entities backed by the same table', () => {
49
49
  'OneTestEntity must be instantiated with one data',
50
50
  );
51
51
 
52
- const fieldEqualityConjunctionResults = await OneTestEntity.loader(viewerContext)
53
- .withAuthorizationResults()
54
- .loadManyByFieldEqualityConjunctionAsync([
55
- {
56
- fieldName: 'common_other_field',
57
- fieldValue: 'wat',
58
- },
59
- ]);
52
+ const fieldEqualityConjunctionResults = await OneTestEntity.loaderWithAuthorizationResults(
53
+ viewerContext,
54
+ ).loadManyByFieldEqualityConjunctionAsync([
55
+ {
56
+ fieldName: 'common_other_field',
57
+ fieldValue: 'wat',
58
+ },
59
+ ]);
60
60
  const successfulfieldEqualityConjunctionResultsResults = successfulResults(
61
61
  fieldEqualityConjunctionResults,
62
62
  );
@@ -14,27 +14,23 @@ describe('Two entities backed by the same table', () => {
14
14
 
15
15
  const entity1 = await OneTestEntity.creator(viewerContext)
16
16
  .setField('fake_field', 'hello')
17
- .enforceCreateAsync();
17
+ .createAsync();
18
18
  expect(entity1).toBeInstanceOf(OneTestEntity);
19
19
 
20
- const entity2 = await TwoTestEntity.loader(viewerContext)
21
- .enforcing()
22
- .loadByIDAsync(entity1.getID());
20
+ const entity2 = await TwoTestEntity.loader(viewerContext).loadByIDAsync(entity1.getID());
23
21
  expect(entity2).toBeInstanceOf(TwoTestEntity);
24
22
 
25
23
  const updated2 = await TwoTestEntity.updater(entity2)
26
24
  .setField('fake_field', 'world')
27
25
  .setField('other_field', 'wat')
28
- .enforceUpdateAsync();
26
+ .updateAsync();
29
27
  expect(updated2.getAllFields()).toMatchObject({
30
28
  id: updated2.getID(),
31
29
  other_field: 'wat',
32
30
  fake_field: 'world',
33
31
  });
34
32
 
35
- const loaded1 = await OneTestEntity.loader(viewerContext)
36
- .enforcing()
37
- .loadByIDAsync(entity1.getID());
33
+ const loaded1 = await OneTestEntity.loader(viewerContext).loadByIDAsync(entity1.getID());
38
34
  expect(loaded1.getAllFields()).toMatchObject({
39
35
  id: updated2.getID(),
40
36
  fake_field: 'world',
@@ -48,34 +44,35 @@ describe('Two entities backed by the same table', () => {
48
44
  const entity = await TwoTestEntity.creator(viewerContext)
49
45
  .setField('fake_field', 'hello')
50
46
  .setField('other_field', 'huh')
51
- .enforceCreateAsync();
47
+ .createAsync();
52
48
 
53
- const loadedEntity = await TwoTestEntity.loader(viewerContext)
54
- .enforcing()
55
- .loadByFieldEqualingAsync('other_field', 'huh');
49
+ const loadedEntity = await TwoTestEntity.loader(viewerContext).loadByFieldEqualingAsync(
50
+ 'other_field',
51
+ 'huh',
52
+ );
56
53
  expect(loadedEntity?.getAllFields()).toMatchObject({
57
54
  id: entity.getID(),
58
55
  fake_field: 'hello',
59
56
  other_field: 'huh',
60
57
  });
61
58
 
62
- const loaded1 = await OneTestEntity.loader(viewerContext)
63
- .enforcing()
64
- .loadByIDAsync(entity.getID());
65
- await OneTestEntity.updater(loaded1).setField('fake_field', 'world').enforceUpdateAsync();
59
+ const loaded1 = await OneTestEntity.loader(viewerContext).loadByIDAsync(entity.getID());
60
+ await OneTestEntity.updater(loaded1).setField('fake_field', 'world').updateAsync();
66
61
 
67
- const loaded2 = await TwoTestEntity.loader(viewerContext)
68
- .enforcing()
69
- .loadByFieldEqualingAsync('other_field', 'huh');
62
+ const loaded2 = await TwoTestEntity.loader(viewerContext).loadByFieldEqualingAsync(
63
+ 'other_field',
64
+ 'huh',
65
+ );
70
66
  expect(loaded2?.getAllFields()).toMatchObject({
71
67
  id: entity.getID(),
72
68
  fake_field: 'world',
73
69
  other_field: 'huh',
74
70
  });
75
71
 
76
- const loaded22 = await TwoTestEntity.loader(viewerContext)
77
- .enforcing()
78
- .loadByFieldEqualingAsync('fake_field', 'world');
72
+ const loaded22 = await TwoTestEntity.loader(viewerContext).loadByFieldEqualingAsync(
73
+ 'fake_field',
74
+ 'world',
75
+ );
79
76
  expect(loaded22?.getAllFields()).toMatchObject({
80
77
  id: entity.getID(),
81
78
  fake_field: 'world',
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';