@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
|
@@ -1,16 +1,25 @@
|
|
|
1
|
-
import { verify,
|
|
1
|
+
import { verify, mock, instance, when, anything } from 'ts-mockito';
|
|
2
2
|
|
|
3
3
|
import EntityConfiguration from '../../EntityConfiguration';
|
|
4
4
|
import { UUIDField } from '../../EntityFields';
|
|
5
5
|
import IEntityCacheAdapter from '../../IEntityCacheAdapter';
|
|
6
|
+
import {
|
|
7
|
+
deepEqualEntityAware,
|
|
8
|
+
isEqualWithEntityAware,
|
|
9
|
+
} from '../../utils/__testfixtures__/TSMockitoExtensions';
|
|
6
10
|
import ReadThroughEntityCache, { CacheStatus } from '../ReadThroughEntityCache';
|
|
11
|
+
import {
|
|
12
|
+
SingleFieldHolder,
|
|
13
|
+
SingleFieldValueHolder,
|
|
14
|
+
SingleFieldValueHolderMap,
|
|
15
|
+
} from '../SingleFieldHolder';
|
|
7
16
|
|
|
8
17
|
type BlahFields = {
|
|
9
18
|
id: string;
|
|
10
19
|
};
|
|
11
20
|
|
|
12
|
-
const makeEntityConfiguration = (cacheIdField: boolean): EntityConfiguration<BlahFields> =>
|
|
13
|
-
new EntityConfiguration<BlahFields>({
|
|
21
|
+
const makeEntityConfiguration = (cacheIdField: boolean): EntityConfiguration<BlahFields, 'id'> =>
|
|
22
|
+
new EntityConfiguration<BlahFields, 'id'>({
|
|
14
23
|
idField: 'id',
|
|
15
24
|
tableName: 'blah',
|
|
16
25
|
schema: {
|
|
@@ -23,12 +32,14 @@ const makeEntityConfiguration = (cacheIdField: boolean): EntityConfiguration<Bla
|
|
|
23
32
|
const createIdFetcher =
|
|
24
33
|
(ids: string[]) =>
|
|
25
34
|
async <N extends keyof BlahFields>(
|
|
26
|
-
fetcherFieldValues: readonly
|
|
27
|
-
): Promise<
|
|
28
|
-
|
|
35
|
+
fetcherFieldValues: readonly SingleFieldValueHolder<BlahFields, N>[],
|
|
36
|
+
): Promise<
|
|
37
|
+
ReadonlyMap<SingleFieldValueHolder<BlahFields, N>, readonly Readonly<BlahFields>[]>
|
|
38
|
+
> => {
|
|
39
|
+
const results = new SingleFieldValueHolderMap<BlahFields, N, readonly Readonly<BlahFields>[]>();
|
|
29
40
|
fetcherFieldValues.forEach((v) => {
|
|
30
|
-
if (ids.includes(v)) {
|
|
31
|
-
results.set(v, [{ id: v }]);
|
|
41
|
+
if (ids.includes(v.fieldValue)) {
|
|
42
|
+
results.set(v, [{ id: v.fieldValue }]);
|
|
32
43
|
} else {
|
|
33
44
|
results.set(v, []);
|
|
34
45
|
}
|
|
@@ -39,12 +50,14 @@ const createIdFetcher =
|
|
|
39
50
|
const createFetcherNonUnique =
|
|
40
51
|
(ids: string[]) =>
|
|
41
52
|
async <N extends keyof BlahFields>(
|
|
42
|
-
fetcherFieldValues: readonly
|
|
43
|
-
): Promise<
|
|
44
|
-
|
|
53
|
+
fetcherFieldValues: readonly SingleFieldValueHolder<BlahFields, N>[],
|
|
54
|
+
): Promise<
|
|
55
|
+
ReadonlyMap<SingleFieldValueHolder<BlahFields, N>, readonly Readonly<BlahFields>[]>
|
|
56
|
+
> => {
|
|
57
|
+
const results = new SingleFieldValueHolderMap<BlahFields, N, readonly Readonly<BlahFields>[]>();
|
|
45
58
|
fetcherFieldValues.forEach((v) => {
|
|
46
|
-
if (ids.includes(v)) {
|
|
47
|
-
results.set(v, [{ id: v }, { id: v + '2' }]);
|
|
59
|
+
if (ids.includes(v.fieldValue)) {
|
|
60
|
+
results.set(v, [{ id: v.fieldValue }, { id: v.fieldValue + '2' }]);
|
|
48
61
|
} else {
|
|
49
62
|
results.set(v, []);
|
|
50
63
|
}
|
|
@@ -55,207 +68,402 @@ const createFetcherNonUnique =
|
|
|
55
68
|
describe(ReadThroughEntityCache, () => {
|
|
56
69
|
describe('readManyThroughAsync', () => {
|
|
57
70
|
it('fetches from DB upon cache miss and caches the result', async () => {
|
|
58
|
-
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
|
|
71
|
+
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
|
|
59
72
|
const cacheAdapter = instance(cacheAdapterMock);
|
|
60
73
|
const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
|
|
61
74
|
const fetcher = createIdFetcher(['wat', 'who']);
|
|
62
75
|
|
|
63
|
-
when(
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
[
|
|
67
|
-
|
|
76
|
+
when(
|
|
77
|
+
cacheAdapterMock.loadManyAsync(
|
|
78
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
79
|
+
deepEqualEntityAware([
|
|
80
|
+
new SingleFieldValueHolder('wat'),
|
|
81
|
+
new SingleFieldValueHolder('who'),
|
|
82
|
+
]),
|
|
83
|
+
),
|
|
84
|
+
).thenResolve(
|
|
85
|
+
new SingleFieldValueHolderMap(
|
|
86
|
+
new Map([
|
|
87
|
+
[new SingleFieldValueHolder('wat'), { status: CacheStatus.MISS }],
|
|
88
|
+
[new SingleFieldValueHolder('who'), { status: CacheStatus.MISS }],
|
|
89
|
+
]),
|
|
90
|
+
),
|
|
68
91
|
);
|
|
69
92
|
|
|
70
|
-
const result = await entityCache.readManyThroughAsync(
|
|
93
|
+
const result = await entityCache.readManyThroughAsync(
|
|
94
|
+
new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
|
|
95
|
+
[
|
|
96
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('wat'),
|
|
97
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('who'),
|
|
98
|
+
],
|
|
99
|
+
fetcher,
|
|
100
|
+
);
|
|
71
101
|
|
|
72
|
-
verify(
|
|
102
|
+
verify(
|
|
103
|
+
cacheAdapterMock.loadManyAsync(
|
|
104
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
105
|
+
deepEqualEntityAware([
|
|
106
|
+
new SingleFieldValueHolder('wat'),
|
|
107
|
+
new SingleFieldValueHolder('who'),
|
|
108
|
+
]),
|
|
109
|
+
),
|
|
110
|
+
).once();
|
|
73
111
|
verify(
|
|
74
112
|
cacheAdapterMock.cacheManyAsync(
|
|
75
|
-
'id',
|
|
76
|
-
|
|
77
|
-
new
|
|
78
|
-
[
|
|
79
|
-
|
|
80
|
-
|
|
113
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
114
|
+
deepEqualEntityAware(
|
|
115
|
+
new SingleFieldValueHolderMap(
|
|
116
|
+
new Map([
|
|
117
|
+
[new SingleFieldValueHolder('wat'), { id: 'wat' }],
|
|
118
|
+
[new SingleFieldValueHolder('who'), { id: 'who' }],
|
|
119
|
+
]),
|
|
120
|
+
),
|
|
81
121
|
),
|
|
82
122
|
),
|
|
83
123
|
).once();
|
|
84
|
-
verify(
|
|
124
|
+
verify(
|
|
125
|
+
cacheAdapterMock.cacheDBMissesAsync(
|
|
126
|
+
deepEqualEntityAware(new SingleFieldHolder<BlahFields, 'id', 'id'>('id')),
|
|
127
|
+
deepEqualEntityAware([] as SingleFieldValueHolder<BlahFields, 'id'>[]),
|
|
128
|
+
),
|
|
129
|
+
).once();
|
|
85
130
|
expect(result).toEqual(
|
|
86
|
-
new
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
131
|
+
new SingleFieldValueHolderMap(
|
|
132
|
+
new Map([
|
|
133
|
+
[new SingleFieldValueHolder('wat'), [{ id: 'wat' }]],
|
|
134
|
+
[new SingleFieldValueHolder('who'), [{ id: 'who' }]],
|
|
135
|
+
]),
|
|
136
|
+
),
|
|
90
137
|
);
|
|
91
138
|
});
|
|
92
139
|
|
|
93
140
|
it('does not fetch from the DB or cache results when all cache fetches are hits', async () => {
|
|
94
|
-
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
|
|
141
|
+
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
|
|
95
142
|
const cacheAdapter = instance(cacheAdapterMock);
|
|
96
143
|
const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
|
|
97
144
|
const fetcher = createIdFetcher(['wat', 'who']);
|
|
98
145
|
|
|
99
|
-
when(
|
|
146
|
+
when(
|
|
147
|
+
cacheAdapterMock.loadManyAsync(
|
|
148
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
149
|
+
deepEqualEntityAware([
|
|
150
|
+
new SingleFieldValueHolder('wat'),
|
|
151
|
+
new SingleFieldValueHolder('who'),
|
|
152
|
+
]),
|
|
153
|
+
),
|
|
154
|
+
).thenResolve(
|
|
100
155
|
new Map([
|
|
101
|
-
['wat', { status: CacheStatus.HIT, item: { id: 'wat' } }],
|
|
102
|
-
['who', { status: CacheStatus.HIT, item: { id: 'who' } }],
|
|
156
|
+
[new SingleFieldValueHolder('wat'), { status: CacheStatus.HIT, item: { id: 'wat' } }],
|
|
157
|
+
[new SingleFieldValueHolder('who'), { status: CacheStatus.HIT, item: { id: 'who' } }],
|
|
103
158
|
]),
|
|
104
159
|
);
|
|
105
160
|
|
|
106
|
-
const result = await entityCache.readManyThroughAsync(
|
|
161
|
+
const result = await entityCache.readManyThroughAsync(
|
|
162
|
+
new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
|
|
163
|
+
[
|
|
164
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('wat'),
|
|
165
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('who'),
|
|
166
|
+
],
|
|
167
|
+
fetcher,
|
|
168
|
+
);
|
|
107
169
|
|
|
108
|
-
verify(
|
|
170
|
+
verify(
|
|
171
|
+
cacheAdapterMock.loadManyAsync(
|
|
172
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
173
|
+
deepEqualEntityAware([
|
|
174
|
+
new SingleFieldValueHolder('wat'),
|
|
175
|
+
new SingleFieldValueHolder('who'),
|
|
176
|
+
]),
|
|
177
|
+
),
|
|
178
|
+
).once();
|
|
109
179
|
verify(
|
|
110
180
|
cacheAdapterMock.cacheManyAsync(
|
|
111
|
-
'id',
|
|
112
|
-
|
|
113
|
-
new
|
|
114
|
-
[
|
|
115
|
-
|
|
116
|
-
|
|
181
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
182
|
+
deepEqualEntityAware(
|
|
183
|
+
new SingleFieldValueHolderMap(
|
|
184
|
+
new Map([
|
|
185
|
+
[new SingleFieldValueHolder('wat'), { id: 'wat' }],
|
|
186
|
+
[new SingleFieldValueHolder('who'), { id: 'who' }],
|
|
187
|
+
]),
|
|
188
|
+
),
|
|
117
189
|
),
|
|
118
190
|
),
|
|
119
191
|
).never();
|
|
120
|
-
verify(
|
|
192
|
+
verify(
|
|
193
|
+
cacheAdapterMock.cacheDBMissesAsync(
|
|
194
|
+
deepEqualEntityAware(new SingleFieldHolder<BlahFields, 'id', 'id'>('id')),
|
|
195
|
+
deepEqualEntityAware([] as SingleFieldValueHolder<BlahFields, 'id'>[]),
|
|
196
|
+
),
|
|
197
|
+
).never();
|
|
121
198
|
expect(result).toEqual(
|
|
122
|
-
new
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
199
|
+
new SingleFieldValueHolderMap(
|
|
200
|
+
new Map([
|
|
201
|
+
[new SingleFieldValueHolder('wat'), [{ id: 'wat' }]],
|
|
202
|
+
[new SingleFieldValueHolder('who'), [{ id: 'who' }]],
|
|
203
|
+
]),
|
|
204
|
+
),
|
|
126
205
|
);
|
|
127
206
|
});
|
|
128
207
|
|
|
129
208
|
it('negatively caches db misses', async () => {
|
|
130
|
-
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
|
|
209
|
+
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
|
|
131
210
|
const cacheAdapter = instance(cacheAdapterMock);
|
|
132
211
|
const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
|
|
133
212
|
|
|
134
213
|
// simulate db miss
|
|
135
214
|
const fetcher = createIdFetcher(['wat', 'who']);
|
|
136
215
|
|
|
137
|
-
when(
|
|
138
|
-
|
|
216
|
+
when(
|
|
217
|
+
cacheAdapterMock.loadManyAsync(
|
|
218
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
219
|
+
deepEqualEntityAware([new SingleFieldValueHolder('why')]),
|
|
220
|
+
),
|
|
221
|
+
).thenResolve(
|
|
222
|
+
new SingleFieldValueHolderMap(
|
|
223
|
+
new Map([[new SingleFieldValueHolder('why'), { status: CacheStatus.MISS }]]),
|
|
224
|
+
),
|
|
139
225
|
);
|
|
140
226
|
|
|
141
|
-
const result = await entityCache.readManyThroughAsync(
|
|
227
|
+
const result = await entityCache.readManyThroughAsync(
|
|
228
|
+
new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
|
|
229
|
+
[new SingleFieldValueHolder<BlahFields, 'id'>('why')],
|
|
230
|
+
fetcher,
|
|
231
|
+
);
|
|
142
232
|
|
|
143
|
-
verify(
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
233
|
+
verify(
|
|
234
|
+
cacheAdapterMock.loadManyAsync(
|
|
235
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
236
|
+
deepEqualEntityAware([new SingleFieldValueHolder('why')]),
|
|
237
|
+
),
|
|
238
|
+
).once();
|
|
239
|
+
verify(
|
|
240
|
+
cacheAdapterMock.cacheManyAsync(
|
|
241
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
242
|
+
deepEqualEntityAware(new SingleFieldValueHolderMap(new Map())),
|
|
243
|
+
),
|
|
244
|
+
).once();
|
|
245
|
+
verify(
|
|
246
|
+
cacheAdapterMock.cacheDBMissesAsync(
|
|
247
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
248
|
+
deepEqualEntityAware([new SingleFieldValueHolder('why')]),
|
|
249
|
+
),
|
|
250
|
+
).once();
|
|
251
|
+
expect(result).toEqual(new SingleFieldValueHolderMap(new Map()));
|
|
147
252
|
});
|
|
148
253
|
|
|
149
254
|
it('does not return or fetch negatively cached results from DB', async () => {
|
|
150
|
-
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
|
|
255
|
+
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
|
|
151
256
|
const cacheAdapter = instance(cacheAdapterMock);
|
|
152
257
|
const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
|
|
153
258
|
const fetcher = createIdFetcher([]);
|
|
154
259
|
|
|
155
|
-
when(
|
|
156
|
-
|
|
260
|
+
when(
|
|
261
|
+
cacheAdapterMock.loadManyAsync(
|
|
262
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
263
|
+
deepEqualEntityAware([new SingleFieldValueHolder('why')]),
|
|
264
|
+
),
|
|
265
|
+
).thenResolve(
|
|
266
|
+
new SingleFieldValueHolderMap(
|
|
267
|
+
new Map([[new SingleFieldValueHolder('why'), { status: CacheStatus.NEGATIVE }]]),
|
|
268
|
+
),
|
|
157
269
|
);
|
|
158
270
|
|
|
159
|
-
const result = await entityCache.readManyThroughAsync(
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
271
|
+
const result = await entityCache.readManyThroughAsync(
|
|
272
|
+
new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
|
|
273
|
+
[new SingleFieldValueHolder<BlahFields, 'id'>('why')],
|
|
274
|
+
fetcher,
|
|
275
|
+
);
|
|
276
|
+
verify(
|
|
277
|
+
cacheAdapterMock.loadManyAsync(
|
|
278
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
279
|
+
deepEqualEntityAware([new SingleFieldValueHolder('why')]),
|
|
280
|
+
),
|
|
281
|
+
).once();
|
|
282
|
+
verify(cacheAdapterMock.cacheManyAsync(new SingleFieldHolder('id'), anything())).never();
|
|
283
|
+
verify(cacheAdapterMock.cacheDBMissesAsync(new SingleFieldHolder('id'), anything())).never();
|
|
284
|
+
expect(result).toEqual(new SingleFieldValueHolderMap(new Map()));
|
|
164
285
|
});
|
|
165
286
|
|
|
166
287
|
it('does a mix and match of hit, miss, and negative', async () => {
|
|
167
|
-
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
|
|
288
|
+
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
|
|
168
289
|
const cacheAdapter = instance(cacheAdapterMock);
|
|
169
290
|
const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
|
|
170
291
|
const fetcher = createIdFetcher(['wat', 'who', 'why']);
|
|
171
292
|
|
|
172
293
|
when(
|
|
173
|
-
cacheAdapterMock.loadManyAsync(
|
|
294
|
+
cacheAdapterMock.loadManyAsync(
|
|
295
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
296
|
+
deepEqualEntityAware([
|
|
297
|
+
new SingleFieldValueHolder('wat'),
|
|
298
|
+
new SingleFieldValueHolder('who'),
|
|
299
|
+
new SingleFieldValueHolder('why'),
|
|
300
|
+
new SingleFieldValueHolder('how'),
|
|
301
|
+
]),
|
|
302
|
+
),
|
|
174
303
|
).thenResolve(
|
|
175
|
-
new
|
|
176
|
-
[
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
304
|
+
new SingleFieldValueHolderMap(
|
|
305
|
+
new Map([
|
|
306
|
+
[new SingleFieldValueHolder('wat'), { status: CacheStatus.MISS }],
|
|
307
|
+
[new SingleFieldValueHolder('who'), { status: CacheStatus.NEGATIVE }],
|
|
308
|
+
[new SingleFieldValueHolder('why'), { status: CacheStatus.HIT, item: { id: 'why' } }],
|
|
309
|
+
[new SingleFieldValueHolder('how'), { status: CacheStatus.MISS }],
|
|
310
|
+
]),
|
|
311
|
+
),
|
|
181
312
|
);
|
|
182
313
|
|
|
183
314
|
const result = await entityCache.readManyThroughAsync(
|
|
184
|
-
'id',
|
|
185
|
-
[
|
|
315
|
+
new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
|
|
316
|
+
[
|
|
317
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('wat'),
|
|
318
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('who'),
|
|
319
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('why'),
|
|
320
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('how'),
|
|
321
|
+
],
|
|
186
322
|
fetcher,
|
|
187
323
|
);
|
|
188
|
-
verify(cacheAdapterMock.loadManyAsync('id', deepEqual(['wat', 'who', 'why', 'how']))).once();
|
|
189
324
|
verify(
|
|
190
|
-
cacheAdapterMock.
|
|
325
|
+
cacheAdapterMock.loadManyAsync(
|
|
326
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
327
|
+
deepEqualEntityAware([
|
|
328
|
+
new SingleFieldValueHolder('wat'),
|
|
329
|
+
new SingleFieldValueHolder('who'),
|
|
330
|
+
new SingleFieldValueHolder('why'),
|
|
331
|
+
new SingleFieldValueHolder('how'),
|
|
332
|
+
]),
|
|
333
|
+
),
|
|
191
334
|
).once();
|
|
192
|
-
verify(
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
335
|
+
verify(
|
|
336
|
+
cacheAdapterMock.cacheManyAsync(
|
|
337
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
338
|
+
deepEqualEntityAware(
|
|
339
|
+
new SingleFieldValueHolderMap(
|
|
340
|
+
new Map([[new SingleFieldValueHolder('wat'), { id: 'wat' }]]),
|
|
341
|
+
),
|
|
342
|
+
),
|
|
343
|
+
),
|
|
344
|
+
).once();
|
|
345
|
+
verify(
|
|
346
|
+
cacheAdapterMock.cacheDBMissesAsync(
|
|
347
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
348
|
+
deepEqualEntityAware([new SingleFieldValueHolder('how')]),
|
|
349
|
+
),
|
|
350
|
+
).once();
|
|
351
|
+
expect(
|
|
352
|
+
isEqualWithEntityAware(
|
|
353
|
+
result,
|
|
354
|
+
new SingleFieldValueHolderMap(
|
|
355
|
+
new Map([
|
|
356
|
+
[new SingleFieldValueHolder('wat'), [{ id: 'wat' }]],
|
|
357
|
+
[new SingleFieldValueHolder('why'), [{ id: 'why' }]],
|
|
358
|
+
]),
|
|
359
|
+
),
|
|
360
|
+
),
|
|
361
|
+
).toBe(true);
|
|
199
362
|
});
|
|
200
363
|
|
|
201
364
|
it('does not call into cache for field that is not cacheable', async () => {
|
|
202
|
-
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
|
|
365
|
+
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
|
|
203
366
|
const cacheAdapter = instance(cacheAdapterMock);
|
|
204
367
|
const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(false), cacheAdapter);
|
|
205
368
|
const fetcher = createIdFetcher(['wat']);
|
|
206
|
-
const result = await entityCache.readManyThroughAsync(
|
|
207
|
-
|
|
208
|
-
|
|
369
|
+
const result = await entityCache.readManyThroughAsync(
|
|
370
|
+
new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
|
|
371
|
+
[new SingleFieldValueHolder<BlahFields, 'id'>('wat')],
|
|
372
|
+
fetcher,
|
|
373
|
+
);
|
|
374
|
+
verify(cacheAdapterMock.loadManyAsync(new SingleFieldHolder('id'), anything())).never();
|
|
375
|
+
expect(result).toEqual(
|
|
376
|
+
new SingleFieldValueHolderMap(
|
|
377
|
+
new Map([[new SingleFieldValueHolder('wat'), [{ id: 'wat' }]]]),
|
|
378
|
+
),
|
|
379
|
+
);
|
|
209
380
|
});
|
|
210
381
|
|
|
211
382
|
it('does not cache when DB returns multiple objects for what is supposed to be unique and returns empty', async () => {
|
|
212
383
|
const consoleSpy = jest.spyOn(console, 'warn');
|
|
213
384
|
|
|
214
|
-
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
|
|
385
|
+
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
|
|
215
386
|
const cacheAdapter = instance(cacheAdapterMock);
|
|
216
387
|
const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
|
|
217
388
|
const fetcher = createFetcherNonUnique(['wat', 'who']);
|
|
218
389
|
|
|
219
|
-
when(
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
[
|
|
223
|
-
|
|
390
|
+
when(
|
|
391
|
+
cacheAdapterMock.loadManyAsync(
|
|
392
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
393
|
+
deepEqualEntityAware([
|
|
394
|
+
new SingleFieldValueHolder('wat'),
|
|
395
|
+
new SingleFieldValueHolder('who'),
|
|
396
|
+
]),
|
|
397
|
+
),
|
|
398
|
+
).thenResolve(
|
|
399
|
+
new SingleFieldValueHolderMap(
|
|
400
|
+
new Map([
|
|
401
|
+
[new SingleFieldValueHolder('wat'), { status: CacheStatus.MISS }],
|
|
402
|
+
[new SingleFieldValueHolder('who'), { status: CacheStatus.MISS }],
|
|
403
|
+
]),
|
|
404
|
+
),
|
|
224
405
|
);
|
|
225
406
|
|
|
226
|
-
const result = await entityCache.readManyThroughAsync(
|
|
407
|
+
const result = await entityCache.readManyThroughAsync(
|
|
408
|
+
new SingleFieldHolder<BlahFields, 'id', 'id'>('id'),
|
|
409
|
+
[
|
|
410
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('wat'),
|
|
411
|
+
new SingleFieldValueHolder<BlahFields, 'id'>('who'),
|
|
412
|
+
],
|
|
413
|
+
fetcher,
|
|
414
|
+
);
|
|
227
415
|
|
|
228
|
-
verify(
|
|
416
|
+
verify(
|
|
417
|
+
cacheAdapterMock.loadManyAsync(
|
|
418
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
419
|
+
deepEqualEntityAware([
|
|
420
|
+
new SingleFieldValueHolder('wat'),
|
|
421
|
+
new SingleFieldValueHolder('who'),
|
|
422
|
+
]),
|
|
423
|
+
),
|
|
424
|
+
).once();
|
|
229
425
|
verify(
|
|
230
426
|
cacheAdapterMock.cacheManyAsync(
|
|
231
|
-
'id',
|
|
232
|
-
|
|
427
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
428
|
+
deepEqualEntityAware(
|
|
233
429
|
new Map([
|
|
234
|
-
['wat', { id: 'wat' }],
|
|
235
|
-
['who', { id: 'who' }],
|
|
430
|
+
[new SingleFieldValueHolder('wat'), { id: 'wat' }],
|
|
431
|
+
[new SingleFieldValueHolder('who'), { id: 'who' }],
|
|
236
432
|
]),
|
|
237
433
|
),
|
|
238
434
|
),
|
|
239
435
|
).never();
|
|
240
|
-
verify(
|
|
241
|
-
|
|
436
|
+
verify(
|
|
437
|
+
cacheAdapterMock.cacheDBMissesAsync(
|
|
438
|
+
deepEqualEntityAware(new SingleFieldHolder<BlahFields, 'id', 'id'>('id')),
|
|
439
|
+
deepEqualEntityAware([] as SingleFieldValueHolder<BlahFields, 'id'>[]),
|
|
440
|
+
),
|
|
441
|
+
).once();
|
|
442
|
+
expect(result).toEqual(new SingleFieldValueHolderMap(new Map()));
|
|
242
443
|
|
|
243
444
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
244
|
-
'unique key id in blah returned multiple rows for wat',
|
|
445
|
+
'unique key SingleField(id) in table blah returned multiple rows for SingleFieldValue(wat)',
|
|
245
446
|
);
|
|
246
447
|
expect(consoleSpy).toHaveBeenCalledWith(
|
|
247
|
-
'unique key id in blah returned multiple rows for who',
|
|
448
|
+
'unique key SingleField(id) in table blah returned multiple rows for SingleFieldValue(who)',
|
|
248
449
|
);
|
|
249
450
|
});
|
|
250
451
|
});
|
|
251
452
|
|
|
252
453
|
describe('invalidateManyAsync', () => {
|
|
253
454
|
it('calls cache adapter invalidate', async () => {
|
|
254
|
-
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields>>();
|
|
455
|
+
const cacheAdapterMock = mock<IEntityCacheAdapter<BlahFields, 'id'>>();
|
|
255
456
|
const cacheAdapter = instance(cacheAdapterMock);
|
|
256
457
|
const entityCache = new ReadThroughEntityCache(makeEntityConfiguration(true), cacheAdapter);
|
|
257
|
-
await entityCache.invalidateManyAsync('id', [
|
|
258
|
-
|
|
458
|
+
await entityCache.invalidateManyAsync(new SingleFieldHolder('id'), [
|
|
459
|
+
new SingleFieldValueHolder('wat'),
|
|
460
|
+
]);
|
|
461
|
+
verify(
|
|
462
|
+
cacheAdapterMock.invalidateManyAsync(
|
|
463
|
+
deepEqualEntityAware(new SingleFieldHolder('id')),
|
|
464
|
+
deepEqualEntityAware([new SingleFieldValueHolder('wat')]),
|
|
465
|
+
),
|
|
466
|
+
).once();
|
|
259
467
|
});
|
|
260
468
|
});
|
|
261
469
|
});
|
|
@@ -2,6 +2,7 @@ import IEntityMetricsAdapter, {
|
|
|
2
2
|
EntityMetricsLoadType,
|
|
3
3
|
EntityMetricsMutationType,
|
|
4
4
|
} from './IEntityMetricsAdapter';
|
|
5
|
+
import { IEntityLoadValue } from '../internal/EntityLoadInterfaces';
|
|
5
6
|
import { reduceMap } from '../utils/collections/maps';
|
|
6
7
|
|
|
7
8
|
export const timeAndLogLoadEventAsync =
|
|
@@ -31,8 +32,12 @@ export const timeAndLogLoadMapEventAsync =
|
|
|
31
32
|
loadType: EntityMetricsLoadType,
|
|
32
33
|
entityClassName: string,
|
|
33
34
|
) =>
|
|
34
|
-
async <
|
|
35
|
-
|
|
35
|
+
async <
|
|
36
|
+
TFields extends Record<string, any>,
|
|
37
|
+
TSerializedLoadValue,
|
|
38
|
+
TLoadValue extends IEntityLoadValue<TSerializedLoadValue>,
|
|
39
|
+
>(
|
|
40
|
+
promise: Promise<ReadonlyMap<TLoadValue, readonly Readonly<TFields>[]>>,
|
|
36
41
|
) => {
|
|
37
42
|
const startTime = Date.now();
|
|
38
43
|
const result = await promise;
|
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
EntityAuthorizationAction,
|
|
3
3
|
EntityPrivacyPolicyEvaluationMode,
|
|
4
4
|
} from '../EntityPrivacyPolicy';
|
|
5
|
+
import { EntityLoadMethodType } from '../internal/EntityLoadInterfaces';
|
|
5
6
|
|
|
6
7
|
export enum EntityMetricsLoadType {
|
|
7
8
|
LOAD_MANY,
|
|
@@ -84,6 +85,11 @@ export interface IncrementLoadCountEvent {
|
|
|
84
85
|
*/
|
|
85
86
|
type: IncrementLoadCountEventType;
|
|
86
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Load method type for this event.
|
|
90
|
+
*/
|
|
91
|
+
loadType: EntityLoadMethodType;
|
|
92
|
+
|
|
87
93
|
/**
|
|
88
94
|
* Number of field values being loaded for this call.
|
|
89
95
|
*/
|
|
@@ -8,18 +8,18 @@ import ViewerContext from '../ViewerContext';
|
|
|
8
8
|
* Privacy policy rule that always allows.
|
|
9
9
|
*/
|
|
10
10
|
export default class AlwaysAllowPrivacyPolicyRule<
|
|
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
|
|
@@ -8,18 +8,18 @@ import ViewerContext from '../ViewerContext';
|
|
|
8
8
|
* Privacy policy rule that always denies.
|
|
9
9
|
*/
|
|
10
10
|
export default class AlwaysDenyPrivacyPolicyRule<
|
|
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
|