@expo/entity 0.40.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 (433) hide show
  1. package/build/AuthorizationResultBasedEntityAssociationLoader.d.ts +16 -16
  2. package/build/AuthorizationResultBasedEntityAssociationLoader.js +2 -4
  3. package/build/AuthorizationResultBasedEntityAssociationLoader.js.map +1 -1
  4. package/build/AuthorizationResultBasedEntityLoader.d.ts +39 -67
  5. package/build/AuthorizationResultBasedEntityLoader.js +85 -62
  6. package/build/AuthorizationResultBasedEntityLoader.js.map +1 -1
  7. package/build/AuthorizationResultBasedEntityMutator.d.ts +16 -16
  8. package/build/AuthorizationResultBasedEntityMutator.js.map +1 -1
  9. package/build/ComposedEntityCacheAdapter.d.ts +7 -6
  10. package/build/ComposedEntityCacheAdapter.js +28 -28
  11. package/build/ComposedEntityCacheAdapter.js.map +1 -1
  12. package/build/ComposedSecondaryEntityCache.d.ts +1 -1
  13. package/build/ComposedSecondaryEntityCache.js.map +1 -1
  14. package/build/EnforcingEntityAssociationLoader.d.ts +15 -15
  15. package/build/EnforcingEntityAssociationLoader.js.map +1 -1
  16. package/build/EnforcingEntityCreator.d.ts +2 -2
  17. package/build/EnforcingEntityDeleter.d.ts +2 -2
  18. package/build/EnforcingEntityLoader.d.ts +104 -18
  19. package/build/EnforcingEntityLoader.js +113 -12
  20. package/build/EnforcingEntityLoader.js.map +1 -1
  21. package/build/EnforcingEntityUpdater.d.ts +2 -2
  22. package/build/Entity.d.ts +32 -10
  23. package/build/Entity.js +41 -3
  24. package/build/Entity.js.map +1 -1
  25. package/build/EntityAssociationLoader.d.ts +3 -3
  26. package/build/EntityCompanion.d.ts +5 -5
  27. package/build/EntityCompanion.js.map +1 -1
  28. package/build/EntityCompanionProvider.d.ts +6 -6
  29. package/build/EntityCompanionProvider.js.map +1 -1
  30. package/build/EntityConfiguration.d.ts +46 -5
  31. package/build/EntityConfiguration.js +39 -1
  32. package/build/EntityConfiguration.js.map +1 -1
  33. package/build/EntityCreator.d.ts +4 -4
  34. package/build/EntityDatabaseAdapter.d.ts +15 -14
  35. package/build/EntityDatabaseAdapter.js +20 -12
  36. package/build/EntityDatabaseAdapter.js.map +1 -1
  37. package/build/EntityDeleter.d.ts +4 -4
  38. package/build/EntityFieldDefinition.d.ts +20 -10
  39. package/build/EntityFieldDefinition.js +3 -1
  40. package/build/EntityFieldDefinition.js.map +1 -1
  41. package/build/EntityFields.d.ts +14 -12
  42. package/build/EntityFields.js.map +1 -1
  43. package/build/EntityLoader.d.ts +5 -5
  44. package/build/EntityLoaderFactory.d.ts +3 -3
  45. package/build/EntityLoaderFactory.js.map +1 -1
  46. package/build/EntityLoaderUtils.d.ts +2 -2
  47. package/build/EntityLoaderUtils.js +27 -1
  48. package/build/EntityLoaderUtils.js.map +1 -1
  49. package/build/EntityMutationInfo.d.ts +2 -2
  50. package/build/EntityMutationTriggerConfiguration.d.ts +14 -14
  51. package/build/EntityMutationTriggerConfiguration.js.map +1 -1
  52. package/build/EntityMutationValidator.d.ts +2 -2
  53. package/build/EntityMutatorFactory.d.ts +5 -5
  54. package/build/EntityMutatorFactory.js.map +1 -1
  55. package/build/EntityPrivacyPolicy.d.ts +14 -14
  56. package/build/EntityPrivacyPolicy.js.map +1 -1
  57. package/build/EntitySecondaryCacheLoader.d.ts +4 -4
  58. package/build/EntityUpdater.d.ts +4 -4
  59. package/build/GenericEntityCacheAdapter.d.ts +7 -6
  60. package/build/GenericEntityCacheAdapter.js +13 -14
  61. package/build/GenericEntityCacheAdapter.js.map +1 -1
  62. package/build/GenericSecondaryEntityCache.d.ts +3 -3
  63. package/build/GenericSecondaryEntityCache.js.map +1 -1
  64. package/build/IEntityCacheAdapter.d.ts +17 -16
  65. package/build/IEntityCacheAdapterProvider.d.ts +1 -1
  66. package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
  67. package/build/IEntityGenericCacher.d.ts +15 -5
  68. package/build/ReadonlyEntity.d.ts +27 -8
  69. package/build/ReadonlyEntity.js +31 -3
  70. package/build/ReadonlyEntity.js.map +1 -1
  71. package/build/ViewerContext.d.ts +1 -1
  72. package/build/ViewerScopedEntityCompanion.d.ts +5 -5
  73. package/build/ViewerScopedEntityCompanionProvider.d.ts +1 -1
  74. package/build/ViewerScopedEntityLoaderFactory.d.ts +3 -3
  75. package/build/ViewerScopedEntityMutatorFactory.d.ts +5 -5
  76. package/build/entityUtils.d.ts +1 -1
  77. package/build/entityUtils.js.map +1 -1
  78. package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
  79. package/build/errors/EntityNotAuthorizedError.d.ts +1 -1
  80. package/build/errors/EntityNotFoundError.d.ts +2 -2
  81. package/build/index.d.ts +7 -7
  82. package/build/index.js +8 -13
  83. package/build/index.js.map +1 -1
  84. package/build/internal/CompositeFieldHolder.d.ts +48 -0
  85. package/build/internal/CompositeFieldHolder.js +116 -0
  86. package/build/internal/CompositeFieldHolder.js.map +1 -0
  87. package/build/internal/CompositeFieldValueMap.d.ts +15 -0
  88. package/build/internal/CompositeFieldValueMap.js +51 -0
  89. package/build/internal/CompositeFieldValueMap.js.map +1 -0
  90. package/build/internal/EntityDataManager.d.ts +16 -16
  91. package/build/internal/EntityDataManager.js +42 -45
  92. package/build/internal/EntityDataManager.js.map +1 -1
  93. package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
  94. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  95. package/build/internal/EntityLoadInterfaces.d.ts +104 -0
  96. package/build/internal/EntityLoadInterfaces.js +25 -0
  97. package/build/internal/EntityLoadInterfaces.js.map +1 -0
  98. package/build/internal/EntityTableDataCoordinator.d.ts +6 -6
  99. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  100. package/build/internal/ReadThroughEntityCache.d.ts +17 -16
  101. package/build/internal/ReadThroughEntityCache.js +36 -36
  102. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  103. package/build/internal/SingleFieldHolder.d.ts +34 -0
  104. package/build/internal/SingleFieldHolder.js +90 -0
  105. package/build/internal/SingleFieldHolder.js.map +1 -0
  106. package/build/metrics/EntityMetricsUtils.d.ts +2 -1
  107. package/build/metrics/EntityMetricsUtils.js.map +1 -1
  108. package/build/metrics/IEntityMetricsAdapter.d.ts +5 -0
  109. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  110. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
  111. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  112. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
  113. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  114. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
  115. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  116. package/build/rules/PrivacyPolicyRule.d.ts +2 -2
  117. package/build/tsconfig.build.tsbuildinfo +1 -0
  118. package/build/utils/EntityPrivacyUtils.d.ts +4 -4
  119. package/build/utils/EntityPrivacyUtils.js.map +1 -1
  120. package/build/utils/collections/SerializableKeyMap.d.ts +27 -0
  121. package/build/utils/collections/SerializableKeyMap.js +60 -0
  122. package/build/utils/collections/SerializableKeyMap.js.map +1 -0
  123. package/build/utils/collections/maps.js +1 -2
  124. package/build/utils/collections/maps.js.map +1 -1
  125. package/build/utils/collections/sets.d.ts +1 -0
  126. package/build/utils/collections/sets.js +7 -0
  127. package/build/utils/collections/sets.js.map +1 -0
  128. package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +1 -1
  129. package/package.json +8 -5
  130. package/src/AuthorizationResultBasedEntityAssociationLoader.ts +58 -53
  131. package/src/AuthorizationResultBasedEntityLoader.ts +194 -81
  132. package/src/AuthorizationResultBasedEntityMutator.ts +71 -45
  133. package/src/ComposedEntityCacheAdapter.ts +55 -46
  134. package/src/ComposedSecondaryEntityCache.ts +5 -2
  135. package/src/EnforcingEntityAssociationLoader.ts +52 -44
  136. package/src/EnforcingEntityCreator.ts +5 -5
  137. package/src/EnforcingEntityDeleter.ts +5 -5
  138. package/src/EnforcingEntityLoader.ts +158 -21
  139. package/src/EnforcingEntityUpdater.ts +5 -5
  140. package/src/Entity.ts +185 -29
  141. package/src/EntityAssociationLoader.ts +6 -6
  142. package/src/EntityCompanion.ts +11 -11
  143. package/src/EntityCompanionProvider.ts +21 -18
  144. package/src/EntityConfiguration.ts +123 -9
  145. package/src/EntityCreator.ts +7 -7
  146. package/src/EntityDatabaseAdapter.ts +51 -28
  147. package/src/EntityDeleter.ts +7 -7
  148. package/src/EntityFieldDefinition.ts +32 -12
  149. package/src/EntityFields.ts +49 -12
  150. package/src/EntityLoader.ts +8 -8
  151. package/src/EntityLoaderFactory.ts +8 -8
  152. package/src/EntityLoaderUtils.ts +39 -10
  153. package/src/EntityMutationInfo.ts +6 -6
  154. package/src/EntityMutationTriggerConfiguration.ts +68 -20
  155. package/src/EntityMutationValidator.ts +4 -4
  156. package/src/EntityMutatorFactory.ts +13 -13
  157. package/src/EntityPrivacyPolicy.ts +50 -26
  158. package/src/EntitySecondaryCacheLoader.ts +6 -6
  159. package/src/EntityUpdater.ts +7 -7
  160. package/src/GenericEntityCacheAdapter.ts +39 -28
  161. package/src/GenericSecondaryEntityCache.ts +6 -3
  162. package/src/IEntityCacheAdapter.ts +45 -25
  163. package/src/IEntityCacheAdapterProvider.ts +3 -3
  164. package/src/IEntityDatabaseAdapterProvider.ts +3 -3
  165. package/src/IEntityGenericCacher.ts +33 -5
  166. package/src/ReadonlyEntity.ts +129 -16
  167. package/src/ViewerContext.ts +5 -5
  168. package/src/ViewerScopedEntityCompanion.ts +7 -7
  169. package/src/ViewerScopedEntityCompanionProvider.ts +6 -6
  170. package/src/ViewerScopedEntityLoaderFactory.ts +7 -7
  171. package/src/ViewerScopedEntityMutatorFactory.ts +8 -8
  172. package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +41 -72
  173. package/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.ts +14 -13
  174. package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +367 -69
  175. package/src/__tests__/ComposedCacheAdapter-test.ts +235 -117
  176. package/src/__tests__/EnforcingEntityLoader-test.ts +135 -1
  177. package/src/__tests__/Entity-test.ts +64 -11
  178. package/src/__tests__/EntityAssociationLoader-test.ts +6 -8
  179. package/src/__tests__/EntityCommonUseCases-test.ts +25 -28
  180. package/src/__tests__/EntityCompanion-test.ts +4 -4
  181. package/src/__tests__/EntityCompanionProvider-test.ts +9 -8
  182. package/src/__tests__/EntityConfiguration-test.ts +85 -6
  183. package/src/__tests__/EntityDatabaseAdapter-test.ts +113 -17
  184. package/src/__tests__/EntityEdges-test.ts +135 -138
  185. package/src/__tests__/EntityFields-test.ts +2 -2
  186. package/src/__tests__/EntityLoader-test.ts +5 -7
  187. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +17 -19
  188. package/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.ts +73 -0
  189. package/src/__tests__/EntityMutator-test.ts +74 -46
  190. package/src/__tests__/EntityPrivacyPolicy-test.ts +51 -74
  191. package/src/__tests__/EntityQueryContext-test.ts +1 -1
  192. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +9 -9
  193. package/src/__tests__/EntitySelfReferentialEdges-test.ts +119 -122
  194. package/src/__tests__/GenericEntityCacheAdapter-test.ts +83 -28
  195. package/src/__tests__/ReadonlyEntity-test.ts +49 -9
  196. package/src/__tests__/ViewerContext-test.ts +1 -1
  197. package/src/__tests__/ViewerScopedEntityCompanion-test.ts +5 -2
  198. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +1 -1
  199. package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +12 -3
  200. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +25 -27
  201. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +28 -34
  202. package/src/entityUtils.ts +4 -1
  203. package/src/errors/EntityInvalidFieldValueError.ts +5 -5
  204. package/src/errors/EntityNotAuthorizedError.ts +3 -3
  205. package/src/errors/EntityNotFoundError.ts +5 -5
  206. package/src/index.ts +7 -7
  207. package/src/internal/CompositeFieldHolder.ts +218 -0
  208. package/src/internal/CompositeFieldValueMap.ts +78 -0
  209. package/src/internal/EntityDataManager.ts +107 -96
  210. package/src/internal/EntityFieldTransformationUtils.ts +33 -14
  211. package/src/internal/EntityLoadInterfaces.ts +143 -0
  212. package/src/internal/EntityTableDataCoordinator.ts +8 -5
  213. package/src/internal/ReadThroughEntityCache.ts +63 -50
  214. package/src/internal/SingleFieldHolder.ts +131 -0
  215. package/src/internal/__tests__/CompositeFieldHolder-test.ts +25 -0
  216. package/src/internal/__tests__/CompositeFieldValueMap-test.ts +43 -0
  217. package/src/internal/__tests__/EntityDataManager-test.ts +308 -91
  218. package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +3 -2
  219. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +315 -107
  220. package/src/metrics/EntityMetricsUtils.ts +7 -2
  221. package/src/metrics/IEntityMetricsAdapter.ts +6 -0
  222. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +5 -5
  223. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +5 -5
  224. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +5 -5
  225. package/src/rules/PrivacyPolicyRule.ts +4 -4
  226. package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +1 -1
  227. package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +1 -1
  228. package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +1 -1
  229. package/src/utils/EntityPrivacyUtils.ts +72 -30
  230. package/src/utils/{testing → __testfixtures__}/PrivacyPolicyRuleTestUtils.ts +26 -26
  231. package/src/{testfixtures → utils/__testfixtures__}/SimpleTestEntity.ts +16 -15
  232. package/src/utils/__testfixtures__/StubCacheAdapter.ts +164 -0
  233. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapter.ts +19 -12
  234. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapterProvider.ts +4 -4
  235. package/src/utils/__testfixtures__/TSMockitoExtensions.ts +69 -0
  236. package/src/{testfixtures → utils/__testfixtures__}/TestEntity.ts +21 -15
  237. package/src/{testfixtures → utils/__testfixtures__}/TestEntity2.ts +16 -15
  238. package/src/{testfixtures → utils/__testfixtures__}/TestEntityWithMutationTriggers.ts +23 -22
  239. package/src/{testfixtures → utils/__testfixtures__}/TestViewerContext.ts +1 -1
  240. package/src/utils/{testing → __testfixtures__}/describeFieldTestCase.ts +1 -1
  241. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +81 -113
  242. package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +31 -30
  243. package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +1 -1
  244. package/src/utils/collections/SerializableKeyMap.ts +84 -0
  245. package/src/utils/collections/__tests__/SerializableKeyMap-test.ts +119 -0
  246. package/src/utils/collections/__tests__/sets-test.ts +17 -0
  247. package/src/utils/collections/maps.ts +7 -8
  248. package/src/utils/collections/sets.ts +3 -0
  249. package/src/utils/mergeEntityMutationTriggerConfigurations.ts +5 -5
  250. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
  251. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -273
  252. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
  253. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
  254. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -110
  255. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
  256. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
  257. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -401
  258. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
  259. package/build/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
  260. package/build/__tests__/ComposedCacheAdapter-test.js +0 -229
  261. package/build/__tests__/ComposedCacheAdapter-test.js.map +0 -1
  262. package/build/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
  263. package/build/__tests__/ComposedSecondaryEntityCache-test.js +0 -66
  264. package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
  265. package/build/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
  266. package/build/__tests__/EnforcingEntityAssociationLoader-test.js +0 -115
  267. package/build/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
  268. package/build/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
  269. package/build/__tests__/EnforcingEntityLoader-test.js +0 -253
  270. package/build/__tests__/EnforcingEntityLoader-test.js.map +0 -1
  271. package/build/__tests__/Entity-test.d.ts +0 -1
  272. package/build/__tests__/Entity-test.js +0 -54
  273. package/build/__tests__/Entity-test.js.map +0 -1
  274. package/build/__tests__/EntityAssociationLoader-test.d.ts +0 -1
  275. package/build/__tests__/EntityAssociationLoader-test.js +0 -30
  276. package/build/__tests__/EntityAssociationLoader-test.js.map +0 -1
  277. package/build/__tests__/EntityCommonUseCases-test.d.ts +0 -1
  278. package/build/__tests__/EntityCommonUseCases-test.js +0 -154
  279. package/build/__tests__/EntityCommonUseCases-test.js.map +0 -1
  280. package/build/__tests__/EntityCompanion-test.d.ts +0 -1
  281. package/build/__tests__/EntityCompanion-test.js +0 -77
  282. package/build/__tests__/EntityCompanion-test.js.map +0 -1
  283. package/build/__tests__/EntityCompanionProvider-test.d.ts +0 -1
  284. package/build/__tests__/EntityCompanionProvider-test.js +0 -54
  285. package/build/__tests__/EntityCompanionProvider-test.js.map +0 -1
  286. package/build/__tests__/EntityConfiguration-test.d.ts +0 -1
  287. package/build/__tests__/EntityConfiguration-test.js +0 -103
  288. package/build/__tests__/EntityConfiguration-test.js.map +0 -1
  289. package/build/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
  290. package/build/__tests__/EntityDatabaseAdapter-test.js +0 -146
  291. package/build/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
  292. package/build/__tests__/EntityEdges-test.d.ts +0 -1
  293. package/build/__tests__/EntityEdges-test.js +0 -755
  294. package/build/__tests__/EntityEdges-test.js.map +0 -1
  295. package/build/__tests__/EntityFields-test.d.ts +0 -1
  296. package/build/__tests__/EntityFields-test.js +0 -63
  297. package/build/__tests__/EntityFields-test.js.map +0 -1
  298. package/build/__tests__/EntityLoader-test.d.ts +0 -1
  299. package/build/__tests__/EntityLoader-test.js +0 -36
  300. package/build/__tests__/EntityLoader-test.js.map +0 -1
  301. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
  302. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -77
  303. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
  304. package/build/__tests__/EntityMutator-test.d.ts +0 -1
  305. package/build/__tests__/EntityMutator-test.js +0 -741
  306. package/build/__tests__/EntityMutator-test.js.map +0 -1
  307. package/build/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
  308. package/build/__tests__/EntityPrivacyPolicy-test.js +0 -463
  309. package/build/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
  310. package/build/__tests__/EntityQueryContext-test.d.ts +0 -1
  311. package/build/__tests__/EntityQueryContext-test.js +0 -116
  312. package/build/__tests__/EntityQueryContext-test.js.map +0 -1
  313. package/build/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
  314. package/build/__tests__/EntitySecondaryCacheLoader-test.js +0 -60
  315. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
  316. package/build/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
  317. package/build/__tests__/EntitySelfReferentialEdges-test.js +0 -247
  318. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
  319. package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
  320. package/build/__tests__/GenericEntityCacheAdapter-test.js +0 -80
  321. package/build/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
  322. package/build/__tests__/ReadonlyEntity-test.d.ts +0 -1
  323. package/build/__tests__/ReadonlyEntity-test.js +0 -178
  324. package/build/__tests__/ReadonlyEntity-test.js.map +0 -1
  325. package/build/__tests__/ViewerContext-test.d.ts +0 -1
  326. package/build/__tests__/ViewerContext-test.js +0 -30
  327. package/build/__tests__/ViewerContext-test.js.map +0 -1
  328. package/build/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
  329. package/build/__tests__/ViewerScopedEntityCompanion-test.js +0 -20
  330. package/build/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
  331. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
  332. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -20
  333. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
  334. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
  335. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -23
  336. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
  337. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
  338. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -22
  339. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
  340. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
  341. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -129
  342. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
  343. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
  344. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -136
  345. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
  346. package/build/__tests__/entityUtils-test.d.ts +0 -1
  347. package/build/__tests__/entityUtils-test.js +0 -87
  348. package/build/__tests__/entityUtils-test.js.map +0 -1
  349. package/build/internal/__tests__/EntityDataManager-test.d.ts +0 -1
  350. package/build/internal/__tests__/EntityDataManager-test.js +0 -373
  351. package/build/internal/__tests__/EntityDataManager-test.js.map +0 -1
  352. package/build/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
  353. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -136
  354. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
  355. package/build/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
  356. package/build/internal/__tests__/ReadThroughEntityCache-test.js +0 -206
  357. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
  358. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
  359. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -21
  360. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
  361. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
  362. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -21
  363. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
  364. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
  365. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -21
  366. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
  367. package/build/testfixtures/DateIDTestEntity.d.ts +0 -19
  368. package/build/testfixtures/DateIDTestEntity.js +0 -48
  369. package/build/testfixtures/DateIDTestEntity.js.map +0 -1
  370. package/build/testfixtures/SimpleTestEntity.d.ts +0 -20
  371. package/build/testfixtures/SimpleTestEntity.js +0 -48
  372. package/build/testfixtures/SimpleTestEntity.js.map +0 -1
  373. package/build/testfixtures/TestEntity.d.ts +0 -30
  374. package/build/testfixtures/TestEntity.js +0 -93
  375. package/build/testfixtures/TestEntity.js.map +0 -1
  376. package/build/testfixtures/TestEntity2.d.ts +0 -20
  377. package/build/testfixtures/TestEntity2.js +0 -51
  378. package/build/testfixtures/TestEntity2.js.map +0 -1
  379. package/build/testfixtures/TestEntityNumberKey.d.ts +0 -19
  380. package/build/testfixtures/TestEntityNumberKey.js +0 -48
  381. package/build/testfixtures/TestEntityNumberKey.js.map +0 -1
  382. package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +0 -36
  383. package/build/testfixtures/TestEntityWithMutationTriggers.js +0 -82
  384. package/build/testfixtures/TestEntityWithMutationTriggers.js.map +0 -1
  385. package/build/testfixtures/TestViewerContext.d.ts +0 -3
  386. package/build/testfixtures/TestViewerContext.js +0 -10
  387. package/build/testfixtures/TestViewerContext.js.map +0 -1
  388. package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
  389. package/build/utils/__tests__/EntityPrivacyUtils-test.js +0 -520
  390. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
  391. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
  392. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -181
  393. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
  394. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
  395. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -26
  396. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
  397. package/build/utils/collections/__tests__/maps-test.d.ts +0 -1
  398. package/build/utils/collections/__tests__/maps-test.js +0 -120
  399. package/build/utils/collections/__tests__/maps-test.js.map +0 -1
  400. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +0 -28
  401. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js +0 -52
  402. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +0 -1
  403. package/build/utils/testing/StubCacheAdapter.d.ts +0 -27
  404. package/build/utils/testing/StubCacheAdapter.js +0 -86
  405. package/build/utils/testing/StubCacheAdapter.js.map +0 -1
  406. package/build/utils/testing/StubDatabaseAdapter.d.ts +0 -25
  407. package/build/utils/testing/StubDatabaseAdapter.js +0 -191
  408. package/build/utils/testing/StubDatabaseAdapter.js.map +0 -1
  409. package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +0 -7
  410. package/build/utils/testing/StubDatabaseAdapterProvider.js +0 -14
  411. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +0 -1
  412. package/build/utils/testing/StubQueryContextProvider.d.ts +0 -7
  413. package/build/utils/testing/StubQueryContextProvider.js +0 -19
  414. package/build/utils/testing/StubQueryContextProvider.js.map +0 -1
  415. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +0 -1
  416. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +0 -42
  417. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +0 -1
  418. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.d.ts +0 -1
  419. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +0 -402
  420. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +0 -1
  421. package/build/utils/testing/createUnitTestEntityCompanionProvider.d.ts +0 -7
  422. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +0 -36
  423. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +0 -1
  424. package/build/utils/testing/describeFieldTestCase.d.ts +0 -2
  425. package/build/utils/testing/describeFieldTestCase.js +0 -18
  426. package/build/utils/testing/describeFieldTestCase.js.map +0 -1
  427. package/src/testfixtures/DateIDTestEntity.ts +0 -59
  428. package/src/testfixtures/TestEntityNumberKey.ts +0 -59
  429. package/src/utils/testing/StubCacheAdapter.ts +0 -122
  430. package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +0 -42
  431. package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +0 -548
  432. /package/src/utils/{testing → __testfixtures__}/StubQueryContextProvider.ts +0 -0
  433. /package/src/utils/{testing → __testfixtures__}/createUnitTestEntityCompanionProvider.ts +0 -0
