@expo/entity 0.41.0 → 0.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (430) hide show
  1. package/build/AuthorizationResultBasedEntityAssociationLoader.d.ts +16 -16
  2. package/build/AuthorizationResultBasedEntityAssociationLoader.js.map +1 -1
  3. package/build/AuthorizationResultBasedEntityLoader.d.ts +39 -67
  4. package/build/AuthorizationResultBasedEntityLoader.js +85 -62
  5. package/build/AuthorizationResultBasedEntityLoader.js.map +1 -1
  6. package/build/AuthorizationResultBasedEntityMutator.d.ts +16 -16
  7. package/build/AuthorizationResultBasedEntityMutator.js.map +1 -1
  8. package/build/ComposedEntityCacheAdapter.d.ts +7 -6
  9. package/build/ComposedEntityCacheAdapter.js +28 -28
  10. package/build/ComposedEntityCacheAdapter.js.map +1 -1
  11. package/build/ComposedSecondaryEntityCache.d.ts +1 -1
  12. package/build/ComposedSecondaryEntityCache.js.map +1 -1
  13. package/build/EnforcingEntityAssociationLoader.d.ts +15 -15
  14. package/build/EnforcingEntityAssociationLoader.js.map +1 -1
  15. package/build/EnforcingEntityCreator.d.ts +2 -2
  16. package/build/EnforcingEntityDeleter.d.ts +2 -2
  17. package/build/EnforcingEntityLoader.d.ts +104 -18
  18. package/build/EnforcingEntityLoader.js +113 -12
  19. package/build/EnforcingEntityLoader.js.map +1 -1
  20. package/build/EnforcingEntityUpdater.d.ts +2 -2
  21. package/build/Entity.d.ts +10 -10
  22. package/build/Entity.js.map +1 -1
  23. package/build/EntityAssociationLoader.d.ts +3 -3
  24. package/build/EntityCompanion.d.ts +5 -5
  25. package/build/EntityCompanion.js.map +1 -1
  26. package/build/EntityCompanionProvider.d.ts +6 -6
  27. package/build/EntityCompanionProvider.js.map +1 -1
  28. package/build/EntityConfiguration.d.ts +46 -5
  29. package/build/EntityConfiguration.js +39 -1
  30. package/build/EntityConfiguration.js.map +1 -1
  31. package/build/EntityCreator.d.ts +4 -4
  32. package/build/EntityDatabaseAdapter.d.ts +15 -14
  33. package/build/EntityDatabaseAdapter.js +20 -12
  34. package/build/EntityDatabaseAdapter.js.map +1 -1
  35. package/build/EntityDeleter.d.ts +4 -4
  36. package/build/EntityFieldDefinition.d.ts +20 -10
  37. package/build/EntityFieldDefinition.js +3 -1
  38. package/build/EntityFieldDefinition.js.map +1 -1
  39. package/build/EntityFields.d.ts +14 -12
  40. package/build/EntityFields.js.map +1 -1
  41. package/build/EntityLoader.d.ts +5 -5
  42. package/build/EntityLoaderFactory.d.ts +3 -3
  43. package/build/EntityLoaderFactory.js.map +1 -1
  44. package/build/EntityLoaderUtils.d.ts +2 -2
  45. package/build/EntityLoaderUtils.js +27 -1
  46. package/build/EntityLoaderUtils.js.map +1 -1
  47. package/build/EntityMutationInfo.d.ts +2 -2
  48. package/build/EntityMutationTriggerConfiguration.d.ts +14 -14
  49. package/build/EntityMutationTriggerConfiguration.js.map +1 -1
  50. package/build/EntityMutationValidator.d.ts +2 -2
  51. package/build/EntityMutatorFactory.d.ts +5 -5
  52. package/build/EntityMutatorFactory.js.map +1 -1
  53. package/build/EntityPrivacyPolicy.d.ts +14 -14
  54. package/build/EntityPrivacyPolicy.js.map +1 -1
  55. package/build/EntitySecondaryCacheLoader.d.ts +4 -4
  56. package/build/EntityUpdater.d.ts +4 -4
  57. package/build/GenericEntityCacheAdapter.d.ts +7 -6
  58. package/build/GenericEntityCacheAdapter.js +13 -14
  59. package/build/GenericEntityCacheAdapter.js.map +1 -1
  60. package/build/GenericSecondaryEntityCache.d.ts +3 -3
  61. package/build/GenericSecondaryEntityCache.js.map +1 -1
  62. package/build/IEntityCacheAdapter.d.ts +17 -16
  63. package/build/IEntityCacheAdapterProvider.d.ts +1 -1
  64. package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
  65. package/build/IEntityGenericCacher.d.ts +15 -5
  66. package/build/ReadonlyEntity.d.ts +8 -8
  67. package/build/ReadonlyEntity.js.map +1 -1
  68. package/build/ViewerContext.d.ts +1 -1
  69. package/build/ViewerScopedEntityCompanion.d.ts +5 -5
  70. package/build/ViewerScopedEntityCompanionProvider.d.ts +1 -1
  71. package/build/ViewerScopedEntityLoaderFactory.d.ts +3 -3
  72. package/build/ViewerScopedEntityMutatorFactory.d.ts +5 -5
  73. package/build/entityUtils.d.ts +1 -1
  74. package/build/entityUtils.js.map +1 -1
  75. package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
  76. package/build/errors/EntityNotAuthorizedError.d.ts +1 -1
  77. package/build/errors/EntityNotFoundError.d.ts +2 -2
  78. package/build/index.d.ts +7 -7
  79. package/build/index.js +8 -13
  80. package/build/index.js.map +1 -1
  81. package/build/internal/CompositeFieldHolder.d.ts +48 -0
  82. package/build/internal/CompositeFieldHolder.js +116 -0
  83. package/build/internal/CompositeFieldHolder.js.map +1 -0
  84. package/build/internal/CompositeFieldValueMap.d.ts +15 -0
  85. package/build/internal/CompositeFieldValueMap.js +51 -0
  86. package/build/internal/CompositeFieldValueMap.js.map +1 -0
  87. package/build/internal/EntityDataManager.d.ts +16 -16
  88. package/build/internal/EntityDataManager.js +42 -45
  89. package/build/internal/EntityDataManager.js.map +1 -1
  90. package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
  91. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  92. package/build/internal/EntityLoadInterfaces.d.ts +104 -0
  93. package/build/internal/EntityLoadInterfaces.js +25 -0
  94. package/build/internal/EntityLoadInterfaces.js.map +1 -0
  95. package/build/internal/EntityTableDataCoordinator.d.ts +6 -6
  96. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  97. package/build/internal/ReadThroughEntityCache.d.ts +17 -16
  98. package/build/internal/ReadThroughEntityCache.js +36 -36
  99. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  100. package/build/internal/SingleFieldHolder.d.ts +34 -0
  101. package/build/internal/SingleFieldHolder.js +90 -0
  102. package/build/internal/SingleFieldHolder.js.map +1 -0
  103. package/build/metrics/EntityMetricsUtils.d.ts +2 -1
  104. package/build/metrics/EntityMetricsUtils.js.map +1 -1
  105. package/build/metrics/IEntityMetricsAdapter.d.ts +5 -0
  106. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  107. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
  108. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  109. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
  110. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  111. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
  112. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  113. package/build/rules/PrivacyPolicyRule.d.ts +2 -2
  114. package/build/tsconfig.build.tsbuildinfo +1 -0
  115. package/build/utils/EntityPrivacyUtils.d.ts +4 -4
  116. package/build/utils/EntityPrivacyUtils.js.map +1 -1
  117. package/build/utils/collections/SerializableKeyMap.d.ts +27 -0
  118. package/build/utils/collections/SerializableKeyMap.js +60 -0
  119. package/build/utils/collections/SerializableKeyMap.js.map +1 -0
  120. package/build/utils/collections/maps.js +1 -2
  121. package/build/utils/collections/maps.js.map +1 -1
  122. package/build/utils/collections/sets.d.ts +1 -0
  123. package/build/utils/collections/sets.js +7 -0
  124. package/build/utils/collections/sets.js.map +1 -0
  125. package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +1 -1
  126. package/package.json +8 -5
  127. package/src/AuthorizationResultBasedEntityAssociationLoader.ts +56 -49
  128. package/src/AuthorizationResultBasedEntityLoader.ts +194 -81
  129. package/src/AuthorizationResultBasedEntityMutator.ts +71 -45
  130. package/src/ComposedEntityCacheAdapter.ts +55 -46
  131. package/src/ComposedSecondaryEntityCache.ts +5 -2
  132. package/src/EnforcingEntityAssociationLoader.ts +52 -44
  133. package/src/EnforcingEntityCreator.ts +5 -5
  134. package/src/EnforcingEntityDeleter.ts +5 -5
  135. package/src/EnforcingEntityLoader.ts +158 -21
  136. package/src/EnforcingEntityUpdater.ts +5 -5
  137. package/src/Entity.ts +39 -39
  138. package/src/EntityAssociationLoader.ts +6 -6
  139. package/src/EntityCompanion.ts +11 -11
  140. package/src/EntityCompanionProvider.ts +21 -18
  141. package/src/EntityConfiguration.ts +123 -9
  142. package/src/EntityCreator.ts +7 -7
  143. package/src/EntityDatabaseAdapter.ts +51 -28
  144. package/src/EntityDeleter.ts +7 -7
  145. package/src/EntityFieldDefinition.ts +32 -12
  146. package/src/EntityFields.ts +49 -12
  147. package/src/EntityLoader.ts +8 -8
  148. package/src/EntityLoaderFactory.ts +8 -8
  149. package/src/EntityLoaderUtils.ts +39 -10
  150. package/src/EntityMutationInfo.ts +6 -6
  151. package/src/EntityMutationTriggerConfiguration.ts +68 -20
  152. package/src/EntityMutationValidator.ts +4 -4
  153. package/src/EntityMutatorFactory.ts +13 -13
  154. package/src/EntityPrivacyPolicy.ts +50 -26
  155. package/src/EntitySecondaryCacheLoader.ts +6 -6
  156. package/src/EntityUpdater.ts +7 -7
  157. package/src/GenericEntityCacheAdapter.ts +39 -28
  158. package/src/GenericSecondaryEntityCache.ts +6 -3
  159. package/src/IEntityCacheAdapter.ts +45 -25
  160. package/src/IEntityCacheAdapterProvider.ts +3 -3
  161. package/src/IEntityDatabaseAdapterProvider.ts +3 -3
  162. package/src/IEntityGenericCacher.ts +33 -5
  163. package/src/ReadonlyEntity.ts +24 -24
  164. package/src/ViewerContext.ts +5 -5
  165. package/src/ViewerScopedEntityCompanion.ts +7 -7
  166. package/src/ViewerScopedEntityCompanionProvider.ts +6 -6
  167. package/src/ViewerScopedEntityLoaderFactory.ts +7 -7
  168. package/src/ViewerScopedEntityMutatorFactory.ts +8 -8
  169. package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +4 -4
  170. package/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.ts +14 -13
  171. package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +367 -69
  172. package/src/__tests__/ComposedCacheAdapter-test.ts +235 -117
  173. package/src/__tests__/EnforcingEntityLoader-test.ts +135 -1
  174. package/src/__tests__/Entity-test.ts +2 -2
  175. package/src/__tests__/EntityAssociationLoader-test.ts +2 -2
  176. package/src/__tests__/EntityCommonUseCases-test.ts +11 -11
  177. package/src/__tests__/EntityCompanion-test.ts +4 -4
  178. package/src/__tests__/EntityCompanionProvider-test.ts +9 -8
  179. package/src/__tests__/EntityConfiguration-test.ts +85 -6
  180. package/src/__tests__/EntityDatabaseAdapter-test.ts +113 -17
  181. package/src/__tests__/EntityEdges-test.ts +97 -72
  182. package/src/__tests__/EntityFields-test.ts +2 -2
  183. package/src/__tests__/EntityLoader-test.ts +2 -2
  184. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +11 -11
  185. package/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.ts +73 -0
  186. package/src/__tests__/EntityMutator-test.ts +74 -46
  187. package/src/__tests__/EntityPrivacyPolicy-test.ts +51 -74
  188. package/src/__tests__/EntityQueryContext-test.ts +1 -1
  189. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +3 -3
  190. package/src/__tests__/EntitySelfReferentialEdges-test.ts +64 -39
  191. package/src/__tests__/GenericEntityCacheAdapter-test.ts +83 -28
  192. package/src/__tests__/ReadonlyEntity-test.ts +3 -3
  193. package/src/__tests__/ViewerContext-test.ts +1 -1
  194. package/src/__tests__/ViewerScopedEntityCompanion-test.ts +5 -2
  195. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +1 -1
  196. package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +12 -3
  197. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +12 -12
  198. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +12 -12
  199. package/src/entityUtils.ts +4 -1
  200. package/src/errors/EntityInvalidFieldValueError.ts +5 -5
  201. package/src/errors/EntityNotAuthorizedError.ts +3 -3
  202. package/src/errors/EntityNotFoundError.ts +5 -5
  203. package/src/index.ts +7 -7
  204. package/src/internal/CompositeFieldHolder.ts +218 -0
  205. package/src/internal/CompositeFieldValueMap.ts +78 -0
  206. package/src/internal/EntityDataManager.ts +107 -96
  207. package/src/internal/EntityFieldTransformationUtils.ts +33 -14
  208. package/src/internal/EntityLoadInterfaces.ts +143 -0
  209. package/src/internal/EntityTableDataCoordinator.ts +8 -5
  210. package/src/internal/ReadThroughEntityCache.ts +63 -50
  211. package/src/internal/SingleFieldHolder.ts +131 -0
  212. package/src/internal/__tests__/CompositeFieldHolder-test.ts +25 -0
  213. package/src/internal/__tests__/CompositeFieldValueMap-test.ts +43 -0
  214. package/src/internal/__tests__/EntityDataManager-test.ts +308 -91
  215. package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +3 -2
  216. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +315 -107
  217. package/src/metrics/EntityMetricsUtils.ts +7 -2
  218. package/src/metrics/IEntityMetricsAdapter.ts +6 -0
  219. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +5 -5
  220. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +5 -5
  221. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +5 -5
  222. package/src/rules/PrivacyPolicyRule.ts +4 -4
  223. package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +1 -1
  224. package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +1 -1
  225. package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +1 -1
  226. package/src/utils/EntityPrivacyUtils.ts +72 -30
  227. package/src/utils/{testing → __testfixtures__}/PrivacyPolicyRuleTestUtils.ts +26 -26
  228. package/src/{testfixtures → utils/__testfixtures__}/SimpleTestEntity.ts +16 -15
  229. package/src/utils/__testfixtures__/StubCacheAdapter.ts +164 -0
  230. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapter.ts +19 -12
  231. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapterProvider.ts +4 -4
  232. package/src/utils/__testfixtures__/TSMockitoExtensions.ts +69 -0
  233. package/src/{testfixtures → utils/__testfixtures__}/TestEntity.ts +21 -15
  234. package/src/{testfixtures → utils/__testfixtures__}/TestEntity2.ts +16 -15
  235. package/src/{testfixtures → utils/__testfixtures__}/TestEntityWithMutationTriggers.ts +23 -22
  236. package/src/{testfixtures → utils/__testfixtures__}/TestViewerContext.ts +1 -1
  237. package/src/utils/{testing → __testfixtures__}/describeFieldTestCase.ts +1 -1
  238. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +62 -66
  239. package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +29 -25
  240. package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +1 -1
  241. package/src/utils/collections/SerializableKeyMap.ts +84 -0
  242. package/src/utils/collections/__tests__/SerializableKeyMap-test.ts +119 -0
  243. package/src/utils/collections/__tests__/sets-test.ts +17 -0
  244. package/src/utils/collections/maps.ts +7 -8
  245. package/src/utils/collections/sets.ts +3 -0
  246. package/src/utils/mergeEntityMutationTriggerConfigurations.ts +5 -5
  247. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
  248. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -242
  249. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
  250. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
  251. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -110
  252. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
  253. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
  254. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -401
  255. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
  256. package/build/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
  257. package/build/__tests__/ComposedCacheAdapter-test.js +0 -229
  258. package/build/__tests__/ComposedCacheAdapter-test.js.map +0 -1
  259. package/build/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
  260. package/build/__tests__/ComposedSecondaryEntityCache-test.js +0 -66
  261. package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
  262. package/build/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
  263. package/build/__tests__/EnforcingEntityAssociationLoader-test.js +0 -115
  264. package/build/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
  265. package/build/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
  266. package/build/__tests__/EnforcingEntityLoader-test.js +0 -253
  267. package/build/__tests__/EnforcingEntityLoader-test.js.map +0 -1
  268. package/build/__tests__/Entity-test.d.ts +0 -1
  269. package/build/__tests__/Entity-test.js +0 -94
  270. package/build/__tests__/Entity-test.js.map +0 -1
  271. package/build/__tests__/EntityAssociationLoader-test.d.ts +0 -1
  272. package/build/__tests__/EntityAssociationLoader-test.js +0 -30
  273. package/build/__tests__/EntityAssociationLoader-test.js.map +0 -1
  274. package/build/__tests__/EntityCommonUseCases-test.d.ts +0 -1
  275. package/build/__tests__/EntityCommonUseCases-test.js +0 -146
  276. package/build/__tests__/EntityCommonUseCases-test.js.map +0 -1
  277. package/build/__tests__/EntityCompanion-test.d.ts +0 -1
  278. package/build/__tests__/EntityCompanion-test.js +0 -77
  279. package/build/__tests__/EntityCompanion-test.js.map +0 -1
  280. package/build/__tests__/EntityCompanionProvider-test.d.ts +0 -1
  281. package/build/__tests__/EntityCompanionProvider-test.js +0 -54
  282. package/build/__tests__/EntityCompanionProvider-test.js.map +0 -1
  283. package/build/__tests__/EntityConfiguration-test.d.ts +0 -1
  284. package/build/__tests__/EntityConfiguration-test.js +0 -103
  285. package/build/__tests__/EntityConfiguration-test.js.map +0 -1
  286. package/build/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
  287. package/build/__tests__/EntityDatabaseAdapter-test.js +0 -146
  288. package/build/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
  289. package/build/__tests__/EntityEdges-test.d.ts +0 -1
  290. package/build/__tests__/EntityEdges-test.js +0 -723
  291. package/build/__tests__/EntityEdges-test.js.map +0 -1
  292. package/build/__tests__/EntityFields-test.d.ts +0 -1
  293. package/build/__tests__/EntityFields-test.js +0 -63
  294. package/build/__tests__/EntityFields-test.js.map +0 -1
  295. package/build/__tests__/EntityLoader-test.d.ts +0 -1
  296. package/build/__tests__/EntityLoader-test.js +0 -36
  297. package/build/__tests__/EntityLoader-test.js.map +0 -1
  298. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
  299. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -73
  300. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
  301. package/build/__tests__/EntityMutator-test.d.ts +0 -1
  302. package/build/__tests__/EntityMutator-test.js +0 -741
  303. package/build/__tests__/EntityMutator-test.js.map +0 -1
  304. package/build/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
  305. package/build/__tests__/EntityPrivacyPolicy-test.js +0 -463
  306. package/build/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
  307. package/build/__tests__/EntityQueryContext-test.d.ts +0 -1
  308. package/build/__tests__/EntityQueryContext-test.js +0 -116
  309. package/build/__tests__/EntityQueryContext-test.js.map +0 -1
  310. package/build/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
  311. package/build/__tests__/EntitySecondaryCacheLoader-test.js +0 -60
  312. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
  313. package/build/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
  314. package/build/__tests__/EntitySelfReferentialEdges-test.js +0 -201
  315. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
  316. package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
  317. package/build/__tests__/GenericEntityCacheAdapter-test.js +0 -80
  318. package/build/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
  319. package/build/__tests__/ReadonlyEntity-test.d.ts +0 -1
  320. package/build/__tests__/ReadonlyEntity-test.js +0 -211
  321. package/build/__tests__/ReadonlyEntity-test.js.map +0 -1
  322. package/build/__tests__/ViewerContext-test.d.ts +0 -1
  323. package/build/__tests__/ViewerContext-test.js +0 -30
  324. package/build/__tests__/ViewerContext-test.js.map +0 -1
  325. package/build/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
  326. package/build/__tests__/ViewerScopedEntityCompanion-test.js +0 -20
  327. package/build/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
  328. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
  329. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -20
  330. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
  331. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
  332. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -23
  333. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
  334. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
  335. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -22
  336. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
  337. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
  338. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -123
  339. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
  340. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
  341. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -121
  342. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
  343. package/build/__tests__/entityUtils-test.d.ts +0 -1
  344. package/build/__tests__/entityUtils-test.js +0 -87
  345. package/build/__tests__/entityUtils-test.js.map +0 -1
  346. package/build/internal/__tests__/EntityDataManager-test.d.ts +0 -1
  347. package/build/internal/__tests__/EntityDataManager-test.js +0 -373
  348. package/build/internal/__tests__/EntityDataManager-test.js.map +0 -1
  349. package/build/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
  350. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -136
  351. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
  352. package/build/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
  353. package/build/internal/__tests__/ReadThroughEntityCache-test.js +0 -206
  354. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
  355. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
  356. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -21
  357. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
  358. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
  359. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -21
  360. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
  361. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
  362. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -21
  363. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
  364. package/build/testfixtures/DateIDTestEntity.d.ts +0 -19
  365. package/build/testfixtures/DateIDTestEntity.js +0 -48
  366. package/build/testfixtures/DateIDTestEntity.js.map +0 -1
  367. package/build/testfixtures/SimpleTestEntity.d.ts +0 -20
  368. package/build/testfixtures/SimpleTestEntity.js +0 -48
  369. package/build/testfixtures/SimpleTestEntity.js.map +0 -1
  370. package/build/testfixtures/TestEntity.d.ts +0 -30
  371. package/build/testfixtures/TestEntity.js +0 -93
  372. package/build/testfixtures/TestEntity.js.map +0 -1
  373. package/build/testfixtures/TestEntity2.d.ts +0 -20
  374. package/build/testfixtures/TestEntity2.js +0 -51
  375. package/build/testfixtures/TestEntity2.js.map +0 -1
  376. package/build/testfixtures/TestEntityNumberKey.d.ts +0 -19
  377. package/build/testfixtures/TestEntityNumberKey.js +0 -48
  378. package/build/testfixtures/TestEntityNumberKey.js.map +0 -1
  379. package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +0 -36
  380. package/build/testfixtures/TestEntityWithMutationTriggers.js +0 -82
  381. package/build/testfixtures/TestEntityWithMutationTriggers.js.map +0 -1
  382. package/build/testfixtures/TestViewerContext.d.ts +0 -3
  383. package/build/testfixtures/TestViewerContext.js +0 -10
  384. package/build/testfixtures/TestViewerContext.js.map +0 -1
  385. package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
  386. package/build/utils/__tests__/EntityPrivacyUtils-test.js +0 -486
  387. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
  388. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
  389. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -178
  390. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
  391. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
  392. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -26
  393. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
  394. package/build/utils/collections/__tests__/maps-test.d.ts +0 -1
  395. package/build/utils/collections/__tests__/maps-test.js +0 -120
  396. package/build/utils/collections/__tests__/maps-test.js.map +0 -1
  397. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +0 -28
  398. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js +0 -52
  399. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +0 -1
  400. package/build/utils/testing/StubCacheAdapter.d.ts +0 -27
  401. package/build/utils/testing/StubCacheAdapter.js +0 -86
  402. package/build/utils/testing/StubCacheAdapter.js.map +0 -1
  403. package/build/utils/testing/StubDatabaseAdapter.d.ts +0 -25
  404. package/build/utils/testing/StubDatabaseAdapter.js +0 -191
  405. package/build/utils/testing/StubDatabaseAdapter.js.map +0 -1
  406. package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +0 -7
  407. package/build/utils/testing/StubDatabaseAdapterProvider.js +0 -14
  408. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +0 -1
  409. package/build/utils/testing/StubQueryContextProvider.d.ts +0 -7
  410. package/build/utils/testing/StubQueryContextProvider.js +0 -19
  411. package/build/utils/testing/StubQueryContextProvider.js.map +0 -1
  412. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +0 -1
  413. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +0 -42
  414. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +0 -1
  415. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.d.ts +0 -1
  416. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +0 -402
  417. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +0 -1
  418. package/build/utils/testing/createUnitTestEntityCompanionProvider.d.ts +0 -7
  419. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +0 -36
  420. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +0 -1
  421. package/build/utils/testing/describeFieldTestCase.d.ts +0 -2
  422. package/build/utils/testing/describeFieldTestCase.js +0 -18
  423. package/build/utils/testing/describeFieldTestCase.js.map +0 -1
  424. package/src/testfixtures/DateIDTestEntity.ts +0 -59
  425. package/src/testfixtures/TestEntityNumberKey.ts +0 -59
  426. package/src/utils/testing/StubCacheAdapter.ts +0 -122
  427. package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +0 -42
  428. package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +0 -548
  429. /package/src/utils/{testing → __testfixtures__}/StubQueryContextProvider.ts +0 -0
  430. /package/src/utils/{testing → __testfixtures__}/createUnitTestEntityCompanionProvider.ts +0 -0
