@expo/entity 0.31.1 → 0.33.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 (257) 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 +6 -1
  5. package/build/EnforcingEntityLoader.js +8 -0
  6. package/build/EnforcingEntityLoader.js.map +1 -1
  7. package/build/Entity.d.ts +20 -10
  8. package/build/Entity.js +2 -2
  9. package/build/Entity.js.map +1 -1
  10. package/build/EntityAssociationLoader.d.ts +9 -9
  11. package/build/EntityCompanion.d.ts +6 -5
  12. package/build/EntityCompanion.js +6 -4
  13. package/build/EntityCompanion.js.map +1 -1
  14. package/build/EntityCompanionProvider.d.ts +28 -36
  15. package/build/EntityCompanionProvider.js +4 -19
  16. package/build/EntityCompanionProvider.js.map +1 -1
  17. package/build/EntityConfiguration.d.ts +3 -3
  18. package/build/EntityConfiguration.js +2 -2
  19. package/build/EntityConfiguration.js.map +1 -1
  20. package/build/EntityDatabaseAdapter.d.ts +1 -1
  21. package/build/EntityDatabaseAdapter.js +1 -1
  22. package/build/EntityDatabaseAdapter.js.map +1 -1
  23. package/build/EntityFieldDefinition.d.ts +2 -2
  24. package/build/EntityFieldDefinition.js +1 -1
  25. package/build/EntityFieldDefinition.js.map +1 -1
  26. package/build/EntityLoader.d.ts +10 -2
  27. package/build/EntityLoader.js +32 -7
  28. package/build/EntityLoader.js.map +1 -1
  29. package/build/EntityLoaderFactory.d.ts +4 -7
  30. package/build/EntityLoaderFactory.js +3 -5
  31. package/build/EntityLoaderFactory.js.map +1 -1
  32. package/build/EntityMutationInfo.d.ts +3 -3
  33. package/build/EntityMutationInfo.js +1 -1
  34. package/build/EntityMutationInfo.js.map +1 -1
  35. package/build/EntityMutationTriggerConfiguration.d.ts +3 -3
  36. package/build/EntityMutationValidator.d.ts +1 -1
  37. package/build/EntityMutator.d.ts +9 -7
  38. package/build/EntityMutator.js +21 -21
  39. package/build/EntityMutator.js.map +1 -1
  40. package/build/EntityMutatorFactory.d.ts +4 -2
  41. package/build/EntityMutatorFactory.js +5 -4
  42. package/build/EntityMutatorFactory.js.map +1 -1
  43. package/build/EntityPrivacyPolicy.d.ts +3 -3
  44. package/build/EntityPrivacyPolicy.js +2 -2
  45. package/build/EntityPrivacyPolicy.js.map +1 -1
  46. package/build/EntityQueryContext.d.ts +13 -5
  47. package/build/EntityQueryContext.js +11 -4
  48. package/build/EntityQueryContext.js.map +1 -1
  49. package/build/EntityQueryContextProvider.d.ts +3 -3
  50. package/build/EntityQueryContextProvider.js +2 -2
  51. package/build/EntityQueryContextProvider.js.map +1 -1
  52. package/build/EntitySecondaryCacheLoader.d.ts +1 -1
  53. package/build/EntitySecondaryCacheLoader.js +1 -1
  54. package/build/EntitySecondaryCacheLoader.js.map +1 -1
  55. package/build/GenericEntityCacheAdapter.d.ts +14 -0
  56. package/build/GenericEntityCacheAdapter.js +38 -0
  57. package/build/GenericEntityCacheAdapter.js.map +1 -0
  58. package/build/{EntityCacheAdapter.d.ts → IEntityCacheAdapter.d.ts} +5 -8
  59. package/build/IEntityCacheAdapter.js +3 -0
  60. package/build/IEntityCacheAdapter.js.map +1 -0
  61. package/build/IEntityCacheAdapterProvider.d.ts +2 -2
  62. package/build/IEntityGenericCacher.d.ts +31 -2
  63. package/build/ReadonlyEntity.d.ts +19 -7
  64. package/build/ReadonlyEntity.js +15 -13
  65. package/build/ReadonlyEntity.js.map +1 -1
  66. package/build/ViewerContext.d.ts +3 -3
  67. package/build/ViewerContext.js +3 -3
  68. package/build/ViewerContext.js.map +1 -1
  69. package/build/ViewerScopedEntityCompanion.d.ts +2 -2
  70. package/build/ViewerScopedEntityCompanion.js.map +1 -1
  71. package/build/ViewerScopedEntityCompanionProvider.d.ts +3 -3
  72. package/build/ViewerScopedEntityCompanionProvider.js +3 -3
  73. package/build/ViewerScopedEntityCompanionProvider.js.map +1 -1
  74. package/build/ViewerScopedEntityLoaderFactory.d.ts +1 -1
  75. package/build/ViewerScopedEntityMutatorFactory.d.ts +1 -1
  76. package/build/__tests__/ComposedCacheAdapter-test.js +4 -8
  77. package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
  78. package/build/__tests__/EnforcingEntityLoader-test.js +28 -0
  79. package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
  80. package/build/__tests__/Entity-test.js +42 -20
  81. package/build/__tests__/Entity-test.js.map +1 -1
  82. package/build/__tests__/EntityAssociationLoader-test.js +6 -6
  83. package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
  84. package/build/__tests__/EntityCommonUseCases-test.js +20 -22
  85. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  86. package/build/__tests__/EntityCompanion-test.js +2 -1
  87. package/build/__tests__/EntityCompanion-test.js.map +1 -1
  88. package/build/__tests__/EntityCompanionProvider-test.js +15 -40
  89. package/build/__tests__/EntityCompanionProvider-test.js.map +1 -1
  90. package/build/__tests__/EntityEdges-test.js +48 -54
  91. package/build/__tests__/EntityEdges-test.js.map +1 -1
  92. package/build/__tests__/EntityLoader-constructor-test.d.ts +9 -5
  93. package/build/__tests__/EntityLoader-constructor-test.js +13 -14
  94. package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
  95. package/build/__tests__/EntityLoader-test.js +22 -12
  96. package/build/__tests__/EntityLoader-test.js.map +1 -1
  97. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +20 -22
  98. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
  99. package/build/__tests__/EntityMutator-test.js +67 -14
  100. package/build/__tests__/EntityMutator-test.js.map +1 -1
  101. package/build/__tests__/EntityPrivacyPolicy-test.js +82 -29
  102. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  103. package/build/__tests__/EntityQueryContext-test.js +12 -0
  104. package/build/__tests__/EntityQueryContext-test.js.map +1 -1
  105. package/build/__tests__/EntitySecondaryCacheLoader-test.js +1 -2
  106. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  107. package/build/__tests__/EntitySelfReferentialEdges-test.js +16 -20
  108. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  109. package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +1 -0
  110. package/build/__tests__/GenericEntityCacheAdapter-test.js +80 -0
  111. package/build/__tests__/GenericEntityCacheAdapter-test.js.map +1 -0
  112. package/build/__tests__/ReadonlyEntity-test.js +79 -13
  113. package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
  114. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +2 -25
  115. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +1 -1
  116. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +20 -23
  117. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
  118. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +17 -20
  119. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
  120. package/build/errors/EntityError.js +2 -2
  121. package/build/errors/EntityError.js.map +1 -1
  122. package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
  123. package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
  124. package/build/errors/EntityNotAuthorizedError.d.ts +2 -2
  125. package/build/errors/EntityNotAuthorizedError.js +1 -1
  126. package/build/errors/EntityNotAuthorizedError.js.map +1 -1
  127. package/build/errors/EntityNotFoundError.d.ts +2 -2
  128. package/build/errors/EntityNotFoundError.js.map +1 -1
  129. package/build/index.d.ts +2 -1
  130. package/build/index.js +3 -3
  131. package/build/index.js.map +1 -1
  132. package/build/internal/EntityDataManager.d.ts +1 -1
  133. package/build/internal/EntityDataManager.js +1 -1
  134. package/build/internal/EntityDataManager.js.map +1 -1
  135. package/build/internal/EntityFieldTransformationUtils.d.ts +1 -1
  136. package/build/internal/EntityFieldTransformationUtils.js +4 -4
  137. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  138. package/build/internal/EntityTableDataCoordinator.d.ts +3 -3
  139. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  140. package/build/internal/ReadThroughEntityCache.d.ts +3 -3
  141. package/build/internal/ReadThroughEntityCache.js +1 -1
  142. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  143. package/build/internal/__tests__/EntityDataManager-test.js +1 -1
  144. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  145. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  146. package/build/metrics/EntityMetricsUtils.js.map +1 -1
  147. package/build/metrics/IEntityMetricsAdapter.js +4 -4
  148. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  149. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
  150. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  151. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
  152. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  153. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
  154. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  155. package/build/rules/PrivacyPolicyRule.d.ts +1 -1
  156. package/build/rules/PrivacyPolicyRule.js +1 -1
  157. package/build/rules/PrivacyPolicyRule.js.map +1 -1
  158. package/build/testfixtures/DateIDTestEntity.d.ts +2 -3
  159. package/build/testfixtures/DateIDTestEntity.js +7 -9
  160. package/build/testfixtures/DateIDTestEntity.js.map +1 -1
  161. package/build/testfixtures/SimpleTestEntity.d.ts +3 -4
  162. package/build/testfixtures/SimpleTestEntity.js +7 -9
  163. package/build/testfixtures/SimpleTestEntity.js.map +1 -1
  164. package/build/testfixtures/TestEntity.d.ts +2 -3
  165. package/build/testfixtures/TestEntity.js +14 -10
  166. package/build/testfixtures/TestEntity.js.map +1 -1
  167. package/build/testfixtures/TestEntity2.d.ts +2 -3
  168. package/build/testfixtures/TestEntity2.js +7 -9
  169. package/build/testfixtures/TestEntity2.js.map +1 -1
  170. package/build/testfixtures/TestEntityNumberKey.d.ts +2 -3
  171. package/build/testfixtures/TestEntityNumberKey.js +7 -9
  172. package/build/testfixtures/TestEntityNumberKey.js.map +1 -1
  173. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +4 -4
  174. package/build/utils/testing/StubCacheAdapter.d.ts +6 -5
  175. package/build/utils/testing/StubCacheAdapter.js +5 -6
  176. package/build/utils/testing/StubCacheAdapter.js.map +1 -1
  177. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +1 -1
  178. package/build/utils/testing/StubQueryContextProvider.d.ts +2 -1
  179. package/build/utils/testing/StubQueryContextProvider.js +1 -1
  180. package/build/utils/testing/StubQueryContextProvider.js.map +1 -1
  181. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +2 -2
  182. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +1 -1
  183. package/package.json +3 -3
  184. package/src/ComposedEntityCacheAdapter.ts +4 -11
  185. package/src/EnforcingEntityLoader.ts +10 -1
  186. package/src/Entity.ts +23 -12
  187. package/src/EntityAssociationLoader.ts +12 -12
  188. package/src/EntityCompanion.ts +13 -32
  189. package/src/EntityCompanionProvider.ts +41 -80
  190. package/src/EntityConfiguration.ts +4 -5
  191. package/src/EntityFieldDefinition.ts +2 -2
  192. package/src/EntityLoader.ts +36 -2
  193. package/src/EntityLoaderFactory.ts +7 -9
  194. package/src/EntityMutationInfo.ts +2 -2
  195. package/src/EntityMutationTriggerConfiguration.ts +3 -3
  196. package/src/EntityMutationValidator.ts +1 -1
  197. package/src/EntityMutator.ts +38 -31
  198. package/src/EntityMutatorFactory.ts +6 -1
  199. package/src/EntityPrivacyPolicy.ts +2 -2
  200. package/src/EntityQueryContext.ts +24 -4
  201. package/src/EntityQueryContextProvider.ts +7 -5
  202. package/src/EntitySecondaryCacheLoader.ts +1 -1
  203. package/src/GenericEntityCacheAdapter.ts +65 -0
  204. package/src/{EntityCacheAdapter.ts → IEntityCacheAdapter.ts} +5 -8
  205. package/src/IEntityCacheAdapterProvider.ts +2 -2
  206. package/src/IEntityGenericCacher.ts +32 -2
  207. package/src/ReadonlyEntity.ts +32 -32
  208. package/src/ViewerContext.ts +10 -8
  209. package/src/ViewerScopedEntityCompanion.ts +2 -2
  210. package/src/ViewerScopedEntityCompanionProvider.ts +4 -12
  211. package/src/ViewerScopedEntityLoaderFactory.ts +1 -1
  212. package/src/ViewerScopedEntityMutatorFactory.ts +1 -1
  213. package/src/__tests__/ComposedCacheAdapter-test.ts +6 -11
  214. package/src/__tests__/EnforcingEntityLoader-test.ts +44 -0
  215. package/src/__tests__/Entity-test.ts +42 -21
  216. package/src/__tests__/EntityCommonUseCases-test.ts +20 -22
  217. package/src/__tests__/EntityCompanion-test.ts +6 -9
  218. package/src/__tests__/EntityCompanionProvider-test.ts +14 -26
  219. package/src/__tests__/EntityEdges-test.ts +43 -49
  220. package/src/__tests__/EntityLoader-constructor-test.ts +16 -12
  221. package/src/__tests__/EntityLoader-test.ts +14 -1
  222. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +20 -22
  223. package/src/__tests__/EntityMutator-test.ts +119 -19
  224. package/src/__tests__/EntityPrivacyPolicy-test.ts +82 -29
  225. package/src/__tests__/EntityQueryContext-test.ts +23 -1
  226. package/src/__tests__/EntitySelfReferentialEdges-test.ts +8 -10
  227. package/src/__tests__/GenericEntityCacheAdapter-test.ts +102 -0
  228. package/src/__tests__/ReadonlyEntity-test.ts +79 -13
  229. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +2 -5
  230. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +30 -24
  231. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +14 -18
  232. package/src/errors/EntityInvalidFieldValueError.ts +2 -2
  233. package/src/errors/EntityNotAuthorizedError.ts +2 -2
  234. package/src/errors/EntityNotFoundError.ts +2 -2
  235. package/src/index.ts +2 -1
  236. package/src/internal/EntityDataManager.ts +1 -1
  237. package/src/internal/EntityTableDataCoordinator.ts +4 -4
  238. package/src/internal/ReadThroughEntityCache.ts +2 -2
  239. package/src/internal/__tests__/EntityDataManager-test.ts +2 -1
  240. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +8 -8
  241. package/src/metrics/EntityMetricsUtils.ts +1 -1
  242. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +2 -2
  243. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +2 -2
  244. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +2 -2
  245. package/src/rules/PrivacyPolicyRule.ts +1 -1
  246. package/src/testfixtures/DateIDTestEntity.ts +6 -8
  247. package/src/testfixtures/SimpleTestEntity.ts +6 -8
  248. package/src/testfixtures/TestEntity.ts +19 -15
  249. package/src/testfixtures/TestEntity2.ts +6 -8
  250. package/src/testfixtures/TestEntityNumberKey.ts +6 -8
  251. package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +4 -4
  252. package/src/utils/testing/StubCacheAdapter.ts +9 -11
  253. package/src/utils/testing/StubDatabaseAdapterProvider.ts +1 -1
  254. package/src/utils/testing/StubQueryContextProvider.ts +4 -3
  255. package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +3 -3
  256. package/build/EntityCacheAdapter.js +0 -13
  257. package/build/EntityCacheAdapter.js.map +0 -1
