@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
@@ -28,13 +28,13 @@ import IEntityMetricsAdapter, { EntityMetricsMutationType } from './metrics/IEnt
28
28
  import { mapMapAsync } from './utils/collections/maps';
29
29
 
30
30
  abstract class AuthorizationResultBasedBaseMutator<
31
- TFields extends object,
32
- TID extends NonNullable<TFields[TSelectedFields]>,
31
+ TFields extends Record<string, any>,
32
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
33
33
  TViewerContext extends ViewerContext,
34
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
34
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
35
35
  TPrivacyPolicy extends EntityPrivacyPolicy<
36
36
  TFields,
37
- TID,
37
+ TIDField,
38
38
  TViewerContext,
39
39
  TEntity,
40
40
  TSelectedFields
@@ -45,10 +45,10 @@ abstract class AuthorizationResultBasedBaseMutator<
45
45
  protected readonly companionProvider: EntityCompanionProvider,
46
46
  protected readonly viewerContext: TViewerContext,
47
47
  protected readonly queryContext: EntityQueryContext,
48
- protected readonly entityConfiguration: EntityConfiguration<TFields>,
48
+ protected readonly entityConfiguration: EntityConfiguration<TFields, TIDField>,
49
49
  protected readonly entityClass: IEntityClass<
50
50
  TFields,
51
- TID,
51
+ TIDField,
52
52
  TViewerContext,
53
53
  TEntity,
54
54
  TPrivacyPolicy,
@@ -57,27 +57,27 @@ abstract class AuthorizationResultBasedBaseMutator<
57
57
  protected readonly privacyPolicy: TPrivacyPolicy,
58
58
  protected readonly mutationValidators: EntityMutationValidator<
59
59
  TFields,
60
- TID,
60
+ TIDField,
61
61
  TViewerContext,
62
62
  TEntity,
63
63
  TSelectedFields
64
64
  >[],
65
65
  protected readonly mutationTriggers: EntityMutationTriggerConfiguration<
66
66
  TFields,
67
- TID,
67
+ TIDField,
68
68
  TViewerContext,
69
69
  TEntity,
70
70
  TSelectedFields
71
71
  >,
72
72
  protected readonly entityLoaderFactory: EntityLoaderFactory<
73
73
  TFields,
74
- TID,
74
+ TIDField,
75
75
  TViewerContext,
76
76
  TEntity,
77
77
  TPrivacyPolicy,
78
78
  TSelectedFields
79
79
  >,
80
- protected readonly databaseAdapter: EntityDatabaseAdapter<TFields>,
80
+ protected readonly databaseAdapter: EntityDatabaseAdapter<TFields, TIDField>,
81
81
  protected readonly metricsAdapter: IEntityMetricsAdapter,
82
82
  ) {}
83
83
 
@@ -88,18 +88,32 @@ abstract class AuthorizationResultBasedBaseMutator<
88
88
  invariant(fieldDefinition, `must have field definition for field = ${fieldName}`);
89
89
  const isInputValid = fieldDefinition.validateInputValue(fieldValue);
90
90
  if (!isInputValid) {
91
- throw new EntityInvalidFieldValueError(this.entityClass, fieldName, fieldValue);
91
+ throw new EntityInvalidFieldValueError<
92
+ TFields,
93
+ TIDField,
94
+ TViewerContext,
95
+ TEntity,
96
+ TPrivacyPolicy,
97
+ keyof TFields,
98
+ TSelectedFields
99
+ >(this.entityClass, fieldName, fieldValue);
92
100
  }
93
101
  }
94
102
  }
95
103
 