@@ -1,122 +0,0 @@
1
- import invariant from 'invariant';
2
-
3
- import EntityConfiguration from '../../EntityConfiguration';
4
- import IEntityCacheAdapter from '../../IEntityCacheAdapter';
5
- import IEntityCacheAdapterProvider from '../../IEntityCacheAdapterProvider';
6
- import { CacheStatus, CacheLoadResult } from '../../internal/ReadThroughEntityCache';
7
-
8
- export class NoCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
9
- getCacheAdapter<TFields extends Record<string, any>>(
10
- _entityConfiguration: EntityConfiguration<TFields>,
11
- ): IEntityCacheAdapter<TFields> {
12
- return new NoCacheStubCacheAdapter();
13
- }
14
- }
15
-
16
- export class NoCacheStubCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
17
- public async loadManyAsync<N extends keyof TFields>(
18
- _fieldName: N,
19
- fieldValues: readonly NonNullable<TFields[N]>[],
20
- ): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>> {
21
- return fieldValues.reduce((acc: Map<NonNullable<TFields[N]>, CacheLoadResult<TFields>>, v) => {
22
- acc.set(v, {
23
- status: CacheStatus.MISS,
24
- });
25
- return acc;
26
- }, new Map());
27
- }
28
-
29
- public async cacheManyAsync<N extends keyof TFields>(
30
- _fieldName: N,
31
- _objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>,
32
- ): Promise<void> {}
33
-
34
- public async cacheDBMissesAsync<N extends keyof TFields>(
35
- _fieldName: N,
36
- _fieldValues: readonly NonNullable<TFields[N]>[],
37
- ): Promise<void> {}
38
-
39
- async invalidateManyAsync<N extends keyof TFields>(
40
- _fieldName: N,
41
- _fieldValues: readonly TFields[N][],
42
- ): Promise<void> {}
43
- }
44
-
45
- export class InMemoryFullCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
46
- cache: Map<string, Readonly<object>> = new Map();
47
-
48
- getCacheAdapter<TFields extends Record<string, any>>(
49
- entityConfiguration: EntityConfiguration<TFields>,
50
- ): IEntityCacheAdapter<TFields> {
51
- return new InMemoryFullCacheStubCacheAdapter(
52
- entityConfiguration,
53
- this.cache as Map<string, Readonly<TFields>>,
54
- );
55
- }
56
- }
57
-
58
- export class InMemoryFullCacheStubCacheAdapter<TFields extends Record<string, any>>
59
- implements IEntityCacheAdapter<TFields>
60
- {
61
- constructor(
62
- private readonly entityConfiguration: EntityConfiguration<TFields>,
63
- readonly cache: Map<string, Readonly<TFields>>,
64
- ) {}
65
-
66
- public async loadManyAsync<N extends keyof TFields>(
67
- fieldName: N,
68
- fieldValues: readonly NonNullable<TFields[N]>[],
69
- ): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>> {
70
- const results = new Map<NonNullable<TFields[N]>, CacheLoadResult<TFields>>();
71
- fieldValues.forEach((fieldValue) => {
72
- const cacheKey = this.createCacheKey(fieldName, fieldValue);
73
- if (!this.cache.has(cacheKey)) {
74
- results.set(fieldValue, {
75
- status: CacheStatus.MISS,
76
- });
77
- } else {
78
- const objectForFieldValue = this.cache.get(cacheKey);
79
- invariant(objectForFieldValue !== undefined, 'should have set value for key');
80
- results.set(fieldValue, {
81
- status: CacheStatus.HIT,
82
- item: objectForFieldValue,
83
- });
84
- }
85
- });
86
- return results;
87
- }
88
-
89
- public async cacheManyAsync<N extends keyof TFields>(
90
- fieldName: N,
91
- objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>,
92
- ): Promise<void> {
93
- objectMap.forEach((obj, fieldValue) => {
94
- const cacheKey = this.createCacheKey(fieldName, fieldValue);
95
- this.cache.set(cacheKey, obj);
96
- });
97
- }
98
-
99
- public async cacheDBMissesAsync<N extends keyof TFields>(
100
- _fieldName: N,
101
- _fieldValues: readonly NonNullable<TFields[N]>[],
102
- ): Promise<void> {}
103
-
104
- public async invalidateManyAsync<N extends keyof TFields>(
105
- fieldName: N,
106
- fieldValues: readonly NonNullable<TFields[N]>[],
107
- ): Promise<void> {
108
- fieldValues.forEach((fieldValue) => {
109
- const cacheKey = this.createCacheKey(fieldName, fieldValue);
110
- this.cache.delete(cacheKey);
111
- });
112
- }
113
-
114
- private createCacheKey<N extends keyof TFields>(fieldName: N, fieldValue: TFields[N]): string {
115
- return [
116
- this.entityConfiguration.tableName,
117
- `v${this.entityConfiguration.cacheKeyVersion}`,
118
- fieldName as string,
119
- String(fieldValue),
120
- ].join(':');
121
- }
122
- }
@@ -1,42 +0,0 @@
1
- import { anything, instance, mock } from 'ts-mockito';
2
-
3
- import { EntityPrivacyPolicyEvaluationContext } from '../../../EntityPrivacyPolicy';
4
- import { EntityQueryContext } from '../../../EntityQueryContext';
5
- import ViewerContext from '../../../ViewerContext';
6
- import AlwaysAllowPrivacyPolicyRule from '../../../rules/AlwaysAllowPrivacyPolicyRule';
7
- import AlwaysDenyPrivacyPolicyRule from '../../../rules/AlwaysDenyPrivacyPolicyRule';
8
- import { describePrivacyPolicyRuleWithAsyncTestCase } from '../PrivacyPolicyRuleTestUtils';
9
-
10
- describe(describePrivacyPolicyRuleWithAsyncTestCase, () => {
11
- describe('default args do not execute', () => {
12
- describePrivacyPolicyRuleWithAsyncTestCase(new AlwaysAllowPrivacyPolicyRule(), {
13
- allowCases: new Map([
14
- [
15
- 'case',
16
- async () => ({
17
- viewerContext: instance(mock(ViewerContext)),
18
- queryContext: instance(mock(EntityQueryContext)),
19
- evaluationContext:
20
- instance(mock<EntityPrivacyPolicyEvaluationContext<any, any, any, any, any>>()),
21
- entity: anything(),
22
- }),
23
- ],
24
- ]),
25
- });
26
-
27
- describePrivacyPolicyRuleWithAsyncTestCase(new AlwaysDenyPrivacyPolicyRule(), {
28
- denyCases: new Map([
29
- [
30
- 'case',
31
- async () => ({
32
- viewerContext: instance(mock(ViewerContext)),
33
- queryContext: instance(mock(EntityQueryContext)),
34
- evaluationContext:
35
- instance(mock<EntityPrivacyPolicyEvaluationContext<any, any, any, any, any>>()),
36
- entity: anything(),
37
- }),
38
- ],
39
- ]),
40
- });
41
- });
42
- });
@@ -1,548 +0,0 @@
1
- import { instance, mock } from 'ts-mockito';
2
-
3
- import { OrderByOrdering } from '../../../EntityDatabaseAdapter';
4
- import { EntityQueryContext } from '../../../EntityQueryContext';
5
- import {
6
- DateIDTestFields,
7
- dateIDTestEntityConfiguration,
8
- } from '../../../testfixtures/DateIDTestEntity';
9
- import {
10
- SimpleTestFields,
11
- simpleTestEntityConfiguration,
12
- } from '../../../testfixtures/SimpleTestEntity';
13
- import { TestFields, testEntityConfiguration } from '../../../testfixtures/TestEntity';
14
- import {
15
- NumberKeyFields,
16
- numberKeyEntityConfiguration,
17
- } from '../../../testfixtures/TestEntityNumberKey';
18
- import StubDatabaseAdapter from '../StubDatabaseAdapter';
19
-
20
- describe(StubDatabaseAdapter, () => {
21
- describe('fetchManyWhereAsync', () => {
22
- it('fetches many where', async () => {
23
- const queryContext = instance(mock(EntityQueryContext));
24
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
25
- testEntityConfiguration,
26
- StubDatabaseAdapter.convertFieldObjectsToDataStore(
27
- testEntityConfiguration,
28
- new Map([
29
- [
30
- testEntityConfiguration.tableName,
31
- [
32
- {
33
- customIdField: 'hello',
34
- testIndexedField: 'h1',
35
- intField: 5,
36
- stringField: 'huh',
37
- dateField: new Date(),
38
- nullableField: null,
39
- },
40
- {
41
- customIdField: 'world',
42
- testIndexedField: 'h2',
43
- intField: 3,
44
- stringField: 'wat',
45
- dateField: new Date(),
46
- nullableField: null,
47
- },
48
- ],
49
- ],
50
- ]),
51
- ),
52
- );
53
-
54
- const results = await databaseAdapter.fetchManyWhereAsync(queryContext, 'stringField', [
55
- 'huh',
56
- ]);
57
- expect(results.get('huh')).toHaveLength(1);
58
- });
59
- });
60
-
61
- describe('fetchManyByFieldEqualityConjunctionAsync', () => {
62
- it('supports conjuntions and query modifiers', async () => {
63
- const queryContext = instance(mock(EntityQueryContext));
64
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
65
- testEntityConfiguration,
66
- StubDatabaseAdapter.convertFieldObjectsToDataStore(
67
- testEntityConfiguration,
68
- new Map([
69
- [
70
- testEntityConfiguration.tableName,
71
- [
72
- {
73
- customIdField: 'hello',
74
- testIndexedField: 'h1',
75
- intField: 3,
76
- stringField: 'a',
77
- dateField: new Date(),
78
- nullableField: null,
79
- },
80
- {
81
- customIdField: 'world',
82
- testIndexedField: 'h2',
83
- intField: 3,
84
- stringField: 'b',
85
- dateField: new Date(),
86
- nullableField: null,
87
- },
88
- {
89
- customIdField: 'world',
90
- testIndexedField: 'h2',
91
- intField: 3,
92
- stringField: 'c',
93
- dateField: new Date(),
94
- nullableField: null,
95
- },
96
- ],
97
- ],
98
- ]),
99
- ),
100
- );
101
-
102
- const results = await databaseAdapter.fetchManyByFieldEqualityConjunctionAsync(
103
- queryContext,
104
- [
105
- {
106
- fieldName: 'customIdField',
107
- fieldValues: ['hello', 'world'],
108
- },
109
- {
110
- fieldName: 'intField',
111
- fieldValue: 3,
112
- },
113
- ],
114
- {
115
- limit: 2,
116
- offset: 1,
117
- orderBy: [
118
- {
119
- fieldName: 'stringField',
120
- order: OrderByOrdering.DESCENDING,
121
- },
122
- ],
123
- },
124
- );
125
-
126
- expect(results).toHaveLength(2);
127
- expect(results.map((e) => e.stringField)).toEqual(['b', 'a']);
128
- });
129
-
130
- it('supports multiple order bys', async () => {
131
- const queryContext = instance(mock(EntityQueryContext));
132
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
133
- testEntityConfiguration,
134
- StubDatabaseAdapter.convertFieldObjectsToDataStore(
135
- testEntityConfiguration,
136
- new Map([
137
- [
138
- testEntityConfiguration.tableName,
139
- [
140
- {
141
- customIdField: 'hello',
142
- testIndexedField: 'h1',
143
- intField: 3,
144
- stringField: 'a',
145
- dateField: new Date(),
146
- nullableField: null,
147
- },
148
- {
149
- customIdField: 'world',
150
- testIndexedField: 'h2',
151
- intField: 3,
152
- stringField: 'b',
153
- dateField: new Date(),
154
- nullableField: null,
155
- },
156
- {
157
- customIdField: 'world',
158
- testIndexedField: 'h2',
159
- intField: 3,
160
- stringField: 'c',
161
- dateField: new Date(),
162
- nullableField: null,
163
- },
164
- ],
165
- ],
166
- ]),
167
- ),
168
- );
169
-
170
- const results = await databaseAdapter.fetchManyByFieldEqualityConjunctionAsync(
171
- queryContext,
172
- [
173
- {
174
- fieldName: 'intField',
175
- fieldValue: 3,
176
- },
177
- ],
178
- {
179
- orderBy: [
180
- {
181
- fieldName: 'intField',
182
- order: OrderByOrdering.DESCENDING,
183
- },
184
- {
185
- fieldName: 'stringField',
186
- order: OrderByOrdering.DESCENDING,
187
- },
188
- ],
189
- },
190
- );
191
-
192
- expect(results).toHaveLength(3);
193
- expect(results.map((e) => e.stringField)).toEqual(['c', 'b', 'a']);
194
- });
195
-
196
- it('supports null field values', async () => {
197
- const queryContext = instance(mock(EntityQueryContext));
198
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
199
- testEntityConfiguration,
200
- StubDatabaseAdapter.convertFieldObjectsToDataStore(
201
- testEntityConfiguration,
202
- new Map([
203
- [
204
- testEntityConfiguration.tableName,
205
- [
206
- {
207
- customIdField: '1',
208
- testIndexedField: 'h1',
209
- intField: 1,
210
- stringField: 'a',
211
- dateField: new Date(),
212
- nullableField: 'a',
213
- },
214
- {
215
- customIdField: '2',
216
- testIndexedField: 'h2',
217
- intField: 2,
218
- stringField: 'a',
219
- dateField: new Date(),
220
- nullableField: 'b',
221
- },
222
- {
223
- customIdField: '3',
224
- testIndexedField: 'h3',
225
- intField: 3,
226
- stringField: 'a',
227
- dateField: new Date(),
228
- nullableField: null,
229
- },
230
- {
231
- customIdField: '4',
232
- testIndexedField: 'h4',
233
- intField: 4,
234
- stringField: 'b',
235
- dateField: new Date(),
236
- nullableField: null,
237
- },
238
- ],
239
- ],
240
- ]),
241
- ),
242
- );
243
-
244
- const results = await databaseAdapter.fetchManyByFieldEqualityConjunctionAsync(
245
- queryContext,
246
- [{ fieldName: 'nullableField', fieldValue: null }],
247
- {},
248
- );
249
- expect(results).toHaveLength(2);
250
- expect(results[0]!.nullableField).toBeNull();
251
-
252
- const results2 = await databaseAdapter.fetchManyByFieldEqualityConjunctionAsync(
253
- queryContext,
254
- [
255
- { fieldName: 'nullableField', fieldValues: ['a', null] },
256
- { fieldName: 'stringField', fieldValue: 'a' },
257
- ],
258
- {
259
- orderBy: [
260
- {
261
- fieldName: 'nullableField',
262
- order: OrderByOrdering.DESCENDING,
263
- },
264
- ],
265
- },
266
- );
267
- expect(results2).toHaveLength(2);
268
- expect(results2.map((e) => e.nullableField)).toEqual([null, 'a']);
269
- });
270
- });
271
-
272
- describe('fetchManyByRawWhereClauseAsync', () => {
273
- it('throws because it is unsupported', async () => {
274
- const queryContext = instance(mock(EntityQueryContext));
275
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
276
- testEntityConfiguration,
277
- new Map(),
278
- );
279
- await expect(
280
- databaseAdapter.fetchManyByRawWhereClauseAsync(queryContext, '', [], {}),
281
- ).rejects.toThrow();
282
- });
283
- });
284
-
285
- describe('insertAsync', () => {
286
- it('inserts a record', async () => {
287
- const queryContext = instance(mock(EntityQueryContext));
288
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
289
- testEntityConfiguration,
290
- new Map(),
291
- );
292
- const result = await databaseAdapter.insertAsync(queryContext, {
293
- stringField: 'hello',
294
- });
295
- expect(result).toMatchObject({
296
- stringField: 'hello',
297
- });
298
-
299
- expect(
300
- databaseAdapter.getObjectCollectionForTable(testEntityConfiguration.tableName),
301
- ).toHaveLength(1);
302
- });
303
-
304
- it('inserts a record with valid v7 id', async () => {
305
- const expectedTime = new Date('2024-06-03T20:16:33.761Z');
306
-
307
- jest.useFakeTimers({
308
- now: expectedTime,
309
- });
310
-
311
- const queryContext = instance(mock(EntityQueryContext));
312
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
313
- testEntityConfiguration,
314
- new Map(),
315
- );
316
- const result = await databaseAdapter.insertAsync(queryContext, {
317
- stringField: 'hello',
318
- });
319
-
320
- const ts = getTimeFromUUIDv7(result.customIdField);
321
- expect(ts).toEqual(expectedTime);
322
- });
323
- });
324
-
325
- describe('updateAsync', () => {
326
- it('updates a record', async () => {
327
- const queryContext = instance(mock(EntityQueryContext));
328
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
329
- testEntityConfiguration,
330
- StubDatabaseAdapter.convertFieldObjectsToDataStore(
331
- testEntityConfiguration,
332
- new Map([
333
- [
334
- testEntityConfiguration.tableName,
335
- [
336
- {
337
- customIdField: 'hello',
338
- testIndexedField: 'h1',
339
- intField: 3,
340
- stringField: 'a',
341
- dateField: new Date(),
342
- nullableField: null,
343
- },
344
- ],
345
- ],
346
- ]),
347
- ),
348
- );
349
- const result = await databaseAdapter.updateAsync(queryContext, 'customIdField', 'hello', {
350
- stringField: 'b',
351
- });
352
- expect(result).toMatchObject({
353
- stringField: 'b',
354
- testIndexedField: 'h1',
355
- });
356
- });
357
-
358
- it('throws error when empty update to match common DBMS behavior', async () => {
359
- const queryContext = instance(mock(EntityQueryContext));
360
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
361
- testEntityConfiguration,
362
- StubDatabaseAdapter.convertFieldObjectsToDataStore(
363
- testEntityConfiguration,
364
- new Map([
365
- [
366
- testEntityConfiguration.tableName,
367
- [
368
- {
369
- customIdField: 'hello',
370
- testIndexedField: 'h1',
371
- intField: 3,
372
- stringField: 'a',
373
- dateField: new Date(),
374
- nullableField: null,
375
- },
376
- ],
377
- ],
378
- ]),
379
- ),
380
- );
381
- await expect(
382
- databaseAdapter.updateAsync(queryContext, 'customIdField', 'hello', {}),
383
- ).rejects.toThrowError(`Empty update (custom_id = hello)`);
384
- });
385
- });
386
-
387
- describe('deleteAsync', () => {
388
- it('deletes an object', async () => {
389
- const queryContext = instance(mock(EntityQueryContext));
390
- const databaseAdapter = new StubDatabaseAdapter<TestFields>(
391
- testEntityConfiguration,
392
- StubDatabaseAdapter.convertFieldObjectsToDataStore(
393
- testEntityConfiguration,
394
- new Map([
395
- [
396
- testEntityConfiguration.tableName,
397
- [
398
- {
399
- customIdField: 'hello',
400
- testIndexedField: 'h1',
401
- intField: 3,
402
- stringField: 'a',
403
- dateField: new Date(),
404
- nullableField: null,
405
- },
406
- ],
407
- ],
408
- ]),
409
- ),
410
- );
411
-
412
- await databaseAdapter.deleteAsync(queryContext, 'customIdField', 'hello');
413
-
414
- expect(
415
- databaseAdapter.getObjectCollectionForTable(testEntityConfiguration.tableName),
416
- ).toHaveLength(0);
417
- });
418
- });
419
-
420
- it('supports string and number IDs', async () => {
421
- const queryContext = instance(mock(EntityQueryContext));
422
- const databaseAdapter1 = new StubDatabaseAdapter<SimpleTestFields>(
423
- simpleTestEntityConfiguration,
424
- new Map(),
425
- );
426
- const insertedObject1 = await databaseAdapter1.insertAsync(queryContext, {});
427
- expect(typeof insertedObject1.id).toBe('string');
428
-
429
- const databaseAdapter2 = new StubDatabaseAdapter<NumberKeyFields>(
430
- numberKeyEntityConfiguration,
431
- new Map(),
432
- );
433
- const insertedObject2 = await databaseAdapter2.insertAsync(queryContext, {});
434
- expect(typeof insertedObject2.id).toBe('number');
435
-
436
- const databaseAdapter3 = new StubDatabaseAdapter<DateIDTestFields>(
437
- dateIDTestEntityConfiguration,
438
- new Map(),
439
- );
440
- await expect(databaseAdapter3.insertAsync(queryContext, {})).rejects.toThrowError(
441
- 'Unsupported ID type for StubDatabaseAdapter: DateField',
442
- );
443
- });
444
-
445
- describe('compareByOrderBys', () => {
446
- describe('comparison', () => {
447
- it.each([
448
- // nulls compare with 0
449
- [OrderByOrdering.DESCENDING, null, 0, -1],
450
- [OrderByOrdering.ASCENDING, null, 0, 1],
451
- [OrderByOrdering.DESCENDING, 0, null, 1],
452
- [OrderByOrdering.ASCENDING, 0, null, -1],
453
-
454
- // nulls compare with nulls
455
- [OrderByOrdering.DESCENDING, null, null, 0],
456
- [OrderByOrdering.ASCENDING, null, null, 0],
457
-
458
- // nulls compare with -1
459
- [OrderByOrdering.DESCENDING, null, -1, -1],
460
- [OrderByOrdering.ASCENDING, null, -1, 1],
461
- [OrderByOrdering.DESCENDING, -1, null, 1],
462
- [OrderByOrdering.ASCENDING, -1, null, -1],
463
-
464
- // basic compares
465
- [OrderByOrdering.ASCENDING, 'a', 'b', -1],
466
- [OrderByOrdering.ASCENDING, 'b', 'a', 1],
467
- [OrderByOrdering.DESCENDING, 'a', 'b', 1],
468
- [OrderByOrdering.DESCENDING, 'b', 'a', -1],
469
- ])('case (%p; %p; %p)', (order, v1, v2, expectedResult) => {
470
- expect(
471
- StubDatabaseAdapter['compareByOrderBys'](
472
- [
473
- {
474
- columnName: 'hello',
475
- order,
476
- },
477
- ],
478
- {
479
- hello: v1,
480
- },
481
- {
482
- hello: v2,
483
- },
484
- ),
485
- ).toEqual(expectedResult);
486
- });
487
-
488
- it('works for empty', () => {
489
- expect(
490
- StubDatabaseAdapter['compareByOrderBys'](
491
- [],
492
- {
493
- hello: 'test',
494
- },
495
- {
496
- hello: 'blah',
497
- },
498
- ),
499
- ).toEqual(0);
500
- });
501
- });
502
-
503
- describe('recursing', () => {
504
- expect(
505
- StubDatabaseAdapter['compareByOrderBys'](
506
- [
507
- {
508
- columnName: 'hello',
509
- order: OrderByOrdering.ASCENDING,
510
- },
511
- {
512
- columnName: 'world',
513
- order: OrderByOrdering.ASCENDING,
514
- },
515
- ],
516
- {
517
- hello: 'a',
518
- world: 1,
519
- },
520
- {
521
- hello: 'a',
522
- world: 2,
523
- },
524
- ),
525
- ).toEqual(-1);
526
- });
527
- });
528
- });
529
-
530
- const UUIDV7_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-7[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
531
-
532
- /**
533
- * Returns the Date object encoded in the first 48 bits of the given UUIDv7.
534
- * @throws TypeError if the UUID is not version 7
535
- */
536
- function getTimeFromUUIDv7(uuid: string): Date {
537
- if (!UUIDV7_REGEX.test(uuid)) {
538
- throw new TypeError(`UUID must be version 7 to get its timestamp`);
539
- }
540
-
541
- // The first 48 bits = 12 hex characters of the UUID encode the timestamp in big endian
542
- const hexCharacters = uuid.replaceAll('-', '').split('', 12);
543
- const milliseconds = hexCharacters.reduce(
544
- (milliseconds, character) => milliseconds * 16 + parseInt(character, 16),
545
- 0,
546
- );
547
- return new Date(milliseconds);
548
- }