@expo/entity 0.45.0 → 0.47.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 → src/AuthorizationResultBasedEntityAssociationLoader.d.ts} +4 -4
- package/build/{AuthorizationResultBasedEntityAssociationLoader.js → src/AuthorizationResultBasedEntityAssociationLoader.js} +2 -1
- package/build/src/AuthorizationResultBasedEntityAssociationLoader.js.map +1 -0
- package/build/{AuthorizationResultBasedEntityLoader.d.ts → src/AuthorizationResultBasedEntityLoader.d.ts} +8 -8
- package/build/{AuthorizationResultBasedEntityLoader.js → src/AuthorizationResultBasedEntityLoader.js} +6 -5
- package/build/src/AuthorizationResultBasedEntityLoader.js.map +1 -0
- package/build/{AuthorizationResultBasedEntityMutator.d.ts → src/AuthorizationResultBasedEntityMutator.d.ts} +15 -13
- package/build/{AuthorizationResultBasedEntityMutator.js → src/AuthorizationResultBasedEntityMutator.js} +77 -39
- package/build/src/AuthorizationResultBasedEntityMutator.js.map +1 -0
- package/build/{ComposedEntityCacheAdapter.d.ts → src/ComposedEntityCacheAdapter.d.ts} +2 -2
- package/build/{ComposedEntityCacheAdapter.js → src/ComposedEntityCacheAdapter.js} +2 -1
- package/build/src/ComposedEntityCacheAdapter.js.map +1 -0
- package/build/{ComposedSecondaryEntityCache.d.ts → src/ComposedSecondaryEntityCache.d.ts} +1 -1
- package/build/{ComposedSecondaryEntityCache.js → src/ComposedSecondaryEntityCache.js} +2 -1
- package/build/src/ComposedSecondaryEntityCache.js.map +1 -0
- package/build/{EnforcingEntityAssociationLoader.d.ts → src/EnforcingEntityAssociationLoader.d.ts} +5 -5
- package/build/{EnforcingEntityAssociationLoader.js → src/EnforcingEntityAssociationLoader.js} +2 -1
- package/build/src/EnforcingEntityAssociationLoader.js.map +1 -0
- package/build/{EnforcingEntityCreator.d.ts → src/EnforcingEntityCreator.d.ts} +4 -4
- package/build/{EnforcingEntityCreator.js → src/EnforcingEntityCreator.js} +2 -1
- package/build/src/EnforcingEntityCreator.js.map +1 -0
- package/build/{EnforcingEntityDeleter.d.ts → src/EnforcingEntityDeleter.d.ts} +4 -4
- package/build/{EnforcingEntityDeleter.js → src/EnforcingEntityDeleter.js} +2 -1
- package/build/src/EnforcingEntityDeleter.js.map +1 -0
- package/build/{EnforcingEntityLoader.d.ts → src/EnforcingEntityLoader.d.ts} +5 -5
- package/build/{EnforcingEntityLoader.js → src/EnforcingEntityLoader.js} +2 -1
- package/build/src/EnforcingEntityLoader.js.map +1 -0
- package/build/{EnforcingEntityUpdater.d.ts → src/EnforcingEntityUpdater.d.ts} +4 -4
- package/build/{EnforcingEntityUpdater.js → src/EnforcingEntityUpdater.js} +2 -1
- package/build/src/EnforcingEntityUpdater.js.map +1 -0
- package/build/{Entity.d.ts → src/Entity.d.ts} +7 -7
- package/build/{Entity.js → src/Entity.js} +13 -15
- package/build/src/Entity.js.map +1 -0
- package/build/{EntityAssociationLoader.d.ts → src/EntityAssociationLoader.d.ts} +5 -5
- package/build/{EntityAssociationLoader.js → src/EntityAssociationLoader.js} +6 -8
- package/build/src/EntityAssociationLoader.js.map +1 -0
- package/build/{EntityCompanion.d.ts → src/EntityCompanion.d.ts} +10 -10
- package/build/{EntityCompanion.js → src/EntityCompanion.js} +6 -8
- package/build/src/EntityCompanion.js.map +1 -0
- package/build/{EntityCompanionProvider.d.ts → src/EntityCompanionProvider.d.ts} +12 -12
- package/build/{EntityCompanionProvider.js → src/EntityCompanionProvider.js} +6 -5
- package/build/src/EntityCompanionProvider.js.map +1 -0
- package/build/{EntityConfiguration.d.ts → src/EntityConfiguration.d.ts} +2 -2
- package/build/{EntityConfiguration.js → src/EntityConfiguration.js} +2 -2
- package/build/src/EntityConfiguration.js.map +1 -0
- package/build/{EntityCreator.d.ts → src/EntityCreator.d.ts} +5 -5
- package/build/{EntityCreator.js → src/EntityCreator.js} +4 -6
- package/build/{EntityCreator.js.map → src/EntityCreator.js.map} +1 -1
- package/build/{EntityDatabaseAdapter.d.ts → src/EntityDatabaseAdapter.d.ts} +2 -2
- package/build/{EntityDatabaseAdapter.js → src/EntityDatabaseAdapter.js} +2 -2
- package/build/src/EntityDatabaseAdapter.js.map +1 -0
- package/build/{EntityDeleter.d.ts → src/EntityDeleter.d.ts} +5 -5
- package/build/{EntityDeleter.js → src/EntityDeleter.js} +5 -7
- package/build/{EntityDeleter.js.map → src/EntityDeleter.js.map} +1 -1
- package/build/{EntityFieldDefinition.d.ts → src/EntityFieldDefinition.d.ts} +3 -3
- package/build/src/EntityFieldDefinition.js.map +1 -0
- package/build/{EntityFields.d.ts → src/EntityFields.d.ts} +7 -0
- package/build/{EntityFields.js → src/EntityFields.js} +11 -1
- package/build/src/EntityFields.js.map +1 -0
- package/build/{EntityLoader.d.ts → src/EntityLoader.d.ts} +7 -7
- package/build/{EntityLoader.js → src/EntityLoader.js} +4 -6
- package/build/{EntityLoader.js.map → src/EntityLoader.js.map} +1 -1
- package/build/{EntityLoaderFactory.d.ts → src/EntityLoaderFactory.d.ts} +8 -8
- package/build/src/EntityLoaderFactory.js +29 -0
- package/build/src/EntityLoaderFactory.js.map +1 -0
- package/build/{EntityLoaderUtils.d.ts → src/EntityLoaderUtils.d.ts} +7 -7
- package/build/{EntityLoaderUtils.js → src/EntityLoaderUtils.js} +2 -1
- package/build/src/EntityLoaderUtils.js.map +1 -0
- package/build/{EntityMutationInfo.d.ts → src/EntityMutationInfo.d.ts} +2 -2
- package/build/src/EntityMutationInfo.js.map +1 -0
- package/build/{EntityMutationTriggerConfiguration.d.ts → src/EntityMutationTriggerConfiguration.d.ts} +3 -3
- package/build/src/EntityMutationTriggerConfiguration.js.map +1 -0
- package/build/{EntityMutationValidator.d.ts → src/EntityMutationValidator.d.ts} +3 -3
- package/build/{EntityMutationValidator.js → src/EntityMutationValidator.js} +2 -1
- package/build/src/EntityMutationValidator.js.map +1 -0
- package/build/{EntityMutatorFactory.d.ts → src/EntityMutatorFactory.d.ts} +15 -14
- package/build/{EntityMutatorFactory.js → src/EntityMutatorFactory.js} +6 -5
- package/build/src/EntityMutatorFactory.js.map +1 -0
- package/build/{EntityPrivacyPolicy.d.ts → src/EntityPrivacyPolicy.d.ts} +6 -6
- package/build/{EntityPrivacyPolicy.js → src/EntityPrivacyPolicy.js} +8 -11
- package/build/{EntityPrivacyPolicy.js.map → src/EntityPrivacyPolicy.js.map} +1 -1
- package/build/{EntityQueryContext.d.ts → src/EntityQueryContext.d.ts} +1 -1
- package/build/src/EntityQueryContext.js.map +1 -0
- package/build/{EntityQueryContextProvider.d.ts → src/EntityQueryContextProvider.d.ts} +2 -2
- package/build/{EntityQueryContextProvider.js → src/EntityQueryContextProvider.js} +2 -1
- package/build/src/EntityQueryContextProvider.js.map +1 -0
- package/build/{EntitySecondaryCacheLoader.d.ts → src/EntitySecondaryCacheLoader.d.ts} +5 -5
- package/build/{EntitySecondaryCacheLoader.js → src/EntitySecondaryCacheLoader.js} +2 -1
- package/build/src/EntitySecondaryCacheLoader.js.map +1 -0
- package/build/{EntityUpdater.d.ts → src/EntityUpdater.d.ts} +5 -5
- package/build/{EntityUpdater.js → src/EntityUpdater.js} +5 -7
- package/build/{EntityUpdater.js.map → src/EntityUpdater.js.map} +1 -1
- package/build/{GenericEntityCacheAdapter.d.ts → src/GenericEntityCacheAdapter.d.ts} +3 -3
- package/build/{GenericEntityCacheAdapter.js → src/GenericEntityCacheAdapter.js} +2 -1
- package/build/src/GenericEntityCacheAdapter.js.map +1 -0
- package/build/{GenericSecondaryEntityCache.d.ts → src/GenericSecondaryEntityCache.d.ts} +2 -2
- package/build/{GenericSecondaryEntityCache.js → src/GenericSecondaryEntityCache.js} +2 -1
- package/build/src/GenericSecondaryEntityCache.js.map +1 -0
- package/build/{IEntityCacheAdapter.d.ts → src/IEntityCacheAdapter.d.ts} +1 -1
- package/build/src/IEntityCacheAdapter.js.map +1 -0
- package/build/{IEntityCacheAdapterProvider.d.ts → src/IEntityCacheAdapterProvider.d.ts} +3 -3
- package/build/src/IEntityCacheAdapterProvider.js.map +1 -0
- package/build/{IEntityDatabaseAdapterProvider.d.ts → src/IEntityDatabaseAdapterProvider.d.ts} +3 -3
- package/build/src/IEntityDatabaseAdapterProvider.js.map +1 -0
- package/build/{IEntityGenericCacher.d.ts → src/IEntityGenericCacher.d.ts} +1 -1
- package/build/src/IEntityGenericCacher.js.map +1 -0
- package/build/{ReadonlyEntity.d.ts → src/ReadonlyEntity.d.ts} +8 -8
- package/build/{ReadonlyEntity.js → src/ReadonlyEntity.js} +9 -8
- package/build/src/ReadonlyEntity.js.map +1 -0
- package/build/{ViewerContext.d.ts → src/ViewerContext.d.ts} +5 -5
- package/build/{ViewerContext.js → src/ViewerContext.js} +4 -6
- package/build/{ViewerContext.js.map → src/ViewerContext.js.map} +1 -1
- package/build/{ViewerScopedEntityCompanion.d.ts → src/ViewerScopedEntityCompanion.d.ts} +9 -9
- package/build/{ViewerScopedEntityCompanion.js → src/ViewerScopedEntityCompanion.js} +6 -8
- package/build/{ViewerScopedEntityCompanion.js.map → src/ViewerScopedEntityCompanion.js.map} +1 -1
- package/build/{ViewerScopedEntityCompanionProvider.d.ts → src/ViewerScopedEntityCompanionProvider.d.ts} +6 -6
- package/build/{ViewerScopedEntityCompanionProvider.js → src/ViewerScopedEntityCompanionProvider.js} +4 -6
- package/build/src/ViewerScopedEntityCompanionProvider.js.map +1 -0
- package/build/{ViewerScopedEntityLoaderFactory.d.ts → src/ViewerScopedEntityLoaderFactory.d.ts} +6 -6
- package/build/{ViewerScopedEntityLoaderFactory.js → src/ViewerScopedEntityLoaderFactory.js} +2 -1
- package/build/src/ViewerScopedEntityLoaderFactory.js.map +1 -0
- package/build/{ViewerScopedEntityMutatorFactory.d.ts → src/ViewerScopedEntityMutatorFactory.d.ts} +9 -8
- package/build/{ViewerScopedEntityMutatorFactory.js → src/ViewerScopedEntityMutatorFactory.js} +6 -5
- package/build/src/ViewerScopedEntityMutatorFactory.js.map +1 -0
- package/build/src/entityUtils.js.map +1 -0
- package/build/{errors → src/errors}/EntityCacheAdapterError.d.ts +2 -2
- package/build/src/errors/EntityCacheAdapterError.js +13 -0
- package/build/src/errors/EntityCacheAdapterError.js.map +1 -0
- package/build/{errors → src/errors}/EntityDatabaseAdapterError.d.ts +2 -2
- package/build/{errors → src/errors}/EntityDatabaseAdapterError.js +4 -37
- package/build/src/errors/EntityDatabaseAdapterError.js.map +1 -0
- package/build/{errors → src/errors}/EntityError.d.ts +1 -1
- package/build/{errors → src/errors}/EntityError.js +2 -2
- package/build/src/errors/EntityError.js.map +1 -0
- package/build/{errors → src/errors}/EntityInvalidFieldValueError.d.ts +5 -5
- package/build/src/errors/EntityInvalidFieldValueError.js +13 -0
- package/build/src/errors/EntityInvalidFieldValueError.js.map +1 -0
- package/build/{errors → src/errors}/EntityNotAuthorizedError.d.ts +4 -4
- package/build/src/errors/EntityNotAuthorizedError.js +16 -0
- package/build/src/errors/EntityNotAuthorizedError.js.map +1 -0
- package/build/{errors → src/errors}/EntityNotFoundError.d.ts +5 -5
- package/build/src/errors/EntityNotFoundError.js +18 -0
- package/build/src/errors/EntityNotFoundError.js.map +1 -0
- package/build/src/index.d.ts +76 -0
- package/build/src/index.js +94 -0
- package/build/src/index.js.map +1 -0
- package/build/{internal → src/internal}/CompositeFieldHolder.d.ts +1 -1
- package/build/src/internal/CompositeFieldHolder.js.map +1 -0
- package/build/src/internal/CompositeFieldValueMap.js.map +1 -0
- package/build/{internal → src/internal}/EntityDataManager.d.ts +5 -5
- package/build/{internal → src/internal}/EntityDataManager.js +2 -1
- package/build/src/internal/EntityDataManager.js.map +1 -0
- package/build/{internal → src/internal}/EntityFieldTransformationUtils.d.ts +1 -1
- package/build/src/internal/EntityFieldTransformationUtils.js.map +1 -0
- package/build/{internal → src/internal}/EntityLoadInterfaces.d.ts +1 -1
- package/build/src/internal/EntityLoadInterfaces.js.map +1 -0
- package/build/{internal → src/internal}/EntityTableDataCoordinator.d.ts +9 -9
- package/build/{internal → src/internal}/EntityTableDataCoordinator.js +5 -7
- package/build/{internal → src/internal}/EntityTableDataCoordinator.js.map +1 -1
- package/build/{internal → src/internal}/ReadThroughEntityCache.d.ts +3 -3
- package/build/{internal → src/internal}/ReadThroughEntityCache.js +2 -2
- package/build/src/internal/ReadThroughEntityCache.js.map +1 -0
- package/build/{internal → src/internal}/SingleFieldHolder.d.ts +1 -1
- package/build/src/internal/SingleFieldHolder.js.map +1 -0
- package/build/{metrics → src/metrics}/EntityMetricsUtils.d.ts +1 -1
- package/build/src/metrics/EntityMetricsUtils.js.map +1 -0
- package/build/{metrics → src/metrics}/IEntityMetricsAdapter.d.ts +1 -1
- package/build/src/metrics/IEntityMetricsAdapter.js.map +1 -0
- package/build/{metrics → src/metrics}/NoOpEntityMetricsAdapter.d.ts +2 -2
- package/build/{metrics → src/metrics}/NoOpEntityMetricsAdapter.js +2 -1
- package/build/src/metrics/NoOpEntityMetricsAdapter.js.map +1 -0
- package/build/{rules → src/rules}/AlwaysAllowPrivacyPolicyRule.d.ts +4 -4
- package/build/src/rules/AlwaysAllowPrivacyPolicyRule.js +14 -0
- package/build/src/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -0
- package/build/{rules → src/rules}/AlwaysDenyPrivacyPolicyRule.d.ts +4 -4
- package/build/src/rules/AlwaysDenyPrivacyPolicyRule.js +14 -0
- package/build/src/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -0
- package/build/{rules → src/rules}/AlwaysSkipPrivacyPolicyRule.d.ts +4 -4
- package/build/src/rules/AlwaysSkipPrivacyPolicyRule.js +14 -0
- package/build/src/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -0
- package/build/{rules → src/rules}/PrivacyPolicyRule.d.ts +3 -3
- package/build/{rules → src/rules}/PrivacyPolicyRule.js +2 -2
- package/build/src/rules/PrivacyPolicyRule.js.map +1 -0
- package/build/{utils → src/utils}/EntityCreationUtils.d.ts +3 -3
- package/build/{utils → src/utils}/EntityCreationUtils.js +2 -5
- package/build/{utils → src/utils}/EntityCreationUtils.js.map +1 -1
- package/build/{utils → src/utils}/EntityPrivacyUtils.d.ts +4 -4
- package/build/{utils → src/utils}/EntityPrivacyUtils.js +4 -7
- package/build/{utils → src/utils}/EntityPrivacyUtils.js.map +1 -1
- package/build/src/utils/collections/SerializableKeyMap.js.map +1 -0
- package/build/src/utils/collections/maps.js.map +1 -0
- package/build/src/utils/collections/sets.js.map +1 -0
- package/build/{utils → src/utils}/mergeEntityMutationTriggerConfigurations.d.ts +3 -3
- package/build/src/utils/mergeEntityMutationTriggerConfigurations.js.map +1 -0
- package/package.json +14 -24
- package/src/AuthorizationResultBasedEntityAssociationLoader.ts +4 -4
- package/src/AuthorizationResultBasedEntityLoader.ts +13 -12
- package/src/AuthorizationResultBasedEntityMutator.ts +78 -63
- package/src/ComposedEntityCacheAdapter.ts +3 -3
- package/src/ComposedSecondaryEntityCache.ts +1 -1
- package/src/EnforcingEntityAssociationLoader.ts +6 -5
- package/src/EnforcingEntityCreator.ts +4 -4
- package/src/EnforcingEntityDeleter.ts +4 -4
- package/src/EnforcingEntityLoader.ts +5 -5
- package/src/EnforcingEntityUpdater.ts +4 -4
- package/src/Entity.ts +10 -10
- package/src/EntityAssociationLoader.ts +5 -5
- package/src/EntityCompanion.ts +10 -10
- package/src/EntityCompanionProvider.ts +13 -13
- package/src/EntityConfiguration.ts +3 -3
- package/src/EntityCreator.ts +5 -5
- package/src/EntityDatabaseAdapter.ts +3 -3
- package/src/EntityDeleter.ts +6 -6
- package/src/EntityFieldDefinition.ts +3 -3
- package/src/EntityFields.ts +13 -0
- package/src/EntityLoader.ts +7 -7
- package/src/EntityLoaderFactory.ts +9 -9
- package/src/EntityLoaderUtils.ts +7 -7
- package/src/EntityMutationInfo.ts +2 -2
- package/src/EntityMutationTriggerConfiguration.ts +3 -3
- package/src/EntityMutationValidator.ts +3 -3
- package/src/EntityMutatorFactory.ts +17 -12
- package/src/EntityPrivacyPolicy.ts +7 -6
- package/src/EntityQueryContext.ts +1 -1
- package/src/EntityQueryContextProvider.ts +3 -3
- package/src/EntitySecondaryCacheLoader.ts +5 -5
- package/src/EntityUpdater.ts +6 -6
- package/src/GenericEntityCacheAdapter.ts +3 -3
- package/src/GenericSecondaryEntityCache.ts +2 -2
- package/src/IEntityCacheAdapter.ts +1 -1
- package/src/IEntityCacheAdapterProvider.ts +3 -3
- package/src/IEntityDatabaseAdapterProvider.ts +3 -3
- package/src/IEntityGenericCacher.ts +1 -1
- package/src/ReadonlyEntity.ts +10 -10
- package/src/ViewerContext.ts +6 -6
- package/src/ViewerScopedEntityCompanion.ts +9 -9
- package/src/ViewerScopedEntityCompanionProvider.ts +6 -6
- package/src/ViewerScopedEntityLoaderFactory.ts +6 -6
- package/src/ViewerScopedEntityMutatorFactory.ts +11 -8
- package/src/__tests__/AuthorizationResultBasedEntityAssociationLoader-test.ts +5 -4
- package/src/__tests__/AuthorizationResultBasedEntityLoader-constructor-test.ts +14 -18
- package/src/__tests__/AuthorizationResultBasedEntityLoader-test.ts +18 -16
- package/src/__tests__/ComposedCacheAdapter-test.ts +5 -3
- package/src/__tests__/ComposedSecondaryEntityCache-test.ts +2 -1
- package/src/__tests__/EnforcingEntityAssociationLoader-test.ts +4 -3
- package/src/__tests__/EnforcingEntityLoader-test.ts +4 -3
- package/src/__tests__/Entity-test.ts +8 -6
- package/src/__tests__/EntityAssociationLoader-test.ts +7 -5
- package/src/__tests__/EntityCommonUseCases-test.ts +10 -9
- package/src/__tests__/EntityCompanion-test.ts +13 -11
- package/src/__tests__/EntityCompanionProvider-test.ts +7 -5
- package/src/__tests__/EntityConfiguration-test.ts +3 -1
- package/src/__tests__/EntityDatabaseAdapter-test.ts +9 -7
- package/src/__tests__/EntityEdges-test.ts +10 -8
- package/src/__tests__/EntityFields-test.ts +15 -7
- package/src/__tests__/EntityLoader-test.ts +8 -6
- package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +8 -6
- package/src/__tests__/EntityMutator-SingleCompositeFieldCacheConsistency-test.ts +5 -3
- package/src/__tests__/EntityMutator-test.ts +250 -45
- package/src/__tests__/EntityPrivacyPolicy-test.ts +19 -16
- package/src/__tests__/EntityQueryContext-test.ts +7 -6
- package/src/__tests__/EntitySecondaryCacheLoader-test.ts +5 -3
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +7 -5
- package/src/__tests__/GenericEntityCacheAdapter-test.ts +4 -3
- package/src/__tests__/ReadonlyEntity-test.ts +10 -9
- package/src/__tests__/ViewerContext-test.ts +3 -1
- package/src/__tests__/ViewerScopedEntityCompanion-test.ts +10 -8
- package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +7 -6
- package/src/__tests__/ViewerScopedEntityLoaderFactory-test.ts +5 -4
- package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +8 -6
- package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +15 -13
- package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +7 -5
- package/src/__tests__/entityUtils-test.ts +3 -2
- package/src/errors/EntityCacheAdapterError.ts +2 -2
- package/src/errors/EntityDatabaseAdapterError.ts +2 -2
- package/src/errors/EntityError.ts +1 -1
- package/src/errors/EntityInvalidFieldValueError.ts +5 -5
- package/src/errors/EntityNotAuthorizedError.ts +4 -4
- package/src/errors/EntityNotFoundError.ts +5 -5
- package/src/errors/__tests__/EntityDatabaseAdapterError-test.ts +6 -3
- package/src/index.ts +39 -54
- package/src/internal/CompositeFieldHolder.ts +2 -1
- package/src/internal/EntityDataManager.ts +7 -5
- package/src/internal/EntityFieldTransformationUtils.ts +1 -1
- package/src/internal/EntityLoadInterfaces.ts +1 -1
- package/src/internal/EntityTableDataCoordinator.ts +10 -10
- package/src/internal/ReadThroughEntityCache.ts +3 -3
- package/src/internal/SingleFieldHolder.ts +1 -1
- package/src/internal/__tests__/CompositeFieldHolder-test.ts +2 -0
- package/src/internal/__tests__/CompositeFieldValueMap-test.ts +2 -0
- package/src/internal/__tests__/EntityDataManager-test.ts +34 -31
- package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +5 -3
- package/src/internal/__tests__/ReadThroughEntityCache-test.ts +5 -4
- package/src/metrics/EntityMetricsUtils.ts +3 -2
- package/src/metrics/IEntityMetricsAdapter.ts +1 -1
- package/src/metrics/NoOpEntityMetricsAdapter.ts +3 -2
- package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +4 -4
- package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +4 -4
- package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +4 -4
- package/src/rules/PrivacyPolicyRule.ts +3 -3
- package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +3 -3
- package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +3 -3
- package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +3 -3
- package/src/utils/EntityCreationUtils.ts +4 -4
- package/src/utils/EntityPrivacyUtils.ts +5 -5
- package/src/utils/__testfixtures__/PrivacyPolicyRuleTestUtils.ts +5 -3
- package/src/utils/__testfixtures__/SimpleTestEntity.ts +6 -6
- package/src/utils/__testfixtures__/StubCacheAdapter.ts +4 -4
- package/src/utils/__testfixtures__/StubDatabaseAdapter.ts +8 -7
- package/src/utils/__testfixtures__/StubDatabaseAdapterProvider.ts +5 -5
- package/src/utils/__testfixtures__/StubQueryContextProvider.ts +2 -2
- package/src/utils/__testfixtures__/TestEntity.ts +7 -7
- package/src/utils/__testfixtures__/TestEntity2.ts +6 -6
- package/src/utils/__testfixtures__/TestEntityWithMutationTriggers.ts +6 -10
- package/src/utils/__testfixtures__/TestViewerContext.ts +2 -2
- package/src/utils/__testfixtures__/createUnitTestEntityCompanionProvider.ts +5 -5
- package/src/utils/__testfixtures__/describeFieldTestCase.ts +3 -1
- package/src/utils/__tests__/EntityCreationUtils-test.ts +5 -3
- package/src/utils/__tests__/EntityPrivacyUtils-test.ts +15 -13
- package/src/utils/__tests__/canViewerDeleteAsync-edgeDeletionPermissionInferenceBehavior-test.ts +10 -8
- package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +2 -0
- package/src/utils/collections/__tests__/SerializableKeyMap-test.ts +2 -0
- package/src/utils/collections/__tests__/maps-test.ts +3 -1
- package/src/utils/collections/__tests__/sets-test.ts +2 -0
- package/src/utils/mergeEntityMutationTriggerConfigurations.ts +3 -3
- package/LICENSE +0 -21
- package/build/AuthorizationResultBasedEntityAssociationLoader.js.map +0 -1
- package/build/AuthorizationResultBasedEntityLoader.js.map +0 -1
- package/build/AuthorizationResultBasedEntityMutator.js.map +0 -1
- package/build/ComposedEntityCacheAdapter.js.map +0 -1
- package/build/ComposedSecondaryEntityCache.js.map +0 -1
- package/build/EnforcingEntityAssociationLoader.js.map +0 -1
- package/build/EnforcingEntityCreator.js.map +0 -1
- package/build/EnforcingEntityDeleter.js.map +0 -1
- package/build/EnforcingEntityLoader.js.map +0 -1
- package/build/EnforcingEntityUpdater.js.map +0 -1
- package/build/Entity.js.map +0 -1
- package/build/EntityAssociationLoader.js.map +0 -1
- package/build/EntityCompanion.js.map +0 -1
- package/build/EntityCompanionProvider.js.map +0 -1
- package/build/EntityConfiguration.js.map +0 -1
- package/build/EntityDatabaseAdapter.js.map +0 -1
- package/build/EntityFieldDefinition.js.map +0 -1
- package/build/EntityFields.js.map +0 -1
- package/build/EntityLoaderFactory.js +0 -31
- package/build/EntityLoaderFactory.js.map +0 -1
- package/build/EntityLoaderUtils.js.map +0 -1
- package/build/EntityMutationInfo.js.map +0 -1
- package/build/EntityMutationTriggerConfiguration.js.map +0 -1
- package/build/EntityMutationValidator.js.map +0 -1
- package/build/EntityMutatorFactory.js.map +0 -1
- package/build/EntityQueryContext.js.map +0 -1
- package/build/EntityQueryContextProvider.js.map +0 -1
- package/build/EntitySecondaryCacheLoader.js.map +0 -1
- package/build/GenericEntityCacheAdapter.js.map +0 -1
- package/build/GenericSecondaryEntityCache.js.map +0 -1
- package/build/IEntityCacheAdapter.js.map +0 -1
- package/build/IEntityCacheAdapterProvider.js.map +0 -1
- package/build/IEntityDatabaseAdapterProvider.js.map +0 -1
- package/build/IEntityGenericCacher.js.map +0 -1
- package/build/ReadonlyEntity.js.map +0 -1
- package/build/ViewerScopedEntityCompanionProvider.js.map +0 -1
- package/build/ViewerScopedEntityLoaderFactory.js.map +0 -1
- package/build/ViewerScopedEntityMutatorFactory.js.map +0 -1
- package/build/entityUtils.js.map +0 -1
- package/build/errors/EntityCacheAdapterError.js +0 -46
- package/build/errors/EntityCacheAdapterError.js.map +0 -1
- package/build/errors/EntityDatabaseAdapterError.js.map +0 -1
- package/build/errors/EntityError.js.map +0 -1
- package/build/errors/EntityInvalidFieldValueError.js +0 -45
- package/build/errors/EntityInvalidFieldValueError.js.map +0 -1
- package/build/errors/EntityNotAuthorizedError.js +0 -48
- package/build/errors/EntityNotAuthorizedError.js.map +0 -1
- package/build/errors/EntityNotFoundError.js +0 -50
- package/build/errors/EntityNotFoundError.js.map +0 -1
- package/build/index.d.ts +0 -91
- package/build/index.js +0 -155
- package/build/index.js.map +0 -1
- package/build/internal/CompositeFieldHolder.js.map +0 -1
- package/build/internal/CompositeFieldValueMap.js.map +0 -1
- package/build/internal/EntityDataManager.js.map +0 -1
- package/build/internal/EntityFieldTransformationUtils.js.map +0 -1
- package/build/internal/EntityLoadInterfaces.js.map +0 -1
- package/build/internal/ReadThroughEntityCache.js.map +0 -1
- package/build/internal/SingleFieldHolder.js.map +0 -1
- package/build/metrics/EntityMetricsUtils.js.map +0 -1
- package/build/metrics/IEntityMetricsAdapter.js.map +0 -1
- package/build/metrics/NoOpEntityMetricsAdapter.js.map +0 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js +0 -46
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +0 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js +0 -46
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +0 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js +0 -46
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +0 -1
- package/build/rules/PrivacyPolicyRule.js.map +0 -1
- package/build/tsconfig.build.tsbuildinfo +0 -1
- package/build/utils/collections/SerializableKeyMap.js.map +0 -1
- package/build/utils/collections/maps.js.map +0 -1
- package/build/utils/collections/sets.js.map +0 -1
- package/build/utils/mergeEntityMutationTriggerConfigurations.js.map +0 -1
- /package/build/{EntityFieldDefinition.js → src/EntityFieldDefinition.js} +0 -0
- /package/build/{EntityMutationInfo.js → src/EntityMutationInfo.js} +0 -0
- /package/build/{EntityMutationTriggerConfiguration.js → src/EntityMutationTriggerConfiguration.js} +0 -0
- /package/build/{EntityQueryContext.js → src/EntityQueryContext.js} +0 -0
- /package/build/{IEntityCacheAdapter.js → src/IEntityCacheAdapter.js} +0 -0
- /package/build/{IEntityCacheAdapterProvider.js → src/IEntityCacheAdapterProvider.js} +0 -0
- /package/build/{IEntityDatabaseAdapterProvider.js → src/IEntityDatabaseAdapterProvider.js} +0 -0
- /package/build/{IEntityGenericCacher.js → src/IEntityGenericCacher.js} +0 -0
- /package/build/{entityUtils.d.ts → src/entityUtils.d.ts} +0 -0
- /package/build/{entityUtils.js → src/entityUtils.js} +0 -0
- /package/build/{internal → src/internal}/CompositeFieldHolder.js +0 -0
- /package/build/{internal → src/internal}/CompositeFieldValueMap.d.ts +0 -0
- /package/build/{internal → src/internal}/CompositeFieldValueMap.js +0 -0
- /package/build/{internal → src/internal}/EntityFieldTransformationUtils.js +0 -0
- /package/build/{internal → src/internal}/EntityLoadInterfaces.js +0 -0
- /package/build/{internal → src/internal}/SingleFieldHolder.js +0 -0
- /package/build/{metrics → src/metrics}/EntityMetricsUtils.js +0 -0
- /package/build/{metrics → src/metrics}/IEntityMetricsAdapter.js +0 -0
- /package/build/{utils → src/utils}/collections/SerializableKeyMap.d.ts +0 -0
- /package/build/{utils → src/utils}/collections/SerializableKeyMap.js +0 -0
- /package/build/{utils → src/utils}/collections/maps.d.ts +0 -0
- /package/build/{utils → src/utils}/collections/maps.js +0 -0
- /package/build/{utils → src/utils}/collections/sets.d.ts +0 -0
- /package/build/{utils → src/utils}/collections/sets.js +0 -0
- /package/build/{utils → src/utils}/mergeEntityMutationTriggerConfigurations.js +0 -0
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { Result, result } from '@expo/results';
|
|
2
2
|
|
|
3
3
|
import { IEntityClass } from './Entity';
|
|
4
|
-
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
4
|
+
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
|
|
5
5
|
import { EntityQueryContext } from './EntityQueryContext';
|
|
6
|
-
import ReadonlyEntity from './ReadonlyEntity';
|
|
7
|
-
import ViewerContext from './ViewerContext';
|
|
6
|
+
import { ReadonlyEntity } from './ReadonlyEntity';
|
|
7
|
+
import { ViewerContext } from './ViewerContext';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* An association loader is a set of convenience methods for loading entities
|
|
11
11
|
* associated with an entity. In relational databases, these entities are often referenced
|
|
12
12
|
* by foreign keys.
|
|
13
13
|
*/
|
|
14
|
-
export
|
|
14
|
+
export class AuthorizationResultBasedEntityAssociationLoader<
|
|
15
15
|
TFields extends Record<string, any>,
|
|
16
16
|
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
17
17
|
TViewerContext extends ViewerContext,
|
|
@@ -3,28 +3,29 @@ import invariant from 'invariant';
|
|
|
3
3
|
import nullthrows from 'nullthrows';
|
|
4
4
|
|
|
5
5
|
import { IEntityClass } from './Entity';
|
|
6
|
-
import
|
|
6
|
+
import {
|
|
7
7
|
EntityCompositeField,
|
|
8
8
|
EntityCompositeFieldValue,
|
|
9
|
+
EntityConfiguration,
|
|
9
10
|
} from './EntityConfiguration';
|
|
10
11
|
import {
|
|
11
12
|
FieldEqualityCondition,
|
|
12
|
-
QuerySelectionModifiers,
|
|
13
13
|
isSingleValueFieldEqualityCondition,
|
|
14
|
+
QuerySelectionModifiers,
|
|
14
15
|
QuerySelectionModifiersWithOrderByRaw,
|
|
15
16
|
} from './EntityDatabaseAdapter';
|
|
16
|
-
import EntityLoaderUtils from './EntityLoaderUtils';
|
|
17
|
-
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
17
|
+
import { EntityLoaderUtils } from './EntityLoaderUtils';
|
|
18
|
+
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
|
|
18
19
|
import { EntityQueryContext } from './EntityQueryContext';
|
|
19
|
-
import ReadonlyEntity from './ReadonlyEntity';
|
|
20
|
-
import ViewerContext from './ViewerContext';
|
|
21
|
-
import EntityInvalidFieldValueError from './errors/EntityInvalidFieldValueError';
|
|
22
|
-
import EntityNotFoundError from './errors/EntityNotFoundError';
|
|
23
|
-
import {
|
|
20
|
+
import { ReadonlyEntity } from './ReadonlyEntity';
|
|
21
|
+
import { ViewerContext } from './ViewerContext';
|
|
22
|
+
import { EntityInvalidFieldValueError } from './errors/EntityInvalidFieldValueError';
|
|
23
|
+
import { EntityNotFoundError } from './errors/EntityNotFoundError';
|
|
24
|
+
import { CompositeFieldHolder, CompositeFieldValueHolder } from './internal/CompositeFieldHolder';
|
|
24
25
|
import { CompositeFieldValueMap } from './internal/CompositeFieldValueMap';
|
|
25
|
-
import EntityDataManager from './internal/EntityDataManager';
|
|
26
|
+
import { EntityDataManager } from './internal/EntityDataManager';
|
|
26
27
|
import { SingleFieldHolder, SingleFieldValueHolder } from './internal/SingleFieldHolder';
|
|
27
|
-
import IEntityMetricsAdapter from './metrics/IEntityMetricsAdapter';
|
|
28
|
+
import { IEntityMetricsAdapter } from './metrics/IEntityMetricsAdapter';
|
|
28
29
|
import { mapKeys, mapMap } from './utils/collections/maps';
|
|
29
30
|
import { areSetsEqual } from './utils/collections/sets';
|
|
30
31
|
|
|
@@ -34,7 +35,7 @@ import { areSetsEqual } from './utils/collections/sets';
|
|
|
34
35
|
* loader are are results (or null for some loader methods), where an unsuccessful result
|
|
35
36
|
* means an authorization error or entity construction error occurred. Other errors are thrown.
|
|
36
37
|
*/
|
|
37
|
-
export
|
|
38
|
+
export class AuthorizationResultBasedEntityLoader<
|
|
38
39
|
TFields extends Record<string, any>,
|
|
39
40
|
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
40
41
|
TViewerContext extends ViewerContext,
|
|
@@ -1,30 +1,31 @@
|
|
|
1
|
-
import { Result, asyncResult,
|
|
1
|
+
import { Result, asyncResult, enforceAsyncResult, result } from '@expo/results';
|
|
2
2
|
import invariant from 'invariant';
|
|
3
3
|
|
|
4
|
-
import Entity,
|
|
5
|
-
import EntityCompanionProvider from './EntityCompanionProvider';
|
|
6
|
-
import EntityConfiguration from './EntityConfiguration';
|
|
7
|
-
import EntityDatabaseAdapter from './EntityDatabaseAdapter';
|
|
4
|
+
import { Entity, IEntityClass } from './Entity';
|
|
5
|
+
import { EntityCompanionProvider } from './EntityCompanionProvider';
|
|
6
|
+
import { EntityConfiguration } from './EntityConfiguration';
|
|
7
|
+
import { EntityDatabaseAdapter } from './EntityDatabaseAdapter';
|
|
8
8
|
import { EntityEdgeDeletionBehavior } from './EntityFieldDefinition';
|
|
9
|
-
import EntityLoaderFactory from './EntityLoaderFactory';
|
|
9
|
+
import { EntityLoaderFactory } from './EntityLoaderFactory';
|
|
10
10
|
import {
|
|
11
|
-
|
|
11
|
+
EntityCascadingDeletionInfo,
|
|
12
12
|
EntityMutationType,
|
|
13
13
|
EntityTriggerMutationInfo,
|
|
14
|
-
|
|
14
|
+
EntityValidatorMutationInfo,
|
|
15
15
|
} from './EntityMutationInfo';
|
|
16
|
-
import
|
|
16
|
+
import {
|
|
17
17
|
EntityMutationTrigger,
|
|
18
|
+
EntityMutationTriggerConfiguration,
|
|
18
19
|
EntityNonTransactionalMutationTrigger,
|
|
19
20
|
} from './EntityMutationTriggerConfiguration';
|
|
20
|
-
import EntityMutationValidator from './EntityMutationValidator';
|
|
21
|
-
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
21
|
+
import { EntityMutationValidator } from './EntityMutationValidator';
|
|
22
|
+
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
|
|
22
23
|
import { EntityQueryContext, EntityTransactionalQueryContext } from './EntityQueryContext';
|
|
23
|
-
import ViewerContext from './ViewerContext';
|
|
24
|
+
import { ViewerContext } from './ViewerContext';
|
|
24
25
|
import { enforceResultsAsync } from './entityUtils';
|
|
25
|
-
import EntityInvalidFieldValueError from './errors/EntityInvalidFieldValueError';
|
|
26
|
+
import { EntityInvalidFieldValueError } from './errors/EntityInvalidFieldValueError';
|
|
26
27
|
import { timeAndLogMutationEventAsync } from './metrics/EntityMetricsUtils';
|
|
27
|
-
import
|
|
28
|
+
import { EntityMetricsMutationType, IEntityMetricsAdapter } from './metrics/IEntityMetricsAdapter';
|
|
28
29
|
import { mapMapAsync } from './utils/collections/maps';
|
|
29
30
|
|
|
30
31
|
/**
|
|
@@ -476,6 +477,7 @@ export class AuthorizationResultBasedUpdateMutator<
|
|
|
476
477
|
databaseAdapter: EntityDatabaseAdapter<TFields, TIDField>,
|
|
477
478
|
metricsAdapter: IEntityMetricsAdapter,
|
|
478
479
|
originalEntity: TEntity,
|
|
480
|
+
private readonly cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
479
481
|
) {
|
|
480
482
|
super(
|
|
481
483
|
companionProvider,
|
|
@@ -516,37 +518,25 @@ export class AuthorizationResultBasedUpdateMutator<
|
|
|
516
518
|
EntityMetricsMutationType.UPDATE,
|
|
517
519
|
this.entityClass.name,
|
|
518
520
|
this.queryContext,
|
|
519
|
-
)(this.updateInTransactionAsync(false
|
|
521
|
+
)(this.updateInTransactionAsync(false));
|
|
520
522
|
}
|
|
521
523
|
|
|
522
|
-
private async updateInTransactionAsync(
|
|
523
|
-
skipDatabaseUpdate: true,
|
|
524
|
-
cascadingDeleteCause: EntityCascadingDeletionInfo,
|
|
525
|
-
): Promise<Result<TEntity>>;
|
|
526
|
-
private async updateInTransactionAsync(
|
|
527
|
-
skipDatabaseUpdate: false,
|
|
528
|
-
cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
529
|
-
): Promise<Result<TEntity>>;
|
|
530
|
-
private async updateInTransactionAsync(
|
|
531
|
-
skipDatabaseUpdate: boolean,
|
|
532
|
-
cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
533
|
-
): Promise<Result<TEntity>> {
|
|
524
|
+
private async updateInTransactionAsync(skipDatabaseUpdate: boolean): Promise<Result<TEntity>> {
|
|
534
525
|
return await this.queryContext.runInTransactionIfNotInTransactionAsync((innerQueryContext) =>
|
|
535
|
-
this.updateInternalAsync(innerQueryContext, skipDatabaseUpdate
|
|
526
|
+
this.updateInternalAsync(innerQueryContext, skipDatabaseUpdate),
|
|
536
527
|
);
|
|
537
528
|
}
|
|
538
529
|
|
|
539
530
|
private async updateInternalAsync(
|
|
540
531
|
queryContext: EntityTransactionalQueryContext,
|
|
541
532
|
skipDatabaseUpdate: boolean,
|
|
542
|
-
cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
543
533
|
): Promise<Result<TEntity>> {
|
|
544
534
|
this.validateFields(this.updatedFields);
|
|
545
535
|
this.ensureStableIDField(this.updatedFields);
|
|
546
536
|
|
|
547
537
|
const entityLoader = this.entityLoaderFactory.forLoad(this.viewerContext, queryContext, {
|
|
548
538
|
previousValue: this.originalEntity,
|
|
549
|
-
cascadingDeleteCause,
|
|
539
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
550
540
|
});
|
|
551
541
|
|
|
552
542
|
const entityAboutToBeUpdated = entityLoader.utils.constructEntity(this.fieldsForEntity);
|
|
@@ -554,7 +544,7 @@ export class AuthorizationResultBasedUpdateMutator<
|
|
|
554
544
|
this.privacyPolicy.authorizeUpdateAsync(
|
|
555
545
|
this.viewerContext,
|
|
556
546
|
queryContext,
|
|
557
|
-
{ previousValue: this.originalEntity, cascadingDeleteCause },
|
|
547
|
+
{ previousValue: this.originalEntity, cascadingDeleteCause: this.cascadingDeleteCause },
|
|
558
548
|
entityAboutToBeUpdated,
|
|
559
549
|
this.metricsAdapter,
|
|
560
550
|
),
|
|
@@ -567,19 +557,31 @@ export class AuthorizationResultBasedUpdateMutator<
|
|
|
567
557
|
this.mutationValidators,
|
|
568
558
|
queryContext,
|
|
569
559
|
entityAboutToBeUpdated,
|
|
570
|
-
{
|
|
560
|
+
{
|
|
561
|
+
type: EntityMutationType.UPDATE,
|
|
562
|
+
previousValue: this.originalEntity,
|
|
563
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
564
|
+
},
|
|
571
565
|
);
|
|
572
566
|
await this.executeMutationTriggersAsync(
|
|
573
567
|
this.mutationTriggers.beforeAll,
|
|
574
568
|
queryContext,
|
|
575
569
|
entityAboutToBeUpdated,
|
|
576
|
-
{
|
|
570
|
+
{
|
|
571
|
+
type: EntityMutationType.UPDATE,
|
|
572
|
+
previousValue: this.originalEntity,
|
|
573
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
574
|
+
},
|
|
577
575
|
);
|
|
578
576
|
await this.executeMutationTriggersAsync(
|
|
579
577
|
this.mutationTriggers.beforeUpdate,
|
|
580
578
|
queryContext,
|
|
581
579
|
entityAboutToBeUpdated,
|
|
582
|
-
{
|
|
580
|
+
{
|
|
581
|
+
type: EntityMutationType.UPDATE,
|
|
582
|
+
previousValue: this.originalEntity,
|
|
583
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
584
|
+
},
|
|
583
585
|
);
|
|
584
586
|
|
|
585
587
|
// skip the database update when specified
|
|
@@ -626,13 +628,21 @@ export class AuthorizationResultBasedUpdateMutator<
|
|
|
626
628
|
this.mutationTriggers.afterUpdate,
|
|
627
629
|
queryContext,
|
|
628
630
|
updatedEntity,
|
|
629
|
-
{
|
|
631
|
+
{
|
|
632
|
+
type: EntityMutationType.UPDATE,
|
|
633
|
+
previousValue: this.originalEntity,
|
|
634
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
635
|
+
},
|
|
630
636
|
);
|
|
631
637
|
await this.executeMutationTriggersAsync(
|
|
632
638
|
this.mutationTriggers.afterAll,
|
|
633
639
|
queryContext,
|
|
634
640
|
updatedEntity,
|
|
635
|
-
{
|
|
641
|
+
{
|
|
642
|
+
type: EntityMutationType.UPDATE,
|
|
643
|
+
previousValue: this.originalEntity,
|
|
644
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
645
|
+
},
|
|
636
646
|
);
|
|
637
647
|
|
|
638
648
|
queryContext.appendPostCommitCallback(
|
|
@@ -643,7 +653,7 @@ export class AuthorizationResultBasedUpdateMutator<
|
|
|
643
653
|
{
|
|
644
654
|
type: EntityMutationType.UPDATE,
|
|
645
655
|
previousValue: this.originalEntity,
|
|
646
|
-
cascadingDeleteCause,
|
|
656
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
647
657
|
},
|
|
648
658
|
),
|
|
649
659
|
);
|
|
@@ -723,6 +733,7 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
723
733
|
databaseAdapter: EntityDatabaseAdapter<TFields, TIDField>,
|
|
724
734
|
metricsAdapter: IEntityMetricsAdapter,
|
|
725
735
|
private readonly entity: TEntity,
|
|
736
|
+
private readonly cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
726
737
|
) {
|
|
727
738
|
super(
|
|
728
739
|
companionProvider,
|
|
@@ -749,20 +760,18 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
749
760
|
EntityMetricsMutationType.DELETE,
|
|
750
761
|
this.entityClass.name,
|
|
751
762
|
this.queryContext,
|
|
752
|
-
)(this.deleteInTransactionAsync(new Set(), false
|
|
763
|
+
)(this.deleteInTransactionAsync(new Set(), false));
|
|
753
764
|
}
|
|
754
765
|
|
|
755
766
|
private async deleteInTransactionAsync(
|
|
756
767
|
processedEntityIdentifiersFromTransitiveDeletions: Set<string>,
|
|
757
768
|
skipDatabaseDeletion: boolean,
|
|
758
|
-
cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
759
769
|
): Promise<Result<void>> {
|
|
760
770
|
return await this.queryContext.runInTransactionIfNotInTransactionAsync((innerQueryContext) =>
|
|
761
771
|
this.deleteInternalAsync(
|
|
762
772
|
innerQueryContext,
|
|
763
773
|
processedEntityIdentifiersFromTransitiveDeletions,
|
|
764
774
|
skipDatabaseDeletion,
|
|
765
|
-
cascadingDeleteCause,
|
|
766
775
|
),
|
|
767
776
|
);
|
|
768
777
|
}
|
|
@@ -771,13 +780,12 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
771
780
|
queryContext: EntityTransactionalQueryContext,
|
|
772
781
|
processedEntityIdentifiersFromTransitiveDeletions: Set<string>,
|
|
773
782
|
skipDatabaseDeletion: boolean,
|
|
774
|
-
cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
775
783
|
): Promise<Result<void>> {
|
|
776
784
|
const authorizeDeleteResult = await asyncResult(
|
|
777
785
|
this.privacyPolicy.authorizeDeleteAsync(
|
|
778
786
|
this.viewerContext,
|
|
779
787
|
queryContext,
|
|
780
|
-
{ previousValue: null, cascadingDeleteCause },
|
|
788
|
+
{ previousValue: null, cascadingDeleteCause: this.cascadingDeleteCause },
|
|
781
789
|
this.entity,
|
|
782
790
|
this.metricsAdapter,
|
|
783
791
|
),
|
|
@@ -790,20 +798,25 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
790
798
|
this.entity,
|
|
791
799
|
queryContext,
|
|
792
800
|
processedEntityIdentifiersFromTransitiveDeletions,
|
|
793
|
-
cascadingDeleteCause,
|
|
794
801
|
);
|
|
795
802
|
|
|
796
803
|
await this.executeMutationTriggersAsync(
|
|
797
804
|
this.mutationTriggers.beforeAll,
|
|
798
805
|
queryContext,
|
|
799
806
|
this.entity,
|
|
800
|
-
{
|
|
807
|
+
{
|
|
808
|
+
type: EntityMutationType.DELETE,
|
|
809
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
810
|
+
},
|
|
801
811
|
);
|
|
802
812
|
await this.executeMutationTriggersAsync(
|
|
803
813
|
this.mutationTriggers.beforeDelete,
|
|
804
814
|
queryContext,
|
|
805
815
|
this.entity,
|
|
806
|
-
{
|
|
816
|
+
{
|
|
817
|
+
type: EntityMutationType.DELETE,
|
|
818
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
819
|
+
},
|
|
807
820
|
);
|
|
808
821
|
|
|
809
822
|
if (!skipDatabaseDeletion) {
|
|
@@ -816,7 +829,7 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
816
829
|
|
|
817
830
|
const entityLoader = this.entityLoaderFactory.forLoad(this.viewerContext, queryContext, {
|
|
818
831
|
previousValue: null,
|
|
819
|
-
cascadingDeleteCause,
|
|
832
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
820
833
|
});
|
|
821
834
|
|
|
822
835
|
// Invalidate all caches for the entity so that any previously-cached loads
|
|
@@ -837,13 +850,19 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
837
850
|
this.mutationTriggers.afterDelete,
|
|
838
851
|
queryContext,
|
|
839
852
|
this.entity,
|
|
840
|
-
{
|
|
853
|
+
{
|
|
854
|
+
type: EntityMutationType.DELETE,
|
|
855
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
856
|
+
},
|
|
841
857
|
);
|
|
842
858
|
await this.executeMutationTriggersAsync(
|
|
843
859
|
this.mutationTriggers.afterAll,
|
|
844
860
|
queryContext,
|
|
845
861
|
this.entity,
|
|
846
|
-
{
|
|
862
|
+
{
|
|
863
|
+
type: EntityMutationType.DELETE,
|
|
864
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
865
|
+
},
|
|
847
866
|
);
|
|
848
867
|
|
|
849
868
|
queryContext.appendPostCommitCallback(
|
|
@@ -851,7 +870,10 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
851
870
|
this,
|
|
852
871
|
this.mutationTriggers.afterCommit,
|
|
853
872
|
this.entity,
|
|
854
|
-
{
|
|
873
|
+
{
|
|
874
|
+
type: EntityMutationType.DELETE,
|
|
875
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
876
|
+
},
|
|
855
877
|
),
|
|
856
878
|
);
|
|
857
879
|
|
|
@@ -876,7 +898,6 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
876
898
|
entity: TEntity,
|
|
877
899
|
queryContext: EntityTransactionalQueryContext,
|
|
878
900
|
processedEntityIdentifiers: Set<string>,
|
|
879
|
-
cascadingDeleteCause: EntityCascadingDeletionInfo | null,
|
|
880
901
|
): Promise<void> {
|
|
881
902
|
// prevent infinite reference cycles by keeping track of entities already processed
|
|
882
903
|
if (processedEntityIdentifiers.has(entity.getUniqueIdentifier())) {
|
|
@@ -899,7 +920,7 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
899
920
|
|
|
900
921
|
const newCascadingDeleteCause = {
|
|
901
922
|
entity,
|
|
902
|
-
cascadingDeleteCause,
|
|
923
|
+
cascadingDeleteCause: this.cascadingDeleteCause,
|
|
903
924
|
};
|
|
904
925
|
|
|
905
926
|
await Promise.all(
|
|
@@ -949,11 +970,10 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
949
970
|
inboundReferenceEntities.map((inboundReferenceEntity) =>
|
|
950
971
|
enforceAsyncResult(
|
|
951
972
|
mutatorFactory
|
|
952
|
-
.forDelete(inboundReferenceEntity, queryContext)
|
|
973
|
+
.forDelete(inboundReferenceEntity, queryContext, newCascadingDeleteCause)
|
|
953
974
|
.deleteInTransactionAsync(
|
|
954
975
|
processedEntityIdentifiers,
|
|
955
976
|
/* skipDatabaseDeletion */ true, // deletion is handled by DB
|
|
956
|
-
newCascadingDeleteCause,
|
|
957
977
|
),
|
|
958
978
|
),
|
|
959
979
|
),
|
|
@@ -965,11 +985,9 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
965
985
|
inboundReferenceEntities.map((inboundReferenceEntity) =>
|
|
966
986
|
enforceAsyncResult(
|
|
967
987
|
mutatorFactory
|
|
968
|
-
.forUpdate(inboundReferenceEntity, queryContext)
|
|
988
|
+
.forUpdate(inboundReferenceEntity, queryContext, newCascadingDeleteCause)
|
|
969
989
|
.setField(fieldName, null)
|
|
970
|
-
[
|
|
971
|
-
'updateInTransactionAsync'
|
|
972
|
-
](/* skipDatabaseUpdate */ true, newCascadingDeleteCause),
|
|
990
|
+
['updateInTransactionAsync'](/* skipDatabaseUpdate */ true),
|
|
973
991
|
),
|
|
974
992
|
),
|
|
975
993
|
);
|
|
@@ -980,11 +998,9 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
980
998
|
inboundReferenceEntities.map((inboundReferenceEntity) =>
|
|
981
999
|
enforceAsyncResult(
|
|
982
1000
|
mutatorFactory
|
|
983
|
-
.forUpdate(inboundReferenceEntity, queryContext)
|
|
1001
|
+
.forUpdate(inboundReferenceEntity, queryContext, newCascadingDeleteCause)
|
|
984
1002
|
.setField(fieldName, null)
|
|
985
|
-
[
|
|
986
|
-
'updateInTransactionAsync'
|
|
987
|
-
](/* skipDatabaseUpdate */ false, newCascadingDeleteCause),
|
|
1003
|
+
['updateInTransactionAsync'](/* skipDatabaseUpdate */ false),
|
|
988
1004
|
),
|
|
989
1005
|
),
|
|
990
1006
|
);
|
|
@@ -995,11 +1011,10 @@ export class AuthorizationResultBasedDeleteMutator<
|
|
|
995
1011
|
inboundReferenceEntities.map((inboundReferenceEntity) =>
|
|
996
1012
|
enforceAsyncResult(
|
|
997
1013
|
mutatorFactory
|
|
998
|
-
.forDelete(inboundReferenceEntity, queryContext)
|
|
1014
|
+
.forDelete(inboundReferenceEntity, queryContext, newCascadingDeleteCause)
|
|
999
1015
|
.deleteInTransactionAsync(
|
|
1000
1016
|
processedEntityIdentifiers,
|
|
1001
1017
|
/* skipDatabaseDeletion */ false,
|
|
1002
|
-
newCascadingDeleteCause,
|
|
1003
1018
|
),
|
|
1004
1019
|
),
|
|
1005
1020
|
),
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import nullthrows from 'nullthrows';
|
|
2
2
|
|
|
3
|
-
import IEntityCacheAdapter from './IEntityCacheAdapter';
|
|
3
|
+
import { IEntityCacheAdapter } from './IEntityCacheAdapter';
|
|
4
4
|
import { IEntityLoadKey, IEntityLoadValue } from './internal/EntityLoadInterfaces';
|
|
5
|
-
import {
|
|
5
|
+
import { CacheLoadResult, CacheStatus } from './internal/ReadThroughEntityCache';
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* A IEntityCacheAdapter that composes other IEntityCacheAdapter instances.
|
|
9
9
|
*/
|
|
10
|
-
export
|
|
10
|
+
export class ComposedEntityCacheAdapter<
|
|
11
11
|
TFields extends Record<string, any>,
|
|
12
12
|
TIDField extends keyof TFields,
|
|
13
13
|
> implements IEntityCacheAdapter<TFields, TIDField>
|
|
@@ -5,7 +5,7 @@ import { ISecondaryEntityCache } from './EntitySecondaryCacheLoader';
|
|
|
5
5
|
/**
|
|
6
6
|
* A ISecondaryEntityCache that composes other ISecondaryEntityCache instances.
|
|
7
7
|
*/
|
|
8
|
-
export
|
|
8
|
+
export class ComposedSecondaryEntityCache<TLoadParams, TFields extends Record<string, any>>
|
|
9
9
|
implements ISecondaryEntityCache<TFields, TLoadParams>
|
|
10
10
|
{
|
|
11
11
|
/**
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { enforceAsyncResult } from '@expo/results';
|
|
2
2
|
|
|
3
|
-
import
|
|
3
|
+
import {
|
|
4
|
+
AuthorizationResultBasedEntityAssociationLoader,
|
|
4
5
|
EntityLoadThroughDirective,
|
|
5
6
|
} from './AuthorizationResultBasedEntityAssociationLoader';
|
|
6
7
|
import { IEntityClass } from './Entity';
|
|
7
|
-
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
8
|
-
import ReadonlyEntity from './ReadonlyEntity';
|
|
9
|
-
import ViewerContext from './ViewerContext';
|
|
8
|
+
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
|
|
9
|
+
import { ReadonlyEntity } from './ReadonlyEntity';
|
|
10
|
+
import { ViewerContext } from './ViewerContext';
|
|
10
11
|
import { enforceResultsAsync } from './entityUtils';
|
|
11
12
|
|
|
12
13
|
/**
|
|
@@ -14,7 +15,7 @@ import { enforceResultsAsync } from './entityUtils';
|
|
|
14
15
|
* associated with an entity. In relational databases, these entities are often referenced
|
|
15
16
|
* by foreign keys.
|
|
16
17
|
*/
|
|
17
|
-
export
|
|
18
|
+
export class EnforcingEntityAssociationLoader<
|
|
18
19
|
TFields extends Record<string, any>,
|
|
19
20
|
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
20
21
|
TViewerContext extends ViewerContext,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { enforceAsyncResult } from '@expo/results';
|
|
2
2
|
|
|
3
3
|
import { AuthorizationResultBasedCreateMutator } from './AuthorizationResultBasedEntityMutator';
|
|
4
|
-
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
5
|
-
import ReadonlyEntity from './ReadonlyEntity';
|
|
6
|
-
import ViewerContext from './ViewerContext';
|
|
4
|
+
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
|
|
5
|
+
import { ReadonlyEntity } from './ReadonlyEntity';
|
|
6
|
+
import { ViewerContext } from './ViewerContext';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Enforcing entity creator. All updates
|
|
10
10
|
* through this creator will throw if authorization is not successful.
|
|
11
11
|
*/
|
|
12
|
-
export
|
|
12
|
+
export class EnforcingEntityCreator<
|
|
13
13
|
TFields extends Record<string, any>,
|
|
14
14
|
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
15
15
|
TViewerContext extends ViewerContext,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { enforceAsyncResult } from '@expo/results';
|
|
2
2
|
|
|
3
3
|
import { AuthorizationResultBasedDeleteMutator } from './AuthorizationResultBasedEntityMutator';
|
|
4
|
-
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
5
|
-
import ReadonlyEntity from './ReadonlyEntity';
|
|
6
|
-
import ViewerContext from './ViewerContext';
|
|
4
|
+
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
|
|
5
|
+
import { ReadonlyEntity } from './ReadonlyEntity';
|
|
6
|
+
import { ViewerContext } from './ViewerContext';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Enforcing entity deleter. All deletes
|
|
10
10
|
* through this deleter will throw if authorization is not successful.
|
|
11
11
|
*/
|
|
12
|
-
export
|
|
12
|
+
export class EnforcingEntityDeleter<
|
|
13
13
|
TFields extends Record<string, any>,
|
|
14
14
|
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
15
15
|
TViewerContext extends ViewerContext,
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import AuthorizationResultBasedEntityLoader from './AuthorizationResultBasedEntityLoader';
|
|
1
|
+
import { AuthorizationResultBasedEntityLoader } from './AuthorizationResultBasedEntityLoader';
|
|
2
2
|
import { EntityCompositeField, EntityCompositeFieldValue } from './EntityConfiguration';
|
|
3
3
|
import {
|
|
4
4
|
FieldEqualityCondition,
|
|
5
5
|
QuerySelectionModifiers,
|
|
6
6
|
QuerySelectionModifiersWithOrderByRaw,
|
|
7
7
|
} from './EntityDatabaseAdapter';
|
|
8
|
-
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
9
|
-
import ReadonlyEntity from './ReadonlyEntity';
|
|
10
|
-
import ViewerContext from './ViewerContext';
|
|
8
|
+
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
|
|
9
|
+
import { ReadonlyEntity } from './ReadonlyEntity';
|
|
10
|
+
import { ViewerContext } from './ViewerContext';
|
|
11
11
|
import { CompositeFieldValueHolder } from './internal/CompositeFieldHolder';
|
|
12
12
|
import { CompositeFieldValueMap } from './internal/CompositeFieldValueMap';
|
|
13
13
|
import { mapMap } from './utils/collections/maps';
|
|
@@ -17,7 +17,7 @@ import { mapMap } from './utils/collections/maps';
|
|
|
17
17
|
* cached, and authorized against the entity's EntityPrivacyPolicy. All loads
|
|
18
18
|
* through this loader will throw if the load is not successful.
|
|
19
19
|
*/
|
|
20
|
-
export
|
|
20
|
+
export class EnforcingEntityLoader<
|
|
21
21
|
TFields extends Record<string, any>,
|
|
22
22
|
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
23
23
|
TViewerContext extends ViewerContext,
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { enforceAsyncResult } from '@expo/results';
|
|
2
2
|
|
|
3
3
|
import { AuthorizationResultBasedUpdateMutator } from './AuthorizationResultBasedEntityMutator';
|
|
4
|
-
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
5
|
-
import ReadonlyEntity from './ReadonlyEntity';
|
|
6
|
-
import ViewerContext from './ViewerContext';
|
|
4
|
+
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
|
|
5
|
+
import { ReadonlyEntity } from './ReadonlyEntity';
|
|
6
|
+
import { ViewerContext } from './ViewerContext';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* Enforcing entity updater. All updates
|
|
10
10
|
* through this updater will throw if authorization is not successful.
|
|
11
11
|
*/
|
|
12
|
-
export
|
|
12
|
+
export class EnforcingEntityUpdater<
|
|
13
13
|
TFields extends Record<string, any>,
|
|
14
14
|
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
15
15
|
TViewerContext extends ViewerContext,
|
package/src/Entity.ts
CHANGED
|
@@ -3,17 +3,17 @@ import {
|
|
|
3
3
|
AuthorizationResultBasedDeleteMutator,
|
|
4
4
|
AuthorizationResultBasedUpdateMutator,
|
|
5
5
|
} from './AuthorizationResultBasedEntityMutator';
|
|
6
|
-
import EnforcingEntityCreator from './EnforcingEntityCreator';
|
|
7
|
-
import EnforcingEntityDeleter from './EnforcingEntityDeleter';
|
|
8
|
-
import EnforcingEntityUpdater from './EnforcingEntityUpdater';
|
|
6
|
+
import { EnforcingEntityCreator } from './EnforcingEntityCreator';
|
|
7
|
+
import { EnforcingEntityDeleter } from './EnforcingEntityDeleter';
|
|
8
|
+
import { EnforcingEntityUpdater } from './EnforcingEntityUpdater';
|
|
9
9
|
import { EntityCompanionDefinition } from './EntityCompanionProvider';
|
|
10
|
-
import EntityCreator from './EntityCreator';
|
|
11
|
-
import EntityDeleter from './EntityDeleter';
|
|
12
|
-
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
10
|
+
import { EntityCreator } from './EntityCreator';
|
|
11
|
+
import { EntityDeleter } from './EntityDeleter';
|
|
12
|
+
import { EntityPrivacyPolicy } from './EntityPrivacyPolicy';
|
|
13
13
|
import { EntityQueryContext } from './EntityQueryContext';
|
|
14
|
-
import EntityUpdater from './EntityUpdater';
|
|
15
|
-
import ReadonlyEntity from './ReadonlyEntity';
|
|
16
|
-
import ViewerContext from './ViewerContext';
|
|
14
|
+
import { EntityUpdater } from './EntityUpdater';
|
|
15
|
+
import { ReadonlyEntity } from './ReadonlyEntity';
|
|
16
|
+
import { ViewerContext } from './ViewerContext';
|
|
17
17
|
|
|
18
18
|
/**
|
|
19
19
|
* Entity is a privacy-first data model.
|
|
@@ -33,7 +33,7 @@ import ViewerContext from './ViewerContext';
|
|
|
33
33
|
* All concrete entity implementations should extend this class and provide their
|
|
34
34
|
* own EntityCompanionDefinition.
|
|
35
35
|
*/
|
|
36
|
-
export
|
|
36
|
+
export abstract class Entity<
|
|
37
37
|
TFields extends Record<string, any>,
|
|
38
38
|
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
39
39
|
TViewerContext extends ViewerContext,
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import AuthorizationResultBasedEntityAssociationLoader from './AuthorizationResultBasedEntityAssociationLoader';
|
|
2
|
-
import EnforcingEntityAssociationLoader from './EnforcingEntityAssociationLoader';
|
|
1
|
+
import { AuthorizationResultBasedEntityAssociationLoader } from './AuthorizationResultBasedEntityAssociationLoader';
|
|
2
|
+
import { EnforcingEntityAssociationLoader } from './EnforcingEntityAssociationLoader';
|
|
3
3
|
import { IEntityClass } from './Entity';
|
|
4
4
|
import { EntityQueryContext } from './EntityQueryContext';
|
|
5
|
-
import ReadonlyEntity from './ReadonlyEntity';
|
|
6
|
-
import ViewerContext from './ViewerContext';
|
|
5
|
+
import { ReadonlyEntity } from './ReadonlyEntity';
|
|
6
|
+
import { ViewerContext } from './ViewerContext';
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* An association loader is a set of convenience methods for loading entities
|
|
10
10
|
* associated with an entity. In relational databases, these entities are often referenced
|
|
11
11
|
* by foreign keys.
|
|
12
12
|
*/
|
|
13
|
-
export
|
|
13
|
+
export class EntityAssociationLoader<
|
|
14
14
|
TFields extends Record<string, any>,
|
|
15
15
|
TIDField extends keyof NonNullable<Pick<TFields, TSelectedFields>>,
|
|
16
16
|
TViewerContext extends ViewerContext,
|