@expo/entity 0.46.0 → 0.48.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 (215) hide show
  1. package/build/src/AuthorizationResultBasedEntityMutator.d.ts +5 -3
  2. package/build/src/AuthorizationResultBasedEntityMutator.js +75 -37
  3. package/build/src/AuthorizationResultBasedEntityMutator.js.map +1 -1
  4. package/build/src/EntityDeleter.js +1 -1
  5. package/build/src/EntityDeleter.js.map +1 -1
  6. package/build/src/EntityFields.d.ts +7 -0
  7. package/build/src/EntityFields.js +11 -1
  8. package/build/src/EntityFields.js.map +1 -1
  9. package/build/src/EntityMutatorFactory.d.ts +3 -2
  10. package/build/src/EntityMutatorFactory.js +4 -4
  11. package/build/src/EntityMutatorFactory.js.map +1 -1
  12. package/build/src/EntityUpdater.js +1 -1
  13. package/build/src/EntityUpdater.js.map +1 -1
  14. package/build/src/ViewerScopedEntityMutatorFactory.d.ts +3 -2
  15. package/build/src/ViewerScopedEntityMutatorFactory.js +4 -4
  16. package/build/src/ViewerScopedEntityMutatorFactory.js.map +1 -1
  17. package/package.json +5 -2
  18. package/src/AuthorizationResultBasedEntityMutator.ts +63 -49
  19. package/src/EntityDeleter.ts +1 -1
  20. package/src/EntityFields.ts +13 -0
  21. package/src/EntityMutatorFactory.ts +5 -0
  22. package/src/EntityUpdater.ts +1 -1
  23. package/src/ViewerScopedEntityMutatorFactory.ts +5 -2
  24. package/src/__tests__/EntityFields-test.ts +7 -0
  25. package/src/__tests__/EntityMutator-test.ts +217 -16
  26. package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
  27. package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -240
  28. package/build/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
  29. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
  30. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -109
  31. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
  32. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
  33. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -590
  34. package/build/src/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
  35. package/build/src/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
  36. package/build/src/__tests__/ComposedCacheAdapter-test.js +0 -259
  37. package/build/src/__tests__/ComposedCacheAdapter-test.js.map +0 -1
  38. package/build/src/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
  39. package/build/src/__tests__/ComposedSecondaryEntityCache-test.js +0 -67
  40. package/build/src/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
  41. package/build/src/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
  42. package/build/src/__tests__/EnforcingEntityAssociationLoader-test.js +0 -113
  43. package/build/src/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
  44. package/build/src/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
  45. package/build/src/__tests__/EnforcingEntityLoader-test.js +0 -316
  46. package/build/src/__tests__/EnforcingEntityLoader-test.js.map +0 -1
  47. package/build/src/__tests__/Entity-test.d.ts +0 -1
  48. package/build/src/__tests__/Entity-test.js +0 -92
  49. package/build/src/__tests__/Entity-test.js.map +0 -1
  50. package/build/src/__tests__/EntityAssociationLoader-test.d.ts +0 -1
  51. package/build/src/__tests__/EntityAssociationLoader-test.js +0 -28
  52. package/build/src/__tests__/EntityAssociationLoader-test.js.map +0 -1
  53. package/build/src/__tests__/EntityCommonUseCases-test.d.ts +0 -1
  54. package/build/src/__tests__/EntityCommonUseCases-test.js +0 -111
  55. package/build/src/__tests__/EntityCommonUseCases-test.js.map +0 -1
  56. package/build/src/__tests__/EntityCompanion-test.d.ts +0 -1
  57. package/build/src/__tests__/EntityCompanion-test.js +0 -42
  58. package/build/src/__tests__/EntityCompanion-test.js.map +0 -1
  59. package/build/src/__tests__/EntityCompanionProvider-test.d.ts +0 -1
  60. package/build/src/__tests__/EntityCompanionProvider-test.js +0 -53
  61. package/build/src/__tests__/EntityCompanionProvider-test.js.map +0 -1
  62. package/build/src/__tests__/EntityConfiguration-test.d.ts +0 -1
  63. package/build/src/__tests__/EntityConfiguration-test.js +0 -164
  64. package/build/src/__tests__/EntityConfiguration-test.js.map +0 -1
  65. package/build/src/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
  66. package/build/src/__tests__/EntityDatabaseAdapter-test.js +0 -189
  67. package/build/src/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
  68. package/build/src/__tests__/EntityEdges-test.d.ts +0 -1
  69. package/build/src/__tests__/EntityEdges-test.js +0 -680
  70. package/build/src/__tests__/EntityEdges-test.js.map +0 -1
  71. package/build/src/__tests__/EntityFields-test.d.ts +0 -1
  72. package/build/src/__tests__/EntityFields-test.js +0 -61
  73. package/build/src/__tests__/EntityFields-test.js.map +0 -1
  74. package/build/src/__tests__/EntityLoader-test.d.ts +0 -1
  75. package/build/src/__tests__/EntityLoader-test.js +0 -34
  76. package/build/src/__tests__/EntityLoader-test.js.map +0 -1
  77. package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
  78. package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -71
  79. package/build/src/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
  80. package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.d.ts +0 -1
  81. package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.js +0 -54
  82. package/build/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.js.map +0 -1
  83. package/build/src/__tests__/EntityMutator-test.d.ts +0 -1
  84. package/build/src/__tests__/EntityMutator-test.js +0 -721
  85. package/build/src/__tests__/EntityMutator-test.js.map +0 -1
  86. package/build/src/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
  87. package/build/src/__tests__/EntityPrivacyPolicy-test.js +0 -429
  88. package/build/src/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
  89. package/build/src/__tests__/EntityQueryContext-test.d.ts +0 -1
  90. package/build/src/__tests__/EntityQueryContext-test.js +0 -181
  91. package/build/src/__tests__/EntityQueryContext-test.js.map +0 -1
  92. package/build/src/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
  93. package/build/src/__tests__/EntitySecondaryCacheLoader-test.js +0 -58
  94. package/build/src/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
  95. package/build/src/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
  96. package/build/src/__tests__/EntitySelfReferentialEdges-test.js +0 -196
  97. package/build/src/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
  98. package/build/src/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
  99. package/build/src/__tests__/GenericEntityCacheAdapter-test.js +0 -95
  100. package/build/src/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
  101. package/build/src/__tests__/ReadonlyEntity-test.d.ts +0 -1
  102. package/build/src/__tests__/ReadonlyEntity-test.js +0 -209
  103. package/build/src/__tests__/ReadonlyEntity-test.js.map +0 -1
  104. package/build/src/__tests__/ViewerContext-test.d.ts +0 -1
  105. package/build/src/__tests__/ViewerContext-test.js +0 -28
  106. package/build/src/__tests__/ViewerContext-test.js.map +0 -1
  107. package/build/src/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
  108. package/build/src/__tests__/ViewerScopedEntityCompanion-test.js +0 -18
  109. package/build/src/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
  110. package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
  111. package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -18
  112. package/build/src/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
  113. package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
  114. package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -21
  115. package/build/src/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
  116. package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
  117. package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -20
  118. package/build/src/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
  119. package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
  120. package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -121
  121. package/build/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
  122. package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
  123. package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -119
  124. package/build/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
  125. package/build/src/__tests__/entityUtils-test.d.ts +0 -1
  126. package/build/src/__tests__/entityUtils-test.js +0 -88
  127. package/build/src/__tests__/entityUtils-test.js.map +0 -1
  128. package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.d.ts +0 -1
  129. package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.js +0 -21
  130. package/build/src/errors/__tests__/EntityDatabaseAdapterError-test.js.map +0 -1
  131. package/build/src/internal/__tests__/CompositeFieldHolder-test.d.ts +0 -1
  132. package/build/src/internal/__tests__/CompositeFieldHolder-test.js +0 -25
  133. package/build/src/internal/__tests__/CompositeFieldHolder-test.js.map +0 -1
  134. package/build/src/internal/__tests__/CompositeFieldValueMap-test.d.ts +0 -1
  135. package/build/src/internal/__tests__/CompositeFieldValueMap-test.js +0 -40
  136. package/build/src/internal/__tests__/CompositeFieldValueMap-test.js.map +0 -1
  137. package/build/src/internal/__tests__/EntityDataManager-test.d.ts +0 -1
  138. package/build/src/internal/__tests__/EntityDataManager-test.js +0 -666
  139. package/build/src/internal/__tests__/EntityDataManager-test.js.map +0 -1
  140. package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
  141. package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -135
  142. package/build/src/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
  143. package/build/src/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
  144. package/build/src/internal/__tests__/ReadThroughEntityCache-test.js +0 -217
  145. package/build/src/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
  146. package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
  147. package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -18
  148. package/build/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
  149. package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
  150. package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -18
  151. package/build/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
  152. package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
  153. package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -18
  154. package/build/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
  155. package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.d.ts +0 -28
  156. package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.js +0 -53
  157. package/build/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.js.map +0 -1
  158. package/build/src/utils/__testfixtures__/SimpleTestEntity.d.ts +0 -20
  159. package/build/src/utils/__testfixtures__/SimpleTestEntity.js +0 -46
  160. package/build/src/utils/__testfixtures__/SimpleTestEntity.js.map +0 -1
  161. package/build/src/utils/__testfixtures__/StubCacheAdapter.d.ts +0 -29
  162. package/build/src/utils/__testfixtures__/StubCacheAdapter.js +0 -103
  163. package/build/src/utils/__testfixtures__/StubCacheAdapter.js.map +0 -1
  164. package/build/src/utils/__testfixtures__/StubDatabaseAdapter.d.ts +0 -26
  165. package/build/src/utils/__testfixtures__/StubDatabaseAdapter.js +0 -173
  166. package/build/src/utils/__testfixtures__/StubDatabaseAdapter.js.map +0 -1
  167. package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.d.ts +0 -7
  168. package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.js +0 -12
  169. package/build/src/utils/__testfixtures__/StubDatabaseAdapterProvider.js.map +0 -1
  170. package/build/src/utils/__testfixtures__/StubQueryContextProvider.d.ts +0 -7
  171. package/build/src/utils/__testfixtures__/StubQueryContextProvider.js +0 -17
  172. package/build/src/utils/__testfixtures__/StubQueryContextProvider.js.map +0 -1
  173. package/build/src/utils/__testfixtures__/TSMockitoExtensions.d.ts +0 -9
  174. package/build/src/utils/__testfixtures__/TSMockitoExtensions.js +0 -65
  175. package/build/src/utils/__testfixtures__/TSMockitoExtensions.js.map +0 -1
  176. package/build/src/utils/__testfixtures__/TestEntity.d.ts +0 -30
  177. package/build/src/utils/__testfixtures__/TestEntity.js +0 -96
  178. package/build/src/utils/__testfixtures__/TestEntity.js.map +0 -1
  179. package/build/src/utils/__testfixtures__/TestEntity2.d.ts +0 -20
  180. package/build/src/utils/__testfixtures__/TestEntity2.js +0 -49
  181. package/build/src/utils/__testfixtures__/TestEntity2.js.map +0 -1
  182. package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.d.ts +0 -36
  183. package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.js +0 -80
  184. package/build/src/utils/__testfixtures__/TestEntityWithMutationTriggers.js.map +0 -1
  185. package/build/src/utils/__testfixtures__/TestViewerContext.d.ts +0 -3
  186. package/build/src/utils/__testfixtures__/TestViewerContext.js +0 -8
  187. package/build/src/utils/__testfixtures__/TestViewerContext.js.map +0 -1
  188. package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.d.ts +0 -7
  189. package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.js +0 -33
  190. package/build/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.js.map +0 -1
  191. package/build/src/utils/__testfixtures__/describeFieldTestCase.d.ts +0 -2
  192. package/build/src/utils/__testfixtures__/describeFieldTestCase.js +0 -19
  193. package/build/src/utils/__testfixtures__/describeFieldTestCase.js.map +0 -1
  194. package/build/src/utils/__tests__/EntityCreationUtils-test.d.ts +0 -1
  195. package/build/src/utils/__tests__/EntityCreationUtils-test.js +0 -144
  196. package/build/src/utils/__tests__/EntityCreationUtils-test.js.map +0 -1
  197. package/build/src/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
  198. package/build/src/utils/__tests__/EntityPrivacyUtils-test.js +0 -460
  199. package/build/src/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
  200. package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
  201. package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -180
  202. package/build/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
  203. package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
  204. package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -27
  205. package/build/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
  206. package/build/src/utils/collections/__tests__/SerializableKeyMap-test.d.ts +0 -5
  207. package/build/src/utils/collections/__tests__/SerializableKeyMap-test.js +0 -99
  208. package/build/src/utils/collections/__tests__/SerializableKeyMap-test.js.map +0 -1
  209. package/build/src/utils/collections/__tests__/maps-test.d.ts +0 -1
  210. package/build/src/utils/collections/__tests__/maps-test.js +0 -121
  211. package/build/src/utils/collections/__tests__/maps-test.js.map +0 -1
  212. package/build/src/utils/collections/__tests__/sets-test.d.ts +0 -1
  213. package/build/src/utils/collections/__tests__/sets-test.js +0 -19
  214. package/build/src/utils/collections/__tests__/sets-test.js.map +0 -1
  215. package/build/tsconfig.tsbuildinfo +0 -1
