@expo/entity 0.31.1 → 0.32.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 (255) hide show
  1. package/build/ComposedEntityCacheAdapter.d.ts +4 -6
  2. package/build/ComposedEntityCacheAdapter.js +3 -6
  3. package/build/ComposedEntityCacheAdapter.js.map +1 -1
  4. package/build/EnforcingEntityLoader.d.ts +1 -1
  5. package/build/Entity.d.ts +20 -10
  6. package/build/Entity.js +2 -2
  7. package/build/Entity.js.map +1 -1
  8. package/build/EntityAssociationLoader.d.ts +9 -9
  9. package/build/EntityCompanion.d.ts +6 -5
  10. package/build/EntityCompanion.js +6 -4
  11. package/build/EntityCompanion.js.map +1 -1
  12. package/build/EntityCompanionProvider.d.ts +28 -36
  13. package/build/EntityCompanionProvider.js +4 -19
  14. package/build/EntityCompanionProvider.js.map +1 -1
  15. package/build/EntityConfiguration.d.ts +3 -3
  16. package/build/EntityConfiguration.js +2 -2
  17. package/build/EntityConfiguration.js.map +1 -1
  18. package/build/EntityDatabaseAdapter.d.ts +1 -1
  19. package/build/EntityDatabaseAdapter.js +1 -1
  20. package/build/EntityDatabaseAdapter.js.map +1 -1
  21. package/build/EntityFieldDefinition.d.ts +2 -2
  22. package/build/EntityFieldDefinition.js +1 -1
  23. package/build/EntityFieldDefinition.js.map +1 -1
  24. package/build/EntityLoader.d.ts +4 -2
  25. package/build/EntityLoader.js +21 -7
  26. package/build/EntityLoader.js.map +1 -1
  27. package/build/EntityLoaderFactory.d.ts +4 -7
  28. package/build/EntityLoaderFactory.js +3 -5
  29. package/build/EntityLoaderFactory.js.map +1 -1
  30. package/build/EntityMutationInfo.d.ts +3 -3
  31. package/build/EntityMutationInfo.js +1 -1
  32. package/build/EntityMutationInfo.js.map +1 -1
  33. package/build/EntityMutationTriggerConfiguration.d.ts +3 -3
  34. package/build/EntityMutationValidator.d.ts +1 -1
  35. package/build/EntityMutator.d.ts +9 -7
  36. package/build/EntityMutator.js +21 -21
  37. package/build/EntityMutator.js.map +1 -1
  38. package/build/EntityMutatorFactory.d.ts +4 -2
  39. package/build/EntityMutatorFactory.js +5 -4
  40. package/build/EntityMutatorFactory.js.map +1 -1
  41. package/build/EntityPrivacyPolicy.d.ts +3 -3
  42. package/build/EntityPrivacyPolicy.js +2 -2
  43. package/build/EntityPrivacyPolicy.js.map +1 -1
  44. package/build/EntityQueryContext.d.ts +13 -5
  45. package/build/EntityQueryContext.js +11 -4
  46. package/build/EntityQueryContext.js.map +1 -1
  47. package/build/EntityQueryContextProvider.d.ts +3 -3
  48. package/build/EntityQueryContextProvider.js +2 -2
  49. package/build/EntityQueryContextProvider.js.map +1 -1
  50. package/build/EntitySecondaryCacheLoader.d.ts +1 -1
  51. package/build/EntitySecondaryCacheLoader.js +1 -1
  52. package/build/EntitySecondaryCacheLoader.js.map +1 -1
  53. package/build/GenericEntityCacheAdapter.d.ts +14 -0
  54. package/build/GenericEntityCacheAdapter.js +38 -0
  55. package/build/GenericEntityCacheAdapter.js.map +1 -0
  56. package/build/{EntityCacheAdapter.d.ts → IEntityCacheAdapter.d.ts} +5 -8
  57. package/build/IEntityCacheAdapter.js +3 -0
  58. package/build/IEntityCacheAdapter.js.map +1 -0
  59. package/build/IEntityCacheAdapterProvider.d.ts +2 -2
  60. package/build/IEntityGenericCacher.d.ts +31 -2
  61. package/build/ReadonlyEntity.d.ts +19 -7
  62. package/build/ReadonlyEntity.js +15 -13
  63. package/build/ReadonlyEntity.js.map +1 -1
  64. package/build/ViewerContext.d.ts +3 -3
  65. package/build/ViewerContext.js +3 -3
  66. package/build/ViewerContext.js.map +1 -1
  67. package/build/ViewerScopedEntityCompanion.d.ts +2 -2
  68. package/build/ViewerScopedEntityCompanion.js.map +1 -1
  69. package/build/ViewerScopedEntityCompanionProvider.d.ts +3 -3
  70. package/build/ViewerScopedEntityCompanionProvider.js +3 -3
  71. package/build/ViewerScopedEntityCompanionProvider.js.map +1 -1
  72. package/build/ViewerScopedEntityLoaderFactory.d.ts +1 -1
  73. package/build/ViewerScopedEntityMutatorFactory.d.ts +1 -1
  74. package/build/__tests__/ComposedCacheAdapter-test.js +4 -8
  75. package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
  76. package/build/__tests__/EnforcingEntityLoader-test.js +1 -0
  77. package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
  78. package/build/__tests__/Entity-test.js +42 -20
  79. package/build/__tests__/Entity-test.js.map +1 -1
  80. package/build/__tests__/EntityAssociationLoader-test.js +6 -6
  81. package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
  82. package/build/__tests__/EntityCommonUseCases-test.js +20 -22
  83. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  84. package/build/__tests__/EntityCompanion-test.js +2 -1
  85. package/build/__tests__/EntityCompanion-test.js.map +1 -1
  86. package/build/__tests__/EntityCompanionProvider-test.js +15 -40
  87. package/build/__tests__/EntityCompanionProvider-test.js.map +1 -1
  88. package/build/__tests__/EntityEdges-test.js +48 -54
  89. package/build/__tests__/EntityEdges-test.js.map +1 -1
  90. package/build/__tests__/EntityLoader-constructor-test.d.ts +9 -5
  91. package/build/__tests__/EntityLoader-constructor-test.js +13 -14
  92. package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
  93. package/build/__tests__/EntityLoader-test.js +19 -11
  94. package/build/__tests__/EntityLoader-test.js.map +1 -1
  95. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +20 -22
  96. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
  97. package/build/__tests__/EntityMutator-test.js +67 -14
  98. package/build/__tests__/EntityMutator-test.js.map +1 -1
  99. package/build/__tests__/EntityPrivacyPolicy-test.js +82 -29
  100. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  101. package/build/__tests__/EntityQueryContext-test.js +12 -0
  102. package/build/__tests__/EntityQueryContext-test.js.map +1 -1
  103. package/build/__tests__/EntitySecondaryCacheLoader-test.js +1 -2
  104. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  105. package/build/__tests__/EntitySelfReferentialEdges-test.js +16 -20
  106. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  107. package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +1 -0
  108. package/build/__tests__/GenericEntityCacheAdapter-test.js +80 -0
  109. package/build/__tests__/GenericEntityCacheAdapter-test.js.map +1 -0
  110. package/build/__tests__/ReadonlyEntity-test.js +79 -13
  111. package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
  112. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +2 -25
  113. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +1 -1
  114. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +20 -23
  115. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
  116. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +17 -20
  117. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
  118. package/build/errors/EntityError.js +2 -2
  119. package/build/errors/EntityError.js.map +1 -1
  120. package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
  121. package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
  122. package/build/errors/EntityNotAuthorizedError.d.ts +2 -2
  123. package/build/errors/EntityNotAuthorizedError.js +1 -1
  124. package/build/errors/EntityNotAuthorizedError.js.map +1 -1
  125. package/build/errors/EntityNotFoundError.d.ts +2 -2
  126. package/build/errors/EntityNotFoundError.js.map +1 -1
  127. package/build/index.d.ts +2 -1
  128. package/build/index.js +3 -3
  129. package/build/index.js.map +1 -1
  130. package/build/internal/EntityDataManager.d.ts +1 -1
  131. package/build/internal/EntityDataManager.js +1 -1
  132. package/build/internal/EntityDataManager.js.map +1 -1
  133. package/build/internal/EntityFieldTransformationUtils.d.ts +1 -1
  134. package/build/internal/EntityFieldTransformationUtils.js +4 -4
  135. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  136. package/build/internal/EntityTableDataCoordinator.d.ts +3 -3
  137. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  138. package/build/internal/ReadThroughEntityCache.d.ts +3 -3
  139. package/build/internal/ReadThroughEntityCache.js +1 -1
  140. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  141. package/build/internal/__tests__/EntityDataManager-test.js +1 -1
  142. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  143. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  144. package/build/metrics/EntityMetricsUtils.js.map +1 -1
  145. package/build/metrics/IEntityMetricsAdapter.js +4 -4
  146. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  147. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
  148. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  149. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
  150. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  151. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
  152. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  153. package/build/rules/PrivacyPolicyRule.d.ts +1 -1
  154. package/build/rules/PrivacyPolicyRule.js +1 -1
  155. package/build/rules/PrivacyPolicyRule.js.map +1 -1
  156. package/build/testfixtures/DateIDTestEntity.d.ts +2 -3
  157. package/build/testfixtures/DateIDTestEntity.js +7 -9
  158. package/build/testfixtures/DateIDTestEntity.js.map +1 -1
  159. package/build/testfixtures/SimpleTestEntity.d.ts +3 -4
  160. package/build/testfixtures/SimpleTestEntity.js +7 -9
  161. package/build/testfixtures/SimpleTestEntity.js.map +1 -1
  162. package/build/testfixtures/TestEntity.d.ts +2 -3
  163. package/build/testfixtures/TestEntity.js +14 -10
  164. package/build/testfixtures/TestEntity.js.map +1 -1
  165. package/build/testfixtures/TestEntity2.d.ts +2 -3
  166. package/build/testfixtures/TestEntity2.js +7 -9
  167. package/build/testfixtures/TestEntity2.js.map +1 -1
  168. package/build/testfixtures/TestEntityNumberKey.d.ts +2 -3
  169. package/build/testfixtures/TestEntityNumberKey.js +7 -9
  170. package/build/testfixtures/TestEntityNumberKey.js.map +1 -1
  171. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +4 -4
  172. package/build/utils/testing/StubCacheAdapter.d.ts +6 -5
  173. package/build/utils/testing/StubCacheAdapter.js +5 -6
  174. package/build/utils/testing/StubCacheAdapter.js.map +1 -1
  175. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +1 -1
  176. package/build/utils/testing/StubQueryContextProvider.d.ts +2 -1
  177. package/build/utils/testing/StubQueryContextProvider.js +1 -1
  178. package/build/utils/testing/StubQueryContextProvider.js.map +1 -1
  179. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +2 -2
  180. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +1 -1
  181. package/package.json +3 -3
  182. package/src/ComposedEntityCacheAdapter.ts +4 -11
  183. package/src/EnforcingEntityLoader.ts +1 -1
  184. package/src/Entity.ts +23 -12
  185. package/src/EntityAssociationLoader.ts +12 -12
  186. package/src/EntityCompanion.ts +13 -32
  187. package/src/EntityCompanionProvider.ts +41 -80
  188. package/src/EntityConfiguration.ts +4 -5
  189. package/src/EntityFieldDefinition.ts +2 -2
  190. package/src/EntityLoader.ts +19 -2
  191. package/src/EntityLoaderFactory.ts +7 -9
  192. package/src/EntityMutationInfo.ts +2 -2
  193. package/src/EntityMutationTriggerConfiguration.ts +3 -3
  194. package/src/EntityMutationValidator.ts +1 -1
  195. package/src/EntityMutator.ts +38 -31
  196. package/src/EntityMutatorFactory.ts +6 -1
  197. package/src/EntityPrivacyPolicy.ts +2 -2
  198. package/src/EntityQueryContext.ts +24 -4
  199. package/src/EntityQueryContextProvider.ts +7 -5
  200. package/src/EntitySecondaryCacheLoader.ts +1 -1
  201. package/src/GenericEntityCacheAdapter.ts +65 -0
  202. package/src/{EntityCacheAdapter.ts → IEntityCacheAdapter.ts} +5 -8
  203. package/src/IEntityCacheAdapterProvider.ts +2 -2
  204. package/src/IEntityGenericCacher.ts +32 -2
  205. package/src/ReadonlyEntity.ts +32 -32
  206. package/src/ViewerContext.ts +10 -8
  207. package/src/ViewerScopedEntityCompanion.ts +2 -2
  208. package/src/ViewerScopedEntityCompanionProvider.ts +4 -12
  209. package/src/ViewerScopedEntityLoaderFactory.ts +1 -1
  210. package/src/ViewerScopedEntityMutatorFactory.ts +1 -1
  211. package/src/__tests__/ComposedCacheAdapter-test.ts +6 -11
  212. package/src/__tests__/EnforcingEntityLoader-test.ts +1 -0
  213. package/src/__tests__/Entity-test.ts +42 -21
  214. package/src/__tests__/EntityCommonUseCases-test.ts +20 -22
  215. package/src/__tests__/EntityCompanion-test.ts +6 -9
  216. package/src/__tests__/EntityCompanionProvider-test.ts +14 -26
  217. package/src/__tests__/EntityEdges-test.ts +43 -49
  218. package/src/__tests__/EntityLoader-constructor-test.ts +16 -12
  219. package/src/__tests__/EntityLoader-test.ts +9 -0
  220. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +20 -22
  221. package/src/__tests__/EntityMutator-test.ts +119 -19
  222. package/src/__tests__/EntityPrivacyPolicy-test.ts +82 -29
  223. package/src/__tests__/EntityQueryContext-test.ts +23 -1
  224. package/src/__tests__/EntitySelfReferentialEdges-test.ts +8 -10
  225. package/src/__tests__/GenericEntityCacheAdapter-test.ts +102 -0
  226. package/src/__tests__/ReadonlyEntity-test.ts +79 -13
  227. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +2 -5
  228. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +30 -24
  229. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +14 -18
  230. package/src/errors/EntityInvalidFieldValueError.ts +2 -2
  231. package/src/errors/EntityNotAuthorizedError.ts +2 -2
  232. package/src/errors/EntityNotFoundError.ts +2 -2
  233. package/src/index.ts +2 -1
  234. package/src/internal/EntityDataManager.ts +1 -1
  235. package/src/internal/EntityTableDataCoordinator.ts +4 -4
  236. package/src/internal/ReadThroughEntityCache.ts +2 -2
  237. package/src/internal/__tests__/EntityDataManager-test.ts +2 -1
  238. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +8 -8
  239. package/src/metrics/EntityMetricsUtils.ts +1 -1
  240. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +2 -2
  241. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +2 -2
  242. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +2 -2
  243. package/src/rules/PrivacyPolicyRule.ts +1 -1
  244. package/src/testfixtures/DateIDTestEntity.ts +6 -8
  245. package/src/testfixtures/SimpleTestEntity.ts +6 -8
  246. package/src/testfixtures/TestEntity.ts +19 -15
  247. package/src/testfixtures/TestEntity2.ts +6 -8
  248. package/src/testfixtures/TestEntityNumberKey.ts +6 -8
  249. package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +4 -4
  250. package/src/utils/testing/StubCacheAdapter.ts +9 -11
  251. package/src/utils/testing/StubDatabaseAdapterProvider.ts +1 -1
  252. package/src/utils/testing/StubQueryContextProvider.ts +4 -3
  253. package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +3 -3
  254. package/build/EntityCacheAdapter.js +0 -13
  255. package/build/EntityCacheAdapter.js.map +0 -1
