@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
@@ -1,8 +1,8 @@
1
- import { Result } from '@expo/results';
1
+ import AuthorizationResultBasedEntityLoader from './AuthorizationResultBasedEntityLoader';
2
2
  import EnforcingEntityLoader from './EnforcingEntityLoader';
3
3
  import { IEntityClass } from './Entity';
4
4
  import EntityConfiguration from './EntityConfiguration';
5
- import { FieldEqualityCondition, QuerySelectionModifiers, QuerySelectionModifiersWithOrderByRaw } from './EntityDatabaseAdapter';
5
+ import EntityLoaderUtils from './EntityLoaderUtils';
6
6
  import EntityPrivacyPolicy, { EntityPrivacyPolicyEvaluationContext } from './EntityPrivacyPolicy';
7
7
  import { EntityQueryContext } from './EntityQueryContext';
8
8
  import ReadonlyEntity from './ReadonlyEntity';
@@ -23,136 +23,23 @@ export default class EntityLoader<TFields extends object, TID extends NonNullabl
23
23
  private readonly privacyPolicy;
24
24
  private readonly dataManager;
25
25
  protected readonly metricsAdapter: IEntityMetricsAdapter;
26
- constructor(viewerContext: TViewerContext, queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext, entityConfiguration: EntityConfiguration<TFields>, entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, entitySelectedFields: TSelectedFields[] | undefined, privacyPolicy: TPrivacyPolicy, dataManager: EntityDataManager<TFields>, metricsAdapter: IEntityMetricsAdapter);
26
+ private readonly utilsPrivate;
27
+ constructor(viewerContext: TViewerContext, queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext<TFields, TID, TViewerContext, TEntity, TSelectedFields>, entityConfiguration: EntityConfiguration<TFields>, entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, entitySelectedFields: TSelectedFields[] | undefined, privacyPolicy: TPrivacyPolicy, dataManager: EntityDataManager<TFields>, metricsAdapter: IEntityMetricsAdapter);
27
28
  /**
28
- * Enforcing view on this entity loader. All loads through this view are
29
+ * Enforcing entity loader. All loads through this loader are
29
30
  * guaranteed to be the values of successful results (or null for some loader methods),
30
31
  * and will throw otherwise.
31
32
  */
32
33
  enforcing(): EnforcingEntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
33
34
  /**
34
- * Load many entities where fieldName is one of fieldValues.
35
- * @param fieldName - entity field being queried
36
- * @param fieldValues - fieldName field values being queried
37
- * @returns map from fieldValue to entity results that match the query for that fieldValue,
38
- * where result errors can be UnauthorizedError
35
+ * Authorization-result-based entity loader. All loads through this
36
+ * loader are are results (or null for some loader methods), where an unsuccessful result
37
+ * means an authorization error or entity construction error occurred. Other errors are thrown.
39
38
  */
40
- loadManyByFieldEqualingManyAsync<N extends keyof Pick<TFields, TSelectedFields>>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<ReadonlyMap<NonNullable<TFields[N]>, readonly Result<TEntity>[]>>;
39
+ withAuthorizationResults(): AuthorizationResultBasedEntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
41
40
  /**
42
- * Load many entities where fieldName equals fieldValue.
43
- * @param fieldName - entity field being queried
44
- * @param fieldValue - fieldName field value being queried
45
- * @returns array of entity results that match the query for fieldValue, where result error can be UnauthorizedError
41
+ * Entity loader utilities for things like cache invalidation, entity construction, and authorization.
42
+ * Calling into these should only be necessary in rare cases.
46
43
  */