@@ -477,6 +477,7 @@ export class AuthorizationResultBasedUpdateMutator<
477
477
  databaseAdapter: EntityDatabaseAdapter<TFields, TIDField>,
478
478
  metricsAdapter: IEntityMetricsAdapter,
479
479
  originalEntity: TEntity,
480
+ private readonly cascadingDeleteCause: EntityCascadingDeletionInfo | null,
480
481
  ) {
481
482
  super(
482
483
  companionProvider,
@@ -517,37 +518,25 @@ export class AuthorizationResultBasedUpdateMutator<
517
518
  EntityMetricsMutationType.UPDATE,
518
519
  this.entityClass.name,
519
520
  this.queryContext,
520
- )(this.updateInTransactionAsync(false, null));
521
+ )(this.updateInTransactionAsync(false));
521
522
  }
522
523
 
523
- private async updateInTransactionAsync(
524
- skipDatabaseUpdate: true,
525
- cascadingDeleteCause: EntityCascadingDeletionInfo,
526
- ): Promise<Result<TEntity>>;
527
- private async updateInTransactionAsync(
528
- skipDatabaseUpdate: false,
529
- cascadingDeleteCause: EntityCascadingDeletionInfo | null,
530
- ): Promise<Result<TEntity>>;
531
- private async updateInTransactionAsync(
532
- skipDatabaseUpdate: boolean,
533
- cascadingDeleteCause: EntityCascadingDeletionInfo | null,
534
- ): Promise<Result<TEntity>> {
524
+ private async updateInTransactionAsync(skipDatabaseUpdate: boolean): Promise<Result<TEntity>> {
535
525
  return await this.queryContext.runInTransactionIfNotInTransactionAsync((innerQueryContext) =>
536
- this.updateInternalAsync(innerQueryContext, skipDatabaseUpdate, cascadingDeleteCause),
526
+ this.updateInternalAsync(innerQueryContext, skipDatabaseUpdate),
537
527
  );
538
528
  }
539
529
 
540
530
  private async updateInternalAsync(
541
531
  queryContext: EntityTransactionalQueryContext,
542
532
  skipDatabaseUpdate: boolean,
543
- cascadingDeleteCause: EntityCascadingDeletionInfo | null,
544
533
  ): Promise<Result<TEntity>> {
545
534
  this.validateFields(this.updatedFields);
546
535
  this.ensureStableIDField(this.updatedFields);
547
536
 
548
537
  const entityLoader = this.entityLoaderFactory.forLoad(this.viewerContext, queryContext, {
549
538
  previousValue: this.originalEntity,
550
- cascadingDeleteCause,
539
+ cascadingDeleteCause: this.cascadingDeleteCause,
551
540
  });
552
541
 
553
542
  const entityAboutToBeUpdated = entityLoader.utils.constructEntity(this.fieldsForEntity);
@@ -555,7 +544,7 @@ export class AuthorizationResultBasedUpdateMutator<
555
544
  this.privacyPolicy.authorizeUpdateAsync(
556
545
  this.viewerContext,
557
546
  queryContext,
558
- { previousValue: this.originalEntity, cascadingDeleteCause },
547
+ { previousValue: this.originalEntity, cascadingDeleteCause: this.cascadingDeleteCause },
559
548
  entityAboutToBeUpdated,
560
549
  this.metricsAdapter,
561
550
  ),
@@ -568,19 +557,31 @@ export class AuthorizationResultBasedUpdateMutator<
568
557
  this.mutationValidators,
569
558
  queryContext,
570
559
  entityAboutToBeUpdated,
571
- { type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause },
560
+ {
561
+ type: EntityMutationType.UPDATE,
562
+ previousValue: this.originalEntity,
563
+ cascadingDeleteCause: this.cascadingDeleteCause,
564
+ },
572
565
  );
573
566
  await this.executeMutationTriggersAsync(
574
567
  this.mutationTriggers.beforeAll,
575
568
  queryContext,
576
569
  entityAboutToBeUpdated,
577
- { type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause },
570
+ {
571
+ type: EntityMutationType.UPDATE,
572
+ previousValue: this.originalEntity,
573
+ cascadingDeleteCause: this.cascadingDeleteCause,
574
+ },
578
575
  );
579
576
  await this.executeMutationTriggersAsync(
580
577
  this.mutationTriggers.beforeUpdate,
581
578
  queryContext,
582
579
  entityAboutToBeUpdated,
583
- { type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause },
580
+ {
581
+ type: EntityMutationType.UPDATE,
582
+ previousValue: this.originalEntity,
583
+ cascadingDeleteCause: this.cascadingDeleteCause,
584
+ },
584
585
  );
585
586
 
586
587
  // skip the database update when specified
@@ -627,13 +628,21 @@ export class AuthorizationResultBasedUpdateMutator<
627
628
  this.mutationTriggers.afterUpdate,
628
629
  queryContext,
629
630
  updatedEntity,
630
- { type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause },
631
+ {
632
+ type: EntityMutationType.UPDATE,
633
+ previousValue: this.originalEntity,
634
+ cascadingDeleteCause: this.cascadingDeleteCause,
635
+ },
631
636
  );
