@expo/entity 0.34.0 → 0.36.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 (333) hide show
  1. package/build/AuthorizationResultBasedEntityLoader.d.ts +128 -0
  2. package/build/AuthorizationResultBasedEntityLoader.js +196 -0
  3. package/build/AuthorizationResultBasedEntityLoader.js.map +1 -0
  4. package/build/ComposedEntityCacheAdapter.js +1 -0
  5. package/build/ComposedEntityCacheAdapter.js.map +1 -1
  6. package/build/ComposedSecondaryEntityCache.js +1 -0
  7. package/build/ComposedSecondaryEntityCache.js.map +1 -1
  8. package/build/EnforcingEntityLoader.d.ts +5 -4
  9. package/build/EnforcingEntityLoader.js +4 -2
  10. package/build/EnforcingEntityLoader.js.map +1 -1
  11. package/build/Entity.d.ts +4 -31
  12. package/build/Entity.js +19 -46
  13. package/build/Entity.js.map +1 -1
  14. package/build/EntityAssociationLoader.d.ts +9 -9
  15. package/build/EntityAssociationLoader.js +37 -12
  16. package/build/EntityAssociationLoader.js.map +1 -1
  17. package/build/EntityCompanion.js +9 -1
  18. package/build/EntityCompanion.js.map +1 -1
  19. package/build/EntityCompanionProvider.d.ts +3 -1
  20. package/build/EntityCompanionProvider.js +10 -4
  21. package/build/EntityCompanionProvider.js.map +1 -1
  22. package/build/EntityConfiguration.d.ts +2 -1
  23. package/build/EntityConfiguration.js +19 -1
  24. package/build/EntityConfiguration.js.map +1 -1
  25. package/build/EntityDatabaseAdapter.d.ts +2 -2
  26. package/build/EntityDatabaseAdapter.js +5 -3
  27. package/build/EntityDatabaseAdapter.js.map +1 -1
  28. package/build/EntityFieldDefinition.d.ts +21 -10
  29. package/build/EntityFieldDefinition.js +8 -9
  30. package/build/EntityFieldDefinition.js.map +1 -1
  31. package/build/EntityFields.d.ts +10 -0
  32. package/build/EntityFields.js +15 -1
  33. package/build/EntityFields.js.map +1 -1
  34. package/build/EntityLoader.d.ts +12 -125
  35. package/build/EntityLoader.js +24 -239
  36. package/build/EntityLoader.js.map +1 -1
  37. package/build/EntityLoaderFactory.d.ts +1 -1
  38. package/build/EntityLoaderFactory.js +3 -0
  39. package/build/EntityLoaderFactory.js.map +1 -1
  40. package/build/EntityLoaderUtils.d.ts +58 -0
  41. package/build/EntityLoaderUtils.js +109 -0
  42. package/build/EntityLoaderUtils.js.map +1 -0
  43. package/build/EntityMutator.d.ts +1 -0
  44. package/build/EntityMutator.js +71 -56
  45. package/build/EntityMutator.js.map +1 -1
  46. package/build/EntityMutatorFactory.js +9 -0
  47. package/build/EntityMutatorFactory.js.map +1 -1
  48. package/build/EntityPrivacyPolicy.d.ts +11 -5
  49. package/build/EntityPrivacyPolicy.js +5 -7
  50. package/build/EntityPrivacyPolicy.js.map +1 -1
  51. package/build/EntityQueryContext.d.ts +2 -1
  52. package/build/EntityQueryContext.js +11 -6
  53. package/build/EntityQueryContext.js.map +1 -1
  54. package/build/EntityQueryContextProvider.d.ts +1 -1
  55. package/build/EntityQueryContextProvider.js +1 -1
  56. package/build/EntityQueryContextProvider.js.map +1 -1
  57. package/build/EntitySecondaryCacheLoader.js +5 -1
  58. package/build/EntitySecondaryCacheLoader.js.map +1 -1
  59. package/build/GenericEntityCacheAdapter.js +1 -0
  60. package/build/GenericEntityCacheAdapter.js.map +1 -1
  61. package/build/GenericSecondaryEntityCache.js +2 -0
  62. package/build/GenericSecondaryEntityCache.js.map +1 -1
  63. package/build/IEntityCacheAdapterProvider.d.ts +1 -1
  64. package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
  65. package/build/ReadonlyEntity.d.ts +1 -1
  66. package/build/ReadonlyEntity.js +9 -2
  67. package/build/ReadonlyEntity.js.map +1 -1
  68. package/build/ViewerContext.d.ts +2 -2
  69. package/build/ViewerContext.js +5 -3
  70. package/build/ViewerContext.js.map +1 -1
  71. package/build/ViewerScopedEntityCompanion.js +2 -0
  72. package/build/ViewerScopedEntityCompanion.js.map +1 -1
  73. package/build/ViewerScopedEntityCompanionProvider.d.ts +0 -1
  74. package/build/ViewerScopedEntityCompanionProvider.js +2 -1
  75. package/build/ViewerScopedEntityCompanionProvider.js.map +1 -1
  76. package/build/ViewerScopedEntityLoaderFactory.d.ts +1 -1
  77. package/build/ViewerScopedEntityLoaderFactory.js +2 -0
  78. package/build/ViewerScopedEntityLoaderFactory.js.map +1 -1
  79. package/build/ViewerScopedEntityMutatorFactory.js +2 -0
  80. package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
  81. package/build/__tests__/ComposedCacheAdapter-test.js +2 -0
  82. package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
  83. package/build/__tests__/ComposedSecondaryEntityCache-test.js +1 -0
  84. package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +1 -1
  85. package/build/__tests__/EnforcingEntityLoader-test.js +101 -113
  86. package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
  87. package/build/__tests__/Entity-test.js +5 -137
  88. package/build/__tests__/Entity-test.js.map +1 -1
  89. package/build/__tests__/EntityAssociationLoader-test.js +37 -65
  90. package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
  91. package/build/__tests__/EntityCommonUseCases-test.js +31 -37
  92. package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
  93. package/build/__tests__/EntityCompanion-test.js +26 -3
  94. package/build/__tests__/EntityCompanion-test.js.map +1 -1
  95. package/build/__tests__/EntityConfiguration-test.js +103 -0
  96. package/build/__tests__/EntityConfiguration-test.js.map +1 -0
  97. package/build/__tests__/EntityDatabaseAdapter-test.js +6 -0
  98. package/build/__tests__/EntityDatabaseAdapter-test.js.map +1 -1
  99. package/build/__tests__/EntityEdges-test.js +89 -80
  100. package/build/__tests__/EntityEdges-test.js.map +1 -1
  101. package/build/__tests__/EntityFields-test.js +6 -0
  102. package/build/__tests__/EntityFields-test.js.map +1 -1
  103. package/build/__tests__/EntityLoader-constructor-test.js +17 -18
  104. package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
  105. package/build/__tests__/EntityLoader-test.js +93 -41
  106. package/build/__tests__/EntityLoader-test.js.map +1 -1
  107. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +18 -21
  108. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
  109. package/build/__tests__/EntityMutator-test.js +74 -29
  110. package/build/__tests__/EntityMutator-test.js.map +1 -1
  111. package/build/__tests__/EntityPrivacyPolicy-test.js +77 -59
  112. package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
  113. package/build/__tests__/EntityQueryContext-test.js +9 -0
  114. package/build/__tests__/EntityQueryContext-test.js.map +1 -1
  115. package/build/__tests__/EntitySecondaryCacheLoader-test.js +10 -10
  116. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
  117. package/build/__tests__/EntitySelfReferentialEdges-test.js +59 -74
  118. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
  119. package/build/__tests__/ReadonlyEntity-test.js +13 -13
  120. package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
  121. package/build/__tests__/ViewerContext-test.js +2 -2
  122. package/build/__tests__/ViewerContext-test.js.map +1 -1
  123. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +1 -1
  124. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +26 -28
  125. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
  126. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +25 -30
  127. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
  128. package/build/entityUtils.d.ts +1 -1
  129. package/build/entityUtils.js.map +1 -1
  130. package/build/errors/EntityCacheAdapterError.js +2 -5
  131. package/build/errors/EntityCacheAdapterError.js.map +1 -1
  132. package/build/errors/EntityDatabaseAdapterError.js +14 -35
  133. package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
  134. package/build/errors/EntityError.js +1 -0
  135. package/build/errors/EntityError.js.map +1 -1
  136. package/build/errors/EntityInvalidFieldValueError.js +2 -2
  137. package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
  138. package/build/errors/EntityNotAuthorizedError.js +3 -2
  139. package/build/errors/EntityNotAuthorizedError.js.map +1 -1
  140. package/build/errors/EntityNotFoundError.js +2 -2
  141. package/build/errors/EntityNotFoundError.js.map +1 -1
  142. package/build/index.d.ts +1 -0
  143. package/build/index.js +1 -0
  144. package/build/index.js.map +1 -1
  145. package/build/internal/EntityDataManager.d.ts +1 -1
  146. package/build/internal/EntityDataManager.js +7 -2
  147. package/build/internal/EntityDataManager.js.map +1 -1
  148. package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
  149. package/build/internal/EntityFieldTransformationUtils.js +5 -8
  150. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  151. package/build/internal/EntityTableDataCoordinator.d.ts +1 -1
  152. package/build/internal/EntityTableDataCoordinator.js +5 -0
  153. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  154. package/build/internal/ReadThroughEntityCache.d.ts +1 -1
  155. package/build/internal/ReadThroughEntityCache.js +2 -0
  156. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  157. package/build/internal/__tests__/EntityDataManager-test.js +11 -11
  158. package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
  159. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +6 -2
  160. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +1 -1
  161. package/build/internal/__tests__/ReadThroughEntityCache-test.js +33 -0
  162. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
  163. package/build/metrics/IEntityMetricsAdapter.d.ts +1 -1
  164. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +1 -1
  165. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  166. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +1 -1
  167. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  168. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +1 -1
  169. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  170. package/build/rules/PrivacyPolicyRule.d.ts +1 -1
  171. package/build/rules/PrivacyPolicyRule.js.map +1 -1
  172. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +1 -1
  173. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +1 -1
  174. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +1 -1
  175. package/build/testfixtures/DateIDTestEntity.js +12 -15
  176. package/build/testfixtures/DateIDTestEntity.js.map +1 -1
  177. package/build/testfixtures/SimpleTestEntity.d.ts +8 -8
  178. package/build/testfixtures/SimpleTestEntity.js +12 -15
  179. package/build/testfixtures/SimpleTestEntity.js.map +1 -1
  180. package/build/testfixtures/TestEntity.d.ts +12 -12
  181. package/build/testfixtures/TestEntity.js +12 -15
  182. package/build/testfixtures/TestEntity.js.map +1 -1
  183. package/build/testfixtures/TestEntity2.d.ts +8 -8
  184. package/build/testfixtures/TestEntity2.js +12 -15
  185. package/build/testfixtures/TestEntity2.js.map +1 -1
  186. package/build/testfixtures/TestEntityNumberKey.js +12 -15
  187. package/build/testfixtures/TestEntityNumberKey.js.map +1 -1
  188. package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +36 -0
  189. package/build/testfixtures/TestEntityWithMutationTriggers.js +82 -0
  190. package/build/testfixtures/TestEntityWithMutationTriggers.js.map +1 -0
  191. package/build/testfixtures/TestViewerContext.d.ts +0 -3
  192. package/build/testfixtures/TestViewerContext.js +0 -6
  193. package/build/testfixtures/TestViewerContext.js.map +1 -1
  194. package/build/utils/EntityPrivacyUtils.d.ts +34 -0
  195. package/build/utils/EntityPrivacyUtils.js +160 -0
  196. package/build/utils/EntityPrivacyUtils.js.map +1 -0
  197. package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +1 -0
  198. package/build/utils/__tests__/EntityPrivacyUtils-test.js +395 -0
  199. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +1 -0
  200. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +1 -0
  201. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +26 -0
  202. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +1 -0
  203. package/build/utils/collections/maps.js.map +1 -1
  204. package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +4 -0
  205. package/build/utils/mergeEntityMutationTriggerConfigurations.js +28 -0
  206. package/build/utils/mergeEntityMutationTriggerConfigurations.js.map +1 -0
  207. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +1 -1
  208. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +1 -1
  209. package/build/utils/testing/StubCacheAdapter.d.ts +3 -3
  210. package/build/utils/testing/StubCacheAdapter.js +3 -3
  211. package/build/utils/testing/StubCacheAdapter.js.map +1 -1
  212. package/build/utils/testing/StubDatabaseAdapter.d.ts +2 -2
  213. package/build/utils/testing/StubDatabaseAdapter.js +4 -2
  214. package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
  215. package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +1 -1
  216. package/build/utils/testing/StubDatabaseAdapterProvider.js +1 -3
  217. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +1 -1
  218. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +1 -0
  219. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +42 -0
  220. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +1 -0
  221. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +53 -0
  222. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +1 -1
  223. package/build/utils/testing/describeFieldTestCase.js.map +1 -1
  224. package/package.json +4 -3
  225. package/src/AuthorizationResultBasedEntityLoader.ts +297 -0
  226. package/src/ComposedEntityCacheAdapter.ts +6 -6
  227. package/src/ComposedSecondaryEntityCache.ts +8 -8
  228. package/src/EnforcingEntityLoader.ts +20 -19
  229. package/src/Entity.ts +26 -118
  230. package/src/EntityAssociationLoader.ts +56 -41
  231. package/src/EntityCompanion.ts +8 -4
  232. package/src/EntityCompanionProvider.ts +24 -16
  233. package/src/EntityConfiguration.ts +18 -7
  234. package/src/EntityDatabaseAdapter.ts +41 -41
  235. package/src/EntityFieldDefinition.ts +28 -18
  236. package/src/EntityFields.ts +15 -0
  237. package/src/EntityLoader.ts +63 -357
  238. package/src/EntityLoaderFactory.ts +10 -4
  239. package/src/EntityLoaderUtils.ts +149 -0
  240. package/src/EntityMutationInfo.ts +2 -2
  241. package/src/EntityMutationTriggerConfiguration.ts +5 -5
  242. package/src/EntityMutationValidator.ts +2 -2
  243. package/src/EntityMutator.ts +146 -144
  244. package/src/EntityMutatorFactory.ts +8 -8
  245. package/src/EntityPrivacyPolicy.ts +78 -28
  246. package/src/EntityQueryContext.ts +14 -13
  247. package/src/EntityQueryContextProvider.ts +6 -6
  248. package/src/EntitySecondaryCacheLoader.ts +13 -11
  249. package/src/GenericEntityCacheAdapter.ts +10 -10
  250. package/src/GenericSecondaryEntityCache.ts +6 -6
  251. package/src/IEntityCacheAdapter.ts +4 -4
  252. package/src/IEntityCacheAdapterProvider.ts +2 -2
  253. package/src/IEntityDatabaseAdapterProvider.ts +2 -2
  254. package/src/ReadonlyEntity.ts +8 -5
  255. package/src/ViewerContext.ts +10 -10
  256. package/src/ViewerScopedEntityCompanion.ts +4 -4
  257. package/src/ViewerScopedEntityCompanionProvider.ts +4 -5
  258. package/src/ViewerScopedEntityLoaderFactory.ts +10 -4
  259. package/src/ViewerScopedEntityMutatorFactory.ts +5 -5
  260. package/src/__tests__/ComposedCacheAdapter-test.ts +12 -10
  261. package/src/__tests__/ComposedSecondaryEntityCache-test.ts +8 -8
  262. package/src/__tests__/EnforcingEntityLoader-test.ts +236 -159
  263. package/src/__tests__/Entity-test.ts +5 -223
  264. package/src/__tests__/EntityAssociationLoader-test.ts +91 -169
  265. package/src/__tests__/EntityCommonUseCases-test.ts +36 -38
  266. package/src/__tests__/EntityCompanion-test.ts +57 -5
  267. package/src/__tests__/EntityConfiguration-test.ts +118 -0
  268. package/src/__tests__/EntityDatabaseAdapter-test.ts +11 -11
  269. package/src/__tests__/EntityEdges-test.ts +128 -118
  270. package/src/__tests__/EntityFields-test.ts +14 -2
  271. package/src/__tests__/EntityLoader-constructor-test.ts +21 -8
  272. package/src/__tests__/EntityLoader-test.ts +233 -105
  273. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +17 -20
  274. package/src/__tests__/EntityMutator-test.ts +342 -163
  275. package/src/__tests__/EntityPrivacyPolicy-test.ts +166 -53
  276. package/src/__tests__/EntityQueryContext-test.ts +30 -12
  277. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +17 -26
  278. package/src/__tests__/EntitySelfReferentialEdges-test.ts +67 -115
  279. package/src/__tests__/GenericEntityCacheAdapter-test.ts +2 -2
  280. package/src/__tests__/ReadonlyEntity-test.ts +13 -15
  281. package/src/__tests__/ViewerContext-test.ts +3 -4
  282. package/src/__tests__/ViewerScopedEntityCompanion-test.ts +2 -2
  283. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +2 -2
  284. package/src/__tests__/ViewerScopedEntityLoaderFactory-test.ts +2 -1
  285. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +34 -45
  286. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +22 -30
  287. package/src/__tests__/entityUtils-test.ts +2 -2
  288. package/src/entityUtils.ts +4 -4
  289. package/src/errors/EntityError.ts +4 -1
  290. package/src/errors/EntityInvalidFieldValueError.ts +2 -2
  291. package/src/errors/EntityNotAuthorizedError.ts +3 -3
  292. package/src/errors/EntityNotFoundError.ts +2 -2
  293. package/src/index.ts +1 -0
  294. package/src/internal/EntityDataManager.ts +25 -25
  295. package/src/internal/EntityFieldTransformationUtils.ts +39 -32
  296. package/src/internal/EntityTableDataCoordinator.ts +3 -3
  297. package/src/internal/ReadThroughEntityCache.ts +9 -9
  298. package/src/internal/__tests__/EntityDataManager-test.ts +62 -62
  299. package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +14 -10
  300. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +74 -18
  301. package/src/metrics/EntityMetricsUtils.ts +4 -4
  302. package/src/metrics/IEntityMetricsAdapter.ts +1 -1
  303. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +9 -3
  304. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +9 -3
  305. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +9 -3
  306. package/src/rules/PrivacyPolicyRule.ts +9 -3
  307. package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +2 -1
  308. package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +2 -1
  309. package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +2 -1
  310. package/src/testfixtures/SimpleTestEntity.ts +8 -8
  311. package/src/testfixtures/TestEntity.ts +13 -16
  312. package/src/testfixtures/TestEntity2.ts +8 -8
  313. package/src/testfixtures/TestEntityWithMutationTriggers.ts +156 -0
  314. package/src/testfixtures/TestViewerContext.ts +1 -12
  315. package/src/utils/EntityPrivacyUtils.ts +325 -0
  316. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +570 -0
  317. package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +29 -0
  318. package/src/utils/collections/__tests__/maps-test.ts +2 -2
  319. package/src/utils/collections/maps.ts +11 -11
  320. package/src/utils/mergeEntityMutationTriggerConfigurations.ts +44 -0
  321. package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +25 -22
  322. package/src/utils/testing/StubCacheAdapter.ts +17 -15
  323. package/src/utils/testing/StubDatabaseAdapter.ts +35 -30
  324. package/src/utils/testing/StubDatabaseAdapterProvider.ts +2 -2
  325. package/src/utils/testing/StubQueryContextProvider.ts +2 -2
  326. package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +42 -0
  327. package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +111 -29
  328. package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +2 -2
  329. package/src/utils/testing/describeFieldTestCase.ts +1 -1
  330. package/build/__tests__/EntityDataConfiguration-test.js +0 -68
  331. package/build/__tests__/EntityDataConfiguration-test.js.map +0 -1
  332. package/src/__tests__/EntityDataConfiguration-test.ts +0 -77
  333. /package/build/__tests__/{EntityDataConfiguration-test.d.ts → EntityConfiguration-test.d.ts} +0 -0