@@ -8,18 +8,18 @@ import ViewerContext from '../ViewerContext';
8
8
  * A no-op policy rule that always skips.
9
9
  */
10
10
  export default class AlwaysSkipPrivacyPolicyRule<
11
- TFields extends object,
12
- TID extends NonNullable<TFields[TSelectedFields]>,
11
+ TFields extends Record<string, any>,
12
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
13
13
  TViewerContext extends ViewerContext,
14
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
14
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
15
15
  TSelectedFields extends keyof TFields = keyof TFields,
16
- > extends PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields> {
16
+ > extends PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields> {
17
17
  async evaluateAsync(
18
18
  _viewerContext: TViewerContext,
19
19
  _queryContext: EntityQueryContext,
20
20
  _evaluationContext: EntityPrivacyPolicyEvaluationContext<
21
21
  TFields,
22
- TID,
22
+ TIDField,
23
23
  TViewerContext,
24
24
  TEntity,
25
25
  TSelectedFields
@@ -37,10 +37,10 @@ export enum RuleEvaluationResult {
37
37
  * would be named something like `DenyIfViewerHasBeenBlockedPrivacyPolicyRule`.
38
38
  */
39
39
  export default abstract class PrivacyPolicyRule<
40
- TFields extends object,
41
- TID extends NonNullable<TFields[TSelectedFields]>,
40
+ TFields extends Record<string, any>,
41
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
42
42
  TViewerContext extends ViewerContext,
43
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
43
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
44
44
  TSelectedFields extends keyof TFields = keyof TFields,
45
45
  > {
46
46
  abstract evaluateAsync(
@@ -48,7 +48,7 @@ export default abstract class PrivacyPolicyRule<
48
48
  queryContext: EntityQueryContext,
49
49
  evaluationContext: EntityPrivacyPolicyEvaluationContext<
50
50
  TFields,
51
- TID,
51
+ TIDField,
52
52
  TViewerContext,
53
53
  TEntity,
54
54
  TSelectedFields
@@ -3,7 +3,7 @@ import { mock, instance, anything } from 'ts-mockito';
3
3
  import { EntityPrivacyPolicyEvaluationContext } from '../../EntityPrivacyPolicy';
4
4
  import { EntityQueryContext } from '../../EntityQueryContext';
5
5
  import ViewerContext from '../../ViewerContext';
6
- import { describePrivacyPolicyRule } from '../../utils/testing/PrivacyPolicyRuleTestUtils';
6
+ import { describePrivacyPolicyRule } from '../../utils/__testfixtures__/PrivacyPolicyRuleTestUtils';
7
7
  import AlwaysAllowPrivacyPolicyRule from '../AlwaysAllowPrivacyPolicyRule';
8
8
 
9
9
  describePrivacyPolicyRule(new AlwaysAllowPrivacyPolicyRule(), {
@@ -3,7 +3,7 @@ import { mock, instance, anything } from 'ts-mockito';
3
3
  import { EntityPrivacyPolicyEvaluationContext } from '../../EntityPrivacyPolicy';
4
4
  import { EntityQueryContext } from '../../EntityQueryContext';
5
5
  import ViewerContext from '../../ViewerContext';
6
- import { describePrivacyPolicyRule } from '../../utils/testing/PrivacyPolicyRuleTestUtils';
6
+ import { describePrivacyPolicyRule } from '../../utils/__testfixtures__/PrivacyPolicyRuleTestUtils';
7
7
  import AlwaysDenyPrivacyPolicyRule from '../AlwaysDenyPrivacyPolicyRule';
8
8
 
9
9
  describePrivacyPolicyRule(new AlwaysDenyPrivacyPolicyRule(), {
@@ -3,7 +3,7 @@ import { mock, instance, anything } from 'ts-mockito';
3
3
  import { EntityPrivacyPolicyEvaluationContext } from '../../EntityPrivacyPolicy';
4
4
  import { EntityQueryContext } from '../../EntityQueryContext';
5
5
  import ViewerContext from '../../ViewerContext';
6
- import { describePrivacyPolicyRule } from '../../utils/testing/PrivacyPolicyRuleTestUtils';
6
+ import { describePrivacyPolicyRule } from '../../utils/__testfixtures__/PrivacyPolicyRuleTestUtils';
7
7
  import AlwaysSkipPrivacyPolicyRule from '../AlwaysSkipPrivacyPolicyRule';
8
8
 
9
9
  describePrivacyPolicyRule(new AlwaysSkipPrivacyPolicyRule(), {
@@ -43,20 +43,27 @@ export type EntityPrivacyEvaluationResult =
43
43
  * @param queryContext - query context in which to perform the check
44
44
  */
45
45
  export async function canViewerUpdateAsync<
46
- TFields extends object,
47
- TID extends NonNullable<TFields[TSelectedFields]>,
46
+ TFields extends Record<string, any>,
47
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
48
48
  TViewerContext extends ViewerContext,
49
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
49
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
50
50
  TPrivacyPolicy extends EntityPrivacyPolicy<
51
51
  TFields,
52
- TID,
52
+ TIDField,
53
53
  TViewerContext,
54
54
  TEntity,
55
55
  TSelectedFields
56
56
  >,
57
57
  TSelectedFields extends keyof TFields = keyof TFields,
58
58
  >(
59
- entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>,
59
+ entityClass: IEntityClass<
60
+ TFields,
61
+ TIDField,
62
+ TViewerContext,
63
+ TEntity,
64
+ TPrivacyPolicy,
65
+ TSelectedFields
66
+ >,
60
67
  sourceEntity: TEntity,
61
68
  queryContext: EntityQueryContext = sourceEntity
62
69
  .getViewerContext()
@@ -83,20 +90,27 @@ export async function canViewerUpdateAsync<
83
90
  * @param queryContext - query context in which to perform the check
84
91
  */
85
92
  export async function getCanViewerUpdateResultAsync<
86
- TFields extends object,
87
- TID extends NonNullable<TFields[TSelectedFields]>,
93
+ TFields extends Record<string, any>,
94
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
88
95
  TViewerContext extends ViewerContext,
89
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
96
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
90
97
  TPrivacyPolicy extends EntityPrivacyPolicy<
91
98
  TFields,
92
- TID,
99
+ TIDField,
93
100
  TViewerContext,
94
101
  TEntity,
95
102
  TSelectedFields
96
103
  >,
97
104
  TSelectedFields extends keyof TFields = keyof TFields,
98
105
  >(
99
- entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>,
106
+ entityClass: IEntityClass<
107
+ TFields,
108
+ TIDField,
109
+ TViewerContext,
110
+ TEntity,
111
+ TPrivacyPolicy,
112
+ TSelectedFields
113
+ >,
100
114
  sourceEntity: TEntity,
101
115
  queryContext: EntityQueryContext = sourceEntity
102
116
  .getViewerContext()
@@ -113,20 +127,27 @@ export async function getCanViewerUpdateResultAsync<
113
127
  }
114
128
 
115
129
  async function canViewerUpdateInternalAsync<
116
- TFields extends object,
117
- TID extends NonNullable<TFields[TSelectedFields]>,
130
+ TFields extends Record<string, any>,
131
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
118
132
  TViewerContext extends ViewerContext,
119
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
133
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
120
134
  TPrivacyPolicy extends EntityPrivacyPolicy<
121
135
  TFields,
122
- TID,
136
+ TIDField,
123
137
  TViewerContext,
124
138
  TEntity,
125
139
  TSelectedFields
126
140
  >,
127
141
  TSelectedFields extends keyof TFields = keyof TFields,
128
142
  >(
129
- entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>,
143
+ entityClass: IEntityClass<
144
+ TFields,
145
+ TIDField,
146
+ TViewerContext,
147
+ TEntity,
148
+ TPrivacyPolicy,
149
+ TSelectedFields
150
+ >,
130
151
  sourceEntity: TEntity,
131
152
  cascadingDeleteCause: EntityCascadingDeletionInfo | null,
132
153
  queryContext: EntityQueryContext,
@@ -165,20 +186,27 @@ async function canViewerUpdateInternalAsync<
165
186
  * @param queryContext - query context in which to perform the check
166
187
  */
167
188
  export async function canViewerDeleteAsync<
168
- TFields extends object,
169
- TID extends NonNullable<TFields[TSelectedFields]>,
189
+ TFields extends Record<string, any>,
190
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
170
191
  TViewerContext extends ViewerContext,
171
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
192
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
172
193
  TPrivacyPolicy extends EntityPrivacyPolicy<
173
194
  TFields,
174
- TID,
195
+ TIDField,
175
196
  TViewerContext,
176
197
  TEntity,
177
198
  TSelectedFields
178
199
  >,
179
200
  TSelectedFields extends keyof TFields = keyof TFields,
180
201
  >(
181
- entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>,
202
+ entityClass: IEntityClass<
203
+ TFields,
204
+ TIDField,
205
+ TViewerContext,
206
+ TEntity,
207
+ TPrivacyPolicy,
208
+ TSelectedFields
209
+ >,
182
210
  sourceEntity: TEntity,
183
211
  queryContext: EntityQueryContext = sourceEntity
184
212
  .getViewerContext()
@@ -205,20 +233,27 @@ export async function canViewerDeleteAsync<
205
233
  * @param queryContext - query context in which to perform the check
206
234
  */
207
235
  export async function getCanViewerDeleteResultAsync<
208
- TFields extends object,
209
- TID extends NonNullable<TFields[TSelectedFields]>,
236
+ TFields extends Record<string, any>,
237
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
210
238
  TViewerContext extends ViewerContext,
211
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
239
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
212
240
  TPrivacyPolicy extends EntityPrivacyPolicy<
213
241
  TFields,
214
- TID,
242
+ TIDField,
215
243
  TViewerContext,
216
244
  TEntity,
217
245
  TSelectedFields
218
246
  >,
219
247
  TSelectedFields extends keyof TFields = keyof TFields,
220
248
  >(
221
- entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>,
249
+ entityClass: IEntityClass<
250
+ TFields,
251
+ TIDField,
252
+ TViewerContext,
253
+ TEntity,
254
+ TPrivacyPolicy,
255
+ TSelectedFields
256
+ >,
222
257
  sourceEntity: TEntity,
223
258
  queryContext: EntityQueryContext = sourceEntity
224
259
  .getViewerContext()
@@ -235,20 +270,27 @@ export async function getCanViewerDeleteResultAsync<
235
270
  }
236
271
 
237
272
  async function canViewerDeleteInternalAsync<
238
- TFields extends object,
239
- TID extends NonNullable<TFields[TSelectedFields]>,
273
+ TFields extends Record<string, any>,
274
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
240
275
  TViewerContext extends ViewerContext,
241
- TEntity extends Entity<TFields, TID, TViewerContext, TSelectedFields>,
276
+ TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
242
277
  TPrivacyPolicy extends EntityPrivacyPolicy<
243
278
  TFields,
244
- TID,
279
+ TIDField,
245
280
  TViewerContext,
246
281
  TEntity,
247
282
  TSelectedFields
248
283
  >,
249
284
  TSelectedFields extends keyof TFields = keyof TFields,
250
285
  >(
251
- entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>,
286
+ entityClass: IEntityClass<
287
+ TFields,
288
+ TIDField,
289
+ TViewerContext,
290
+ TEntity,
291
+ TPrivacyPolicy,
292
+ TSelectedFields
293
+ >,
252
294
  sourceEntity: TEntity,
253
295
  cascadingDeleteCause: EntityCascadingDeletionInfo | null,
254
296
  queryContext: EntityQueryContext,
@@ -5,17 +5,17 @@ import ViewerContext from '../../ViewerContext';
5
5
  import PrivacyPolicyRule, { RuleEvaluationResult } from '../../rules/PrivacyPolicyRule';
6
6
 
7
7
  export interface Case<
8
- TFields extends object,
9
- TID extends NonNullable<TFields[TSelectedFields]>,
8
+ TFields extends Record<string, any>,
9
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
10
10
  TViewerContext extends ViewerContext,
11
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
11
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
12
12
  TSelectedFields extends keyof TFields,
13
13
  > {
14
14
  viewerContext: TViewerContext;
15
15
  queryContext: EntityQueryContext;
16
16
  evaluationContext: EntityPrivacyPolicyEvaluationContext<
17
17
  TFields,
18
- TID,
18
+ TIDField,
19
19
  TViewerContext,
20
20
  TEntity,
21
21
  TSelectedFields
@@ -24,32 +24,32 @@ export interface Case<
24
24
  }
25
25
 
26
26
  export type CaseMap<
27
- TFields extends object,
28
- TID extends NonNullable<TFields[TSelectedFields]>,
27
+ TFields extends Record<string, any>,
28
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
29
29
  TViewerContext extends ViewerContext,
30
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
30
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
31
31
  TSelectedFields extends keyof TFields,
32
- > = Map<string, () => Promise<Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>>>;
32
+ > = Map<string, () => Promise<Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>>>;
33
33
 
34
34
  /**
35
35
  * Useful for defining test cases that have async preconditions.
36
36
  */
37
37
  export const describePrivacyPolicyRuleWithAsyncTestCase = <
38
- TFields extends object,
39
- TID extends NonNullable<TFields[TSelectedFields]>,
38
+ TFields extends Record<string, any>,
39
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
40
40
  TViewerContext extends ViewerContext,
41
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
41
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
42
42
  TSelectedFields extends keyof TFields = keyof TFields,
43
43
  >(
44
- privacyPolicyRule: PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
44
+ privacyPolicyRule: PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>,
45
45
  {
46
46
  allowCases = new Map(),
47
47
  skipCases = new Map(),
48
48
  denyCases = new Map(),
49
49
  }: {
50
- allowCases?: CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields>;
51
- skipCases?: CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields>;
52
- denyCases?: CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields>;
50
+ allowCases?: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
51
+ skipCases?: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
52
+ denyCases?: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
53
53
  },
54
54
  ): void => {
55
55
  describe(privacyPolicyRule.constructor.name, () => {
@@ -95,30 +95,30 @@ export const describePrivacyPolicyRuleWithAsyncTestCase = <
95
95
  * For test simple privacy rules that don't have complex async preconditions.
96
96
  */
97
97
  export const describePrivacyPolicyRule = <
98
- TFields extends object,
99
- TID extends NonNullable<TFields[TSelectedFields]>,
98
+ TFields extends Record<string, any>,
99
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
100
100
  TViewerContext extends ViewerContext,
101
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
101
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
102
102
  TSelectedFields extends keyof TFields = keyof TFields,
103
103
  >(
104
- privacyPolicyRule: PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
104
+ privacyPolicyRule: PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>,
105
105
  {
106
106
  allowCases = [],
107
107
  skipCases = [],
108
108
  denyCases = [],
109
109
  }: {
110
- allowCases?: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
111
- skipCases?: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
112
- denyCases?: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
110
+ allowCases?: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[];
111
+ skipCases?: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[];
112
+ denyCases?: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[];
113
113
  },
114
114
  ): void => {
115
115
  const makeCasesMap = (
116
- cases: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>[],
117
- ): CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields> =>
116
+ cases: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[],
117
+ ): CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields> =>
118
118
  cases.reduce(
119
119
  (
120
- acc: CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
121
- testCase: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
120
+ acc: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>,
121
+ testCase: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>,
122
122
  index,
123
123
  ) => {
124
124
  acc.set(`case ${index}`, async () => testCase);
@@ -1,10 +1,10 @@
1
- import Entity from '../Entity';
2
- import { EntityCompanionDefinition } from '../EntityCompanionProvider';
3
- import EntityConfiguration from '../EntityConfiguration';
4
- import { UUIDField } from '../EntityFields';
5
- import EntityPrivacyPolicy from '../EntityPrivacyPolicy';
6
- import ViewerContext from '../ViewerContext';
7
- import AlwaysAllowPrivacyPolicyRule from '../rules/AlwaysAllowPrivacyPolicyRule';
1
+ import Entity from '../../Entity';
2
+ import { EntityCompanionDefinition } from '../../EntityCompanionProvider';
3
+ import EntityConfiguration from '../../EntityConfiguration';
4
+ import { UUIDField } from '../../EntityFields';
5
+ import EntityPrivacyPolicy from '../../EntityPrivacyPolicy';
6
+ import ViewerContext from '../../ViewerContext';
7
+ import AlwaysAllowPrivacyPolicyRule from '../../rules/AlwaysAllowPrivacyPolicyRule';
8
8
 
9
9
  export type SimpleTestFields = {
10
10
  id: string;
@@ -12,12 +12,13 @@ export type SimpleTestFields = {
12
12
 
13
13
  export type SimpleTestFieldSelection = keyof SimpleTestFields;
14
14
 
15
- export const simpleTestEntityConfiguration = new EntityConfiguration<SimpleTestFields>({
15
+ export const simpleTestEntityConfiguration = new EntityConfiguration<SimpleTestFields, 'id'>({
16
16
  idField: 'id',
17
17
  tableName: 'simple_test_entity_should_not_write_to_db',
18
18
  schema: {
19
19
  id: new UUIDField({
20
20
  columnName: 'custom_id',
21
+ cache: true,
21
22
  }),
22
23
  },
23
24
  databaseAdapterFlavor: 'postgres',
@@ -26,7 +27,7 @@ export const simpleTestEntityConfiguration = new EntityConfiguration<SimpleTestF
26
27
 
27
28
  export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
28
29
  SimpleTestFields,
29
- string,
30
+ 'id',
30
31
  ViewerContext,
31
32
  SimpleTestEntity,
32
33
  SimpleTestFieldSelection
@@ -34,7 +35,7 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
34
35
  protected override readonly readRules = [
35
36
  new AlwaysAllowPrivacyPolicyRule<
36
37
  SimpleTestFields,
37
- string,
38
+ 'id',
38
39
  ViewerContext,
39
40
  SimpleTestEntity,
40
41
  SimpleTestFieldSelection
@@ -43,7 +44,7 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
43
44
  protected override readonly createRules = [
44
45
  new AlwaysAllowPrivacyPolicyRule<
45
46
  SimpleTestFields,
46
- string,
47
+ 'id',
47
48
  ViewerContext,
48
49
  SimpleTestEntity,
49
50
  SimpleTestFieldSelection
@@ -52,7 +53,7 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
52
53
  protected override readonly updateRules = [
53
54
  new AlwaysAllowPrivacyPolicyRule<
54
55
  SimpleTestFields,
55
- string,
56
+ 'id',
56
57
  ViewerContext,
57
58
  SimpleTestEntity,
58
59
  SimpleTestFieldSelection
@@ -61,7 +62,7 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
61
62
  protected override readonly deleteRules = [
62
63
  new AlwaysAllowPrivacyPolicyRule<
63
64
  SimpleTestFields,
64
- string,
65
+ 'id',
65
66
  ViewerContext,
66
67
  SimpleTestEntity,
67
68
  SimpleTestFieldSelection
@@ -71,13 +72,13 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
71
72
 
72
73
  export default class SimpleTestEntity extends Entity<
73
74
  SimpleTestFields,
74
- string,
75
+ 'id',
75
76
  ViewerContext,
76
77
  SimpleTestFieldSelection
77
78
  > {
78
79
  static defineCompanionDefinition(): EntityCompanionDefinition<
79
80
  SimpleTestFields,
80
- string,
81
+ 'id',
81
82
  ViewerContext,
82
83
  SimpleTestEntity,
83
84
  SimpleTestEntityPrivacyPolicy,
@@ -0,0 +1,164 @@
1
+ import invariant from 'invariant';
2
+
3
+ import EntityConfiguration from '../../EntityConfiguration';
4
+ import IEntityCacheAdapter from '../../IEntityCacheAdapter';
5
+ import IEntityCacheAdapterProvider from '../../IEntityCacheAdapterProvider';
6
+ import { IEntityLoadKey, IEntityLoadValue } from '../../internal/EntityLoadInterfaces';
7
+ import { CacheStatus, CacheLoadResult } from '../../internal/ReadThroughEntityCache';
8
+
9
+ export class NoCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
10
+ getCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields>(
11
+ _entityConfiguration: EntityConfiguration<TFields, TIDField>,
12
+ ): IEntityCacheAdapter<TFields, TIDField> {
13
+ return new NoCacheStubCacheAdapter();
14
+ }
15
+ }
16
+
17
+ export class NoCacheStubCacheAdapter<
18
+ TFields extends Record<string, any>,
19
+ TIDField extends keyof TFields,
20
+ > implements IEntityCacheAdapter<TFields, TIDField>
21
+ {
22
+ public async loadManyAsync<
23
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
24
+ TSerializedLoadValue,
25
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
26
+ >(
27
+ key: TLoadKey,
28
+ values: readonly TLoadValue[],
29
+ ): Promise<ReadonlyMap<TLoadValue, CacheLoadResult<TFields>>> {
30
+ return values.reduce((acc: Map<TLoadValue, CacheLoadResult<TFields>>, v) => {
31
+ acc.set(v, {
32
+ status: CacheStatus.MISS,
33
+ });
34
+ return acc;
35
+ }, key.vendNewLoadValueMap<CacheLoadResult<TFields>>());
36
+ }
37
+
38
+ public async cacheManyAsync<
39
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
40
+ TSerializedLoadValue,
41
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
42
+ >(_key: TLoadKey, _objectMap: ReadonlyMap<TLoadValue, Readonly<TFields>>): Promise<void> {}
43
+
44
+ public async cacheDBMissesAsync<
45
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
46
+ TSerializedLoadValue,
47
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
48
+ >(_key: TLoadKey, _values: readonly TLoadValue[]): Promise<void> {}
49
+
50
+ public async invalidateManyAsync<
51
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
52
+ TSerializedLoadValue,
53
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
54
+ >(_key: TLoadKey, _values: readonly TLoadValue[]): Promise<void> {}
55
+ }
56
+
57
+ // Sentinel value we store in the in-memory cache to negatively cache a database miss.
58
+ // The sentinel value is distinct from any (positively) cached value.
59
+ export const DOES_NOT_EXIST = Symbol('inMemoryCacheDoesNotExistValue');
60
+
61
+ export class InMemoryFullCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
62
+ private readonly cache: Map<string, Readonly<object> | typeof DOES_NOT_EXIST> = new Map();
63
+
64
+ getCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields>(
65
+ entityConfiguration: EntityConfiguration<TFields, TIDField>,
66
+ ): IEntityCacheAdapter<TFields, TIDField> {
67
+ return new InMemoryFullCacheStubCacheAdapter(
68
+ entityConfiguration,
69
+ this.cache as Map<string, Readonly<TFields>>,
70
+ );
71
+ }
72
+ }
73
+
74
+ export class InMemoryFullCacheStubCacheAdapter<
75
+ TFields extends Record<string, any>,
76
+ TIDField extends keyof TFields,
77
+ > implements IEntityCacheAdapter<TFields, TIDField>
78
+ {
79
+ constructor(
80
+ private readonly entityConfiguration: EntityConfiguration<TFields, TIDField>,
81
+ private readonly cache: Map<string, Readonly<TFields> | typeof DOES_NOT_EXIST>,
82
+ ) {}
83
+
84
+ public async loadManyAsync<
85
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
86
+ TSerializedLoadValue,
87
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
88
+ >(
89
+ key: TLoadKey,
90
+ values: readonly TLoadValue[],
91
+ ): Promise<ReadonlyMap<TLoadValue, CacheLoadResult<TFields>>> {
92
+ const results = key.vendNewLoadValueMap<CacheLoadResult<TFields>>();
93
+ values.forEach((value) => {
94
+ const cacheKey = this.createCacheKey(key, value);
95
+ if (!this.cache.has(cacheKey)) {
96
+ results.set(value, {
97
+ status: CacheStatus.MISS,
98
+ });
99
+ } else {
100
+ const objectForFieldValue = this.cache.get(cacheKey);
101
+ invariant(objectForFieldValue !== undefined, 'should have set value for key');
102
+ if (objectForFieldValue === DOES_NOT_EXIST) {
103
+ results.set(value, {
104
+ status: CacheStatus.NEGATIVE,
105
+ });
106
+ } else {
107
+ results.set(value, {
108
+ status: CacheStatus.HIT,
109
+ item: objectForFieldValue,
110
+ });
111
+ }
112
+ }
113
+ });
114
+ return results;
115
+ }
116
+
117
+ public async cacheManyAsync<
118
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
119
+ TSerializedLoadValue,
120
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
121
+ >(key: TLoadKey, objectMap: ReadonlyMap<TLoadValue, Readonly<TFields>>): Promise<void> {
122
+ objectMap.forEach((obj, value) => {
123
+ const cacheKey = this.createCacheKey(key, value);
124
+ this.cache.set(cacheKey, obj);
125
+ });
126
+ }
127
+
128
+ public async cacheDBMissesAsync<
129
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
130
+ TSerializedLoadValue,
131
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
132
+ >(key: TLoadKey, values: readonly TLoadValue[]): Promise<void> {
133
+ values.forEach((value) => {
134
+ const cacheKey = this.createCacheKey(key, value);
135
+ this.cache.set(cacheKey, DOES_NOT_EXIST);
136
+ });
137
+ }
138
+
139
+ public async invalidateManyAsync<
140
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
141
+ TSerializedLoadValue,
142
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
143
+ >(key: TLoadKey, values: readonly TLoadValue[]): Promise<void> {
144
+ values.forEach((value) => {
145
+ const cacheKey = this.createCacheKey(key, value);
146
+ this.cache.delete(cacheKey);
147
+ });
148
+ }
149
+
150
+ private createCacheKey<
151
+ TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
152
+ TSerializedLoadValue,
153
+ TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
154
+ >(key: TLoadKey, value: TLoadValue): string {
155
+ const cacheKeyType = key.getLoadMethodType();
156
+ const parts = key.createCacheKeyPartsForLoadValue(this.entityConfiguration, value);
157
+ return [
158
+ this.entityConfiguration.tableName,
159
+ cacheKeyType,
160
+ `v${this.entityConfiguration.cacheKeyVersion}`,
161
+ ...parts,
162
+ ].join(':');
163
+ }
164
+ }