@expo/entity 0.41.0 → 0.42.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 (430) hide show
  1. package/build/AuthorizationResultBasedEntityAssociationLoader.d.ts +16 -16
  2. package/build/AuthorizationResultBasedEntityAssociationLoader.js.map +1 -1
  3. package/build/AuthorizationResultBasedEntityLoader.d.ts +39 -67
  4. package/build/AuthorizationResultBasedEntityLoader.js +85 -62
  5. package/build/AuthorizationResultBasedEntityLoader.js.map +1 -1
  6. package/build/AuthorizationResultBasedEntityMutator.d.ts +16 -16
  7. package/build/AuthorizationResultBasedEntityMutator.js.map +1 -1
  8. package/build/ComposedEntityCacheAdapter.d.ts +7 -6
  9. package/build/ComposedEntityCacheAdapter.js +28 -28
  10. package/build/ComposedEntityCacheAdapter.js.map +1 -1
  11. package/build/ComposedSecondaryEntityCache.d.ts +1 -1
  12. package/build/ComposedSecondaryEntityCache.js.map +1 -1
  13. package/build/EnforcingEntityAssociationLoader.d.ts +15 -15
  14. package/build/EnforcingEntityAssociationLoader.js.map +1 -1
  15. package/build/EnforcingEntityCreator.d.ts +2 -2
  16. package/build/EnforcingEntityDeleter.d.ts +2 -2
  17. package/build/EnforcingEntityLoader.d.ts +104 -18
  18. package/build/EnforcingEntityLoader.js +113 -12
  19. package/build/EnforcingEntityLoader.js.map +1 -1
  20. package/build/EnforcingEntityUpdater.d.ts +2 -2
  21. package/build/Entity.d.ts +10 -10
  22. package/build/Entity.js.map +1 -1
  23. package/build/EntityAssociationLoader.d.ts +3 -3
  24. package/build/EntityCompanion.d.ts +5 -5
  25. package/build/EntityCompanion.js.map +1 -1
  26. package/build/EntityCompanionProvider.d.ts +6 -6
  27. package/build/EntityCompanionProvider.js.map +1 -1
  28. package/build/EntityConfiguration.d.ts +46 -5
  29. package/build/EntityConfiguration.js +39 -1
  30. package/build/EntityConfiguration.js.map +1 -1
  31. package/build/EntityCreator.d.ts +4 -4
  32. package/build/EntityDatabaseAdapter.d.ts +15 -14
  33. package/build/EntityDatabaseAdapter.js +20 -12
  34. package/build/EntityDatabaseAdapter.js.map +1 -1
  35. package/build/EntityDeleter.d.ts +4 -4
  36. package/build/EntityFieldDefinition.d.ts +20 -10
  37. package/build/EntityFieldDefinition.js +3 -1
  38. package/build/EntityFieldDefinition.js.map +1 -1
  39. package/build/EntityFields.d.ts +14 -12
  40. package/build/EntityFields.js.map +1 -1
  41. package/build/EntityLoader.d.ts +5 -5
  42. package/build/EntityLoaderFactory.d.ts +3 -3
  43. package/build/EntityLoaderFactory.js.map +1 -1
  44. package/build/EntityLoaderUtils.d.ts +2 -2
  45. package/build/EntityLoaderUtils.js +27 -1
  46. package/build/EntityLoaderUtils.js.map +1 -1
  47. package/build/EntityMutationInfo.d.ts +2 -2
  48. package/build/EntityMutationTriggerConfiguration.d.ts +14 -14
  49. package/build/EntityMutationTriggerConfiguration.js.map +1 -1
  50. package/build/EntityMutationValidator.d.ts +2 -2
  51. package/build/EntityMutatorFactory.d.ts +5 -5
  52. package/build/EntityMutatorFactory.js.map +1 -1
  53. package/build/EntityPrivacyPolicy.d.ts +14 -14
  54. package/build/EntityPrivacyPolicy.js.map +1 -1
  55. package/build/EntitySecondaryCacheLoader.d.ts +4 -4
  56. package/build/EntityUpdater.d.ts +4 -4
  57. package/build/GenericEntityCacheAdapter.d.ts +7 -6
  58. package/build/GenericEntityCacheAdapter.js +13 -14
  59. package/build/GenericEntityCacheAdapter.js.map +1 -1
  60. package/build/GenericSecondaryEntityCache.d.ts +3 -3
  61. package/build/GenericSecondaryEntityCache.js.map +1 -1
  62. package/build/IEntityCacheAdapter.d.ts +17 -16
  63. package/build/IEntityCacheAdapterProvider.d.ts +1 -1
  64. package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
  65. package/build/IEntityGenericCacher.d.ts +15 -5
  66. package/build/ReadonlyEntity.d.ts +8 -8
  67. package/build/ReadonlyEntity.js.map +1 -1
  68. package/build/ViewerContext.d.ts +1 -1
  69. package/build/ViewerScopedEntityCompanion.d.ts +5 -5
  70. package/build/ViewerScopedEntityCompanionProvider.d.ts +1 -1
  71. package/build/ViewerScopedEntityLoaderFactory.d.ts +3 -3
  72. package/build/ViewerScopedEntityMutatorFactory.d.ts +5 -5
  73. package/build/entityUtils.d.ts +1 -1
  74. package/build/entityUtils.js.map +1 -1
  75. package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
  76. package/build/errors/EntityNotAuthorizedError.d.ts +1 -1
  77. package/build/errors/EntityNotFoundError.d.ts +2 -2
  78. package/build/index.d.ts +7 -7
  79. package/build/index.js +8 -13
  80. package/build/index.js.map +1 -1
  81. package/build/internal/CompositeFieldHolder.d.ts +48 -0
  82. package/build/internal/CompositeFieldHolder.js +116 -0
  83. package/build/internal/CompositeFieldHolder.js.map +1 -0
  84. package/build/internal/CompositeFieldValueMap.d.ts +15 -0
  85. package/build/internal/CompositeFieldValueMap.js +51 -0
  86. package/build/internal/CompositeFieldValueMap.js.map +1 -0
  87. package/build/internal/EntityDataManager.d.ts +16 -16
  88. package/build/internal/EntityDataManager.js +42 -45
  89. package/build/internal/EntityDataManager.js.map +1 -1
  90. package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
  91. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  92. package/build/internal/EntityLoadInterfaces.d.ts +104 -0
  93. package/build/internal/EntityLoadInterfaces.js +25 -0
  94. package/build/internal/EntityLoadInterfaces.js.map +1 -0
  95. package/build/internal/EntityTableDataCoordinator.d.ts +6 -6
  96. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  97. package/build/internal/ReadThroughEntityCache.d.ts +17 -16
  98. package/build/internal/ReadThroughEntityCache.js +36 -36
  99. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  100. package/build/internal/SingleFieldHolder.d.ts +34 -0
  101. package/build/internal/SingleFieldHolder.js +90 -0
  102. package/build/internal/SingleFieldHolder.js.map +1 -0
  103. package/build/metrics/EntityMetricsUtils.d.ts +2 -1
  104. package/build/metrics/EntityMetricsUtils.js.map +1 -1
  105. package/build/metrics/IEntityMetricsAdapter.d.ts +5 -0
  106. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  107. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
  108. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  109. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
  110. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  111. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
  112. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  113. package/build/rules/PrivacyPolicyRule.d.ts +2 -2
  114. package/build/tsconfig.build.tsbuildinfo +1 -0
  115. package/build/utils/EntityPrivacyUtils.d.ts +4 -4
  116. package/build/utils/EntityPrivacyUtils.js.map +1 -1
  117. package/build/utils/collections/SerializableKeyMap.d.ts +27 -0
  118. package/build/utils/collections/SerializableKeyMap.js +60 -0
  119. package/build/utils/collections/SerializableKeyMap.js.map +1 -0
  120. package/build/utils/collections/maps.js +1 -2
  121. package/build/utils/collections/maps.js.map +1 -1
  122. package/build/utils/collections/sets.d.ts +1 -0
  123. package/build/utils/collections/sets.js +7 -0
  124. package/build/utils/collections/sets.js.map +1 -0
  125. package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +1 -1
  126. package/package.json +8 -5
  127. package/src/AuthorizationResultBasedEntityAssociationLoader.ts +56 -49
  128. package/src/AuthorizationResultBasedEntityLoader.ts +194 -81
  129. package/src/AuthorizationResultBasedEntityMutator.ts +71 -45
  130. package/src/ComposedEntityCacheAdapter.ts +55 -46
  131. package/src/ComposedSecondaryEntityCache.ts +5 -2
  132. package/src/EnforcingEntityAssociationLoader.ts +52 -44
  133. package/src/EnforcingEntityCreator.ts +5 -5
  134. package/src/EnforcingEntityDeleter.ts +5 -5
  135. package/src/EnforcingEntityLoader.ts +158 -21
  136. package/src/EnforcingEntityUpdater.ts +5 -5
  137. package/src/Entity.ts +39 -39
  138. package/src/EntityAssociationLoader.ts +6 -6
  139. package/src/EntityCompanion.ts +11 -11
  140. package/src/EntityCompanionProvider.ts +21 -18
  141. package/src/EntityConfiguration.ts +123 -9
  142. package/src/EntityCreator.ts +7 -7
  143. package/src/EntityDatabaseAdapter.ts +51 -28
  144. package/src/EntityDeleter.ts +7 -7
  145. package/src/EntityFieldDefinition.ts +32 -12
  146. package/src/EntityFields.ts +49 -12
  147. package/src/EntityLoader.ts +8 -8
  148. package/src/EntityLoaderFactory.ts +8 -8
  149. package/src/EntityLoaderUtils.ts +39 -10
  150. package/src/EntityMutationInfo.ts +6 -6
  151. package/src/EntityMutationTriggerConfiguration.ts +68 -20
  152. package/src/EntityMutationValidator.ts +4 -4
  153. package/src/EntityMutatorFactory.ts +13 -13
  154. package/src/EntityPrivacyPolicy.ts +50 -26
  155. package/src/EntitySecondaryCacheLoader.ts +6 -6
  156. package/src/EntityUpdater.ts +7 -7
  157. package/src/GenericEntityCacheAdapter.ts +39 -28
  158. package/src/GenericSecondaryEntityCache.ts +6 -3
  159. package/src/IEntityCacheAdapter.ts +45 -25
  160. package/src/IEntityCacheAdapterProvider.ts +3 -3
  161. package/src/IEntityDatabaseAdapterProvider.ts +3 -3
  162. package/src/IEntityGenericCacher.ts +33 -5
  163. package/src/ReadonlyEntity.ts +24 -24
  164. package/src/ViewerContext.ts +5 -5
  165. package/src/ViewerScopedEntityCompanion.ts +7 -7
  166. package/src/ViewerScopedEntityCompanionProvider.ts +6 -6
  167. package/src/ViewerScopedEntityLoaderFactory.ts +7 -7
  168. package/src/ViewerScopedEntityMutatorFactory.ts +8 -8
  169. package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +4 -4
  170. package/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.ts +14 -13
  171. package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +367 -69
  172. package/src/__tests__/ComposedCacheAdapter-test.ts +235 -117
  173. package/src/__tests__/EnforcingEntityLoader-test.ts +135 -1
  174. package/src/__tests__/Entity-test.ts +2 -2
  175. package/src/__tests__/EntityAssociationLoader-test.ts +2 -2
  176. package/src/__tests__/EntityCommonUseCases-test.ts +11 -11
  177. package/src/__tests__/EntityCompanion-test.ts +4 -4
  178. package/src/__tests__/EntityCompanionProvider-test.ts +9 -8
  179. package/src/__tests__/EntityConfiguration-test.ts +85 -6
  180. package/src/__tests__/EntityDatabaseAdapter-test.ts +113 -17
  181. package/src/__tests__/EntityEdges-test.ts +97 -72
  182. package/src/__tests__/EntityFields-test.ts +2 -2
  183. package/src/__tests__/EntityLoader-test.ts +2 -2
  184. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +11 -11
  185. package/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.ts +73 -0
  186. package/src/__tests__/EntityMutator-test.ts +74 -46
  187. package/src/__tests__/EntityPrivacyPolicy-test.ts +51 -74
  188. package/src/__tests__/EntityQueryContext-test.ts +1 -1
  189. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +3 -3
  190. package/src/__tests__/EntitySelfReferentialEdges-test.ts +64 -39
  191. package/src/__tests__/GenericEntityCacheAdapter-test.ts +83 -28
  192. package/src/__tests__/ReadonlyEntity-test.ts +3 -3
  193. package/src/__tests__/ViewerContext-test.ts +1 -1
  194. package/src/__tests__/ViewerScopedEntityCompanion-test.ts +5 -2
  195. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +1 -1
  196. package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +12 -3
  197. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +12 -12
  198. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +12 -12
  199. package/src/entityUtils.ts +4 -1
  200. package/src/errors/EntityInvalidFieldValueError.ts +5 -5
  201. package/src/errors/EntityNotAuthorizedError.ts +3 -3
  202. package/src/errors/EntityNotFoundError.ts +5 -5
  203. package/src/index.ts +7 -7
  204. package/src/internal/CompositeFieldHolder.ts +218 -0
  205. package/src/internal/CompositeFieldValueMap.ts +78 -0
  206. package/src/internal/EntityDataManager.ts +107 -96
  207. package/src/internal/EntityFieldTransformationUtils.ts +33 -14
  208. package/src/internal/EntityLoadInterfaces.ts +143 -0
  209. package/src/internal/EntityTableDataCoordinator.ts +8 -5
  210. package/src/internal/ReadThroughEntityCache.ts +63 -50
  211. package/src/internal/SingleFieldHolder.ts +131 -0
  212. package/src/internal/__tests__/CompositeFieldHolder-test.ts +25 -0
  213. package/src/internal/__tests__/CompositeFieldValueMap-test.ts +43 -0
  214. package/src/internal/__tests__/EntityDataManager-test.ts +308 -91
  215. package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +3 -2
  216. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +315 -107
  217. package/src/metrics/EntityMetricsUtils.ts +7 -2
  218. package/src/metrics/IEntityMetricsAdapter.ts +6 -0
  219. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +5 -5
  220. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +5 -5
  221. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +5 -5
  222. package/src/rules/PrivacyPolicyRule.ts +4 -4
  223. package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +1 -1
  224. package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +1 -1
  225. package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +1 -1
  226. package/src/utils/EntityPrivacyUtils.ts +72 -30
  227. package/src/utils/{testing → __testfixtures__}/PrivacyPolicyRuleTestUtils.ts +26 -26
  228. package/src/{testfixtures → utils/__testfixtures__}/SimpleTestEntity.ts +16 -15
  229. package/src/utils/__testfixtures__/StubCacheAdapter.ts +164 -0
  230. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapter.ts +19 -12
  231. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapterProvider.ts +4 -4
  232. package/src/utils/__testfixtures__/TSMockitoExtensions.ts +69 -0
  233. package/src/{testfixtures → utils/__testfixtures__}/TestEntity.ts +21 -15
  234. package/src/{testfixtures → utils/__testfixtures__}/TestEntity2.ts +16 -15
  235. package/src/{testfixtures → utils/__testfixtures__}/TestEntityWithMutationTriggers.ts +23 -22
  236. package/src/{testfixtures → utils/__testfixtures__}/TestViewerContext.ts +1 -1
  237. package/src/utils/{testing → __testfixtures__}/describeFieldTestCase.ts +1 -1
  238. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +62 -66
  239. package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +29 -25
  240. package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +1 -1
  241. package/src/utils/collections/SerializableKeyMap.ts +84 -0
  242. package/src/utils/collections/__tests__/SerializableKeyMap-test.ts +119 -0
  243. package/src/utils/collections/__tests__/sets-test.ts +17 -0
  244. package/src/utils/collections/maps.ts +7 -8
  245. package/src/utils/collections/sets.ts +3 -0
  246. package/src/utils/mergeEntityMutationTriggerConfigurations.ts +5 -5
  247. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
  248. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -242
  249. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
  250. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
  251. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -110
  252. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
  253. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
  254. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -401
  255. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
  256. package/build/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
  257. package/build/__tests__/ComposedCacheAdapter-test.js +0 -229
  258. package/build/__tests__/ComposedCacheAdapter-test.js.map +0 -1
  259. package/build/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
  260. package/build/__tests__/ComposedSecondaryEntityCache-test.js +0 -66
  261. package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
  262. package/build/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
  263. package/build/__tests__/EnforcingEntityAssociationLoader-test.js +0 -115
  264. package/build/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
  265. package/build/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
  266. package/build/__tests__/EnforcingEntityLoader-test.js +0 -253
  267. package/build/__tests__/EnforcingEntityLoader-test.js.map +0 -1
  268. package/build/__tests__/Entity-test.d.ts +0 -1
  269. package/build/__tests__/Entity-test.js +0 -94
  270. package/build/__tests__/Entity-test.js.map +0 -1
  271. package/build/__tests__/EntityAssociationLoader-test.d.ts +0 -1
  272. package/build/__tests__/EntityAssociationLoader-test.js +0 -30
  273. package/build/__tests__/EntityAssociationLoader-test.js.map +0 -1
  274. package/build/__tests__/EntityCommonUseCases-test.d.ts +0 -1
  275. package/build/__tests__/EntityCommonUseCases-test.js +0 -146
  276. package/build/__tests__/EntityCommonUseCases-test.js.map +0 -1
  277. package/build/__tests__/EntityCompanion-test.d.ts +0 -1
  278. package/build/__tests__/EntityCompanion-test.js +0 -77
  279. package/build/__tests__/EntityCompanion-test.js.map +0 -1
  280. package/build/__tests__/EntityCompanionProvider-test.d.ts +0 -1
  281. package/build/__tests__/EntityCompanionProvider-test.js +0 -54
  282. package/build/__tests__/EntityCompanionProvider-test.js.map +0 -1
  283. package/build/__tests__/EntityConfiguration-test.d.ts +0 -1
  284. package/build/__tests__/EntityConfiguration-test.js +0 -103
  285. package/build/__tests__/EntityConfiguration-test.js.map +0 -1
  286. package/build/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
  287. package/build/__tests__/EntityDatabaseAdapter-test.js +0 -146
  288. package/build/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
  289. package/build/__tests__/EntityEdges-test.d.ts +0 -1
  290. package/build/__tests__/EntityEdges-test.js +0 -723
  291. package/build/__tests__/EntityEdges-test.js.map +0 -1
  292. package/build/__tests__/EntityFields-test.d.ts +0 -1
  293. package/build/__tests__/EntityFields-test.js +0 -63
  294. package/build/__tests__/EntityFields-test.js.map +0 -1
  295. package/build/__tests__/EntityLoader-test.d.ts +0 -1
  296. package/build/__tests__/EntityLoader-test.js +0 -36
  297. package/build/__tests__/EntityLoader-test.js.map +0 -1
  298. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
  299. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -73
  300. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
  301. package/build/__tests__/EntityMutator-test.d.ts +0 -1
  302. package/build/__tests__/EntityMutator-test.js +0 -741
  303. package/build/__tests__/EntityMutator-test.js.map +0 -1
  304. package/build/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
  305. package/build/__tests__/EntityPrivacyPolicy-test.js +0 -463
  306. package/build/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
  307. package/build/__tests__/EntityQueryContext-test.d.ts +0 -1
  308. package/build/__tests__/EntityQueryContext-test.js +0 -116
  309. package/build/__tests__/EntityQueryContext-test.js.map +0 -1
  310. package/build/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
  311. package/build/__tests__/EntitySecondaryCacheLoader-test.js +0 -60
  312. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
  313. package/build/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
  314. package/build/__tests__/EntitySelfReferentialEdges-test.js +0 -201
  315. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
  316. package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
  317. package/build/__tests__/GenericEntityCacheAdapter-test.js +0 -80
  318. package/build/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
  319. package/build/__tests__/ReadonlyEntity-test.d.ts +0 -1
  320. package/build/__tests__/ReadonlyEntity-test.js +0 -211
  321. package/build/__tests__/ReadonlyEntity-test.js.map +0 -1
  322. package/build/__tests__/ViewerContext-test.d.ts +0 -1
  323. package/build/__tests__/ViewerContext-test.js +0 -30
  324. package/build/__tests__/ViewerContext-test.js.map +0 -1
  325. package/build/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
  326. package/build/__tests__/ViewerScopedEntityCompanion-test.js +0 -20
  327. package/build/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
  328. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
  329. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -20
  330. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
  331. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
  332. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -23
  333. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
  334. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
  335. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -22
  336. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
  337. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
  338. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -123
  339. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
  340. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
  341. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -121
  342. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
  343. package/build/__tests__/entityUtils-test.d.ts +0 -1
  344. package/build/__tests__/entityUtils-test.js +0 -87
  345. package/build/__tests__/entityUtils-test.js.map +0 -1
  346. package/build/internal/__tests__/EntityDataManager-test.d.ts +0 -1
  347. package/build/internal/__tests__/EntityDataManager-test.js +0 -373
  348. package/build/internal/__tests__/EntityDataManager-test.js.map +0 -1
  349. package/build/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
  350. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -136
  351. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
  352. package/build/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
  353. package/build/internal/__tests__/ReadThroughEntityCache-test.js +0 -206
  354. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
  355. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
  356. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -21
  357. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
  358. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
  359. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -21
  360. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
  361. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
  362. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -21
  363. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
  364. package/build/testfixtures/DateIDTestEntity.d.ts +0 -19
  365. package/build/testfixtures/DateIDTestEntity.js +0 -48
  366. package/build/testfixtures/DateIDTestEntity.js.map +0 -1
  367. package/build/testfixtures/SimpleTestEntity.d.ts +0 -20
  368. package/build/testfixtures/SimpleTestEntity.js +0 -48
  369. package/build/testfixtures/SimpleTestEntity.js.map +0 -1
  370. package/build/testfixtures/TestEntity.d.ts +0 -30
  371. package/build/testfixtures/TestEntity.js +0 -93
  372. package/build/testfixtures/TestEntity.js.map +0 -1
  373. package/build/testfixtures/TestEntity2.d.ts +0 -20
  374. package/build/testfixtures/TestEntity2.js +0 -51
  375. package/build/testfixtures/TestEntity2.js.map +0 -1
  376. package/build/testfixtures/TestEntityNumberKey.d.ts +0 -19
  377. package/build/testfixtures/TestEntityNumberKey.js +0 -48
  378. package/build/testfixtures/TestEntityNumberKey.js.map +0 -1
  379. package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +0 -36
  380. package/build/testfixtures/TestEntityWithMutationTriggers.js +0 -82
  381. package/build/testfixtures/TestEntityWithMutationTriggers.js.map +0 -1
  382. package/build/testfixtures/TestViewerContext.d.ts +0 -3
  383. package/build/testfixtures/TestViewerContext.js +0 -10
  384. package/build/testfixtures/TestViewerContext.js.map +0 -1
  385. package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
  386. package/build/utils/__tests__/EntityPrivacyUtils-test.js +0 -486
  387. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
  388. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
  389. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -178
  390. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
  391. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
  392. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -26
  393. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
  394. package/build/utils/collections/__tests__/maps-test.d.ts +0 -1
  395. package/build/utils/collections/__tests__/maps-test.js +0 -120
  396. package/build/utils/collections/__tests__/maps-test.js.map +0 -1
  397. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +0 -28
  398. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js +0 -52
  399. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +0 -1
  400. package/build/utils/testing/StubCacheAdapter.d.ts +0 -27
  401. package/build/utils/testing/StubCacheAdapter.js +0 -86
  402. package/build/utils/testing/StubCacheAdapter.js.map +0 -1
  403. package/build/utils/testing/StubDatabaseAdapter.d.ts +0 -25
  404. package/build/utils/testing/StubDatabaseAdapter.js +0 -191
  405. package/build/utils/testing/StubDatabaseAdapter.js.map +0 -1
  406. package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +0 -7
  407. package/build/utils/testing/StubDatabaseAdapterProvider.js +0 -14
  408. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +0 -1
  409. package/build/utils/testing/StubQueryContextProvider.d.ts +0 -7
  410. package/build/utils/testing/StubQueryContextProvider.js +0 -19
  411. package/build/utils/testing/StubQueryContextProvider.js.map +0 -1
  412. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +0 -1
  413. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +0 -42
  414. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +0 -1
  415. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.d.ts +0 -1
  416. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +0 -402
  417. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +0 -1
  418. package/build/utils/testing/createUnitTestEntityCompanionProvider.d.ts +0 -7
  419. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +0 -36
  420. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +0 -1
  421. package/build/utils/testing/describeFieldTestCase.d.ts +0 -2
  422. package/build/utils/testing/describeFieldTestCase.js +0 -18
  423. package/build/utils/testing/describeFieldTestCase.js.map +0 -1
  424. package/src/testfixtures/DateIDTestEntity.ts +0 -59
  425. package/src/testfixtures/TestEntityNumberKey.ts +0 -59
  426. package/src/utils/testing/StubCacheAdapter.ts +0 -122
  427. package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +0 -42
  428. package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +0 -548
  429. /package/src/utils/{testing → __testfixtures__}/StubQueryContextProvider.ts +0 -0
  430. /package/src/utils/{testing → __testfixtures__}/createUnitTestEntityCompanionProvider.ts +0 -0
