@expo/entity 0.40.0 → 0.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (433) hide show
  1. package/build/AuthorizationResultBasedEntityAssociationLoader.d.ts +16 -16
  2. package/build/AuthorizationResultBasedEntityAssociationLoader.js +2 -4
  3. package/build/AuthorizationResultBasedEntityAssociationLoader.js.map +1 -1
  4. package/build/AuthorizationResultBasedEntityLoader.d.ts +39 -67
  5. package/build/AuthorizationResultBasedEntityLoader.js +85 -62
  6. package/build/AuthorizationResultBasedEntityLoader.js.map +1 -1
  7. package/build/AuthorizationResultBasedEntityMutator.d.ts +16 -16
  8. package/build/AuthorizationResultBasedEntityMutator.js.map +1 -1
  9. package/build/ComposedEntityCacheAdapter.d.ts +7 -6
  10. package/build/ComposedEntityCacheAdapter.js +28 -28
  11. package/build/ComposedEntityCacheAdapter.js.map +1 -1
  12. package/build/ComposedSecondaryEntityCache.d.ts +1 -1
  13. package/build/ComposedSecondaryEntityCache.js.map +1 -1
  14. package/build/EnforcingEntityAssociationLoader.d.ts +15 -15
  15. package/build/EnforcingEntityAssociationLoader.js.map +1 -1
  16. package/build/EnforcingEntityCreator.d.ts +2 -2
  17. package/build/EnforcingEntityDeleter.d.ts +2 -2
  18. package/build/EnforcingEntityLoader.d.ts +104 -18
  19. package/build/EnforcingEntityLoader.js +113 -12
  20. package/build/EnforcingEntityLoader.js.map +1 -1
  21. package/build/EnforcingEntityUpdater.d.ts +2 -2
  22. package/build/Entity.d.ts +32 -10
  23. package/build/Entity.js +41 -3
  24. package/build/Entity.js.map +1 -1
  25. package/build/EntityAssociationLoader.d.ts +3 -3
  26. package/build/EntityCompanion.d.ts +5 -5
  27. package/build/EntityCompanion.js.map +1 -1
  28. package/build/EntityCompanionProvider.d.ts +6 -6
  29. package/build/EntityCompanionProvider.js.map +1 -1
  30. package/build/EntityConfiguration.d.ts +46 -5
  31. package/build/EntityConfiguration.js +39 -1
  32. package/build/EntityConfiguration.js.map +1 -1
  33. package/build/EntityCreator.d.ts +4 -4
  34. package/build/EntityDatabaseAdapter.d.ts +15 -14
  35. package/build/EntityDatabaseAdapter.js +20 -12
  36. package/build/EntityDatabaseAdapter.js.map +1 -1
  37. package/build/EntityDeleter.d.ts +4 -4
  38. package/build/EntityFieldDefinition.d.ts +20 -10
  39. package/build/EntityFieldDefinition.js +3 -1
  40. package/build/EntityFieldDefinition.js.map +1 -1
  41. package/build/EntityFields.d.ts +14 -12
  42. package/build/EntityFields.js.map +1 -1
  43. package/build/EntityLoader.d.ts +5 -5
  44. package/build/EntityLoaderFactory.d.ts +3 -3
  45. package/build/EntityLoaderFactory.js.map +1 -1
  46. package/build/EntityLoaderUtils.d.ts +2 -2
  47. package/build/EntityLoaderUtils.js +27 -1
  48. package/build/EntityLoaderUtils.js.map +1 -1
  49. package/build/EntityMutationInfo.d.ts +2 -2
  50. package/build/EntityMutationTriggerConfiguration.d.ts +14 -14
  51. package/build/EntityMutationTriggerConfiguration.js.map +1 -1
  52. package/build/EntityMutationValidator.d.ts +2 -2
  53. package/build/EntityMutatorFactory.d.ts +5 -5
  54. package/build/EntityMutatorFactory.js.map +1 -1
  55. package/build/EntityPrivacyPolicy.d.ts +14 -14
  56. package/build/EntityPrivacyPolicy.js.map +1 -1
  57. package/build/EntitySecondaryCacheLoader.d.ts +4 -4
  58. package/build/EntityUpdater.d.ts +4 -4
  59. package/build/GenericEntityCacheAdapter.d.ts +7 -6
  60. package/build/GenericEntityCacheAdapter.js +13 -14
  61. package/build/GenericEntityCacheAdapter.js.map +1 -1
  62. package/build/GenericSecondaryEntityCache.d.ts +3 -3
  63. package/build/GenericSecondaryEntityCache.js.map +1 -1
  64. package/build/IEntityCacheAdapter.d.ts +17 -16
  65. package/build/IEntityCacheAdapterProvider.d.ts +1 -1
  66. package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
  67. package/build/IEntityGenericCacher.d.ts +15 -5
  68. package/build/ReadonlyEntity.d.ts +27 -8
  69. package/build/ReadonlyEntity.js +31 -3
  70. package/build/ReadonlyEntity.js.map +1 -1
  71. package/build/ViewerContext.d.ts +1 -1
  72. package/build/ViewerScopedEntityCompanion.d.ts +5 -5
  73. package/build/ViewerScopedEntityCompanionProvider.d.ts +1 -1
  74. package/build/ViewerScopedEntityLoaderFactory.d.ts +3 -3
  75. package/build/ViewerScopedEntityMutatorFactory.d.ts +5 -5
  76. package/build/entityUtils.d.ts +1 -1
  77. package/build/entityUtils.js.map +1 -1
  78. package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
  79. package/build/errors/EntityNotAuthorizedError.d.ts +1 -1
  80. package/build/errors/EntityNotFoundError.d.ts +2 -2
  81. package/build/index.d.ts +7 -7
  82. package/build/index.js +8 -13
  83. package/build/index.js.map +1 -1
  84. package/build/internal/CompositeFieldHolder.d.ts +48 -0
  85. package/build/internal/CompositeFieldHolder.js +116 -0
  86. package/build/internal/CompositeFieldHolder.js.map +1 -0
  87. package/build/internal/CompositeFieldValueMap.d.ts +15 -0
  88. package/build/internal/CompositeFieldValueMap.js +51 -0
  89. package/build/internal/CompositeFieldValueMap.js.map +1 -0
  90. package/build/internal/EntityDataManager.d.ts +16 -16
  91. package/build/internal/EntityDataManager.js +42 -45
  92. package/build/internal/EntityDataManager.js.map +1 -1
  93. package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
  94. package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
  95. package/build/internal/EntityLoadInterfaces.d.ts +104 -0
  96. package/build/internal/EntityLoadInterfaces.js +25 -0
  97. package/build/internal/EntityLoadInterfaces.js.map +1 -0
  98. package/build/internal/EntityTableDataCoordinator.d.ts +6 -6
  99. package/build/internal/EntityTableDataCoordinator.js.map +1 -1
  100. package/build/internal/ReadThroughEntityCache.d.ts +17 -16
  101. package/build/internal/ReadThroughEntityCache.js +36 -36
  102. package/build/internal/ReadThroughEntityCache.js.map +1 -1
  103. package/build/internal/SingleFieldHolder.d.ts +34 -0
  104. package/build/internal/SingleFieldHolder.js +90 -0
  105. package/build/internal/SingleFieldHolder.js.map +1 -0
  106. package/build/metrics/EntityMetricsUtils.d.ts +2 -1
  107. package/build/metrics/EntityMetricsUtils.js.map +1 -1
  108. package/build/metrics/IEntityMetricsAdapter.d.ts +5 -0
  109. package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
  110. package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
  111. package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
  112. package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
  113. package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
  114. package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
  115. package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
  116. package/build/rules/PrivacyPolicyRule.d.ts +2 -2
  117. package/build/tsconfig.build.tsbuildinfo +1 -0
  118. package/build/utils/EntityPrivacyUtils.d.ts +4 -4
  119. package/build/utils/EntityPrivacyUtils.js.map +1 -1
  120. package/build/utils/collections/SerializableKeyMap.d.ts +27 -0
  121. package/build/utils/collections/SerializableKeyMap.js +60 -0
  122. package/build/utils/collections/SerializableKeyMap.js.map +1 -0
  123. package/build/utils/collections/maps.js +1 -2
  124. package/build/utils/collections/maps.js.map +1 -1
  125. package/build/utils/collections/sets.d.ts +1 -0
  126. package/build/utils/collections/sets.js +7 -0
  127. package/build/utils/collections/sets.js.map +1 -0
  128. package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +1 -1
  129. package/package.json +8 -5
  130. package/src/AuthorizationResultBasedEntityAssociationLoader.ts +58 -53
  131. package/src/AuthorizationResultBasedEntityLoader.ts +194 -81
  132. package/src/AuthorizationResultBasedEntityMutator.ts +71 -45
  133. package/src/ComposedEntityCacheAdapter.ts +55 -46
  134. package/src/ComposedSecondaryEntityCache.ts +5 -2
  135. package/src/EnforcingEntityAssociationLoader.ts +52 -44
  136. package/src/EnforcingEntityCreator.ts +5 -5
  137. package/src/EnforcingEntityDeleter.ts +5 -5
  138. package/src/EnforcingEntityLoader.ts +158 -21
  139. package/src/EnforcingEntityUpdater.ts +5 -5
  140. package/src/Entity.ts +185 -29
  141. package/src/EntityAssociationLoader.ts +6 -6
  142. package/src/EntityCompanion.ts +11 -11
  143. package/src/EntityCompanionProvider.ts +21 -18
  144. package/src/EntityConfiguration.ts +123 -9
  145. package/src/EntityCreator.ts +7 -7
  146. package/src/EntityDatabaseAdapter.ts +51 -28
  147. package/src/EntityDeleter.ts +7 -7
  148. package/src/EntityFieldDefinition.ts +32 -12
  149. package/src/EntityFields.ts +49 -12
  150. package/src/EntityLoader.ts +8 -8
  151. package/src/EntityLoaderFactory.ts +8 -8
  152. package/src/EntityLoaderUtils.ts +39 -10
  153. package/src/EntityMutationInfo.ts +6 -6
  154. package/src/EntityMutationTriggerConfiguration.ts +68 -20
  155. package/src/EntityMutationValidator.ts +4 -4
  156. package/src/EntityMutatorFactory.ts +13 -13
  157. package/src/EntityPrivacyPolicy.ts +50 -26
  158. package/src/EntitySecondaryCacheLoader.ts +6 -6
  159. package/src/EntityUpdater.ts +7 -7
  160. package/src/GenericEntityCacheAdapter.ts +39 -28
  161. package/src/GenericSecondaryEntityCache.ts +6 -3
  162. package/src/IEntityCacheAdapter.ts +45 -25
  163. package/src/IEntityCacheAdapterProvider.ts +3 -3
  164. package/src/IEntityDatabaseAdapterProvider.ts +3 -3
  165. package/src/IEntityGenericCacher.ts +33 -5
  166. package/src/ReadonlyEntity.ts +129 -16
  167. package/src/ViewerContext.ts +5 -5
  168. package/src/ViewerScopedEntityCompanion.ts +7 -7
  169. package/src/ViewerScopedEntityCompanionProvider.ts +6 -6
  170. package/src/ViewerScopedEntityLoaderFactory.ts +7 -7
  171. package/src/ViewerScopedEntityMutatorFactory.ts +8 -8
  172. package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +41 -72
  173. package/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.ts +14 -13
  174. package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +367 -69
  175. package/src/__tests__/ComposedCacheAdapter-test.ts +235 -117
  176. package/src/__tests__/EnforcingEntityLoader-test.ts +135 -1
  177. package/src/__tests__/Entity-test.ts +64 -11
  178. package/src/__tests__/EntityAssociationLoader-test.ts +6 -8
  179. package/src/__tests__/EntityCommonUseCases-test.ts +25 -28
  180. package/src/__tests__/EntityCompanion-test.ts +4 -4
  181. package/src/__tests__/EntityCompanionProvider-test.ts +9 -8
  182. package/src/__tests__/EntityConfiguration-test.ts +85 -6
  183. package/src/__tests__/EntityDatabaseAdapter-test.ts +113 -17
  184. package/src/__tests__/EntityEdges-test.ts +135 -138
  185. package/src/__tests__/EntityFields-test.ts +2 -2
  186. package/src/__tests__/EntityLoader-test.ts +5 -7
  187. package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +17 -19
  188. package/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.ts +73 -0
  189. package/src/__tests__/EntityMutator-test.ts +74 -46
  190. package/src/__tests__/EntityPrivacyPolicy-test.ts +51 -74
  191. package/src/__tests__/EntityQueryContext-test.ts +1 -1
  192. package/src/__tests__/EntitySecondaryCacheLoader-test.ts +9 -9
  193. package/src/__tests__/EntitySelfReferentialEdges-test.ts +119 -122
  194. package/src/__tests__/GenericEntityCacheAdapter-test.ts +83 -28
  195. package/src/__tests__/ReadonlyEntity-test.ts +49 -9
  196. package/src/__tests__/ViewerContext-test.ts +1 -1
  197. package/src/__tests__/ViewerScopedEntityCompanion-test.ts +5 -2
  198. package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +1 -1
  199. package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +12 -3
  200. package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +25 -27
  201. package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +28 -34
  202. package/src/entityUtils.ts +4 -1
  203. package/src/errors/EntityInvalidFieldValueError.ts +5 -5
  204. package/src/errors/EntityNotAuthorizedError.ts +3 -3
  205. package/src/errors/EntityNotFoundError.ts +5 -5
  206. package/src/index.ts +7 -7
  207. package/src/internal/CompositeFieldHolder.ts +218 -0
  208. package/src/internal/CompositeFieldValueMap.ts +78 -0
  209. package/src/internal/EntityDataManager.ts +107 -96
  210. package/src/internal/EntityFieldTransformationUtils.ts +33 -14
  211. package/src/internal/EntityLoadInterfaces.ts +143 -0
  212. package/src/internal/EntityTableDataCoordinator.ts +8 -5
  213. package/src/internal/ReadThroughEntityCache.ts +63 -50
  214. package/src/internal/SingleFieldHolder.ts +131 -0
  215. package/src/internal/__tests__/CompositeFieldHolder-test.ts +25 -0
  216. package/src/internal/__tests__/CompositeFieldValueMap-test.ts +43 -0
  217. package/src/internal/__tests__/EntityDataManager-test.ts +308 -91
  218. package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +3 -2
  219. package/src/internal/__tests__/ReadThroughEntityCache-test.ts +315 -107
  220. package/src/metrics/EntityMetricsUtils.ts +7 -2
  221. package/src/metrics/IEntityMetricsAdapter.ts +6 -0
  222. package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +5 -5
  223. package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +5 -5
  224. package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +5 -5
  225. package/src/rules/PrivacyPolicyRule.ts +4 -4
  226. package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +1 -1
  227. package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +1 -1
  228. package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +1 -1
  229. package/src/utils/EntityPrivacyUtils.ts +72 -30
  230. package/src/utils/{testing → __testfixtures__}/PrivacyPolicyRuleTestUtils.ts +26 -26
  231. package/src/{testfixtures → utils/__testfixtures__}/SimpleTestEntity.ts +16 -15
  232. package/src/utils/__testfixtures__/StubCacheAdapter.ts +164 -0
  233. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapter.ts +19 -12
  234. package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapterProvider.ts +4 -4
  235. package/src/utils/__testfixtures__/TSMockitoExtensions.ts +69 -0
  236. package/src/{testfixtures → utils/__testfixtures__}/TestEntity.ts +21 -15
  237. package/src/{testfixtures → utils/__testfixtures__}/TestEntity2.ts +16 -15
  238. package/src/{testfixtures → utils/__testfixtures__}/TestEntityWithMutationTriggers.ts +23 -22
  239. package/src/{testfixtures → utils/__testfixtures__}/TestViewerContext.ts +1 -1
  240. package/src/utils/{testing → __testfixtures__}/describeFieldTestCase.ts +1 -1
  241. package/src/utils/__tests__/EntityPrivacyUtils-test.ts +81 -113
  242. package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +31 -30
  243. package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +1 -1
  244. package/src/utils/collections/SerializableKeyMap.ts +84 -0
  245. package/src/utils/collections/__tests__/SerializableKeyMap-test.ts +119 -0
  246. package/src/utils/collections/__tests__/sets-test.ts +17 -0
  247. package/src/utils/collections/maps.ts +7 -8
  248. package/src/utils/collections/sets.ts +3 -0
  249. package/src/utils/mergeEntityMutationTriggerConfigurations.ts +5 -5
  250. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
  251. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -273
  252. package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
  253. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
  254. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -110
  255. package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
  256. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
  257. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -401
  258. package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
  259. package/build/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
  260. package/build/__tests__/ComposedCacheAdapter-test.js +0 -229
  261. package/build/__tests__/ComposedCacheAdapter-test.js.map +0 -1
  262. package/build/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
  263. package/build/__tests__/ComposedSecondaryEntityCache-test.js +0 -66
  264. package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
  265. package/build/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
  266. package/build/__tests__/EnforcingEntityAssociationLoader-test.js +0 -115
  267. package/build/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
  268. package/build/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
  269. package/build/__tests__/EnforcingEntityLoader-test.js +0 -253
  270. package/build/__tests__/EnforcingEntityLoader-test.js.map +0 -1
  271. package/build/__tests__/Entity-test.d.ts +0 -1
  272. package/build/__tests__/Entity-test.js +0 -54
  273. package/build/__tests__/Entity-test.js.map +0 -1
  274. package/build/__tests__/EntityAssociationLoader-test.d.ts +0 -1
  275. package/build/__tests__/EntityAssociationLoader-test.js +0 -30
  276. package/build/__tests__/EntityAssociationLoader-test.js.map +0 -1
  277. package/build/__tests__/EntityCommonUseCases-test.d.ts +0 -1
  278. package/build/__tests__/EntityCommonUseCases-test.js +0 -154
  279. package/build/__tests__/EntityCommonUseCases-test.js.map +0 -1
  280. package/build/__tests__/EntityCompanion-test.d.ts +0 -1
  281. package/build/__tests__/EntityCompanion-test.js +0 -77
  282. package/build/__tests__/EntityCompanion-test.js.map +0 -1
  283. package/build/__tests__/EntityCompanionProvider-test.d.ts +0 -1
  284. package/build/__tests__/EntityCompanionProvider-test.js +0 -54
  285. package/build/__tests__/EntityCompanionProvider-test.js.map +0 -1
  286. package/build/__tests__/EntityConfiguration-test.d.ts +0 -1
  287. package/build/__tests__/EntityConfiguration-test.js +0 -103
  288. package/build/__tests__/EntityConfiguration-test.js.map +0 -1
  289. package/build/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
  290. package/build/__tests__/EntityDatabaseAdapter-test.js +0 -146
  291. package/build/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
  292. package/build/__tests__/EntityEdges-test.d.ts +0 -1
  293. package/build/__tests__/EntityEdges-test.js +0 -755
  294. package/build/__tests__/EntityEdges-test.js.map +0 -1
  295. package/build/__tests__/EntityFields-test.d.ts +0 -1
  296. package/build/__tests__/EntityFields-test.js +0 -63
  297. package/build/__tests__/EntityFields-test.js.map +0 -1
  298. package/build/__tests__/EntityLoader-test.d.ts +0 -1
  299. package/build/__tests__/EntityLoader-test.js +0 -36
  300. package/build/__tests__/EntityLoader-test.js.map +0 -1
  301. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
  302. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -77
  303. package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
  304. package/build/__tests__/EntityMutator-test.d.ts +0 -1
  305. package/build/__tests__/EntityMutator-test.js +0 -741
  306. package/build/__tests__/EntityMutator-test.js.map +0 -1
  307. package/build/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
  308. package/build/__tests__/EntityPrivacyPolicy-test.js +0 -463
  309. package/build/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
  310. package/build/__tests__/EntityQueryContext-test.d.ts +0 -1
  311. package/build/__tests__/EntityQueryContext-test.js +0 -116
  312. package/build/__tests__/EntityQueryContext-test.js.map +0 -1
  313. package/build/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
  314. package/build/__tests__/EntitySecondaryCacheLoader-test.js +0 -60
  315. package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
  316. package/build/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
  317. package/build/__tests__/EntitySelfReferentialEdges-test.js +0 -247
  318. package/build/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
  319. package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
  320. package/build/__tests__/GenericEntityCacheAdapter-test.js +0 -80
  321. package/build/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
  322. package/build/__tests__/ReadonlyEntity-test.d.ts +0 -1
  323. package/build/__tests__/ReadonlyEntity-test.js +0 -178
  324. package/build/__tests__/ReadonlyEntity-test.js.map +0 -1
  325. package/build/__tests__/ViewerContext-test.d.ts +0 -1
  326. package/build/__tests__/ViewerContext-test.js +0 -30
  327. package/build/__tests__/ViewerContext-test.js.map +0 -1
  328. package/build/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
  329. package/build/__tests__/ViewerScopedEntityCompanion-test.js +0 -20
  330. package/build/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
  331. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
  332. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -20
  333. package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
  334. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
  335. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -23
  336. package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
  337. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
  338. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -22
  339. package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
  340. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
  341. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -129
  342. package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
  343. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
  344. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -136
  345. package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
  346. package/build/__tests__/entityUtils-test.d.ts +0 -1
  347. package/build/__tests__/entityUtils-test.js +0 -87
  348. package/build/__tests__/entityUtils-test.js.map +0 -1
  349. package/build/internal/__tests__/EntityDataManager-test.d.ts +0 -1
  350. package/build/internal/__tests__/EntityDataManager-test.js +0 -373
  351. package/build/internal/__tests__/EntityDataManager-test.js.map +0 -1
  352. package/build/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
  353. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -136
  354. package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
  355. package/build/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
  356. package/build/internal/__tests__/ReadThroughEntityCache-test.js +0 -206
  357. package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
  358. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
  359. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -21
  360. package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
  361. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
  362. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -21
  363. package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
  364. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
  365. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -21
  366. package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
  367. package/build/testfixtures/DateIDTestEntity.d.ts +0 -19
  368. package/build/testfixtures/DateIDTestEntity.js +0 -48
  369. package/build/testfixtures/DateIDTestEntity.js.map +0 -1
  370. package/build/testfixtures/SimpleTestEntity.d.ts +0 -20
  371. package/build/testfixtures/SimpleTestEntity.js +0 -48
  372. package/build/testfixtures/SimpleTestEntity.js.map +0 -1
  373. package/build/testfixtures/TestEntity.d.ts +0 -30
  374. package/build/testfixtures/TestEntity.js +0 -93
  375. package/build/testfixtures/TestEntity.js.map +0 -1
  376. package/build/testfixtures/TestEntity2.d.ts +0 -20
  377. package/build/testfixtures/TestEntity2.js +0 -51
  378. package/build/testfixtures/TestEntity2.js.map +0 -1
  379. package/build/testfixtures/TestEntityNumberKey.d.ts +0 -19
  380. package/build/testfixtures/TestEntityNumberKey.js +0 -48
  381. package/build/testfixtures/TestEntityNumberKey.js.map +0 -1
  382. package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +0 -36
  383. package/build/testfixtures/TestEntityWithMutationTriggers.js +0 -82
  384. package/build/testfixtures/TestEntityWithMutationTriggers.js.map +0 -1
  385. package/build/testfixtures/TestViewerContext.d.ts +0 -3
  386. package/build/testfixtures/TestViewerContext.js +0 -10
  387. package/build/testfixtures/TestViewerContext.js.map +0 -1
  388. package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
  389. package/build/utils/__tests__/EntityPrivacyUtils-test.js +0 -520
  390. package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
  391. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
  392. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -181
  393. package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
  394. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
  395. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -26
  396. package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
  397. package/build/utils/collections/__tests__/maps-test.d.ts +0 -1
  398. package/build/utils/collections/__tests__/maps-test.js +0 -120
  399. package/build/utils/collections/__tests__/maps-test.js.map +0 -1
  400. package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +0 -28
  401. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js +0 -52
  402. package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +0 -1
  403. package/build/utils/testing/StubCacheAdapter.d.ts +0 -27
  404. package/build/utils/testing/StubCacheAdapter.js +0 -86
  405. package/build/utils/testing/StubCacheAdapter.js.map +0 -1
  406. package/build/utils/testing/StubDatabaseAdapter.d.ts +0 -25
  407. package/build/utils/testing/StubDatabaseAdapter.js +0 -191
  408. package/build/utils/testing/StubDatabaseAdapter.js.map +0 -1
  409. package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +0 -7
  410. package/build/utils/testing/StubDatabaseAdapterProvider.js +0 -14
  411. package/build/utils/testing/StubDatabaseAdapterProvider.js.map +0 -1
  412. package/build/utils/testing/StubQueryContextProvider.d.ts +0 -7
  413. package/build/utils/testing/StubQueryContextProvider.js +0 -19
  414. package/build/utils/testing/StubQueryContextProvider.js.map +0 -1
  415. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +0 -1
  416. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +0 -42
  417. package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +0 -1
  418. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.d.ts +0 -1
  419. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +0 -402
  420. package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +0 -1
  421. package/build/utils/testing/createUnitTestEntityCompanionProvider.d.ts +0 -7
  422. package/build/utils/testing/createUnitTestEntityCompanionProvider.js +0 -36
  423. package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +0 -1
  424. package/build/utils/testing/describeFieldTestCase.d.ts +0 -2
  425. package/build/utils/testing/describeFieldTestCase.js +0 -18
  426. package/build/utils/testing/describeFieldTestCase.js.map +0 -1
  427. package/src/testfixtures/DateIDTestEntity.ts +0 -59
  428. package/src/testfixtures/TestEntityNumberKey.ts +0 -59
  429. package/src/utils/testing/StubCacheAdapter.ts +0 -122
  430. package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +0 -42
  431. package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +0 -548
  432. /package/src/utils/{testing → __testfixtures__}/StubQueryContextProvider.ts +0 -0
  433. /package/src/utils/{testing → __testfixtures__}/createUnitTestEntityCompanionProvider.ts +0 -0