@@ -26,7 +26,12 @@ describe(Entity, () => {
26
26
  const data = {
27
27
  id: 'what',
28
28
  };
29
- const testEntity = new SimpleTestEntity(viewerContext, data);
29
+ const testEntity = new SimpleTestEntity({
30
+ viewerContext,
31
+ id: 'what',
32
+ databaseFields: data,
33
+ selectedFields: data,
34
+ });
30
35
  expect(SimpleTestEntity.updater(testEntity)).toBeInstanceOf(UpdateMutator);
31
36
  });
32
37
  });
@@ -38,7 +43,12 @@ describe(Entity, () => {
38
43
  const data = {
39
44
  id: 'what',
40
45
  };
41
- const testEntity = new SimpleTestDenyDeleteEntity(viewerContext, data);
46
+ const testEntity = new SimpleTestDenyDeleteEntity({
47
+ viewerContext,
48
+ id: 'what',
49
+ databaseFields: data,
50
+ selectedFields: data,
51
+ });
42
52
  const canViewerUpdate = await SimpleTestDenyDeleteEntity.canViewerUpdateAsync(testEntity);
43
53
  expect(canViewerUpdate).toBe(true);
44
54
  });
@@ -49,7 +59,12 @@ describe(Entity, () => {
49
59
  const data = {
50
60
  id: 'what',
51
61
  };
52
- const testEntity = new SimpleTestDenyUpdateEntity(viewerContext, data);
62
+ const testEntity = new SimpleTestDenyUpdateEntity({
63
+ viewerContext,
64
+ id: 'what',
65
+ databaseFields: data,
66
+ selectedFields: data,
67
+ });
53
68
  const canViewerUpdate = await SimpleTestDenyUpdateEntity.canViewerUpdateAsync(testEntity);
54
69
  expect(canViewerUpdate).toBe(false);
55
70
  });
