@expo/entity 0.35.0 → 0.37.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 +0 -27
- package/build/Entity.js +0 -50
- package/build/Entity.js.map +1 -1
- package/build/EntityAssociationLoader.d.ts +1 -1
- package/build/EntityAssociationLoader.js +17 -8
- 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/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.js +5 -1
- package/build/ReadonlyEntity.js.map +1 -1
- package/build/ViewerContext.js +2 -0
- 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 +0 -132
- package/build/__tests__/Entity-test.js.map +1 -1
- package/build/__tests__/EntityAssociationLoader-test.js +6 -2
- package/build/__tests__/EntityAssociationLoader-test.js.map +1 -1
- package/build/__tests__/EntityCommonUseCases-test.js +24 -22
- 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 +61 -20
- 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 +16 -17
- package/build/__tests__/EntityLoader-constructor-test.js.map +1 -1
- package/build/__tests__/EntityLoader-test.js +74 -22
- package/build/__tests__/EntityLoader-test.js.map +1 -1
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js +12 -15
- package/build/__tests__/EntityMutator-MutationCacheConsistency-test.js.map +1 -1
- package/build/__tests__/EntityMutator-test.js +54 -9
- 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__/EntitySelfReferentialEdges-test.js +42 -25
- package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
- package/build/__tests__/ViewerScopedEntityLoaderFactory-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js +20 -18
- package/build/__tests__/cases/TwoEntitySameTableDisjointRows-test.js.map +1 -1
- package/build/__tests__/cases/TwoEntitySameTableOverlappingRows-test.js +12 -15
- 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 +26 -20
- package/build/index.js +38 -28
- package/build/index.js.map +1 -1
- package/build/internal/EntityDataManager.d.ts +1 -1
- package/build/internal/EntityDataManager.js +6 -1
- 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__/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.js +12 -15
- package/build/testfixtures/SimpleTestEntity.js.map +1 -1
- package/build/testfixtures/TestEntity.js +12 -15
- package/build/testfixtures/TestEntity.js.map +1 -1
- 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/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 +5 -4
- 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 +11 -126
- package/src/EntityAssociationLoader.ts +40 -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 +5 -5
- 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 +5 -5
- package/src/ViewerContext.ts +5 -5
- 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 +0 -202
- package/src/__tests__/EntityAssociationLoader-test.ts +29 -25
- package/src/__tests__/EntityCommonUseCases-test.ts +29 -13
- 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 +108 -36
- package/src/__tests__/EntityFields-test.ts +14 -2
- package/src/__tests__/EntityLoader-constructor-test.ts +20 -7
- package/src/__tests__/EntityLoader-test.ts +214 -86
- package/src/__tests__/EntityMutator-MutationCacheConsistency-test.ts +2 -2
- package/src/__tests__/EntityMutator-test.ts +281 -96
- package/src/__tests__/EntityPrivacyPolicy-test.ts +166 -53
- package/src/__tests__/EntityQueryContext-test.ts +30 -12
- package/src/__tests__/EntitySecondaryCacheLoader-test.ts +7 -7
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +46 -26
- package/src/__tests__/GenericEntityCacheAdapter-test.ts +2 -2
- package/src/__tests__/ViewerContext-test.ts +1 -1
- 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 +19 -19
- 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 +26 -20
- package/src/internal/EntityDataManager.ts +24 -24
- 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 +51 -51
- 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/TestEntity.ts +1 -1
- package/src/testfixtures/TestEntityWithMutationTriggers.ts +156 -0
- 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
|
@@ -9,7 +9,7 @@ export default interface IEntityCacheAdapterProvider {
|
|
|
9
9
|
/**
|
|
10
10
|
* Vend a cache adapter for an entity configuration.
|
|
11
11
|
*/
|
|
12
|
-
getCacheAdapter<TFields
|
|
13
|
-
entityConfiguration: EntityConfiguration<TFields
|
|
12
|
+
getCacheAdapter<TFields extends Record<string, any>>(
|
|
13
|
+
entityConfiguration: EntityConfiguration<TFields>,
|
|
14
14
|
): IEntityCacheAdapter<TFields>;
|
|
15
15
|
}
|
|
@@ -9,7 +9,7 @@ export default interface IEntityDatabaseAdapterProvider {
|
|
|
9
9
|
/**
|
|
10
10
|
* Vend a database adapter.
|
|
11
11
|
*/
|
|
12
|
-
getDatabaseAdapter<TFields
|
|
13
|
-
entityConfiguration: EntityConfiguration<TFields
|
|
12
|
+
getDatabaseAdapter<TFields extends Record<string, any>>(
|
|
13
|
+
entityConfiguration: EntityConfiguration<TFields>,
|
|
14
14
|
): EntityDatabaseAdapter<TFields>;
|
|
15
15
|
}
|
package/src/ReadonlyEntity.ts
CHANGED
|
@@ -19,7 +19,7 @@ export default abstract class ReadonlyEntity<
|
|
|
19
19
|
TFields extends object,
|
|
20
20
|
TID extends NonNullable<TFields[TSelectedFields]>,
|
|
21
21
|
TViewerContext extends ViewerContext,
|
|
22
|
-
TSelectedFields extends keyof TFields = keyof TFields
|
|
22
|
+
TSelectedFields extends keyof TFields = keyof TFields,
|
|
23
23
|
> {
|
|
24
24
|
private readonly viewerContext: TViewerContext;
|
|
25
25
|
private readonly id: TID;
|
|
@@ -100,7 +100,7 @@ export default abstract class ReadonlyEntity<
|
|
|
100
100
|
* @returns the value of the field or undefined if not loaded with that field
|
|
101
101
|
*/
|
|
102
102
|
getField<K extends keyof Pick<TFields, TSelectedFields>>(
|
|
103
|
-
fieldName: K
|
|
103
|
+
fieldName: K,
|
|
104
104
|
): Pick<TFields, TSelectedFields>[K] {
|
|
105
105
|
return this.selectedFields[fieldName];
|
|
106
106
|
}
|
|
@@ -137,7 +137,7 @@ export default abstract class ReadonlyEntity<
|
|
|
137
137
|
TMEntity,
|
|
138
138
|
TMSelectedFields
|
|
139
139
|
>,
|
|
140
|
-
TMSelectedFields extends keyof TMFields = keyof TMFields
|
|
140
|
+
TMSelectedFields extends keyof TMFields = keyof TMFields,
|
|
141
141
|
>(
|
|
142
142
|
this: IEntityClass<
|
|
143
143
|
TMFields,
|
|
@@ -151,11 +151,11 @@ export default abstract class ReadonlyEntity<
|
|
|
151
151
|
queryContext: EntityQueryContext = viewerContext
|
|
152
152
|
.getViewerScopedEntityCompanionForClass(this)
|
|
153
153
|
.getQueryContextProvider()
|
|
154
|
-
.getQueryContext()
|
|
154
|
+
.getQueryContext(),
|
|
155
155
|
): EntityLoader<TMFields, TMID, TMViewerContext, TMEntity, TMPrivacyPolicy, TMSelectedFields> {
|
|
156
156
|
return viewerContext
|
|
157
157
|
.getViewerScopedEntityCompanionForClass(this)
|
|
158
158
|
.getLoaderFactory()
|
|
159
|
-
.forLoad(queryContext, { cascadingDeleteCause: null });
|
|
159
|
+
.forLoad(queryContext, { previousValue: null, cascadingDeleteCause: null });
|
|
160
160
|
}
|
|
161
161
|
}
|
package/src/ViewerContext.ts
CHANGED
|
@@ -22,7 +22,7 @@ export default class ViewerContext {
|
|
|
22
22
|
constructor(public readonly entityCompanionProvider: EntityCompanionProvider) {
|
|
23
23
|
this.viewerScopedEntityCompanionProvider = new ViewerScopedEntityCompanionProvider(
|
|
24
24
|
entityCompanionProvider,
|
|
25
|
-
this
|
|
25
|
+
this,
|
|
26
26
|
);
|
|
27
27
|
}
|
|
28
28
|
|
|
@@ -42,7 +42,7 @@ export default class ViewerContext {
|
|
|
42
42
|
TMEntity,
|
|
43
43
|
TMSelectedFields
|
|
44
44
|
>,
|
|
45
|
-
TMSelectedFields extends keyof TMFields
|
|
45
|
+
TMSelectedFields extends keyof TMFields,
|
|
46
46
|
>(
|
|
47
47
|
entityClass: IEntityClass<
|
|
48
48
|
TMFields,
|
|
@@ -51,7 +51,7 @@ export default class ViewerContext {
|
|
|
51
51
|
TMEntity,
|
|
52
52
|
TMPrivacyPolicy,
|
|
53
53
|
TMSelectedFields
|
|
54
|
-
|
|
54
|
+
>,
|
|
55
55
|
): ViewerScopedEntityCompanion<
|
|
56
56
|
TMFields,
|
|
57
57
|
TMID,
|
|
@@ -68,7 +68,7 @@ export default class ViewerContext {
|
|
|
68
68
|
* @param databaseAdaptorFlavor - database adaptor flavor
|
|
69
69
|
*/
|
|
70
70
|
getQueryContextForDatabaseAdaptorFlavor(
|
|
71
|
-
databaseAdaptorFlavor: DatabaseAdapterFlavor
|
|
71
|
+
databaseAdaptorFlavor: DatabaseAdapterFlavor,
|
|
72
72
|
): EntityQueryContext {
|
|
73
73
|
return this.entityCompanionProvider
|
|
74
74
|
.getQueryContextProviderForDatabaseAdaptorFlavor(databaseAdaptorFlavor)
|
|
@@ -84,7 +84,7 @@ export default class ViewerContext {
|
|
|
84
84
|
async runInTransactionForDatabaseAdaptorFlavorAsync<TResult>(
|
|
85
85
|
databaseAdaptorFlavor: DatabaseAdapterFlavor,
|
|
86
86
|
transactionScope: (queryContext: EntityTransactionalQueryContext) => Promise<TResult>,
|
|
87
|
-
transactionConfig?: TransactionConfig
|
|
87
|
+
transactionConfig?: TransactionConfig,
|
|
88
88
|
): Promise<TResult> {
|
|
89
89
|
return await this.entityCompanionProvider
|
|
90
90
|
.getQueryContextProviderForDatabaseAdaptorFlavor(databaseAdaptorFlavor)
|
|
@@ -23,7 +23,7 @@ export default class ViewerScopedEntityCompanion<
|
|
|
23
23
|
TEntity,
|
|
24
24
|
TSelectedFields
|
|
25
25
|
>,
|
|
26
|
-
TSelectedFields extends keyof TFields
|
|
26
|
+
TSelectedFields extends keyof TFields,
|
|
27
27
|
> {
|
|
28
28
|
constructor(
|
|
29
29
|
public readonly entityCompanion: EntityCompanion<
|
|
@@ -34,7 +34,7 @@ export default class ViewerScopedEntityCompanion<
|
|
|
34
34
|
TPrivacyPolicy,
|
|
35
35
|
TSelectedFields
|
|
36
36
|
>,
|
|
37
|
-
private readonly viewerContext: TViewerContext
|
|
37
|
+
private readonly viewerContext: TViewerContext,
|
|
38
38
|
) {}
|
|
39
39
|
|
|
40
40
|
/**
|
|
@@ -50,7 +50,7 @@ export default class ViewerScopedEntityCompanion<
|
|
|
50
50
|
> {
|
|
51
51
|
return new ViewerScopedEntityLoaderFactory(
|
|
52
52
|
this.entityCompanion.getLoaderFactory(),
|
|
53
|
-
this.viewerContext
|
|
53
|
+
this.viewerContext,
|
|
54
54
|
);
|
|
55
55
|
}
|
|
56
56
|
|
|
@@ -67,7 +67,7 @@ export default class ViewerScopedEntityCompanion<
|
|
|
67
67
|
> {
|
|
68
68
|
return new ViewerScopedEntityMutatorFactory(
|
|
69
69
|
this.entityCompanion.getMutatorFactory(),
|
|
70
|
-
this.viewerContext
|
|
70
|
+
this.viewerContext,
|
|
71
71
|
);
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -11,7 +11,7 @@ import ViewerScopedEntityCompanion from './ViewerScopedEntityCompanion';
|
|
|
11
11
|
export default class ViewerScopedEntityCompanionProvider {
|
|
12
12
|
constructor(
|
|
13
13
|
private readonly entityCompanionProvider: EntityCompanionProvider,
|
|
14
|
-
private readonly viewerContext: ViewerContext
|
|
14
|
+
private readonly viewerContext: ViewerContext,
|
|
15
15
|
) {}
|
|
16
16
|
|
|
17
17
|
/**
|
|
@@ -19,7 +19,6 @@ export default class ViewerScopedEntityCompanionProvider {
|
|
|
19
19
|
* companion is constructed using the configuration provided by the factory.
|
|
20
20
|
*
|
|
21
21
|
* @param entityClass - entity class to load
|
|
22
|
-
* @param entityCompanionDefinitionFn - function defining entity companion definition
|
|
23
22
|
*/
|
|
24
23
|
getViewerScopedCompanionForEntity<
|
|
25
24
|
TFields extends object,
|
|
@@ -33,7 +32,7 @@ export default class ViewerScopedEntityCompanionProvider {
|
|
|
33
32
|
TEntity,
|
|
34
33
|
TSelectedFields
|
|
35
34
|
>,
|
|
36
|
-
TSelectedFields extends keyof TFields
|
|
35
|
+
TSelectedFields extends keyof TFields,
|
|
37
36
|
>(
|
|
38
37
|
entityClass: IEntityClass<
|
|
39
38
|
TFields,
|
|
@@ -42,7 +41,7 @@ export default class ViewerScopedEntityCompanionProvider {
|
|
|
42
41
|
TEntity,
|
|
43
42
|
TPrivacyPolicy,
|
|
44
43
|
TSelectedFields
|
|
45
|
-
|
|
44
|
+
>,
|
|
46
45
|
): ViewerScopedEntityCompanion<
|
|
47
46
|
TFields,
|
|
48
47
|
TID,
|
|
@@ -53,7 +52,7 @@ export default class ViewerScopedEntityCompanionProvider {
|
|
|
53
52
|
> {
|
|
54
53
|
return new ViewerScopedEntityCompanion(
|
|
55
54
|
this.entityCompanionProvider.getCompanionForEntity(entityClass),
|
|
56
|
-
this.viewerContext as TViewerContext
|
|
55
|
+
this.viewerContext as TViewerContext,
|
|
57
56
|
);
|
|
58
57
|
}
|
|
59
58
|
}
|
|
@@ -20,7 +20,7 @@ export default class ViewerScopedEntityLoaderFactory<
|
|
|
20
20
|
TEntity,
|
|
21
21
|
TSelectedFields
|
|
22
22
|
>,
|
|
23
|
-
TSelectedFields extends keyof TFields
|
|
23
|
+
TSelectedFields extends keyof TFields,
|
|
24
24
|
> {
|
|
25
25
|
constructor(
|
|
26
26
|
private readonly entityLoaderFactory: EntityLoaderFactory<
|
|
@@ -31,17 +31,23 @@ export default class ViewerScopedEntityLoaderFactory<
|
|
|
31
31
|
TPrivacyPolicy,
|
|
32
32
|
TSelectedFields
|
|
33
33
|
>,
|
|
34
|
-
private readonly viewerContext: TViewerContext
|
|
34
|
+
private readonly viewerContext: TViewerContext,
|
|
35
35
|
) {}
|
|
36
36
|
|
|
37
37
|
forLoad(
|
|
38
38
|
queryContext: EntityQueryContext,
|
|
39
|
-
privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext
|
|
39
|
+
privacyPolicyEvaluationContext: EntityPrivacyPolicyEvaluationContext<
|
|
40
|
+
TFields,
|
|
41
|
+
TID,
|
|
42
|
+
TViewerContext,
|
|
43
|
+
TEntity,
|
|
44
|
+
TSelectedFields
|
|
45
|
+
>,
|
|
40
46
|
): EntityLoader<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields> {
|
|
41
47
|
return this.entityLoaderFactory.forLoad(
|
|
42
48
|
this.viewerContext,
|
|
43
49
|
queryContext,
|
|
44
|
-
privacyPolicyEvaluationContext
|
|
50
|
+
privacyPolicyEvaluationContext,
|
|
45
51
|
);
|
|
46
52
|
}
|
|
47
53
|
}
|
|
@@ -20,7 +20,7 @@ export default class ViewerScopedEntityMutatorFactory<
|
|
|
20
20
|
TEntity,
|
|
21
21
|
TSelectedFields
|
|
22
22
|
>,
|
|
23
|
-
TSelectedFields extends keyof TFields
|
|
23
|
+
TSelectedFields extends keyof TFields,
|
|
24
24
|
> {
|
|
25
25
|
constructor(
|
|
26
26
|
private readonly entityMutatorFactory: EntityMutatorFactory<
|
|
@@ -31,25 +31,25 @@ export default class ViewerScopedEntityMutatorFactory<
|
|
|
31
31
|
TPrivacyPolicy,
|
|
32
32
|
TSelectedFields
|
|
33
33
|
>,
|
|
34
|
-
private readonly viewerContext: TViewerContext
|
|
34
|
+
private readonly viewerContext: TViewerContext,
|
|
35
35
|
) {}
|
|
36
36
|
|
|
37
37
|
forCreate(
|
|
38
|
-
queryContext: EntityQueryContext
|
|
38
|
+
queryContext: EntityQueryContext,
|
|
39
39
|
): CreateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields> {
|
|
40
40
|
return this.entityMutatorFactory.forCreate(this.viewerContext, queryContext);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
forUpdate(
|
|
44
44
|
existingEntity: TEntity,
|
|
45
|
-
queryContext: EntityQueryContext
|
|
45
|
+
queryContext: EntityQueryContext,
|
|
46
46
|
): UpdateMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields> {
|
|
47
47
|
return this.entityMutatorFactory.forUpdate(existingEntity, queryContext);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
forDelete(
|
|
51
51
|
existingEntity: TEntity,
|
|
52
|
-
queryContext: EntityQueryContext
|
|
52
|
+
queryContext: EntityQueryContext,
|
|
53
53
|
): DeleteMutator<TFields, TID, TViewerContext, TEntity, TPrivacyPolicy, TSelectedFields> {
|
|
54
54
|
return this.entityMutatorFactory.forDelete(existingEntity, queryContext);
|
|
55
55
|
}
|
|
@@ -23,18 +23,20 @@ const entityConfiguration = new EntityConfiguration<BlahFields>({
|
|
|
23
23
|
export const DOES_NOT_EXIST_LOCAL_MEMORY_CACHE = Symbol('doesNotExist');
|
|
24
24
|
type LocalMemoryCacheValue<TFields> = Readonly<TFields> | typeof DOES_NOT_EXIST_LOCAL_MEMORY_CACHE;
|
|
25
25
|
|
|
26
|
-
class TestLocalCacheAdapter<TFields
|
|
26
|
+
class TestLocalCacheAdapter<TFields extends Record<string, any>>
|
|
27
|
+
implements IEntityCacheAdapter<TFields>
|
|
28
|
+
{
|
|
27
29
|
constructor(
|
|
28
30
|
private readonly entityConfiguration: EntityConfiguration<TFields>,
|
|
29
|
-
private readonly cache: Map<string, LocalMemoryCacheValue<TFields
|
|
31
|
+
private readonly cache: Map<string, LocalMemoryCacheValue<TFields>>,
|
|
30
32
|
) {}
|
|
31
33
|
|
|
32
34
|
public async loadManyAsync<N extends keyof TFields>(
|
|
33
35
|
fieldName: N,
|
|
34
|
-
fieldValues: readonly NonNullable<TFields[N]>[]
|
|
36
|
+
fieldValues: readonly NonNullable<TFields[N]>[],
|
|
35
37
|
): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>> {
|
|
36
38
|
const localMemoryCacheKeyToFieldValueMapping = new Map(
|
|
37
|
-
fieldValues.map((fieldValue) => [this.makeCacheKey(fieldName, fieldValue), fieldValue])
|
|
39
|
+
fieldValues.map((fieldValue) => [this.makeCacheKey(fieldName, fieldValue), fieldValue]),
|
|
38
40
|
);
|
|
39
41
|
const cacheResults = new Map<NonNullable<TFields[N]>, CacheLoadResult<TFields>>();
|
|
40
42
|
for (const [cacheKey, fieldValue] of localMemoryCacheKeyToFieldValueMapping) {
|
|
@@ -60,7 +62,7 @@ class TestLocalCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
|
|
|
60
62
|
|
|
61
63
|
public async cacheManyAsync<N extends keyof TFields>(
|
|
62
64
|
fieldName: N,
|
|
63
|
-
objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields
|
|
65
|
+
objectMap: ReadonlyMap<NonNullable<TFields[N]>, Readonly<TFields>>,
|
|
64
66
|
): Promise<void> {
|
|
65
67
|
for (const [fieldValue, item] of objectMap) {
|
|
66
68
|
const cacheKey = this.makeCacheKey(fieldName, fieldValue);
|
|
@@ -70,7 +72,7 @@ class TestLocalCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
|
|
|
70
72
|
|
|
71
73
|
public async cacheDBMissesAsync<N extends keyof TFields>(
|
|
72
74
|
fieldName: N,
|
|
73
|
-
fieldValues: readonly NonNullable<TFields[N]>[]
|
|
75
|
+
fieldValues: readonly NonNullable<TFields[N]>[],
|
|
74
76
|
): Promise<void> {
|
|
75
77
|
for (const fieldValue of fieldValues) {
|
|
76
78
|
const cacheKey = this.makeCacheKey(fieldName, fieldValue);
|
|
@@ -80,7 +82,7 @@ class TestLocalCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
|
|
|
80
82
|
|
|
81
83
|
public async invalidateManyAsync<N extends keyof TFields>(
|
|
82
84
|
fieldName: N,
|
|
83
|
-
fieldValues: readonly NonNullable<TFields[N]>[]
|
|
85
|
+
fieldValues: readonly NonNullable<TFields[N]>[],
|
|
84
86
|
): Promise<void> {
|
|
85
87
|
for (const fieldValue of fieldValues) {
|
|
86
88
|
const cacheKey = this.makeCacheKey(fieldName, fieldValue);
|
|
@@ -90,7 +92,7 @@ class TestLocalCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
|
|
|
90
92
|
|
|
91
93
|
private makeCacheKey<N extends keyof TFields>(
|
|
92
94
|
fieldName: N,
|
|
93
|
-
fieldValue: NonNullable<TFields[N]
|
|
95
|
+
fieldValue: NonNullable<TFields[N]>,
|
|
94
96
|
): string {
|
|
95
97
|
const columnName = this.entityConfiguration.entityToDBFieldsKeyMapping.get(fieldName);
|
|
96
98
|
invariant(columnName, `database field mapping missing for ${String(fieldName)}`);
|
|
@@ -102,7 +104,7 @@ class TestLocalCacheAdapter<TFields> implements IEntityCacheAdapter<TFields> {
|
|
|
102
104
|
];
|
|
103
105
|
const delimiter = ':';
|
|
104
106
|
const escapedParts = parts.map((part) =>
|
|
105
|
-
part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`)
|
|
107
|
+
part.replace('\\', '\\\\').replace(delimiter, `\\${delimiter}`),
|
|
106
108
|
);
|
|
107
109
|
return escapedParts.join(delimiter);
|
|
108
110
|
}
|
|
@@ -271,7 +273,7 @@ describe(ComposedEntityCacheAdapter, () => {
|
|
|
271
273
|
|
|
272
274
|
const fallbackLocalMemoryCacheKey = fallbackCacheAdapter['makeCacheKey']('id', 'test-id-1');
|
|
273
275
|
expect(fallbackCache.get(fallbackLocalMemoryCacheKey)).toBe(
|
|
274
|
-
DOES_NOT_EXIST_LOCAL_MEMORY_CACHE
|
|
276
|
+
DOES_NOT_EXIST_LOCAL_MEMORY_CACHE,
|
|
275
277
|
);
|
|
276
278
|
});
|
|
277
279
|
});
|
|
@@ -9,14 +9,14 @@ type TestLoadParams = { lp: string };
|
|
|
9
9
|
|
|
10
10
|
class TestEntitySecondaryCache implements ISecondaryEntityCache<TestFields, TestLoadParams> {
|
|
11
11
|
constructor(
|
|
12
|
-
private readonly prefilledResults: Map<Readonly<TestLoadParams>, Readonly<TestFields
|
|
12
|
+
private readonly prefilledResults: Map<Readonly<TestLoadParams>, Readonly<TestFields>>,
|
|
13
13
|
) {}
|
|
14
14
|
|
|
15
15
|
async loadManyThroughAsync(
|
|
16
16
|
loadParamsArray: readonly Readonly<TestLoadParams>[],
|
|
17
17
|
fetcher: (
|
|
18
|
-
fetcherLoadParamsArray: readonly Readonly<TestLoadParams>[]
|
|
19
|
-
) => Promise<ReadonlyMap<Readonly<TestLoadParams>, Readonly<TestFields> | null
|
|
18
|
+
fetcherLoadParamsArray: readonly Readonly<TestLoadParams>[],
|
|
19
|
+
) => Promise<ReadonlyMap<Readonly<TestLoadParams>, Readonly<TestFields> | null>>,
|
|
20
20
|
): Promise<ReadonlyMap<Readonly<TestLoadParams>, Readonly<TestFields> | null>> {
|
|
21
21
|
// this does an unusual method of calling fetcher, but there's no constraint that says fetcher can only be called once
|
|
22
22
|
// so this tests that
|
|
@@ -50,10 +50,10 @@ describe(ComposedSecondaryEntityCache, () => {
|
|
|
50
50
|
const lp3 = { lp: '3' };
|
|
51
51
|
|
|
52
52
|
const primarySecondaryEntityCache = new TestEntitySecondaryCache(
|
|
53
|
-
new Map([[lp1, { id: 'primary-1' }]])
|
|
53
|
+
new Map([[lp1, { id: 'primary-1' }]]),
|
|
54
54
|
);
|
|
55
55
|
const fallbackSecondaryEntityCache = new TestEntitySecondaryCache(
|
|
56
|
-
new Map([[lp2, { id: 'fallback-2' }]])
|
|
56
|
+
new Map([[lp2, { id: 'fallback-2' }]]),
|
|
57
57
|
);
|
|
58
58
|
|
|
59
59
|
const composedSecondaryEntityCache = new ComposedSecondaryEntityCache([
|
|
@@ -64,7 +64,7 @@ describe(ComposedSecondaryEntityCache, () => {
|
|
|
64
64
|
const results = await composedSecondaryEntityCache.loadManyThroughAsync(
|
|
65
65
|
[lp1, lp2, lp3],
|
|
66
66
|
async (fetcherLoadParamsArray) =>
|
|
67
|
-
new Map(fetcherLoadParamsArray.map((flp) => [flp, { id: `db-fetched-${flp.lp}` }]))
|
|
67
|
+
new Map(fetcherLoadParamsArray.map((flp) => [flp, { id: `db-fetched-${flp.lp}` }])),
|
|
68
68
|
);
|
|
69
69
|
|
|
70
70
|
expect(results.get(lp1)).toEqual({ id: 'primary-1' });
|
|
@@ -76,7 +76,7 @@ describe(ComposedSecondaryEntityCache, () => {
|
|
|
76
76
|
const resultsAfterInvalidate = await composedSecondaryEntityCache.loadManyThroughAsync(
|
|
77
77
|
[lp1, lp2, lp3],
|
|
78
78
|
async (fetcherLoadParamsArray) =>
|
|
79
|
-
new Map(fetcherLoadParamsArray.map((flp) => [flp, { id: `db-fetched-${flp.lp}` }]))
|
|
79
|
+
new Map(fetcherLoadParamsArray.map((flp) => [flp, { id: `db-fetched-${flp.lp}` }])),
|
|
80
80
|
);
|
|
81
81
|
|
|
82
82
|
expect(resultsAfterInvalidate.get(lp1)).toEqual({ id: 'db-fetched-1' });
|
|
@@ -93,7 +93,7 @@ describe(ComposedSecondaryEntityCache, () => {
|
|
|
93
93
|
const results = await composedSecondaryEntityCache.loadManyThroughAsync(
|
|
94
94
|
[lp1],
|
|
95
95
|
async (fetcherLoadParamsArray) =>
|
|
96
|
-
new Map(fetcherLoadParamsArray.map((flp) => [flp, { id: `db-fetched-${flp.lp}` }]))
|
|
96
|
+
new Map(fetcherLoadParamsArray.map((flp) => [flp, { id: `db-fetched-${flp.lp}` }])),
|
|
97
97
|
);
|
|
98
98
|
|
|
99
99
|
expect(results.get(lp1)).toEqual({ id: 'db-fetched-1' });
|