@@ -12,7 +12,7 @@ import ViewerContext from '../../ViewerContext';
12
12
  import AlwaysAllowPrivacyPolicyRule from '../../rules/AlwaysAllowPrivacyPolicyRule';
13
13
  import AlwaysDenyPrivacyPolicyRule from '../../rules/AlwaysDenyPrivacyPolicyRule';
14
14
  import { canViewerDeleteAsync } from '../EntityPrivacyUtils';
15
- import { createUnitTestEntityCompanionProvider } from '../testing/createUnitTestEntityCompanionProvider';
15
+ import { createUnitTestEntityCompanionProvider } from '../__testfixtures__/createUnitTestEntityCompanionProvider';
16
16
 
17
17
  describe(canViewerDeleteAsync, () => {
18
18
  describe('edgeDeletionPermissionInferenceBehavior', () => {
@@ -21,20 +21,18 @@ describe(canViewerDeleteAsync, () => {
21
21
  const viewerContext = new ViewerContext(companionProvider);
22
22
 
23
23
  // create root
24
- const testEntity = await TestEntity.creator(viewerContext).enforcing().createAsync();
24
+ const testEntity = await TestEntity.creator(viewerContext).createAsync();
25
25
 
26
26
  // create a bunch of leaves referencing root with
27
27
  // edgeDeletionPermissionInferenceBehavior = EntityEdgeDeletionPermissionInferenceBehavior.ONE_IMPLIES_ALL
28
28
  for (let i = 0; i < 10; i++) {
29
29
  await TestLeafEntity.creator(viewerContext)
30
- .enforcing()
31
30
  .setField('test_entity_id', testEntity.getID())
32
31
  .createAsync();
33
32
  }
34
33
 
35
34
  for (let i = 0; i < 10; i++) {
36
35
  await TestLeafLookupByFieldEntity.creator(viewerContext)
37
- .enforcing()
38
36
  .setField('test_entity_id', testEntity.getID())
39
37
  .createAsync();
40
38
  }
@@ -65,12 +63,11 @@ describe(canViewerDeleteAsync, () => {
65
63
  const viewerContext = new ViewerContext(companionProvider);
66
64
 
67
65
  // create root
68
- const testEntity = await TestEntity.creator(viewerContext).enforcing().createAsync();
66
+ const testEntity = await TestEntity.creator(viewerContext).createAsync();
69
67
 
70
68
  // create a bunch of leaves with no edgeDeletionPermissionInferenceBehavior
71
69
  for (let i = 0; i < 10; i++) {
72
70
  await TestLeafNoInferenceEntity.creator(viewerContext)
73
- .enforcing()
74
71
  .setField('test_entity_id', testEntity.getID())
75
72
  .createAsync();
76
73
  }
@@ -100,43 +97,44 @@ type TestLeafEntityFields = {
100
97
  };
101
98
 
102
99
  class AlwaysAllowEntityPrivacyPolicy<
103
- TFields extends object,
104
- TID extends NonNullable<TFields[TSelectedFields]>,
100
+ TFields extends Record<string, any>,
101
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
105
102
  TViewerContext extends ViewerContext,
106
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
103
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
107
104
  TSelectedFields extends keyof TFields = keyof TFields,
108
- > extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity, TSelectedFields> {
105
+ > extends EntityPrivacyPolicy<TFields, TIDField, TViewerContext, TEntity, TSelectedFields> {
109
106
  protected override readonly readRules = [
110
- new AlwaysAllowPrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>(),
107
+ new AlwaysAllowPrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>(),
111
108
  ];
112
109
  protected override readonly createRules = [
113
- new AlwaysAllowPrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>(),
110
+ new AlwaysAllowPrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>(),
114
111
  ];
115
112
  protected override readonly updateRules = [
116
- new AlwaysDenyPrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>(),
113
+ new AlwaysDenyPrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>(),
117
114
  ];
118
115
  protected override readonly deleteRules = [
119
- new AlwaysAllowPrivacyPolicyRule<TFields, TID, TViewerContext, TEntity, TSelectedFields>(),
116
+ new AlwaysAllowPrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>(),
120
117
  ];
121
118
  }
122
119
 
123
- class TestEntity extends Entity<TestEntityFields, string, ViewerContext> {
120
+ class TestEntity extends Entity<TestEntityFields, 'id', ViewerContext> {
124
121
  static defineCompanionDefinition(): EntityCompanionDefinition<
125
122
  TestEntityFields,
126
- string,
123
+ 'id',
127
124
  ViewerContext,
128
125
  TestEntity,
129
- AlwaysAllowEntityPrivacyPolicy<TestEntityFields, string, ViewerContext, TestEntity>
126
+ AlwaysAllowEntityPrivacyPolicy<TestEntityFields, 'id', ViewerContext, TestEntity>
130
127
  > {
131
128
  return {
132
129
  entityClass: TestEntity,
133
- entityConfiguration: new EntityConfiguration<TestEntityFields>({
130
+ entityConfiguration: new EntityConfiguration<TestEntityFields, 'id'>({
134
131
  idField: 'id',
135
132
  tableName: 'blah',
136
133
  inboundEdges: [TestLeafEntity, TestLeafLookupByFieldEntity, TestLeafNoInferenceEntity],
137
134
  schema: {
138
135
  id: new UUIDField({
139
136
  columnName: 'custom_id',
137
+ cache: false,
140
138
  }),
141
139
  },
142
140
  databaseAdapterFlavor: 'postgres',
@@ -147,22 +145,23 @@ class TestEntity extends Entity<TestEntityFields, string, ViewerContext> {
147
145
  }
148
146
  }
149
147
 
150
- class TestLeafEntity extends Entity<TestLeafEntityFields, string, ViewerContext> {
148
+ class TestLeafEntity extends Entity<TestLeafEntityFields, 'id', ViewerContext> {
151
149
  static defineCompanionDefinition(): EntityCompanionDefinition<
152
150
  TestLeafEntityFields,
153
- string,
151
+ 'id',
154
152
  ViewerContext,
155
153
  TestLeafEntity,
156
- AlwaysAllowEntityPrivacyPolicy<TestLeafEntityFields, string, ViewerContext, TestLeafEntity>
154
+ AlwaysAllowEntityPrivacyPolicy<TestLeafEntityFields, 'id', ViewerContext, TestLeafEntity>
157
155
  > {
158
156
  return {
159
157
  entityClass: TestLeafEntity,
160
- entityConfiguration: new EntityConfiguration<TestLeafEntityFields>({
158
+ entityConfiguration: new EntityConfiguration<TestLeafEntityFields, 'id'>({
161
159
  idField: 'id',
162
160
  tableName: 'blah_2',
163
161
  schema: {
164
162
  id: new UUIDField({
165
163
  columnName: 'custom_id',
164
+ cache: false,
166
165
  }),
167
166
  test_entity_id: new UUIDField({
168
167
  columnName: 'test_entity_id',
@@ -182,22 +181,23 @@ class TestLeafEntity extends Entity<TestLeafEntityFields, string, ViewerContext>
182
181
  }
183
182
  }
184
183
 
185
- class TestLeafLookupByFieldEntity extends Entity<TestLeafEntityFields, string, ViewerContext> {
184
+ class TestLeafLookupByFieldEntity extends Entity<TestLeafEntityFields, 'id', ViewerContext> {
186
185
  static defineCompanionDefinition(): EntityCompanionDefinition<
187
186
  TestLeafEntityFields,
188
- string,
187
+ 'id',
189
188
  ViewerContext,
190
189
  TestLeafEntity,
191
- AlwaysAllowEntityPrivacyPolicy<TestLeafEntityFields, string, ViewerContext, TestLeafEntity>
190
+ AlwaysAllowEntityPrivacyPolicy<TestLeafEntityFields, 'id', ViewerContext, TestLeafEntity>
192
191
  > {
193
192
  return {
194
193
  entityClass: TestLeafEntity,
195
- entityConfiguration: new EntityConfiguration<TestLeafEntityFields>({
194
+ entityConfiguration: new EntityConfiguration<TestLeafEntityFields, 'id'>({
196
195
  idField: 'id',
197
196
  tableName: 'blah_4',
198
197
  schema: {
199
198
  id: new UUIDField({
200
199
  columnName: 'custom_id',
200
+ cache: false,
201
201
  }),
202
202
  test_entity_id: new UUIDField({
203
203
  columnName: 'test_entity_id',
@@ -218,27 +218,28 @@ class TestLeafLookupByFieldEntity extends Entity<TestLeafEntityFields, string, V
218
218
  }
219
219
  }
220
220
 
221
- class TestLeafNoInferenceEntity extends Entity<TestLeafEntityFields, string, ViewerContext> {
221
+ class TestLeafNoInferenceEntity extends Entity<TestLeafEntityFields, 'id', ViewerContext> {
222
222
  static defineCompanionDefinition(): EntityCompanionDefinition<
223
223
  TestLeafEntityFields,
224
- string,
224
+ 'id',
225
225
  ViewerContext,
226
226
  TestLeafNoInferenceEntity,
227
227
  AlwaysAllowEntityPrivacyPolicy<
228
228
  TestLeafEntityFields,
229
- string,
229
+ 'id',
230
230
  ViewerContext,
231
231
  TestLeafNoInferenceEntity
232
232
  >
233
233
  > {
234
234
  return {
235
235
  entityClass: TestLeafNoInferenceEntity,
236
- entityConfiguration: new EntityConfiguration<TestLeafEntityFields>({
236
+ entityConfiguration: new EntityConfiguration<TestLeafEntityFields, 'id'>({
237
237
  idField: 'id',
238
238
  tableName: 'blah_3',
239
239
  schema: {
240
240
  id: new UUIDField({
241
241
  columnName: 'custom_id',
242
+ cache: false,
242
243
  }),
243
244
  test_entity_id: new UUIDField({
244
245
  columnName: 'test_entity_id',
@@ -1,4 +1,4 @@
1
- import { TestMutationTrigger } from '../../testfixtures/TestEntityWithMutationTriggers';
1
+ import { TestMutationTrigger } from '../__testfixtures__/TestEntityWithMutationTriggers';
2
2
  import { mergeEntityMutationTriggerConfigurations } from '../mergeEntityMutationTriggerConfigurations';
3
3
 
4
4
  describe(mergeEntityMutationTriggerConfigurations, () => {
@@ -0,0 +1,84 @@
1
+ /**
2
+ * A serializable object. The serialized value is used to determine equality.
3
+ */
4
+ export interface ISerializable<TSerialized> {
5
+ serialize(): TSerialized;
6
+ }
7
+
8
+ /**
9
+ * A map with keys that are serializable. Serialized keys are considered equal if their serialized values are equal.
10
+ * Otherwise, the map behaves like a regular Map.
11
+ */
12
+ export abstract class SerializableKeyMap<TSerialized, K extends ISerializable<TSerialized>, V>
13
+ implements ReadonlyMap<K, V>, Map<K, V>
14
+ {
15
+ protected readonly underlyingMap: Map<TSerialized, V>;
16
+
17
+ constructor(iterable?: Iterable<readonly [K, V]> | null) {
18
+ this.underlyingMap = new Map(
19
+ Array.from(iterable ?? []).map(([key, value]) => [key.serialize(), value]),
20
+ );
21
+ }
22
+
23
+ protected abstract deserializeKey(serializedKey: TSerialized): K;
24
+
25
+ forEach(
26
+ callbackfn: (value: V, key: K, map: SerializableKeyMap<TSerialized, K, V>) => void,
27
+ thisArg?: any,
28
+ ): void {
29
+ this.underlyingMap.forEach((value, key) => {
30
+ callbackfn.call(thisArg, value, this.deserializeKey(key), this);
31
+ });
32
+ }
33
+
34
+ get(key: K): V | undefined {
35
+ return this.underlyingMap.get(key.serialize());
36
+ }
37
+
38
+ has(key: K): boolean {
39
+ return this.underlyingMap.has(key.serialize());
40
+ }
41
+
42
+ clear(): void {
43
+ this.underlyingMap.clear();
44
+ }
45
+
46
+ delete(key: K): boolean {
47
+ return this.underlyingMap.delete(key.serialize());
48
+ }
49
+
50
+ set(key: K, value: V): this {
51
+ this.underlyingMap.set(key.serialize(), value);
52
+ return this;
53
+ }
54
+
55
+ get size(): number {
56
+ return this.underlyingMap.size;
57
+ }
58
+
59
+ *entries(): MapIterator<[K, V]> {
60
+ for (const [key, value] of this.underlyingMap.entries()) {
61
+ yield [this.deserializeKey(key), value];
62
+ }
63
+ }
64
+
65
+ *keys(): MapIterator<K> {
66
+ for (const key of this.underlyingMap.keys()) {
67
+ yield this.deserializeKey(key);
68
+ }
69
+ }
70
+
71
+ *values(): MapIterator<V> {
72
+ for (const value of this.underlyingMap.values()) {
73
+ yield value;
74
+ }
75
+ }
76
+
77
+ [Symbol.iterator](): MapIterator<[K, V]> {
78
+ return this.entries();
79
+ }
80
+
81
+ get [Symbol.toStringTag](): string {
82
+ return 'SerializableKeyMap';
83
+ }
84
+ }
@@ -0,0 +1,119 @@
1
+ import { ISerializable, SerializableKeyMap } from '../SerializableKeyMap';
2
+
3
+ describe(SerializableKeyMap, () => {
4
+ it('behaves as a Map/ReadonlyMap', () => {
5
+ const map = new TestSerializableKeyMap();
6
+ expect(map.size).toBe(0);
7
+ expect(map.has(new TestSerializableKey('key'))).toBe(false);
8
+ expect(map.get(new TestSerializableKey('key'))).toBe(undefined);
9
+
10
+ map.set(new TestSerializableKey('key'), 'value');
11
+ expect(map.size).toBe(1);
12
+ expect(map.has(new TestSerializableKey('key'))).toBe(true);
13
+ expect(map.get(new TestSerializableKey('key'))).toBe('value');
14
+
15
+ map.delete(new TestSerializableKey('key'));
16
+ expect(map.size).toBe(0);
17
+ expect(map.has(new TestSerializableKey('key'))).toBe(false);
18
+ expect(map.get(new TestSerializableKey('key'))).toBe(undefined);
19
+
20
+ map.set(new TestSerializableKey('key'), 'value');
21
+ expect(map.size).toBe(1);
22
+ map.clear();
23
+ expect(map.size).toBe(0);
24
+ expect(map.get(new TestSerializableKey('key'))).toBe(undefined);
25
+
26
+ map.set(new TestSerializableKey('key'), 'value');
27
+ map.set(new TestSerializableKey('key'), 'value');
28
+ expect(map.size).toBe(1);
29
+
30
+ map.set(new TestSerializableKey('key2'), 'value2');
31
+ expect(map.size).toBe(2);
32
+
33
+ // check keys ordering based on insertion order
34
+ const keys = Array.from(map.keys());
35
+ expect(keys.length).toBe(2);
36
+ expect(keys[0]!.value).toBe('key');
37
+ expect(keys[1]!.value).toBe('key2');
38
+
39
+ // check values ordering based on insertion order
40
+ const values = Array.from(map.values());
41
+ expect(values.length).toBe(2);
42
+ expect(values[0]).toBe('value');
43
+ expect(values[1]).toBe('value2');
44
+
45
+ // check entries ordering based on insertion order
46
+ const entries = Array.from(map.entries());
47
+ expect(entries.length).toBe(2);
48
+ expect(entries[0]![0].value).toBe('key');
49
+ expect(entries[0]![1]).toBe('value');
50
+ expect(entries[1]![0].value).toBe('key2');
51
+ expect(entries[1]![1]).toBe('value2');
52
+
53
+ // check forEach ordering based on insertion order
54
+ const forEachEntries: [TestSerializableKey, string][] = [];
55
+ map.forEach((value, key) => {
56
+ forEachEntries.push([key, value]);
57
+ });
58
+ expect(forEachEntries.length).toBe(2);
59
+ expect(forEachEntries[0]![0].value).toBe('key');
60
+ expect(forEachEntries[0]![1]).toBe('value');
61
+ expect(forEachEntries[1]![0].value).toBe('key2');
62
+ expect(forEachEntries[1]![1]).toBe('value2');
63
+
64
+ // check iterator ordering based on insertion order
65
+ const iteratorEntries = Array.from(map);
66
+ expect(iteratorEntries.length).toBe(2);
67
+ expect(iteratorEntries[0]![0].value).toBe('key');
68
+ expect(iteratorEntries[0]![1]).toBe('value');
69
+ expect(iteratorEntries[1]![0].value).toBe('key2');
70
+ expect(iteratorEntries[1]![1]).toBe('value2');
71
+ });
72
+
73
+ it('constructs with values', () => {
74
+ const map = new TestSerializableKeyMap([
75
+ [new TestSerializableKey('key'), 'value'],
76
+ [new TestSerializableKey('key2'), 'value2'],
77
+ ]);
78
+ expect(map.size).toBe(2);
79
+ expect(map.get(new TestSerializableKey('key'))).toBe('value');
80
+ expect(map.get(new TestSerializableKey('key2'))).toBe('value2');
81
+
82
+ const keys = Array.from(map.keys());
83
+ expect(keys.length).toBe(2);
84
+ expect(keys[0]!.value).toBe('key');
85
+ expect(keys[1]!.value).toBe('key2');
86
+ });
87
+
88
+ it('has correct toStringTag', () => {
89
+ const map = new TestSerializableKeyMap();
90
+ expect(Object.prototype.toString.call(map)).toBe('[object SerializableKeyMap]');
91
+ });
92
+ });
93
+
94
+ declare const TestSerializableKeySerializedBrand: unique symbol;
95
+ export type SerializedTestSerializableKey = string & {
96
+ readonly [TestSerializableKeySerializedBrand]: true;
97
+ };
98
+
99
+ class TestSerializableKey implements ISerializable<SerializedTestSerializableKey> {
100
+ constructor(public readonly value: string) {}
101
+
102
+ serialize(): SerializedTestSerializableKey {
103
+ return JSON.stringify(this.value) as SerializedTestSerializableKey;
104
+ }
105
+
106
+ static deserialize(serialized: SerializedTestSerializableKey): TestSerializableKey {
107
+ return new TestSerializableKey(JSON.parse(serialized));
108
+ }
109
+ }
110
+
111
+ class TestSerializableKeyMap extends SerializableKeyMap<
112
+ SerializedTestSerializableKey,
113
+ TestSerializableKey,
114
+ string
115
+ > {
116
+ protected deserializeKey(serializedKey: SerializedTestSerializableKey): TestSerializableKey {
117
+ return TestSerializableKey.deserialize(serializedKey);
118
+ }
119
+ }
@@ -0,0 +1,17 @@
1
+ import { areSetsEqual } from '../sets';
2
+
3
+ describe(areSetsEqual, () => {
4
+ it.each([
5
+ [new Set([1, 2]), new Set([1, 2])],
6
+ [new Set([1, 2]), new Set([2, 1])],
7
+ ])('equal cases: %p', (a, b) => {
8
+ expect(areSetsEqual(a, b)).toBe(true);
9
+ });
10
+
11
+ it.each([
12
+ [new Set([1, 2, 3]), new Set([1, 2])],
13
+ [new Set([1, 2]), new Set([1, 2, 3])],
14
+ ])('non-equal cases: %p', (a, b) => {
15
+ expect(areSetsEqual(a, b)).toBe(false);
16
+ });
17
+ });
@@ -30,7 +30,7 @@ export const mapMap = <K, V, M>(
30
30
  map: ReadonlyMap<K, V>,
31
31
  mapper: (value: V, key: K) => M,
32
32
  ): Map<K, M> => {
33
- const resultingMap = new Map();
33
+ const resultingMap = new Map<K, M>();
34
34
  for (const [k, v] of map) {
35
35
  resultingMap.set(k, mapper(v, k));
36
36
  }
@@ -47,7 +47,7 @@ export const mapMapAsync = async function <K, V, M>(
47
47
  map: ReadonlyMap<K, V>,
48
48
  mapper: (value: V, key: K) => Promise<M>,
49
49
  ): Promise<Map<K, M>> {
50
- const resultingMap: Map<K, M> = new Map();
50
+ const resultingMap = new Map<K, M>();
51
51
  await Promise.all(
52
52
  Array.from(map.keys()).map(async (k) => {
53
53
  const initialValue = map.get(k) as V;
@@ -71,7 +71,7 @@ export const mapKeys = <K, V, K2>(
71
71
  map: ReadonlyMap<K, V>,
72
72
  mapper: (key: K, value: V) => K2,
73
73
  ): Map<K2, V> => {
74
- const resultingMap = new Map();
74
+ const resultingMap = new Map<K2, V>();
75
75
  for (const [k, v] of map) {
76
76
  resultingMap.set(mapper(k, v), v);
77
77
  }
@@ -94,10 +94,9 @@ export const zipToMap = <K, V>(keys: readonly K[], values: readonly V[]): Map<K,
94
94
  keys.length === values.length,
95
95
  `zipToMap input length mismatch: keys[${keys.length}], values[${values.length}]`,
96
96
  );
97
- const resultingMap = new Map();
97
+ const resultingMap = new Map<K, V>();
98
98
  for (let i = 0; i < keys.length; i++) {
99
- const key = keys[i];
100
- resultingMap.set(key, values[i]);
99
+ resultingMap.set(keys[i]!, values[i]!);
101
100
  }
102
101
  return resultingMap;
103
102
  };
@@ -108,7 +107,7 @@ export const zipToMap = <K, V>(keys: readonly K[], values: readonly V[]): Map<K,
108
107
  * @param map - map to invert
109
108
  */
110
109
  export const invertMap = <K, V>(map: ReadonlyMap<K, V>): Map<V, K> => {
111
- const resultingMap = new Map();
110
+ const resultingMap = new Map<V, K>();
112
111
  for (const [k, v] of map) {
113
112
  resultingMap.set(v, k);
114
113
  }
@@ -185,7 +184,7 @@ export function filterMap<K, V>(
185
184
  map: ReadonlyMap<K, V>,
186
185
  predicate: (value: V, key: K) => unknown,
187
186
  ): Map<K, V> {
188
- const resultingMap = new Map();
187
+ const resultingMap = new Map<K, V>();
189
188
  map.forEach((v, k) => {
190
189
  if (predicate(v, k)) {
191
190
  resultingMap.set(k, v);
@@ -0,0 +1,3 @@
1
+ export function areSetsEqual<T>(a: ReadonlySet<T>, b: ReadonlySet<T>): boolean {
2
+ return a.size === b.size && [...a].every((value) => b.has(value));
3
+ }
@@ -7,20 +7,20 @@ function nonNullish<TValue>(value: TValue | null | undefined): value is NonNulla
7
7
  }
8
8
 
9
9
  export function mergeEntityMutationTriggerConfigurations<
10
- TFields extends object,
11
- TID extends NonNullable<TFields[TSelectedFields]>,
10
+ TFields extends Record<string, any>,
11
+ TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
12
12
  TViewerContext extends ViewerContext,
13
- TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>,
13
+ TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
14
14
  TSelectedFields extends keyof TFields,
15
15
  >(
16
16
  ...mutationTriggerConfigurations: EntityMutationTriggerConfiguration<
17
17
  TFields,
18
- TID,
18
+ TIDField,
19
19
  TViewerContext,
20
20
  TEntity,
21
21
  TSelectedFields
22
22
  >[]
23
- ): EntityMutationTriggerConfiguration<TFields, TID, TViewerContext, TEntity, TSelectedFields> {
23
+ ): EntityMutationTriggerConfiguration<TFields, TIDField, TViewerContext, TEntity, TSelectedFields> {
24
24
  const merged = {
25
25
  beforeCreate: mutationTriggerConfigurations.flatMap((c) => c.beforeCreate).filter(nonNullish),
26
26
  afterCreate: mutationTriggerConfigurations.flatMap((c) => c.afterCreate).filter(nonNullish),