47
- loadManyByFieldEqualingAsync<N extends keyof Pick<TFields, TSelectedFields>>(fieldName: N, fieldValue: NonNullable<TFields[N]>): Promise<readonly Result<TEntity>[]>;
48
- /**
49
- * Load an entity where fieldName equals fieldValue, or null if no entity exists.
50
- * @param uniqueFieldName - entity field being queried
51
- * @param fieldValue - uniqueFieldName field value being queried
52
- * @returns entity result where uniqueFieldName equals fieldValue, or null if no entity matches the condition.
53
- * @throws when multiple entities match the condition
54
- */
55
- loadByFieldEqualingAsync<N extends keyof Pick<TFields, TSelectedFields>>(uniqueFieldName: N, fieldValue: NonNullable<TFields[N]>): Promise<Result<TEntity> | null>;
56
- /**
57
- * Loads an entity by a specified ID.
58
- * @param id - ID of the entity
59
- * @returns entity result for matching ID, where result error can be UnauthorizedError or EntityNotFoundError.
60
- */
61
- loadByIDAsync(id: TID): Promise<Result<TEntity>>;
62
- /**
63
- * Load an entity by a specified ID, or return null if non-existent.
64
- * @param id - ID of the entity
65
- * @returns entity result for matching ID, or null if no entity exists for ID.
66
- */
67
- loadByIDNullableAsync(id: TID): Promise<Result<TEntity> | null>;
68
- /**
69
- * Loads many entities for a list of IDs.
70
- * @param viewerContext - viewer context of loading user
71
- * @param ids - IDs of the entities to load
72
- * @returns map from ID to corresponding entity result, where result error can be UnauthorizedError or EntityNotFoundError.
73
- */
74
- loadManyByIDsAsync(ids: readonly TID[]): Promise<ReadonlyMap<TID, Result<TEntity>>>;
75
- /**
76
- * Loads many entities for a list of IDs, returning null for any IDs that are non-existent.
77
- * @param ids - IDs of the entities to load
78
- * @returns map from ID to nullable corresponding entity result, where result error can be UnauthorizedError or EntityNotFoundError.
79
- */
80
- loadManyByIDsNullableAsync(ids: readonly TID[]): Promise<ReadonlyMap<TID, Result<TEntity> | null>>;
81
- /**
82
- * Loads the first entity matching the selection constructed from the conjunction of specified
83
- * operands, or null if no matching entity exists. Entities loaded using this method are not
84
- * batched or cached.
85
- *
86
- * This is a convenience method for {@link loadManyByFieldEqualityConjunctionAsync}. However, the
87
- * `orderBy` option must be specified to define what "first" means. If ordering doesn't matter,
88
- * explicitly pass in an empty array.
89
- *
90
- * @param fieldEqualityOperands - list of field equality selection operand specifications
91
- * @param querySelectionModifiers - orderBy and optional offset for the query
92
- * @returns the first entity results that matches the query, where result error can be
93
- * UnauthorizedError
94
- */
95
- loadFirstByFieldEqualityConjunctionAsync<N extends keyof Pick<TFields, TSelectedFields>>(fieldEqualityOperands: FieldEqualityCondition<TFields, N>[], querySelectionModifiers: Omit<QuerySelectionModifiers<TFields>, 'limit'> & Required<Pick<QuerySelectionModifiers<TFields>, 'orderBy'>>): Promise<Result<TEntity> | null>;
96
- /**
97
- * Loads many entities matching the selection constructed from the conjunction of specified operands.
98
- * Entities loaded using this method are not batched or cached.
99
- *
100
- * @example
101
- * fieldEqualityOperands:
102
- * `[{fieldName: 'hello', fieldValue: 1}, {fieldName: 'world', fieldValues: [2, 3]}]`
103
- * Entities returned with a SQL EntityDatabaseAdapter:
104
- * `WHERE hello = 1 AND world = ANY({2, 3})`
105
- *
106
- * @param fieldEqualityOperands - list of field equality selection operand specifications
107
- * @param querySelectionModifiers - limit, offset, and orderBy for the query
108
- * @returns array of entity results that match the query, where result error can be UnauthorizedError
109
- */
110
- loadManyByFieldEqualityConjunctionAsync<N extends keyof Pick<TFields, TSelectedFields>>(fieldEqualityOperands: FieldEqualityCondition<TFields, N>[], querySelectionModifiers?: QuerySelectionModifiers<TFields>): Promise<readonly Result<TEntity>[]>;
111
- /**
112
- * Loads many entities matching the raw WHERE clause. Corresponds to the knex `whereRaw` argument format.
113
- *
114
- * @remarks
115
- * Important notes:
116
- * - Fields in clause are database column names instead of transformed entity field names.
117
- * - Entities loaded using this method are not batched or cached.
118
- * - Not all database adapters implement the ability to execute this method of fetching entities.
119
- *
120
- * @example
121
- * rawWhereClause: `id = ?`
122
- * bindings: `[1]`
123
- * Entites returned `WHERE id = 1`
124
- *
125
- * http://knexjs.org/#Builder-whereRaw
126
- * http://knexjs.org/#Raw-Bindings
127
- *
128
- * @param rawWhereClause - parameterized SQL WHERE clause with positional binding placeholders or named binding placeholders
129
- * @param bindings - array of positional bindings or object of named bindings
130
- * @param querySelectionModifiers - limit, offset, orderBy, and orderByRaw for the query
131
- * @returns array of entity results that match the query, where result error can be UnauthorizedError
132
- * @throws Error when rawWhereClause or bindings are invalid
133
- *
134
- * @deprecated prefer caching loaders
135
- */
136
- loadManyByRawWhereClauseAsync(rawWhereClause: string, bindings: any[] | object, querySelectionModifiers?: QuerySelectionModifiersWithOrderByRaw<TFields>): Promise<readonly Result<TEntity>[]>;
137
- /**
138
- * Invalidate all caches for an entity's fields. Exposed primarily for internal use by EntityMutator.
139
- * @param objectFields - entity data object to be invalidated
140
- */
141
- invalidateFieldsAsync(objectFields: Readonly<TFields>): Promise<void>;
142
- /**
143
- * Invalidate all caches for an entity. One potential use case would be to keep the entity
144
- * framework in sync with changes made to data outside of the framework.
145
- * @param entity - entity to be invalidated
146
- */
147
- invalidateEntityAsync(entity: TEntity): Promise<void>;
148
- private tryConstructEntities;
149
- constructEntity(fieldsObject: TFields): TEntity;
150
- /**
151
- * Construct and authorize entities from fields map, returning error results for entities that fail
152
- * to construct or fail to authorize.
153
- *
154
- * @param map - map from an arbitrary key type to an array of entity field objects
155
- */
156
- constructAndAuthorizeEntitiesAsync<K>(map: ReadonlyMap<K, readonly Readonly<TFields>[]>): Promise<ReadonlyMap<K, readonly Result<TEntity>[]>>;
157
- private validateFieldValues;
44
+ utils(): EntityLoaderUtils<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
158
45
  }