632
637
  await this.executeMutationTriggersAsync(
633
638
  this.mutationTriggers.afterAll,
634
639
  queryContext,
635
640
  updatedEntity,
636
- { type: EntityMutationType.UPDATE, previousValue: this.originalEntity, cascadingDeleteCause },
641
+ {
642
+ type: EntityMutationType.UPDATE,
643
+ previousValue: this.originalEntity,
644
+ cascadingDeleteCause: this.cascadingDeleteCause,
645
+ },
637
646
  );
638
647
 
639
648
  queryContext.appendPostCommitCallback(
@@ -644,7 +653,7 @@ export class AuthorizationResultBasedUpdateMutator<
644
653
  {
645
654
  type: EntityMutationType.UPDATE,
646
655
  previousValue: this.originalEntity,
647
- cascadingDeleteCause,
656
+ cascadingDeleteCause: this.cascadingDeleteCause,
648
657
  },
649
658
  ),
650
659
  );
@@ -724,6 +733,7 @@ export class AuthorizationResultBasedDeleteMutator<
724
733
  databaseAdapter: EntityDatabaseAdapter<TFields, TIDField>,
725
734
  metricsAdapter: IEntityMetricsAdapter,
726
735
  private readonly entity: TEntity,
736
+ private readonly cascadingDeleteCause: EntityCascadingDeletionInfo | null,
727
737
  ) {
728
738
  super(
729
739
  companionProvider,
@@ -750,20 +760,18 @@ export class AuthorizationResultBasedDeleteMutator<
750
760
  EntityMetricsMutationType.DELETE,
751
761
  this.entityClass.name,
752
762
  this.queryContext,
753
- )(this.deleteInTransactionAsync(new Set(), false, null));
763
+ )(this.deleteInTransactionAsync(new Set(), false));
754
764
  }