@@ -11,7 +11,7 @@ import invariant from 'invariant';
11
11
  export const computeIfAbsent = <K, V>(
12
12
  map: Map<K, V>,
13
13
  key: K,
14
- mappingFunction: (key: K) => V
14
+ mappingFunction: (key: K) => V,
15
15
  ): V => {
16
16
  if (!map.has(key)) {
17
17
  const value = mappingFunction(key);
@@ -28,7 +28,7 @@ export const computeIfAbsent = <K, V>(
28
28
  */
29
29
  export const mapMap = <K, V, M>(
30
30
  map: ReadonlyMap<K, V>,
31
- mapper: (value: V, key: K) => M
31
+ mapper: (value: V, key: K) => M,
32
32
  ): Map<K, M> => {
33
33
  const resultingMap = new Map();
34
34
  for (const [k, v] of map) {
@@ -45,7 +45,7 @@ export const mapMap = <K, V, M>(
45
45
  */
46
46
  export const mapMapAsync = async function <K, V, M>(
47
47
  map: ReadonlyMap<K, V>,
48
- mapper: (value: V, key: K) => Promise<M>
48
+ mapper: (value: V, key: K) => Promise<M>,
49
49
  ): Promise<Map<K, M>> {
50
50
  const resultingMap: Map<K, M> = new Map();
51
51
  await Promise.all(
@@ -53,7 +53,7 @@ export const mapMapAsync = async function <K, V, M>(
53
53
  const initialValue = map.get(k) as V;
54
54
  const result = await mapper(initialValue, k);
55
55
  resultingMap.set(k, result);
56
- })
56
+ }),
57
57
  );
58
58
  return resultingMap;
59
59
  };
@@ -69,7 +69,7 @@ export const mapMapAsync = async function <K, V, M>(
69
69
  */
70
70
  export const mapKeys = <K, V, K2>(
71
71
  map: ReadonlyMap<K, V>,
72
- mapper: (key: K, value: V) => K2
72
+ mapper: (key: K, value: V) => K2,
73
73
  ): Map<K2, V> => {
74
74
  const resultingMap = new Map();
75
75
  for (const [k, v] of map) {
@@ -92,7 +92,7 @@ export const mapKeys = <K, V, K2>(
92
92
  export const zipToMap = <K, V>(keys: readonly K[], values: readonly V[]): Map<K, V> => {
93
93
  invariant(
94
94
  keys.length === values.length,
95
- `zipToMap input length mismatch: keys[${keys.length}], values[${values.length}]`
95
+ `zipToMap input length mismatch: keys[${keys.length}], values[${values.length}]`,
96
96
  );
97
97
  const resultingMap = new Map();
98
98
  for (let i = 0; i < keys.length; i++) {
@@ -126,7 +126,7 @@ export const invertMap = <K, V>(map: ReadonlyMap<K, V>): Map<V, K> => {
126
126
  export const reduceMap = <K, V, A>(
127
127
  map: ReadonlyMap<K, V>,
128
128
  reducer: (accumulator: A, value: V, key: K) => A,
129
- initialValue: A
129
+ initialValue: A,
130
130
  ): A => {
131
131
  let newAccumulator = initialValue;
132
132
  for (const [k, v] of map) {
@@ -147,7 +147,7 @@ export const reduceMap = <K, V, A>(
147
147
  export const reduceMapAsync = async <K, V, A>(
148
148
  map: ReadonlyMap<K, V>,
149
149
  reducer: (accumulator: A, value: V, key: K) => Promise<A>,
150
- initialValue: A
150
+ initialValue: A,
151
151
  ): Promise<A> => {
152
152
  let newAccumulator = initialValue;
153
153
  for (const [k, v] of map) {
@@ -163,7 +163,7 @@ export const reduceMapAsync = async <K, V, A>(
163
163
  */
164
164
  export function filterMap<K, V, S extends V>(
165
165
  map: ReadonlyMap<K, V>,
166
- predicate: (value: V, key: K) => value is S
166
+ predicate: (value: V, key: K) => value is S,
167
167
  ): Map<K, S>;
168
168
 
169
169
  /**
@@ -173,7 +173,7 @@ export function filterMap<K, V, S extends V>(
173
173
  */
174
174
  export function filterMap<K, V>(
175
175
  map: ReadonlyMap<K, V>,
176
- predicate: (value: V, key: K) => boolean
176
+ predicate: (value: V, key: K) => boolean,
177
177
  ): Map<K, V>;
178
178
 
179
179
  /**
@@ -183,7 +183,7 @@ export function filterMap<K, V>(
183
183
  */
184
184
  export function filterMap<K, V>(
185
185
  map: ReadonlyMap<K, V>,
186
- predicate: (value: V, key: K) => unknown
186
+ predicate: (value: V, key: K) => unknown,
187
187
  ): Map<K, V> {
188
188
  const resultingMap = new Map();
189
189
  map.forEach((v, k) => {
@@ -0,0 +1,44 @@
1
+ import EntityMutationTriggerConfiguration from '../EntityMutationTriggerConfiguration';
2
+ import ReadonlyEntity from '../ReadonlyEntity';
3
+ import ViewerContext from '../ViewerContext';
4
+
5
+ function nonNullish<TValue>(value: TValue | null | undefined): value is NonNullable<TValue> {
6
+ return value !== null && value !== undefined;
7
+ }
8
+
9
+ export function mergeEntityMutationTriggerConfigurations<
10
+ TFields extends object,
11
+ TID extends NonNullable<TFields[TSelectedFields]>,
12
+ TViewerContext extends ViewerContext,
13
+ TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
14
+ TSelectedFields extends keyof TFields,
15
+ >(
16
+ ...mutationTriggerConfigurations: EntityMutationTriggerConfiguration<
17
+ TFields,
18
+ TID,
19
+ TViewerContext,
20
+ TEntity,
21
+ TSelectedFields
22
+ >[]
23
+ ): EntityMutationTriggerConfiguration<TFields, TID, TViewerContext, TEntity, TSelectedFields> {
24
+ const merged = {
25
+ beforeCreate: mutationTriggerConfigurations.flatMap((c) => c.beforeCreate).filter(nonNullish),
26
+ afterCreate: mutationTriggerConfigurations.flatMap((c) => c.afterCreate).filter(nonNullish),
27
+ beforeUpdate: mutationTriggerConfigurations.flatMap((c) => c.beforeUpdate).filter(nonNullish),
28
+ afterUpdate: mutationTriggerConfigurations.flatMap((c) => c.afterUpdate).filter(nonNullish),
29
+ beforeDelete: mutationTriggerConfigurations.flatMap((c) => c.beforeDelete).filter(nonNullish),
30
+ afterDelete: mutationTriggerConfigurations.flatMap((c) => c.afterDelete).filter(nonNullish),
31
+ beforeAll: mutationTriggerConfigurations.flatMap((c) => c.beforeAll).filter(nonNullish),
32
+ afterAll: mutationTriggerConfigurations.flatMap((c) => c.afterAll).filter(nonNullish),
33
+ afterCommit: mutationTriggerConfigurations.flatMap((c) => c.afterCommit).filter(nonNullish),
34
+ };
35
+
36
+ /** Remove any trigger that is an empty array */
37
+ for (const key of Object.keys(merged) as (keyof typeof merged)[]) {
38
+ if (merged[key].length === 0) {
39
+ delete merged[key];
40
+ }
41
+ }
42
+
43
+ return merged;
44
+ }
@@ -9,11 +9,17 @@ export interface Case<
9
9
  TID extends NonNullable<TFields[TSelectedFields]>,
10
10
  TViewerContext extends ViewerContext,
11
11
  TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
12
- TSelectedFields extends keyof TFields
12
+ TSelectedFields extends keyof TFields,
13
13
  > {
14
14
  viewerContext: TViewerContext;
15
15
  queryContext: EntityQueryContext;
16
- evaluationContext: EntityPrivacyPolicyEvaluationContext;
16
+ evaluationContext: EntityPrivacyPolicyEvaluationContext<
17
+ TFields,
18
+ TID,
19
+ TViewerContext,
20
+ TEntity,
21
+ TSelectedFields
22
+ >;
17
23
  entity: TEntity;
18
24
  }
19
25
 
@@ -22,7 +28,7 @@ export type CaseMap<
22
28
  TID extends NonNullable<TFields[TSelectedFields]>,
23
29
  TViewerContext extends ViewerContext,
24
30
  TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
25
- TSelectedFields extends keyof TFields
31
+ TSelectedFields extends keyof TFields,
26
32
  > = Map<string, () => Promise<Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>>>;
27
33
 
28
34
  /**
@@ -33,7 +39,7 @@ export const describePrivacyPolicyRuleWithAsyncTestCase = <
33
39
  TID extends NonNullable<TFields[TSelectedFields]>,
34
40
  TViewerContext extends ViewerContext,
35
41
  TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
36
- TSelectedFields extends keyof TFields = keyof TFields
42
+ TSelectedFields extends keyof TFields = keyof TFields,
37
43
  >(
38
44
  privacyPolicyRule: PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
39
45
  {
@@ -44,17 +50,16 @@ export const describePrivacyPolicyRuleWithAsyncTestCase = <
44
50
  allowCases?: CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields>;
45
51
  skipCases?: CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields>;
46
52
  denyCases?: CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields>;
47
- }
53
+ },
48
54
  ): void => {
49
55
  describe(privacyPolicyRule.constructor.name, () => {
50
56
  if (allowCases && allowCases.size > 0) {
51
57
  describe('allow cases', () => {
52
58
  test.each(Array.from(allowCases.keys()))('%p', async (caseKey) => {
53
- const { viewerContext, queryContext, evaluationContext, entity } = await allowCases.get(
54
- caseKey
55
- )!();
59
+ const { viewerContext, queryContext, evaluationContext, entity } =
60
+ await allowCases.get(caseKey)!();
56
61
  await expect(
57
- privacyPolicyRule.evaluateAsync(viewerContext, queryContext, evaluationContext, entity)
62
+ privacyPolicyRule.evaluateAsync(viewerContext, queryContext, evaluationContext, entity),
58
63
  ).resolves.toEqual(RuleEvaluationResult.ALLOW);
59
64
  });
60
65
  });
@@ -63,11 +68,10 @@ export const describePrivacyPolicyRuleWithAsyncTestCase = <
63
68
  if (skipCases && skipCases.size > 0) {
64
69
  describe('skip cases', () => {
65
70
  test.each(Array.from(skipCases.keys()))('%p', async (caseKey) => {
66
- const { viewerContext, queryContext, evaluationContext, entity } = await skipCases.get(
67
- caseKey
68
- )!();
71
+ const { viewerContext, queryContext, evaluationContext, entity } =
72
+ await skipCases.get(caseKey)!();
69
73
  await expect(
70
- privacyPolicyRule.evaluateAsync(viewerContext, queryContext, evaluationContext, entity)
74
+ privacyPolicyRule.evaluateAsync(viewerContext, queryContext, evaluationContext, entity),
71
75
  ).resolves.toEqual(RuleEvaluationResult.SKIP);
72
76
  });
73
77
  });
@@ -76,11 +80,10 @@ export const describePrivacyPolicyRuleWithAsyncTestCase = <
76
80
  if (denyCases && denyCases.size > 0) {
77
81
  describe('deny cases', () => {
78
82
  test.each(Array.from(denyCases.keys()))('%p', async (caseKey) => {
79
- const { viewerContext, queryContext, evaluationContext, entity } = await denyCases.get(
80
- caseKey
81
- )!();
83
+ const { viewerContext, queryContext, evaluationContext, entity } =
84
+ await denyCases.get(caseKey)!();
82
85
  await expect(
83
- privacyPolicyRule.evaluateAsync(viewerContext, queryContext, evaluationContext, entity)
86
+ privacyPolicyRule.evaluateAsync(viewerContext, queryContext, evaluationContext, entity),
84
87
  ).resolves.toEqual(RuleEvaluationResult.DENY);
85
88
  });
86
89
  });
@@ -96,7 +99,7 @@ export const describePrivacyPolicyRule = <
96
99
  TID extends NonNullable<TFields[TSelectedFields]>,
97
100
  TViewerContext extends ViewerContext,
98
101
  TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
99
- TSelectedFields extends keyof TFields = keyof TFields
102
+ TSelectedFields extends keyof TFields = keyof TFields,
100
103
  >(
101
104
  privacyPolicyRule: PrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
102
105
  {
@@ -107,21 +110,21 @@ export const describePrivacyPolicyRule = <
107
110
  allowCases?: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
108
111
  skipCases?: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
109
112
  denyCases?: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>[];
110
- }
113
+ },
111
114
  ): void => {
112
115
  const makeCasesMap = (
113
- cases: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>[]
116
+ cases: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>[],
114
117
  ): CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields> =>
115
118
  cases.reduce(
116
119
  (
117
120
  acc: CaseMap<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
118
121
  testCase: Case<TFields, TID, TViewerContext, TEntity, TSelectedFields>,
119
- index
122
+ index,
120
123
  ) => {
121
124
  acc.set(`case ${index}`, async () => testCase);
122
125
  return acc;
123
126
  },
124
- new Map()
127
+ new Map(),
125
128
  );
126
129
 
127
130
  return describePrivacyPolicyRuleWithAsyncTestCase(privacyPolicyRule, {
@@ -6,8 +6,8 @@ import IEntityCacheAdapterProvider from '../../IEntityCacheAdapterProvider';
6
6
  import { CacheStatus, CacheLoadResult } from '../../internal/ReadThroughEntityCache';
7
7
 
8
8
  export class NoCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
9
- getCacheAdapter<TFields>(
10
- _entityConfiguration: EntityConfiguration<TFields>
9
+ getCacheAdapter<TFields extends Record<string, any>>(
10
+ _entityConfiguration: EntityConfiguration<TFields>,
11
11
  ): IEntityCacheAdapter<TFields> {
12
12
  return new NoCacheStubCacheAdapter();
13
13
  }
@@ -16,7 +16,7 @@ export class NoCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvi
16
16
  export class NoCacheStubCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
17
17
  public async loadManyAsync<N extends keyof TFields>(
18
18
  _fieldName: N,
19
- fieldValues: readonly NonNullable<TFields[N]>[]
19
+ fieldValues: readonly NonNullable<TFields[N]>[],
20
20
  ): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>> {
21
21
  return fieldValues.reduce((acc: Map<NonNullable<TFields[N]>, CacheLoadResult<TFields>>, v) => {
22
22
  acc.set(v, {
@@ -28,42 +28,44 @@ export class NoCacheStubCacheAdapter<TFields> implements IEntityCacheAdapter<TFi
28
28
 
29
29
  public async cacheManyAsync<N extends keyof TFields>(
30
30
  _fieldName: N,
31
- _objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>
31
+ _objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>,
32
32
  ): Promise<void> {}
33
33
 
34
34
  public async cacheDBMissesAsync<N extends keyof TFields>(
35
35
  _fieldName: N,
36
- _fieldValues: readonly NonNullable<TFields[N]>[]
36
+ _fieldValues: readonly NonNullable<TFields[N]>[],
37
37
  ): Promise<void> {}
38
38
 
39
39
  async invalidateManyAsync<N extends keyof TFields>(
40
40
  _fieldName: N,
41
- _fieldValues: readonly TFields[N][]
41
+ _fieldValues: readonly TFields[N][],
42
42
  ): Promise<void> {}
43
43
  }
44
44
 
45
45
  export class InMemoryFullCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
46
46
  cache: Map<string, Readonly<object>> = new Map();
47
47
 
48
- getCacheAdapter<TFields>(
49
- entityConfiguration: EntityConfiguration<TFields>
48
+ getCacheAdapter<TFields extends Record<string, any>>(
49
+ entityConfiguration: EntityConfiguration<TFields>,
50
50
  ): IEntityCacheAdapter<TFields> {
51
51
  return new InMemoryFullCacheStubCacheAdapter(
52
52
  entityConfiguration,
53
- this.cache as Map<string, Readonly<TFields>>
53
+ this.cache as Map<string, Readonly<TFields>>,
54
54
  );
55
55
  }
56
56
  }
57
57
 
58
- export class InMemoryFullCacheStubCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
58
+ export class InMemoryFullCacheStubCacheAdapter<TFields extends Record<string, any>>
59
+ implements IEntityCacheAdapter<TFields>
60
+ {
59
61
  constructor(
60
62
  private readonly entityConfiguration: EntityConfiguration<TFields>,
61
- readonly cache: Map<string, Readonly<TFields>>
63
+ readonly cache: Map<string, Readonly<TFields>>,
62
64
  ) {}
63
65
 
64
66
  public async loadManyAsync<N extends keyof TFields>(
65
67
  fieldName: N,
66
- fieldValues: readonly NonNullable<TFields[N]>[]
68
+ fieldValues: readonly NonNullable<TFields[N]>[],
67
69
  ): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>> {
68
70
  const results = new Map<NonNullable<TFields[N]>, CacheLoadResult<TFields>>();
69
71
  fieldValues.forEach((fieldValue) => {
@@ -86,7 +88,7 @@ export class InMemoryFullCacheStubCacheAdapter<TFields> implements IEntityCacheA
86
88
 
87
89
  public async cacheManyAsync<N extends keyof TFields>(
88
90
  fieldName: N,
89
- objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>
91
+ objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>,
90
92
  ): Promise<void> {
91
93
  objectMap.forEach((obj, fieldValue) => {
92
94
  const cacheKey = this.createCacheKey(fieldName, fieldValue);
@@ -96,12 +98,12 @@ export class InMemoryFullCacheStubCacheAdapter<TFields> implements IEntityCacheA
96
98
 
97
99
  public async cacheDBMissesAsync<N extends keyof TFields>(
98
100
  _fieldName: N,
99
- _fieldValues: readonly NonNullable<TFields[N]>[]
101
+ _fieldValues: readonly NonNullable<TFields[N]>[],
100
102
  ): Promise<void> {}
101
103
 
102
104
  public async invalidateManyAsync<N extends keyof TFields>(
103
105
  fieldName: N,
104
- fieldValues: readonly NonNullable<TFields[N]>[]
106
+ fieldValues: readonly NonNullable<TFields[N]>[],
105
107
  ): Promise<void> {
106
108
  fieldValues.forEach((fieldValue) => {
107
109
  const cacheKey = this.createCacheKey(fieldName, fieldValue);
@@ -1,5 +1,5 @@
1
1
  import invariant from 'invariant';
2
- import { v4 as uuidv4 } from 'uuid';
2
+ import { uuidv7 } from 'uuidv7';
3
3
 
4
4
  import EntityConfiguration from '../../EntityConfiguration';
5
5
  import EntityDatabaseAdapter, {
@@ -16,22 +16,24 @@ import {
16
16
  } from '../../internal/EntityFieldTransformationUtils';
17
17
  import { computeIfAbsent, mapMap } from '../collections/maps';
18
18
 
19
- export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
19
+ export default class StubDatabaseAdapter<
20
+ T extends Record<string, any>,
21
+ > extends EntityDatabaseAdapter<T> {
20
22
  constructor(
21
23
  private readonly entityConfiguration2: EntityConfiguration<T>,
22
- private readonly dataStore: Map<string, Readonly<{ [key: string]: any }>[]>
24
+ private readonly dataStore: Map<string, Readonly<{ [key: string]: any }>[]>,
23
25
  ) {
24
26
  super(entityConfiguration2);
25
27
  }
26
28
 
27
- public static convertFieldObjectsToDataStore<T>(
29
+ public static convertFieldObjectsToDataStore<T extends Record<string, any>>(
28
30
  entityConfiguration: EntityConfiguration<T>,
29
- dataStore: Map<string, Readonly<T>[]>
31
+ dataStore: Map<string, Readonly<T>[]>,
30
32
  ): Map<string, Readonly<{ [key: string]: any }>[]> {
31
33
  return mapMap(dataStore, (objectsForTable) =>
32
34
  objectsForTable.map((objectForTable) =>
33
- transformFieldsToDatabaseObject(entityConfiguration, new Map(), objectForTable)
34
- )
35
+ transformFieldsToDatabaseObject(entityConfiguration, new Map(), objectForTable),
36
+ ),
35
37
  );
36
38
  }
37
39
 
@@ -47,16 +49,19 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
47
49
  _queryInterface: any,
48
50
  tableName: string,
49
51
  tableField: string,
50
- tableValues: readonly any[]
52
+ tableValues: readonly any[],
51
53
  ): Promise<object[]> {
52
54
  const objectCollection = this.getObjectCollectionForTable(tableName);
53
- return tableValues.reduce((acc, fieldValue) => {
54
- return acc.concat(
55
- objectCollection.filter((obj) => {
56
- return obj[tableField] === fieldValue;
57
- })
58
- );
59
- }, [] as { [key: string]: any });
55
+ return tableValues.reduce(
56
+ (acc, fieldValue) => {
57
+ return acc.concat(
58
+ objectCollection.filter((obj) => {
59
+ return obj[tableField] === fieldValue;
60
+ }),
61
+ );
62
+ },
63
+ [] as { [key: string]: any },
64
+ );
60
65
  }
61
66
 
62
67
  private static compareByOrderBys(
@@ -65,7 +70,7 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
65
70
  order: OrderByOrdering;
66
71
  }[],
67
72
  objectA: { [key: string]: any },
68
- objectB: { [key: string]: any }
73
+ objectB: { [key: string]: any },
69
74
  ): 0 | 1 | -1 {
70
75
  if (orderBys.length === 0) {
71
76
  return 0;
@@ -88,8 +93,8 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
88
93
  return aField > bField
89
94
  ? -1
90
95
  : aField < bField
91
- ? 1
92
- : this.compareByOrderBys(orderBys.slice(1), objectA, objectB);
96
+ ? 1
97
+ : this.compareByOrderBys(orderBys.slice(1), objectA, objectB);
93
98
  }
94
99
  case OrderByOrdering.ASCENDING: {
95
100
  // simulate NULLS LAST for ASC
@@ -104,8 +109,8 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
104
109
  return bField > aField
105
110
  ? -1
106
111
  : bField < aField
107
- ? 1
108
- : this.compareByOrderBys(orderBys.slice(1), objectA, objectB);
112
+ ? 1
113
+ : this.compareByOrderBys(orderBys.slice(1), objectA, objectB);
109
114
  }
110
115
  }
111
116
  }
@@ -115,7 +120,7 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
115
120
  tableName: string,
116
121
  tableFieldSingleValueEqualityOperands: TableFieldSingleValueEqualityCondition[],
117
122
  tableFieldMultiValueEqualityOperands: TableFieldMultiValueEqualityCondition[],
118
- querySelectionModifiers: TableQuerySelectionModifiers
123
+ querySelectionModifiers: TableQuerySelectionModifiers,
119
124
  ): Promise<object[]> {
120
125
  let filteredObjects = this.getObjectCollectionForTable(tableName);
121
126
  for (const { tableField, tableValue } of tableFieldSingleValueEqualityOperands) {
@@ -129,7 +134,7 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
129
134
  const orderBy = querySelectionModifiers.orderBy;
130
135
  if (orderBy !== undefined) {
131
136
  filteredObjects = filteredObjects.sort((a, b) =>
132
- StubDatabaseAdapter.compareByOrderBys(orderBy, a, b)
137
+ StubDatabaseAdapter.compareByOrderBys(orderBy, a, b),
133
138
  );
134
139
  }
135
140
 
@@ -151,7 +156,7 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
151
156
  _tableName: string,
152
157
  _rawWhereClause: string,
153
158
  _bindings: object | any[],
154
- _querySelectionModifiers: TableQuerySelectionModifiers
159
+ _querySelectionModifiers: TableQuerySelectionModifiers,
155
160
  ): Promise<object[]> {
156
161
  throw new Error('Raw WHERE clauses not supported for StubDatabaseAdapter');
157
162
  }
@@ -160,15 +165,15 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
160
165
  const idSchemaField = this.entityConfiguration2.schema.get(this.entityConfiguration2.idField);
161
166
  invariant(
162
167
  idSchemaField,
163
- `No schema field found for ${String(this.entityConfiguration2.idField)}`
168
+ `No schema field found for ${String(this.entityConfiguration2.idField)}`,
164
169
  );
165
170
  if (idSchemaField instanceof StringField) {
166
- return uuidv4();
171
+ return uuidv7();
167
172
  } else if (idSchemaField instanceof IntField) {
168
173
  return Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
169
174
  } else {
170
175
  throw new Error(
171
- `Unsupported ID type for StubDatabaseAdapter: ${idSchemaField.constructor.name}`
176
+ `Unsupported ID type for StubDatabaseAdapter: ${idSchemaField.constructor.name}`,
172
177
  );
173
178
  }
174
179
  }
@@ -176,13 +181,13 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
176
181
  protected async insertInternalAsync(
177
182
  _queryInterface: any,
178
183
  tableName: string,
179
- object: object
184
+ object: object,
180
185
  ): Promise<object[]> {
181
186
  const objectCollection = this.getObjectCollectionForTable(tableName);
182
187
 
183
188
  const idField = getDatabaseFieldForEntityField(
184
189
  this.entityConfiguration2,
185
- this.entityConfiguration2.idField
190
+ this.entityConfiguration2.idField,
186
191
  );
187
192
  const objectToInsert = {
188
193
  [idField]: this.generateRandomID(),
@@ -197,7 +202,7 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
197
202
  tableName: string,
198
203
  tableIdField: string,
199
204
  id: any,
200
- object: object
205
+ object: object,
201
206
  ): Promise<object[]> {
202
207
  // SQL does not support empty updates, mirror behavior here for better test simulation
203
208
  if (Object.keys(object).length === 0) {
@@ -221,7 +226,7 @@ export default class StubDatabaseAdapter<T> extends EntityDatabaseAdapter<T> {
221
226
  _queryInterface: any,
222
227
  tableName: string,
223
228
  tableIdField: string,
224
- id: any
229
+ id: any,
225
230
  ): Promise<number> {
226
231
  const objectCollection = this.getObjectCollectionForTable(tableName);
227
232
 
@@ -6,8 +6,8 @@ import IEntityDatabaseAdapterProvider from '../../IEntityDatabaseAdapterProvider
6
6
  export default class StubDatabaseAdapterProvider implements IEntityDatabaseAdapterProvider {
7
7
  private readonly objectCollection = new Map();
8
8
 
9
- getDatabaseAdapter<TFields>(
10
- entityConfiguration: EntityConfiguration<TFields>
9
+ getDatabaseAdapter<TFields extends Record<string, any>>(
10
+ entityConfiguration: EntityConfiguration<TFields>,
11
11
  ): EntityDatabaseAdapter<TFields> {
12
12
  return new StubDatabaseAdapter(entityConfiguration, this.objectCollection);
13
13
  }
@@ -7,13 +7,13 @@ export class StubQueryContextProvider extends EntityQueryContextProvider {
7
7
  }
8
8
 
9
9
  protected createTransactionRunner<T>(
10
- _transactionConfig?: TransactionConfig
10
+ _transactionConfig?: TransactionConfig,
11
11
  ): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T> {
12
12
  return (transactionScope) => Promise.resolve(transactionScope({}));
13
13
  }
14
14
 
15
15
  protected createNestedTransactionRunner<T>(
16
- _outerQueryInterface: any
16
+ _outerQueryInterface: any,
17
17
  ): (transactionScope: (queryInterface: any) => Promise<T>) => Promise<T> {
18
18
  return (transactionScope) => Promise.resolve(transactionScope({}));
19
19
  }
@@ -0,0 +1,42 @@
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
+ });