@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,16 @@
1
- import invariant from 'invariant';
2
-
3
1
  import ComposedEntityCacheAdapter from '../ComposedEntityCacheAdapter';
4
2
  import EntityConfiguration from '../EntityConfiguration';
5
3
  import { UUIDField } from '../EntityFields';
6
4
  import IEntityCacheAdapter from '../IEntityCacheAdapter';
5
+ import { IEntityLoadKey, IEntityLoadValue } from '../internal/EntityLoadInterfaces';
7
6
  import { CacheLoadResult, CacheStatus } from '../internal/ReadThroughEntityCache';
7
+ import { SingleFieldHolder, SingleFieldValueHolder } from '../internal/SingleFieldHolder';
8
8
 
9
9
  type BlahFields = {
10
10
  id: string;
11
11
  };
12
12
 
13
- const entityConfiguration = new EntityConfiguration<BlahFields>({
13
+ const entityConfiguration = new EntityConfiguration<BlahFields, 'id'>({
14
14
  idField: 'id',
15
15
  tableName: 'blah',
16
16
  schema: {
@@ -21,37 +21,43 @@ const entityConfiguration = new EntityConfiguration<BlahFields>({
21
21
  });
22
22
 
23
23
  export const DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = Symbol('doesNotExist');
24
- type LocalMemoryCacheValue<TFields> = Readonly<TFields> | typeof DOES_NOT_EXIST_LOCAL_MEMORY_CACHE;
24
+ type LocalMemoryCacheValue<TFields extends Record<string, any>> =
25
+ | Readonly<TFields>
26
+ | typeof DOES_NOT_EXIST_LOCAL_MEMORY_CACHE;
25
27
 
26
- class TestLocalCacheAdapter<TFields extends Record<string, any>>
27
- implements IEntityCacheAdapter<TFields>
28
+ class TestLocalCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields>
29
+ implements IEntityCacheAdapter<TFields, TIDField>
28
30
  {
29
31
  constructor(
30
- private readonly entityConfiguration: EntityConfiguration<TFields>,
32
+ private readonly entityConfiguration: EntityConfiguration<TFields, TIDField>,
31
33
  private readonly cache: Map<string, LocalMemoryCacheValue<TFields>>,
32
34
  ) {}
33
35
 
34
- public async loadManyAsync<N extends keyof TFields>(
35
- fieldName: N,
36
- fieldValues: readonly NonNullable<TFields[N]>[],
37
- ): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>> {
36
+ public async loadManyAsync<
37
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
38
+ TSerializedLoadValue,
39
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
40
+ >(
41
+ key: TLoadKey,
42
+ values: readonly TLoadValue[],
43
+ ): Promise<ReadonlyMap<TLoadValue, CacheLoadResult<TFields>>> {
38
44
  const localMemoryCacheKeyToFieldValueMapping = new Map(
39
- fieldValues.map((fieldValue) => [this.makeCacheKey(fieldName, fieldValue), fieldValue]),
45
+ values.map((value) => [this.makeCacheKey(key, value), value]),
40
46
  );
41
- const cacheResults = new Map<NonNullable<TFields[N]>, CacheLoadResult<TFields>>();
42
- for (const [cacheKey, fieldValue] of localMemoryCacheKeyToFieldValueMapping) {
47
+ const cacheResults = key.vendNewLoadValueMap<CacheLoadResult<TFields>>();
48
+ for (const [cacheKey, value] of localMemoryCacheKeyToFieldValueMapping) {
43
49
  const cacheResult = this.cache.get(cacheKey);
44
50
  if (cacheResult === DOES_NOT_EXIST_LOCAL_MEMORY_CACHE) {
45
- cacheResults.set(fieldValue, {
51
+ cacheResults.set(value, {
46
52
  status: CacheStatus.NEGATIVE,
47
53
  });
48
54
  } else if (cacheResult) {
49
- cacheResults.set(fieldValue, {
55
+ cacheResults.set(value, {
50
56
  status: CacheStatus.HIT,
51
57
  item: cacheResult,
52
58
  });
53
59
  } else {
54
- cacheResults.set(fieldValue, {
60
+ cacheResults.set(value, {
55
61
  status: CacheStatus.MISS,
56
62
  });
57
63
  }
@@ -60,62 +66,63 @@ class TestLocalCacheAdapter<TFields extends Record<string, any>>
60
66
  return cacheResults;
61
67
  }
62
68
 
63
- public async cacheManyAsync<N extends keyof TFields>(
64
- fieldName: N,
65
- objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>,
66
- ): Promise<void> {
67
- for (const [fieldValue, item] of objectMap) {
68
- const cacheKey = this.makeCacheKey(fieldName, fieldValue);
69
+ public async cacheManyAsync<
70
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
71
+ TSerializedLoadValue,
72
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
73
+ >(key: TLoadKey, objectMap: ReadonlyMap<TLoadValue, Readonly<TFields>>): Promise<void> {
74
+ for (const [value, item] of objectMap) {
75
+ const cacheKey = this.makeCacheKey(key, value);
69
76
  this.cache.set(cacheKey, item);
70
77
  }
71
78
  }
72
79
 
73
- public async cacheDBMissesAsync<N extends keyof TFields>(
74
- fieldName: N,
75
- fieldValues: readonly NonNullable<TFields[N]>[],
76
- ): Promise<void> {
77
- for (const fieldValue of fieldValues) {
78
- const cacheKey = this.makeCacheKey(fieldName, fieldValue);
80
+ public async cacheDBMissesAsync<
81
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
82
+ TSerializedLoadValue,
83
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
84
+ >(key: TLoadKey, values: readonly TLoadValue[]): Promise<void> {
85
+ for (const value of values) {
86
+ const cacheKey = this.makeCacheKey(key, value);
79
87
  this.cache.set(cacheKey, DOES_NOT_EXIST_LOCAL_MEMORY_CACHE);
80
88
  }
81
89
  }
82
90
 
83
- public async invalidateManyAsync<N extends keyof TFields>(
84
- fieldName: N,
85
- fieldValues: readonly NonNullable<TFields[N]>[],
86
- ): Promise<void> {
87
- for (const fieldValue of fieldValues) {
88
- const cacheKey = this.makeCacheKey(fieldName, fieldValue);
91
+ public async invalidateManyAsync<
92
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
93
+ TSerializedLoadValue,
94
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
95
+ >(key: TLoadKey, values: readonly TLoadValue[]): Promise<void> {
96
+ for (const value of values) {
97
+ const cacheKey = this.makeCacheKey(key, value);
89
98
  this.cache.delete(cacheKey);
90
99
  }
91
100
  }
92
101
 
93
- private makeCacheKey<N extends keyof TFields>(
94
- fieldName: N,
95
- fieldValue: NonNullable<TFields[N]>,
96
- ): string {
97
- const columnName = this.entityConfiguration.entityToDBFieldsKeyMapping.get(fieldName);
98
- invariant(columnName, `database field mapping missing for ${String(fieldName)}`);
99
- const parts = [
102
+ private makeCacheKey<
103
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
104
+ TSerializedLoadValue,
105
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
106
+ >(key: TLoadKey, value: TLoadValue): string {
107
+ const cacheKeyType = key.getLoadMethodType();
108
+ const parts = key.createCacheKeyPartsForLoadValue(this.entityConfiguration, value);
109
+ const delimiter = ':';
110
+ const escapedParts = [
100
111
  this.entityConfiguration.tableName,
112
+ cacheKeyType,
101
113
  `${this.entityConfiguration.cacheKeyVersion}`,
102
- columnName,
103
- String(fieldValue),
104
- ];
105
- const delimiter = ':';
106
- const escapedParts = parts.map((part) =>
107
- part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`),
108
- );
114
+ ...parts,
115
+ ].map((part) => part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`));
109
116
  return escapedParts.join(delimiter);
110
117
  }
111
118
  }
112
119
 
113
120
  function makeTestCacheAdapters(): {
114
121
  primaryCache: Map<string, LocalMemoryCacheValue<BlahFields>>;
115
- primaryCacheAdapter: TestLocalCacheAdapter<BlahFields>;
122
+ primaryCacheAdapter: TestLocalCacheAdapter<BlahFields, 'id'>;
116
123
  fallbackCache: Map<string, LocalMemoryCacheValue<BlahFields>>;
117
- fallbackCacheAdapter: TestLocalCacheAdapter<BlahFields>;
118
- cacheAdapter: ComposedEntityCacheAdapter<BlahFields>;
124
+ fallbackCacheAdapter: TestLocalCacheAdapter<BlahFields, 'id'>;
125
+ cacheAdapter: ComposedEntityCacheAdapter<BlahFields, 'id'>;
119
126
  } {
120
127
  const primaryCache = new Map();
121
128
  const primaryCacheAdapter = new TestLocalCacheAdapter(entityConfiguration, primaryCache);
@@ -139,96 +146,158 @@ describe(ComposedEntityCacheAdapter, () => {
139
146
  it('returns primary results when populated', async () => {
140
147
  const { primaryCacheAdapter, cacheAdapter } = makeTestCacheAdapters();
141
148
 
142
- const cacheHits = new Map<string, Readonly<BlahFields>>([['test-id-1', { id: 'test-id-1' }]]);
143
- await primaryCacheAdapter.cacheManyAsync('id', cacheHits);
144
- await primaryCacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
145
-
146
- const results = await cacheAdapter.loadManyAsync('id', [
147
- 'test-id-1',
148
- 'test-id-2',
149
- 'test-id-3',
149
+ const cacheHits = new Map<SingleFieldValueHolder<BlahFields, 'id'>, Readonly<BlahFields>>([
150
+ [new SingleFieldValueHolder('test-id-1'), { id: 'test-id-1' }],
150
151
  ]);
152
+ await primaryCacheAdapter.cacheManyAsync(
153
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
154
+ cacheHits,
155
+ );
156
+ await primaryCacheAdapter.cacheDBMissesAsync(
157
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
158
+ [new SingleFieldValueHolder('test-id-2')],
159
+ );
151
160
 
152
- expect(results.get('test-id-1')).toMatchObject({
161
+ const results = await cacheAdapter.loadManyAsync(
162
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
163
+ [
164
+ new SingleFieldValueHolder('test-id-1'),
165
+ new SingleFieldValueHolder('test-id-2'),
166
+ new SingleFieldValueHolder('test-id-3'),
167
+ ],
168
+ );
169
+
170
+ expect(results.get(new SingleFieldValueHolder('test-id-1'))).toMatchObject({
153
171
  status: CacheStatus.HIT,
154
172
  item: { id: 'test-id-1' },
155
173
  });
156
- expect(results.get('test-id-2')).toMatchObject({ status: CacheStatus.NEGATIVE });
157
- expect(results.get('test-id-3')).toMatchObject({ status: CacheStatus.MISS });
174
+ expect(results.get(new SingleFieldValueHolder('test-id-2'))).toMatchObject({
175
+ status: CacheStatus.NEGATIVE,
176
+ });
177
+ expect(results.get(new SingleFieldValueHolder('test-id-3'))).toMatchObject({
178
+ status: CacheStatus.MISS,
179
+ });
158
180
  expect(results.size).toBe(3);
159
181
  });
160
182
 
161
183
  it('returns fallback adapter results primary is empty', async () => {
162
184
  const { fallbackCacheAdapter, cacheAdapter } = makeTestCacheAdapters();
163
185
 
164
- const cacheHits = new Map<string, Readonly<BlahFields>>([['test-id-1', { id: 'test-id-1' }]]);
165
- await fallbackCacheAdapter.cacheManyAsync('id', cacheHits);
166
- await fallbackCacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
167
-
168
- const results = await cacheAdapter.loadManyAsync('id', [
169
- 'test-id-1',
170
- 'test-id-2',
171
- 'test-id-3',
186
+ const cacheHits = new Map<SingleFieldValueHolder<BlahFields, 'id'>, Readonly<BlahFields>>([
187
+ [new SingleFieldValueHolder('test-id-1'), { id: 'test-id-1' }],
172
188
  ]);
189
+ await fallbackCacheAdapter.cacheManyAsync(
190
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
191
+ cacheHits,
192
+ );
193
+ await fallbackCacheAdapter.cacheDBMissesAsync(
194
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
195
+ [new SingleFieldValueHolder('test-id-2')],
196
+ );
197
+
198
+ const results = await cacheAdapter.loadManyAsync(
199
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
200
+ [
201
+ new SingleFieldValueHolder('test-id-1'),
202
+ new SingleFieldValueHolder('test-id-2'),
203
+ new SingleFieldValueHolder('test-id-3'),
204
+ ],
205
+ );
173
206
 
174
- expect(results.get('test-id-1')).toMatchObject({
207
+ expect(results.get(new SingleFieldValueHolder('test-id-1'))).toMatchObject({
175
208
  status: CacheStatus.HIT,
176
209
  item: { id: 'test-id-1' },
177
210
  });
178
- expect(results.get('test-id-2')).toMatchObject({ status: CacheStatus.NEGATIVE });
179
- expect(results.get('test-id-3')).toMatchObject({ status: CacheStatus.MISS });
211
+ expect(results.get(new SingleFieldValueHolder('test-id-2'))).toMatchObject({
212
+ status: CacheStatus.NEGATIVE,
213
+ });
214
+ expect(results.get(new SingleFieldValueHolder('test-id-3'))).toMatchObject({
215
+ status: CacheStatus.MISS,
216
+ });
180
217
  expect(results.size).toBe(3);
181
218
  });
182
219
 
183
220
  it('populates primary adapter with fallback adapter results', async () => {
184
221
  const { primaryCacheAdapter, fallbackCacheAdapter, cacheAdapter } = makeTestCacheAdapters();
185
222
 
186
- const cacheHits = new Map<string, Readonly<BlahFields>>([['test-id-1', { id: 'test-id-1' }]]);
187
- await fallbackCacheAdapter.cacheManyAsync('id', cacheHits);
188
- await fallbackCacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
223
+ const cacheHits = new Map<SingleFieldValueHolder<BlahFields, 'id'>, Readonly<BlahFields>>([
224
+ [new SingleFieldValueHolder('test-id-1'), { id: 'test-id-1' }],
225
+ ]);
226
+ await fallbackCacheAdapter.cacheManyAsync(
227
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
228
+ cacheHits,
229
+ );
230
+ await fallbackCacheAdapter.cacheDBMissesAsync(
231
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
232
+ [new SingleFieldValueHolder('test-id-2')],
233
+ );
189
234
 
190
235
  // should populate primary cache with fallback cache results
191
- await cacheAdapter.loadManyAsync('id', ['test-id-1', 'test-id-2', 'test-id-3']);
192
-
193
- const primaryResults = await primaryCacheAdapter.loadManyAsync('id', [
194
- 'test-id-1',
195
- 'test-id-2',
196
- 'test-id-3',
236
+ await cacheAdapter.loadManyAsync(new SingleFieldHolder<BlahFields, 'id', 'id'>('id'), [
237
+ new SingleFieldValueHolder('test-id-1'),
238
+ new SingleFieldValueHolder('test-id-2'),
239
+ new SingleFieldValueHolder('test-id-3'),
197
240
  ]);
198
241
 
199
- expect(primaryResults.get('test-id-1')).toMatchObject({
242
+ const primaryResults = await primaryCacheAdapter.loadManyAsync(
243
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
244
+ [
245
+ new SingleFieldValueHolder('test-id-1'),
246
+ new SingleFieldValueHolder('test-id-2'),
247
+ new SingleFieldValueHolder('test-id-3'),
248
+ ],
249
+ );
250
+
251
+ expect(primaryResults.get(new SingleFieldValueHolder('test-id-1'))).toMatchObject({
200
252
  status: CacheStatus.HIT,
201
253
  item: { id: 'test-id-1' },
202
254
  });
203
- expect(primaryResults.get('test-id-2')).toMatchObject({ status: CacheStatus.NEGATIVE });
204
- expect(primaryResults.get('test-id-3')).toMatchObject({ status: CacheStatus.MISS });
255
+ expect(primaryResults.get(new SingleFieldValueHolder('test-id-2'))).toMatchObject({
256
+ status: CacheStatus.NEGATIVE,
257
+ });
258
+ expect(primaryResults.get(new SingleFieldValueHolder('test-id-3'))).toMatchObject({
259
+ status: CacheStatus.MISS,
260
+ });
205
261
  expect(primaryResults.size).toBe(3);
206
262
 
207
263
  // ensure that populating the primary cache doesn't change the output
208
- const composedResults = await cacheAdapter.loadManyAsync('id', [
209
- 'test-id-1',
210
- 'test-id-2',
211
- 'test-id-3',
212
- ]);
213
- expect(composedResults.get('test-id-1')).toMatchObject({
264
+ const composedResults = await cacheAdapter.loadManyAsync(
265
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
266
+ [
267
+ new SingleFieldValueHolder('test-id-1'),
268
+ new SingleFieldValueHolder('test-id-2'),
269
+ new SingleFieldValueHolder('test-id-3'),
270
+ ],
271
+ );
272
+ expect(composedResults.get(new SingleFieldValueHolder('test-id-1'))).toMatchObject({
214
273
  status: CacheStatus.HIT,
215
274
  item: { id: 'test-id-1' },
216
275
  });
217
- expect(composedResults.get('test-id-2')).toMatchObject({ status: CacheStatus.NEGATIVE });
218
- expect(composedResults.get('test-id-3')).toMatchObject({ status: CacheStatus.MISS });
276
+ expect(composedResults.get(new SingleFieldValueHolder('test-id-2'))).toMatchObject({
277
+ status: CacheStatus.NEGATIVE,
278
+ });
279
+ expect(composedResults.get(new SingleFieldValueHolder('test-id-3'))).toMatchObject({
280
+ status: CacheStatus.MISS,
281
+ });
219
282
  expect(composedResults.size).toBe(3);
220
283
  });
221
284
 
222
- it('returns empty map when passed empty array of fieldValues', async () => {
285
+ it('returns empty map when passed empty array of values', async () => {
223
286
  const { cacheAdapter } = makeTestCacheAdapters();
224
- const results = await cacheAdapter.loadManyAsync('id', []);
225
- expect(results).toEqual(new Map());
287
+ const results = await cacheAdapter.loadManyAsync(
288
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
289
+ [] as any,
290
+ );
291
+ expect(results.size).toBe(0);
226
292
  });
227
293
 
228
294
  it('handles 0 cache adapter compose case', async () => {
229
- const cacheAdapter = new ComposedEntityCacheAdapter<any>([]);
230
- const results = await cacheAdapter.loadManyAsync('id', []);
231
- expect(results).toEqual(new Map());
295
+ const cacheAdapter = new ComposedEntityCacheAdapter<BlahFields, 'id'>([]);
296
+ const results = await cacheAdapter.loadManyAsync(
297
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
298
+ [] as any,
299
+ );
300
+ expect(results.size).toBe(0);
232
301
  });
233
302
  });
234
303
 
@@ -242,14 +311,23 @@ describe(ComposedEntityCacheAdapter, () => {
242
311
  cacheAdapter,
243
312
  } = makeTestCacheAdapters();
244
313
 
245
- await cacheAdapter.cacheManyAsync('id', new Map([['test-id-1', { id: 'test-id-1' }]]));
314
+ await cacheAdapter.cacheManyAsync(
315
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
316
+ new Map([[new SingleFieldValueHolder('test-id-1'), { id: 'test-id-1' }]]),
317
+ );
246
318
 
247
- const primaryLocalMemoryCacheKey = primaryCacheAdapter['makeCacheKey']('id', 'test-id-1');
319
+ const primaryLocalMemoryCacheKey = primaryCacheAdapter['makeCacheKey'](
320
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
321
+ new SingleFieldValueHolder('test-id-1'),
322
+ );
248
323
  expect(primaryCache.get(primaryLocalMemoryCacheKey)).toMatchObject({
249
324
  id: 'test-id-1',
250
325
  });
251
326
 
252
- const fallbackLocalMemoryCacheKey = fallbackCacheAdapter['makeCacheKey']('id', 'test-id-1');
327
+ const fallbackLocalMemoryCacheKey = fallbackCacheAdapter['makeCacheKey'](
328
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
329
+ new SingleFieldValueHolder('test-id-1'),
330
+ );
253
331
  expect(fallbackCache.get(fallbackLocalMemoryCacheKey)).toMatchObject({
254
332
  id: 'test-id-1',
255
333
  });
@@ -266,12 +344,20 @@ describe(ComposedEntityCacheAdapter, () => {
266
344
  cacheAdapter,
267
345
  } = makeTestCacheAdapters();
268
346
 
269
- await cacheAdapter.cacheDBMissesAsync('id', ['test-id-1']);
347
+ await cacheAdapter.cacheDBMissesAsync(new SingleFieldHolder<BlahFields, 'id', 'id'>('id'), [
348
+ new SingleFieldValueHolder('test-id-1'),
349
+ ]);
270
350
 
271
- const primaryLocalMemoryCacheKey = primaryCacheAdapter['makeCacheKey']('id', 'test-id-1');
351
+ const primaryLocalMemoryCacheKey = primaryCacheAdapter['makeCacheKey'](
352
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
353
+ new SingleFieldValueHolder('test-id-1'),
354
+ );
272
355
  expect(primaryCache.get(primaryLocalMemoryCacheKey)).toBe(DOES_NOT_EXIST_LOCAL_MEMORY_CACHE);
273
356
 
274
- const fallbackLocalMemoryCacheKey = fallbackCacheAdapter['makeCacheKey']('id', 'test-id-1');
357
+ const fallbackLocalMemoryCacheKey = fallbackCacheAdapter['makeCacheKey'](
358
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
359
+ new SingleFieldValueHolder('test-id-1'),
360
+ );
275
361
  expect(fallbackCache.get(fallbackLocalMemoryCacheKey)).toBe(
276
362
  DOES_NOT_EXIST_LOCAL_MEMORY_CACHE,
277
363
  );
@@ -288,29 +374,61 @@ describe(ComposedEntityCacheAdapter, () => {
288
374
  cacheAdapter,
289
375
  } = makeTestCacheAdapters();
290
376
 
291
- const cacheHits = new Map<string, Readonly<BlahFields>>([['test-id-1', { id: 'test-id-1' }]]);
292
- await primaryCacheAdapter.cacheManyAsync('id', cacheHits);
293
- await primaryCacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
294
- await fallbackCacheAdapter.cacheManyAsync('id', cacheHits);
295
- await fallbackCacheAdapter.cacheDBMissesAsync('id', ['test-id-2']);
377
+ const cacheHits = new Map<SingleFieldValueHolder<BlahFields, 'id'>, Readonly<BlahFields>>([
378
+ [new SingleFieldValueHolder('test-id-1'), { id: 'test-id-1' }],
379
+ ]);
380
+ await primaryCacheAdapter.cacheManyAsync(
381
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
382
+ cacheHits,
383
+ );
384
+ await primaryCacheAdapter.cacheDBMissesAsync(
385
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
386
+ [new SingleFieldValueHolder('test-id-2')],
387
+ );
388
+ await fallbackCacheAdapter.cacheManyAsync(
389
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
390
+ cacheHits,
391
+ );
392
+ await fallbackCacheAdapter.cacheDBMissesAsync(
393
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
394
+ [new SingleFieldValueHolder('test-id-2')],
395
+ );
296
396
 
297
- await cacheAdapter.invalidateManyAsync('id', ['test-id-1', 'test-id-2']);
397
+ await cacheAdapter.invalidateManyAsync(new SingleFieldHolder<BlahFields, 'id', 'id'>('id'), [
398
+ new SingleFieldValueHolder('test-id-1'),
399
+ new SingleFieldValueHolder('test-id-2'),
400
+ ]);
298
401
 
299
- const primaryLocalMemoryCacheKey1 = primaryCacheAdapter['makeCacheKey']('id', 'test-id-1');
402
+ const primaryLocalMemoryCacheKey1 = primaryCacheAdapter['makeCacheKey'](
403
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
404
+ new SingleFieldValueHolder('test-id-1'),
405
+ );
300
406
  expect(primaryCache.get(primaryLocalMemoryCacheKey1)).toBe(undefined);
301
- const primaryLocalMemoryCacheKey2 = primaryCacheAdapter['makeCacheKey']('id', 'test-id-1');
407
+ const primaryLocalMemoryCacheKey2 = primaryCacheAdapter['makeCacheKey'](
408
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
409
+ new SingleFieldValueHolder('test-id-1'),
410
+ );
302
411
  expect(primaryCache.get(primaryLocalMemoryCacheKey2)).toBe(undefined);
303
412
 
304
- const fallbackLocalMemoryCacheKey1 = fallbackCacheAdapter['makeCacheKey']('id', 'test-id-1');
413
+ const fallbackLocalMemoryCacheKey1 = fallbackCacheAdapter['makeCacheKey'](
414
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
415
+ new SingleFieldValueHolder('test-id-1'),
416
+ );
305
417
  expect(fallbackCache.get(fallbackLocalMemoryCacheKey1)).toBe(undefined);
306
- const fallbackLocalMemoryCacheKey2 = fallbackCacheAdapter['makeCacheKey']('id', 'test-id-1');
418
+ const fallbackLocalMemoryCacheKey2 = fallbackCacheAdapter['makeCacheKey'](
419
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
420
+ new SingleFieldValueHolder('test-id-1'),
421
+ );
307
422
  expect(fallbackCache.get(fallbackLocalMemoryCacheKey2)).toBe(undefined);
308
423
  });
309
424
 
310
425
  it('returns when passed empty array of fieldValues', async () => {
311
426
  const { cacheAdapter } = makeTestCacheAdapters();
312
427
 
313
- await cacheAdapter.invalidateManyAsync('id', []);
428
+ await cacheAdapter.invalidateManyAsync(
429
+ new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
430
+ [] as any,
431
+ );
314
432
  });
315
433
  });
316
434
  });
@@ -3,6 +3,8 @@ import { mock, instance, when, anything } from 'ts-mockito';
3
3
 
4
4
  import AuthorizationResultBasedEntityLoader from '../AuthorizationResultBasedEntityLoader';
5
5
  import EnforcingEntityLoader from '../EnforcingEntityLoader';
6
+ import { CompositeFieldValueHolder } from '../internal/CompositeFieldHolder';
7
+ import { CompositeFieldValueMap } from '../internal/CompositeFieldValueMap';
6
8
 
7
9
  describe(EnforcingEntityLoader, () => {
8
10
  describe('loadManyByFieldEqualingManyAsync', () => {
@@ -55,6 +57,133 @@ describe(EnforcingEntityLoader, () => {
55
57
  });
56
58
  });
57
59
 
60
+ describe('loadManyByCompositeFieldEqualingManyAsync', () => {
61
+ it('throws when result is unsuccessful', async () => {
62
+ const nonEnforcingEntityLoaderMock = mock<
63
+ AuthorizationResultBasedEntityLoader<any, any, any, any, any, any>
64
+ >(AuthorizationResultBasedEntityLoader);
65
+ const rejection = new Error();
66
+ when(
67
+ nonEnforcingEntityLoaderMock.loadManyByCompositeFieldEqualingManyAsync(
68
+ anything(),
69
+ anything(),
70
+ ),
71
+ ).thenResolve(
72
+ new CompositeFieldValueMap([
73
+ [new CompositeFieldValueHolder({ wat: 'hello' }), [result(rejection)]],
74
+ ]),
75
+ );
76
+ const nonEnforcingEntityLoader = instance(nonEnforcingEntityLoaderMock);
77
+ const enforcingEntityLoader = new EnforcingEntityLoader(nonEnforcingEntityLoader);
78
+ await expect(
79
+ enforcingEntityLoader.loadManyByCompositeFieldEqualingManyAsync(anything(), anything()),
80
+ ).rejects.toThrow(rejection);
81
+ });
82
+
83
+ it('returns value when result is successful', async () => {
84
+ const nonEnforcingEntityLoaderMock = mock<
85
+ AuthorizationResultBasedEntityLoader<any, any, any, any, any, any>
86
+ >(AuthorizationResultBasedEntityLoader);
87
+
88
+ const resolved = {};
89
+ when(
90
+ nonEnforcingEntityLoaderMock.loadManyByCompositeFieldEqualingManyAsync(
91
+ anything(),
92
+ anything(),
93
+ ),
94
+ ).thenResolve(
95
+ new CompositeFieldValueMap([
96
+ [new CompositeFieldValueHolder({ wat: 'hello' }), [result(resolved)]],
97
+ ]),
98
+ );
99
+
100
+ const nonEnforcingEntityLoader = instance(nonEnforcingEntityLoaderMock);
101
+ const enforcingEntityLoader = new EnforcingEntityLoader(nonEnforcingEntityLoader);
102
+
103
+ await expect(
104
+ enforcingEntityLoader.loadManyByCompositeFieldEqualingManyAsync(anything(), anything()),
105
+ ).resolves.toEqual(
106
+ new CompositeFieldValueMap([[new CompositeFieldValueHolder({ wat: 'hello' }), [resolved]]]),
107
+ );
108
+ });
109
+ });
110
+
111
+ describe('loadManyByCompositeFieldEqualingAsync', () => {
112
+ it('throws when result is unsuccessful', async () => {
113
+ const nonEnforcingEntityLoaderMock = mock<
114
+ AuthorizationResultBasedEntityLoader<any, any, any, any, any, any>
115
+ >(AuthorizationResultBasedEntityLoader);
116
+
117
+ const rejection = new Error();
118
+ when(
119
+ nonEnforcingEntityLoaderMock.loadManyByCompositeFieldEqualingAsync(anything(), anything()),
120
+ ).thenResolve([result(rejection)]);
121
+
122
+ const nonEnforcingEntityLoader = instance(nonEnforcingEntityLoaderMock);
123
+ const enforcingEntityLoader = new EnforcingEntityLoader(nonEnforcingEntityLoader);
124
+
125
+ await expect(
126
+ enforcingEntityLoader.loadManyByCompositeFieldEqualingAsync(anything(), anything()),
127
+ ).rejects.toThrow(rejection);
128
+ });
129
+
130
+ it('returns value when result is successful', async () => {
131
+ const nonEnforcingEntityLoaderMock = mock<
132
+ AuthorizationResultBasedEntityLoader<any, any, any, any, any, any>
133
+ >(AuthorizationResultBasedEntityLoader);
134
+
135
+ const resolved = {};
136
+ when(
137
+ nonEnforcingEntityLoaderMock.loadManyByCompositeFieldEqualingAsync(anything(), anything()),
138
+ ).thenResolve([result(resolved)]);
139
+
140
+ const nonEnforcingEntityLoader = instance(nonEnforcingEntityLoaderMock);
141
+ const enforcingEntityLoader = new EnforcingEntityLoader(nonEnforcingEntityLoader);
142
+
143
+ await expect(
144
+ enforcingEntityLoader.loadManyByCompositeFieldEqualingAsync(anything(), anything()),
145
+ ).resolves.toEqual([resolved]);
146
+ });
147
+ });
148
+
149
+ describe('loadByCompositeFieldEqualingAsync', () => {
150
+ it('throws when result is unsuccessful', async () => {
151
+ const nonEnforcingEntityLoaderMock = mock<
152
+ AuthorizationResultBasedEntityLoader<any, any, any, any, any, any>
153
+ >(AuthorizationResultBasedEntityLoader);
154
+
155
+ const rejection = new Error();
156
+ when(
157
+ nonEnforcingEntityLoaderMock.loadByCompositeFieldEqualingAsync(anything(), anything()),
158
+ ).thenResolve(result(rejection));
159
+
160
+ const nonEnforcingEntityLoader = instance(nonEnforcingEntityLoaderMock);
161
+ const enforcingEntityLoader = new EnforcingEntityLoader(nonEnforcingEntityLoader);
162
+
163
+ await expect(
164
+ enforcingEntityLoader.loadByCompositeFieldEqualingAsync(anything(), anything()),
165
+ ).rejects.toThrow(rejection);
166
+ });
167
+
168
+ it('returns value when result is successful', async () => {
169
+ const nonEnforcingEntityLoaderMock = mock<
170
+ AuthorizationResultBasedEntityLoader<any, any, any, any, any, any>
171
+ >(AuthorizationResultBasedEntityLoader);
172
+
173
+ const resolved = {};
174
+ when(
175
+ nonEnforcingEntityLoaderMock.loadByCompositeFieldEqualingAsync(anything(), anything()),
176
+ ).thenResolve(result(resolved));
177
+
178
+ const nonEnforcingEntityLoader = instance(nonEnforcingEntityLoaderMock);
179
+ const enforcingEntityLoader = new EnforcingEntityLoader(nonEnforcingEntityLoader);
180
+
181
+ await expect(
182
+ enforcingEntityLoader.loadByCompositeFieldEqualingAsync(anything(), anything()),
183
+ ).resolves.toEqual(resolved);
184
+ });
185
+ });
186
+
58
187
  describe('loadManyByFieldEqualingAsync', () => {
59
188
  it('throws when result is unsuccessful', async () => {
60
189
  const nonEnforcingEntityLoaderMock = mock<
@@ -449,7 +578,12 @@ describe(EnforcingEntityLoader, () => {
449
578
  );
450
579
 
451
580
  // ensure known differences still exist for sanity check
452
- const knownLoaderOnlyDifferences = ['validateFieldValues'];
581
+ const knownLoaderOnlyDifferences = [
582
+ 'validateFieldAndValues',
583
+ 'validateFieldAndValuesAndConvertToHolders',
584
+ 'validateCompositeFieldAndValuesAndConvertToHolders',
585
+ 'constructAndAuthorizeEntitiesFromCompositeFieldValueHolderMapAsync',
586
+ ];
453
587
  expect(nonEnforcingLoaderProperties).toEqual(
454
588
  expect.arrayContaining(knownLoaderOnlyDifferences),
455
589
  );