@expo/entity 0.41.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.
- package/build/AuthorizationResultBasedEntityAssociationLoader.d.ts +16 -16
- package/build/AuthorizationResultBasedEntityAssociationLoader.js.map +1 -1
- package/build/AuthorizationResultBasedEntityLoader.d.ts +39 -67
- package/build/AuthorizationResultBasedEntityLoader.js +85 -62
- package/build/AuthorizationResultBasedEntityLoader.js.map +1 -1
- package/build/AuthorizationResultBasedEntityMutator.d.ts +16 -16
- package/build/AuthorizationResultBasedEntityMutator.js.map +1 -1
- package/build/ComposedEntityCacheAdapter.d.ts +7 -6
- package/build/ComposedEntityCacheAdapter.js +28 -28
- package/build/ComposedEntityCacheAdapter.js.map +1 -1
- package/build/ComposedSecondaryEntityCache.d.ts +1 -1
- package/build/ComposedSecondaryEntityCache.js.map +1 -1
- package/build/EnforcingEntityAssociationLoader.d.ts +15 -15
- package/build/EnforcingEntityAssociationLoader.js.map +1 -1
- package/build/EnforcingEntityCreator.d.ts +2 -2
- package/build/EnforcingEntityDeleter.d.ts +2 -2
- package/build/EnforcingEntityLoader.d.ts +104 -18
- package/build/EnforcingEntityLoader.js +113 -12
- package/build/EnforcingEntityLoader.js.map +1 -1
- package/build/EnforcingEntityUpdater.d.ts +2 -2
- package/build/Entity.d.ts +10 -10
- package/build/Entity.js.map +1 -1
- package/build/EntityAssociationLoader.d.ts +3 -3
- package/build/EntityCompanion.d.ts +5 -5
- package/build/EntityCompanion.js.map +1 -1
- package/build/EntityCompanionProvider.d.ts +6 -6
- package/build/EntityCompanionProvider.js.map +1 -1
- package/build/EntityConfiguration.d.ts +46 -5
- package/build/EntityConfiguration.js +39 -1
- package/build/EntityConfiguration.js.map +1 -1
- package/build/EntityCreator.d.ts +4 -4
- package/build/EntityDatabaseAdapter.d.ts +15 -14
- package/build/EntityDatabaseAdapter.js +20 -12
- package/build/EntityDatabaseAdapter.js.map +1 -1
- package/build/EntityDeleter.d.ts +4 -4
- package/build/EntityFieldDefinition.d.ts +20 -10
- package/build/EntityFieldDefinition.js +3 -1
- package/build/EntityFieldDefinition.js.map +1 -1
- package/build/EntityFields.d.ts +14 -12
- package/build/EntityFields.js.map +1 -1
- package/build/EntityLoader.d.ts +5 -5
- package/build/EntityLoaderFactory.d.ts +3 -3
- package/build/EntityLoaderFactory.js.map +1 -1
- package/build/EntityLoaderUtils.d.ts +2 -2
- package/build/EntityLoaderUtils.js +27 -1
- package/build/EntityLoaderUtils.js.map +1 -1
- package/build/EntityMutationInfo.d.ts +2 -2
- package/build/EntityMutationTriggerConfiguration.d.ts +14 -14
- package/build/EntityMutationTriggerConfiguration.js.map +1 -1
- package/build/EntityMutationValidator.d.ts +2 -2
- package/build/EntityMutatorFactory.d.ts +5 -5
- package/build/EntityMutatorFactory.js.map +1 -1
- package/build/EntityPrivacyPolicy.d.ts +14 -14
- package/build/EntityPrivacyPolicy.js.map +1 -1
- package/build/EntitySecondaryCacheLoader.d.ts +4 -4
- package/build/EntityUpdater.d.ts +4 -4
- package/build/GenericEntityCacheAdapter.d.ts +7 -6
- package/build/GenericEntityCacheAdapter.js +13 -14
- package/build/GenericEntityCacheAdapter.js.map +1 -1
- package/build/GenericSecondaryEntityCache.d.ts +3 -3
- package/build/GenericSecondaryEntityCache.js.map +1 -1
- package/build/IEntityCacheAdapter.d.ts +17 -16
- package/build/IEntityCacheAdapterProvider.d.ts +1 -1
- package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
- package/build/IEntityGenericCacher.d.ts +15 -5
- package/build/ReadonlyEntity.d.ts +8 -8
- package/build/ReadonlyEntity.js.map +1 -1
- package/build/ViewerContext.d.ts +1 -1
- package/build/ViewerScopedEntityCompanion.d.ts +5 -5
- package/build/ViewerScopedEntityCompanionProvider.d.ts +1 -1
- package/build/ViewerScopedEntityLoaderFactory.d.ts +3 -3
- package/build/ViewerScopedEntityMutatorFactory.d.ts +5 -5
- package/build/entityUtils.d.ts +1 -1
- package/build/entityUtils.js.map +1 -1
- package/build/errors/EntityInvalidFieldValueError.d.ts +2 -2
- package/build/errors/EntityNotAuthorizedError.d.ts +1 -1
- package/build/errors/EntityNotFoundError.d.ts +2 -2
- package/build/index.d.ts +7 -7
- package/build/index.js +8 -13
- package/build/index.js.map +1 -1
- package/build/internal/CompositeFieldHolder.d.ts +48 -0
- package/build/internal/CompositeFieldHolder.js +116 -0
- package/build/internal/CompositeFieldHolder.js.map +1 -0
- package/build/internal/CompositeFieldValueMap.d.ts +15 -0
- package/build/internal/CompositeFieldValueMap.js +51 -0
- package/build/internal/CompositeFieldValueMap.js.map +1 -0
- package/build/internal/EntityDataManager.d.ts +16 -16
- package/build/internal/EntityDataManager.js +42 -45
- package/build/internal/EntityDataManager.js.map +1 -1
- package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
- package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
- package/build/internal/EntityLoadInterfaces.d.ts +104 -0
- package/build/internal/EntityLoadInterfaces.js +25 -0
- package/build/internal/EntityLoadInterfaces.js.map +1 -0
- package/build/internal/EntityTableDataCoordinator.d.ts +6 -6
- package/build/internal/EntityTableDataCoordinator.js.map +1 -1
- package/build/internal/ReadThroughEntityCache.d.ts +17 -16
- package/build/internal/ReadThroughEntityCache.js +36 -36
- package/build/internal/ReadThroughEntityCache.js.map +1 -1
- package/build/internal/SingleFieldHolder.d.ts +34 -0
- package/build/internal/SingleFieldHolder.js +90 -0
- package/build/internal/SingleFieldHolder.js.map +1 -0
- package/build/metrics/EntityMetricsUtils.d.ts +2 -1
- package/build/metrics/EntityMetricsUtils.js.map +1 -1
- package/build/metrics/IEntityMetricsAdapter.d.ts +5 -0
- package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +2 -2
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +2 -2
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +2 -2
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
- package/build/rules/PrivacyPolicyRule.d.ts +2 -2
- package/build/tsconfig.build.tsbuildinfo +1 -0
- package/build/utils/EntityPrivacyUtils.d.ts +4 -4
- package/build/utils/EntityPrivacyUtils.js.map +1 -1
- package/build/utils/collections/SerializableKeyMap.d.ts +27 -0
- package/build/utils/collections/SerializableKeyMap.js +60 -0
- package/build/utils/collections/SerializableKeyMap.js.map +1 -0
- package/build/utils/collections/maps.js +1 -2
- package/build/utils/collections/maps.js.map +1 -1
- package/build/utils/collections/sets.d.ts +1 -0
- package/build/utils/collections/sets.js +7 -0
- package/build/utils/collections/sets.js.map +1 -0
- package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +1 -1
- package/package.json +8 -5
- package/src/AuthorizationResultBasedEntityAssociationLoader.ts +56 -49
- package/src/AuthorizationResultBasedEntityLoader.ts +194 -81
- package/src/AuthorizationResultBasedEntityMutator.ts +71 -45
- package/src/ComposedEntityCacheAdapter.ts +55 -46
- package/src/ComposedSecondaryEntityCache.ts +5 -2
- package/src/EnforcingEntityAssociationLoader.ts +52 -44
- package/src/EnforcingEntityCreator.ts +5 -5
- package/src/EnforcingEntityDeleter.ts +5 -5
- package/src/EnforcingEntityLoader.ts +158 -21
- package/src/EnforcingEntityUpdater.ts +5 -5
- package/src/Entity.ts +39 -39
- package/src/EntityAssociationLoader.ts +6 -6
- package/src/EntityCompanion.ts +11 -11
- package/src/EntityCompanionProvider.ts +21 -18
- package/src/EntityConfiguration.ts +123 -9
- package/src/EntityCreator.ts +7 -7
- package/src/EntityDatabaseAdapter.ts +51 -28
- package/src/EntityDeleter.ts +7 -7
- package/src/EntityFieldDefinition.ts +32 -12
- package/src/EntityFields.ts +49 -12
- package/src/EntityLoader.ts +8 -8
- package/src/EntityLoaderFactory.ts +8 -8
- package/src/EntityLoaderUtils.ts +39 -10
- package/src/EntityMutationInfo.ts +6 -6
- package/src/EntityMutationTriggerConfiguration.ts +68 -20
- package/src/EntityMutationValidator.ts +4 -4
- package/src/EntityMutatorFactory.ts +13 -13
- package/src/EntityPrivacyPolicy.ts +50 -26
- package/src/EntitySecondaryCacheLoader.ts +6 -6
- package/src/EntityUpdater.ts +7 -7
- package/src/GenericEntityCacheAdapter.ts +39 -28
- package/src/GenericSecondaryEntityCache.ts +6 -3
- package/src/IEntityCacheAdapter.ts +45 -25
- package/src/IEntityCacheAdapterProvider.ts +3 -3
- package/src/IEntityDatabaseAdapterProvider.ts +3 -3
- package/src/IEntityGenericCacher.ts +33 -5
- package/src/ReadonlyEntity.ts +24 -24
- package/src/ViewerContext.ts +5 -5
- package/src/ViewerScopedEntityCompanion.ts +7 -7
- package/src/ViewerScopedEntityCompanionProvider.ts +6 -6
- package/src/ViewerScopedEntityLoaderFactory.ts +7 -7
- package/src/ViewerScopedEntityMutatorFactory.ts +8 -8
- package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +4 -4
- package/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.ts +14 -13
- package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +367 -69
- package/src/__tests__/ComposedCacheAdapter-test.ts +235 -117
- package/src/__tests__/EnforcingEntityLoader-test.ts +135 -1
- package/src/__tests__/Entity-test.ts +2 -2
- package/src/__tests__/EntityAssociationLoader-test.ts +2 -2
- package/src/__tests__/EntityCommonUseCases-test.ts +11 -11
- package/src/__tests__/EntityCompanion-test.ts +4 -4
- package/src/__tests__/EntityCompanionProvider-test.ts +9 -8
- package/src/__tests__/EntityConfiguration-test.ts +85 -6
- package/src/__tests__/EntityDatabaseAdapter-test.ts +113 -17
- package/src/__tests__/EntityEdges-test.ts +97 -72
- package/src/__tests__/EntityFields-test.ts +2 -2
- package/src/__tests__/EntityLoader-test.ts +2 -2
- package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +11 -11
- package/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.ts +73 -0
- package/src/__tests__/EntityMutator-test.ts +74 -46
- package/src/__tests__/EntityPrivacyPolicy-test.ts +51 -74
- package/src/__tests__/EntityQueryContext-test.ts +1 -1
- package/src/__tests__/EntitySecondaryCacheLoader-test.ts +3 -3
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +64 -39
- package/src/__tests__/GenericEntityCacheAdapter-test.ts +83 -28
- package/src/__tests__/ReadonlyEntity-test.ts +3 -3
- package/src/__tests__/ViewerContext-test.ts +1 -1
- package/src/__tests__/ViewerScopedEntityCompanion-test.ts +5 -2
- package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +1 -1
- package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +12 -3
- package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +12 -12
- package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +12 -12
- package/src/entityUtils.ts +4 -1
- package/src/errors/EntityInvalidFieldValueError.ts +5 -5
- package/src/errors/EntityNotAuthorizedError.ts +3 -3
- package/src/errors/EntityNotFoundError.ts +5 -5
- package/src/index.ts +7 -7
- package/src/internal/CompositeFieldHolder.ts +218 -0
- package/src/internal/CompositeFieldValueMap.ts +78 -0
- package/src/internal/EntityDataManager.ts +107 -96
- package/src/internal/EntityFieldTransformationUtils.ts +33 -14
- package/src/internal/EntityLoadInterfaces.ts +143 -0
- package/src/internal/EntityTableDataCoordinator.ts +8 -5
- package/src/internal/ReadThroughEntityCache.ts +63 -50
- package/src/internal/SingleFieldHolder.ts +131 -0
- package/src/internal/__tests__/CompositeFieldHolder-test.ts +25 -0
- package/src/internal/__tests__/CompositeFieldValueMap-test.ts +43 -0
- package/src/internal/__tests__/EntityDataManager-test.ts +308 -91
- package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +3 -2
- package/src/internal/__tests__/ReadThroughEntityCache-test.ts +315 -107
- package/src/metrics/EntityMetricsUtils.ts +7 -2
- package/src/metrics/IEntityMetricsAdapter.ts +6 -0
- package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +5 -5
- package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +5 -5
- package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +5 -5
- package/src/rules/PrivacyPolicyRule.ts +4 -4
- package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +1 -1
- package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +1 -1
- package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +1 -1
- package/src/utils/EntityPrivacyUtils.ts +72 -30
- package/src/utils/{testing → __testfixtures__}/PrivacyPolicyRuleTestUtils.ts +26 -26
- package/src/{testfixtures → utils/__testfixtures__}/SimpleTestEntity.ts +16 -15
- package/src/utils/__testfixtures__/StubCacheAdapter.ts +164 -0
- package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapter.ts +19 -12
- package/src/utils/{testing → __testfixtures__}/StubDatabaseAdapterProvider.ts +4 -4
- package/src/utils/__testfixtures__/TSMockitoExtensions.ts +69 -0
- package/src/{testfixtures → utils/__testfixtures__}/TestEntity.ts +21 -15
- package/src/{testfixtures → utils/__testfixtures__}/TestEntity2.ts +16 -15
- package/src/{testfixtures → utils/__testfixtures__}/TestEntityWithMutationTriggers.ts +23 -22
- package/src/{testfixtures → utils/__testfixtures__}/TestViewerContext.ts +1 -1
- package/src/utils/{testing → __testfixtures__}/describeFieldTestCase.ts +1 -1
- package/src/utils/__tests__/EntityPrivacyUtils-test.ts +62 -66
- package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +29 -25
- package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +1 -1
- package/src/utils/collections/SerializableKeyMap.ts +84 -0
- package/src/utils/collections/__tests__/SerializableKeyMap-test.ts +119 -0
- package/src/utils/collections/__tests__/sets-test.ts +17 -0
- package/src/utils/collections/maps.ts +7 -8
- package/src/utils/collections/sets.ts +3 -0
- package/src/utils/mergeEntityMutationTriggerConfigurations.ts +5 -5
- package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.d.ts +0 -1
- package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js +0 -242
- package/build/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.js.map +0 -1
- package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.d.ts +0 -26
- package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js +0 -110
- package/build/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.js.map +0 -1
- package/build/__tests__/AuthorizationResultBasedEntityLoader-test.d.ts +0 -1
- package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js +0 -401
- package/build/__tests__/AuthorizationResultBasedEntityLoader-test.js.map +0 -1
- package/build/__tests__/ComposedCacheAdapter-test.d.ts +0 -1
- package/build/__tests__/ComposedCacheAdapter-test.js +0 -229
- package/build/__tests__/ComposedCacheAdapter-test.js.map +0 -1
- package/build/__tests__/ComposedSecondaryEntityCache-test.d.ts +0 -1
- package/build/__tests__/ComposedSecondaryEntityCache-test.js +0 -66
- package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +0 -1
- package/build/__tests__/EnforcingEntityAssociationLoader-test.d.ts +0 -1
- package/build/__tests__/EnforcingEntityAssociationLoader-test.js +0 -115
- package/build/__tests__/EnforcingEntityAssociationLoader-test.js.map +0 -1
- package/build/__tests__/EnforcingEntityLoader-test.d.ts +0 -1
- package/build/__tests__/EnforcingEntityLoader-test.js +0 -253
- package/build/__tests__/EnforcingEntityLoader-test.js.map +0 -1
- package/build/__tests__/Entity-test.d.ts +0 -1
- package/build/__tests__/Entity-test.js +0 -94
- package/build/__tests__/Entity-test.js.map +0 -1
- package/build/__tests__/EntityAssociationLoader-test.d.ts +0 -1
- package/build/__tests__/EntityAssociationLoader-test.js +0 -30
- package/build/__tests__/EntityAssociationLoader-test.js.map +0 -1
- package/build/__tests__/EntityCommonUseCases-test.d.ts +0 -1
- package/build/__tests__/EntityCommonUseCases-test.js +0 -146
- package/build/__tests__/EntityCommonUseCases-test.js.map +0 -1
- package/build/__tests__/EntityCompanion-test.d.ts +0 -1
- package/build/__tests__/EntityCompanion-test.js +0 -77
- package/build/__tests__/EntityCompanion-test.js.map +0 -1
- package/build/__tests__/EntityCompanionProvider-test.d.ts +0 -1
- package/build/__tests__/EntityCompanionProvider-test.js +0 -54
- package/build/__tests__/EntityCompanionProvider-test.js.map +0 -1
- package/build/__tests__/EntityConfiguration-test.d.ts +0 -1
- package/build/__tests__/EntityConfiguration-test.js +0 -103
- package/build/__tests__/EntityConfiguration-test.js.map +0 -1
- package/build/__tests__/EntityDatabaseAdapter-test.d.ts +0 -1
- package/build/__tests__/EntityDatabaseAdapter-test.js +0 -146
- package/build/__tests__/EntityDatabaseAdapter-test.js.map +0 -1
- package/build/__tests__/EntityEdges-test.d.ts +0 -1
- package/build/__tests__/EntityEdges-test.js +0 -723
- package/build/__tests__/EntityEdges-test.js.map +0 -1
- package/build/__tests__/EntityFields-test.d.ts +0 -1
- package/build/__tests__/EntityFields-test.js +0 -63
- package/build/__tests__/EntityFields-test.js.map +0 -1
- package/build/__tests__/EntityLoader-test.d.ts +0 -1
- package/build/__tests__/EntityLoader-test.js +0 -36
- package/build/__tests__/EntityLoader-test.js.map +0 -1
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.d.ts +0 -1
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +0 -73
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +0 -1
- package/build/__tests__/EntityMutator-test.d.ts +0 -1
- package/build/__tests__/EntityMutator-test.js +0 -741
- package/build/__tests__/EntityMutator-test.js.map +0 -1
- package/build/__tests__/EntityPrivacyPolicy-test.d.ts +0 -1
- package/build/__tests__/EntityPrivacyPolicy-test.js +0 -463
- package/build/__tests__/EntityPrivacyPolicy-test.js.map +0 -1
- package/build/__tests__/EntityQueryContext-test.d.ts +0 -1
- package/build/__tests__/EntityQueryContext-test.js +0 -116
- package/build/__tests__/EntityQueryContext-test.js.map +0 -1
- package/build/__tests__/EntitySecondaryCacheLoader-test.d.ts +0 -1
- package/build/__tests__/EntitySecondaryCacheLoader-test.js +0 -60
- package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +0 -1
- package/build/__tests__/EntitySelfReferentialEdges-test.d.ts +0 -1
- package/build/__tests__/EntitySelfReferentialEdges-test.js +0 -201
- package/build/__tests__/EntitySelfReferentialEdges-test.js.map +0 -1
- package/build/__tests__/GenericEntityCacheAdapter-test.d.ts +0 -1
- package/build/__tests__/GenericEntityCacheAdapter-test.js +0 -80
- package/build/__tests__/GenericEntityCacheAdapter-test.js.map +0 -1
- package/build/__tests__/ReadonlyEntity-test.d.ts +0 -1
- package/build/__tests__/ReadonlyEntity-test.js +0 -211
- package/build/__tests__/ReadonlyEntity-test.js.map +0 -1
- package/build/__tests__/ViewerContext-test.d.ts +0 -1
- package/build/__tests__/ViewerContext-test.js +0 -30
- package/build/__tests__/ViewerContext-test.js.map +0 -1
- package/build/__tests__/ViewerScopedEntityCompanion-test.d.ts +0 -1
- package/build/__tests__/ViewerScopedEntityCompanion-test.js +0 -20
- package/build/__tests__/ViewerScopedEntityCompanion-test.js.map +0 -1
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.d.ts +0 -1
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +0 -20
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +0 -1
- package/build/__tests__/ViewerScopedEntityLoaderFactory-test.d.ts +0 -1
- package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js +0 -23
- package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +0 -1
- package/build/__tests__/ViewerScopedEntityMutatorFactory-test.d.ts +0 -1
- package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +0 -22
- package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +0 -1
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.d.ts +0 -1
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +0 -123
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +0 -1
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.d.ts +0 -1
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +0 -121
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +0 -1
- package/build/__tests__/entityUtils-test.d.ts +0 -1
- package/build/__tests__/entityUtils-test.js +0 -87
- package/build/__tests__/entityUtils-test.js.map +0 -1
- package/build/internal/__tests__/EntityDataManager-test.d.ts +0 -1
- package/build/internal/__tests__/EntityDataManager-test.js +0 -373
- package/build/internal/__tests__/EntityDataManager-test.js.map +0 -1
- package/build/internal/__tests__/EntityFieldTransformationUtils-test.d.ts +0 -1
- package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +0 -136
- package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +0 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.d.ts +0 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.js +0 -206
- package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +0 -1
- package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.d.ts +0 -1
- package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js +0 -21
- package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +0 -1
- package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.d.ts +0 -1
- package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js +0 -21
- package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +0 -1
- package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.d.ts +0 -1
- package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js +0 -21
- package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +0 -1
- package/build/testfixtures/DateIDTestEntity.d.ts +0 -19
- package/build/testfixtures/DateIDTestEntity.js +0 -48
- package/build/testfixtures/DateIDTestEntity.js.map +0 -1
- package/build/testfixtures/SimpleTestEntity.d.ts +0 -20
- package/build/testfixtures/SimpleTestEntity.js +0 -48
- package/build/testfixtures/SimpleTestEntity.js.map +0 -1
- package/build/testfixtures/TestEntity.d.ts +0 -30
- package/build/testfixtures/TestEntity.js +0 -93
- package/build/testfixtures/TestEntity.js.map +0 -1
- package/build/testfixtures/TestEntity2.d.ts +0 -20
- package/build/testfixtures/TestEntity2.js +0 -51
- package/build/testfixtures/TestEntity2.js.map +0 -1
- package/build/testfixtures/TestEntityNumberKey.d.ts +0 -19
- package/build/testfixtures/TestEntityNumberKey.js +0 -48
- package/build/testfixtures/TestEntityNumberKey.js.map +0 -1
- package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +0 -36
- package/build/testfixtures/TestEntityWithMutationTriggers.js +0 -82
- package/build/testfixtures/TestEntityWithMutationTriggers.js.map +0 -1
- package/build/testfixtures/TestViewerContext.d.ts +0 -3
- package/build/testfixtures/TestViewerContext.js +0 -10
- package/build/testfixtures/TestViewerContext.js.map +0 -1
- package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +0 -1
- package/build/utils/__tests__/EntityPrivacyUtils-test.js +0 -486
- package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +0 -1
- package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.d.ts +0 -1
- package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js +0 -178
- package/build/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.js.map +0 -1
- package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +0 -1
- package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +0 -26
- package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +0 -1
- package/build/utils/collections/__tests__/maps-test.d.ts +0 -1
- package/build/utils/collections/__tests__/maps-test.js +0 -120
- package/build/utils/collections/__tests__/maps-test.js.map +0 -1
- package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +0 -28
- package/build/utils/testing/PrivacyPolicyRuleTestUtils.js +0 -52
- package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +0 -1
- package/build/utils/testing/StubCacheAdapter.d.ts +0 -27
- package/build/utils/testing/StubCacheAdapter.js +0 -86
- package/build/utils/testing/StubCacheAdapter.js.map +0 -1
- package/build/utils/testing/StubDatabaseAdapter.d.ts +0 -25
- package/build/utils/testing/StubDatabaseAdapter.js +0 -191
- package/build/utils/testing/StubDatabaseAdapter.js.map +0 -1
- package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +0 -7
- package/build/utils/testing/StubDatabaseAdapterProvider.js +0 -14
- package/build/utils/testing/StubDatabaseAdapterProvider.js.map +0 -1
- package/build/utils/testing/StubQueryContextProvider.d.ts +0 -7
- package/build/utils/testing/StubQueryContextProvider.js +0 -19
- package/build/utils/testing/StubQueryContextProvider.js.map +0 -1
- package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +0 -1
- package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +0 -42
- package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +0 -1
- package/build/utils/testing/__tests__/StubDatabaseAdapter-test.d.ts +0 -1
- package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +0 -402
- package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +0 -1
- package/build/utils/testing/createUnitTestEntityCompanionProvider.d.ts +0 -7
- package/build/utils/testing/createUnitTestEntityCompanionProvider.js +0 -36
- package/build/utils/testing/createUnitTestEntityCompanionProvider.js.map +0 -1
- package/build/utils/testing/describeFieldTestCase.d.ts +0 -2
- package/build/utils/testing/describeFieldTestCase.js +0 -18
- package/build/utils/testing/describeFieldTestCase.js.map +0 -1
- package/src/testfixtures/DateIDTestEntity.ts +0 -59
- package/src/testfixtures/TestEntityNumberKey.ts +0 -59
- package/src/utils/testing/StubCacheAdapter.ts +0 -122
- package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +0 -42
- package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +0 -548
- /package/src/utils/{testing → __testfixtures__}/StubQueryContextProvider.ts +0 -0
- /package/src/utils/{testing → __testfixtures__}/createUnitTestEntityCompanionProvider.ts +0 -0
|
@@ -8,18 +8,18 @@ import ViewerContext from '../ViewerContext';
|
|
|
8
8
|
* A no-op policy rule that always skips.
|
|
9
9
|
*/
|
|
10
10
|
export default class AlwaysSkipPrivacyPolicyRule<
|
|
11
|
-
TFields extends
|
|
12
|
-
|
|
11
|
+
TFields extends Record<string, any>,
|
|
12
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
13
13
|
TViewerContext extends ViewerContext,
|
|
14
|
-
TEntity extends ReadonlyEntity<TFields,
|
|
14
|
+
TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
15
15
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
16
|
-
> extends PrivacyPolicyRule<TFields,
|
|
16
|
+
> extends PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields> {
|
|
17
17
|
async evaluateAsync(
|
|
18
18
|
_viewerContext: TViewerContext,
|
|
19
19
|
_queryContext: EntityQueryContext,
|
|
20
20
|
_evaluationContext: EntityPrivacyPolicyEvaluationContext<
|
|
21
21
|
TFields,
|
|
22
|
-
|
|
22
|
+
TIDField,
|
|
23
23
|
TViewerContext,
|
|
24
24
|
TEntity,
|
|
25
25
|
TSelectedFields
|
|
@@ -37,10 +37,10 @@ export enum RuleEvaluationResult {
|
|
|
37
37
|
* would be named something like `DenyIfViewerHasBeenBlockedPrivacyPolicyRule`.
|
|
38
38
|
*/
|
|
39
39
|
export default abstract class PrivacyPolicyRule<
|
|
40
|
-
TFields extends
|
|
41
|
-
|
|
40
|
+
TFields extends Record<string, any>,
|
|
41
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
42
42
|
TViewerContext extends ViewerContext,
|
|
43
|
-
TEntity extends ReadonlyEntity<TFields,
|
|
43
|
+
TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
44
44
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
45
45
|
> {
|
|
46
46
|
abstract evaluateAsync(
|
|
@@ -48,7 +48,7 @@ export default abstract class PrivacyPolicyRule<
|
|
|
48
48
|
queryContext: EntityQueryContext,
|
|
49
49
|
evaluationContext: EntityPrivacyPolicyEvaluationContext<
|
|
50
50
|
TFields,
|
|
51
|
-
|
|
51
|
+
TIDField,
|
|
52
52
|
TViewerContext,
|
|
53
53
|
TEntity,
|
|
54
54
|
TSelectedFields
|
|
@@ -3,7 +3,7 @@ import { mock, instance, anything } from 'ts-mockito';
|
|
|
3
3
|
import { EntityPrivacyPolicyEvaluationContext } from '../../EntityPrivacyPolicy';
|
|
4
4
|
import { EntityQueryContext } from '../../EntityQueryContext';
|
|
5
5
|
import ViewerContext from '../../ViewerContext';
|
|
6
|
-
import { describePrivacyPolicyRule } from '../../utils/
|
|
6
|
+
import { describePrivacyPolicyRule } from '../../utils/__testfixtures__/PrivacyPolicyRuleTestUtils';
|
|
7
7
|
import AlwaysAllowPrivacyPolicyRule from '../AlwaysAllowPrivacyPolicyRule';
|
|
8
8
|
|
|
9
9
|
describePrivacyPolicyRule(new AlwaysAllowPrivacyPolicyRule(), {
|
|
@@ -3,7 +3,7 @@ import { mock, instance, anything } from 'ts-mockito';
|
|
|
3
3
|
import { EntityPrivacyPolicyEvaluationContext } from '../../EntityPrivacyPolicy';
|
|
4
4
|
import { EntityQueryContext } from '../../EntityQueryContext';
|
|
5
5
|
import ViewerContext from '../../ViewerContext';
|
|
6
|
-
import { describePrivacyPolicyRule } from '../../utils/
|
|
6
|
+
import { describePrivacyPolicyRule } from '../../utils/__testfixtures__/PrivacyPolicyRuleTestUtils';
|
|
7
7
|
import AlwaysDenyPrivacyPolicyRule from '../AlwaysDenyPrivacyPolicyRule';
|
|
8
8
|
|
|
9
9
|
describePrivacyPolicyRule(new AlwaysDenyPrivacyPolicyRule(), {
|
|
@@ -3,7 +3,7 @@ import { mock, instance, anything } from 'ts-mockito';
|
|
|
3
3
|
import { EntityPrivacyPolicyEvaluationContext } from '../../EntityPrivacyPolicy';
|
|
4
4
|
import { EntityQueryContext } from '../../EntityQueryContext';
|
|
5
5
|
import ViewerContext from '../../ViewerContext';
|
|
6
|
-
import { describePrivacyPolicyRule } from '../../utils/
|
|
6
|
+
import { describePrivacyPolicyRule } from '../../utils/__testfixtures__/PrivacyPolicyRuleTestUtils';
|
|
7
7
|
import AlwaysSkipPrivacyPolicyRule from '../AlwaysSkipPrivacyPolicyRule';
|
|
8
8
|
|
|
9
9
|
describePrivacyPolicyRule(new AlwaysSkipPrivacyPolicyRule(), {
|
|
@@ -43,20 +43,27 @@ export type EntityPrivacyEvaluationResult =
|
|
|
43
43
|
* @param queryContext - query context in which to perform the check
|
|
44
44
|
*/
|
|
45
45
|
export async function canViewerUpdateAsync<
|
|
46
|
-
TFields extends
|
|
47
|
-
|
|
46
|
+
TFields extends Record<string, any>,
|
|
47
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
48
48
|
TViewerContext extends ViewerContext,
|
|
49
|
-
TEntity extends Entity<TFields,
|
|
49
|
+
TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
50
50
|
TPrivacyPolicy extends EntityPrivacyPolicy<
|
|
51
51
|
TFields,
|
|
52
|
-
|
|
52
|
+
TIDField,
|
|
53
53
|
TViewerContext,
|
|
54
54
|
TEntity,
|
|
55
55
|
TSelectedFields
|
|
56
56
|
>,
|
|
57
57
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
58
58
|
>(
|
|
59
|
-
entityClass: IEntityClass<
|
|
59
|
+
entityClass: IEntityClass<
|
|
60
|
+
TFields,
|
|
61
|
+
TIDField,
|
|
62
|
+
TViewerContext,
|
|
63
|
+
TEntity,
|
|
64
|
+
TPrivacyPolicy,
|
|
65
|
+
TSelectedFields
|
|
66
|
+
>,
|
|
60
67
|
sourceEntity: TEntity,
|
|
61
68
|
queryContext: EntityQueryContext = sourceEntity
|
|
62
69
|
.getViewerContext()
|
|
@@ -83,20 +90,27 @@ export async function canViewerUpdateAsync<
|
|
|
83
90
|
* @param queryContext - query context in which to perform the check
|
|
84
91
|
*/
|
|
85
92
|
export async function getCanViewerUpdateResultAsync<
|
|
86
|
-
TFields extends
|
|
87
|
-
|
|
93
|
+
TFields extends Record<string, any>,
|
|
94
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
88
95
|
TViewerContext extends ViewerContext,
|
|
89
|
-
TEntity extends Entity<TFields,
|
|
96
|
+
TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
90
97
|
TPrivacyPolicy extends EntityPrivacyPolicy<
|
|
91
98
|
TFields,
|
|
92
|
-
|
|
99
|
+
TIDField,
|
|
93
100
|
TViewerContext,
|
|
94
101
|
TEntity,
|
|
95
102
|
TSelectedFields
|
|
96
103
|
>,
|
|
97
104
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
98
105
|
>(
|
|
99
|
-
entityClass: IEntityClass<
|
|
106
|
+
entityClass: IEntityClass<
|
|
107
|
+
TFields,
|
|
108
|
+
TIDField,
|
|
109
|
+
TViewerContext,
|
|
110
|
+
TEntity,
|
|
111
|
+
TPrivacyPolicy,
|
|
112
|
+
TSelectedFields
|
|
113
|
+
>,
|
|
100
114
|
sourceEntity: TEntity,
|
|
101
115
|
queryContext: EntityQueryContext = sourceEntity
|
|
102
116
|
.getViewerContext()
|
|
@@ -113,20 +127,27 @@ export async function getCanViewerUpdateResultAsync<
|
|
|
113
127
|
}
|
|
114
128
|
|
|
115
129
|
async function canViewerUpdateInternalAsync<
|
|
116
|
-
TFields extends
|
|
117
|
-
|
|
130
|
+
TFields extends Record<string, any>,
|
|
131
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
118
132
|
TViewerContext extends ViewerContext,
|
|
119
|
-
TEntity extends Entity<TFields,
|
|
133
|
+
TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
120
134
|
TPrivacyPolicy extends EntityPrivacyPolicy<
|
|
121
135
|
TFields,
|
|
122
|
-
|
|
136
|
+
TIDField,
|
|
123
137
|
TViewerContext,
|
|
124
138
|
TEntity,
|
|
125
139
|
TSelectedFields
|
|
126
140
|
>,
|
|
127
141
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
128
142
|
>(
|
|
129
|
-
entityClass: IEntityClass<
|
|
143
|
+
entityClass: IEntityClass<
|
|
144
|
+
TFields,
|
|
145
|
+
TIDField,
|
|
146
|
+
TViewerContext,
|
|
147
|
+
TEntity,
|
|
148
|
+
TPrivacyPolicy,
|
|
149
|
+
TSelectedFields
|
|
150
|
+
>,
|
|
130
151
|
sourceEntity: TEntity,
|
|
131
152
|
cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
132
153
|
queryContext: EntityQueryContext,
|
|
@@ -165,20 +186,27 @@ async function canViewerUpdateInternalAsync<
|
|
|
165
186
|
* @param queryContext - query context in which to perform the check
|
|
166
187
|
*/
|
|
167
188
|
export async function canViewerDeleteAsync<
|
|
168
|
-
TFields extends
|
|
169
|
-
|
|
189
|
+
TFields extends Record<string, any>,
|
|
190
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
170
191
|
TViewerContext extends ViewerContext,
|
|
171
|
-
TEntity extends Entity<TFields,
|
|
192
|
+
TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
172
193
|
TPrivacyPolicy extends EntityPrivacyPolicy<
|
|
173
194
|
TFields,
|
|
174
|
-
|
|
195
|
+
TIDField,
|
|
175
196
|
TViewerContext,
|
|
176
197
|
TEntity,
|
|
177
198
|
TSelectedFields
|
|
178
199
|
>,
|
|
179
200
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
180
201
|
>(
|
|
181
|
-
entityClass: IEntityClass<
|
|
202
|
+
entityClass: IEntityClass<
|
|
203
|
+
TFields,
|
|
204
|
+
TIDField,
|
|
205
|
+
TViewerContext,
|
|
206
|
+
TEntity,
|
|
207
|
+
TPrivacyPolicy,
|
|
208
|
+
TSelectedFields
|
|
209
|
+
>,
|
|
182
210
|
sourceEntity: TEntity,
|
|
183
211
|
queryContext: EntityQueryContext = sourceEntity
|
|
184
212
|
.getViewerContext()
|
|
@@ -205,20 +233,27 @@ export async function canViewerDeleteAsync<
|
|
|
205
233
|
* @param queryContext - query context in which to perform the check
|
|
206
234
|
*/
|
|
207
235
|
export async function getCanViewerDeleteResultAsync<
|
|
208
|
-
TFields extends
|
|
209
|
-
|
|
236
|
+
TFields extends Record<string, any>,
|
|
237
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
210
238
|
TViewerContext extends ViewerContext,
|
|
211
|
-
TEntity extends Entity<TFields,
|
|
239
|
+
TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
212
240
|
TPrivacyPolicy extends EntityPrivacyPolicy<
|
|
213
241
|
TFields,
|
|
214
|
-
|
|
242
|
+
TIDField,
|
|
215
243
|
TViewerContext,
|
|
216
244
|
TEntity,
|
|
217
245
|
TSelectedFields
|
|
218
246
|
>,
|
|
219
247
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
220
248
|
>(
|
|
221
|
-
entityClass: IEntityClass<
|
|
249
|
+
entityClass: IEntityClass<
|
|
250
|
+
TFields,
|
|
251
|
+
TIDField,
|
|
252
|
+
TViewerContext,
|
|
253
|
+
TEntity,
|
|
254
|
+
TPrivacyPolicy,
|
|
255
|
+
TSelectedFields
|
|
256
|
+
>,
|
|
222
257
|
sourceEntity: TEntity,
|
|
223
258
|
queryContext: EntityQueryContext = sourceEntity
|
|
224
259
|
.getViewerContext()
|
|
@@ -235,20 +270,27 @@ export async function getCanViewerDeleteResultAsync<
|
|
|
235
270
|
}
|
|
236
271
|
|
|
237
272
|
async function canViewerDeleteInternalAsync<
|
|
238
|
-
TFields extends
|
|
239
|
-
|
|
273
|
+
TFields extends Record<string, any>,
|
|
274
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
240
275
|
TViewerContext extends ViewerContext,
|
|
241
|
-
TEntity extends Entity<TFields,
|
|
276
|
+
TEntity extends Entity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
242
277
|
TPrivacyPolicy extends EntityPrivacyPolicy<
|
|
243
278
|
TFields,
|
|
244
|
-
|
|
279
|
+
TIDField,
|
|
245
280
|
TViewerContext,
|
|
246
281
|
TEntity,
|
|
247
282
|
TSelectedFields
|
|
248
283
|
>,
|
|
249
284
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
250
285
|
>(
|
|
251
|
-
entityClass: IEntityClass<
|
|
286
|
+
entityClass: IEntityClass<
|
|
287
|
+
TFields,
|
|
288
|
+
TIDField,
|
|
289
|
+
TViewerContext,
|
|
290
|
+
TEntity,
|
|
291
|
+
TPrivacyPolicy,
|
|
292
|
+
TSelectedFields
|
|
293
|
+
>,
|
|
252
294
|
sourceEntity: TEntity,
|
|
253
295
|
cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
254
296
|
queryContext: EntityQueryContext,
|
|
@@ -5,17 +5,17 @@ import ViewerContext from '../../ViewerContext';
|
|
|
5
5
|
import PrivacyPolicyRule, { RuleEvaluationResult } from '../../rules/PrivacyPolicyRule';
|
|
6
6
|
|
|
7
7
|
export interface Case<
|
|
8
|
-
TFields extends
|
|
9
|
-
|
|
8
|
+
TFields extends Record<string, any>,
|
|
9
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
10
10
|
TViewerContext extends ViewerContext,
|
|
11
|
-
TEntity extends ReadonlyEntity<TFields,
|
|
11
|
+
TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
12
12
|
TSelectedFields extends keyof TFields,
|
|
13
13
|
> {
|
|
14
14
|
viewerContext: TViewerContext;
|
|
15
15
|
queryContext: EntityQueryContext;
|
|
16
16
|
evaluationContext: EntityPrivacyPolicyEvaluationContext<
|
|
17
17
|
TFields,
|
|
18
|
-
|
|
18
|
+
TIDField,
|
|
19
19
|
TViewerContext,
|
|
20
20
|
TEntity,
|
|
21
21
|
TSelectedFields
|
|
@@ -24,32 +24,32 @@ export interface Case<
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
export type CaseMap<
|
|
27
|
-
TFields extends
|
|
28
|
-
|
|
27
|
+
TFields extends Record<string, any>,
|
|
28
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
29
29
|
TViewerContext extends ViewerContext,
|
|
30
|
-
TEntity extends ReadonlyEntity<TFields,
|
|
30
|
+
TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
31
31
|
TSelectedFields extends keyof TFields,
|
|
32
|
-
> = Map<string, () => Promise<Case<TFields,
|
|
32
|
+
> = Map<string, () => Promise<Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>>>;
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
35
|
* Useful for defining test cases that have async preconditions.
|
|
36
36
|
*/
|
|
37
37
|
export const describePrivacyPolicyRuleWithAsyncTestCase = <
|
|
38
|
-
TFields extends
|
|
39
|
-
|
|
38
|
+
TFields extends Record<string, any>,
|
|
39
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
40
40
|
TViewerContext extends ViewerContext,
|
|
41
|
-
TEntity extends ReadonlyEntity<TFields,
|
|
41
|
+
TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
42
42
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
43
43
|
>(
|
|
44
|
-
privacyPolicyRule: PrivacyPolicyRule<TFields,
|
|
44
|
+
privacyPolicyRule: PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>,
|
|
45
45
|
{
|
|
46
46
|
allowCases = new Map(),
|
|
47
47
|
skipCases = new Map(),
|
|
48
48
|
denyCases = new Map(),
|
|
49
49
|
}: {
|
|
50
|
-
allowCases?: CaseMap<TFields,
|
|
51
|
-
skipCases?: CaseMap<TFields,
|
|
52
|
-
denyCases?: CaseMap<TFields,
|
|
50
|
+
allowCases?: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
|
|
51
|
+
skipCases?: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
|
|
52
|
+
denyCases?: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>;
|
|
53
53
|
},
|
|
54
54
|
): void => {
|
|
55
55
|
describe(privacyPolicyRule.constructor.name, () => {
|
|
@@ -95,30 +95,30 @@ export const describePrivacyPolicyRuleWithAsyncTestCase = <
|
|
|
95
95
|
* For test simple privacy rules that don't have complex async preconditions.
|
|
96
96
|
*/
|
|
97
97
|
export const describePrivacyPolicyRule = <
|
|
98
|
-
TFields extends
|
|
99
|
-
|
|
98
|
+
TFields extends Record<string, any>,
|
|
99
|
+
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
100
100
|
TViewerContext extends ViewerContext,
|
|
101
|
-
TEntity extends ReadonlyEntity<TFields,
|
|
101
|
+
TEntity extends ReadonlyEntity<TFields, TIDField, TViewerContext, TSelectedFields>,
|
|
102
102
|
TSelectedFields extends keyof TFields = keyof TFields,
|
|
103
103
|
>(
|
|
104
|
-
privacyPolicyRule: PrivacyPolicyRule<TFields,
|
|
104
|
+
privacyPolicyRule: PrivacyPolicyRule<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>,
|
|
105
105
|
{
|
|
106
106
|
allowCases = [],
|
|
107
107
|
skipCases = [],
|
|
108
108
|
denyCases = [],
|
|
109
109
|
}: {
|
|
110
|
-
allowCases?: Case<TFields,
|
|
111
|
-
skipCases?: Case<TFields,
|
|
112
|
-
denyCases?: Case<TFields,
|
|
110
|
+
allowCases?: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[];
|
|
111
|
+
skipCases?: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[];
|
|
112
|
+
denyCases?: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[];
|
|
113
113
|
},
|
|
114
114
|
): void => {
|
|
115
115
|
const makeCasesMap = (
|
|
116
|
-
cases: Case<TFields,
|
|
117
|
-
): CaseMap<TFields,
|
|
116
|
+
cases: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>[],
|
|
117
|
+
): CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields> =>
|
|
118
118
|
cases.reduce(
|
|
119
119
|
(
|
|
120
|
-
acc: CaseMap<TFields,
|
|
121
|
-
testCase: Case<TFields,
|
|
120
|
+
acc: CaseMap<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>,
|
|
121
|
+
testCase: Case<TFields, TIDField, TViewerContext, TEntity, TSelectedFields>,
|
|
122
122
|
index,
|
|
123
123
|
) => {
|
|
124
124
|
acc.set(`case ${index}`, async () => testCase);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import Entity from '
|
|
2
|
-
import { EntityCompanionDefinition } from '
|
|
3
|
-
import EntityConfiguration from '
|
|
4
|
-
import { UUIDField } from '
|
|
5
|
-
import EntityPrivacyPolicy from '
|
|
6
|
-
import ViewerContext from '
|
|
7
|
-
import AlwaysAllowPrivacyPolicyRule from '
|
|
1
|
+
import Entity from '../../Entity';
|
|
2
|
+
import { EntityCompanionDefinition } from '../../EntityCompanionProvider';
|
|
3
|
+
import EntityConfiguration from '../../EntityConfiguration';
|
|
4
|
+
import { UUIDField } from '../../EntityFields';
|
|
5
|
+
import EntityPrivacyPolicy from '../../EntityPrivacyPolicy';
|
|
6
|
+
import ViewerContext from '../../ViewerContext';
|
|
7
|
+
import AlwaysAllowPrivacyPolicyRule from '../../rules/AlwaysAllowPrivacyPolicyRule';
|
|
8
8
|
|
|
9
9
|
export type SimpleTestFields = {
|
|
10
10
|
id: string;
|
|
@@ -12,12 +12,13 @@ export type SimpleTestFields = {
|
|
|
12
12
|
|
|
13
13
|
export type SimpleTestFieldSelection = keyof SimpleTestFields;
|
|
14
14
|
|
|
15
|
-
export const simpleTestEntityConfiguration = new EntityConfiguration<SimpleTestFields>({
|
|
15
|
+
export const simpleTestEntityConfiguration = new EntityConfiguration<SimpleTestFields, 'id'>({
|
|
16
16
|
idField: 'id',
|
|
17
17
|
tableName: 'simple_test_entity_should_not_write_to_db',
|
|
18
18
|
schema: {
|
|
19
19
|
id: new UUIDField({
|
|
20
20
|
columnName: 'custom_id',
|
|
21
|
+
cache: true,
|
|
21
22
|
}),
|
|
22
23
|
},
|
|
23
24
|
databaseAdapterFlavor: 'postgres',
|
|
@@ -26,7 +27,7 @@ export const simpleTestEntityConfiguration = new EntityConfiguration<SimpleTestF
|
|
|
26
27
|
|
|
27
28
|
export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
28
29
|
SimpleTestFields,
|
|
29
|
-
|
|
30
|
+
'id',
|
|
30
31
|
ViewerContext,
|
|
31
32
|
SimpleTestEntity,
|
|
32
33
|
SimpleTestFieldSelection
|
|
@@ -34,7 +35,7 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
|
34
35
|
protected override readonly readRules = [
|
|
35
36
|
new AlwaysAllowPrivacyPolicyRule<
|
|
36
37
|
SimpleTestFields,
|
|
37
|
-
|
|
38
|
+
'id',
|
|
38
39
|
ViewerContext,
|
|
39
40
|
SimpleTestEntity,
|
|
40
41
|
SimpleTestFieldSelection
|
|
@@ -43,7 +44,7 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
|
43
44
|
protected override readonly createRules = [
|
|
44
45
|
new AlwaysAllowPrivacyPolicyRule<
|
|
45
46
|
SimpleTestFields,
|
|
46
|
-
|
|
47
|
+
'id',
|
|
47
48
|
ViewerContext,
|
|
48
49
|
SimpleTestEntity,
|
|
49
50
|
SimpleTestFieldSelection
|
|
@@ -52,7 +53,7 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
|
52
53
|
protected override readonly updateRules = [
|
|
53
54
|
new AlwaysAllowPrivacyPolicyRule<
|
|
54
55
|
SimpleTestFields,
|
|
55
|
-
|
|
56
|
+
'id',
|
|
56
57
|
ViewerContext,
|
|
57
58
|
SimpleTestEntity,
|
|
58
59
|
SimpleTestFieldSelection
|
|
@@ -61,7 +62,7 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
|
61
62
|
protected override readonly deleteRules = [
|
|
62
63
|
new AlwaysAllowPrivacyPolicyRule<
|
|
63
64
|
SimpleTestFields,
|
|
64
|
-
|
|
65
|
+
'id',
|
|
65
66
|
ViewerContext,
|
|
66
67
|
SimpleTestEntity,
|
|
67
68
|
SimpleTestFieldSelection
|
|
@@ -71,13 +72,13 @@ export class SimpleTestEntityPrivacyPolicy extends EntityPrivacyPolicy<
|
|
|
71
72
|
|
|
72
73
|
export default class SimpleTestEntity extends Entity<
|
|
73
74
|
SimpleTestFields,
|
|
74
|
-
|
|
75
|
+
'id',
|
|
75
76
|
ViewerContext,
|
|
76
77
|
SimpleTestFieldSelection
|
|
77
78
|
> {
|
|
78
79
|
static defineCompanionDefinition(): EntityCompanionDefinition<
|
|
79
80
|
SimpleTestFields,
|
|
80
|
-
|
|
81
|
+
'id',
|
|
81
82
|
ViewerContext,
|
|
82
83
|
SimpleTestEntity,
|
|
83
84
|
SimpleTestEntityPrivacyPolicy,
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import invariant from 'invariant';
|
|
2
|
+
|
|
3
|
+
import EntityConfiguration from '../../EntityConfiguration';
|
|
4
|
+
import IEntityCacheAdapter from '../../IEntityCacheAdapter';
|
|
5
|
+
import IEntityCacheAdapterProvider from '../../IEntityCacheAdapterProvider';
|
|
6
|
+
import { IEntityLoadKey, IEntityLoadValue } from '../../internal/EntityLoadInterfaces';
|
|
7
|
+
import { CacheStatus, CacheLoadResult } from '../../internal/ReadThroughEntityCache';
|
|
8
|
+
|
|
9
|
+
export class NoCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
|
|
10
|
+
getCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields>(
|
|
11
|
+
_entityConfiguration: EntityConfiguration<TFields, TIDField>,
|
|
12
|
+
): IEntityCacheAdapter<TFields, TIDField> {
|
|
13
|
+
return new NoCacheStubCacheAdapter();
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export class NoCacheStubCacheAdapter<
|
|
18
|
+
TFields extends Record<string, any>,
|
|
19
|
+
TIDField extends keyof TFields,
|
|
20
|
+
> implements IEntityCacheAdapter<TFields, TIDField>
|
|
21
|
+
{
|
|
22
|
+
public async loadManyAsync<
|
|
23
|
+
TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
|
|
24
|
+
TSerializedLoadValue,
|
|
25
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
26
|
+
>(
|
|
27
|
+
key: TLoadKey,
|
|
28
|
+
values: readonly TLoadValue[],
|
|
29
|
+
): Promise<ReadonlyMap<TLoadValue, CacheLoadResult<TFields>>> {
|
|
30
|
+
return values.reduce((acc: Map<TLoadValue, CacheLoadResult<TFields>>, v) => {
|
|
31
|
+
acc.set(v, {
|
|
32
|
+
status: CacheStatus.MISS,
|
|
33
|
+
});
|
|
34
|
+
return acc;
|
|
35
|
+
}, key.vendNewLoadValueMap<CacheLoadResult<TFields>>());
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
public async cacheManyAsync<
|
|
39
|
+
TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
|
|
40
|
+
TSerializedLoadValue,
|
|
41
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
42
|
+
>(_key: TLoadKey, _objectMap: ReadonlyMap<TLoadValue, Readonly<TFields>>): Promise<void> {}
|
|
43
|
+
|
|
44
|
+
public async cacheDBMissesAsync<
|
|
45
|
+
TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
|
|
46
|
+
TSerializedLoadValue,
|
|
47
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
48
|
+
>(_key: TLoadKey, _values: readonly TLoadValue[]): Promise<void> {}
|
|
49
|
+
|
|
50
|
+
public async invalidateManyAsync<
|
|
51
|
+
TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
|
|
52
|
+
TSerializedLoadValue,
|
|
53
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
54
|
+
>(_key: TLoadKey, _values: readonly TLoadValue[]): Promise<void> {}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Sentinel value we store in the in-memory cache to negatively cache a database miss.
|
|
58
|
+
// The sentinel value is distinct from any (positively) cached value.
|
|
59
|
+
export const DOES_NOT_EXIST = Symbol('inMemoryCacheDoesNotExistValue');
|
|
60
|
+
|
|
61
|
+
export class InMemoryFullCacheStubCacheAdapterProvider implements IEntityCacheAdapterProvider {
|
|
62
|
+
private readonly cache: Map<string, Readonly<object> | typeof DOES_NOT_EXIST> = new Map();
|
|
63
|
+
|
|
64
|
+
getCacheAdapter<TFields extends Record<string, any>, TIDField extends keyof TFields>(
|
|
65
|
+
entityConfiguration: EntityConfiguration<TFields, TIDField>,
|
|
66
|
+
): IEntityCacheAdapter<TFields, TIDField> {
|
|
67
|
+
return new InMemoryFullCacheStubCacheAdapter(
|
|
68
|
+
entityConfiguration,
|
|
69
|
+
this.cache as Map<string, Readonly<TFields>>,
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export class InMemoryFullCacheStubCacheAdapter<
|
|
75
|
+
TFields extends Record<string, any>,
|
|
76
|
+
TIDField extends keyof TFields,
|
|
77
|
+
> implements IEntityCacheAdapter<TFields, TIDField>
|
|
78
|
+
{
|
|
79
|
+
constructor(
|
|
80
|
+
private readonly entityConfiguration: EntityConfiguration<TFields, TIDField>,
|
|
81
|
+
private readonly cache: Map<string, Readonly<TFields> | typeof DOES_NOT_EXIST>,
|
|
82
|
+
) {}
|
|
83
|
+
|
|
84
|
+
public async loadManyAsync<
|
|
85
|
+
TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
|
|
86
|
+
TSerializedLoadValue,
|
|
87
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
88
|
+
>(
|
|
89
|
+
key: TLoadKey,
|
|
90
|
+
values: readonly TLoadValue[],
|
|
91
|
+
): Promise<ReadonlyMap<TLoadValue, CacheLoadResult<TFields>>> {
|
|
92
|
+
const results = key.vendNewLoadValueMap<CacheLoadResult<TFields>>();
|
|
93
|
+
values.forEach((value) => {
|
|
94
|
+
const cacheKey = this.createCacheKey(key, value);
|
|
95
|
+
if (!this.cache.has(cacheKey)) {
|
|
96
|
+
results.set(value, {
|
|
97
|
+
status: CacheStatus.MISS,
|
|
98
|
+
});
|
|
99
|
+
} else {
|
|
100
|
+
const objectForFieldValue = this.cache.get(cacheKey);
|
|
101
|
+
invariant(objectForFieldValue !== undefined, 'should have set value for key');
|
|
102
|
+
if (objectForFieldValue === DOES_NOT_EXIST) {
|
|
103
|
+
results.set(value, {
|
|
104
|
+
status: CacheStatus.NEGATIVE,
|
|
105
|
+
});
|
|
106
|
+
} else {
|
|
107
|
+
results.set(value, {
|
|
108
|
+
status: CacheStatus.HIT,
|
|
109
|
+
item: objectForFieldValue,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
return results;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
public async cacheManyAsync<
|
|
118
|
+
TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
|
|
119
|
+
TSerializedLoadValue,
|
|
120
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
121
|
+
>(key: TLoadKey, objectMap: ReadonlyMap<TLoadValue, Readonly<TFields>>): Promise<void> {
|
|
122
|
+
objectMap.forEach((obj, value) => {
|
|
123
|
+
const cacheKey = this.createCacheKey(key, value);
|
|
124
|
+
this.cache.set(cacheKey, obj);
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public async cacheDBMissesAsync<
|
|
129
|
+
TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
|
|
130
|
+
TSerializedLoadValue,
|
|
131
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
132
|
+
>(key: TLoadKey, values: readonly TLoadValue[]): Promise<void> {
|
|
133
|
+
values.forEach((value) => {
|
|
134
|
+
const cacheKey = this.createCacheKey(key, value);
|
|
135
|
+
this.cache.set(cacheKey, DOES_NOT_EXIST);
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
public async invalidateManyAsync<
|
|
140
|
+
TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
|
|
141
|
+
TSerializedLoadValue,
|
|
142
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
143
|
+
>(key: TLoadKey, values: readonly TLoadValue[]): Promise<void> {
|
|
144
|
+
values.forEach((value) => {
|
|
145
|
+
const cacheKey = this.createCacheKey(key, value);
|
|
146
|
+
this.cache.delete(cacheKey);
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
private createCacheKey<
|
|
151
|
+
TLoadKey extends IEntityLoadKey<TFields, TIDField, TSerializedLoadValue, TLoadValue>,
|
|
152
|
+
TSerializedLoadValue,
|
|
153
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
154
|
+
>(key: TLoadKey, value: TLoadValue): string {
|
|
155
|
+
const cacheKeyType = key.getLoadMethodType();
|
|
156
|
+
const parts = key.createCacheKeyPartsForLoadValue(this.entityConfiguration, value);
|
|
157
|
+
return [
|
|
158
|
+
this.entityConfiguration.tableName,
|
|
159
|
+
cacheKeyType,
|
|
160
|
+
`v${this.entityConfiguration.cacheKeyVersion}`,
|
|
161
|
+
...parts,
|
|
162
|
+
].join(':');
|
|
163
|
+
}
|
|
164
|
+
}
|