755
765
 
756
766
  private async deleteInTransactionAsync(
757
767
  processedEntityIdentifiersFromTransitiveDeletions: Set<string>,
758
768
  skipDatabaseDeletion: boolean,
759
- cascadingDeleteCause: EntityCascadingDeletionInfo | null,
760
769
  ): Promise<Result<void>> {
761
770
  return await this.queryContext.runInTransactionIfNotInTransactionAsync((innerQueryContext) =>
762
771
  this.deleteInternalAsync(
763
772
  innerQueryContext,
764
773
  processedEntityIdentifiersFromTransitiveDeletions,
765
774
  skipDatabaseDeletion,
766
- cascadingDeleteCause,
767
775
  ),
768
776
  );
769
777
  }
@@ -772,13 +780,12 @@ export class AuthorizationResultBasedDeleteMutator<
772
780
  queryContext: EntityTransactionalQueryContext,
773
781
  processedEntityIdentifiersFromTransitiveDeletions: Set<string>,
774
782
  skipDatabaseDeletion: boolean,
775
- cascadingDeleteCause: EntityCascadingDeletionInfo | null,
776
783
  ): Promise<Result<void>> {
777
784
  const authorizeDeleteResult = await asyncResult(
778
785
  this.privacyPolicy.authorizeDeleteAsync(
779
786
  this.viewerContext,
780
787
  queryContext,
781
- { previousValue: null, cascadingDeleteCause },
788
+ { previousValue: null, cascadingDeleteCause: this.cascadingDeleteCause },
782
789
  this.entity,
783
790
  this.metricsAdapter,
784
791
  ),
@@ -791,20 +798,25 @@ export class AuthorizationResultBasedDeleteMutator<
791
798
  this.entity,
792
799
  queryContext,
793
800
  processedEntityIdentifiersFromTransitiveDeletions,
794
- cascadingDeleteCause,
795
801
  );
796
802
 
797
803
  await this.executeMutationTriggersAsync(
798
804
  this.mutationTriggers.beforeAll,
799
805
  queryContext,
800
806
  this.entity,
801
- { type: EntityMutationType.DELETE, cascadingDeleteCause },
807
+ {
808
+ type: EntityMutationType.DELETE,
809
+ cascadingDeleteCause: this.cascadingDeleteCause,
810
+ },
802
811
  );
803
812
  await this.executeMutationTriggersAsync(
804
813
  this.mutationTriggers.beforeDelete,
805
814
  queryContext,
806
815
  this.entity,
807
- { type: EntityMutationType.DELETE, cascadingDeleteCause },
816
+ {
817
+ type: EntityMutationType.DELETE,
818
+ cascadingDeleteCause: this.cascadingDeleteCause,
819
+ },
808
820
  );
809
821
 
810
822
  if (!skipDatabaseDeletion) {
@@ -817,7 +829,7 @@ export class AuthorizationResultBasedDeleteMutator<
817
829
 
818
830
  const entityLoader = this.entityLoaderFactory.forLoad(this.viewerContext, queryContext, {
819
831
  previousValue: null,
820
- cascadingDeleteCause,
832
+ cascadingDeleteCause: this.cascadingDeleteCause,
821
833
  });
822
834
 
823
835
  // Invalidate all caches for the entity so that any previously-cached loads
@@ -838,13 +850,19 @@ export class AuthorizationResultBasedDeleteMutator<
838
850
  this.mutationTriggers.afterDelete,
839
851
  queryContext,
840
852
  this.entity,
841
- { type: EntityMutationType.DELETE, cascadingDeleteCause },
853
+ {
854
+ type: EntityMutationType.DELETE,
855
+ cascadingDeleteCause: this.cascadingDeleteCause,
856
+ },
842
857
  );
843
858
  await this.executeMutationTriggersAsync(
844
859
  this.mutationTriggers.afterAll,
845
860
  queryContext,
846
861
  this.entity,
847
- { type: EntityMutationType.DELETE, cascadingDeleteCause },
862
+ {
863
+ type: EntityMutationType.DELETE,
864
+ cascadingDeleteCause: this.cascadingDeleteCause,
865
+ },
848
866
  );
849
867
 
850
868
  queryContext.appendPostCommitCallback(
@@ -852,7 +870,10 @@ export class AuthorizationResultBasedDeleteMutator<
852
870
  this,
853
871
  this.mutationTriggers.afterCommit,
854
872
  this.entity,
855
- { type: EntityMutationType.DELETE, cascadingDeleteCause },
873
+ {
874
+ type: EntityMutationType.DELETE,
875
+ cascadingDeleteCause: this.cascadingDeleteCause,
876
+ },
856
877
  ),
857
878
  );