@@ -1,5 +1,5 @@
1
1
  import { enforceAsyncResult } from '@expo/results';
2
- import { mock, instance, verify, spy, deepEqual, anyOfClass, anything, when } from 'ts-mockito';
2
+ import { mock, instance, verify, spy, anyOfClass, anything, when } from 'ts-mockito';
3
3
  import { v4 as uuidv4 } from 'uuid';
4
4
 
5
5
  import AuthorizationResultBasedEntityLoader from '../AuthorizationResultBasedEntityLoader';
@@ -9,17 +9,24 @@ import { EntityPrivacyPolicyEvaluationContext } from '../EntityPrivacyPolicy';
9
9
  import ViewerContext from '../ViewerContext';
10
10
  import { enforceResultsAsync } from '../entityUtils';
11
11
  import EntityNotFoundError from '../errors/EntityNotFoundError';
12
+ import { CompositeFieldHolder, CompositeFieldValueHolder } from '../internal/CompositeFieldHolder';
12
13
  import EntityDataManager from '../internal/EntityDataManager';
13
14
  import ReadThroughEntityCache from '../internal/ReadThroughEntityCache';
15
+ import {
16
+ SingleFieldHolder,
17
+ SingleFieldValueHolder,
18
+ SingleFieldValueHolderMap,
19
+ } from '../internal/SingleFieldHolder';
14
20
  import IEntityMetricsAdapter from '../metrics/IEntityMetricsAdapter';
