@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,8 +8,8 @@ import EnforcingEntityDeleter from '../EnforcingEntityDeleter';
8
8
  import EnforcingEntityUpdater from '../EnforcingEntityUpdater';
9
9
  import Entity from '../Entity';
10
10
  import ViewerContext from '../ViewerContext';
11
- import SimpleTestEntity from '../testfixtures/SimpleTestEntity';
12
- import { createUnitTestEntityCompanionProvider } from '../utils/testing/createUnitTestEntityCompanionProvider';
11
+ import SimpleTestEntity from '../utils/__testfixtures__/SimpleTestEntity';
12
+ import { createUnitTestEntityCompanionProvider } from '../utils/__testfixtures__/createUnitTestEntityCompanionProvider';
13
13
 
14
14
  describe(Entity, () => {
15
15
  describe('creator', () => {
@@ -2,8 +2,8 @@ import AuthorizationResultBasedEntityAssociationLoader from '../AuthorizationRes
2
2
  import EnforcingEntityAssociationLoader from '../EnforcingEntityAssociationLoader';
3
3
  import EntityAssociationLoader from '../EntityAssociationLoader';
4
4
  import ViewerContext from '../ViewerContext';
5
- import SimpleTestEntity from '../testfixtures/SimpleTestEntity';
6
- import { createUnitTestEntityCompanionProvider } from '../utils/testing/createUnitTestEntityCompanionProvider';
5
+ import SimpleTestEntity from '../utils/__testfixtures__/SimpleTestEntity';
6
+ import { createUnitTestEntityCompanionProvider } from '../utils/__testfixtures__/createUnitTestEntityCompanionProvider';
7
7
 
8
8
  describe(EntityAssociationLoader, () => {
9
9
  describe('enforcing', () => {
@@ -13,7 +13,7 @@ import EntityNotAuthorizedError from '../errors/EntityNotAuthorizedError';
13
13
  import AlwaysAllowPrivacyPolicyRule from '../rules/AlwaysAllowPrivacyPolicyRule';
14
14
  import AlwaysDenyPrivacyPolicyRule from '../rules/AlwaysDenyPrivacyPolicyRule';
15
15
  import PrivacyPolicyRule, { RuleEvaluationResult } from '../rules/PrivacyPolicyRule';
16
- import { createUnitTestEntityCompanionProvider } from '../utils/testing/createUnitTestEntityCompanionProvider';
16
+ import { createUnitTestEntityCompanionProvider } from '../utils/__testfixtures__/createUnitTestEntityCompanionProvider';
17
17
 
18
18
  class TestUserViewerContext extends ViewerContext {
19
19
  constructor(
@@ -33,17 +33,17 @@ type BlahFields = {
33
33
  ownerID: string;
34
34
  };
35
35
 
36
- class BlahEntity extends Entity<BlahFields, string, TestUserViewerContext> {
36
+ class BlahEntity extends Entity<BlahFields, 'id', TestUserViewerContext> {
37
37
  static defineCompanionDefinition(): EntityCompanionDefinition<
38
38
  BlahFields,
39
- string,
39
+ 'id',
40
40
  TestUserViewerContext,
41
41
  BlahEntity,
42
42
  BlahEntityPrivacyPolicy
43
43
  > {
44
44
  return {
45
45
  entityClass: BlahEntity,
46
- entityConfiguration: new EntityConfiguration<BlahFields>({
46
+ entityConfiguration: new EntityConfiguration<BlahFields, 'id'>({
47
47
  idField: 'id',
48
48
  tableName: 'blah_table',
49
49
  schema: {
@@ -65,7 +65,7 @@ class BlahEntity extends Entity<BlahFields, string, TestUserViewerContext> {
65
65
 
66
66
  class DenyIfNotOwnerPrivacyPolicyRule extends PrivacyPolicyRule<
67
67
  BlahFields,
68
- string,
68
+ 'id',
69
69
  TestUserViewerContext,
70
70
  BlahEntity
71
71
  > {
@@ -74,7 +74,7 @@ class DenyIfNotOwnerPrivacyPolicyRule extends PrivacyPolicyRule<
74
74
  _queryContext: EntityQueryContext,
75
75
  _evaluationContext: EntityPrivacyPolicyEvaluationContext<
76
76
  BlahFields,
77
- string,
77
+ 'id',
78
78
  TestUserViewerContext,
79
79
  BlahEntity
80
80
  >,
@@ -89,24 +89,24 @@ class DenyIfNotOwnerPrivacyPolicyRule extends PrivacyPolicyRule<
89
89
 
90
90
  class BlahEntityPrivacyPolicy extends EntityPrivacyPolicy<
91
91
  BlahFields,
92
- string,
92
+ 'id',
93
93
  ViewerContext,
94
94
  BlahEntity
95
95
  > {
96
96
  protected override readonly createRules = [
97
97
  new DenyIfNotOwnerPrivacyPolicyRule(),
98
- new AlwaysAllowPrivacyPolicyRule<BlahFields, string, ViewerContext, BlahEntity>(),
98
+ new AlwaysAllowPrivacyPolicyRule<BlahFields, 'id', ViewerContext, BlahEntity>(),
99
99
  ];
100
100
  protected override readonly readRules = [
101
101
  new DenyIfNotOwnerPrivacyPolicyRule(),
102
- new AlwaysAllowPrivacyPolicyRule<BlahFields, string, ViewerContext, BlahEntity>(),
102
+ new AlwaysAllowPrivacyPolicyRule<BlahFields, 'id', ViewerContext, BlahEntity>(),
103
103
  ];
104
104
  protected override readonly updateRules = [
105
105
  new DenyIfNotOwnerPrivacyPolicyRule(),
106
- new AlwaysAllowPrivacyPolicyRule<BlahFields, string, ViewerContext, BlahEntity>(),
106
+ new AlwaysAllowPrivacyPolicyRule<BlahFields, 'id', ViewerContext, BlahEntity>(),
107
107
  ];
108
108
  protected override readonly deleteRules = [
109
- new AlwaysDenyPrivacyPolicyRule<BlahFields, string, ViewerContext, BlahEntity>(),
109
+ new AlwaysDenyPrivacyPolicyRule<BlahFields, 'id', ViewerContext, BlahEntity>(),
110
110
  ];
111
111
  }
112
112
 
@@ -13,13 +13,13 @@ import TestEntityWithMutationTriggers, {
13
13
  TestMTFields,
14
14
  testEntityMTConfiguration,
15
15
  TestMutationTrigger,
16
- } from '../testfixtures/TestEntityWithMutationTriggers';
16
+ } from '../utils/__testfixtures__/TestEntityWithMutationTriggers';
17
17
 
18
18
  describe(EntityCompanion, () => {
19
19
  it('correctly instantiates mutator and loader factories', () => {
20
20
  const entityCompanionProvider = instance(mock<EntityCompanionProvider>());
21
21
 
22
- const tableDataCoordinatorMock = mock<EntityTableDataCoordinator<TestMTFields>>();
22
+ const tableDataCoordinatorMock = mock<EntityTableDataCoordinator<TestMTFields, 'id'>>();
23
23
  when(tableDataCoordinatorMock.entityConfiguration).thenReturn(testEntityMTConfiguration);
24
24
 
25
25
  const companion = new EntityCompanion(
@@ -35,7 +35,7 @@ describe(EntityCompanion, () => {
35
35
  it('correctly merges local and global mutation triggers', () => {
36
36
  const globalMutationTriggers: EntityMutationTriggerConfiguration<
37
37
  TestMTFields,
38
- string,
38
+ 'id',
39
39
  ViewerContext,
40
40
  TestEntityWithMutationTriggers,
41
41
  keyof TestMTFields
@@ -53,7 +53,7 @@ describe(EntityCompanion, () => {
53
53
  globalMutationTriggers,
54
54
  );
55
55
 
56
- const tableDataCoordinatorMock = mock<EntityTableDataCoordinator<TestMTFields>>();
56
+ const tableDataCoordinatorMock = mock<EntityTableDataCoordinator<TestMTFields, 'id'>>();
57
57
  when(tableDataCoordinatorMock.entityConfiguration).thenReturn(testEntityMTConfiguration);
58
58
 
59
59
  const companion = new EntityCompanion(
@@ -4,28 +4,29 @@ import EntityConfiguration from '../EntityConfiguration';
4
4
  import { StringField } from '../EntityFields';
5
5
  import EntityPrivacyPolicy from '../EntityPrivacyPolicy';
6
6
  import ViewerContext from '../ViewerContext';
7
- import { createUnitTestEntityCompanionProvider } from '../utils/testing/createUnitTestEntityCompanionProvider';
7
+ import { createUnitTestEntityCompanionProvider } from '../utils/__testfixtures__/createUnitTestEntityCompanionProvider';
8
8
 
9
9
  type BlahFields = {
10
10
  hello: string;
11
11
  };
12
12
 
13
- const blahConfiguration = new EntityConfiguration<BlahFields>({
13
+ const blahConfiguration = new EntityConfiguration<BlahFields, 'hello'>({
14
14
  idField: 'hello',
15
15
  tableName: 'wat',
16
16
  schema: {
17
17
  hello: new StringField({
18
18
  columnName: 'hello',
19
+ cache: false,
19
20
  }),
20
21
  },
21
22
  databaseAdapterFlavor: 'postgres',
22
23
  cacheAdapterFlavor: 'redis',
23
24
  });
24
25
 
25
- class Blah1Entity extends Entity<BlahFields, string, ViewerContext> {
26
+ class Blah1Entity extends Entity<BlahFields, 'hello', ViewerContext> {
26
27
  static defineCompanionDefinition(): EntityCompanionDefinition<
27
28
  BlahFields,
28
- string,
29
+ 'hello',
29
30
  ViewerContext,
30
31
  Blah1Entity,
31
32
  NoOpTest1PrivacyPolicy
@@ -38,10 +39,10 @@ class Blah1Entity extends Entity<BlahFields, string, ViewerContext> {
38
39
  }
39
40
  }
40
41
 
41
- class Blah2Entity extends Entity<BlahFields, string, ViewerContext> {
42
+ class Blah2Entity extends Entity<BlahFields, 'hello', ViewerContext> {
42
43
  static defineCompanionDefinition(): EntityCompanionDefinition<
43
44
  BlahFields,
44
- string,
45
+ 'hello',
45
46
  ViewerContext,
46
47
  Blah2Entity,
47
48
  NoOpTest2PrivacyPolicy
@@ -56,13 +57,13 @@ class Blah2Entity extends Entity<BlahFields, string, ViewerContext> {
56
57
 
57
58
  class NoOpTest1PrivacyPolicy extends EntityPrivacyPolicy<
58
59
  BlahFields,
59
- string,
60
+ 'hello',
60
61
  ViewerContext,
61
62
  Blah1Entity
62
63
  > {}
63
64
  class NoOpTest2PrivacyPolicy extends EntityPrivacyPolicy<
64
65
  BlahFields,
65
- string,
66
+ 'hello',
66
67
  ViewerContext,
67
68
  Blah2Entity
68
69
  > {}
@@ -1,5 +1,6 @@
1
1
  import EntityConfiguration from '../EntityConfiguration';
2
- import { UUIDField, StringField } from '../EntityFields';
2
+ import { StringField, UUIDField } from '../EntityFields';
3
+ import { CompositeFieldHolder } from '../internal/CompositeFieldHolder';
3
4
 
4
5
  describe(EntityConfiguration, () => {
5
6
  describe('when valid', () => {
@@ -13,12 +14,13 @@ describe(EntityConfiguration, () => {
13
14
  id: string;
14
15
  };
15
16
 
16
- const blahEntityConfiguration = new EntityConfiguration<BlahT>({
17
+ const blahEntityConfiguration = new EntityConfiguration<BlahT, 'id'>({
17
18
  idField: 'id',
18
19
  tableName: 'blah_table',
19
20
  schema: {
20
21
  id: new UUIDField({
21
22
  columnName: 'id',
23
+ cache: false,
22
24
  }),
23
25
  cacheable: new StringField({
24
26
  columnName: 'cacheable',
@@ -30,6 +32,10 @@ describe(EntityConfiguration, () => {
30
32
  },
31
33
  databaseAdapterFlavor: 'postgres',
32
34
  cacheAdapterFlavor: 'redis',
35
+ compositeFieldDefinitions: [
36
+ { compositeField: ['id', 'cacheable'], cache: true },
37
+ { compositeField: ['id', 'uniqueButNotCacheable'], cache: false },
38
+ ],
33
39
  });
34
40
 
35
41
  it('returns correct fields', () => {
@@ -37,20 +43,91 @@ describe(EntityConfiguration, () => {
37
43
  expect(blahEntityConfiguration.tableName).toEqual('blah_table');
38
44
  expect(blahEntityConfiguration.databaseAdapterFlavor).toEqual('postgres');
39
45
  expect(blahEntityConfiguration.cacheAdapterFlavor).toEqual('redis');
46
+ expect(blahEntityConfiguration.compositeFieldInfo.getAllCompositeFieldHolders()).toEqual([
47
+ new CompositeFieldHolder(['id', 'cacheable']),
48
+ new CompositeFieldHolder(['id', 'uniqueButNotCacheable']),
49
+ ]);
40
50
  });
41
51
 
42
52
  it('filters cacheable fields', () => {
43
53
  expect(blahEntityConfiguration.cacheableKeys).toEqual(new Set(['cacheable']));
44
54
  });
45
55
 
56
+ it('correctly returns cacheable composite fields', () => {
57
+ expect(
58
+ blahEntityConfiguration.compositeFieldInfo.canCacheCompositeField(['id', 'cacheable']),
59
+ ).toBe(true);
60
+ expect(
61
+ blahEntityConfiguration.compositeFieldInfo.canCacheCompositeField([
62
+ 'id',
63
+ 'uniqueButNotCacheable',
64
+ ]),
65
+ ).toBe(false);
66
+
67
+ expect(() =>
68
+ blahEntityConfiguration.compositeFieldInfo.canCacheCompositeField(['id']),
69
+ ).toThrow('Composite field (id) not found in entity configuration');
70
+ });
71
+
72
+ it('validates composite fields', () => {
73
+ expect(
74
+ () =>
75
+ new EntityConfiguration<BlahT, 'id'>({
76
+ idField: 'id',
77
+ tableName: 'blah_table',
78
+ schema: {
79
+ id: new UUIDField({
80
+ columnName: 'id',
81
+ cache: false,
82
+ }),
83
+ cacheable: new StringField({
84
+ columnName: 'cacheable',
85
+ cache: true,
86
+ }),
87
+ uniqueButNotCacheable: new StringField({
88
+ columnName: 'unique_but_not_cacheable',
89
+ }),
90
+ },
91
+ databaseAdapterFlavor: 'postgres',
92
+ cacheAdapterFlavor: 'redis',
93
+ compositeFieldDefinitions: [{ compositeField: ['id', 'id'], cache: true }],
94
+ }),
95
+ ).toThrow('Composite field must have unique sub-fields');
96
+
97
+ expect(
98
+ () =>
99
+ new EntityConfiguration<BlahT, 'id'>({
100
+ idField: 'id',
101
+ tableName: 'blah_table',
102
+ schema: {
103
+ id: new UUIDField({
104
+ columnName: 'id',
105
+ cache: false,
106
+ }),
107
+ cacheable: new StringField({
108
+ columnName: 'cacheable',
109
+ cache: true,
110
+ }),
111
+ uniqueButNotCacheable: new StringField({
112
+ columnName: 'unique_but_not_cacheable',
113
+ }),
114
+ },
115
+ databaseAdapterFlavor: 'postgres',
116
+ cacheAdapterFlavor: 'redis',
117
+ compositeFieldDefinitions: [{ compositeField: ['id'], cache: true }],
118
+ }),
119
+ ).toThrow('Composite field must have at least two sub-fields');
120
+ });
121
+
46
122
  describe('cache key version', () => {
47
123
  it('defaults to 0', () => {
48
- const entityConfiguration = new EntityConfiguration<Blah2T>({
124
+ const entityConfiguration = new EntityConfiguration<Blah2T, 'id'>({
49
125
  idField: 'id',
50
126
  tableName: 'blah',
51
127
  schema: {
52
128
  id: new UUIDField({
53
129
  columnName: 'id',
130
+ cache: false,
54
131
  }),
55
132
  },
56
133
  databaseAdapterFlavor: 'postgres',
@@ -60,12 +137,13 @@ describe(EntityConfiguration, () => {
60
137
  });
61
138
 
62
139
  it('sets to custom version', () => {
63
- const entityConfiguration = new EntityConfiguration<Blah2T>({
140
+ const entityConfiguration = new EntityConfiguration<Blah2T, 'id'>({
64
141
  idField: 'id',
65
142
  tableName: 'blah',
66
143
  schema: {
67
144
  id: new UUIDField({
68
145
  columnName: 'id',
146
+ cache: false,
69
147
  }),
70
148
  },
71
149
  databaseAdapterFlavor: 'postgres',
@@ -95,17 +173,18 @@ describe(EntityConfiguration, () => {
95
173
  ])('disallows %p as field key', (keyName) => {
96
174
  expect(
97
175
  () =>
98
- new EntityConfiguration<any>({
176
+ new EntityConfiguration<any, 'id'>({
99
177
  idField: 'id',
100
178
  tableName: 'blah_table',
101
179
  schema: {
102
180
  id: new UUIDField({
103
181
  columnName: 'id',
182
+ cache: false,
104
183
  }),
105
184
  [keyName]: new StringField({
106
185
  columnName: 'any',
107
186
  }),
108
- },
187
+ } as any,
109
188
  databaseAdapterFlavor: 'postgres',
110
189
  cacheAdapterFlavor: 'redis',
111
190
  }),
@@ -5,10 +5,12 @@ import EntityDatabaseAdapter, {
5
5
  TableFieldMultiValueEqualityCondition,
6
6
  } from '../EntityDatabaseAdapter';
7
7
  import { EntityQueryContext } from '../EntityQueryContext';
8
+ import { CompositeFieldHolder, CompositeFieldValueHolder } from '../internal/CompositeFieldHolder';
8
9
  import { FieldTransformerMap } from '../internal/EntityFieldTransformationUtils';
9
- import { TestFields, testEntityConfiguration } from '../testfixtures/TestEntity';
10
+ import { SingleFieldHolder, SingleFieldValueHolder } from '../internal/SingleFieldHolder';
11
+ import { TestFields, testEntityConfiguration } from '../utils/__testfixtures__/TestEntity';
10
12
 
11
- class TestEntityDatabaseAdapter extends EntityDatabaseAdapter<TestFields> {
13
+ class TestEntityDatabaseAdapter extends EntityDatabaseAdapter<TestFields, 'customIdField'> {
12
14
  private readonly fetchResults: object[];
13
15
  private readonly insertResults: object[];
14
16
  private readonly updateResults: object[];
@@ -47,8 +49,8 @@ class TestEntityDatabaseAdapter extends EntityDatabaseAdapter<TestFields> {
47
49
  protected async fetchManyWhereInternalAsync(
48
50
  _queryInterface: any,
49
51
  _tableName: string,
50
- _tableField: string,
51
- _tableValues: readonly any[],
52
+ _tableColumns: readonly string[],
53
+ _tableTuples: (readonly any[])[],
52
54
  ): Promise<object[]> {
53
55
  return this.fetchResults;
54
56
  }
@@ -104,8 +106,12 @@ describe(EntityDatabaseAdapter, () => {
104
106
  it('transforms object', async () => {
105
107
  const queryContext = instance(mock(EntityQueryContext));
106
108
  const adapter = new TestEntityDatabaseAdapter({ fetchResults: [{ string_field: 'hello' }] });
107
- const result = await adapter.fetchManyWhereAsync(queryContext, 'stringField', ['hello']);
108
- expect(result.get('hello')).toEqual([{ stringField: 'hello' }]);
109
+ const result = await adapter.fetchManyWhereAsync(
110
+ queryContext,
111
+ new SingleFieldHolder('stringField'),
112
+ [new SingleFieldValueHolder('hello')],
113
+ );
114
+ expect(result.get(new SingleFieldValueHolder('hello'))).toEqual([{ stringField: 'hello' }]);
109
115
  });
110
116
 
111
117
  it('returns objects keyed by queried values', async () => {
@@ -113,22 +119,112 @@ describe(EntityDatabaseAdapter, () => {
113
119
  const adapter = new TestEntityDatabaseAdapter({
114
120
  fetchResults: [{ string_field: 'hello' }, { string_field: 'wat' }],
115
121
  });
116
- const result = await adapter.fetchManyWhereAsync(queryContext, 'stringField', [
117
- 'hello',
118
- 'wat',
119
- ]);
120
- expect(result.get('hello')).toEqual([{ stringField: 'hello' }]);
121
- expect(result.get('wat')).toEqual([{ stringField: 'wat' }]);
122
+ const result = await adapter.fetchManyWhereAsync(
123
+ queryContext,
124
+ new SingleFieldHolder('stringField'),
125
+ [new SingleFieldValueHolder('hello'), new SingleFieldValueHolder('wat')],
126
+ );
127
+ expect(result.get(new SingleFieldValueHolder('hello'))).toEqual([{ stringField: 'hello' }]);
128
+ expect(result.get(new SingleFieldValueHolder('wat'))).toEqual([{ stringField: 'wat' }]);
129
+ });
130
+
131
+ it('returns objects keyed by composite queried values', async () => {
132
+ const queryContext = instance(mock(EntityQueryContext));
133
+ const adapter = new TestEntityDatabaseAdapter({
134
+ fetchResults: [
135
+ { string_field: 'hello', number_field: 1 },
136
+ { string_field: 'wat', number_field: 2 },
137
+ ],
138
+ });
139
+ const result = await adapter.fetchManyWhereAsync(
140
+ queryContext,
141
+ new CompositeFieldHolder<TestFields, 'customIdField'>(['intField', 'stringField']),
142
+ [
143
+ new CompositeFieldValueHolder({ intField: 1, stringField: 'hello' }),
144
+ new CompositeFieldValueHolder({ intField: 2, stringField: 'wat' }),
145
+ new CompositeFieldValueHolder({ intField: 4, stringField: 'no' }),
146
+ ],
147
+ );
148
+ expect(
149
+ result.get(new CompositeFieldValueHolder({ intField: 1, stringField: 'hello' })),
150
+ ).toEqual([{ stringField: 'hello', intField: 1 }]);
151
+ expect(
152
+ result.get(new CompositeFieldValueHolder({ intField: 2, stringField: 'wat' })),
153
+ ).toEqual([{ stringField: 'wat', intField: 2 }]);
154
+ expect(result.get(new CompositeFieldValueHolder({ intField: 4, stringField: 'no' }))).toEqual(
155
+ [],
156
+ );
122
157
  });
123
158
 
124
159
  it('returns map with all keys even when no results are returned', async () => {
125
160
  const queryContext = instance(mock(EntityQueryContext));
126
161
  const adapter = new TestEntityDatabaseAdapter({});
127
- const result = await adapter.fetchManyWhereAsync(queryContext, 'stringField', [
128
- 'what',
129
- 'who',
130
- ]);
131
- expect(Array.from(result.keys())).toEqual(['what', 'who']);
162
+ const result = await adapter.fetchManyWhereAsync(
163
+ queryContext,
164
+ new SingleFieldHolder('stringField'),
165
+ [new SingleFieldValueHolder('what'), new SingleFieldValueHolder('who')],
166
+ );
167
+ expect(Array.from(result.keys()).map((v) => v.fieldValue)).toEqual(['what', 'who']);
168
+ });
169
+
170
+ it('throws when result contains invalid (null) value for key', async () => {
171
+ const queryContext = instance(mock(EntityQueryContext));
172
+ const adapter = new TestEntityDatabaseAdapter({
173
+ fetchResults: [{ string_field: null }],
174
+ });
175
+ await expect(
176
+ adapter.fetchManyWhereAsync(queryContext, new SingleFieldHolder('stringField'), [
177
+ new SingleFieldValueHolder('hello'),
178
+ ]),
179
+ ).rejects.toThrow(
180
+ 'One or more fields from the object is invalid for key SingleField(stringField); {"stringField":null}. This may indicate a faulty database adapter implementation.',
181
+ );
182
+ });
183
+
184
+ it('throws when result contains invalid (undefined) value for key', async () => {
185
+ const queryContext = instance(mock(EntityQueryContext));
186
+ const adapter = new TestEntityDatabaseAdapter({
187
+ fetchResults: [{ string_field: undefined }],
188
+ });
189
+ await expect(
190
+ adapter.fetchManyWhereAsync(queryContext, new SingleFieldHolder('stringField'), [
191
+ new SingleFieldValueHolder('hello'),
192
+ ]),
193
+ ).rejects.toThrow(
194
+ 'One or more fields from the object is invalid for key SingleField(stringField); {}. This may indicate a faulty database adapter implementation.',
195
+ );
196
+ });
197
+
198
+ it('throws when result contains invalid (null) value for composite key', async () => {
199
+ const queryContext = instance(mock(EntityQueryContext));
200
+ const adapter = new TestEntityDatabaseAdapter({
201
+ fetchResults: [{ string_field: 'hello', number_field: null }],
202
+ });
203
+ await expect(
204
+ adapter.fetchManyWhereAsync(
205
+ queryContext,
206
+ new CompositeFieldHolder<TestFields, 'customIdField'>(['intField', 'stringField']),
207
+ [new CompositeFieldValueHolder({ intField: 1, stringField: 'hello' })],
208
+ ),
209
+ ).rejects.toThrow(
210
+ 'One or more fields from the object is invalid for key CompositeField(intField,stringField); {"stringField":"hello","intField":null}. This may indicate a faulty database adapter implementation.',
211
+ );
212
+ });
213
+
214
+ it('throws when result contains invalid (undefined) value for composite key', async () => {
215
+ const queryContext = instance(mock(EntityQueryContext));
216
+ const adapter = new TestEntityDatabaseAdapter({
217
+ fetchResults: [{ string_field: 'hello', number_field: undefined }],
218
+ });
219
+ await expect(
220
+ adapter.fetchManyWhereAsync(
221
+ queryContext,
222
+ new CompositeFieldHolder<TestFields, 'customIdField'>(['intField', 'stringField']),
223
+ [new CompositeFieldValueHolder({ intField: 1, stringField: 'hello' })],
224
+ ),
225
+ ).rejects.toThrow(
226
+ 'One or more fields from the object is invalid for key CompositeField(intField,stringField); {"stringField":"hello"}. This may indicate a faulty database adapter implementation.',
227
+ );
132
228
  });
133
229
  });
134
230