@expo/entity 0.34.0 → 0.36.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/AuthorizationResultBasedEntityLoader.d.ts +128 -0
- package/build/AuthorizationResultBasedEntityLoader.js +196 -0
- package/build/AuthorizationResultBasedEntityLoader.js.map +1 -0
- package/build/ComposedEntityCacheAdapter.js +1 -0
- package/build/ComposedEntityCacheAdapter.js.map +1 -1
- package/build/ComposedSecondaryEntityCache.js +1 -0
- package/build/ComposedSecondaryEntityCache.js.map +1 -1
- package/build/EnforcingEntityLoader.d.ts +5 -4
- package/build/EnforcingEntityLoader.js +4 -2
- package/build/EnforcingEntityLoader.js.map +1 -1
- package/build/Entity.d.ts +4 -31
- package/build/Entity.js +19 -46
- package/build/Entity.js.map +1 -1
- package/build/EntityAssociationLoader.d.ts +9 -9
- package/build/EntityAssociationLoader.js +37 -12
- package/build/EntityAssociationLoader.js.map +1 -1
- package/build/EntityCompanion.js +9 -1
- package/build/EntityCompanion.js.map +1 -1
- package/build/EntityCompanionProvider.d.ts +3 -1
- package/build/EntityCompanionProvider.js +10 -4
- package/build/EntityCompanionProvider.js.map +1 -1
- package/build/EntityConfiguration.d.ts +2 -1
- package/build/EntityConfiguration.js +19 -1
- package/build/EntityConfiguration.js.map +1 -1
- package/build/EntityDatabaseAdapter.d.ts +2 -2
- package/build/EntityDatabaseAdapter.js +5 -3
- package/build/EntityDatabaseAdapter.js.map +1 -1
- package/build/EntityFieldDefinition.d.ts +21 -10
- package/build/EntityFieldDefinition.js +8 -9
- package/build/EntityFieldDefinition.js.map +1 -1
- package/build/EntityFields.d.ts +10 -0
- package/build/EntityFields.js +15 -1
- package/build/EntityFields.js.map +1 -1
- package/build/EntityLoader.d.ts +12 -125
- package/build/EntityLoader.js +24 -239
- package/build/EntityLoader.js.map +1 -1
- package/build/EntityLoaderFactory.d.ts +1 -1
- package/build/EntityLoaderFactory.js +3 -0
- package/build/EntityLoaderFactory.js.map +1 -1
- package/build/EntityLoaderUtils.d.ts +58 -0
- package/build/EntityLoaderUtils.js +109 -0
- package/build/EntityLoaderUtils.js.map +1 -0
- package/build/EntityMutator.d.ts +1 -0
- package/build/EntityMutator.js +71 -56
- package/build/EntityMutator.js.map +1 -1
- package/build/EntityMutatorFactory.js +9 -0
- package/build/EntityMutatorFactory.js.map +1 -1
- package/build/EntityPrivacyPolicy.d.ts +11 -5
- package/build/EntityPrivacyPolicy.js +5 -7
- package/build/EntityPrivacyPolicy.js.map +1 -1
- package/build/EntityQueryContext.d.ts +2 -1
- package/build/EntityQueryContext.js +11 -6
- package/build/EntityQueryContext.js.map +1 -1
- package/build/EntityQueryContextProvider.d.ts +1 -1
- package/build/EntityQueryContextProvider.js +1 -1
- package/build/EntityQueryContextProvider.js.map +1 -1
- package/build/EntitySecondaryCacheLoader.js +5 -1
- package/build/EntitySecondaryCacheLoader.js.map +1 -1
- package/build/GenericEntityCacheAdapter.js +1 -0
- package/build/GenericEntityCacheAdapter.js.map +1 -1
- package/build/GenericSecondaryEntityCache.js +2 -0
- package/build/GenericSecondaryEntityCache.js.map +1 -1
- package/build/IEntityCacheAdapterProvider.d.ts +1 -1
- package/build/IEntityDatabaseAdapterProvider.d.ts +1 -1
- package/build/ReadonlyEntity.d.ts +1 -1
- package/build/ReadonlyEntity.js +9 -2
- package/build/ReadonlyEntity.js.map +1 -1
- package/build/ViewerContext.d.ts +2 -2
- package/build/ViewerContext.js +5 -3
- package/build/ViewerContext.js.map +1 -1
- package/build/ViewerScopedEntityCompanion.js +2 -0
- package/build/ViewerScopedEntityCompanion.js.map +1 -1
- package/build/ViewerScopedEntityCompanionProvider.d.ts +0 -1
- package/build/ViewerScopedEntityCompanionProvider.js +2 -1
- package/build/ViewerScopedEntityCompanionProvider.js.map +1 -1
- package/build/ViewerScopedEntityLoaderFactory.d.ts +1 -1
- package/build/ViewerScopedEntityLoaderFactory.js +2 -0
- package/build/ViewerScopedEntityLoaderFactory.js.map +1 -1
- package/build/ViewerScopedEntityMutatorFactory.js +2 -0
- package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
- package/build/__tests__/ComposedCacheAdapter-test.js +2 -0
- package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
- package/build/__tests__/ComposedSecondaryEntityCache-test.js +1 -0
- package/build/__tests__/ComposedSecondaryEntityCache-test.js.map +1 -1
- package/build/__tests__/EnforcingEntityLoader-test.js +101 -113
- package/build/__tests__/EnforcingEntityLoader-test.js.map +1 -1
- package/build/__tests__/Entity-test.js +5 -137
- package/build/__tests__/Entity-test.js.map +1 -1
- package/build/__tests__/EntityAssociationLoader-test.js +37 -65
- package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
- package/build/__tests__/EntityCommonUseCases-test.js +31 -37
- package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
- package/build/__tests__/EntityCompanion-test.js +26 -3
- package/build/__tests__/EntityCompanion-test.js.map +1 -1
- package/build/__tests__/EntityConfiguration-test.js +103 -0
- package/build/__tests__/EntityConfiguration-test.js.map +1 -0
- package/build/__tests__/EntityDatabaseAdapter-test.js +6 -0
- package/build/__tests__/EntityDatabaseAdapter-test.js.map +1 -1
- package/build/__tests__/EntityEdges-test.js +89 -80
- package/build/__tests__/EntityEdges-test.js.map +1 -1
- package/build/__tests__/EntityFields-test.js +6 -0
- package/build/__tests__/EntityFields-test.js.map +1 -1
- package/build/__tests__/EntityLoader-constructor-test.js +17 -18
- package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
- package/build/__tests__/EntityLoader-test.js +93 -41
- package/build/__tests__/EntityLoader-test.js.map +1 -1
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +18 -21
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
- package/build/__tests__/EntityMutator-test.js +74 -29
- package/build/__tests__/EntityMutator-test.js.map +1 -1
- package/build/__tests__/EntityPrivacyPolicy-test.js +77 -59
- package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
- package/build/__tests__/EntityQueryContext-test.js +9 -0
- package/build/__tests__/EntityQueryContext-test.js.map +1 -1
- package/build/__tests__/EntitySecondaryCacheLoader-test.js +10 -10
- package/build/__tests__/EntitySecondaryCacheLoader-test.js.map +1 -1
- package/build/__tests__/EntitySelfReferentialEdges-test.js +59 -74
- package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
- package/build/__tests__/ReadonlyEntity-test.js +13 -13
- package/build/__tests__/ReadonlyEntity-test.js.map +1 -1
- package/build/__tests__/ViewerContext-test.js +2 -2
- package/build/__tests__/ViewerContext-test.js.map +1 -1
- package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +26 -28
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +25 -30
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js.map +1 -1
- package/build/entityUtils.d.ts +1 -1
- package/build/entityUtils.js.map +1 -1
- package/build/errors/EntityCacheAdapterError.js +2 -5
- package/build/errors/EntityCacheAdapterError.js.map +1 -1
- package/build/errors/EntityDatabaseAdapterError.js +14 -35
- package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
- package/build/errors/EntityError.js +1 -0
- package/build/errors/EntityError.js.map +1 -1
- package/build/errors/EntityInvalidFieldValueError.js +2 -2
- package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
- package/build/errors/EntityNotAuthorizedError.js +3 -2
- package/build/errors/EntityNotAuthorizedError.js.map +1 -1
- package/build/errors/EntityNotFoundError.js +2 -2
- package/build/errors/EntityNotFoundError.js.map +1 -1
- package/build/index.d.ts +1 -0
- package/build/index.js +1 -0
- package/build/index.js.map +1 -1
- package/build/internal/EntityDataManager.d.ts +1 -1
- package/build/internal/EntityDataManager.js +7 -2
- package/build/internal/EntityDataManager.js.map +1 -1
- package/build/internal/EntityFieldTransformationUtils.d.ts +5 -5
- package/build/internal/EntityFieldTransformationUtils.js +5 -8
- package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
- package/build/internal/EntityTableDataCoordinator.d.ts +1 -1
- package/build/internal/EntityTableDataCoordinator.js +5 -0
- package/build/internal/EntityTableDataCoordinator.js.map +1 -1
- package/build/internal/ReadThroughEntityCache.d.ts +1 -1
- package/build/internal/ReadThroughEntityCache.js +2 -0
- package/build/internal/ReadThroughEntityCache.js.map +1 -1
- package/build/internal/__tests__/EntityDataManager-test.js +11 -11
- package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
- package/build/internal/__tests__/EntityFieldTransformationUtils-test.js +6 -2
- package/build/internal/__tests__/EntityFieldTransformationUtils-test.js.map +1 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.js +33 -0
- package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
- package/build/metrics/IEntityMetricsAdapter.d.ts +1 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.d.ts +1 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.d.ts +1 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.d.ts +1 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
- package/build/rules/PrivacyPolicyRule.d.ts +1 -1
- package/build/rules/PrivacyPolicyRule.js.map +1 -1
- package/build/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.js.map +1 -1
- package/build/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.js.map +1 -1
- package/build/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.js.map +1 -1
- package/build/testfixtures/DateIDTestEntity.js +12 -15
- package/build/testfixtures/DateIDTestEntity.js.map +1 -1
- package/build/testfixtures/SimpleTestEntity.d.ts +8 -8
- package/build/testfixtures/SimpleTestEntity.js +12 -15
- package/build/testfixtures/SimpleTestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity.d.ts +12 -12
- package/build/testfixtures/TestEntity.js +12 -15
- package/build/testfixtures/TestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity2.d.ts +8 -8
- package/build/testfixtures/TestEntity2.js +12 -15
- package/build/testfixtures/TestEntity2.js.map +1 -1
- package/build/testfixtures/TestEntityNumberKey.js +12 -15
- package/build/testfixtures/TestEntityNumberKey.js.map +1 -1
- package/build/testfixtures/TestEntityWithMutationTriggers.d.ts +36 -0
- package/build/testfixtures/TestEntityWithMutationTriggers.js +82 -0
- package/build/testfixtures/TestEntityWithMutationTriggers.js.map +1 -0
- package/build/testfixtures/TestViewerContext.d.ts +0 -3
- package/build/testfixtures/TestViewerContext.js +0 -6
- package/build/testfixtures/TestViewerContext.js.map +1 -1
- package/build/utils/EntityPrivacyUtils.d.ts +34 -0
- package/build/utils/EntityPrivacyUtils.js +160 -0
- package/build/utils/EntityPrivacyUtils.js.map +1 -0
- package/build/utils/__tests__/EntityPrivacyUtils-test.d.ts +1 -0
- package/build/utils/__tests__/EntityPrivacyUtils-test.js +395 -0
- package/build/utils/__tests__/EntityPrivacyUtils-test.js.map +1 -0
- package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.d.ts +1 -0
- package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js +26 -0
- package/build/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.js.map +1 -0
- package/build/utils/collections/maps.js.map +1 -1
- package/build/utils/mergeEntityMutationTriggerConfigurations.d.ts +4 -0
- package/build/utils/mergeEntityMutationTriggerConfigurations.js +28 -0
- package/build/utils/mergeEntityMutationTriggerConfigurations.js.map +1 -0
- package/build/utils/testing/PrivacyPolicyRuleTestUtils.d.ts +1 -1
- package/build/utils/testing/PrivacyPolicyRuleTestUtils.js.map +1 -1
- package/build/utils/testing/StubCacheAdapter.d.ts +3 -3
- package/build/utils/testing/StubCacheAdapter.js +3 -3
- package/build/utils/testing/StubCacheAdapter.js.map +1 -1
- package/build/utils/testing/StubDatabaseAdapter.d.ts +2 -2
- package/build/utils/testing/StubDatabaseAdapter.js +4 -2
- package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
- package/build/utils/testing/StubDatabaseAdapterProvider.d.ts +1 -1
- package/build/utils/testing/StubDatabaseAdapterProvider.js +1 -3
- package/build/utils/testing/StubDatabaseAdapterProvider.js.map +1 -1
- package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.d.ts +1 -0
- package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js +42 -0
- package/build/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.js.map +1 -0
- package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js +53 -0
- package/build/utils/testing/__tests__/StubDatabaseAdapter-test.js.map +1 -1
- package/build/utils/testing/describeFieldTestCase.js.map +1 -1
- package/package.json +4 -3
- package/src/AuthorizationResultBasedEntityLoader.ts +297 -0
- package/src/ComposedEntityCacheAdapter.ts +6 -6
- package/src/ComposedSecondaryEntityCache.ts +8 -8
- package/src/EnforcingEntityLoader.ts +20 -19
- package/src/Entity.ts +26 -118
- package/src/EntityAssociationLoader.ts +56 -41
- package/src/EntityCompanion.ts +8 -4
- package/src/EntityCompanionProvider.ts +24 -16
- package/src/EntityConfiguration.ts +18 -7
- package/src/EntityDatabaseAdapter.ts +41 -41
- package/src/EntityFieldDefinition.ts +28 -18
- package/src/EntityFields.ts +15 -0
- package/src/EntityLoader.ts +63 -357
- package/src/EntityLoaderFactory.ts +10 -4
- package/src/EntityLoaderUtils.ts +149 -0
- package/src/EntityMutationInfo.ts +2 -2
- package/src/EntityMutationTriggerConfiguration.ts +5 -5
- package/src/EntityMutationValidator.ts +2 -2
- package/src/EntityMutator.ts +146 -144
- package/src/EntityMutatorFactory.ts +8 -8
- package/src/EntityPrivacyPolicy.ts +78 -28
- package/src/EntityQueryContext.ts +14 -13
- package/src/EntityQueryContextProvider.ts +6 -6
- package/src/EntitySecondaryCacheLoader.ts +13 -11
- package/src/GenericEntityCacheAdapter.ts +10 -10
- package/src/GenericSecondaryEntityCache.ts +6 -6
- package/src/IEntityCacheAdapter.ts +4 -4
- package/src/IEntityCacheAdapterProvider.ts +2 -2
- package/src/IEntityDatabaseAdapterProvider.ts +2 -2
- package/src/ReadonlyEntity.ts +8 -5
- package/src/ViewerContext.ts +10 -10
- package/src/ViewerScopedEntityCompanion.ts +4 -4
- package/src/ViewerScopedEntityCompanionProvider.ts +4 -5
- package/src/ViewerScopedEntityLoaderFactory.ts +10 -4
- package/src/ViewerScopedEntityMutatorFactory.ts +5 -5
- package/src/__tests__/ComposedCacheAdapter-test.ts +12 -10
- package/src/__tests__/ComposedSecondaryEntityCache-test.ts +8 -8
- package/src/__tests__/EnforcingEntityLoader-test.ts +236 -159
- package/src/__tests__/Entity-test.ts +5 -223
- package/src/__tests__/EntityAssociationLoader-test.ts +91 -169
- package/src/__tests__/EntityCommonUseCases-test.ts +36 -38
- package/src/__tests__/EntityCompanion-test.ts +57 -5
- package/src/__tests__/EntityConfiguration-test.ts +118 -0
- package/src/__tests__/EntityDatabaseAdapter-test.ts +11 -11
- package/src/__tests__/EntityEdges-test.ts +128 -118
- package/src/__tests__/EntityFields-test.ts +14 -2
- package/src/__tests__/EntityLoader-constructor-test.ts +21 -8
- package/src/__tests__/EntityLoader-test.ts +233 -105
- package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +17 -20
- package/src/__tests__/EntityMutator-test.ts +342 -163
- package/src/__tests__/EntityPrivacyPolicy-test.ts +166 -53
- package/src/__tests__/EntityQueryContext-test.ts +30 -12
- package/src/__tests__/EntitySecondaryCacheLoader-test.ts +17 -26
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +67 -115
- package/src/__tests__/GenericEntityCacheAdapter-test.ts +2 -2
- package/src/__tests__/ReadonlyEntity-test.ts +13 -15
- package/src/__tests__/ViewerContext-test.ts +3 -4
- package/src/__tests__/ViewerScopedEntityCompanion-test.ts +2 -2
- package/src/__tests__/ViewerScopedEntityCompanionProvider-test.ts +2 -2
- package/src/__tests__/ViewerScopedEntityLoaderFactory-test.ts +2 -1
- package/src/__tests__/cases/TwoEntitySameTableDisjointRows-test.ts +34 -45
- package/src/__tests__/cases/TwoEntitySameTableOverlappingRows-test.ts +22 -30
- package/src/__tests__/entityUtils-test.ts +2 -2
- package/src/entityUtils.ts +4 -4
- package/src/errors/EntityError.ts +4 -1
- package/src/errors/EntityInvalidFieldValueError.ts +2 -2
- package/src/errors/EntityNotAuthorizedError.ts +3 -3
- package/src/errors/EntityNotFoundError.ts +2 -2
- package/src/index.ts +1 -0
- package/src/internal/EntityDataManager.ts +25 -25
- package/src/internal/EntityFieldTransformationUtils.ts +39 -32
- package/src/internal/EntityTableDataCoordinator.ts +3 -3
- package/src/internal/ReadThroughEntityCache.ts +9 -9
- package/src/internal/__tests__/EntityDataManager-test.ts +62 -62
- package/src/internal/__tests__/EntityFieldTransformationUtils-test.ts +14 -10
- package/src/internal/__tests__/ReadThroughEntityCache-test.ts +74 -18
- package/src/metrics/EntityMetricsUtils.ts +4 -4
- package/src/metrics/IEntityMetricsAdapter.ts +1 -1
- package/src/rules/AlwaysAllowPrivacyPolicyRule.ts +9 -3
- package/src/rules/AlwaysDenyPrivacyPolicyRule.ts +9 -3
- package/src/rules/AlwaysSkipPrivacyPolicyRule.ts +9 -3
- package/src/rules/PrivacyPolicyRule.ts +9 -3
- package/src/rules/__tests__/AlwaysAllowPrivacyPolicyRule-test.ts +2 -1
- package/src/rules/__tests__/AlwaysDenyPrivacyPolicyRule-test.ts +2 -1
- package/src/rules/__tests__/AlwaysSkipPrivacyPolicyRule-test.ts +2 -1
- package/src/testfixtures/SimpleTestEntity.ts +8 -8
- package/src/testfixtures/TestEntity.ts +13 -16
- package/src/testfixtures/TestEntity2.ts +8 -8
- package/src/testfixtures/TestEntityWithMutationTriggers.ts +156 -0
- package/src/testfixtures/TestViewerContext.ts +1 -12
- package/src/utils/EntityPrivacyUtils.ts +325 -0
- package/src/utils/__tests__/EntityPrivacyUtils-test.ts +570 -0
- package/src/utils/__tests__/mergeEntityMutationTriggerConfigurations-test.ts +29 -0
- package/src/utils/collections/__tests__/maps-test.ts +2 -2
- package/src/utils/collections/maps.ts +11 -11
- package/src/utils/mergeEntityMutationTriggerConfigurations.ts +44 -0
- package/src/utils/testing/PrivacyPolicyRuleTestUtils.ts +25 -22
- package/src/utils/testing/StubCacheAdapter.ts +17 -15
- package/src/utils/testing/StubDatabaseAdapter.ts +35 -30
- package/src/utils/testing/StubDatabaseAdapterProvider.ts +2 -2
- package/src/utils/testing/StubQueryContextProvider.ts +2 -2
- package/src/utils/testing/__tests__/PrivacyPolicyRuleTestUtils-test.ts +42 -0
- package/src/utils/testing/__tests__/StubDatabaseAdapter-test.ts +111 -29
- package/src/utils/testing/createUnitTestEntityCompanionProvider.ts +2 -2
- package/src/utils/testing/describeFieldTestCase.ts +1 -1
- package/build/__tests__/EntityDataConfiguration-test.js +0 -68
- package/build/__tests__/EntityDataConfiguration-test.js.map +0 -1
- package/src/__tests__/EntityDataConfiguration-test.ts +0 -77
- /package/build/__tests__/{EntityDataConfiguration-test.d.ts → EntityConfiguration-test.d.ts} +0 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { Result } from '@expo/results';
|
|
2
|
+
import { IEntityClass } from './Entity';
|
|
3
|
+
import EntityConfiguration from './EntityConfiguration';
|
|
4
|
+
import { FieldEqualityCondition, QuerySelectionModifiers, QuerySelectionModifiersWithOrderByRaw } from './EntityDatabaseAdapter';
|
|
5
|
+
import EntityLoaderUtils from './EntityLoaderUtils';
|
|
6
|
+
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
7
|
+
import { EntityQueryContext } from './EntityQueryContext';
|
|
8
|
+
import ReadonlyEntity from './ReadonlyEntity';
|
|
9
|
+
import ViewerContext from './ViewerContext';
|
|
10
|
+
import EntityDataManager from './internal/EntityDataManager';
|
|
11
|
+
import IEntityMetricsAdapter from './metrics/IEntityMetricsAdapter';
|
|
12
|
+
/**
|
|
13
|
+
* Authorization-result-based entity loader. All normal loads are batched,
|
|
14
|
+
* cached, and authorized against the entity's EntityPrivacyPolicy. All loads through this
|
|
15
|
+
* loader are are results (or null for some loader methods), where an unsuccessful result
|
|
16
|
+
* means an authorization error or entity construction error occurred. Other errors are thrown.
|
|
17
|
+
*/
|
|
18
|
+
export default class AuthorizationResultBasedEntityLoader<TFields extends object, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>, TPrivacyPolicy extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity, TSelectedFields>, TSelectedFields extends keyof TFields> {
|
|
19
|
+
private readonly queryContext;
|
|
20
|
+
private readonly entityConfiguration;
|
|
21
|
+
private readonly entityClass;
|
|
22
|
+
private readonly dataManager;
|
|
23
|
+
protected readonly metricsAdapter: IEntityMetricsAdapter;
|
|
24
|
+
private readonly utils;
|
|
25
|
+
constructor(queryContext: EntityQueryContext, entityConfiguration: EntityConfiguration<TFields>, entityClass: IEntityClass<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>, dataManager: EntityDataManager<TFields>, metricsAdapter: IEntityMetricsAdapter, utils: EntityLoaderUtils<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>);
|
|
26
|
+
/**
|
|
27
|
+
* Load many entities where fieldName is one of fieldValues.
|
|
28
|
+
* @param fieldName - entity field being queried
|
|
29
|
+
* @param fieldValues - fieldName field values being queried
|
|
30
|
+
* @returns map from fieldValue to entity results that match the query for that fieldValue,
|
|
31
|
+
* where result errors can be UnauthorizedError
|
|
32
|
+
*/
|
|
33
|
+
loadManyByFieldEqualingManyAsync<N extends keyof Pick<TFields, TSelectedFields>>(fieldName: N, fieldValues: readonly NonNullable<TFields[N]>[]): Promise<ReadonlyMap<NonNullable<TFields[N]>, readonly Result<TEntity>[]>>;
|
|
34
|
+
/**
|
|
35
|
+
* Load many entities where fieldName equals fieldValue.
|
|
36
|
+
* @param fieldName - entity field being queried
|
|
37
|
+
* @param fieldValue - fieldName field value being queried
|
|
38
|
+
* @returns array of entity results that match the query for fieldValue, where result error can be UnauthorizedError
|
|
39
|
+
*/
|
|
40
|
+
loadManyByFieldEqualingAsync<N extends keyof Pick<TFields, TSelectedFields>>(fieldName: N, fieldValue: NonNullable<TFields[N]>): Promise<readonly Result<TEntity>[]>;
|
|
41
|
+
/**
|
|
42
|
+
* Load an entity where fieldName equals fieldValue, or null if no entity exists.
|
|
43
|
+
* @param uniqueFieldName - entity field being queried
|
|
44
|
+
* @param fieldValue - uniqueFieldName field value being queried
|
|
45
|
+
* @returns entity result where uniqueFieldName equals fieldValue, or null if no entity matches the condition.
|
|
46
|
+
* @throws when multiple entities match the condition
|
|
47
|
+
*/
|
|
48
|
+
loadByFieldEqualingAsync<N extends keyof Pick<TFields, TSelectedFields>>(uniqueFieldName: N, fieldValue: NonNullable<TFields[N]>): Promise<Result<TEntity> | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Loads an entity by a specified ID.
|
|
51
|
+
* @param id - ID of the entity
|
|
52
|
+
* @returns entity result for matching ID, where result error can be UnauthorizedError or EntityNotFoundError.
|
|
53
|
+
*/
|
|
54
|
+
loadByIDAsync(id: TID): Promise<Result<TEntity>>;
|
|
55
|
+
/**
|
|
56
|
+
* Load an entity by a specified ID, or return null if non-existent.
|
|
57
|
+
* @param id - ID of the entity
|
|
58
|
+
* @returns entity result for matching ID, or null if no entity exists for ID.
|
|
59
|
+
*/
|
|
60
|
+
loadByIDNullableAsync(id: TID): Promise<Result<TEntity> | null>;
|
|
61
|
+
/**
|
|
62
|
+
* Loads many entities for a list of IDs.
|
|
63
|
+
* @param ids - IDs of the entities to load
|
|
64
|
+
* @returns map from ID to corresponding entity result, where result error can be UnauthorizedError or EntityNotFoundError.
|
|
65
|
+
*/
|
|
66
|
+
loadManyByIDsAsync(ids: readonly TID[]): Promise<ReadonlyMap<TID, Result<TEntity>>>;
|
|
67
|
+
/**
|
|
68
|
+
* Loads many entities for a list of IDs, returning null for any IDs that are non-existent.
|
|
69
|
+
* @param ids - IDs of the entities to load
|
|
70
|
+
* @returns map from ID to nullable corresponding entity result, where result error can be UnauthorizedError or EntityNotFoundError.
|
|
71
|
+
*/
|
|
72
|
+
loadManyByIDsNullableAsync(ids: readonly TID[]): Promise<ReadonlyMap<TID, Result<TEntity> | null>>;
|
|
73
|
+
/**
|
|
74
|
+
* Loads the first entity matching the selection constructed from the conjunction of specified
|
|
75
|
+
* operands, or null if no matching entity exists. Entities loaded using this method are not
|
|
76
|
+
* batched or cached.
|
|
77
|
+
*
|
|
78
|
+
* This is a convenience method for {@link loadManyByFieldEqualityConjunctionAsync}. However, the
|
|
79
|
+
* `orderBy` option must be specified to define what "first" means. If ordering doesn't matter,
|
|
80
|
+
* explicitly pass in an empty array.
|
|
81
|
+
*
|
|
82
|
+
* @param fieldEqualityOperands - list of field equality selection operand specifications
|
|
83
|
+
* @param querySelectionModifiers - orderBy and optional offset for the query
|
|
84
|
+
* @returns the first entity results that matches the query, where result error can be
|
|
85
|
+
* UnauthorizedError
|
|
86
|
+
*/
|
|
87
|
+
loadFirstByFieldEqualityConjunctionAsync<N extends keyof Pick<TFields, TSelectedFields>>(fieldEqualityOperands: FieldEqualityCondition<TFields, N>[], querySelectionModifiers: Omit<QuerySelectionModifiers<TFields>, 'limit'> & Required<Pick<QuerySelectionModifiers<TFields>, 'orderBy'>>): Promise<Result<TEntity> | null>;
|
|
88
|
+
/**
|
|
89
|
+
* Loads many entities matching the selection constructed from the conjunction of specified operands.
|
|
90
|
+
* Entities loaded using this method are not batched or cached.
|
|
91
|
+
*
|
|
92
|
+
* @example
|
|
93
|
+
* fieldEqualityOperands:
|
|
94
|
+
* `[{fieldName: 'hello', fieldValue: 1}, {fieldName: 'world', fieldValues: [2, 3]}]`
|
|
95
|
+
* Entities returned with a SQL EntityDatabaseAdapter:
|
|
96
|
+
* `WHERE hello = 1 AND world = ANY({2, 3})`
|
|
97
|
+
*
|
|
98
|
+
* @param fieldEqualityOperands - list of field equality selection operand specifications
|
|
99
|
+
* @param querySelectionModifiers - limit, offset, and orderBy for the query
|
|
100
|
+
* @returns array of entity results that match the query, where result error can be UnauthorizedError
|
|
101
|
+
*/
|
|
102
|
+
loadManyByFieldEqualityConjunctionAsync<N extends keyof Pick<TFields, TSelectedFields>>(fieldEqualityOperands: FieldEqualityCondition<TFields, N>[], querySelectionModifiers?: QuerySelectionModifiers<TFields>): Promise<readonly Result<TEntity>[]>;
|
|
103
|
+
/**
|
|
104
|
+
* Loads many entities matching the raw WHERE clause. Corresponds to the knex `whereRaw` argument format.
|
|
105
|
+
*
|
|
106
|
+
* @remarks
|
|
107
|
+
* Important notes:
|
|
108
|
+
* - Fields in clause are database column names instead of transformed entity field names.
|
|
109
|
+
* - Entities loaded using this method are not batched or cached.
|
|
110
|
+
* - Not all database adapters implement the ability to execute this method of fetching entities.
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* rawWhereClause: `id = ?`
|
|
114
|
+
* bindings: `[1]`
|
|
115
|
+
* Entites returned `WHERE id = 1`
|
|
116
|
+
*
|
|
117
|
+
* http://knexjs.org/#Builder-whereRaw
|
|
118
|
+
* http://knexjs.org/#Raw-Bindings
|
|
119
|
+
*
|
|
120
|
+
* @param rawWhereClause - parameterized SQL WHERE clause with positional binding placeholders or named binding placeholders
|
|
121
|
+
* @param bindings - array of positional bindings or object of named bindings
|
|
122
|
+
* @param querySelectionModifiers - limit, offset, orderBy, and orderByRaw for the query
|
|
123
|
+
* @returns array of entity results that match the query, where result error can be UnauthorizedError
|
|
124
|
+
* @throws Error when rawWhereClause or bindings are invalid
|
|
125
|
+
*/
|
|
126
|
+
loadManyByRawWhereClauseAsync(rawWhereClause: string, bindings: any[] | object, querySelectionModifiers?: QuerySelectionModifiersWithOrderByRaw<TFields>): Promise<readonly Result<TEntity>[]>;
|
|
127
|
+
private validateFieldValues;
|
|
128
|
+
}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const results_1 = require("@expo/results");
|
|
7
|
+
const invariant_1 = __importDefault(require("invariant"));
|
|
8
|
+
const nullthrows_1 = __importDefault(require("nullthrows"));
|
|
9
|
+
const EntityDatabaseAdapter_1 = require("./EntityDatabaseAdapter");
|
|
10
|
+
const EntityInvalidFieldValueError_1 = __importDefault(require("./errors/EntityInvalidFieldValueError"));
|
|
11
|
+
const EntityNotFoundError_1 = __importDefault(require("./errors/EntityNotFoundError"));
|
|
12
|
+
const maps_1 = require("./utils/collections/maps");
|
|
13
|
+
/**
|
|
14
|
+
* Authorization-result-based entity loader. All normal loads are batched,
|
|
15
|
+
* cached, and authorized against the entity's EntityPrivacyPolicy. All loads through this
|
|
16
|
+
* loader are are results (or null for some loader methods), where an unsuccessful result
|
|
17
|
+
* means an authorization error or entity construction error occurred. Other errors are thrown.
|
|
18
|
+
*/
|
|
19
|
+
class AuthorizationResultBasedEntityLoader {
|
|
20
|
+
queryContext;
|
|
21
|
+
entityConfiguration;
|
|
22
|
+
entityClass;
|
|
23
|
+
dataManager;
|
|
24
|
+
metricsAdapter;
|
|
25
|
+
utils;
|
|
26
|
+
constructor(queryContext, entityConfiguration, entityClass, dataManager, metricsAdapter, utils) {
|
|
27
|
+
this.queryContext = queryContext;
|
|
28
|
+
this.entityConfiguration = entityConfiguration;
|
|
29
|
+
this.entityClass = entityClass;
|
|
30
|
+
this.dataManager = dataManager;
|
|
31
|
+
this.metricsAdapter = metricsAdapter;
|
|
32
|
+
this.utils = utils;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Load many entities where fieldName is one of fieldValues.
|
|
36
|
+
* @param fieldName - entity field being queried
|
|
37
|
+
* @param fieldValues - fieldName field values being queried
|
|
38
|
+
* @returns map from fieldValue to entity results that match the query for that fieldValue,
|
|
39
|
+
* where result errors can be UnauthorizedError
|
|
40
|
+
*/
|
|
41
|
+
async loadManyByFieldEqualingManyAsync(fieldName, fieldValues) {
|
|
42
|
+
this.validateFieldValues(fieldName, fieldValues);
|
|
43
|
+
const fieldValuesToFieldObjects = await this.dataManager.loadManyByFieldEqualingAsync(this.queryContext, fieldName, fieldValues);
|
|
44
|
+
return await this.utils.constructAndAuthorizeEntitiesAsync(fieldValuesToFieldObjects);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Load many entities where fieldName equals fieldValue.
|
|
48
|
+
* @param fieldName - entity field being queried
|
|
49
|
+
* @param fieldValue - fieldName field value being queried
|
|
50
|
+
* @returns array of entity results that match the query for fieldValue, where result error can be UnauthorizedError
|
|
51
|
+
*/
|
|
52
|
+
async loadManyByFieldEqualingAsync(fieldName, fieldValue) {
|
|
53
|
+
const entityResults = await this.loadManyByFieldEqualingManyAsync(fieldName, [fieldValue]);
|
|
54
|
+
const entityResultsForFieldValue = entityResults.get(fieldValue);
|
|
55
|
+
(0, invariant_1.default)(entityResultsForFieldValue !== undefined, `${fieldValue} should be guaranteed to be present in returned map of entities`);
|
|
56
|
+
return entityResultsForFieldValue;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Load an entity where fieldName equals fieldValue, or null if no entity exists.
|
|
60
|
+
* @param uniqueFieldName - entity field being queried
|
|
61
|
+
* @param fieldValue - uniqueFieldName field value being queried
|
|
62
|
+
* @returns entity result where uniqueFieldName equals fieldValue, or null if no entity matches the condition.
|
|
63
|
+
* @throws when multiple entities match the condition
|
|
64
|
+
*/
|
|
65
|
+
async loadByFieldEqualingAsync(uniqueFieldName, fieldValue) {
|
|
66
|
+
const entityResults = await this.loadManyByFieldEqualingAsync(uniqueFieldName, fieldValue);
|
|
67
|
+
(0, invariant_1.default)(entityResults.length <= 1, `loadByFieldEqualing: Multiple entities of type ${this.entityClass.name} found for ${String(uniqueFieldName)}=${fieldValue}`);
|
|
68
|
+
return entityResults[0] ?? null;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Loads an entity by a specified ID.
|
|
72
|
+
* @param id - ID of the entity
|
|
73
|
+
* @returns entity result for matching ID, where result error can be UnauthorizedError or EntityNotFoundError.
|
|
74
|
+
*/
|
|
75
|
+
async loadByIDAsync(id) {
|
|
76
|
+
const entityResults = await this.loadManyByIDsAsync([id]);
|
|
77
|
+
// loadManyByIDsAsync is always populated for each id supplied
|
|
78
|
+
return (0, nullthrows_1.default)(entityResults.get(id));
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Load an entity by a specified ID, or return null if non-existent.
|
|
82
|
+
* @param id - ID of the entity
|
|
83
|
+
* @returns entity result for matching ID, or null if no entity exists for ID.
|
|
84
|
+
*/
|
|
85
|
+
async loadByIDNullableAsync(id) {
|
|
86
|
+
return await this.loadByFieldEqualingAsync(this.entityConfiguration.idField, id);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Loads many entities for a list of IDs.
|
|
90
|
+
* @param ids - IDs of the entities to load
|
|
91
|
+
* @returns map from ID to corresponding entity result, where result error can be UnauthorizedError or EntityNotFoundError.
|
|
92
|
+
*/
|
|
93
|
+
async loadManyByIDsAsync(ids) {
|
|
94
|
+
const entityResults = (await this.loadManyByFieldEqualingManyAsync(this.entityConfiguration.idField, ids));
|
|
95
|
+
return (0, maps_1.mapMap)(entityResults, (entityResultsForId, id) => {
|
|
96
|
+
const entityResult = entityResultsForId[0];
|
|
97
|
+
return (entityResult ??
|
|
98
|
+
(0, results_1.result)(new EntityNotFoundError_1.default(this.entityClass, this.entityConfiguration.idField, id)));
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Loads many entities for a list of IDs, returning null for any IDs that are non-existent.
|
|
103
|
+
* @param ids - IDs of the entities to load
|
|
104
|
+
* @returns map from ID to nullable corresponding entity result, where result error can be UnauthorizedError or EntityNotFoundError.
|
|
105
|
+
*/
|
|
106
|
+
async loadManyByIDsNullableAsync(ids) {
|
|
107
|
+
const entityResults = (await this.loadManyByFieldEqualingManyAsync(this.entityConfiguration.idField, ids));
|
|
108
|
+
return (0, maps_1.mapMap)(entityResults, (entityResultsForId) => {
|
|
109
|
+
return entityResultsForId[0] ?? null;
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Loads the first entity matching the selection constructed from the conjunction of specified
|
|
114
|
+
* operands, or null if no matching entity exists. Entities loaded using this method are not
|
|
115
|
+
* batched or cached.
|
|
116
|
+
*
|
|
117
|
+
* This is a convenience method for {@link loadManyByFieldEqualityConjunctionAsync}. However, the
|
|
118
|
+
* `orderBy` option must be specified to define what "first" means. If ordering doesn't matter,
|
|
119
|
+
* explicitly pass in an empty array.
|
|
120
|
+
*
|
|
121
|
+
* @param fieldEqualityOperands - list of field equality selection operand specifications
|
|
122
|
+
* @param querySelectionModifiers - orderBy and optional offset for the query
|
|
123
|
+
* @returns the first entity results that matches the query, where result error can be
|
|
124
|
+
* UnauthorizedError
|
|
125
|
+
*/
|
|
126
|
+
async loadFirstByFieldEqualityConjunctionAsync(fieldEqualityOperands, querySelectionModifiers) {
|
|
127
|
+
const results = await this.loadManyByFieldEqualityConjunctionAsync(fieldEqualityOperands, {
|
|
128
|
+
...querySelectionModifiers,
|
|
129
|
+
limit: 1,
|
|
130
|
+
});
|
|
131
|
+
return results[0] ?? null;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Loads many entities matching the selection constructed from the conjunction of specified operands.
|
|
135
|
+
* Entities loaded using this method are not batched or cached.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* fieldEqualityOperands:
|
|
139
|
+
* `[{fieldName: 'hello', fieldValue: 1}, {fieldName: 'world', fieldValues: [2, 3]}]`
|
|
140
|
+
* Entities returned with a SQL EntityDatabaseAdapter:
|
|
141
|
+
* `WHERE hello = 1 AND world = ANY({2, 3})`
|
|
142
|
+
*
|
|
143
|
+
* @param fieldEqualityOperands - list of field equality selection operand specifications
|
|
144
|
+
* @param querySelectionModifiers - limit, offset, and orderBy for the query
|
|
145
|
+
* @returns array of entity results that match the query, where result error can be UnauthorizedError
|
|
146
|
+
*/
|
|
147
|
+
async loadManyByFieldEqualityConjunctionAsync(fieldEqualityOperands, querySelectionModifiers = {}) {
|
|
148
|
+
for (const fieldEqualityOperand of fieldEqualityOperands) {
|
|
149
|
+
const fieldValues = (0, EntityDatabaseAdapter_1.isSingleValueFieldEqualityCondition)(fieldEqualityOperand)
|
|
150
|
+
? [fieldEqualityOperand.fieldValue]
|
|
151
|
+
: fieldEqualityOperand.fieldValues;
|
|
152
|
+
this.validateFieldValues(fieldEqualityOperand.fieldName, fieldValues);
|
|
153
|
+
}
|
|
154
|
+
const fieldObjects = await this.dataManager.loadManyByFieldEqualityConjunctionAsync(this.queryContext, fieldEqualityOperands, querySelectionModifiers);
|
|
155
|
+
return await this.utils.constructAndAuthorizeEntitiesArrayAsync(fieldObjects);
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Loads many entities matching the raw WHERE clause. Corresponds to the knex `whereRaw` argument format.
|
|
159
|
+
*
|
|
160
|
+
* @remarks
|
|
161
|
+
* Important notes:
|
|
162
|
+
* - Fields in clause are database column names instead of transformed entity field names.
|
|
163
|
+
* - Entities loaded using this method are not batched or cached.
|
|
164
|
+
* - Not all database adapters implement the ability to execute this method of fetching entities.
|
|
165
|
+
*
|
|
166
|
+
* @example
|
|
167
|
+
* rawWhereClause: `id = ?`
|
|
168
|
+
* bindings: `[1]`
|
|
169
|
+
* Entites returned `WHERE id = 1`
|
|
170
|
+
*
|
|
171
|
+
* http://knexjs.org/#Builder-whereRaw
|
|
172
|
+
* http://knexjs.org/#Raw-Bindings
|
|
173
|
+
*
|
|
174
|
+
* @param rawWhereClause - parameterized SQL WHERE clause with positional binding placeholders or named binding placeholders
|
|
175
|
+
* @param bindings - array of positional bindings or object of named bindings
|
|
176
|
+
* @param querySelectionModifiers - limit, offset, orderBy, and orderByRaw for the query
|
|
177
|
+
* @returns array of entity results that match the query, where result error can be UnauthorizedError
|
|
178
|
+
* @throws Error when rawWhereClause or bindings are invalid
|
|
179
|
+
*/
|
|
180
|
+
async loadManyByRawWhereClauseAsync(rawWhereClause, bindings, querySelectionModifiers = {}) {
|
|
181
|
+
const fieldObjects = await this.dataManager.loadManyByRawWhereClauseAsync(this.queryContext, rawWhereClause, bindings, querySelectionModifiers);
|
|
182
|
+
return await this.utils.constructAndAuthorizeEntitiesArrayAsync(fieldObjects);
|
|
183
|
+
}
|
|
184
|
+
validateFieldValues(fieldName, fieldValues) {
|
|
185
|
+
const fieldDefinition = this.entityConfiguration.schema.get(fieldName);
|
|
186
|
+
(0, invariant_1.default)(fieldDefinition, `must have field definition for field = ${String(fieldName)}`);
|
|
187
|
+
for (const fieldValue of fieldValues) {
|
|
188
|
+
const isInputValid = fieldDefinition.validateInputValue(fieldValue);
|
|
189
|
+
if (!isInputValid) {
|
|
190
|
+
throw new EntityInvalidFieldValueError_1.default(this.entityClass, fieldName, fieldValue);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
exports.default = AuthorizationResultBasedEntityLoader;
|
|
196
|
+
//# sourceMappingURL=AuthorizationResultBasedEntityLoader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthorizationResultBasedEntityLoader.js","sourceRoot":"","sources":["../src/AuthorizationResultBasedEntityLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ const ReadThroughEntityCache_1 = require("./internal/ReadThroughEntityCache");
|
|
|
9
9
|
* A IEntityCacheAdapter that composes other IEntityCacheAdapter instances.
|
|
10
10
|
*/
|
|
11
11
|
class ComposedEntityCacheAdapter {
|
|
12
|
+
cacheAdapters;
|
|
12
13
|
/**
|
|
13
14
|
* @param cacheAdapters - list of cache adapters to compose in order of precedence.
|
|
14
15
|
* Earlier cache adapters are read from first and written to (including invalidations) last.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposedEntityCacheAdapter.js","sourceRoot":"","sources":["../src/ComposedEntityCacheAdapter.ts"],"names":[],"mappings":";;;;;AAAA,4DAAoC;AAGpC,8EAAiF;AAEjF;;GAEG;AACH,MAAqB,0BAA0B;
|
|
1
|
+
{"version":3,"file":"ComposedEntityCacheAdapter.js","sourceRoot":"","sources":["../src/ComposedEntityCacheAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ const nullthrows_1 = __importDefault(require("nullthrows"));
|
|
|
8
8
|
* A ISecondaryEntityCache that composes other ISecondaryEntityCache instances.
|
|
9
9
|
*/
|
|
10
10
|
class ComposedSecondaryEntityCache {
|
|
11
|
+
secondaryEntityCaches;
|
|
11
12
|
/**
|
|
12
13
|
* @param secondaryEntityCaches - list of caches to compose in order of precedence.
|
|
13
14
|
* Earlier caches are read from first and written to (including invalidations) last.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ComposedSecondaryEntityCache.js","sourceRoot":"","sources":["../src/ComposedSecondaryEntityCache.ts"],"names":[],"mappings":";;;;;AAAA,4DAAoC;AAIpC;;GAEG;AACH,MAAqB,4BAA4B;
|
|
1
|
+
{"version":3,"file":"ComposedSecondaryEntityCache.js","sourceRoot":"","sources":["../src/ComposedSecondaryEntityCache.ts"],"names":[],"mappings":";;;;;AAAA,4DAAoC;AAIpC;;GAEG;AACH,MAAqB,4BAA4B;IAS5B;IANnB;;;;OAIG;IACH,YACmB,qBAAoE;QAApE,0BAAqB,GAArB,qBAAqB,CAA+C;IACpF,CAAC;IAEJ,KAAK,CAAC,oBAAoB,CACxB,eAAiD,EACjD,OAE0E;QAE1E,OAAO,MAAM,4BAA4B,CAAC,+BAA+B,CACvE,IAAI,CAAC,qBAAqB,EAC1B,eAAe,EACf,OAAO,CACR,CAAC;IACJ,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAClD,qBAAoE,EACpE,eAAiD,EACjD,OAE0E;QAE1E,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,CAAC,UAAU,EAAE,GAAG,UAAU,CAAC,GAAG,qBAAqB,CAAC;QAE1D,OAAO,MAAM,IAAA,oBAAU,EAAC,UAAU,CAAC,CAAC,oBAAoB,CACtD,eAAe,EACf,CAAC,sBAAsB,EAAE,EAAE,CACzB,4BAA4B,CAAC,+BAA+B,CAC1D,UAAU,EACV,sBAAsB,EACtB,OAAO,CACR,CACJ,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,eAAiD;QACzE,gCAAgC;QAChC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAChE,MAAM,oBAAoB,GAAG,IAAA,oBAAU,EAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,MAAM,oBAAoB,CAAC,mBAAmB,CAAC,eAAe,CAAC,CAAC;QAClE,CAAC;IACH,CAAC;CACF;AAxDD,+CAwDC"}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+
import AuthorizationResultBasedEntityLoader from './AuthorizationResultBasedEntityLoader';
|
|
1
2
|
import { FieldEqualityCondition, QuerySelectionModifiers, QuerySelectionModifiersWithOrderByRaw } from './EntityDatabaseAdapter';
|
|
2
|
-
import EntityLoader from './EntityLoader';
|
|
3
3
|
import EntityPrivacyPolicy from './EntityPrivacyPolicy';
|
|
4
4
|
import ReadonlyEntity from './ReadonlyEntity';
|
|
5
5
|
import ViewerContext from './ViewerContext';
|
|
6
6
|
/**
|
|
7
|
-
* Enforcing
|
|
8
|
-
*
|
|
7
|
+
* Enforcing entity loader. All normal loads are batched,
|
|
8
|
+
* cached, and authorized against the entity's EntityPrivacyPolicy. All loads
|
|
9
|
+
* through this loader will throw if the load is not successful.
|
|
9
10
|
*/
|
|
10
11
|
export default class EnforcingEntityLoader<TFields extends object, TID extends NonNullable<TFields[TSelectedFields]>, TViewerContext extends ViewerContext, TEntity extends ReadonlyEntity<TFields, TID, TViewerContext, TSelectedFields>, TPrivacyPolicy extends EntityPrivacyPolicy<TFields, TID, TViewerContext, TEntity, TSelectedFields>, TSelectedFields extends keyof TFields> {
|
|
11
12
|
private readonly entityLoader;
|
|
12
|
-
constructor(entityLoader:
|
|
13
|
+
constructor(entityLoader: AuthorizationResultBasedEntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields>);
|
|
13
14
|
/**
|
|
14
15
|
* Enforcing version of entity loader method by the same name.
|
|
15
16
|
* @throws EntityNotAuthorizedError when viewer is not authorized to view one or more of the returned entities
|
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const maps_1 = require("./utils/collections/maps");
|
|
4
4
|
/**
|
|
5
|
-
* Enforcing
|
|
6
|
-
*
|
|
5
|
+
* Enforcing entity loader. All normal loads are batched,
|
|
6
|
+
* cached, and authorized against the entity's EntityPrivacyPolicy. All loads
|
|
7
|
+
* through this loader will throw if the load is not successful.
|
|
7
8
|
*/
|
|
8
9
|
class EnforcingEntityLoader {
|
|
10
|
+
entityLoader;
|
|
9
11
|
constructor(entityLoader) {
|
|
10
12
|
this.entityLoader = entityLoader;
|
|
11
13
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnforcingEntityLoader.js","sourceRoot":"","sources":["../src/EnforcingEntityLoader.ts"],"names":[],"mappings":";;AASA,mDAAkD;AAElD
|
|
1
|
+
{"version":3,"file":"EnforcingEntityLoader.js","sourceRoot":"","sources":["../src/EnforcingEntityLoader.ts"],"names":[],"mappings":"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"}
|
package/build/Entity.d.ts
CHANGED
|
@@ -30,53 +30,26 @@ export default abstract class Entity<TFields extends object, TID extends NonNull
|
|
|
30
30
|
* @param queryContext - query context in which to perform the create
|
|
31
31
|
* @returns mutator for creating an entity
|
|
32
32
|
*/
|
|
33
|
-
static creator<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMViewerContext2 extends TMViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, viewerContext: TMViewerContext2, queryContext
|
|
33
|
+
static creator<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMViewerContext2 extends TMViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, viewerContext: TMViewerContext2, queryContext?: EntityQueryContext): CreateMutator<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>;
|
|
34
34
|
/**
|
|
35
35
|
* Vend mutator for updating an existing entity in given query context.
|
|
36
36
|
* @param existingEntity - entity to update
|
|
37
37
|
* @param queryContext - query context in which to perform the update
|
|
38
38
|
* @returns mutator for updating existingEntity
|
|
39
39
|
*/
|
|
40
|
-
static updater<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, existingEntity: TMEntity, queryContext
|
|
40
|
+
static updater<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, existingEntity: TMEntity, queryContext?: EntityQueryContext): UpdateMutator<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>;
|
|
41
41
|
/**
|
|
42
42
|
* Delete an existing entity in given query context.
|
|
43
43
|
* @param existingEntity - entity to delete
|
|
44
44
|
* @param queryContext - query context in which to perform the delete
|
|
45
45
|
*/
|
|
46
|
-
static deleteAsync<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, existingEntity: TMEntity, queryContext
|
|
46
|
+
static deleteAsync<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, existingEntity: TMEntity, queryContext?: EntityQueryContext): Promise<Result<void>>;
|
|
47
47
|
/**
|
|
48
48
|
* Delete an existing entity in given query context, throwing if deletion is unsuccessful.
|
|
49
49
|
* @param existingEntity - entity to delete
|
|
50
50
|
* @param queryContext - query context in which to perform the delete
|
|
51
51
|
*/
|
|
52
|
-
static enforceDeleteAsync<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, existingEntity: TMEntity, queryContext
|
|
53
|
-
/**
|
|
54
|
-
* Check whether an entity loaded by a viewer can be updated by that same viewer.
|
|
55
|
-
*
|
|
56
|
-
* @remarks
|
|
57
|
-
*
|
|
58
|
-
* This may be useful in situations relying upon the thrown privacy policy thrown authorization error
|
|
59
|
-
* is insufficient for the task at hand. When dealing with purely a sequence of mutations it is easy
|
|
60
|
-
* to roll back all mutations given a single authorization error by wrapping them in a single transaction.
|
|
61
|
-
* When certain portions of a mutation cannot be rolled back transactionally (third pary calls,
|
|
62
|
-
* legacy code, etc), using this method can help decide whether the sequence of mutations will fail before
|
|
63
|
-
* attempting them. Note that if any privacy policy rules use a piece of data being updated in the mutations
|
|
64
|
-
* the result of this method and the update mutation itself may differ.
|
|
65
|
-
*
|
|
66
|
-
* @param existingEntity - entity loaded by viewer
|
|
67
|
-
* @param queryContext - query context in which to perform the check
|
|
68
|
-
*/
|
|
69
|
-
static canViewerUpdateAsync<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, existingEntity: TMEntity, queryContext: EntityQueryContext): Promise<boolean>;
|
|
70
|
-
/**
|
|
71
|
-
* Check whether an entity loaded by a viewer can be deleted by that same viewer.
|
|
72
|
-
*
|
|
73
|
-
* @remarks
|
|
74
|
-
* See remarks for canViewerUpdate.
|
|
75
|
-
*
|
|
76
|
-
* @param existingEntity - entity loaded by viewer
|
|
77
|
-
* @param queryContext - query context in which to perform the check
|
|
78
|
-
*/
|
|
79
|
-
static canViewerDeleteAsync<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, existingEntity: TMEntity, queryContext: EntityQueryContext): Promise<boolean>;
|
|
52
|
+
static enforceDeleteAsync<TMFields extends object, TMID extends NonNullable<TMFields[TMSelectedFields]>, TMViewerContext extends ViewerContext, TMEntity extends Entity<TMFields, TMID, TMViewerContext, TMSelectedFields>, TMPrivacyPolicy extends EntityPrivacyPolicy<TMFields, TMID, TMViewerContext, TMEntity, TMSelectedFields>, TMSelectedFields extends keyof TMFields = keyof TMFields>(this: IEntityClass<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields>, existingEntity: TMEntity, queryContext?: EntityQueryContext): Promise<void>;
|
|
80
53
|
}
|
|
81
54
|
/**
|
|
82
55
|
* An interface to pass in constructor (class) of an Entity as a function argument.
|
package/build/Entity.js
CHANGED
|
@@ -3,7 +3,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
const results_1 = require("@expo/results");
|
|
7
6
|
const ReadonlyEntity_1 = __importDefault(require("./ReadonlyEntity"));
|
|
8
7
|
/**
|
|
9
8
|
* Entity is a privacy-first data model.
|
|
@@ -30,7 +29,10 @@ class Entity extends ReadonlyEntity_1.default {
|
|
|
30
29
|
* @param queryContext - query context in which to perform the create
|
|
31
30
|
* @returns mutator for creating an entity
|
|
32
31
|
*/
|
|
33
|
-
static creator(viewerContext, queryContext
|
|
32
|
+
static creator(viewerContext, queryContext = viewerContext
|
|
33
|
+
.getViewerScopedEntityCompanionForClass(this)
|
|
34
|
+
.getQueryContextProvider()
|
|
35
|
+
.getQueryContext()) {
|
|
34
36
|
return viewerContext
|
|
35
37
|
.getViewerScopedEntityCompanionForClass(this)
|
|
36
38
|
.getMutatorFactory()
|
|
@@ -42,7 +44,11 @@ class Entity extends ReadonlyEntity_1.default {
|
|
|
42
44
|
* @param queryContext - query context in which to perform the update
|
|
43
45
|
* @returns mutator for updating existingEntity
|
|
44
46
|
*/
|
|
45
|
-
static updater(existingEntity, queryContext
|
|
47
|
+
static updater(existingEntity, queryContext = existingEntity
|
|
48
|
+
.getViewerContext()
|
|
49
|
+
.getViewerScopedEntityCompanionForClass(this)
|
|
50
|
+
.getQueryContextProvider()
|
|
51
|
+
.getQueryContext()) {
|
|
46
52
|
return existingEntity
|
|
47
53
|
.getViewerContext()
|
|
48
54
|
.getViewerScopedEntityCompanionForClass(this)
|
|
@@ -54,7 +60,11 @@ class Entity extends ReadonlyEntity_1.default {
|
|
|
54
60
|
* @param existingEntity - entity to delete
|
|
55
61
|
* @param queryContext - query context in which to perform the delete
|
|
56
62
|
*/
|
|
57
|
-
static deleteAsync(existingEntity, queryContext
|
|
63
|
+
static deleteAsync(existingEntity, queryContext = existingEntity
|
|
64
|
+
.getViewerContext()
|
|
65
|
+
.getViewerScopedEntityCompanionForClass(this)
|
|
66
|
+
.getQueryContextProvider()
|
|
67
|
+
.getQueryContext()) {
|
|
58
68
|
return existingEntity
|
|
59
69
|
.getViewerContext()
|
|
60
70
|
.getViewerScopedEntityCompanionForClass(this)
|
|
@@ -67,7 +77,11 @@ class Entity extends ReadonlyEntity_1.default {
|
|
|
67
77
|
* @param existingEntity - entity to delete
|
|
68
78
|
* @param queryContext - query context in which to perform the delete
|
|
69
79
|
*/
|
|
70
|
-
static enforceDeleteAsync(existingEntity, queryContext
|
|
80
|
+
static enforceDeleteAsync(existingEntity, queryContext = existingEntity
|
|
81
|
+
.getViewerContext()
|
|
82
|
+
.getViewerScopedEntityCompanionForClass(this)
|
|
83
|
+
.getQueryContextProvider()
|
|
84
|
+
.getQueryContext()) {
|
|
71
85
|
return existingEntity
|
|
72
86
|
.getViewerContext()
|
|
73
87
|
.getViewerScopedEntityCompanionForClass(this)
|
|
@@ -75,47 +89,6 @@ class Entity extends ReadonlyEntity_1.default {
|
|
|
75
89
|
.forDelete(existingEntity, queryContext)
|
|
76
90
|
.enforceDeleteAsync();
|
|
77
91
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Check whether an entity loaded by a viewer can be updated by that same viewer.
|
|
80
|
-
*
|
|
81
|
-
* @remarks
|
|
82
|
-
*
|
|
83
|
-
* This may be useful in situations relying upon the thrown privacy policy thrown authorization error
|
|
84
|
-
* is insufficient for the task at hand. When dealing with purely a sequence of mutations it is easy
|
|
85
|
-
* to roll back all mutations given a single authorization error by wrapping them in a single transaction.
|
|
86
|
-
* When certain portions of a mutation cannot be rolled back transactionally (third pary calls,
|
|
87
|
-
* legacy code, etc), using this method can help decide whether the sequence of mutations will fail before
|
|
88
|
-
* attempting them. Note that if any privacy policy rules use a piece of data being updated in the mutations
|
|
89
|
-
* the result of this method and the update mutation itself may differ.
|
|
90
|
-
*
|
|
91
|
-
* @param existingEntity - entity loaded by viewer
|
|
92
|
-
* @param queryContext - query context in which to perform the check
|
|
93
|
-
*/
|
|
94
|
-
static async canViewerUpdateAsync(existingEntity, queryContext) {
|
|
95
|
-
const companion = existingEntity
|
|
96
|
-
.getViewerContext()
|
|
97
|
-
.getViewerScopedEntityCompanionForClass(this);
|
|
98
|
-
const privacyPolicy = companion.entityCompanion.privacyPolicy;
|
|
99
|
-
const evaluationResult = await (0, results_1.asyncResult)(privacyPolicy.authorizeUpdateAsync(existingEntity.getViewerContext(), queryContext, { cascadingDeleteCause: null }, existingEntity, companion.getMetricsAdapter()));
|
|
100
|
-
return evaluationResult.ok;
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Check whether an entity loaded by a viewer can be deleted by that same viewer.
|
|
104
|
-
*
|
|
105
|
-
* @remarks
|
|
106
|
-
* See remarks for canViewerUpdate.
|
|
107
|
-
*
|
|
108
|
-
* @param existingEntity - entity loaded by viewer
|
|
109
|
-
* @param queryContext - query context in which to perform the check
|
|
110
|
-
*/
|
|
111
|
-
static async canViewerDeleteAsync(existingEntity, queryContext) {
|
|
112
|
-
const companion = existingEntity
|
|
113
|
-
.getViewerContext()
|
|
114
|
-
.getViewerScopedEntityCompanionForClass(this);
|
|
115
|
-
const privacyPolicy = companion.entityCompanion.privacyPolicy;
|
|
116
|
-
const evaluationResult = await (0, results_1.asyncResult)(privacyPolicy.authorizeDeleteAsync(existingEntity.getViewerContext(), queryContext, { cascadingDeleteCause: null }, existingEntity, companion.getMetricsAdapter()));
|
|
117
|
-
return evaluationResult.ok;
|
|
118
|
-
}
|
|
119
92
|
}
|
|
120
93
|
exports.default = Entity;
|
|
121
94
|
//# sourceMappingURL=Entity.js.map
|
package/build/Entity.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":";;;;;AAMA,sEAA8C;AAG9C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAA8B,MAK5B,SAAQ,wBAA6D;IACrE;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAuBZ,aAA+B,EAC/B,eAAmC,aAAa;SAC7C,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QAEpB,OAAO,aAAa;aACjB,sCAAsC,CAAC,IAAI,CAAC;aAC5C,iBAAiB,EAAE;aACnB,SAAS,CAAC,YAAY,CAAC,CAAC;IAC7B,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,OAAO,CAsBZ,cAAwB,EACxB,eAAmC,cAAc;SAC9C,gBAAgB,EAAE;SAClB,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QAEpB,OAAO,cAAc;aAClB,gBAAgB,EAAE;aAClB,sCAAsC,CAAC,IAAI,CAAC;aAC5C,iBAAiB,EAAE;aACnB,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC;IAC7C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,WAAW,CAsBhB,cAAwB,EACxB,eAAmC,cAAc;SAC9C,gBAAgB,EAAE;SAClB,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QAEpB,OAAO,cAAc;aAClB,gBAAgB,EAAE;aAClB,sCAAsC,CAAC,IAAI,CAAC;aAC5C,iBAAiB,EAAE;aACnB,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC;aACvC,WAAW,EAAE,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,kBAAkB,CAsBvB,cAAwB,EACxB,eAAmC,cAAc;SAC9C,gBAAgB,EAAE;SAClB,sCAAsC,CAAC,IAAI,CAAC;SAC5C,uBAAuB,EAAE;SACzB,eAAe,EAAE;QAEpB,OAAO,cAAc;aAClB,gBAAgB,EAAE;aAClB,sCAAsC,CAAC,IAAI,CAAC;aAC5C,iBAAiB,EAAE;aACnB,SAAS,CAAC,cAAc,EAAE,YAAY,CAAC;aACvC,kBAAkB,EAAE,CAAC;IAC1B,CAAC;CACF;AA5KD,yBA4KC"}
|