@@ -3,20 +3,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const results_1 = require("@expo/results");
7
- const invariant_1 = __importDefault(require("invariant"));
8
- const nullthrows_1 = __importDefault(require("nullthrows"));
6
+ const AuthorizationResultBasedEntityLoader_1 = __importDefault(require("./AuthorizationResultBasedEntityLoader"));
9
7
  const EnforcingEntityLoader_1 = __importDefault(require("./EnforcingEntityLoader"));
10
- const EntityDatabaseAdapter_1 = require("./EntityDatabaseAdapter");
11
- const entityUtils_1 = require("./entityUtils");
12
- const EntityInvalidFieldValueError_1 = __importDefault(require("./errors/EntityInvalidFieldValueError"));
13
- const EntityNotFoundError_1 = __importDefault(require("./errors/EntityNotFoundError"));
14
- const maps_1 = require("./utils/collections/maps");
8
+ const EntityLoaderUtils_1 = __importDefault(require("./EntityLoaderUtils"));
15
9
  /**
16
10
  * The primary interface for loading entities. All normal loads are batched,
17
11
  * cached, and authorized against the entity's EntityPrivacyPolicy.
18
12
  */
19
13
  class EntityLoader {
14
+ viewerContext;
15
+ queryContext;
16
+ privacyPolicyEvaluationContext;
17
+ entityConfiguration;
18
+ entityClass;
19
+ entitySelectedFields;
20
+ privacyPolicy;
21
+ dataManager;
22
+ metricsAdapter;
23
+ utilsPrivate;
20
24
  constructor(viewerContext, queryContext, privacyPolicyEvaluationContext, entityConfiguration, entityClass, entitySelectedFields, privacyPolicy, dataManager, metricsAdapter) {
21
25
  this.viewerContext = viewerContext;
22
26
  this.queryContext = queryContext;
@@ -27,249 +31,30 @@ class EntityLoader {
27
31
  this.privacyPolicy = privacyPolicy;
28
32
  this.dataManager = dataManager;
29
33
  this.metricsAdapter = metricsAdapter;
34
+ this.utilsPrivate = new EntityLoaderUtils_1.default(this.viewerContext, this.queryContext, this.privacyPolicyEvaluationContext, this.entityConfiguration, this.entityClass, this.entitySelectedFields, this.privacyPolicy, this.dataManager, this.metricsAdapter);
30
35
  }
31
36
  /**
32
- * Enforcing view on this entity loader. All loads through this view are
37
+ * Enforcing entity loader. All loads through this loader are
33
38
  * guaranteed to be the values of successful results (or null for some loader methods),
34
39
  * and will throw otherwise.
35
40
  */
36
41
  enforcing() {
37
- return new EnforcingEntityLoader_1.default(this);
42
+ return new EnforcingEntityLoader_1.default(this.withAuthorizationResults());
38
43
  }
39
44
  /**
40
- * Load many entities where fieldName is one of fieldValues.
41
- * @param fieldName - entity field being queried
42
- * @param fieldValues - fieldName field values being queried
43
- * @returns map from fieldValue to entity results that match the query for that fieldValue,
44
- * where result errors can be UnauthorizedError
45
+ * Authorization-result-based entity loader. All loads through this
46
+ * loader are are results (or null for some loader methods), where an unsuccessful result
47
+ * means an authorization error or entity construction error occurred. Other errors are thrown.
45
48
  */
46
- async loadManyByFieldEqualingManyAsync(fieldName, fieldValues) {
47
- this.validateFieldValues(fieldName, fieldValues);
48
- const fieldValuesToFieldObjects = await this.dataManager.loadManyByFieldEqualingAsync(this.queryContext, fieldName, fieldValues);
49
- return await this.constructAndAuthorizeEntitiesAsync(fieldValuesToFieldObjects);
49
+ withAuthorizationResults() {
50
+ return new AuthorizationResultBasedEntityLoader_1.default(this.queryContext, this.entityConfiguration, this.entityClass, this.dataManager, this.metricsAdapter, this.utilsPrivate);
50
51
  }
51
52
  /**
52
- * Load many entities where fieldName equals fieldValue.
53
- * @param fieldName - entity field being queried
54
- * @param fieldValue - fieldName field value being queried
55
- * @returns array of entity results that match the query for fieldValue, where result error can be UnauthorizedError
53
+ * Entity loader utilities for things like cache invalidation, entity construction, and authorization.
54
+ * Calling into these should only be necessary in rare cases.
56
55
  */
57
- async loadManyByFieldEqualingAsync(fieldName, fieldValue) {
58
- const entityResults = await this.loadManyByFieldEqualingManyAsync(fieldName, [fieldValue]);
59
- const entityResultsForFieldValue = entityResults.get(fieldValue);
60
- (0, invariant_1.default)(entityResultsForFieldValue !== undefined, `${fieldValue} should be guaranteed to be present in returned map of entities`);
61
- return entityResultsForFieldValue;
62
- }
63
- /**
64
- * Load an entity where fieldName equals fieldValue, or null if no entity exists.
65
- * @param uniqueFieldName - entity field being queried
66
- * @param fieldValue - uniqueFieldName field value being queried
67
- * @returns entity result where uniqueFieldName equals fieldValue, or null if no entity matches the condition.
68
- * @throws when multiple entities match the condition
69
- */
70
- async loadByFieldEqualingAsync(uniqueFieldName, fieldValue) {
71
- const entityResults = await this.loadManyByFieldEqualingAsync(uniqueFieldName, fieldValue);
72
- (0, invariant_1.default)(entityResults.length <= 1, `loadByFieldEqualing: Multiple entities of type ${this.entityClass.name} found for ${String(uniqueFieldName)}=${fieldValue}`);
73
- return entityResults[0] ?? null;
74
- }
75
- /**
76
- * Loads an entity by a specified ID.
77
- * @param id - ID of the entity
78
- * @returns entity result for matching ID, where result error can be UnauthorizedError or EntityNotFoundError.
79
- */
80
- async loadByIDAsync(id) {
81
- const entityResults = await this.loadManyByIDsAsync([id]);
82
- const entityResult = entityResults.get(id);
83
- if (entityResult === undefined) {
84
- return (0, results_1.result)(new EntityNotFoundError_1.default(this.entityClass, this.entityConfiguration.idField, id));
85
- }
86
- return entityResult;
87
- }
88
- /**
89
- * Load an entity by a specified ID, or return null if non-existent.
90
- * @param id - ID of the entity
91
- * @returns entity result for matching ID, or null if no entity exists for ID.
92
- */
93
- async loadByIDNullableAsync(id) {
94
- return await this.loadByFieldEqualingAsync(this.entityConfiguration.idField, id);
95
- }
96
- /**
97
- * Loads many entities for a list of IDs.
98
- * @param viewerContext - viewer context of loading user
99
- * @param ids - IDs of the entities to load
100
- * @returns map from ID to corresponding entity result, where result error can be UnauthorizedError or EntityNotFoundError.
101
- */
102
- async loadManyByIDsAsync(ids) {
103
- const entityResults = (await this.loadManyByFieldEqualingManyAsync(this.entityConfiguration.idField, ids));
104
- return (0, maps_1.mapMap)(entityResults, (entityResultsForId, id) => {
105
- const entityResult = entityResultsForId[0];
106
- return (entityResult ??
107
- (0, results_1.result)(new EntityNotFoundError_1.default(this.entityClass, this.entityConfiguration.idField, id)));
108
- });
109
- }
110
- /**
111
- * Loads many entities for a list of IDs, returning null for any IDs that are non-existent.
112
- * @param ids - IDs of the entities to load
113
- * @returns map from ID to nullable corresponding entity result, where result error can be UnauthorizedError or EntityNotFoundError.
114
- */
115
- async loadManyByIDsNullableAsync(ids) {
116
- const entityResults = (await this.loadManyByFieldEqualingManyAsync(this.entityConfiguration.idField, ids));
117
- return (0, maps_1.mapMap)(entityResults, (entityResultsForId) => {
118
- return entityResultsForId[0] ?? null;
119
- });
120
- }
121
- /**
122
- * Loads the first entity matching the selection constructed from the conjunction of specified
123
- * operands, or null if no matching entity exists. Entities loaded using this method are not
124
- * batched or cached.
125
- *
126
- * This is a convenience method for {@link loadManyByFieldEqualityConjunctionAsync}. However, the
127
- * `orderBy` option must be specified to define what "first" means. If ordering doesn't matter,
128
- * explicitly pass in an empty array.
129
- *
130
- * @param fieldEqualityOperands - list of field equality selection operand specifications
131
- * @param querySelectionModifiers - orderBy and optional offset for the query
132
- * @returns the first entity results that matches the query, where result error can be
133
- * UnauthorizedError
134
- */
135
- async loadFirstByFieldEqualityConjunctionAsync(fieldEqualityOperands, querySelectionModifiers) {
136
- const results = await this.loadManyByFieldEqualityConjunctionAsync(fieldEqualityOperands, {
137
- ...querySelectionModifiers,
138
- limit: 1,
139
- });
140
- return results[0] ?? null;
141
- }
142
- /**
143
- * Loads many entities matching the selection constructed from the conjunction of specified operands.
144
- * Entities loaded using this method are not batched or cached.
145
- *
146
- * @example
147
- * fieldEqualityOperands:
148
- * `[{fieldName: 'hello', fieldValue: 1}, {fieldName: 'world', fieldValues: [2, 3]}]`
149
- * Entities returned with a SQL EntityDatabaseAdapter:
150
- * `WHERE hello = 1 AND world = ANY({2, 3})`
151
- *
152
- * @param fieldEqualityOperands - list of field equality selection operand specifications
153
- * @param querySelectionModifiers - limit, offset, and orderBy for the query
154
- * @returns array of entity results that match the query, where result error can be UnauthorizedError
155
- */
156
- async loadManyByFieldEqualityConjunctionAsync(fieldEqualityOperands, querySelectionModifiers = {}) {
157
- for (const fieldEqualityOperand of fieldEqualityOperands) {
158
- const fieldValues = (0, EntityDatabaseAdapter_1.isSingleValueFieldEqualityCondition)(fieldEqualityOperand)
159
- ? [fieldEqualityOperand.fieldValue]
160
- : fieldEqualityOperand.fieldValues;
161
- this.validateFieldValues(fieldEqualityOperand.fieldName, fieldValues);
162
- }
163
- const fieldObjects = await this.dataManager.loadManyByFieldEqualityConjunctionAsync(this.queryContext, fieldEqualityOperands, querySelectionModifiers);
164
- const uncheckedEntityResults = this.tryConstructEntities(fieldObjects);
165
- return await Promise.all(uncheckedEntityResults.map(async (uncheckedEntityResult) => {
166
- if (!uncheckedEntityResult.ok) {
167
- return uncheckedEntityResult;
168
- }
169
- return await (0, results_1.asyncResult)(this.privacyPolicy.authorizeReadAsync(this.viewerContext, this.queryContext, this.privacyPolicyEvaluationContext, uncheckedEntityResult.value, this.metricsAdapter));
170
- }));
171
- }
172
- /**
173
- * Loads many entities matching the raw WHERE clause. Corresponds to the knex `whereRaw` argument format.
174
- *
175
- * @remarks
176
- * Important notes:
177
- * - Fields in clause are database column names instead of transformed entity field names.
178
- * - Entities loaded using this method are not batched or cached.
179
- * - Not all database adapters implement the ability to execute this method of fetching entities.
180
- *
181
- * @example
182
- * rawWhereClause: `id = ?`
183
- * bindings: `[1]`
184
- * Entites returned `WHERE id = 1`
185
- *
186
- * http://knexjs.org/#Builder-whereRaw
187
- * http://knexjs.org/#Raw-Bindings
188
- *
189
- * @param rawWhereClause - parameterized SQL WHERE clause with positional binding placeholders or named binding placeholders
190
- * @param bindings - array of positional bindings or object of named bindings
191
- * @param querySelectionModifiers - limit, offset, orderBy, and orderByRaw for the query
192
- * @returns array of entity results that match the query, where result error can be UnauthorizedError
193
- * @throws Error when rawWhereClause or bindings are invalid
194
- *
195
- * @deprecated prefer caching loaders
196
- */
197
- async loadManyByRawWhereClauseAsync(rawWhereClause, bindings, querySelectionModifiers = {}) {
198
- const fieldObjects = await this.dataManager.loadManyByRawWhereClauseAsync(this.queryContext, rawWhereClause, bindings, querySelectionModifiers);
199
- const uncheckedEntityResults = this.tryConstructEntities(fieldObjects);
200
- return await Promise.all(uncheckedEntityResults.map(async (uncheckedEntityResult) => {
201
- if (!uncheckedEntityResult.ok) {
202
- return uncheckedEntityResult;
203
- }
204
- return await (0, results_1.asyncResult)(this.privacyPolicy.authorizeReadAsync(this.viewerContext, this.queryContext, this.privacyPolicyEvaluationContext, uncheckedEntityResult.value, this.metricsAdapter));
205
- }));
206
- }
207
- /**
208
- * Invalidate all caches for an entity's fields. Exposed primarily for internal use by EntityMutator.
209
- * @param objectFields - entity data object to be invalidated
210
- */
211
- async invalidateFieldsAsync(objectFields) {
212
- await this.dataManager.invalidateObjectFieldsAsync(objectFields);
213
- }
214
- /**
215
- * Invalidate all caches for an entity. One potential use case would be to keep the entity
216
- * framework in sync with changes made to data outside of the framework.
217
- * @param entity - entity to be invalidated
218
- */
219
- async invalidateEntityAsync(entity) {
220
- await this.invalidateFieldsAsync(entity.getAllDatabaseFields());
221
- }
222
- tryConstructEntities(fieldsObjects) {
223
- return fieldsObjects.map((fieldsObject) => {
224
- try {
225
- return (0, results_1.result)(this.constructEntity(fieldsObject));
226
- }
227
- catch (e) {
228
- if (!(e instanceof Error)) {
229
- throw e;
230
- }
231
- return (0, results_1.result)(e);
232
- }
233
- });
234
- }
235
- constructEntity(fieldsObject) {
236
- const idField = this.entityConfiguration.idField;
237
- const id = (0, nullthrows_1.default)(fieldsObject[idField], 'must provide ID to create an entity');
238
- const entitySelectedFields = this.entitySelectedFields ?? Array.from(this.entityConfiguration.schema.keys());
239
- const selectedFields = (0, entityUtils_1.pick)(fieldsObject, entitySelectedFields);
240
- return new this.entityClass({
241
- viewerContext: this.viewerContext,
242
- id: id,
243
- databaseFields: fieldsObject,
244
- selectedFields,
245
- });
246
- }
247
- /**
248
- * Construct and authorize entities from fields map, returning error results for entities that fail
249
- * to construct or fail to authorize.
250
- *
251
- * @param map - map from an arbitrary key type to an array of entity field objects
252
- */
253
- async constructAndAuthorizeEntitiesAsync(map) {
254
- const uncheckedEntityResultsMap = (0, maps_1.mapMap)(map, (fieldObjects) => this.tryConstructEntities(fieldObjects));
255
- return await (0, maps_1.mapMapAsync)(uncheckedEntityResultsMap, async (uncheckedEntityResults) => {
256
- return await Promise.all(uncheckedEntityResults.map(async (uncheckedEntityResult) => {
257
- if (!uncheckedEntityResult.ok) {
258
- return uncheckedEntityResult;
259
- }
260
- return await (0, results_1.asyncResult)(this.privacyPolicy.authorizeReadAsync(this.viewerContext, this.queryContext, this.privacyPolicyEvaluationContext, uncheckedEntityResult.value, this.metricsAdapter));
261
- }));
262
- });
263
- }
264
- validateFieldValues(fieldName, fieldValues) {
265
- const fieldDefinition = this.entityConfiguration.schema.get(fieldName);
266
- (0, invariant_1.default)(fieldDefinition, `must have field definition for field = ${String(fieldName)}`);
267
- for (const fieldValue of fieldValues) {
268
- const isInputValid = fieldDefinition.validateInputValue(fieldValue);
269
- if (!isInputValid) {
270
- throw new EntityInvalidFieldValueError_1.default(this.entityClass, fieldName, fieldValue);
271
- }
272
- }
56
+ utils() {
57
+ return this.utilsPrivate;
273
58
  }
274
59
  }
275
60
  exports.default = EntityLoader;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityLoader.js","sourceRoot":"","sources":["../src/EntityLoader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityLoader.js","sourceRoot":"","sources":["../src/EntityLoader.ts"],"names":[],"mappings":";;;;;AAAA,kHAA0F;AAC1F,oFAA4D;AAG5D,4EAAoD;AAQpD;;;GAGG;AACH,MAAqB,YAAY;IAwBZ;IACA;IACA;IAOA;IACA;IAQA;IACA;IACA;IACE;IA/BJ,YAAY,CAO3B;IAEF,YACmB,aAA6B,EAC7B,YAAgC,EAChC,8BAMhB,EACgB,mBAAiD,EACjD,WAOhB,EACgB,oBAAmD,EACnD,aAA6B,EAC7B,WAAuC,EACrC,cAAqC;QArBvC,kBAAa,GAAb,aAAa,CAAgB;QAC7B,iBAAY,GAAZ,YAAY,CAAoB;QAChC,mCAA8B,GAA9B,8BAA8B,CAM9C;QACgB,wBAAmB,GAAnB,mBAAmB,CAA8B;QACjD,gBAAW,GAAX,WAAW,CAO3B;QACgB,yBAAoB,GAApB,oBAAoB,CAA+B;QACnD,kBAAa,GAAb,aAAa,CAAgB;QAC7B,gBAAW,GAAX,WAAW,CAA4B;QACrC,mBAAc,GAAd,cAAc,CAAuB;QAExD,IAAI,CAAC,YAAY,GAAG,IAAI,2BAAiB,CACvC,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,8BAA8B,EACnC,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,oBAAoB,EACzB,IAAI,CAAC,aAAa,EAClB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;IAED;;;;OAIG;IACH,SAAS;QAQP,OAAO,IAAI,+BAAqB,CAAC,IAAI,CAAC,wBAAwB,EAAE,CAAC,CAAC;IACpE,CAAC;IAED;;;;OAIG;IACH,wBAAwB;QAQtB,OAAO,IAAI,8CAAoC,CAC7C,IAAI,CAAC,YAAY,EACjB,IAAI,CAAC,mBAAmB,EACxB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,cAAc,EACnB,IAAI,CAAC,YAAY,CAClB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACI,KAAK;QAQV,OAAO,IAAI,CAAC,YAAY,CAAC;IAC3B,CAAC;CACF;AAjHD,+BAiHC"}
@@ -19,5 +19,5 @@ export default class EntityLoaderFactory<TFields extends object, TID extends Non
19
19
  * @param viewerContext - viewer context of loading user
20
20
  * @param queryContext - query context in which to perform the load
21
21
  */
22
- forLoad(viewerContext: TViewerContext, queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext): EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
22
+ forLoad(viewerContext: TViewerContext, queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext<TFields, TID, TViewerContext, TEntity, TSelectedFields>): EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>;
23
23
  }
@@ -8,6 +8,9 @@ const EntityLoader_1 = __importDefault(require("./EntityLoader"));
8
8
  * The primary entry point for loading entities.
9
9
  */
10
10
  class EntityLoaderFactory {
11
+ entityCompanion;
12
+ dataManager;
13
+ metricsAdapter;
11
14
  constructor(entityCompanion, dataManager, metricsAdapter) {
12
15
  this.entityCompanion = entityCompanion;
13
16
  this.dataManager = dataManager;
@@ -1 +1 @@
1
- {"version":3,"file":"EntityLoaderFactory.js","sourceRoot":"","sources":["../src/EntityLoaderFactory.ts"],"names":[],"mappings":";;;;;AACA,kEAA0C;AAQ1C;;GAEG;AACH,MAAqB,mBAAmB;IActC,YACmB,eAOhB,EACgB,WAAuC,EACrC,cAAqC;QATvC,oBAAe,GAAf,eAAe,CAO/B;QACgB,gBAAW,GAAX,WAAW,CAA4B;QACrC,mBAAc,GAAd,cAAc,CAAuB;IACvD,CAAC;IAEJ;;;;OAIG;IACH,OAAO,CACL,aAA6B,EAC7B,YAAgC,EAChC,8BAAoE;QAEpE,OAAO,IAAI,sBAAY,CACrB,aAAa,EACb,YAAY,EACZ,8BAA8B,EAC9B,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,mBAAmB,EAClE,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,WAAW,EAC1D,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,oBAAoB,EACnE,IAAI,CAAC,eAAe,CAAC,aAAa,EAClC,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;CACF;AAjDD,sCAiDC"}
1
+ {"version":3,"file":"EntityLoaderFactory.js","sourceRoot":"","sources":["../src/EntityLoaderFactory.ts"],"names":[],"mappings":";;;;;AACA,kEAA0C;AAQ1C;;GAEG;AACH,MAAqB,mBAAmB;IAenB;IAQA;IACE;IAVrB,YACmB,eAOhB,EACgB,WAAuC,EACrC,cAAqC;QATvC,oBAAe,GAAf,eAAe,CAO/B;QACgB,gBAAW,GAAX,WAAW,CAA4B;QACrC,mBAAc,GAAd,cAAc,CAAuB;IACvD,CAAC;IAEJ;;;;OAIG;IACH,OAAO,CACL,aAA6B,EAC7B,YAAgC,EAChC,8BAMC;QAED,OAAO,IAAI,sBAAY,CACrB,aAAa,EACb,YAAY,EACZ,8BAA8B,EAC9B,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,mBAAmB,EAClE,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,WAAW,EAC1D,IAAI,CAAC,eAAe,CAAC,yBAAyB,CAAC,oBAAoB,EACnE,IAAI,CAAC,eAAe,CAAC,aAAa,EAClC,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,cAAc,CACpB,CAAC;IACJ,CAAC;CACF;AAvDD,sCAuDC"}
@@ -0,0 +1,58 @@
1
+ import { Result } from '@expo/results';
2
+ import { IEntityClass } from './Entity';
3
+ import EntityConfiguration from './EntityConfiguration';
4
+ import EntityPrivacyPolicy, { EntityPrivacyPolicyEvaluationContext } from './EntityPrivacyPolicy';
5
+ import { EntityQueryContext } from './EntityQueryContext';
6
+ import ReadonlyEntity from './ReadonlyEntity';
7
+ import ViewerContext from './ViewerContext';
8
+ import EntityDataManager from './internal/EntityDataManager';
9
+ import IEntityMetricsAdapter from './metrics/IEntityMetricsAdapter';
10
+ /**
11
+ * Entity loader utilities for things like invalidation, entity construction, and authorization.
12
+ * Methods are exposed publicly since in rare cases they may need to be called manually.
13
+ */
14
+ export default class EntityLoaderUtils<TFields extends object, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>, TPrivacyPolicy extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity, TSelectedFields>, TSelectedFields extends keyof TFields> {
15
+ private readonly viewerContext;
16
+ private readonly queryContext;
17
+ private readonly privacyPolicyEvaluationContext;
18
+ private readonly entityConfiguration;
19
+ private readonly entityClass;
20
+ private readonly entitySelectedFields;
21
+ private readonly privacyPolicy;
22
+ private readonly dataManager;
23
+ protected readonly metricsAdapter: IEntityMetricsAdapter;
24
+ constructor(viewerContext: TViewerContext, queryContext: EntityQueryContext, privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext<TFields, TID, TViewerContext, TEntity, TSelectedFields>, entityConfiguration: EntityConfiguration<TFields>, entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, entitySelectedFields: TSelectedFields[] | undefined, privacyPolicy: TPrivacyPolicy, dataManager: EntityDataManager<TFields>, metricsAdapter: IEntityMetricsAdapter);
25
+ /**
26
+ * Invalidate all caches for an entity's fields. Exposed primarily for internal use by EntityMutator.
27
+ * @param objectFields - entity data object to be invalidated
28
+ */
29
+ invalidateFieldsAsync(objectFields: Readonly<TFields>): Promise<void>;
30
+ /**
31
+ * Invalidate all caches for an entity. One potential use case would be to keep the entity
32
+ * framework in sync with changes made to data outside of the framework.
33
+ * @param entity - entity to be invalidated
34
+ */
35
+ invalidateEntityAsync(entity: TEntity): Promise<void>;
36
+ /**
37
+ * Construct an entity from a fields object (applying field selection if applicable),
38
+ * checking that the ID field is specified.
39
+ *
40
+ * @param fieldsObject - fields object
41
+ */
42
+ constructEntity(fieldsObject: TFields): TEntity;
43
+ /**
44
+ * Construct and authorize entities from fields map, returning error results for entities that fail
45
+ * to construct or fail to authorize.
46
+ *
47
+ * @param map - map from an arbitrary key type to an array of entity field objects
48
+ */
49
+ constructAndAuthorizeEntitiesAsync<K>(map: ReadonlyMap<K, readonly Readonly<TFields>[]>): Promise<ReadonlyMap<K, readonly Result<TEntity>[]>>;
50
+ /**
51
+ * Construct and authorize entities from field objects array, returning error results for entities that fail
52
+ * to construct or fail to authorize.
53
+ *
54
+ * @param fieldObjects - array of field objects
55
+ */
56
+ constructAndAuthorizeEntitiesArrayAsync(fieldObjects: readonly Readonly<TFields>[]): Promise<readonly Result<TEntity>[]>;
57
+ private tryConstructEntities;
58
+ }