858
879
 
@@ -877,7 +898,6 @@ export class AuthorizationResultBasedDeleteMutator<
877
898
  entity: TEntity,
878
899
  queryContext: EntityTransactionalQueryContext,
879
900
  processedEntityIdentifiers: Set<string>,
880
- cascadingDeleteCause: EntityCascadingDeletionInfo | null,
881
901
  ): Promise<void> {
882
902
  // prevent infinite reference cycles by keeping track of entities already processed
883
903
  if (processedEntityIdentifiers.has(entity.getUniqueIdentifier())) {
@@ -900,7 +920,7 @@ export class AuthorizationResultBasedDeleteMutator<
900
920
 
901
921
  const newCascadingDeleteCause = {
902
922
  entity,
903
- cascadingDeleteCause,
923
+ cascadingDeleteCause: this.cascadingDeleteCause,
904
924
  };
905
925
 
906
926
  await Promise.all(
@@ -950,11 +970,10 @@ export class AuthorizationResultBasedDeleteMutator<
950
970
  inboundReferenceEntities.map((inboundReferenceEntity) =>
951
971
  enforceAsyncResult(
952
972
  mutatorFactory
953
- .forDelete(inboundReferenceEntity, queryContext)
973
+ .forDelete(inboundReferenceEntity, queryContext, newCascadingDeleteCause)
954
974
  .deleteInTransactionAsync(
955
975
  processedEntityIdentifiers,
956
976
  /* skipDatabaseDeletion */ true, // deletion is handled by DB
957
- newCascadingDeleteCause,
958
977
  ),
959
978
  ),
960
979
  ),
@@ -966,11 +985,9 @@ export class AuthorizationResultBasedDeleteMutator<
966
985
  inboundReferenceEntities.map((inboundReferenceEntity) =>
967
986
  enforceAsyncResult(
968
987
  mutatorFactory
969
- .forUpdate(inboundReferenceEntity, queryContext)
988
+ .forUpdate(inboundReferenceEntity, queryContext, newCascadingDeleteCause)
970
989
  .setField(fieldName, null)
971
- [
972
- 'updateInTransactionAsync'
973
- ](/* skipDatabaseUpdate */ true, newCascadingDeleteCause),
990
+ ['updateInTransactionAsync'](/* skipDatabaseUpdate */ true),
974
991
  ),
975
992
  ),
976
993
  );
@@ -981,11 +998,9 @@ export class AuthorizationResultBasedDeleteMutator<
981
998
  inboundReferenceEntities.map((inboundReferenceEntity) =>
982
999
  enforceAsyncResult(
983
1000
  mutatorFactory
984
- .forUpdate(inboundReferenceEntity, queryContext)
1001
+ .forUpdate(inboundReferenceEntity, queryContext, newCascadingDeleteCause)
985
1002
  .setField(fieldName, null)
986
- [
987
- 'updateInTransactionAsync'
988
- ](/* skipDatabaseUpdate */ false, newCascadingDeleteCause),
1003
+ ['updateInTransactionAsync'](/* skipDatabaseUpdate */ false),
989
1004
  ),
990
1005
  ),
991
1006
  );
@@ -996,11 +1011,10 @@ export class AuthorizationResultBasedDeleteMutator<
996
1011
  inboundReferenceEntities.map((inboundReferenceEntity) =>
997
1012
  enforceAsyncResult(
998
1013
  mutatorFactory
999
- .forDelete(inboundReferenceEntity, queryContext)
1014
+ .forDelete(inboundReferenceEntity, queryContext, newCascadingDeleteCause)
1000
1015
  .deleteInTransactionAsync(
1001
1016
  processedEntityIdentifiers,
1002
1017
  /* skipDatabaseDeletion */ false,
1003
- newCascadingDeleteCause,
1004
1018
  ),
1005
1019
  ),
1006
1020
  ),
@@ -68,6 +68,6 @@ export class EntityDeleter<
68
68
  .getViewerContext()
69
69
  .getViewerScopedEntityCompanionForClass(this.entityClass)
70
70
  .getMutatorFactory()
71
- .forDelete(this.existingEntity, this.queryContext);
71
+ .forDelete(this.existingEntity, this.queryContext, /* cascadingDeleteCause */ null);
72
72
  }