@@ -1,7 +1,11 @@
1
1
  import { IEntityClass } from './Entity';
2
2
  import EntityCompanionProvider, { DatabaseAdapterFlavor } from './EntityCompanionProvider';
3
3
  import EntityPrivacyPolicy from './EntityPrivacyPolicy';
4
- import { EntityQueryContext, EntityTransactionalQueryContext } from './EntityQueryContext';
4
+ import {
5
+ EntityQueryContext,
6
+ EntityTransactionalQueryContext,
7
+ TransactionConfig,
8
+ } from './EntityQueryContext';
5
9
  import ReadonlyEntity from './ReadonlyEntity';
6
10
  import ViewerScopedEntityCompanion from './ViewerScopedEntityCompanion';
7
11
  import ViewerScopedEntityCompanionProvider from './ViewerScopedEntityCompanionProvider';
@@ -27,7 +31,7 @@ export default class ViewerContext {
27
31
  }
28
32
 
29
33
  getViewerScopedEntityCompanionForClass<
30
- TMFields,
34
+ TMFields extends object,
31
35
  TMID extends NonNullable<TMFields[TMSelectedFields]>,
32
36
  TMViewerContext extends ViewerContext,
33
37
  TMEntity extends ReadonlyEntity<TMFields, TMID, TMViewerContext, TMSelectedFields>,