@@ -62,7 +77,12 @@ describe(Entity, () => {
62
77
  const data = {
63
78
  id: 'what',
64
79
  };
65
- const testEntity = new SimpleTestDenyUpdateEntity(viewerContext, data);
80
+ const testEntity = new SimpleTestDenyUpdateEntity({
81
+ viewerContext,
82
+ id: 'what',
83
+ databaseFields: data,
84
+ selectedFields: data,
85
+ });
66
86
  const canViewerDelete = await SimpleTestDenyUpdateEntity.canViewerDeleteAsync(testEntity);
67
87
  expect(canViewerDelete).toBe(true);
68
88
  });
@@ -73,7 +93,12 @@ describe(Entity, () => {
73
93
  const data = {
74
94
  id: 'what',
75
95
  };
76
- const testEntity = new SimpleTestDenyDeleteEntity(viewerContext, data);
96
+ const testEntity = new SimpleTestDenyDeleteEntity({
97
+ viewerContext,
98
+ id: 'what',
99
+ databaseFields: data,
100
+ selectedFields: data,
101
+ });
77
102
  const canViewerDelete = await SimpleTestDenyDeleteEntity.canViewerDeleteAsync(testEntity);
78
103
  expect(canViewerDelete).toBe(false);
79
104
  });
@@ -177,37 +202,33 @@ class SimpleTestDenyDeleteEntityPrivacyPolicy extends EntityPrivacyPolicy<
177
202
  }