21
+ import { NoCacheStubCacheAdapterProvider } from '../utils/__testfixtures__/StubCacheAdapter';
22
+ import StubDatabaseAdapter from '../utils/__testfixtures__/StubDatabaseAdapter';
23
+ import StubQueryContextProvider from '../utils/__testfixtures__/StubQueryContextProvider';
24
+ import { deepEqualEntityAware } from '../utils/__testfixtures__/TSMockitoExtensions';
15
25
  import TestEntity, {
16
26
  TestFields,
17
27
  TestEntityPrivacyPolicy,
18
28
  testEntityConfiguration,
19
- } from '../testfixtures/TestEntity';
20
- import { NoCacheStubCacheAdapterProvider } from '../utils/testing/StubCacheAdapter';
21
- import StubDatabaseAdapter from '../utils/testing/StubDatabaseAdapter';
22
- import StubQueryContextProvider from '../utils/testing/StubQueryContextProvider';
29
+ } from '../utils/__testfixtures__/TestEntity';
23
30
 
24
31
  describe(AuthorizationResultBasedEntityLoader, () => {
25
32
  it('loads entities', async () => {
@@ -27,14 +34,21 @@ describe(AuthorizationResultBasedEntityLoader, () => {
27
34
  const viewerContext = instance(mock(ViewerContext));
28
35
  const privacyPolicyEvaluationContext =
29
36
  instance(
30
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
37
+ mock<
38
+ EntityPrivacyPolicyEvaluationContext<
39
+ TestFields,
40
+ 'customIdField',
41
+ ViewerContext,
42
+ TestEntity
43
+ >
44
+ >(),
31
45
  );
32
46
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
33
47
  const queryContext = new StubQueryContextProvider().getQueryContext();
34
48
 
35
49
  const id1 = uuidv4();
36
50
  const id2 = uuidv4();
37
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
51
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
38
52
  testEntityConfiguration,
39
53
  StubDatabaseAdapter.convertFieldObjectsToDataStore(
40
54
  testEntityConfiguration,
@@ -141,13 +155,185 @@ describe(AuthorizationResultBasedEntityLoader, () => {
141
155
  );
142
156
  });
143
157
 
158
+ it('loads entities by composite fields', async () => {
159
+ const dateToInsert = new Date();
160
+ const viewerContext = instance(mock(ViewerContext));
161
+ const privacyPolicyEvaluationContext =
162
+ instance(
163
+ mock<
164
+ EntityPrivacyPolicyEvaluationContext<
165
+ TestFields,
166
+ 'customIdField',
167
+ ViewerContext,
168
+ TestEntity
169
+ >
170
+ >(),
171
+ );
172
+ const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
173
+ const queryContext = new StubQueryContextProvider().getQueryContext();
174
+
175
+ const id1 = uuidv4();
176
+ const id2 = uuidv4();
177
+ const id3 = uuidv4();
178
+ const id4 = uuidv4();
179
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
180
+ testEntityConfiguration,
181
+ StubDatabaseAdapter.convertFieldObjectsToDataStore(
182
+ testEntityConfiguration,
183
+ new Map([
184
+ [
185
+ testEntityConfiguration.tableName,
186
+ [
187
+ {
188
+ customIdField: id1,
189
+ testIndexedField: 'h1',
190
+ intField: 5,
191
+ stringField: 'huh',
192
+ dateField: dateToInsert,
193
+ nullableField: null,
194
+ },
195
+ {
196
+ customIdField: id2,
197
+ testIndexedField: 'h2',
198
+ intField: 5,
199
+ stringField: 'huh',
200
+ dateField: dateToInsert,
201
+ nullableField: null,
202
+ },
203
+ {
204
+ customIdField: id3,
205
+ testIndexedField: 'h2',
206
+ intField: 3,
207
+ stringField: 'huh',
208
+ dateField: dateToInsert,
209
+ nullableField: null,
210
+ },
211
+ {
212
+ customIdField: id4,
213
+ stringField: 'huh3',
214
+ intField: 4,
215
+ testIndexedField: '7',
216
+ dateField: new Date(),
217
+ nullableField: 'non-null-nullable-field',
218
+ },
219
+ ],
220
+ ],
221
+ ]),
222
+ ),
223
+ );
224
+ const privacyPolicy = new TestEntityPrivacyPolicy();
225
+ const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
226
+ const cacheAdapter = cacheAdapterProvider.getCacheAdapter(testEntityConfiguration);
227
+ const entityCache = new ReadThroughEntityCache(testEntityConfiguration, cacheAdapter);
228
+ const dataManager = new EntityDataManager(
229
+ databaseAdapter,
230
+ entityCache,
231
+ new StubQueryContextProvider(),
232
+ instance(mock<IEntityMetricsAdapter>()),
233
+ TestEntity.name,
234
+ );
235
+ const utils = new EntityLoaderUtils(
236
+ viewerContext,
237
+ queryContext,
238
+ privacyPolicyEvaluationContext,
239
+ testEntityConfiguration,
240
+ TestEntity,
241
+ /* entitySelectedFields */ undefined,
242
+ privacyPolicy,
243
+ dataManager,
244
+ metricsAdapter,
245
+ );
246
+ const entityLoader = new AuthorizationResultBasedEntityLoader(
247
+ queryContext,
248
+ testEntityConfiguration,
249
+ TestEntity,
250
+ dataManager,
251
+ metricsAdapter,
252
+ utils,
253
+ );
254
+
255
+ const entities = await enforceResultsAsync(
256
+ entityLoader.loadManyByCompositeFieldEqualingAsync(['stringField', 'intField'], {
257
+ stringField: 'huh',
258
+ intField: 5,
259
+ }),
260
+ );
261
+ expect(entities.map((m) => m.getID())).toEqual([id1, id2]);
262
+
263
+ const entityNullableCompositeValueResult = await entityLoader.loadByCompositeFieldEqualingAsync(
264
+ ['nullableField', 'testIndexedField'],
265
+ {
266
+ nullableField: 'non-null-nullable-field',
267
+ testIndexedField: '7',
268
+ },
269
+ );
270
+ expect(entityNullableCompositeValueResult?.enforceValue().getID()).toBe(id4);
271
+
272
+ const entityResultDuplicateValues =
273
+ await entityLoader.loadManyByCompositeFieldEqualingManyAsync(
274
+ ['stringField', 'intField'],
275
+ [
276
+ { stringField: 'huh', intField: 5 },
277
+ { stringField: 'huh', intField: 5 },
278
+ ],
279
+ );
280
+ expect(entityResultDuplicateValues.size).toBe(1);
281
+ expect(
282
+ entityResultDuplicateValues
283
+ .get({ stringField: 'huh', intField: 5 })
284
+ ?.map((m) => m.enforceValue().getID()),
285
+ ).toEqual([id1, id2]);
286
+
287
+ const entityResultNoValues = await entityLoader.loadManyByCompositeFieldEqualingAsync(
288
+ ['stringField', 'intField'],
289
+ { stringField: 'huh', intField: 999 },
290
+ );
291
+ expect(entityResultNoValues).toHaveLength(0);
292
+
293
+ await expect(
294
+ entityLoader.loadByCompositeFieldEqualingAsync(['stringField', 'intField'], {
295
+ stringField: 'huh',
296
+ intField: 5,
297
+ }),
298
+ ).rejects.toThrowError(
299
+ 'loadByCompositeFieldEqualing: Multiple entities of type TestEntity found for composite field (stringField,intField)={"stringField":"huh","intField":5}',
300
+ );
301
+
302
+ // test the result map
303
+ const entityResultMap = await entityLoader.loadManyByCompositeFieldEqualingManyAsync(
304
+ ['stringField', 'intField'],
305
+ [
306
+ { stringField: 'huh', intField: 5 },
307
+ { stringField: 'huh', intField: 3 },
308
+ ],
309
+ );
310
+ expect(entityResultMap.size).toBe(2);
311
+ expect(
312
+ entityResultMap
313
+ .get({ stringField: 'huh', intField: 5 })
314
+ ?.map((m) => m.enforceValue().getID()),
315
+ ).toEqual([id1, id2]);
316
+ expect(
317
+ entityResultMap
318
+ .get({ stringField: 'huh', intField: 3 })
319
+ ?.map((m) => m.enforceValue().getID()),
320
+ ).toEqual([id3]);
321
+ });
322
+
144
323
  it('loads entities with loadManyByFieldEqualityConjunction', async () => {
145
324
  const privacyPolicy = new TestEntityPrivacyPolicy();
146
325
  const spiedPrivacyPolicy = spy(privacyPolicy);
147
326
  const viewerContext = instance(mock(ViewerContext));
148
327
  const privacyPolicyEvaluationContext =
149
328
  instance(
150
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
329
+ mock<
330
+ EntityPrivacyPolicyEvaluationContext<
331
+ TestFields,
332
+ 'customIdField',
333
+ ViewerContext,
334
+ TestEntity
335
+ >
336
+ >(),
151
337
  );
152
338
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
153
339
  const queryContext = new StubQueryContextProvider().getQueryContext();
@@ -155,7 +341,7 @@ describe(AuthorizationResultBasedEntityLoader, () => {
155
341
  const id1 = uuidv4();
156
342
  const id2 = uuidv4();
157
343
  const id3 = uuidv4();
158
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
344
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
159
345
  testEntityConfiguration,
160
346
  StubDatabaseAdapter.convertFieldObjectsToDataStore(
161
347
  testEntityConfiguration,
@@ -257,7 +443,14 @@ describe(AuthorizationResultBasedEntityLoader, () => {
257
443
  const viewerContext = instance(mock(ViewerContext));
258
444
  const privacyPolicyEvaluationContext =
259
445
  instance(
260
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
446
+ mock<
447
+ EntityPrivacyPolicyEvaluationContext<
448
+ TestFields,
449
+ 'customIdField',
450
+ ViewerContext,
451
+ TestEntity
452
+ >
453
+ >(),
261
454
  );
262
455
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
263
456
  const queryContext = new StubQueryContextProvider().getQueryContext();
@@ -265,7 +458,7 @@ describe(AuthorizationResultBasedEntityLoader, () => {
265
458
  const id1 = uuidv4();
266
459
  const id2 = uuidv4();
267
460
  const id3 = uuidv4();
268
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
461
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
269
462
  testEntityConfiguration,
270
463
  StubDatabaseAdapter.convertFieldObjectsToDataStore(
271
464
  testEntityConfiguration,
@@ -364,12 +557,19 @@ describe(AuthorizationResultBasedEntityLoader, () => {
364
557
  const viewerContext = instance(mock(ViewerContext));
365
558
  const privacyPolicyEvaluationContext =
366
559
  instance(
367
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
560
+ mock<
561
+ EntityPrivacyPolicyEvaluationContext<
562
+ TestFields,
563
+ 'customIdField',
564
+ ViewerContext,
565
+ TestEntity
566
+ >
567
+ >(),
368
568
  );
369
569
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
370
570
  const queryContext = new StubQueryContextProvider().getQueryContext();
371
571
 
372
- const dataManagerMock = mock<EntityDataManager<TestFields>>(EntityDataManager);
572
+ const dataManagerMock = mock<EntityDataManager<TestFields, 'customIdField'>>(EntityDataManager);
373
573
  when(
374
574
  dataManagerMock.loadManyByRawWhereClauseAsync(
375
575
  queryContext,
@@ -432,13 +632,20 @@ describe(AuthorizationResultBasedEntityLoader, () => {
432
632
  const viewerContext = instance(mock(ViewerContext));
433
633
  const privacyPolicyEvaluationContext =
434
634
  instance(
435
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
635
+ mock<
636
+ EntityPrivacyPolicyEvaluationContext<
637
+ TestFields,
638
+ 'customIdField',
639
+ ViewerContext,
640
+ TestEntity
641
+ >
642
+ >(),
436
643
  );
437
644
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
438
645
  const queryContext = new StubQueryContextProvider().getQueryContext();
439
646
 
440
647
  const id1 = uuidv4();
441
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
648
+ const databaseAdapter = new StubDatabaseAdapter<TestFields, 'customIdField'>(
442
649
  testEntityConfiguration,
443
650
  StubDatabaseAdapter.convertFieldObjectsToDataStore(
444
651
  testEntityConfiguration,
@@ -504,12 +711,19 @@ describe(AuthorizationResultBasedEntityLoader, () => {
504
711
  const viewerContext = instance(mock(ViewerContext));
505
712
  const privacyPolicyEvaluationContext =
506
713
  instance(
507
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
714
+ mock<
715
+ EntityPrivacyPolicyEvaluationContext<
716
+ TestFields,
717
+ 'customIdField',
718
+ ViewerContext,
719
+ TestEntity
720
+ >
721
+ >(),
508
722
  );
509
723
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
510
724
  const queryContext = new StubQueryContextProvider().getQueryContext();
511
725
  const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
512
- const dataManagerMock = mock<EntityDataManager<TestFields>>();
726
+ const dataManagerMock = mock<EntityDataManager<TestFields, 'customIdField'>>();
513
727
  const dataManagerInstance = instance(dataManagerMock);
514
728
 
515
729
  const id1 = uuidv4();
@@ -532,48 +746,54 @@ describe(AuthorizationResultBasedEntityLoader, () => {
532
746
  metricsAdapter,
533
747
  utils,
534
748
  );
535
- await entityLoader.utils.invalidateFieldsAsync({ customIdField: id1 } as any);
536
749
 
537
- verify(
538
- dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any)),
539
- ).once();
540
- });
750
+ const date = new Date();
541
751
 
542
- it('invalidates upon invalidate by field', async () => {
543
- const viewerContext = instance(mock(ViewerContext));
544
- const privacyPolicyEvaluationContext =
545
- instance(
546
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
547
- );
548
- const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
549
- const queryContext = new StubQueryContextProvider().getQueryContext();
550
- const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
551
- const dataManagerMock = mock<EntityDataManager<TestFields>>();
552
- const dataManagerInstance = instance(dataManagerMock);
752
+ await entityLoader.utils.invalidateFieldsAsync({
753
+ customIdField: id1,
754
+ testIndexedField: 'h1',
755
+ intField: 5,
756
+ stringField: 'huh',
757
+ dateField: date,
758
+ nullableField: null,
759
+ });
553
760
 
554
- const id1 = uuidv4();
555
- const utils = new EntityLoaderUtils(
556
- viewerContext,
557
- queryContext,
558
- privacyPolicyEvaluationContext,
559
- testEntityConfiguration,
560
- TestEntity,
561
- /* entitySelectedFields */ undefined,
562
- privacyPolicy,
563
- dataManagerInstance,
564
- metricsAdapter,
565
- );
566
- const entityLoader = new AuthorizationResultBasedEntityLoader(
567
- queryContext,
568
- testEntityConfiguration,
569
- TestEntity,
570
- dataManagerInstance,
571
- metricsAdapter,
572
- utils,
573
- );
574
- await entityLoader.utils.invalidateFieldsAsync({ customIdField: id1 } as any);
761
+ verify(dataManagerMock.invalidateKeyValuePairsAsync(anything())).once();
575
762
  verify(
576
- dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any)),
763
+ dataManagerMock.invalidateKeyValuePairsAsync(
764
+ deepEqualEntityAware([
765
+ [
766
+ new SingleFieldHolder<TestFields, 'customIdField', 'customIdField'>('customIdField'),
767
+ new SingleFieldValueHolder<TestFields, 'customIdField'>(id1),
768
+ ],
769
+ [
770
+ new SingleFieldHolder<TestFields, 'customIdField', 'testIndexedField'>(
771
+ 'testIndexedField',
772
+ ),
773
+ new SingleFieldValueHolder<TestFields, 'testIndexedField'>('h1'),
774
+ ],
775
+ [
776
+ new SingleFieldHolder<TestFields, 'customIdField', 'intField'>('intField'),
777
+ new SingleFieldValueHolder<TestFields, 'intField'>(5),
778
+ ],
779
+ [
780
+ new SingleFieldHolder<TestFields, 'customIdField', 'stringField'>('stringField'),
781
+ new SingleFieldValueHolder<TestFields, 'stringField'>('huh'),
782
+ ],
783
+ [
784
+ new SingleFieldHolder<TestFields, 'customIdField', 'dateField'>('dateField'),
785
+ new SingleFieldValueHolder<TestFields, 'dateField'>(date),
786
+ ],
787
+ [
788
+ new CompositeFieldHolder(['stringField', 'intField']),
789
+ new CompositeFieldValueHolder({ stringField: 'huh', intField: 5 }),
790
+ ],
791
+ [
792
+ new CompositeFieldHolder(['stringField', 'testIndexedField']),
793
+ new CompositeFieldValueHolder({ stringField: 'huh', testIndexedField: 'h1' }),
794
+ ],
795
+ ]),
796
+ ),
577
797
  ).once();
578
798
  });
579
799
 
@@ -581,17 +801,33 @@ describe(AuthorizationResultBasedEntityLoader, () => {
581
801
  const viewerContext = instance(mock(ViewerContext));
582
802
  const privacyPolicyEvaluationContext =
583
803
  instance(
584
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
804
+ mock<
805
+ EntityPrivacyPolicyEvaluationContext<
806
+ TestFields,
807
+ 'customIdField',
808
+ ViewerContext,
809
+ TestEntity
810
+ >
811
+ >(),
585
812
  );
586
813
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
587
814
  const queryContext = new StubQueryContextProvider().getQueryContext();
588
815
  const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
589
- const dataManagerMock = mock<EntityDataManager<TestFields>>();
816
+ const dataManagerMock = mock<EntityDataManager<TestFields, 'customIdField'>>();
590
817
  const dataManagerInstance = instance(dataManagerMock);
591
818
 
592
819
  const id1 = uuidv4();
593
820
  const entityMock = mock(TestEntity);
594
- when(entityMock.getAllDatabaseFields()).thenReturn({ customIdField: id1 } as any);
821
+ const date = new Date();
822
+
823
+ when(entityMock.getAllDatabaseFields()).thenReturn({
824
+ customIdField: id1,
825
+ testIndexedField: 'h1',
826
+ intField: 5,
827
+ stringField: 'huh',
828
+ dateField: date,
829
+ nullableField: null,
830
+ });
595
831
  const entityInstance = instance(entityMock);
596
832
 
597
833
  const utils = new EntityLoaderUtils(
@@ -614,8 +850,43 @@ describe(AuthorizationResultBasedEntityLoader, () => {
614
850
  utils,
615
851
  );
616
852
  await entityLoader.utils.invalidateEntityAsync(entityInstance);
853
+
854
+ verify(dataManagerMock.invalidateKeyValuePairsAsync(anything())).once();
617
855
  verify(
618
- dataManagerMock.invalidateObjectFieldsAsync(deepEqual({ customIdField: id1 } as any)),
856
+ dataManagerMock.invalidateKeyValuePairsAsync(
857
+ deepEqualEntityAware([
858
+ [
859
+ new SingleFieldHolder<TestFields, 'customIdField', 'customIdField'>('customIdField'),
860
+ new SingleFieldValueHolder<TestFields, 'customIdField'>(id1),
861
+ ],
862
+ [
863
+ new SingleFieldHolder<TestFields, 'customIdField', 'testIndexedField'>(
864
+ 'testIndexedField',
865
+ ),
866
+ new SingleFieldValueHolder<TestFields, 'testIndexedField'>('h1'),
867
+ ],
868
+ [
869
+ new SingleFieldHolder<TestFields, 'customIdField', 'intField'>('intField'),
870
+ new SingleFieldValueHolder<TestFields, 'intField'>(5),
871
+ ],
872
+ [
873
+ new SingleFieldHolder<TestFields, 'customIdField', 'stringField'>('stringField'),
874
+ new SingleFieldValueHolder<TestFields, 'stringField'>('huh'),
875
+ ],
876
+ [
877
+ new SingleFieldHolder<TestFields, 'customIdField', 'dateField'>('dateField'),
878
+ new SingleFieldValueHolder<TestFields, 'dateField'>(date),
879
+ ],
880
+ [
881
+ new CompositeFieldHolder(['stringField', 'intField']),
882
+ new CompositeFieldValueHolder({ stringField: 'huh', intField: 5 }),
883
+ ],
884
+ [
885
+ new CompositeFieldHolder(['stringField', 'testIndexedField']),
886
+ new CompositeFieldValueHolder({ stringField: 'huh', testIndexedField: 'h1' }),
887
+ ],
888
+ ]),
889
+ ),
619
890
  ).once();
620
891
  });
621
892
 
@@ -623,17 +894,37 @@ describe(AuthorizationResultBasedEntityLoader, () => {
623
894
  const viewerContext = instance(mock(ViewerContext));
624
895
  const privacyPolicyEvaluationContext =
625
896
  instance(
626
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
897
+ mock<
898
+ EntityPrivacyPolicyEvaluationContext<
899
+ TestFields,
900
+ 'customIdField',
901
+ ViewerContext,
902
+ TestEntity
903
+ >
904
+ >(),
627
905
  );
628
906
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
629
907
  const queryContext = new StubQueryContextProvider().getQueryContext();
630
908
  const privacyPolicyMock = mock(TestEntityPrivacyPolicy);
631
- const dataManagerMock = mock<EntityDataManager<TestFields>>();
909
+ const dataManagerMock = mock<EntityDataManager<TestFields, 'customIdField'>>();
632
910
 
633
911
  const id1 = uuidv4();
634
- when(
635
- dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything()),
636
- ).thenResolve(new Map().set(id1, [{ customIdField: id1 }]));
912
+ when(dataManagerMock.loadManyEqualingAsync(anything(), anything(), anything())).thenResolve(
913
+ new SingleFieldValueHolderMap<
914
+ TestFields,
915
+ 'customIdField',
916
+ readonly Readonly<TestFields>[]
917
+ >().set(new SingleFieldValueHolder(id1), [
918
+ {
919
+ customIdField: id1,
920
+ testIndexedField: '',
921
+ stringField: '',
922
+ intField: 0,
923
+ dateField: new Date(),
924
+ nullableField: null,
925
+ },
926
+ ]),
927
+ );
637
928
 
638
929
  const rejectionError = new Error();
639
930
 
@@ -680,18 +971,25 @@ describe(AuthorizationResultBasedEntityLoader, () => {
680
971
  const viewerContext = instance(mock(ViewerContext));
681
972
  const privacyPolicyEvaluationContext =
682
973
  instance(
683
- mock<EntityPrivacyPolicyEvaluationContext<TestFields, string, ViewerContext, TestEntity>>(),
974
+ mock<
975
+ EntityPrivacyPolicyEvaluationContext<
976
+ TestFields,
977
+ 'customIdField',
978
+ ViewerContext,
979
+ TestEntity
980
+ >
981
+ >(),
684
982
  );
685
983
  const metricsAdapter = instance(mock<IEntityMetricsAdapter>());
686
984
  const queryContext = new StubQueryContextProvider().getQueryContext();
687
985
  const privacyPolicy = instance(mock(TestEntityPrivacyPolicy));
688
- const dataManagerMock = mock<EntityDataManager<TestFields>>();
986
+ const dataManagerMock = mock<EntityDataManager<TestFields, 'customIdField'>>();
689
987
 
690
988
  const error = new Error();
691
989
 
692
- when(
693
- dataManagerMock.loadManyByFieldEqualingAsync(anything(), anything(), anything()),
694
- ).thenReject(error);
990
+ when(dataManagerMock.loadManyEqualingAsync(anything(), anything(), anything())).thenReject(
991
+ error,
992
+ );
695
993
 
696
994
  const dataManagerInstance = instance(dataManagerMock);
697
995