@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
@@ -47,8 +47,8 @@ describe(StubDatabaseAdapter, () => {
47
47
  },
48
48
  ],
49
49
  ],
50
- ])
51
- )
50
+ ]),
51
+ ),
52
52
  );
53
53
 
54
54
  const results = await databaseAdapter.fetchManyWhereAsync(queryContext, 'stringField', [
@@ -95,8 +95,8 @@ describe(StubDatabaseAdapter, () => {
95
95
  },
96
96
  ],
97
97
  ],
98
- ])
99
- )
98
+ ]),
99
+ ),
100
100
  );
101
101
 
102
102
  const results = await databaseAdapter.fetchManyByFieldEqualityConjunctionAsync(
@@ -120,7 +120,7 @@ describe(StubDatabaseAdapter, () => {
120
120
  order: OrderByOrdering.DESCENDING,
121
121
  },
122
122
  ],
123
- }
123
+ },
124
124
  );
125
125
 
126
126
  expect(results).toHaveLength(2);
@@ -163,8 +163,8 @@ describe(StubDatabaseAdapter, () => {
163
163
  },
164
164
  ],
165
165
  ],
166
- ])
167
- )
166
+ ]),
167
+ ),
168
168
  );
169
169
 
170
170
  const results = await databaseAdapter.fetchManyByFieldEqualityConjunctionAsync(
@@ -186,7 +186,7 @@ describe(StubDatabaseAdapter, () => {
186
186
  order: OrderByOrdering.DESCENDING,
187
187
  },
188
188
  ],
189
- }
189
+ },
190
190
  );
191
191
 
192
192
  expect(results).toHaveLength(3);
@@ -237,14 +237,14 @@ describe(StubDatabaseAdapter, () => {
237
237
  },
238
238
  ],
239
239
  ],
240
- ])
241
- )
240
+ ]),
241
+ ),
242
242
  );
243
243
 
244
244
  const results = await databaseAdapter.fetchManyByFieldEqualityConjunctionAsync(
245
245
  queryContext,
246
246
  [{ fieldName: 'nullableField', fieldValue: null }],
247
- {}
247
+ {},
248
248
  );
249
249
  expect(results).toHaveLength(2);
250
250
  expect(results[0]!.nullableField).toBeNull();
@@ -262,7 +262,7 @@ describe(StubDatabaseAdapter, () => {
262
262
  order: OrderByOrdering.DESCENDING,
263
263
  },
264
264
  ],
265
- }
265
+ },
266
266
  );
267
267
  expect(results2).toHaveLength(2);
268
268
  expect(results2.map((e) => e.nullableField)).toEqual([null, 'a']);
@@ -274,10 +274,10 @@ describe(StubDatabaseAdapter, () => {
274
274
  const queryContext = instance(mock(EntityQueryContext));
275
275
  const databaseAdapter = new StubDatabaseAdapter<TestFields>(
276
276
  testEntityConfiguration,
277
- new Map()
277
+ new Map(),
278
278
  );
279
279
  await expect(
280
- databaseAdapter.fetchManyByRawWhereClauseAsync(queryContext, '', [], {})
280
+ databaseAdapter.fetchManyByRawWhereClauseAsync(queryContext, '', [], {}),
281
281
  ).rejects.toThrow();
282
282
  });
283
283
  });
@@ -287,7 +287,7 @@ describe(StubDatabaseAdapter, () => {
287
287
  const queryContext = instance(mock(EntityQueryContext));
288
288
  const databaseAdapter = new StubDatabaseAdapter<TestFields>(
289
289
  testEntityConfiguration,
290
- new Map()
290
+ new Map(),
291
291
  );
292
292
  const result = await databaseAdapter.insertAsync(queryContext, {
293
293
  stringField: 'hello',
@@ -297,9 +297,29 @@ describe(StubDatabaseAdapter, () => {
297
297
  });
298
298
 
299
299
  expect(
300
- databaseAdapter.getObjectCollectionForTable(testEntityConfiguration.tableName)
300
+ databaseAdapter.getObjectCollectionForTable(testEntityConfiguration.tableName),
301
301
  ).toHaveLength(1);
302
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
+ });
303
323
  });
304
324
 
