@expo/entity 0.41.0 → 0.43.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,16 +1,25 @@
1
- import { verify, deepEqual, mock, instance, when, anything } from 'ts-mockito';
1
+ import { verify, mock, instance, when, anything } from 'ts-mockito';
2
2
 
3
3
  import EntityConfiguration from '../../EntityConfiguration';
4
4
  import { UUIDField } from '../../EntityFields';
5
5
  import IEntityCacheAdapter from '../../IEntityCacheAdapter';
6
+ import {
7
+ deepEqualEntityAware,
8
+ isEqualWithEntityAware,
9
+ } from '../../utils/__testfixtures__/TSMockitoExtensions';
6
10
  import ReadThroughEntityCache, { CacheStatus } from '../ReadThroughEntityCache';
11
+ import {
12
+ SingleFieldHolder,
13
+ SingleFieldValueHolder,
14
+ SingleFieldValueHolderMap,
15
+ } from '../SingleFieldHolder';
7
16
 
8
17
  type BlahFields = {
9
18
  id: string;
10
19
  };
11
20
 
12
- const makeEntityConfiguration = (cacheIdField: boolean): EntityConfiguration<BlahFields> =>
13
- new EntityConfiguration<BlahFields>({
21
+ const makeEntityConfiguration = (cacheIdField: boolean): EntityConfiguration<BlahFields, 'id'> =>
22
+ new EntityConfiguration<BlahFields, 'id'>({
14
23
  idField: 'id',
15
24
  tableName: 'blah',
16
25
  schema: {
@@ -23,12 +32,14 @@ const makeEntityConfiguration = (cacheIdField: boolean): EntityConfiguration<Bla
23
32
  const createIdFetcher =
24
33
  (ids: string[]) =>
25
34
  async <N extends keyof BlahFields>(
26
- fetcherFieldValues: readonly NonNullable<BlahFields[N]>[],
27
- ): Promise<ReadonlyMap<NonNullable<BlahFields[N]>, readonly Readonly<BlahFields>[]>> => {
28
- const results = new Map();
35
+ fetcherFieldValues: readonly SingleFieldValueHolder<BlahFields, N>[],
36
+ ): Promise<
37
+ ReadonlyMap<SingleFieldValueHolder<BlahFields, N>, readonly Readonly<BlahFields>[]>
38
+ > => {
39
+ const results = new SingleFieldValueHolderMap<BlahFields, N, readonly Readonly<BlahFields>[]>();
29
40
  fetcherFieldValues.forEach((v) => {
30
- if (ids.includes(v)) {
31
- results.set(v, [{ id: v }]);
41
+ if (ids.includes(v.fieldValue)) {
42
+ results.set(v, [{ id: v.fieldValue }]);
32
43
  } else {
33
44
  results.set(v, []);
34
45
  }
@@ -39,12 +50,14 @@ const createIdFetcher =
39
50
  const createFetcherNonUnique =
40
51
  (ids: string[]) =>
41
52
  async <N extends keyof BlahFields>(
42
- fetcherFieldValues: readonly NonNullable<BlahFields[N]>[],
43
- ): Promise<ReadonlyMap<NonNullable<BlahFields[N]>, readonly Readonly<BlahFields>[]>> => {
44
- const results = new Map();
53
+ fetcherFieldValues: readonly SingleFieldValueHolder<BlahFields, N>[],
54
+ ): Promise<
55
+ ReadonlyMap<SingleFieldValueHolder<BlahFields, N>, readonly Readonly<BlahFields>[]>
56
+ > => {
57
+ const results = new SingleFieldValueHolderMap<BlahFields, N, readonly Readonly<BlahFields>[]>();
45
58
  fetcherFieldValues.forEach((v) => {
46
- if (ids.includes(v)) {
47
- results.set(v, [{ id: v }, { id: v + '2' }]);
59
+ if (ids.includes(v.fieldValue)) {
60
+ results.set(v, [{ id: v.fieldValue }, { id: v.fieldValue + '2' }]);
48
61
  } else {
49
62
  results.set(v, []);
50
63
  }
@@ -55,207 +68,402 @@ const createFetcherNonUnique =
55
68
  describe(ReadThroughEntityCache, () => {
56
69
  describe('readManyThroughAsync', () => {
57
70
  it('fetches from DB upon cache miss and caches the result', async () => {
58
- const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
71
+ const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
59
72
  const cacheAdapter = instance(cacheAdapterMock);
60
73
  const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
61
74
  const fetcher = createIdFetcher(['wat', 'who']);
62
75
 
63
- when(cacheAdapterMock.loadManyAsync('id', deepEqual(['wat', 'who']))).thenResolve(
64
- new Map([
65
- ['wat', { status: CacheStatus.MISS }],
66
- ['who', { status: CacheStatus.MISS }],
67
- ]),
76
+ when(
77
+ cacheAdapterMock.loadManyAsync(
78
+ deepEqualEntityAware(new SingleFieldHolder('id')),
79
+ deepEqualEntityAware([
80
+ new SingleFieldValueHolder('wat'),
81
+ new SingleFieldValueHolder('who'),
82
+ ]),
83
+ ),
84
+ ).thenResolve(
85
+ new SingleFieldValueHolderMap(
86
+ new Map([
87
+ [new SingleFieldValueHolder('wat'), { status: CacheStatus.MISS }],
88
+ [new SingleFieldValueHolder('who'), { status: CacheStatus.MISS }],
89
+ ]),
90
+ ),
68
91
  );
69
92
 
70
- const result = await entityCache.readManyThroughAsync('id', ['wat', 'who'], fetcher);
93
+ const result = await entityCache.readManyThroughAsync(
94
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
95
+ [
96
+ new SingleFieldValueHolder<BlahFields, 'id'>('wat'),
97
+ new SingleFieldValueHolder<BlahFields, 'id'>('who'),
98
+ ],
99
+ fetcher,
100
+ );
71
101
 
72
- verify(cacheAdapterMock.loadManyAsync('id', deepEqual(['wat', 'who']))).once();
102
+ verify(
103
+ cacheAdapterMock.loadManyAsync(
104
+ deepEqualEntityAware(new SingleFieldHolder('id')),
105
+ deepEqualEntityAware([
106
+ new SingleFieldValueHolder('wat'),
107
+ new SingleFieldValueHolder('who'),
108
+ ]),
109
+ ),
110
+ ).once();
73
111
  verify(
74
112
  cacheAdapterMock.cacheManyAsync(
75
- 'id',
76
- deepEqual(
77
- new Map([
78
- ['wat', { id: 'wat' }],
79
- ['who', { id: 'who' }],
80
- ]),
113
+ deepEqualEntityAware(new SingleFieldHolder('id')),
114
+ deepEqualEntityAware(
115
+ new SingleFieldValueHolderMap(
116
+ new Map([
117
+ [new SingleFieldValueHolder('wat'), { id: 'wat' }],
118
+ [new SingleFieldValueHolder('who'), { id: 'who' }],
119
+ ]),
120
+ ),
81
121
  ),
82
122
  ),
83
123
  ).once();
84
- verify(cacheAdapterMock.cacheDBMissesAsync('id', deepEqual([]))).once();
124
+ verify(
125
+ cacheAdapterMock.cacheDBMissesAsync(
126
+ deepEqualEntityAware(new SingleFieldHolder<BlahFields, 'id', 'id'>('id')),
127
+ deepEqualEntityAware([] as SingleFieldValueHolder<BlahFields, 'id'>[]),
128
+ ),
129
+ ).once();
85
130
  expect(result).toEqual(
86
- new Map([
87
- ['wat', [{ id: 'wat' }]],
88
- ['who', [{ id: 'who' }]],
89
- ]),
131
+ new SingleFieldValueHolderMap(
132
+ new Map([
133
+ [new SingleFieldValueHolder('wat'), [{ id: 'wat' }]],
134
+ [new SingleFieldValueHolder('who'), [{ id: 'who' }]],
135
+ ]),
136
+ ),
90
137
  );
91
138
  });
92
139
 
93
140
  it('does not fetch from the DB or cache results when all cache fetches are hits', async () => {
94
- const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
141
+ const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
95
142
  const cacheAdapter = instance(cacheAdapterMock);
96
143
  const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
97
144
  const fetcher = createIdFetcher(['wat', 'who']);
98
145
 
99
- when(cacheAdapterMock.loadManyAsync('id', deepEqual(['wat', 'who']))).thenResolve(
146
+ when(
147
+ cacheAdapterMock.loadManyAsync(
148
+ deepEqualEntityAware(new SingleFieldHolder('id')),
149
+ deepEqualEntityAware([
150
+ new SingleFieldValueHolder('wat'),
151
+ new SingleFieldValueHolder('who'),
152
+ ]),
153
+ ),
154
+ ).thenResolve(
100
155
  new Map([
101
- ['wat', { status: CacheStatus.HIT, item: { id: 'wat' } }],
102
- ['who', { status: CacheStatus.HIT, item: { id: 'who' } }],
156
+ [new SingleFieldValueHolder('wat'), { status: CacheStatus.HIT, item: { id: 'wat' } }],
157
+ [new SingleFieldValueHolder('who'), { status: CacheStatus.HIT, item: { id: 'who' } }],
103
158
  ]),
104
159
  );
105
160
 
106
- const result = await entityCache.readManyThroughAsync('id', ['wat', 'who'], fetcher);
161
+ const result = await entityCache.readManyThroughAsync(
162
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
163
+ [
164
+ new SingleFieldValueHolder<BlahFields, 'id'>('wat'),
165
+ new SingleFieldValueHolder<BlahFields, 'id'>('who'),
166
+ ],
167
+ fetcher,
168
+ );
107
169
 
108
- verify(cacheAdapterMock.loadManyAsync('id', deepEqual(['wat', 'who']))).once();
170
+ verify(
171
+ cacheAdapterMock.loadManyAsync(
172
+ deepEqualEntityAware(new SingleFieldHolder('id')),
173
+ deepEqualEntityAware([
174
+ new SingleFieldValueHolder('wat'),
175
+ new SingleFieldValueHolder('who'),
176
+ ]),
177
+ ),
178
+ ).once();
109
179
  verify(
110
180
  cacheAdapterMock.cacheManyAsync(
111
- 'id',
112
- deepEqual(
113
- new Map([
114
- ['wat', { id: 'wat' }],
115
- ['who', { id: 'who' }],
116
- ]),
181
+ deepEqualEntityAware(new SingleFieldHolder('id')),
182
+ deepEqualEntityAware(
183
+ new SingleFieldValueHolderMap(
184
+ new Map([
185
+ [new SingleFieldValueHolder('wat'), { id: 'wat' }],
186
+ [new SingleFieldValueHolder('who'), { id: 'who' }],
187
+ ]),
188
+ ),
117
189
  ),
118
190
  ),
119
191
  ).never();
120
- verify(cacheAdapterMock.cacheDBMissesAsync('id', deepEqual([]))).never();
192
+ verify(
193
+ cacheAdapterMock.cacheDBMissesAsync(
194
+ deepEqualEntityAware(new SingleFieldHolder<BlahFields, 'id', 'id'>('id')),
195
+ deepEqualEntityAware([] as SingleFieldValueHolder<BlahFields, 'id'>[]),
196
+ ),
197
+ ).never();
121
198
  expect(result).toEqual(
122
- new Map([
123
- ['wat', [{ id: 'wat' }]],
124
- ['who', [{ id: 'who' }]],
125
- ]),
199
+ new SingleFieldValueHolderMap(
200
+ new Map([
201
+ [new SingleFieldValueHolder('wat'), [{ id: 'wat' }]],
202
+ [new SingleFieldValueHolder('who'), [{ id: 'who' }]],
203
+ ]),
204
+ ),
126
205
  );
127
206
  });
128
207
 
129
208
  it('negatively caches db misses', async () => {
130
- const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
209
+ const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
131
210
  const cacheAdapter = instance(cacheAdapterMock);
132
211
  const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
133
212
 
134
213
  // simulate db miss
135
214
  const fetcher = createIdFetcher(['wat', 'who']);
136
215
 
137
- when(cacheAdapterMock.loadManyAsync('id', deepEqual(['why']))).thenResolve(
138
- new Map([['why', { status: CacheStatus.MISS }]]),
216
+ when(
217
+ cacheAdapterMock.loadManyAsync(
218
+ deepEqualEntityAware(new SingleFieldHolder('id')),
219
+ deepEqualEntityAware([new SingleFieldValueHolder('why')]),
220
+ ),
221
+ ).thenResolve(
222
+ new SingleFieldValueHolderMap(
223
+ new Map([[new SingleFieldValueHolder('why'), { status: CacheStatus.MISS }]]),
224
+ ),
139
225
  );
140
226
 
141
- const result = await entityCache.readManyThroughAsync('id', ['why'], fetcher);
227
+ const result = await entityCache.readManyThroughAsync(
228
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
229
+ [new SingleFieldValueHolder<BlahFields, 'id'>('why')],
230
+ fetcher,
231
+ );
142
232
 
143
- verify(cacheAdapterMock.loadManyAsync('id', deepEqual(['why']))).once();
144
- verify(cacheAdapterMock.cacheManyAsync('id', deepEqual(new Map()))).once();
145
- verify(cacheAdapterMock.cacheDBMissesAsync('id', deepEqual(['why']))).once();
146
- expect(result).toEqual(new Map());
233
+ verify(
234
+ cacheAdapterMock.loadManyAsync(
235
+ deepEqualEntityAware(new SingleFieldHolder('id')),
236
+ deepEqualEntityAware([new SingleFieldValueHolder('why')]),
237
+ ),
238
+ ).once();
239
+ verify(
240
+ cacheAdapterMock.cacheManyAsync(
241
+ deepEqualEntityAware(new SingleFieldHolder('id')),
242
+ deepEqualEntityAware(new SingleFieldValueHolderMap(new Map())),
243
+ ),
244
+ ).once();
245
+ verify(
246
+ cacheAdapterMock.cacheDBMissesAsync(
247
+ deepEqualEntityAware(new SingleFieldHolder('id')),
248
+ deepEqualEntityAware([new SingleFieldValueHolder('why')]),
249
+ ),
250
+ ).once();
251
+ expect(result).toEqual(new SingleFieldValueHolderMap(new Map()));
147
252
  });
148
253
 
149
254
  it('does not return or fetch negatively cached results from DB', async () => {
150
- const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
255
+ const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
151
256
  const cacheAdapter = instance(cacheAdapterMock);
152
257
  const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
153
258
  const fetcher = createIdFetcher([]);
154
259
 
155
- when(cacheAdapterMock.loadManyAsync('id', deepEqual(['why']))).thenResolve(
156
- new Map([['why', { status: CacheStatus.NEGATIVE }]]),
260
+ when(
261
+ cacheAdapterMock.loadManyAsync(
262
+ deepEqualEntityAware(new SingleFieldHolder('id')),
263
+ deepEqualEntityAware([new SingleFieldValueHolder('why')]),
264
+ ),
265
+ ).thenResolve(
266
+ new SingleFieldValueHolderMap(
267
+ new Map([[new SingleFieldValueHolder('why'), { status: CacheStatus.NEGATIVE }]]),
268
+ ),
157
269
  );
158
270
 
159
- const result = await entityCache.readManyThroughAsync('id', ['why'], fetcher);
160
- verify(cacheAdapterMock.loadManyAsync('id', deepEqual(['why']))).once();
161
- verify(cacheAdapterMock.cacheManyAsync('id', anything())).never();
162
- verify(cacheAdapterMock.cacheDBMissesAsync('id', anything())).never();
163
- expect(result).toEqual(new Map());
271
+ const result = await entityCache.readManyThroughAsync(
272
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
273
+ [new SingleFieldValueHolder<BlahFields, 'id'>('why')],
274
+ fetcher,
275
+ );
276
+ verify(
277
+ cacheAdapterMock.loadManyAsync(
278
+ deepEqualEntityAware(new SingleFieldHolder('id')),
279
+ deepEqualEntityAware([new SingleFieldValueHolder('why')]),
280
+ ),
281
+ ).once();
282
+ verify(cacheAdapterMock.cacheManyAsync(new SingleFieldHolder('id'), anything())).never();
283
+ verify(cacheAdapterMock.cacheDBMissesAsync(new SingleFieldHolder('id'), anything())).never();
284
+ expect(result).toEqual(new SingleFieldValueHolderMap(new Map()));
164
285
  });
165
286
 
166
287
  it('does a mix and match of hit, miss, and negative', async () => {
167
- const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
288
+ const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
168
289
  const cacheAdapter = instance(cacheAdapterMock);
169
290
  const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
170
291
  const fetcher = createIdFetcher(['wat', 'who', 'why']);
171
292
 
172
293
  when(
173
- cacheAdapterMock.loadManyAsync('id', deepEqual(['wat', 'who', 'why', 'how'])),
294
+ cacheAdapterMock.loadManyAsync(
295
+ deepEqualEntityAware(new SingleFieldHolder('id')),
296
+ deepEqualEntityAware([
297
+ new SingleFieldValueHolder('wat'),
298
+ new SingleFieldValueHolder('who'),
299
+ new SingleFieldValueHolder('why'),
300
+ new SingleFieldValueHolder('how'),
301
+ ]),
302
+ ),
174
303
  ).thenResolve(
175
- new Map([
176
- ['wat', { status: CacheStatus.MISS }],
177
- ['who', { status: CacheStatus.NEGATIVE }],
178
- ['why', { status: CacheStatus.HIT, item: { id: 'why' } }],
179
- ['how', { status: CacheStatus.MISS }],
180
- ]),
304
+ new SingleFieldValueHolderMap(
305
+ new Map([
306
+ [new SingleFieldValueHolder('wat'), { status: CacheStatus.MISS }],
307
+ [new SingleFieldValueHolder('who'), { status: CacheStatus.NEGATIVE }],
308
+ [new SingleFieldValueHolder('why'), { status: CacheStatus.HIT, item: { id: 'why' } }],
309
+ [new SingleFieldValueHolder('how'), { status: CacheStatus.MISS }],
310
+ ]),
311
+ ),
181
312
  );
182
313
 
183
314
  const result = await entityCache.readManyThroughAsync(
184
- 'id',
185
- ['wat', 'who', 'why', 'how'],
315
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
316
+ [
317
+ new SingleFieldValueHolder<BlahFields, 'id'>('wat'),
318
+ new SingleFieldValueHolder<BlahFields, 'id'>('who'),
319
+ new SingleFieldValueHolder<BlahFields, 'id'>('why'),
320
+ new SingleFieldValueHolder<BlahFields, 'id'>('how'),
321
+ ],
186
322
  fetcher,
187
323
  );
188
- verify(cacheAdapterMock.loadManyAsync('id', deepEqual(['wat', 'who', 'why', 'how']))).once();
189
324
  verify(
190
- cacheAdapterMock.cacheManyAsync('id', deepEqual(new Map([['wat', { id: 'wat' }]]))),
325
+ cacheAdapterMock.loadManyAsync(
326
+ deepEqualEntityAware(new SingleFieldHolder('id')),
327
+ deepEqualEntityAware([
328
+ new SingleFieldValueHolder('wat'),
329
+ new SingleFieldValueHolder('who'),
330
+ new SingleFieldValueHolder('why'),
331
+ new SingleFieldValueHolder('how'),
332
+ ]),
333
+ ),
191
334
  ).once();
192
- verify(cacheAdapterMock.cacheDBMissesAsync('id', deepEqual(['how']))).once();
193
- expect(result).toEqual(
194
- new Map([
195
- ['wat', [{ id: 'wat' }]],
196
- ['why', [{ id: 'why' }]],
197
- ]),
198
- );
335
+ verify(
336
+ cacheAdapterMock.cacheManyAsync(
337
+ deepEqualEntityAware(new SingleFieldHolder('id')),
338
+ deepEqualEntityAware(
339
+ new SingleFieldValueHolderMap(
340
+ new Map([[new SingleFieldValueHolder('wat'), { id: 'wat' }]]),
341
+ ),
342
+ ),
343
+ ),
344
+ ).once();
345
+ verify(
346
+ cacheAdapterMock.cacheDBMissesAsync(
347
+ deepEqualEntityAware(new SingleFieldHolder('id')),
348
+ deepEqualEntityAware([new SingleFieldValueHolder('how')]),
349
+ ),
350
+ ).once();
351
+ expect(
352
+ isEqualWithEntityAware(
353
+ result,
354
+ new SingleFieldValueHolderMap(
355
+ new Map([
356
+ [new SingleFieldValueHolder('wat'), [{ id: 'wat' }]],
357
+ [new SingleFieldValueHolder('why'), [{ id: 'why' }]],
358
+ ]),
359
+ ),
360
+ ),
361
+ ).toBe(true);
199
362
  });
200
363
 
201
364
  it('does not call into cache for field that is not cacheable', async () => {
202
- const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
365
+ const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
203
366
  const cacheAdapter = instance(cacheAdapterMock);
204
367
  const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(false), cacheAdapter);
205
368
  const fetcher = createIdFetcher(['wat']);
206
- const result = await entityCache.readManyThroughAsync('id', ['wat'], fetcher);
207
- verify(cacheAdapterMock.loadManyAsync('id', anything())).never();
208
- expect(result).toEqual(new Map([['wat', [{ id: 'wat' }]]]));
369
+ const result = await entityCache.readManyThroughAsync(
370
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
371
+ [new SingleFieldValueHolder<BlahFields, 'id'>('wat')],
372
+ fetcher,
373
+ );
374
+ verify(cacheAdapterMock.loadManyAsync(new SingleFieldHolder('id'), anything())).never();
375
+ expect(result).toEqual(
376
+ new SingleFieldValueHolderMap(
377
+ new Map([[new SingleFieldValueHolder('wat'), [{ id: 'wat' }]]]),
378
+ ),
379
+ );
209
380
  });
210
381
 
211
382
  it('does not cache when DB returns multiple objects for what is supposed to be unique and returns empty', async () => {
212
383
  const consoleSpy = jest.spyOn(console, 'warn');
213
384
 
214
- const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
385
+ const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
215
386
  const cacheAdapter = instance(cacheAdapterMock);
216
387
  const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
217
388
  const fetcher = createFetcherNonUnique(['wat', 'who']);
218
389
 
219
- when(cacheAdapterMock.loadManyAsync('id', deepEqual(['wat', 'who']))).thenResolve(
220
- new Map([
221
- ['wat', { status: CacheStatus.MISS }],
222
- ['who', { status: CacheStatus.MISS }],
223
- ]),
390
+ when(
391
+ cacheAdapterMock.loadManyAsync(
392
+ deepEqualEntityAware(new SingleFieldHolder('id')),
393
+ deepEqualEntityAware([
394
+ new SingleFieldValueHolder('wat'),
395
+ new SingleFieldValueHolder('who'),
396
+ ]),
397
+ ),
398
+ ).thenResolve(
399
+ new SingleFieldValueHolderMap(
400
+ new Map([
401
+ [new SingleFieldValueHolder('wat'), { status: CacheStatus.MISS }],
402
+ [new SingleFieldValueHolder('who'), { status: CacheStatus.MISS }],
403
+ ]),
404
+ ),
224
405
  );
225
406
 
226
- const result = await entityCache.readManyThroughAsync('id', ['wat', 'who'], fetcher);
407
+ const result = await entityCache.readManyThroughAsync(
408
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
409
+ [
410
+ new SingleFieldValueHolder<BlahFields, 'id'>('wat'),
411
+ new SingleFieldValueHolder<BlahFields, 'id'>('who'),
412
+ ],
413
+ fetcher,
414
+ );
227
415
 
228
- verify(cacheAdapterMock.loadManyAsync('id', deepEqual(['wat', 'who']))).once();
416
+ verify(
417
+ cacheAdapterMock.loadManyAsync(
418
+ deepEqualEntityAware(new SingleFieldHolder('id')),
419
+ deepEqualEntityAware([
420
+ new SingleFieldValueHolder('wat'),
421
+ new SingleFieldValueHolder('who'),
422
+ ]),
423
+ ),
424
+ ).once();
229
425
  verify(
230
426
  cacheAdapterMock.cacheManyAsync(
231
- 'id',
232
- deepEqual(
427
+ deepEqualEntityAware(new SingleFieldHolder('id')),
428
+ deepEqualEntityAware(
233
429
  new Map([
234
- ['wat', { id: 'wat' }],
235
- ['who', { id: 'who' }],
430
+ [new SingleFieldValueHolder('wat'), { id: 'wat' }],
431
+ [new SingleFieldValueHolder('who'), { id: 'who' }],
236
432
  ]),
237
433
  ),
238
434
  ),
239
435
  ).never();
240
- verify(cacheAdapterMock.cacheDBMissesAsync('id', deepEqual([]))).once();
241
- expect(result).toEqual(new Map());
436
+ verify(
437
+ cacheAdapterMock.cacheDBMissesAsync(
438
+ deepEqualEntityAware(new SingleFieldHolder<BlahFields, 'id', 'id'>('id')),
439
+ deepEqualEntityAware([] as SingleFieldValueHolder<BlahFields, 'id'>[]),
440
+ ),
441
+ ).once();
442
+ expect(result).toEqual(new SingleFieldValueHolderMap(new Map()));
242
443
 
243
444
  expect(consoleSpy).toHaveBeenCalledWith(
244
- 'unique key id in blah returned multiple rows for wat',
445
+ 'unique key SingleField(id) in table blah returned multiple rows for SingleFieldValue(wat)',
245
446
  );
246
447
  expect(consoleSpy).toHaveBeenCalledWith(
247
- 'unique key id in blah returned multiple rows for who',
448
+ 'unique key SingleField(id) in table blah returned multiple rows for SingleFieldValue(who)',
248
449
  );
249
450
  });
250
451
  });
251
452
 
252
453
  describe('invalidateManyAsync', () => {
253
454
  it('calls cache adapter invalidate', async () => {
254
- const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
455
+ const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
255
456
  const cacheAdapter = instance(cacheAdapterMock);
256
457
  const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
257
- await entityCache.invalidateManyAsync('id', ['wat']);
258
- verify(cacheAdapterMock.invalidateManyAsync('id', deepEqual(['wat']))).once();
458
+ await entityCache.invalidateManyAsync(new SingleFieldHolder('id'), [
459
+ new SingleFieldValueHolder('wat'),
460
+ ]);
461
+ verify(
462
+ cacheAdapterMock.invalidateManyAsync(
463
+ deepEqualEntityAware(new SingleFieldHolder('id')),
464
+ deepEqualEntityAware([new SingleFieldValueHolder('wat')]),
465
+ ),
466
+ ).once();
259
467
  });
260
468
  });
261
469
  });
@@ -2,6 +2,7 @@ import IEntityMetricsAdapter, {
2
2
  EntityMetricsLoadType,
3
3
  EntityMetricsMutationType,
4
4
  } from './IEntityMetricsAdapter';
5
+ import { IEntityLoadValue } from '../internal/EntityLoadInterfaces';
5
6
  import { reduceMap } from '../utils/collections/maps';
6
7
 
7
8
  export const timeAndLogLoadEventAsync =
@@ -31,8 +32,12 @@ export const timeAndLogLoadMapEventAsync =
31
32
  loadType: EntityMetricsLoadType,
32
33
  entityClassName: string,
33
34
  ) =>
34
- async <TFields, N extends keyof TFields>(
35
- promise: Promise<ReadonlyMap<NonNullable<TFields[N]>, readonly Readonly<TFields>[]>>,
35
+ async <
36
+ TFields extends Record<string, any>,
37
+ TSerializedLoadValue,
38
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
39
+ >(
40
+ promise: Promise<ReadonlyMap<TLoadValue, readonly Readonly<TFields>[]>>,
36
41
  ) => {
37
42
  const startTime = Date.now();
38
43
  const result = await promise;
@@ -2,6 +2,7 @@ import {
2
2
  EntityAuthorizationAction,
3
3
  EntityPrivacyPolicyEvaluationMode,
4
4
  } from '../EntityPrivacyPolicy';
5
+ import { EntityLoadMethodType } from '../internal/EntityLoadInterfaces';
5
6
 
6
7
  export enum EntityMetricsLoadType {
7
8
  LOAD_MANY,
@@ -84,6 +85,11 @@ export interface IncrementLoadCountEvent {
84
85
  */
85
86
  type: IncrementLoadCountEventType;
86
87
 
88
+ /**
89
+ * Load method type for this event.
90
+ */
91
+ loadType: EntityLoadMethodType;
92
+
87
93
  /**
88
94
  * Number of field values being loaded for this call.
89
95
  */
@@ -8,18 +8,18 @@ import ViewerContext from '../ViewerContext';
8
8
  * Privacy policy rule that always allows.
9
9
  */
10
10
  export default class AlwaysAllowPrivacyPolicyRule<
11
- TFields extends object,
12
- TID extends NonNullable<TFields[TSelectedFields]>,
11
+ TFields extends Record<string, any>,
12
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
13
13
  TViewerContext extends ViewerContext,
14
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
14
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
15
15
  TSelectedFields extends keyof TFields = keyof TFields,
16
- > extends PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields> {
16
+ > extends PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields> {
17
17
  async evaluateAsync(
18
18
  _viewerContext: TViewerContext,
19
19
  _queryContext: EntityQueryContext,
20
20
  _evaluationContext: EntityPrivacyPolicyEvaluationContext<
21
21
  TFields,
22
- TID,
22
+ TIDField,
23
23
  TViewerContext,
24
24
  TEntity,
25
25
  TSelectedFields
@@ -8,18 +8,18 @@ import ViewerContext from '../ViewerContext';
8
8
  * Privacy policy rule that always denies.
9
9
  */
10
10
  export default class AlwaysDenyPrivacyPolicyRule<
11
- TFields extends object,
12
- TID extends NonNullable<TFields[TSelectedFields]>,
11
+ TFields extends Record<string, any>,
12
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
13
13
  TViewerContext extends ViewerContext,
14
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
14
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
15
15
  TSelectedFields extends keyof TFields = keyof TFields,
16
- > extends PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields> {
16
+ > extends PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields> {
17
17
  async evaluateAsync(
18
18
  _viewerContext: TViewerContext,
19
19
  _queryContext: EntityQueryContext,
20
20
  _evaluationContext: EntityPrivacyPolicyEvaluationContext<
21
21
  TFields,
22
- TID,
22
+ TIDField,
23
23
  TViewerContext,
24
24
  TEntity,
25
25
  TSelectedFields