73
73
  }
@@ -121,6 +121,7 @@ export class EnumField<TRequireExplicitCache extends boolean> extends EntityFiel
121
121
 
122
122
  /**
123
123
  * EntityFieldDefinition for a enum column with a strict typescript enum type.
124
+ * The strict version checks that the value of the field adheres to a particular typescript enum
124
125
  */
125
126
  export class StrictEnumField<
126
127
  T extends object,
@@ -140,3 +141,15 @@ export class StrictEnumField<
140
141
  return super.validateInputValueInternal(value) && Object.values(this.enum).includes(value);
141
142
  }
142
143
  }
144
+
145
+ /**
146
+ * EntityFieldDefinition for a column with a JS Buffer type.
147
+ */
148
+ export class BufferField<TRequireExplicitCache extends boolean> extends EntityFieldDefinition<
149
+ Buffer,
150
+ TRequireExplicitCache
151
+ > {
152
+ protected validateInputValueInternal(value: Buffer): boolean {
153
+ return Buffer.isBuffer(value);
154
+ }
155
+ }
@@ -8,6 +8,7 @@ import { EntityCompanionProvider } from './EntityCompanionProvider';
8
8
  import { EntityConfiguration } from './EntityConfiguration';
9
9
  import { EntityDatabaseAdapter } from './EntityDatabaseAdapter';