305
325
  describe('updateAsync', () => {
@@ -323,8 +343,8 @@ describe(StubDatabaseAdapter, () => {
323
343
  },
324
344
  ],
325
345
  ],
326
- ])
327
- )
346
+ ]),
347
+ ),
328
348
  );
329
349
  const result = await databaseAdapter.updateAsync(queryContext, 'customIdField', 'hello', {
330
350
  stringField: 'b',
@@ -334,6 +354,34 @@ describe(StubDatabaseAdapter, () => {
334
354
  testIndexedField: 'h1',
335
355
  });
336
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
+ });
337
385
  });
338
386
 
339
387
  describe('deleteAsync', () => {
@@ -357,14 +405,14 @@ describe(StubDatabaseAdapter, () => {
357
405
  },
358
406
  ],
359
407
  ],
360
- ])
361
- )
408
+ ]),
409
+ ),
362
410
  );
363
411
 
364
412
  await databaseAdapter.deleteAsync(queryContext, 'customIdField', 'hello');
365
413
 
366
414
  expect(
367
- databaseAdapter.getObjectCollectionForTable(testEntityConfiguration.tableName)
415
+ databaseAdapter.getObjectCollectionForTable(testEntityConfiguration.tableName),
368
416
  ).toHaveLength(0);
369
417
  });
370
418
  });
@@ -373,24 +421,24 @@ describe(StubDatabaseAdapter, () => {
373
421
  const queryContext = instance(mock(EntityQueryContext));
374
422
  const databaseAdapter1 = new StubDatabaseAdapter<SimpleTestFields>(
375
423
  simpleTestEntityConfiguration,
376
- new Map()
424
+ new Map(),
377
425
  );
378
426
  const insertedObject1 = await databaseAdapter1.insertAsync(queryContext, {});
379
427
  expect(typeof insertedObject1.id).toBe('string');
380
428
 
381
429
  const databaseAdapter2 = new StubDatabaseAdapter<NumberKeyFields>(
382
430
  numberKeyEntityConfiguration,
383
- new Map()
431
+ new Map(),
384
432
  );
385
433
  const insertedObject2 = await databaseAdapter2.insertAsync(queryContext, {});
386
434
  expect(typeof insertedObject2.id).toBe('number');
387
435
 
388
436
  const databaseAdapter3 = new StubDatabaseAdapter<DateIDTestFields>(
389
437
  dateIDTestEntityConfiguration,
390
- new Map()
438
+ new Map(),
391
439
  );
392
440
  await expect(databaseAdapter3.insertAsync(queryContext, {})).rejects.toThrowError(
393
- 'Unsupported ID type for StubDatabaseAdapter: DateField'
441
+ 'Unsupported ID type for StubDatabaseAdapter: DateField',
394
442
  );
395
443
  });
396
444
 
@@ -432,10 +480,24 @@ describe(StubDatabaseAdapter, () => {
432
480
  },
433
481
  {
434
482
  hello: v2,
435
- }
436
- )
483
+ },
484
+ ),
437
485
  ).toEqual(expectedResult);
438
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
+ });
439
501
  });
440
502
 
441
503
  describe('recursing', () => {
@@ -458,9 +520,29 @@ describe(StubDatabaseAdapter, () => {
458
520
  {
459
521
  hello: 'a',
460
522
  world: 2,
461
- }
462
- )
523
+ },
524
+ ),
463
525
  ).toEqual(-1);
464
526
  });
465
527
  });
466
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
+ }
@@ -10,7 +10,7 @@ import NoOpEntityMetricsAdapter from '../../metrics/NoOpEntityMetricsAdapter';
10
10
  * are replaced with in-memory simulations.
11
11
  */
12
12
  export const createUnitTestEntityCompanionProvider = (
13
- metricsAdapter: IEntityMetricsAdapter = new NoOpEntityMetricsAdapter()
13
+ metricsAdapter: IEntityMetricsAdapter = new NoOpEntityMetricsAdapter(),
14
14
  ): EntityCompanionProvider => {
15
15
  return new EntityCompanionProvider(
16
16
  metricsAdapter,
@@ -30,6 +30,6 @@ export const createUnitTestEntityCompanionProvider = (
30
30
  cacheAdapterProvider: new InMemoryFullCacheStubCacheAdapterProvider(),
31
31
  },
32
32
  ],
33
- ])
33
+ ]),
34
34
  );