96
104
  protected async executeMutationValidatorsAsync(
97
- validators: EntityMutationValidator<TFields, TID, TViewerContext, TEntity, TSelectedFields>[],
105
+ validators: EntityMutationValidator<
106
+ TFields,
107
+ TIDField,
108
+ TViewerContext,
109
+ TEntity,
110
+ TSelectedFields
111
+ >[],
98
112
  queryContext: EntityTransactionalQueryContext,
99
113
  entity: TEntity,
100
114
  mutationInfo: EntityValidatorMutationInfo<
101
115
  TFields,
102
- TID,
116
+ TIDField,
103
117
  TViewerContext,
104
118
  TEntity,
105
119
  TSelectedFields
@@ -114,11 +128,17 @@ abstract class AuthorizationResultBasedBaseMutator<
114
128
 
115
129
  protected async executeMutationTriggersAsync(
116
130
  triggers:
117
- | EntityMutationTrigger<TFields, TID, TViewerContext, TEntity, TSelectedFields>[]
131
+ | EntityMutationTrigger<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[]
118
132
  | undefined,
119
133
  queryContext: EntityTransactionalQueryContext,
120
134
  entity: TEntity,
121
- mutationInfo: EntityTriggerMutationInfo<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
135
+ mutationInfo: EntityTriggerMutationInfo<
136
+ TFields,
137
+ TIDField,
138
+ TViewerContext,
139
+ TEntity,
140
+ TSelectedFields
141
+ >,
122
142
  ): Promise<void> {
123
143
  if (!triggers) {
124
144
  return;
@@ -134,14 +154,20 @@ abstract class AuthorizationResultBasedBaseMutator<
134
154
  triggers:
135
155
  | EntityNonTransactionalMutationTrigger<
136
156
  TFields,
137
- TID,
157
+ TIDField,
138
158
  TViewerContext,
139
159
  TEntity,
140
160
  TSelectedFields
141
161
  >[]
142
162
  | undefined,
143
163
  entity: TEntity,
144
- mutationInfo: EntityTriggerMutationInfo<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
164
+ mutationInfo: EntityTriggerMutationInfo<
165
+ TFields,
166
+ TIDField,
167
+ TViewerContext,
168
+ TEntity,
169
+ TSelectedFields
170
+ >,
145
171
  ): Promise<void> {
146
172
  if (!triggers) {
147
173
  return;
@@ -156,13 +182,13 @@ abstract class AuthorizationResultBasedBaseMutator<
156
182
  * Mutator for creating a new entity.
157
183
  */
158
184
  export class AuthorizationResultBasedCreateMutator<
159
- TFields extends object,
160
- TID extends NonNullable<TFields[TSelectedFields]>,
185
+ TFields extends Record<string, any>,
186
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
161
187
  TViewerContext extends ViewerContext,
162
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
188
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
163
189
  TPrivacyPolicy extends EntityPrivacyPolicy<
164
190
  TFields,
165
- TID,
191
+ TIDField,
166
192
  TViewerContext,
167
193
  TEntity,
168
194
  TSelectedFields
@@ -170,7 +196,7 @@ export class AuthorizationResultBasedCreateMutator<
170
196
  TSelectedFields extends keyof TFields,
171
197
  > extends AuthorizationResultBasedBaseMutator<
172
198
  TFields,
173
- TID,
199
+ TIDField,
174
200
  TViewerContext,
175
201
  TEntity,
176
202
  TPrivacyPolicy,
@@ -295,13 +321,13 @@ export class AuthorizationResultBasedCreateMutator<
295
321
  * Mutator for updating an existing entity.
296
322
  */
297
323
  export class AuthorizationResultBasedUpdateMutator<
298
- TFields extends object,
299
- TID extends NonNullable<TFields[TSelectedFields]>,
324
+ TFields extends Record<string, any>,
325
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
300
326
  TViewerContext extends ViewerContext,
301
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
327
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
302
328
  TPrivacyPolicy extends EntityPrivacyPolicy<
303
329
  TFields,
304
- TID,
330
+ TIDField,
305
331
  TViewerContext,
306
332
  TEntity,
307
333
  TSelectedFields
@@ -309,7 +335,7 @@ export class AuthorizationResultBasedUpdateMutator<
309
335
  TSelectedFields extends keyof TFields,
310
336
  > extends AuthorizationResultBasedBaseMutator<
311
337
  TFields,
312
- TID,
338
+ TIDField,
313
339
  TViewerContext,
314
340
  TEntity,
315
341
  TPrivacyPolicy,
@@ -323,10 +349,10 @@ export class AuthorizationResultBasedUpdateMutator<
323
349
  companionProvider: EntityCompanionProvider,
324
350
  viewerContext: TViewerContext,
325
351
  queryContext: EntityQueryContext,
326
- entityConfiguration: EntityConfiguration<TFields>,
352
+ entityConfiguration: EntityConfiguration<TFields, TIDField>,
327
353
  entityClass: IEntityClass<
328
354
  TFields,
329
- TID,
355
+ TIDField,
330
356
  TViewerContext,
331
357
  TEntity,
332
358
  TPrivacyPolicy,
@@ -335,27 +361,27 @@ export class AuthorizationResultBasedUpdateMutator<
335
361
  privacyPolicy: TPrivacyPolicy,
336
362
  mutationValidators: EntityMutationValidator<
337
363
  TFields,
338
- TID,
364
+ TIDField,
339
365
  TViewerContext,
340
366
  TEntity,
341
367
  TSelectedFields
342
368
  >[],
343
369
  mutationTriggers: EntityMutationTriggerConfiguration<
344
370
  TFields,
345
- TID,
371
+ TIDField,
346
372
  TViewerContext,
347
373
  TEntity,
348
374
  TSelectedFields
349
375
  >,
350
376
  entityLoaderFactory: EntityLoaderFactory<
351
377
  TFields,
352
- TID,
378
+ TIDField,
353
379
  TViewerContext,
354
380
  TEntity,
355
381
  TPrivacyPolicy,
356
382
  TSelectedFields
357
383
  >,
358
- databaseAdapter: EntityDatabaseAdapter<TFields>,
384
+ databaseAdapter: EntityDatabaseAdapter<TFields, TIDField>,
359
385
  metricsAdapter: IEntityMetricsAdapter,
360
386
  originalEntity: TEntity,
361
387
  ) {
@@ -529,13 +555,13 @@ export class AuthorizationResultBasedUpdateMutator<
529
555
  * Mutator for deleting an existing entity.
530
556
  */
531
557
  export class AuthorizationResultBasedDeleteMutator<
532
- TFields extends object,
533
- TID extends NonNullable<TFields[TSelectedFields]>,
558
+ TFields extends Record<string, any>,
559
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
534
560
  TViewerContext extends ViewerContext,
535
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
561
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
536
562
  TPrivacyPolicy extends EntityPrivacyPolicy<
537
563
  TFields,
538
- TID,
564
+ TIDField,
539
565
  TViewerContext,
540
566
  TEntity,
541
567
  TSelectedFields
@@ -543,7 +569,7 @@ export class AuthorizationResultBasedDeleteMutator<
543
569
  TSelectedFields extends keyof TFields,
544
570
  > extends AuthorizationResultBasedBaseMutator<
545
571
  TFields,
546
- TID,
572
+ TIDField,
547
573
  TViewerContext,
548
574
  TEntity,
549
575
  TPrivacyPolicy,
@@ -553,10 +579,10 @@ export class AuthorizationResultBasedDeleteMutator<
553
579
  companionProvider: EntityCompanionProvider,
554
580
  viewerContext: TViewerContext,
555
581
  queryContext: EntityQueryContext,
556
- entityConfiguration: EntityConfiguration<TFields>,
582
+ entityConfiguration: EntityConfiguration<TFields, TIDField>,
557
583
  entityClass: IEntityClass<
558
584
  TFields,
559
- TID,
585
+ TIDField,
560
586
  TViewerContext,
561
587
  TEntity,
562
588
  TPrivacyPolicy,
@@ -565,27 +591,27 @@ export class AuthorizationResultBasedDeleteMutator<
565
591
  privacyPolicy: TPrivacyPolicy,
566
592
  mutationValidators: EntityMutationValidator<
567
593
  TFields,
568
- TID,
594
+ TIDField,
569
595
  TViewerContext,
570
596
  TEntity,
571
597
  TSelectedFields
572
598
  >[],
573
599
  mutationTriggers: EntityMutationTriggerConfiguration<
574
600
  TFields,
575
- TID,
601
+ TIDField,
576
602
  TViewerContext,
577
603
  TEntity,
578
604
  TSelectedFields
579
605
  >,
580
606
  entityLoaderFactory: EntityLoaderFactory<
581
607
  TFields,
582
- TID,
608
+ TIDField,
583
609
  TViewerContext,
584
610
  TEntity,
585
611
  TPrivacyPolicy,
586
612
  TSelectedFields
587
613
  >,
588
- databaseAdapter: EntityDatabaseAdapter<TFields>,
614
+ databaseAdapter: EntityDatabaseAdapter<TFields, TIDField>,
589
615
  metricsAdapter: IEntityMetricsAdapter,
590
616
  private readonly entity: TEntity,
591
617
  ) {
@@ -743,7 +769,7 @@ export class AuthorizationResultBasedDeleteMutator<
743
769
  const companionDefinition = this.companionProvider.getCompanionForEntity(
744
770
  entity.constructor as IEntityClass<
745
771
  TFields,
746
- TID,
772
+ TIDField,
747
773
  TViewerContext,
748
774
  TEntity,
749
775
  TPrivacyPolicy,
@@ -1,49 +1,55 @@
1
1
  import nullthrows from 'nullthrows';
2
2
 
3
3
  import IEntityCacheAdapter from './IEntityCacheAdapter';
4
+ import { IEntityLoadKey, IEntityLoadValue } from './internal/EntityLoadInterfaces';
4
5
  import { CacheStatus, CacheLoadResult } from './internal/ReadThroughEntityCache';
5
6
 
6
7
  /**
7
8
  * A IEntityCacheAdapter that composes other IEntityCacheAdapter instances.
8
9
  */
9
- export default class ComposedEntityCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
10
+ export default class ComposedEntityCacheAdapter<
11
+ TFields extends Record<string, any>,
12
+ TIDField extends keyof TFields,
13
+ > implements IEntityCacheAdapter<TFields, TIDField>
14
+ {
10
15
  /**
11
16
  * @param cacheAdapters - list of cache adapters to compose in order of precedence.
12
17
  * Earlier cache adapters are read from first and written to (including invalidations) last.
13
18
  * Typically, caches closer to the application should be ordered before caches closer to the database.
14
19
  * A lower layer cache is closer to the database, while a higher layer cache is closer to the application.
15
20
  */
16
- constructor(private readonly cacheAdapters: IEntityCacheAdapter<TFields>[]) {}
21
+ constructor(private readonly cacheAdapters: IEntityCacheAdapter<TFields, TIDField>[]) {}
17
22
 
18
- public async loadManyAsync<N extends keyof TFields>(
19
- fieldName: N,
20
- fieldValues: readonly NonNullable<TFields[N]>[],
21
- ): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>> {
22
- const retMap = new Map<NonNullable<TFields[N]>, CacheLoadResult<TFields>>();
23
- const fulfilledFieldValuesByCacheIndex: NonNullable<TFields[N]>[][] = Array.from(
23
+ public async loadManyAsync<
24
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
25
+ TSerializedLoadValue,
26
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
27
+ >(
28
+ key: TLoadKey,
29
+ values: readonly TLoadValue[],
30
+ ): Promise<ReadonlyMap<TLoadValue, CacheLoadResult<TFields>>> {
31
+ const retMap = key.vendNewLoadValueMap<CacheLoadResult<TFields>>();
32
+ const fulfilledValuesByCacheIndex: TLoadValue[][] = Array.from(
24
33
  { length: this.cacheAdapters.length },
25
34
  () => [],
26
35
  );
27
36
 
28
- let unfulfilledFieldValues = fieldValues;
37
+ let unfulfilledValues = values;
29
38
  for (let i = 0; i < this.cacheAdapters.length; i++) {
30
39
  const cacheAdapter = nullthrows(this.cacheAdapters[i]);
31
- const cacheResultsFromAdapter = await cacheAdapter.loadManyAsync(
32
- fieldName,
33
- unfulfilledFieldValues,
34
- );
40
+ const cacheResultsFromAdapter = await cacheAdapter.loadManyAsync(key, unfulfilledValues);
35
41
 
36
- const newUnfulfilledFieldValues = [];
37
- for (const [fieldValue, cacheResult] of cacheResultsFromAdapter) {
42
+ const newUnfulfilledValues = [];
43
+ for (const [value, cacheResult] of cacheResultsFromAdapter) {
38
44
  if (cacheResult.status === CacheStatus.MISS) {
39
- newUnfulfilledFieldValues.push(fieldValue);
45
+ newUnfulfilledValues.push(value);
40
46
  } else {
41
- retMap.set(fieldValue, cacheResult);
42
- nullthrows(fulfilledFieldValuesByCacheIndex[i]).push(fieldValue);
47
+ retMap.set(value, cacheResult);
48
+ nullthrows(fulfilledValuesByCacheIndex[i]).push(value);
43
49
  }
44
50
  }
45
- unfulfilledFieldValues = newUnfulfilledFieldValues;
46
- if (unfulfilledFieldValues.length === 0) {
51
+ unfulfilledValues = newUnfulfilledValues;
52
+ if (unfulfilledValues.length === 0) {
47
53
  break;
48
54
  }
49
55
  }
@@ -52,69 +58,72 @@ export default class ComposedEntityCacheAdapter<TFields> implements IEntityCache
52
58
  // Write to lower layers first
53
59
  for (let i = this.cacheAdapters.length - 1; i >= 0; i--) {
54
60
  const cacheAdapter = nullthrows(this.cacheAdapters[i]);
55
- const hitsToCache = new Map<NonNullable<TFields[N]>, Readonly<TFields>>();
56
- const negativesToCache: NonNullable<TFields[N]>[] = [];
61
+ const hitsToCache = key.vendNewLoadValueMap<Readonly<TFields>>();
62
+ const negativesToCache: TLoadValue[] = [];
57
63
 
58
64
  // Loop over all lower layer caches to collect hits and misses
59
65
  for (let j = i + 1; j < this.cacheAdapters.length; j++) {
60
- const fulfilledFieldValues = nullthrows(fulfilledFieldValuesByCacheIndex[j]);
61
- fulfilledFieldValues.forEach((fieldValue) => {
62
- const cacheResult = nullthrows(retMap.get(fieldValue));
66
+ const fulfilledValues = nullthrows(fulfilledValuesByCacheIndex[j]);
67
+ fulfilledValues.forEach((value) => {
68
+ const cacheResult = nullthrows(retMap.get(value));
63
69
  if (cacheResult.status === CacheStatus.HIT) {
64
- hitsToCache.set(fieldValue, cacheResult.item);
70
+ hitsToCache.set(value, cacheResult.item);
65
71
  } else if (cacheResult.status === CacheStatus.NEGATIVE) {
66
- negativesToCache.push(fieldValue);
72
+ negativesToCache.push(value);
67
73
  }
68
74
  });
69
75
  }
70
76
 
71
77
  const promises = [];
72
78
  if (hitsToCache.size > 0) {
73
- promises.push(cacheAdapter.cacheManyAsync(fieldName, hitsToCache));
79
+ promises.push(cacheAdapter.cacheManyAsync(key, hitsToCache));
74
80
  }
75
81
  if (negativesToCache.length > 0) {
76
- promises.push(cacheAdapter.cacheDBMissesAsync(fieldName, negativesToCache));
82
+ promises.push(cacheAdapter.cacheDBMissesAsync(key, negativesToCache));
77
83
  }
78
84
  await Promise.all(promises);
79
85
  }
80
86
 
81
- for (const fieldValue of unfulfilledFieldValues) {
82
- retMap.set(fieldValue, { status: CacheStatus.MISS });
87
+ for (const value of unfulfilledValues) {
88
+ retMap.set(value, { status: CacheStatus.MISS });
83
89
  }
84
90
 
85
91
  return retMap;
86
92
  }
87
93
 
88
- public async cacheManyAsync<N extends keyof TFields>(
89
- fieldName: N,
90
- objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>,
91
- ): Promise<void> {
94
+ public async cacheManyAsync<
95
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
96
+ TSerializedLoadValue,
97
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
98
+ >(key: TLoadKey, objectMap: ReadonlyMap<TLoadValue, Readonly<TFields>>): Promise<void> {
92
99
  // write to lower layers first
93
100
  for (let i = this.cacheAdapters.length - 1; i >= 0; i--) {
94
101
  const cacheAdapter = nullthrows(this.cacheAdapters[i]);
95
- await cacheAdapter.cacheManyAsync(fieldName, objectMap);
102
+ await cacheAdapter.cacheManyAsync(key, objectMap);
96
103
  }
97
104
  }
98
105
 
99
- public async cacheDBMissesAsync<N extends keyof TFields>(
100
- fieldName: N,
101
- fieldValues: readonly NonNullable<TFields[N]>[],
102
- ): Promise<void> {
106
+ public async cacheDBMissesAsync<
107
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
108
+ TSerializedLoadValue,
109
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
110
+ >(key: TLoadKey, values: readonly TLoadValue[]): Promise<void> {
103
111
  // write to lower layers first
104
112
  for (let i = this.cacheAdapters.length - 1; i >= 0; i--) {
105
113
  const cacheAdapter = nullthrows(this.cacheAdapters[i]);
106
- await cacheAdapter.cacheDBMissesAsync(fieldName, fieldValues);
114
+ await cacheAdapter.cacheDBMissesAsync(key, values);
107
115
  }
108
116
  }
109
117
 
110
- public async invalidateManyAsync<N extends keyof TFields>(
111
- fieldName: N,
112
- fieldValues: readonly NonNullable<TFields[N]>[],
113
- ): Promise<void> {
118
+ public async invalidateManyAsync<
119
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
120
+ TSerializedLoadValue,
121
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
122
+ >(key: TLoadKey, values: readonly TLoadValue[]): Promise<void> {
114
123
  // delete from lower layers first
115
124
  for (let i = this.cacheAdapters.length - 1; i >= 0; i--) {
116
125
  const cacheAdapter = nullthrows(this.cacheAdapters[i]);
117
- await cacheAdapter.invalidateManyAsync(fieldName, fieldValues);
126
+ await cacheAdapter.invalidateManyAsync(key, values);
118
127
  }
119
128
  }
120
129
  }
@@ -5,7 +5,7 @@ import { ISecondaryEntityCache } from './EntitySecondaryCacheLoader';
5
5
  /**
6
6
  * A ISecondaryEntityCache that composes other ISecondaryEntityCache instances.
7
7
  */
8
- export default class ComposedSecondaryEntityCache<TLoadParams, TFields>
8
+ export default class ComposedSecondaryEntityCache<TLoadParams, TFields extends Record<string, any>>
9
9
  implements ISecondaryEntityCache<TFields, TLoadParams>
10
10
  {
11
11
  /**
@@ -30,7 +30,10 @@ export default class ComposedSecondaryEntityCache<TLoadParams, TFields>
30
30
  );
31
31
  }
32
32
 
33
- private static async loadManyThroughRecursivelyAsync<TLoadParams, TFields>(
33
+ private static async loadManyThroughRecursivelyAsync<
34
+ TLoadParams,
35
+ TFields extends Record<string, any>,
36
+ >(
34
37
  secondaryEntityCaches: ISecondaryEntityCache<TFields, TLoadParams>[],
35
38
  loadParamsArray: readonly Readonly<TLoadParams>[],
36
39
  fetcher: (