10
10
  import { EntityLoaderFactory } from './EntityLoaderFactory';
11
+ import { EntityCascadingDeletionInfo } from './EntityMutationInfo';
11
12
  import { EntityMutationTriggerConfiguration } from './EntityMutationTriggerConfiguration';
12
13
  import { EntityMutationValidator } from './EntityMutationValidator';
13
14
  import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
@@ -111,6 +112,7 @@ export class EntityMutatorFactory<
111
112
  forUpdate(
112
113
  existingEntity: TEntity,
113
114
  queryContext: EntityQueryContext,
115
+ cascadingDeleteCause: EntityCascadingDeletionInfo | null,
114
116
  ): AuthorizationResultBasedUpdateMutator<
115
117
  TFields,
116
118
  TIDField,
@@ -132,6 +134,7 @@ export class EntityMutatorFactory<
132
134
  this.databaseAdapter,
133
135
  this.metricsAdapter,
134
136
  existingEntity,
137
+ cascadingDeleteCause,
135
138
  );
136
139
  }
137
140
 
@@ -143,6 +146,7 @@ export class EntityMutatorFactory<
143
146
  forDelete(
144
147
  existingEntity: TEntity,
145
148
  queryContext: EntityQueryContext,
149
+ cascadingDeleteCause: EntityCascadingDeletionInfo | null,
146
150
  ): AuthorizationResultBasedDeleteMutator<
