@expo/entity 0.31.0 → 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 (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 +19 -2
  27. package/build/EntityLoader.js +41 -5
  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 +26 -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 +80 -10
  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 +17 -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 +45 -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 +41 -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 +105 -0
  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
@@ -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
@@ -2,6 +2,7 @@ import { enforceAsyncResult } from '@expo/results';
2
2
  import { mock, instance, verify, spy, deepEqual, anyOfClass, anything, when } from 'ts-mockito';
3
3
  import { v4 as uuidv4 } from 'uuid';
4
4
 
5
+ import { OrderByOrdering } from '../EntityDatabaseAdapter';
5
6
  import EntityLoader from '../EntityLoader';
6
7
  import { EntityPrivacyPolicyEvaluationContext } from '../EntityPrivacyPolicy';
7
8
  import ViewerContext from '../ViewerContext';
@@ -74,6 +75,7 @@ describe(EntityLoader, () => {
74
75
  privacyPolicyEvaluationContext,
75
76
  testEntityConfiguration,
76
77
  TestEntity,
78
+ /* entitySelectedFields */ undefined,
77
79
  privacyPolicy,
78
80
  dataManager,
79
81
  metricsAdapter
@@ -176,6 +178,7 @@ describe(EntityLoader, () => {
176
178
  privacyPolicyEvaluationContext,
177
179
  testEntityConfiguration,
178
180
  TestEntity,
181
+ /* entitySelectedFields */ undefined,
179
182
  privacyPolicy,
180
183
  dataManager,
181
184
  metricsAdapter
@@ -210,6 +213,102 @@ describe(EntityLoader, () => {
210
213
  ).rejects.toThrowError('Entity field not valid: TestEntity (customIdField = not-a-uuid)');
211
214
  });
212
215
 
216
+ it('loads entities with loadFirstByFieldEqualityConjunction', async () => {
217
+ const privacyPolicy = new TestEntityPrivacyPolicy();
218
+ const spiedPrivacyPolicy = spy(privacyPolicy);
219
+ const viewerContext = instance(mock(ViewerContext));
220
+ const privacyPolicyEvaluationContext = instance(mock<EntityPrivacyPolicyEvaluationContext>());
221
+ const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
222
+ const queryContext = StubQueryContextProvider.getQueryContext();
223
+
224
+ const id1 = uuidv4();
225
+ const id2 = uuidv4();
226
+ const id3 = uuidv4();
227
+ const databaseAdapter = new StubDatabaseAdapter<TestFields>(
228
+ testEntityConfiguration,
229
+ StubDatabaseAdapter.convertFieldObjectsToDataStore(
230
+ testEntityConfiguration,
231
+ new Map([
232
+ [
233
+ testEntityConfiguration.tableName,
234
+ [
235
+ {
236
+ customIdField: id1,
237
+ stringField: 'huh',
238
+ intField: 4,
239
+ testIndexedField: '4',
240
+ dateField: new Date(),
241
+ nullableField: null,
242
+ },
243
+ {
244
+ customIdField: id2,
245
+ stringField: 'huh',
246
+ intField: 4,
247
+ testIndexedField: '5',
248
+ dateField: new Date(),
249
+ nullableField: null,
250
+ },
251
+ {
252
+ customIdField: id3,
253
+ stringField: 'huh2',
254
+ intField: 4,
255
+ testIndexedField: '6',
256
+ dateField: new Date(),
257
+ nullableField: null,
258
+ },
259
+ ],
260
+ ],
261
+ ])
262
+ )
263
+ );
264
+ const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
265
+ const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
266
+ const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
267
+ const dataManager = new EntityDataManager(
268
+ databaseAdapter,
269
+ entityCache,
270
+ StubQueryContextProvider,
271
+ instance(mock<IEntityMetricsAdapter>()),
272
+ TestEntity.name
273
+ );
274
+ const entityLoader = new EntityLoader(
275
+ viewerContext,
276
+ queryContext,
277
+ privacyPolicyEvaluationContext,
278
+ testEntityConfiguration,
279
+ TestEntity,
280
+ /* entitySelectedFields */ undefined,
281
+ privacyPolicy,
282
+ dataManager,
283
+ metricsAdapter
284
+ );
285
+ const result = await entityLoader.loadFirstByFieldEqualityConjunctionAsync(
286
+ [
287
+ {
288
+ fieldName: 'stringField',
289
+ fieldValue: 'huh',
290
+ },
291
+ {
292
+ fieldName: 'intField',
293
+ fieldValue: 4,
294
+ },
295
+ ],
296
+ { orderBy: [{ fieldName: 'testIndexedField', order: OrderByOrdering.DESCENDING }] }
297
+ );
298
+ expect(result).not.toBeNull();
299
+ expect(result!.ok).toBe(true);
300
+ expect(result!.enforceValue().getField('testIndexedField')).toEqual('5');
301
+ verify(
302
+ spiedPrivacyPolicy.authorizeReadAsync(
303
+ viewerContext,
304
+ queryContext,
305
+ privacyPolicyEvaluationContext,
306
+ anyOfClass(TestEntity),
307
+ anything()
308
+ )
309
+ ).once();
310
+ });
311
+
213
312
  it('authorizes loaded entities', async () => {
214
313
  const privacyPolicy = new TestEntityPrivacyPolicy();
215
314
  const spiedPrivacyPolicy = spy(privacyPolicy);
@@ -257,6 +356,7 @@ describe(EntityLoader, () => {
257
356
  privacyPolicyEvaluationContext,
258
357
  testEntityConfiguration,
259
358
  TestEntity,
359
+ /* entitySelectedFields */ undefined,
260
360
  privacyPolicy,
261
361
  dataManager,
262
362
  metricsAdapter
@@ -289,6 +389,7 @@ describe(EntityLoader, () => {
289
389
  privacyPolicyEvaluationContext,
290
390
  testEntityConfiguration,
291
391
  TestEntity,
392
+ /* entitySelectedFields */ undefined,
292
393
  privacyPolicy,
293
394
  dataManagerInstance,
294
395
  metricsAdapter
@@ -316,6 +417,7 @@ describe(EntityLoader, () => {
316
417
  privacyPolicyEvaluationContext,
317
418
  testEntityConfiguration,
318
419
  TestEntity,
420
+ /* entitySelectedFields */ undefined,
319
421
  privacyPolicy,
320
422
  dataManagerInstance,
321
423
  metricsAdapter
@@ -346,6 +448,7 @@ describe(EntityLoader, () => {
346
448
  privacyPolicyEvaluationContext,
347
449
  testEntityConfiguration,
348
450
  TestEntity,
451
+ /* entitySelectedFields */ undefined,
349
452
  privacyPolicy,
350
453
  dataManagerInstance,
351
454
  metricsAdapter
@@ -390,6 +493,7 @@ describe(EntityLoader, () => {
390
493
  privacyPolicyEvaluationContext,
391
494
  testEntityConfiguration,
392
495
  TestEntity,
496
+ /* entitySelectedFields */ undefined,
393
497
  privacyPolicy,
394
498
  dataManagerInstance,
395
499
  metricsAdapter
@@ -423,6 +527,7 @@ describe(EntityLoader, () => {
423
527
  privacyPolicyEvaluationContext,
424
528
  testEntityConfiguration,
425
529
  TestEntity,
530
+ /* entitySelectedFields */ undefined,
426
531
  privacyPolicy,
427
532
  dataManagerInstance,
428
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,