178
203
 
179
204
  class SimpleTestDenyUpdateEntity extends Entity<TestEntityFields, string, ViewerContext> {
180
- static getCompanionDefinition(): EntityCompanionDefinition<
205
+ static defineCompanionDefinition(): EntityCompanionDefinition<
181
206
  TestEntityFields,
182
207
  string,
183
208
  ViewerContext,
184
209
  SimpleTestDenyUpdateEntity,
185
210
  SimpleTestDenyUpdateEntityPrivacyPolicy
186
211
  > {
187
- return simpleTestDenyUpdateEntityCompanion;
212
+ return {
213
+ entityClass: SimpleTestDenyUpdateEntity,
214
+ entityConfiguration: testEntityConfiguration,
215
+ privacyPolicyClass: SimpleTestDenyUpdateEntityPrivacyPolicy,
216
+ };
188
217
  }
189
218
  }
190
219
 
191
- const simpleTestDenyUpdateEntityCompanion = new EntityCompanionDefinition({
192
- entityClass: SimpleTestDenyUpdateEntity,
193
- entityConfiguration: testEntityConfiguration,
194
- privacyPolicyClass: SimpleTestDenyUpdateEntityPrivacyPolicy,
195
- });
196
-
197
220
  class SimpleTestDenyDeleteEntity extends Entity<TestEntityFields, string, ViewerContext> {
198
- static getCompanionDefinition(): EntityCompanionDefinition<
221
+ static defineCompanionDefinition(): EntityCompanionDefinition<
199
222
  TestEntityFields,
200
223
  string,
201
224
  ViewerContext,
202
225
  SimpleTestDenyDeleteEntity,
203
226
  SimpleTestDenyDeleteEntityPrivacyPolicy
204
227
  > {
205
- return simpleTestDenyDeleteEntityCompanion;
228
+ return {
229
+ entityClass: SimpleTestDenyDeleteEntity,
230
+ entityConfiguration: testEntityConfiguration,
231
+ privacyPolicyClass: SimpleTestDenyDeleteEntityPrivacyPolicy,
232
+ };
206
233
  }
207
234
  }
208
-
209
- const simpleTestDenyDeleteEntityCompanion = new EntityCompanionDefinition({
210
- entityClass: SimpleTestDenyDeleteEntity,
211
- entityConfiguration: testEntityConfiguration,
212
- privacyPolicyClass: SimpleTestDenyDeleteEntityPrivacyPolicy,
213
- });
@@ -31,14 +31,32 @@ type BlahFields = {
31
31
  };
32
32
 