@@ -56,10 +60,7 @@ export default class ViewerContext {
56
60
  TMPrivacyPolicy,
57
61
  TMSelectedFields
58
62
  > {
59
- return this.viewerScopedEntityCompanionProvider.getViewerScopedCompanionForEntity(
60
- entityClass,
61
- entityClass.getCompanionDefinition()
62
- );
63
+ return this.viewerScopedEntityCompanionProvider.getViewerScopedCompanionForEntity(entityClass);
63
64
  }
64
65
 
65
66
  /**
@@ -82,11 +83,12 @@ export default class ViewerContext {
82
83
  */
83
84
  async runInTransactionForDatabaseAdaptorFlavorAsync<TResult>(
84
85
  databaseAdaptorFlavor: DatabaseAdapterFlavor,
85
- transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<TResult>
86
+ transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<TResult>,
87
+ transactionConfig?: TransactionConfig
86
88
  ): Promise<TResult> {
87
89
  return await this.entityCompanionProvider
88
90
  .getQueryContextProviderForDatabaseAdaptorFlavor(databaseAdaptorFlavor)
89
91
  .getQueryContext()
90
- .runInTransactionIfNotInTransactionAsync(transactionScope);
92
+ .runInTransactionIfNotInTransactionAsync(transactionScope, transactionConfig);
91
93
  }
92
94
  }