35
35
  };
@@ -3,7 +3,7 @@ import { EntityFieldDefinition } from '../../EntityFieldDefinition';
3
3
  export default function describeFieldTestCase<T>(
4
4
  fieldDefinition: EntityFieldDefinition<T>,
5
5
  validValues: T[],
6
- invalidValues: any[]
6
+ invalidValues: any[],
7
7
  ): void {
8
8
  describe(fieldDefinition.constructor.name, () => {
9
9
  if (validValues.length > 0) {
@@ -1,68 +0,0 @@
1
- "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- const EntityConfiguration_1 = __importDefault(require("../EntityConfiguration"));
7
- const EntityFields_1 = require("../EntityFields");
8
- describe(EntityConfiguration_1.default, () => {
9
- const blahEntityConfiguration = new EntityConfiguration_1.default({
10
- idField: 'id',
11
- tableName: 'blah_table',
12
- schema: {
13
- id: new EntityFields_1.UUIDField({
14
- columnName: 'id',
15
- }),
16
- cacheable: new EntityFields_1.StringField({
17
- columnName: 'cacheable',
18
- cache: true,
19
- }),
20
- uniqueButNotCacheable: new EntityFields_1.StringField({
21
- columnName: 'unique_but_not_cacheable',
22
- }),
23
- },
24
- databaseAdapterFlavor: 'postgres',
25
- cacheAdapterFlavor: 'redis',
26
- });
27
- it('returns correct fields', () => {
28
- expect(blahEntityConfiguration.idField).toEqual('id');
29
- expect(blahEntityConfiguration.tableName).toEqual('blah_table');
30
- expect(blahEntityConfiguration.databaseAdapterFlavor).toEqual('postgres');
31
- expect(blahEntityConfiguration.cacheAdapterFlavor).toEqual('redis');
32
- });
33
- it('filters cacheable fields', () => {
34
- expect(blahEntityConfiguration.cacheableKeys).toEqual(new Set(['cacheable']));
35
- });
36
- describe('cache key version', () => {
37
- it('defaults to 0', () => {
38
- const entityConfiguration = new EntityConfiguration_1.default({
39
- idField: 'id',
40
- tableName: 'blah',
41
- schema: {
42
- id: new EntityFields_1.UUIDField({
43
- columnName: 'id',
44
- }),
45
- },
46
- databaseAdapterFlavor: 'postgres',
47
- cacheAdapterFlavor: 'redis',
48
- });
49
- expect(entityConfiguration.cacheKeyVersion).toEqual(0);
50
- });
51
- it('sets to custom version', () => {
52
- const entityConfiguration = new EntityConfiguration_1.default({
53
- idField: 'id',
54
- tableName: 'blah',
55
- schema: {
56
- id: new EntityFields_1.UUIDField({
57
- columnName: 'id',
58
- }),
59
- },
60
- databaseAdapterFlavor: 'postgres',
61
- cacheAdapterFlavor: 'redis',
62
- cacheKeyVersion: 100,
63
- });
64
- expect(entityConfiguration.cacheKeyVersion).toEqual(100);
65
- });
66
- });
67
- });
68
- //# sourceMappingURL=EntityDataConfiguration-test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"EntityDataConfiguration-test.js","sourceRoot":"","sources":["../../src/__tests__/EntityDataConfiguration-test.ts"],"names":[],"mappings":";;;;;AAAA,iFAAyD;AACzD,kDAAyD;AAEzD,QAAQ,CAAC,6BAAmB,EAAE,GAAG,EAAE;IAWjC,MAAM,uBAAuB,GAAG,IAAI,6BAAmB,CAAQ;QAC7D,OAAO,EAAE,IAAI;QACb,SAAS,EAAE,YAAY;QACvB,MAAM,EAAE;YACN,EAAE,EAAE,IAAI,wBAAS,CAAC;gBAChB,UAAU,EAAE,IAAI;aACjB,CAAC;YACF,SAAS,EAAE,IAAI,0BAAW,CAAC;gBACzB,UAAU,EAAE,WAAW;gBACvB,KAAK,EAAE,IAAI;aACZ,CAAC;YACF,qBAAqB,EAAE,IAAI,0BAAW,CAAC;gBACrC,UAAU,EAAE,0BAA0B;aACvC,CAAC;SACH;QACD,qBAAqB,EAAE,UAAU;QACjC,kBAAkB,EAAE,OAAO;KAC5B,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,CAAC,uBAAuB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAChE,MAAM,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC1E,MAAM,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,eAAe,EAAE,GAAG,EAAE;YACvB,MAAM,mBAAmB,GAAG,IAAI,6BAAmB,CAAS;gBAC1D,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,MAAM;gBACjB,MAAM,EAAE;oBACN,EAAE,EAAE,IAAI,wBAAS,CAAC;wBAChB,UAAU,EAAE,IAAI;qBACjB,CAAC;iBACH;gBACD,qBAAqB,EAAE,UAAU;gBACjC,kBAAkB,EAAE,OAAO;aAC5B,CAAC,CAAC;YACH,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;YAChC,MAAM,mBAAmB,GAAG,IAAI,6BAAmB,CAAS;gBAC1D,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,MAAM;gBACjB,MAAM,EAAE;oBACN,EAAE,EAAE,IAAI,wBAAS,CAAC;wBAChB,UAAU,EAAE,IAAI;qBACjB,CAAC;iBACH;gBACD,qBAAqB,EAAE,UAAU;gBACjC,kBAAkB,EAAE,OAAO;gBAC3B,eAAe,EAAE,GAAG;aACrB,CAAC,CAAC;YACH,MAAM,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,77 +0,0 @@
1
- import EntityConfiguration from '../EntityConfiguration';
2
- import { UUIDField, StringField } from '../EntityFields';
3
-
4
- describe(EntityConfiguration, () => {
5
- type BlahT = {
6
- id: string;
7
- cacheable: string;
8
- uniqueButNotCacheable: string;
9
- };
10
-
11
- type Blah2T = {
12
- id: string;
13
- };
14
-
15
- const blahEntityConfiguration = new EntityConfiguration<BlahT>({
16
- idField: 'id',
17
- tableName: 'blah_table',
18
- schema: {
19
- id: new UUIDField({
20
- columnName: 'id',
21
- }),
22
- cacheable: new StringField({
23
- columnName: 'cacheable',
24
- cache: true,
25
- }),
26
- uniqueButNotCacheable: new StringField({
27
- columnName: 'unique_but_not_cacheable',
28
- }),
29
- },
30
- databaseAdapterFlavor: 'postgres',
31
- cacheAdapterFlavor: 'redis',
32
- });
33
-
34
- it('returns correct fields', () => {
35
- expect(blahEntityConfiguration.idField).toEqual('id');
36
- expect(blahEntityConfiguration.tableName).toEqual('blah_table');
37
- expect(blahEntityConfiguration.databaseAdapterFlavor).toEqual('postgres');
38
- expect(blahEntityConfiguration.cacheAdapterFlavor).toEqual('redis');
39
- });
40
-
41
- it('filters cacheable fields', () => {
42
- expect(blahEntityConfiguration.cacheableKeys).toEqual(new Set(['cacheable']));
43
- });
44
-
45
- describe('cache key version', () => {
46
- it('defaults to 0', () => {
47
- const entityConfiguration = new EntityConfiguration<Blah2T>({
48
- idField: 'id',
49
- tableName: 'blah',
50
- schema: {
51
- id: new UUIDField({
52
- columnName: 'id',
53
- }),
54
- },
55
- databaseAdapterFlavor: 'postgres',
56
- cacheAdapterFlavor: 'redis',
57
- });
58
- expect(entityConfiguration.cacheKeyVersion).toEqual(0);
59
- });
60
-
61
- it('sets to custom version', () => {
62
- const entityConfiguration = new EntityConfiguration<Blah2T>({
63
- idField: 'id',
64
- tableName: 'blah',
65
- schema: {
66
- id: new UUIDField({
67
- columnName: 'id',
68
- }),
69
- },
70
- databaseAdapterFlavor: 'postgres',
71
- cacheAdapterFlavor: 'redis',
72
- cacheKeyVersion: 100,
73
- });
74
- expect(entityConfiguration.cacheKeyVersion).toEqual(100);
75
- });
76
- });
77
- });