33
33
  class BlahEntity extends Entity<BlahFields, string, TestUserViewerContext> {
34
- static getCompanionDefinition(): EntityCompanionDefinition<
34
+ static defineCompanionDefinition(): EntityCompanionDefinition<
35
35
  BlahFields,
36
36
  string,
37
37
  TestUserViewerContext,
38
38
  BlahEntity,
39
39
  BlahEntityPrivacyPolicy
40
40
  > {
41
- return blahCompanion;
41
+ return {
42
+ entityClass: BlahEntity,
43
+ entityConfiguration: new EntityConfiguration<BlahFields>({
44
+ idField: 'id',
45
+ tableName: 'blah_table',
46
+ schema: {
47
+ id: new UUIDField({
48
+ columnName: 'id',
49
+ cache: true,
50
+ }),
51
+ ownerID: new UUIDField({
52
+ columnName: 'owner_id',
53
+ }),
54
+ },
55
+ databaseAdapterFlavor: 'postgres',
56
+ cacheAdapterFlavor: 'redis',
57
+ }),
58
+ privacyPolicyClass: BlahEntityPrivacyPolicy,
59
+ };
42
60
  }
43
61
  }
44
62
 
@@ -84,26 +102,6 @@ class BlahEntityPrivacyPolicy extends EntityPrivacyPolicy<
84
102
  ];
85
103
  }
86
104
 