@@ -12,7 +12,7 @@ import IEntityMetricsAdapter from './metrics/IEntityMetricsAdapter';
12
12
  * from the viewer-scoped entity companion provider.
13
13
  */
14
14
  export default class ViewerScopedEntityCompanion<
15
- TFields,
15
+ TFields extends object,
16
16
  TID extends NonNullable<TFields[TSelectedFields]>,
17
17
  TViewerContext extends ViewerContext,
18
18
  TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
@@ -26,7 +26,7 @@ export default class ViewerScopedEntityCompanion<
26
26
  TSelectedFields extends keyof TFields
27
27
  > {
28
28
  constructor(
29
- private readonly entityCompanion: EntityCompanion<
29
+ public readonly entityCompanion: EntityCompanion<
30
30
  TFields,
31
31
  TID,
32
32
  TViewerContext,
@@ -1,5 +1,5 @@
1
1
  import { IEntityClass } from './Entity';
2
- import EntityCompanionProvider, { EntityCompanionDefinition } from './EntityCompanionProvider';
2
+ import EntityCompanionProvider from './EntityCompanionProvider';
3
3
  import EntityPrivacyPolicy from './EntityPrivacyPolicy';
4
4
  import ReadonlyEntity from './ReadonlyEntity';
5
5
  import ViewerContext from './ViewerContext';
@@ -19,10 +19,10 @@ export default class ViewerScopedEntityCompanionProvider {
19
19
  * companion is constructed using the configuration provided by the factory.
20
20
  *
21
21
  * @param entityClass - entity class to load
22
- * @param factory - entity companion factory
22
+ * @param entityCompanionDefinitionFn - function defining entity companion definition
23
23
  */
24
24
  getViewerScopedCompanionForEntity<
25
- TFields,
25
+ TFields extends object,
26
26
  TID extends NonNullable<TFields[TSelectedFields]>,
27
27
  TViewerContext extends ViewerContext,
28
28
  TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
@@ -42,14 +42,6 @@ export default class ViewerScopedEntityCompanionProvider {
42
42
  TEntity,
43
43
  TPrivacyPolicy,
44
44
  TSelectedFields
45
- >,
46
- entityCompanionDefinition: EntityCompanionDefinition<
47
- TFields,
48
- TID,
49
- TViewerContext,
50
- TEntity,
51
- TPrivacyPolicy,
52
- TSelectedFields
53
45
  >
54
46
  ): ViewerScopedEntityCompanion<
55
47
  TFields,
@@ -60,7 +52,7 @@ export default class ViewerScopedEntityCompanionProvider {
60
52
  TSelectedFields
61
53
  > {
62
54
  return new ViewerScopedEntityCompanion(
63
- this.entityCompanionProvider.getCompanionForEntity(entityClass, entityCompanionDefinition),
55
+ this.entityCompanionProvider.getCompanionForEntity(entityClass),
64
56
  this.viewerContext as TViewerContext
65
57
  );
66
58
  }
@@ -9,7 +9,7 @@ import ViewerContext from './ViewerContext';
9
9
  * Provides a cleaner API for loading entities by passing through the ViewerContext.
10
10
  */
11
11
  export default class ViewerScopedEntityLoaderFactory<
12
- TFields,
12
+ TFields extends object,
13
13
  TID extends NonNullable<TFields[TSelectedFields]>,
14
14
  TViewerContext extends ViewerContext,
15
15
  TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
@@ -9,7 +9,7 @@ import ViewerContext from './ViewerContext';
9
9
  * Provides a cleaner API for mutating entities by passing through the ViewerContext.
10
10
  */
11
11
  export default class ViewerScopedEntityMutatorFactory<
12
- TFields,
12
+ TFields extends object,
13
13
  TID extends NonNullable<TFields[TSelectedFields]>,
14
14
  TViewerContext extends ViewerContext,
15
15
  TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
@@ -1,9 +1,9 @@
1
1
  import invariant from 'invariant';
2
2
 
3
3
  import ComposedEntityCacheAdapter from '../ComposedEntityCacheAdapter';
4
- import EntityCacheAdapter from '../EntityCacheAdapter';
5
4
  import EntityConfiguration from '../EntityConfiguration';
6
5
  import { UUIDField } from '../EntityFields';
6
+ import IEntityCacheAdapter from '../IEntityCacheAdapter';
7
7
  import { CacheLoadResult, CacheStatus } from '../internal/ReadThroughEntityCache';
8
8
 
9
9
  type BlahFields = {
@@ -23,13 +23,11 @@ const entityConfiguration = new EntityConfiguration<BlahFields>({
23
23
  export const DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = Symbol('doesNotExist');
24
24
  type LocalMemoryCacheValue<TFields> = Readonly<TFields> | typeof DOES_NOT_EXIST_LOCAL_MEMORY_CACHE;
25
25
 
26
- class TestLocalCacheAdapter<TFields> extends EntityCacheAdapter<TFields> {
26
+ class TestLocalCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
27
27
  constructor(
28
- entityConfiguration: EntityConfiguration<TFields>,
28
+ private readonly entityConfiguration: EntityConfiguration<TFields>,
29
29
  private readonly cache: Map<string, LocalMemoryCacheValue<TFields>>
30
- ) {
31
- super(entityConfiguration);
32
- }
30
+ ) {}
33
31
 
34
32
  public async loadManyAsync<N extends keyof TFields>(
35
33
  fieldName: N,
@@ -123,10 +121,7 @@ function makeTestCacheAdapters(): {
123
121
  const fallbackCache = new Map();
124
122
  const fallbackCacheAdapter = new TestLocalCacheAdapter(entityConfiguration, fallbackCache);
125
123
 
126
- const cacheAdapter = new ComposedEntityCacheAdapter(entityConfiguration, [
127
- primaryCacheAdapter,
128
- fallbackCacheAdapter,
129
- ]);
124
+ const cacheAdapter = new ComposedEntityCacheAdapter([primaryCacheAdapter, fallbackCacheAdapter]);
130
125
 
131
126
  return {
132
127
  primaryCache,
@@ -229,7 +224,7 @@ describe(ComposedEntityCacheAdapter, () => {
229
224
  });
230
225
 
231
226
  it('handles 0 cache adapter compose case', async () => {
232
- const cacheAdapter = new ComposedEntityCacheAdapter(entityConfiguration, []);
227
+ const cacheAdapter = new ComposedEntityCacheAdapter<any>([]);
233
228
  const results = await cacheAdapter.loadManyAsync('id', []);
234
229
  expect(results).toEqual(new Map());
235
230
  });
@@ -222,6 +222,49 @@ describe(EnforcingEntityLoader, () => {
222
222
  });
223
223
  });
224
224
 
225
+ describe('loadManyByIDsNullableAsync', () => {
226
+ it('throws when result is unsuccessful even when there is a null result', async () => {
227
+ const entityLoaderMock = mock<EntityLoader<any, any, any, any, any, any>>(EntityLoader);
228
+ const rejection = new Error();
229
+ when(entityLoaderMock.loadManyByIDsNullableAsync(anything())).thenResolve(
230
+ new Map(
231
+ Object.entries({
232
+ hello: result(rejection),
233
+ world: null,
234
+ })
235
+ )
236
+ );
237
+ const entityLoader = instance(entityLoaderMock);
238
+ const enforcingEntityLoader = new EnforcingEntityLoader(entityLoader);
239
+ await expect(enforcingEntityLoader.loadManyByIDsNullableAsync(anything())).rejects.toThrow(
240
+ rejection
241
+ );
242
+ });
243
+
244
+ it('returns value when result is successful', async () => {
245
+ const entityLoaderMock = mock<EntityLoader<any, any, any, any, any, any>>(EntityLoader);
246
+ const resolved = {};
247
+ when(entityLoaderMock.loadManyByIDsNullableAsync(anything())).thenResolve(
248
+ new Map(
249
+ Object.entries({
250
+ hello: result(resolved),
251
+ world: null,
252
+ })
253
+ )
254
+ );
255
+ const entityLoader = instance(entityLoaderMock);
256
+ const enforcingEntityLoader = new EnforcingEntityLoader(entityLoader);
257
+ await expect(enforcingEntityLoader.loadManyByIDsNullableAsync(anything())).resolves.toEqual(
258
+ new Map(
259
+ Object.entries({
260
+ hello: resolved,
261
+ world: null,
262
+ })
263
+ )
264
+ );
265
+ });
266
+ });
267
+
225
268
  describe('loadFirstByFieldEqualityConjunction', () => {
226
269
  it('throws when result is unsuccessful', async () => {
227
270
  const entityLoaderMock = mock<EntityLoader<any, any, any, any, any, any>>(EntityLoader);
@@ -330,6 +373,7 @@ describe(EnforcingEntityLoader, () => {
330
373
  'tryConstructEntities',
331
374
  'validateFieldValues',
332
375
  'constructAndAuthorizeEntitiesAsync',
376
+ 'constructEntity',
333
377
  ];
334
378
  expect(loaderProperties).toEqual(expect.arrayContaining(knownLoaderOnlyDifferences));
335
379
 
@@ -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,