147
151
  TFields,
148
152
  TIDField,
@@ -164,6 +168,7 @@ export class EntityMutatorFactory<
164
168
  this.databaseAdapter,
165
169
  this.metricsAdapter,
166
170
  existingEntity,
171
+ cascadingDeleteCause,
167
172
  );
168
173
  }
169
174
  }
@@ -68,6 +68,6 @@ export class EntityUpdater<
68
68
  .getViewerContext()
69
69
  .getViewerScopedEntityCompanionForClass(this.entityClass)
70
70
  .getMutatorFactory()
71
- .forUpdate(this.existingEntity, this.queryContext);
71
+ .forUpdate(this.existingEntity, this.queryContext, /* cascadingDeleteCause */ null);
72
72
  }
73
73
  }
@@ -3,6 +3,7 @@ import {
3
3
  AuthorizationResultBasedDeleteMutator,
4
4
  AuthorizationResultBasedUpdateMutator,
5
5
  } from './AuthorizationResultBasedEntityMutator';
6
+ import { EntityCascadingDeletionInfo } from './EntityMutationInfo';
6
7
  import { EntityMutatorFactory } from './EntityMutatorFactory';
7
8
  import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
8
9
  import { EntityQueryContext } from './EntityQueryContext';
@@ -54,6 +55,7 @@ export class ViewerScopedEntityMutatorFactory<
54
55
  forUpdate(
55
56
  existingEntity: TEntity,
56
57
  queryContext: EntityQueryContext,
58
+ cascadingDeleteCause: EntityCascadingDeletionInfo | null,
57
59
  ): AuthorizationResultBasedUpdateMutator<
58
60
  TFields,
59
61
  TIDField,
@@ -62,12 +64,13 @@ export class ViewerScopedEntityMutatorFactory<
62
64
  TPrivacyPolicy,
63
65
  TSelectedFields
64
66
  > {
65
- return this.entityMutatorFactory.forUpdate(existingEntity, queryContext);
67
+ return this.entityMutatorFactory.forUpdate(existingEntity, queryContext, cascadingDeleteCause);
66
68
  }
67
69
 
68
70
  forDelete(
69
71
  existingEntity: TEntity,
70
72
  queryContext: EntityQueryContext,
73
+ cascadingDeleteCause: EntityCascadingDeletionInfo | null,
71
74
  ): AuthorizationResultBasedDeleteMutator<
72
75
  TFields,
73
76
  TIDField,
@@ -76,6 +79,6 @@ export class ViewerScopedEntityMutatorFactory<
76
79
  TPrivacyPolicy,
77
80
  TSelectedFields
78
81
  > {
79
- return this.entityMutatorFactory.forDelete(existingEntity, queryContext);
82
+ return this.entityMutatorFactory.forDelete(existingEntity, queryContext, cascadingDeleteCause);
80
83
  }
81
84
  }
@@ -4,6 +4,7 @@ import { v1 as uuidv1, v3 as uuidv3, v4 as uuidv4, v5 as uuidv5 } from 'uuid';
4
4
  import { EntityFieldDefinition } from '../EntityFieldDefinition';
5
5
  import {
6
6
  BooleanField,
7
+ BufferField,
7
8
  DateField,
8
9
  EnumField,
9
10
  FloatField,
@@ -88,3 +89,9 @@ describeFieldTestCase(
88
89
  [TestEnum.HELLO, TestEnum.WHO, 'world'],
89
90
  ['what', 1, true],
90
91
  );
92
+
93
+ describeFieldTestCase(
94
+ new BufferField({ columnName: 'wat' }),
95
+ [Buffer.from('hello')],
96
+ ['hello', 1, true],
97
+ );