87
- const blahCompanion = new EntityCompanionDefinition({
88
- entityClass: BlahEntity,
89
- entityConfiguration: new EntityConfiguration<BlahFields>({
90
- idField: 'id',
91
- tableName: 'blah_table',
92
- schema: {
93
- id: new UUIDField({
94
- columnName: 'id',
95
- cache: true,
96
- }),
97
- ownerID: new UUIDField({
98
- columnName: 'owner_id',
99
- }),
100
- },
101
- databaseAdapterFlavor: 'postgres',
102
- cacheAdapterFlavor: 'redis',
103
- }),
104
- privacyPolicyClass: BlahEntityPrivacyPolicy,
105
- });
106
-
107
105
  it('runs through a common workflow', async () => {
108
106
  // will be one entity companion provider for each request, so
109
107
  // share amongst all VCs created in that request
@@ -1,27 +1,24 @@
1
1
  import { instance, mock, when } from 'ts-mockito';
2
2
 
3
3
  import EntityCompanion from '../EntityCompanion';
4
+ import EntityCompanionProvider from '../EntityCompanionProvider';
4
5
  import EntityLoaderFactory from '../EntityLoaderFactory';
5
6
  import EntityMutatorFactory from '../EntityMutatorFactory';
6
7
  import EntityTableDataCoordinator from '../internal/EntityTableDataCoordinator';
7
8
  import IEntityMetricsAdapter from '../metrics/IEntityMetricsAdapter';
8
- import TestEntity, {
9
- TestEntityPrivacyPolicy,
10
- testEntityConfiguration,
11
- TestFields,
12
- } from '../testfixtures/TestEntity';
9
+ import TestEntity, { testEntityConfiguration, TestFields } from '../testfixtures/TestEntity';
13
10
 
14
11
  describe(EntityCompanion, () => {
15
12
  it('correctly instantiates mutator and loader factories', () => {
13
+ const entityCompanionProvider = instance(mock<EntityCompanionProvider>());
14
+
16
15
  const tableDataCoordinatorMock = mock<EntityTableDataCoordinator<TestFields>>();
17
16
  when(tableDataCoordinatorMock.entityConfiguration).thenReturn(testEntityConfiguration);
18
17
 
19
18
  const companion = new EntityCompanion(
20
- TestEntity,
19
+ entityCompanionProvider,
20
+ TestEntity.defineCompanionDefinition(),
21
21
  instance(tableDataCoordinatorMock),
22
- TestEntityPrivacyPolicy,
23
- [],
24
- {},
25
22
  instance(mock<IEntityMetricsAdapter>())
26
23
  );
27
24
  expect(companion.getLoaderFactory()).toBeInstanceOf(EntityLoaderFactory);
@@ -23,26 +23,34 @@ const blahConfiguration = new EntityConfiguration<BlahFields>({
23
23
  });
24
24
 
25
25
  class Blah1Entity extends Entity<BlahFields, string, ViewerContext> {
26
- static getCompanionDefinition(): EntityCompanionDefinition<
26
+ static defineCompanionDefinition(): EntityCompanionDefinition<
27
27
  BlahFields,
28
28
  string,
29
29
  ViewerContext,
30
30
  Blah1Entity,
31
31
  NoOpTest1PrivacyPolicy
32
32
  > {
33
- return blah1CompanionDefinition;
33
+ return {
34
+ entityClass: Blah1Entity,
35
+ entityConfiguration: blahConfiguration,
36
+ privacyPolicyClass: NoOpTest1PrivacyPolicy,
37
+ };
34
38
  }
35
39
  }
36
40
 
37
41
  class Blah2Entity extends Entity<BlahFields, string, ViewerContext> {
38
- static getCompanionDefinition(): EntityCompanionDefinition<
42
+ static defineCompanionDefinition(): EntityCompanionDefinition<
39
43
  BlahFields,
40
44
  string,
41
45
  ViewerContext,
42
46
  Blah2Entity,
43
47
  NoOpTest2PrivacyPolicy
44
48
  > {
45
- return blah2CompanionDefinition;
49
+ return {
50
+ entityClass: Blah2Entity,
51
+ entityConfiguration: blahConfiguration,
52
+ privacyPolicyClass: NoOpTest2PrivacyPolicy,
53
+ };
46
54
  }
47
55
  }
48
56
 
@@ -59,31 +67,11 @@ class NoOpTest2PrivacyPolicy extends EntityPrivacyPolicy<
59
67
  Blah2Entity
60
68
  > {}
61
69
 
62
- const blah1CompanionDefinition = new EntityCompanionDefinition({
63
- entityClass: Blah1Entity,
64
- entityConfiguration: blahConfiguration,
65
- privacyPolicyClass: NoOpTest1PrivacyPolicy,
66
- });
67
-
68
- const blah2CompanionDefinition = new EntityCompanionDefinition({
69
- entityClass: Blah2Entity,
70
- entityConfiguration: blahConfiguration,
71
- privacyPolicyClass: NoOpTest2PrivacyPolicy,
72
- });
73
-
74
70
  describe(EntityCompanionProvider, () => {
75
71
  it('returns different instances for different entity types, but share table data coordinators', () => {
76
72
  const entityCompanionProvider = createUnitTestEntityCompanionProvider();
77
- const companion1 = entityCompanionProvider.getCompanionForEntity(
78
- Blah1Entity,
79
- blah1CompanionDefinition
80
- );
81
-
82
- const companion2 = entityCompanionProvider.getCompanionForEntity(
83
- Blah2Entity,
84
- blah2CompanionDefinition
85
- );
86
-
73
+ const companion1 = entityCompanionProvider.getCompanionForEntity(Blah1Entity);
74
+ const companion2 = entityCompanionProvider.getCompanionForEntity(Blah2Entity);
87
75
  expect(companion1).not.toEqual(companion2);
88
76
  expect(companion1['tableDataCoordinator']).toEqual(companion2['tableDataCoordinator']);
89
77
  });
@@ -322,45 +322,78 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
322
322
  }
323
323
 
324
324
  class ParentEntity extends Entity<ParentFields, string, TestViewerContext> {
325
- static getCompanionDefinition(): EntityCompanionDefinition<
325
+ static defineCompanionDefinition(): EntityCompanionDefinition<
326
326
  ParentFields,
327
327
  string,
328
328
  TestViewerContext,
329
329
  ParentEntity,
330
330
  TestEntityPrivacyPolicy
331
331
  > {
332
- return parentEntityCompanion;
332
+ return {
333
+ entityClass: ParentEntity,
334
+ entityConfiguration: parentEntityConfiguration,
335
+ privacyPolicyClass: TestEntityPrivacyPolicy,
336
+ mutationTriggers: {
337
+ beforeDelete: [new ParentCheckInfoDeletionTrigger()],
338
+ afterDelete: [new ParentCheckInfoDeletionTrigger()],
339
+
340
+ beforeUpdate: [new ParentCheckInfoUpdateTrigger()],
341
+ afterUpdate: [new ParentCheckInfoUpdateTrigger()],
342
+ },
343
+ };
333
344
  }
334
345
  }
335
346
 
336
347
  class ChildEntity extends Entity<ChildFields, string, TestViewerContext> {
337
- static getCompanionDefinition(): EntityCompanionDefinition<
348
+ static defineCompanionDefinition(): EntityCompanionDefinition<
338
349
  ChildFields,
339
350
  string,
340
351
  TestViewerContext,
341
352
  ChildEntity,
342
353
  TestEntityPrivacyPolicy
343
354
  > {
344
- return childEntityCompanion;
355
+ return {
356
+ entityClass: ChildEntity,
357
+ entityConfiguration: childEntityConfiguration,
358
+ privacyPolicyClass: TestEntityPrivacyPolicy,
359
+ mutationTriggers: {
360
+ beforeDelete: [new ChildCheckInfoDeletionTrigger()],
361
+ afterDelete: [new ChildCheckInfoDeletionTrigger()],
362
+
363
+ beforeUpdate: [new ChildCheckInfoUpdateTrigger()],
364
+ afterUpdate: [new ChildCheckInfoUpdateTrigger()],
365
+ },
366
+ };
345
367
  }
346
368
  }
347
369
 
348
370
  class GrandChildEntity extends Entity<GrandChildFields, string, TestViewerContext> {
349
- static getCompanionDefinition(): EntityCompanionDefinition<
371
+ static defineCompanionDefinition(): EntityCompanionDefinition<
350
372
  GrandChildFields,
351
373
  string,
352
374
  TestViewerContext,
353
375
  GrandChildEntity,
354
376
  TestEntityPrivacyPolicy
355
377
  > {
356
- return grandChildEntityCompanion;
378
+ return {
379
+ entityClass: GrandChildEntity,
380
+ entityConfiguration: grandChildEntityConfiguration,
381
+ privacyPolicyClass: TestEntityPrivacyPolicy,
382
+ mutationTriggers: {
383
+ beforeDelete: [new GrandChildCheckInfoDeletionTrigger()],
384
+ afterDelete: [new GrandChildCheckInfoDeletionTrigger()],
385
+
386
+ beforeUpdate: [new GrandChildCheckInfoUpdateTrigger()],
387
+ afterUpdate: [new GrandChildCheckInfoUpdateTrigger()],
388
+ },
389
+ };
357
390
  }
358
391
  }
359
392
 
360
393
  const parentEntityConfiguration = new EntityConfiguration<ParentFields>({
361
394
  idField: 'id',
362
395
  tableName: 'parents',
363
- getInboundEdges: () => [ChildEntity],
396
+ inboundEdges: [ChildEntity],
364
397
  schema: {
365
398
  id: new UUIDField({
366
399
  columnName: 'id',
@@ -374,7 +407,7 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
374
407
  const childEntityConfiguration = new EntityConfiguration<ChildFields>({
375
408
  idField: 'id',
376
409
  tableName: 'children',
377
- getInboundEdges: () => [GrandChildEntity],
410
+ inboundEdges: [GrandChildEntity],
378
411
  schema: {
379
412
  id: new UUIDField({
380
413
  columnName: 'id',
@@ -384,7 +417,7 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
384
417
  columnName: 'parent_id',
385
418
  cache: true,
386
419
  association: {
387
- getAssociatedEntityClass: () => ParentEntity,
420
+ associatedEntityClass: ParentEntity,
388
421
  edgeDeletionBehavior,
389
422
  },
390
423
  }),
@@ -405,7 +438,7 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
405
438
  columnName: 'parent_id',
406
439
  cache: true,
407
440
  association: {
408
- getAssociatedEntityClass: () => ChildEntity,
441
+ associatedEntityClass: ChildEntity,
409
442
  edgeDeletionBehavior,
410
443
  },
411
444
  }),
@@ -414,45 +447,6 @@ const makeEntityClasses = (edgeDeletionBehavior: EntityEdgeDeletionBehavior) =>
414
447
  cacheAdapterFlavor: 'redis',
415
448
  });
416
449
 
417
- const parentEntityCompanion = new EntityCompanionDefinition({
418
- entityClass: ParentEntity,
419
- entityConfiguration: parentEntityConfiguration,
420
- privacyPolicyClass: TestEntityPrivacyPolicy,
421
- mutationTriggers: () => ({
422
- beforeDelete: [new ParentCheckInfoDeletionTrigger()],
423
- afterDelete: [new ParentCheckInfoDeletionTrigger()],
424
-
425
- beforeUpdate: [new ParentCheckInfoUpdateTrigger()],
426
- afterUpdate: [new ParentCheckInfoUpdateTrigger()],
427
- }),
428
- });
429
-
430
- const childEntityCompanion = new EntityCompanionDefinition({
431
- entityClass: ChildEntity,
432
- entityConfiguration: childEntityConfiguration,
433
- privacyPolicyClass: TestEntityPrivacyPolicy,
434
- mutationTriggers: () => ({
435
- beforeDelete: [new ChildCheckInfoDeletionTrigger()],
436
- afterDelete: [new ChildCheckInfoDeletionTrigger()],
437
-
438
- beforeUpdate: [new ChildCheckInfoUpdateTrigger()],
439
- afterUpdate: [new ChildCheckInfoUpdateTrigger()],
440
- }),
441
- });
442
-
443
- const grandChildEntityCompanion = new EntityCompanionDefinition({
444
- entityClass: GrandChildEntity,
445
- entityConfiguration: grandChildEntityConfiguration,
446
- privacyPolicyClass: TestEntityPrivacyPolicy,
447
- mutationTriggers: () => ({
448
- beforeDelete: [new GrandChildCheckInfoDeletionTrigger()],
449
- afterDelete: [new GrandChildCheckInfoDeletionTrigger()],
450
-
451
- beforeUpdate: [new GrandChildCheckInfoUpdateTrigger()],
452
- afterUpdate: [new GrandChildCheckInfoUpdateTrigger()],
453
- }),
454
- });
455
-
456
450
  return {
457
451
  ParentEntity,
458
452
  ChildEntity,
@@ -87,17 +87,22 @@ export default class TestEntity extends Entity<
87
87
  ViewerContext,
88
88
  TestFieldSelection
89
89
  > {
90
- constructor(viewerContext: ViewerContext, rawFields: Readonly<TestFields>) {
91
- if (rawFields.id === ID_SENTINEL_THROW_LITERAL) {
90
+ constructor(constructorParams: {
91
+ viewerContext: ViewerContext;
92
+ id: string;
93
+ databaseFields: Readonly<TestFields>;
94
+ selectedFields: Readonly<TestFields>;
95
+ }) {
96
+ if (constructorParams.selectedFields.id === ID_SENTINEL_THROW_LITERAL) {
92
97
  // eslint-disable-next-line no-throw-literal,@typescript-eslint/no-throw-literal
93
98
  throw 'hello';
94
- } else if (rawFields.id === ID_SENTINEL_THROW_ERROR) {
99
+ } else if (constructorParams.selectedFields.id === ID_SENTINEL_THROW_ERROR) {
95
100
  throw new Error('world');
96
101
  }
97
- super(viewerContext, rawFields);
102
+ super(constructorParams);
98
103
  }
99
104
 
100
- static getCompanionDefinition(): EntityCompanionDefinition<
105
+ static defineCompanionDefinition(): EntityCompanionDefinition<
101
106
  TestFields,
102
107
  string,
103
108
  ViewerContext,
@@ -105,16 +110,14 @@ export default class TestEntity extends Entity<
105
110
  TestEntityPrivacyPolicy,
106
111
  TestFieldSelection
107
112
  > {
108
- return testEntityCompanion;
113
+ return {
114
+ entityClass: TestEntity,
115
+ entityConfiguration: testEntityConfiguration,
116
+ privacyPolicyClass: TestEntityPrivacyPolicy,
117
+ };
109
118
  }
110
119
  }
111
120
 
112
- export const testEntityCompanion = new EntityCompanionDefinition({
113
- entityClass: TestEntity,
114
- entityConfiguration: testEntityConfiguration,
115
- privacyPolicyClass: TestEntityPrivacyPolicy,
116
- });
117
-
118
121
  describe(EntityLoader, () => {
119
122
  it('handles thrown errors and literals from constructor', async () => {
120
123
  const viewerContext = instance(mock(ViewerContext));
@@ -158,6 +161,7 @@ describe(EntityLoader, () => {
158
161
  privacyPolicyEvaluationContext,
159
162
  testEntityConfiguration,
160
163
  TestEntity,
164
+ /* entitySelectedFields */ undefined,
161
165
  privacyPolicy,
162
166
  dataManager,
163
167
  metricsAdapter
@@ -75,6 +75,7 @@ describe(EntityLoader, () => {
75
75
  privacyPolicyEvaluationContext,
76
76
  testEntityConfiguration,
77
77
  TestEntity,
78
+ /* entitySelectedFields */ undefined,
78
79
  privacyPolicy,
79
80
  dataManager,
80
81
  metricsAdapter
@@ -177,6 +178,7 @@ describe(EntityLoader, () => {
177
178
  privacyPolicyEvaluationContext,
178
179
  testEntityConfiguration,
179
180
  TestEntity,
181
+ /* entitySelectedFields */ undefined,
180
182
  privacyPolicy,
181
183
  dataManager,
182
184
  metricsAdapter
@@ -275,6 +277,7 @@ describe(EntityLoader, () => {
275
277
  privacyPolicyEvaluationContext,
276
278
  testEntityConfiguration,
277
279
  TestEntity,
280
+ /* entitySelectedFields */ undefined,
278
281
  privacyPolicy,
279
282
  dataManager,
280
283
  metricsAdapter
@@ -353,6 +356,7 @@ describe(EntityLoader, () => {
353
356
  privacyPolicyEvaluationContext,
354
357
  testEntityConfiguration,
355
358
  TestEntity,
359
+ /* entitySelectedFields */ undefined,
356
360
  privacyPolicy,
357
361
  dataManager,
358
362
  metricsAdapter
@@ -385,6 +389,7 @@ describe(EntityLoader, () => {
385
389
  privacyPolicyEvaluationContext,
386
390
  testEntityConfiguration,
387
391
  TestEntity,
392
+ /* entitySelectedFields */ undefined,
388
393
  privacyPolicy,
389
394
  dataManagerInstance,
390
395
  metricsAdapter
@@ -412,6 +417,7 @@ describe(EntityLoader, () => {
412
417
  privacyPolicyEvaluationContext,
413
418
  testEntityConfiguration,
414
419
  TestEntity,
420
+ /* entitySelectedFields */ undefined,
415
421
  privacyPolicy,
416
422
  dataManagerInstance,
417
423
  metricsAdapter
@@ -442,6 +448,7 @@ describe(EntityLoader, () => {
442
448
  privacyPolicyEvaluationContext,
443
449
  testEntityConfiguration,
444
450
  TestEntity,
451
+ /* entitySelectedFields */ undefined,
445
452
  privacyPolicy,
446
453
  dataManagerInstance,
447
454
  metricsAdapter
@@ -486,6 +493,7 @@ describe(EntityLoader, () => {
486
493
  privacyPolicyEvaluationContext,
487
494
  testEntityConfiguration,
488
495
  TestEntity,
496
+ /* entitySelectedFields */ undefined,
489
497
  privacyPolicy,
490
498
  dataManagerInstance,
491
499
  metricsAdapter
@@ -519,6 +527,7 @@ describe(EntityLoader, () => {
519
527
  privacyPolicyEvaluationContext,
520
528
  testEntityConfiguration,
521
529
  TestEntity,
530
+ /* entitySelectedFields */ undefined,
522
531
  privacyPolicy,
523
532
  dataManagerInstance,
524
533
  metricsAdapter
@@ -34,37 +34,35 @@ class BlahEntityPrivacyPolicy extends EntityPrivacyPolicy<
34
34
  }
35
35
 
36
36
  class BlahEntity extends Entity<BlahFields, string, ViewerContext> {
37
- static getCompanionDefinition(): EntityCompanionDefinition<
37
+ static defineCompanionDefinition(): EntityCompanionDefinition<
38
38
  BlahFields,
39
39
  string,
40
40
  ViewerContext,
41
41
  BlahEntity,
42
42
  BlahEntityPrivacyPolicy
43
43
  > {
44
- return blahCompanion;
44
+ return {
45
+ entityClass: BlahEntity,
46
+ entityConfiguration: new EntityConfiguration<BlahFields>({
47
+ idField: 'id',
48
+ tableName: 'blah_table',
49
+ schema: {
50
+ id: new UUIDField({
51
+ columnName: 'id',
52
+ cache: true,
53
+ }),
54
+ },
55
+ databaseAdapterFlavor: 'postgres',
56
+ cacheAdapterFlavor: 'redis',
57
+ }),
58
+ privacyPolicyClass: BlahEntityPrivacyPolicy,
59
+ mutationTriggers: {
60
+ afterCommit: [new TestNonTransactionalMutationTrigger()],
61
+ },
62
+ };
45
63
  }
46
64
  }
47
65
 
48
- const blahCompanion = new EntityCompanionDefinition({
49
- entityClass: BlahEntity,
50
- entityConfiguration: new EntityConfiguration<BlahFields>({
51
- idField: 'id',
52
- tableName: 'blah_table',
53
- schema: {
54
- id: new UUIDField({
55
- columnName: 'id',
56
- cache: true,
57
- }),
58
- },
59
- databaseAdapterFlavor: 'postgres',
60
- cacheAdapterFlavor: 'redis',
61
- }),
62
- privacyPolicyClass: BlahEntityPrivacyPolicy,
63
- mutationTriggers: () => ({
64
- afterCommit: [new TestNonTransactionalMutationTrigger()],
65
- }),
66
- });
67
-
68
66
  class TestNonTransactionalMutationTrigger extends EntityNonTransactionalMutationTrigger<
69
67
  BlahFields,
70
68
  string,