@expo/entity 0.35.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 +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 +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 +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 +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 +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 +1 -0
- 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
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import invariant from 'invariant';
|
|
2
|
+
import nullthrows from 'nullthrows';
|
|
2
3
|
|
|
3
4
|
import EntityConfiguration from '../EntityConfiguration';
|
|
4
5
|
|
|
@@ -19,19 +20,19 @@ export interface FieldTransformer<T> {
|
|
|
19
20
|
*/
|
|
20
21
|
export type FieldTransformerMap = Map<string, FieldTransformer<any>>;
|
|
21
22
|
|
|
22
|
-
export const getDatabaseFieldForEntityField = <TFields
|
|
23
|
+
export const getDatabaseFieldForEntityField = <TFields extends Record<string, any>>(
|
|
23
24
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
24
|
-
entityField: keyof TFields
|
|
25
|
+
entityField: keyof TFields,
|
|
25
26
|
): string => {
|
|
26
27
|
const databaseField = entityConfiguration.entityToDBFieldsKeyMapping.get(entityField);
|
|
27
28
|
invariant(databaseField, `database field mapping missing for ${String(entityField)}`);
|
|
28
29
|
return databaseField!;
|
|
29
30
|
};
|
|
30
31
|
|
|
31
|
-
export const transformDatabaseObjectToFields = <TFields
|
|
32
|
+
export const transformDatabaseObjectToFields = <TFields extends Record<string, any>>(
|
|
32
33
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
33
34
|
fieldTransformerMap: FieldTransformerMap,
|
|
34
|
-
databaseObject: { [key: string]: any }
|
|
35
|
+
databaseObject: { [key: string]: any },
|
|
35
36
|
): Readonly<TFields> => {
|
|
36
37
|
const fields: TFields = {} as any;
|
|
37
38
|
for (const k in databaseObject) {
|
|
@@ -42,17 +43,17 @@ export const transformDatabaseObjectToFields = <TFields>(
|
|
|
42
43
|
entityConfiguration,
|
|
43
44
|
fieldTransformerMap,
|
|
44
45
|
fieldsKey,
|
|
45
|
-
val
|
|
46
|
+
val,
|
|
46
47
|
);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
return fields;
|
|
50
51
|
};
|
|
51
52
|
|
|
52
|
-
export const transformFieldsToDatabaseObject = <TFields
|
|
53
|
+
export const transformFieldsToDatabaseObject = <TFields extends Record<string, any>>(
|
|
53
54
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
54
55
|
fieldTransformerMap: FieldTransformerMap,
|
|
55
|
-
fields: Readonly<Partial<TFields
|
|
56
|
+
fields: Readonly<Partial<TFields>>,
|
|
56
57
|
): object => {
|
|
57
58
|
const databaseObject: { [key: string]: any } = {};
|
|
58
59
|
for (const k in fields) {
|
|
@@ -63,16 +64,16 @@ export const transformFieldsToDatabaseObject = <TFields>(
|
|
|
63
64
|
entityConfiguration,
|
|
64
65
|
fieldTransformerMap,
|
|
65
66
|
k,
|
|
66
|
-
val
|
|
67
|
+
val,
|
|
67
68
|
);
|
|
68
69
|
}
|
|
69
70
|
return databaseObject;
|
|
70
71
|
};
|
|
71
72
|
|
|
72
|
-
export const transformCacheObjectToFields = <TFields
|
|
73
|
+
export const transformCacheObjectToFields = <TFields extends Record<string, any>>(
|
|
73
74
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
74
75
|
fieldTransformerMap: FieldTransformerMap,
|
|
75
|
-
cacheObject: { [key: string]: any }
|
|
76
|
+
cacheObject: { [key: string]: any },
|
|
76
77
|
): Readonly<TFields> => {
|
|
77
78
|
const fields: TFields = {} as any;
|
|
78
79
|
for (const fieldsKey in cacheObject) {
|
|
@@ -81,16 +82,16 @@ export const transformCacheObjectToFields = <TFields>(
|
|
|
81
82
|
entityConfiguration,
|
|
82
83
|
fieldTransformerMap,
|
|
83
84
|
fieldsKey as keyof TFields,
|
|
84
|
-
val
|
|
85
|
+
val,
|
|
85
86
|
);
|
|
86
87
|
}
|
|
87
88
|
return fields;
|
|
88
89
|
};
|
|
89
90
|
|
|
90
|
-
export const transformFieldsToCacheObject = <TFields
|
|
91
|
+
export const transformFieldsToCacheObject = <TFields extends Record<string, any>>(
|
|
91
92
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
92
93
|
fieldTransformerMap: FieldTransformerMap,
|
|
93
|
-
fields: Readonly<Partial<TFields
|
|
94
|
+
fields: Readonly<Partial<TFields>>,
|
|
94
95
|
): object => {
|
|
95
96
|
const cacheObject: { [key: string]: any } = {};
|
|
96
97
|
for (const fieldsKey in fields) {
|
|
@@ -99,49 +100,52 @@ export const transformFieldsToCacheObject = <TFields>(
|
|
|
99
100
|
entityConfiguration,
|
|
100
101
|
fieldTransformerMap,
|
|
101
102
|
fieldsKey,
|
|
102
|
-
val
|
|
103
|
+
val,
|
|
103
104
|
);
|
|
104
105
|
}
|
|
105
106
|
return cacheObject;
|
|
106
107
|
};
|
|
107
108
|
|
|
108
|
-
const maybeTransformDatabaseValueToFieldValue = <
|
|
109
|
+
const maybeTransformDatabaseValueToFieldValue = <
|
|
110
|
+
TFields extends Record<string, any>,
|
|
111
|
+
N extends keyof TFields,
|
|
112
|
+
>(
|
|
109
113
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
110
114
|
fieldTransformerMap: FieldTransformerMap,
|
|
111
115
|
fieldName: N,
|
|
112
|
-
value: any
|
|
116
|
+
value: any,
|
|
113
117
|
): TFields[N] => {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
|
|
118
|
+
// this will always be non-null due to the way the dbToEntityFieldsKeyMapping is computed and this
|
|
119
|
+
// function is called conditionally
|
|
120
|
+
const fieldDefinition = nullthrows(entityConfiguration.schema.get(fieldName));
|
|
119
121
|
const transformer = fieldTransformerMap.get(fieldDefinition.constructor.name);
|
|
120
122
|
const readTransformer = transformer?.read;
|
|
121
123
|
return readTransformer ? readTransformer(value) : value;
|
|
122
124
|
};
|
|
123
125
|
|
|
124
|
-
const maybeTransformFieldValueToDatabaseValue = <
|
|
126
|
+
const maybeTransformFieldValueToDatabaseValue = <
|
|
127
|
+
TFields extends Record<string, any>,
|
|
128
|
+
N extends keyof TFields,
|
|
129
|
+
>(
|
|
125
130
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
126
131
|
fieldTransformerMap: FieldTransformerMap,
|
|
127
132
|
fieldName: N,
|
|
128
|
-
value: TFields[N]
|
|
133
|
+
value: TFields[N],
|
|
129
134
|
): any => {
|
|
130
|
-
const fieldDefinition = entityConfiguration.schema.get(fieldName);
|
|
131
|
-
if (!fieldDefinition) {
|
|
132
|
-
return value;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
+
const fieldDefinition = nullthrows(entityConfiguration.schema.get(fieldName));
|
|
135
136
|
const transformer = fieldTransformerMap.get(fieldDefinition.constructor.name);
|
|
136
137
|
const writeTransformer = transformer?.write;
|
|
137
138
|
return writeTransformer ? writeTransformer(value) : value;
|
|
138
139
|
};
|
|
139
140
|
|
|
140
|
-
const maybeTransformCacheValueToFieldValue = <
|
|
141
|
+
const maybeTransformCacheValueToFieldValue = <
|
|
142
|
+
TFields extends Record<string, any>,
|
|
143
|
+
N extends keyof TFields,
|
|
144
|
+
>(
|
|
141
145
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
142
146
|
fieldTransformerMap: FieldTransformerMap,
|
|
143
147
|
fieldName: N,
|
|
144
|
-
value: any
|
|
148
|
+
value: any,
|
|
145
149
|
): TFields[N] => {
|
|
146
150
|
const fieldDefinition = entityConfiguration.schema.get(fieldName);
|
|
147
151
|
if (!fieldDefinition) {
|
|
@@ -153,11 +157,14 @@ const maybeTransformCacheValueToFieldValue = <TFields, N extends keyof TFields>(
|
|
|
153
157
|
return readTransformer ? readTransformer(value) : value;
|
|
154
158
|
};
|
|
155
159
|
|
|
156
|
-
const maybeTransformFieldValueToCacheValue = <
|
|
160
|
+
const maybeTransformFieldValueToCacheValue = <
|
|
161
|
+
TFields extends Record<string, any>,
|
|
162
|
+
N extends keyof TFields,
|
|
163
|
+
>(
|
|
157
164
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
158
165
|
fieldTransformerMap: FieldTransformerMap,
|
|
159
166
|
fieldName: N,
|
|
160
|
-
value: TFields[N]
|
|
167
|
+
value: TFields[N],
|
|
161
168
|
): any => {
|
|
162
169
|
const fieldDefinition = entityConfiguration.schema.get(fieldName);
|
|
163
170
|
if (!fieldDefinition) {
|
|
@@ -13,7 +13,7 @@ import IEntityMetricsAdapter from '../metrics/IEntityMetricsAdapter';
|
|
|
13
13
|
* table. Note that one instance is shared amongst all entities that read from
|
|
14
14
|
* the table to ensure cross-entity data consistency.
|
|
15
15
|
*/
|
|
16
|
-
export default class EntityTableDataCoordinator<TFields
|
|
16
|
+
export default class EntityTableDataCoordinator<TFields extends Record<string, any>> {
|
|
17
17
|
readonly databaseAdapter: EntityDatabaseAdapter<TFields>;
|
|
18
18
|
readonly cacheAdapter: IEntityCacheAdapter<TFields>;
|
|
19
19
|
readonly dataManager: EntityDataManager<TFields>;
|
|
@@ -24,7 +24,7 @@ export default class EntityTableDataCoordinator<TFields> {
|
|
|
24
24
|
cacheAdapterProvider: IEntityCacheAdapterProvider,
|
|
25
25
|
private readonly queryContextProvider: EntityQueryContextProvider,
|
|
26
26
|
metricsAdapter: IEntityMetricsAdapter,
|
|
27
|
-
entityClassName: string
|
|
27
|
+
entityClassName: string,
|
|
28
28
|
) {
|
|
29
29
|
this.databaseAdapter = databaseAdapterProvider.getDatabaseAdapter(entityConfiguration);
|
|
30
30
|
this.cacheAdapter = cacheAdapterProvider.getCacheAdapter(entityConfiguration);
|
|
@@ -33,7 +33,7 @@ export default class EntityTableDataCoordinator<TFields> {
|
|
|
33
33
|
new ReadThroughEntityCache(entityConfiguration, this.cacheAdapter),
|
|
34
34
|
queryContextProvider,
|
|
35
35
|
metricsAdapter,
|
|
36
|
-
entityClassName
|
|
36
|
+
entityClassName,
|
|
37
37
|
);
|
|
38
38
|
}
|
|
39
39
|
|
|
@@ -26,10 +26,10 @@ export type CacheLoadResult<TFields> =
|
|
|
26
26
|
* A read-through entity cache is responsible for coordinating EntityDatabaseAdapter and
|
|
27
27
|
* EntityCacheAdapter within the EntityDataManager.
|
|
28
28
|
*/
|
|
29
|
-
export default class ReadThroughEntityCache<TFields
|
|
29
|
+
export default class ReadThroughEntityCache<TFields extends Record<string, any>> {
|
|
30
30
|
constructor(
|
|
31
31
|
private readonly entityConfiguration: EntityConfiguration<TFields>,
|
|
32
|
-
private readonly entityCacheAdapter: IEntityCacheAdapter<TFields
|
|
32
|
+
private readonly entityCacheAdapter: IEntityCacheAdapter<TFields>,
|
|
33
33
|
) {}
|
|
34
34
|
|
|
35
35
|
private isFieldCacheable<N extends keyof TFields>(fieldName: N): boolean {
|
|
@@ -56,8 +56,8 @@ export default class ReadThroughEntityCache<TFields> {
|
|
|
56
56
|
fieldName: N,
|
|
57
57
|
fieldValues: readonly NonNullable<TFields[N]>[],
|
|
58
58
|
fetcher: (
|
|
59
|
-
fetcherFieldValues: readonly NonNullable<TFields[N]>[]
|
|
60
|
-
) => Promise<ReadonlyMap<NonNullable<TFields[N]>, readonly Readonly<TFields>[]
|
|
59
|
+
fetcherFieldValues: readonly NonNullable<TFields[N]>[],
|
|
60
|
+
) => Promise<ReadonlyMap<NonNullable<TFields[N]>, readonly Readonly<TFields>[]>>,
|
|
61
61
|
): Promise<ReadonlyMap<NonNullable<TFields[N]>, readonly Readonly<TFields>[]>> {
|
|
62
62
|
// return normal fetch when cache by fieldName not supported
|
|
63
63
|
if (!this.isFieldCacheable(fieldName)) {
|
|
@@ -68,14 +68,14 @@ export default class ReadThroughEntityCache<TFields> {
|
|
|
68
68
|
|
|
69
69
|
invariant(
|
|
70
70
|
cacheLoadResults.size === fieldValues.length,
|
|
71
|
-
`${this.constructor.name} loadMany should return a result for each fieldValue
|
|
71
|
+
`${this.constructor.name} loadMany should return a result for each fieldValue`,
|
|
72
72
|
);
|
|
73
73
|
|
|
74
74
|
const fieldValuesToFetchFromDB = Array.from(
|
|
75
75
|
filterMap(
|
|
76
76
|
cacheLoadResults,
|
|
77
|
-
(cacheLoadResult) => cacheLoadResult.status === CacheStatus.MISS
|
|
78
|
-
).keys()
|
|
77
|
+
(cacheLoadResult) => cacheLoadResult.status === CacheStatus.MISS,
|
|
78
|
+
).keys(),
|
|
79
79
|
);
|
|
80
80
|
|
|
81
81
|
// put transformed cache hits in result map
|
|
@@ -104,7 +104,7 @@ export default class ReadThroughEntityCache<TFields> {
|
|
|
104
104
|
console.warn(
|
|
105
105
|
`unique key ${String(fieldName)} in ${
|
|
106
106
|
this.entityConfiguration.tableName
|
|
107
|
-
} returned multiple rows for ${fieldValue}
|
|
107
|
+
} returned multiple rows for ${fieldValue}`,
|
|
108
108
|
);
|
|
109
109
|
continue;
|
|
110
110
|
}
|
|
@@ -132,7 +132,7 @@ export default class ReadThroughEntityCache<TFields> {
|
|
|
132
132
|
*/
|
|
133
133
|
public async invalidateManyAsync<N extends keyof TFields>(
|
|
134
134
|
fieldName: N,
|
|
135
|
-
fieldValues: readonly NonNullable<TFields[N]>[]
|
|
135
|
+
fieldValues: readonly NonNullable<TFields[N]>[],
|
|
136
136
|
): Promise<void> {
|
|
137
137
|
// no-op when cache by fieldName not supported
|
|
138
138
|
if (!this.isFieldCacheable(fieldName)) {
|
|
@@ -65,7 +65,7 @@ describe(EntityDataManager, () => {
|
|
|
65
65
|
const objects = getObjects();
|
|
66
66
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
67
67
|
testEntityConfiguration,
|
|
68
|
-
objects
|
|
68
|
+
objects,
|
|
69
69
|
);
|
|
70
70
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
71
71
|
const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
|
|
@@ -76,7 +76,7 @@ describe(EntityDataManager, () => {
|
|
|
76
76
|
entityCache,
|
|
77
77
|
StubQueryContextProvider,
|
|
78
78
|
new NoOpEntityMetricsAdapter(),
|
|
79
|
-
TestEntity.name
|
|
79
|
+
TestEntity.name,
|
|
80
80
|
);
|
|
81
81
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
82
82
|
|
|
@@ -86,7 +86,7 @@ describe(EntityDataManager, () => {
|
|
|
86
86
|
const entityDatas = await entityDataManager.loadManyByFieldEqualingAsync(
|
|
87
87
|
queryContext,
|
|
88
88
|
'customIdField',
|
|
89
|
-
['2']
|
|
89
|
+
['2'],
|
|
90
90
|
);
|
|
91
91
|
expect(entityDatas.get('2')).toHaveLength(1);
|
|
92
92
|
|
|
@@ -98,7 +98,7 @@ describe(EntityDataManager, () => {
|
|
|
98
98
|
const entityDatas2 = await entityDataManager.loadManyByFieldEqualingAsync(
|
|
99
99
|
queryContext,
|
|
100
100
|
'testIndexedField',
|
|
101
|
-
['unique2', 'unique3']
|
|
101
|
+
['unique2', 'unique3'],
|
|
102
102
|
);
|
|
103
103
|
expect(entityDatas2.get('unique2')).toHaveLength(1);
|
|
104
104
|
expect(entityDatas2.get('unique3')).toHaveLength(1);
|
|
@@ -113,7 +113,7 @@ describe(EntityDataManager, () => {
|
|
|
113
113
|
const objects = getObjects();
|
|
114
114
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
115
115
|
testEntityConfiguration,
|
|
116
|
-
objects
|
|
116
|
+
objects,
|
|
117
117
|
);
|
|
118
118
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
119
119
|
const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
|
|
@@ -124,7 +124,7 @@ describe(EntityDataManager, () => {
|
|
|
124
124
|
entityCache,
|
|
125
125
|
StubQueryContextProvider,
|
|
126
126
|
new NoOpEntityMetricsAdapter(),
|
|
127
|
-
TestEntity.name
|
|
127
|
+
TestEntity.name,
|
|
128
128
|
);
|
|
129
129
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
130
130
|
|
|
@@ -134,7 +134,7 @@ describe(EntityDataManager, () => {
|
|
|
134
134
|
const entityDatas = await entityDataManager.loadManyByFieldEqualingAsync(
|
|
135
135
|
queryContext,
|
|
136
136
|
'customIdField',
|
|
137
|
-
['1']
|
|
137
|
+
['1'],
|
|
138
138
|
);
|
|
139
139
|
expect(entityDatas.get('1')).toHaveLength(1);
|
|
140
140
|
|
|
@@ -146,7 +146,7 @@ describe(EntityDataManager, () => {
|
|
|
146
146
|
const entityDatas2 = await entityDataManager.loadManyByFieldEqualingAsync(
|
|
147
147
|
queryContext,
|
|
148
148
|
'testIndexedField',
|
|
149
|
-
['unique2', 'unique3']
|
|
149
|
+
['unique2', 'unique3'],
|
|
150
150
|
);
|
|
151
151
|
expect(entityDatas2.get('unique2')).toHaveLength(1);
|
|
152
152
|
expect(entityDatas2.get('unique3')).toHaveLength(1);
|
|
@@ -161,7 +161,7 @@ describe(EntityDataManager, () => {
|
|
|
161
161
|
const objects = getObjects();
|
|
162
162
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
163
163
|
testEntityConfiguration,
|
|
164
|
-
objects
|
|
164
|
+
objects,
|
|
165
165
|
);
|
|
166
166
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
167
167
|
const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
|
|
@@ -172,7 +172,7 @@ describe(EntityDataManager, () => {
|
|
|
172
172
|
entityCache,
|
|
173
173
|
StubQueryContextProvider,
|
|
174
174
|
new NoOpEntityMetricsAdapter(),
|
|
175
|
-
TestEntity.name
|
|
175
|
+
TestEntity.name,
|
|
176
176
|
);
|
|
177
177
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
178
178
|
// use second data manager to ensure that cache is hit instead of data loader
|
|
@@ -181,7 +181,7 @@ describe(EntityDataManager, () => {
|
|
|
181
181
|
entityCache,
|
|
182
182
|
StubQueryContextProvider,
|
|
183
183
|
new NoOpEntityMetricsAdapter(),
|
|
184
|
-
TestEntity.name
|
|
184
|
+
TestEntity.name,
|
|
185
185
|
);
|
|
186
186
|
|
|
187
187
|
const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
|
|
@@ -205,7 +205,7 @@ describe(EntityDataManager, () => {
|
|
|
205
205
|
const objects = getObjects();
|
|
206
206
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
207
207
|
testEntityConfiguration,
|
|
208
|
-
objects
|
|
208
|
+
objects,
|
|
209
209
|
);
|
|
210
210
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
211
211
|
const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
|
|
@@ -216,7 +216,7 @@ describe(EntityDataManager, () => {
|
|
|
216
216
|
entityCache,
|
|
217
217
|
StubQueryContextProvider,
|
|
218
218
|
new NoOpEntityMetricsAdapter(),
|
|
219
|
-
TestEntity.name
|
|
219
|
+
TestEntity.name,
|
|
220
220
|
);
|
|
221
221
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
222
222
|
|
|
@@ -241,7 +241,7 @@ describe(EntityDataManager, () => {
|
|
|
241
241
|
const objects = getObjects();
|
|
242
242
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
243
243
|
testEntityConfiguration,
|
|
244
|
-
objects
|
|
244
|
+
objects,
|
|
245
245
|
);
|
|
246
246
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
247
247
|
const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
|
|
@@ -252,7 +252,7 @@ describe(EntityDataManager, () => {
|
|
|
252
252
|
entityCache,
|
|
253
253
|
StubQueryContextProvider,
|
|
254
254
|
new NoOpEntityMetricsAdapter(),
|
|
255
|
-
TestEntity.name
|
|
255
|
+
TestEntity.name,
|
|
256
256
|
);
|
|
257
257
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
258
258
|
|
|
@@ -262,12 +262,12 @@ describe(EntityDataManager, () => {
|
|
|
262
262
|
const entityData = await entityDataManager.loadManyByFieldEqualingAsync(
|
|
263
263
|
queryContext,
|
|
264
264
|
'stringField',
|
|
265
|
-
['hello', 'world']
|
|
265
|
+
['hello', 'world'],
|
|
266
266
|
);
|
|
267
267
|
const entityData2 = await entityDataManager.loadManyByFieldEqualingAsync(
|
|
268
268
|
queryContext,
|
|
269
269
|
'stringField',
|
|
270
|
-
['hello', 'world']
|
|
270
|
+
['hello', 'world'],
|
|
271
271
|
);
|
|
272
272
|
|
|
273
273
|
expect(dbSpy).toHaveBeenCalledTimes(1);
|
|
@@ -285,7 +285,7 @@ describe(EntityDataManager, () => {
|
|
|
285
285
|
const objects = getObjects();
|
|
286
286
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
287
287
|
testEntityConfiguration,
|
|
288
|
-
objects
|
|
288
|
+
objects,
|
|
289
289
|
);
|
|
290
290
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
291
291
|
const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
|
|
@@ -296,7 +296,7 @@ describe(EntityDataManager, () => {
|
|
|
296
296
|
entityCache,
|
|
297
297
|
StubQueryContextProvider,
|
|
298
298
|
new NoOpEntityMetricsAdapter(),
|
|
299
|
-
TestEntity.name
|
|
299
|
+
TestEntity.name,
|
|
300
300
|
);
|
|
301
301
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
302
302
|
|
|
@@ -324,7 +324,7 @@ describe(EntityDataManager, () => {
|
|
|
324
324
|
const objects = getObjects();
|
|
325
325
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
326
326
|
testEntityConfiguration,
|
|
327
|
-
objects
|
|
327
|
+
objects,
|
|
328
328
|
);
|
|
329
329
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
330
330
|
const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
|
|
@@ -335,7 +335,7 @@ describe(EntityDataManager, () => {
|
|
|
335
335
|
entityCache,
|
|
336
336
|
StubQueryContextProvider,
|
|
337
337
|
new NoOpEntityMetricsAdapter(),
|
|
338
|
-
TestEntity.name
|
|
338
|
+
TestEntity.name,
|
|
339
339
|
);
|
|
340
340
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
341
341
|
|
|
@@ -363,7 +363,7 @@ describe(EntityDataManager, () => {
|
|
|
363
363
|
const objects = getObjects();
|
|
364
364
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
365
365
|
testEntityConfiguration,
|
|
366
|
-
objects
|
|
366
|
+
objects,
|
|
367
367
|
);
|
|
368
368
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
369
369
|
const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
|
|
@@ -374,7 +374,7 @@ describe(EntityDataManager, () => {
|
|
|
374
374
|
entityCache,
|
|
375
375
|
StubQueryContextProvider,
|
|
376
376
|
new NoOpEntityMetricsAdapter(),
|
|
377
|
-
TestEntity.name
|
|
377
|
+
TestEntity.name,
|
|
378
378
|
);
|
|
379
379
|
|
|
380
380
|
const dbSpy = jest.spyOn(databaseAdapter, 'fetchManyWhereAsync');
|
|
@@ -386,7 +386,7 @@ describe(EntityDataManager, () => {
|
|
|
386
386
|
'1',
|
|
387
387
|
]);
|
|
388
388
|
},
|
|
389
|
-
{}
|
|
389
|
+
{},
|
|
390
390
|
);
|
|
391
391
|
|
|
392
392
|
expect(entityDatas.get('1')).toHaveLength(1);
|
|
@@ -402,7 +402,7 @@ describe(EntityDataManager, () => {
|
|
|
402
402
|
const objects = getObjects();
|
|
403
403
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
404
404
|
testEntityConfiguration,
|
|
405
|
-
objects
|
|
405
|
+
objects,
|
|
406
406
|
);
|
|
407
407
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
408
408
|
const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
|
|
@@ -413,7 +413,7 @@ describe(EntityDataManager, () => {
|
|
|
413
413
|
entityCache,
|
|
414
414
|
StubQueryContextProvider,
|
|
415
415
|
new NoOpEntityMetricsAdapter(),
|
|
416
|
-
TestEntity.name
|
|
416
|
+
TestEntity.name,
|
|
417
417
|
);
|
|
418
418
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
419
419
|
|
|
@@ -432,7 +432,7 @@ describe(EntityDataManager, () => {
|
|
|
432
432
|
fieldValue: 1,
|
|
433
433
|
},
|
|
434
434
|
],
|
|
435
|
-
{}
|
|
435
|
+
{},
|
|
436
436
|
);
|
|
437
437
|
|
|
438
438
|
expect(entityDatas).toHaveLength(2);
|
|
@@ -447,7 +447,7 @@ describe(EntityDataManager, () => {
|
|
|
447
447
|
it('handles DB errors as expected', async () => {
|
|
448
448
|
const databaseAdapterMock = mock<EntityDatabaseAdapter<TestFields>>();
|
|
449
449
|
when(databaseAdapterMock.fetchManyWhereAsync(anything(), anything(), anything())).thenReject(
|
|
450
|
-
new Error('DB query failed')
|
|
450
|
+
new Error('DB query failed'),
|
|
451
451
|
);
|
|
452
452
|
|
|
453
453
|
const databaseAdapter = instance(databaseAdapterMock);
|
|
@@ -459,12 +459,12 @@ describe(EntityDataManager, () => {
|
|
|
459
459
|
entityCache,
|
|
460
460
|
StubQueryContextProvider,
|
|
461
461
|
new NoOpEntityMetricsAdapter(),
|
|
462
|
-
TestEntity.name
|
|
462
|
+
TestEntity.name,
|
|
463
463
|
);
|
|
464
464
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
465
465
|
|
|
466
466
|
await expect(
|
|
467
|
-
entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', ['2'])
|
|
467
|
+
entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'customIdField', ['2']),
|
|
468
468
|
).rejects.toThrow();
|
|
469
469
|
});
|
|
470
470
|
|
|
@@ -475,7 +475,7 @@ describe(EntityDataManager, () => {
|
|
|
475
475
|
const objects = getObjects();
|
|
476
476
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
477
477
|
testEntityConfiguration,
|
|
478
|
-
objects
|
|
478
|
+
objects,
|
|
479
479
|
);
|
|
480
480
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
481
481
|
const cacheAdapterProvider = new InMemoryFullCacheStubCacheAdapterProvider();
|
|
@@ -486,7 +486,7 @@ describe(EntityDataManager, () => {
|
|
|
486
486
|
entityCache,
|
|
487
487
|
StubQueryContextProvider,
|
|
488
488
|
metricsAdapter,
|
|
489
|
-
TestEntity.name
|
|
489
|
+
TestEntity.name,
|
|
490
490
|
);
|
|
491
491
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
492
492
|
|
|
@@ -497,8 +497,8 @@ describe(EntityDataManager, () => {
|
|
|
497
497
|
type: EntityMetricsLoadType.LOAD_MANY,
|
|
498
498
|
entityClassName: TestEntity.name,
|
|
499
499
|
count: 1,
|
|
500
|
-
})
|
|
501
|
-
)
|
|
500
|
+
}),
|
|
501
|
+
),
|
|
502
502
|
).once();
|
|
503
503
|
|
|
504
504
|
await entityDataManager.loadManyByFieldEqualityConjunctionAsync(
|
|
@@ -509,7 +509,7 @@ describe(EntityDataManager, () => {
|
|
|
509
509
|
fieldValue: '1',
|
|
510
510
|
},
|
|
511
511
|
],
|
|
512
|
-
{}
|
|
512
|
+
{},
|
|
513
513
|
);
|
|
514
514
|
verify(
|
|
515
515
|
metricsAdapterMock.logDataManagerLoadEvent(
|
|
@@ -517,8 +517,8 @@ describe(EntityDataManager, () => {
|
|
|
517
517
|
type: EntityMetricsLoadType.LOAD_MANY_EQUALITY_CONJUNCTION,
|
|
518
518
|
entityClassName: TestEntity.name,
|
|
519
519
|
count: 1,
|
|
520
|
-
})
|
|
521
|
-
)
|
|
520
|
+
}),
|
|
521
|
+
),
|
|
522
522
|
).once();
|
|
523
523
|
|
|
524
524
|
verify(
|
|
@@ -527,8 +527,8 @@ describe(EntityDataManager, () => {
|
|
|
527
527
|
type: IncrementLoadCountEventType.DATALOADER,
|
|
528
528
|
fieldValueCount: 1,
|
|
529
529
|
entityClassName: TestEntity.name,
|
|
530
|
-
})
|
|
531
|
-
)
|
|
530
|
+
}),
|
|
531
|
+
),
|
|
532
532
|
).once();
|
|
533
533
|
verify(
|
|
534
534
|
metricsAdapterMock.incrementDataManagerLoadCount(
|
|
@@ -536,8 +536,8 @@ describe(EntityDataManager, () => {
|
|
|
536
536
|
type: IncrementLoadCountEventType.CACHE,
|
|
537
537
|
fieldValueCount: 1,
|
|
538
538
|
entityClassName: TestEntity.name,
|
|
539
|
-
})
|
|
540
|
-
)
|
|
539
|
+
}),
|
|
540
|
+
),
|
|
541
541
|
).once();
|
|
542
542
|
verify(
|
|
543
543
|
metricsAdapterMock.incrementDataManagerLoadCount(
|
|
@@ -545,8 +545,8 @@ describe(EntityDataManager, () => {
|
|
|
545
545
|
type: IncrementLoadCountEventType.DATABASE,
|
|
546
546
|
fieldValueCount: 1,
|
|
547
547
|
entityClassName: TestEntity.name,
|
|
548
|
-
})
|
|
549
|
-
)
|
|
548
|
+
}),
|
|
549
|
+
),
|
|
550
550
|
).once();
|
|
551
551
|
|
|
552
552
|
resetCalls(metricsAdapterMock);
|
|
@@ -557,8 +557,8 @@ describe(EntityDataManager, () => {
|
|
|
557
557
|
anything(),
|
|
558
558
|
anyString(),
|
|
559
559
|
anything(),
|
|
560
|
-
anything()
|
|
561
|
-
)
|
|
560
|
+
anything(),
|
|
561
|
+
),
|
|
562
562
|
).thenResolve([]);
|
|
563
563
|
await entityDataManager.loadManyByRawWhereClauseAsync(queryContext, '', [], {});
|
|
564
564
|
verify(
|
|
@@ -567,8 +567,8 @@ describe(EntityDataManager, () => {
|
|
|
567
567
|
type: EntityMetricsLoadType.LOAD_MANY_RAW,
|
|
568
568
|
entityClassName: TestEntity.name,
|
|
569
569
|
count: 0,
|
|
570
|
-
})
|
|
571
|
-
)
|
|
570
|
+
}),
|
|
571
|
+
),
|
|
572
572
|
).once();
|
|
573
573
|
|
|
574
574
|
verify(metricsAdapterMock.incrementDataManagerLoadCount(anything())).never();
|
|
@@ -578,7 +578,7 @@ describe(EntityDataManager, () => {
|
|
|
578
578
|
const objects = getObjects();
|
|
579
579
|
const dataStore = StubDatabaseAdapter.convertFieldObjectsToDataStore(
|
|
580
580
|
testEntityConfiguration,
|
|
581
|
-
objects
|
|
581
|
+
objects,
|
|
582
582
|
);
|
|
583
583
|
const databaseAdapter = new StubDatabaseAdapter<TestFields>(testEntityConfiguration, dataStore);
|
|
584
584
|
const cacheAdapterProvider = new NoCacheStubCacheAdapterProvider();
|
|
@@ -589,18 +589,18 @@ describe(EntityDataManager, () => {
|
|
|
589
589
|
entityCache,
|
|
590
590
|
StubQueryContextProvider,
|
|
591
591
|
new NoOpEntityMetricsAdapter(),
|
|
592
|
-
TestEntity.name
|
|
592
|
+
TestEntity.name,
|
|
593
593
|
);
|
|
594
594
|
const queryContext = StubQueryContextProvider.getQueryContext();
|
|
595
595
|
|
|
596
596
|
await expect(
|
|
597
|
-
entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'nullableField', [null as any])
|
|
597
|
+
entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'nullableField', [null as any]),
|
|
598
598
|
).rejects.toThrowError('Invalid load: TestEntity (nullableField = null)');
|
|
599
599
|
|
|
600
600
|
await expect(
|
|
601
601
|
entityDataManager.loadManyByFieldEqualingAsync(queryContext, 'nullableField', [
|
|
602
602
|
undefined as any,
|
|
603
|
-
])
|
|
603
|
+
]),
|
|
604
604
|
).rejects.toThrowError('Invalid load: TestEntity (nullableField = undefined)');
|
|
605
605
|
});
|
|
606
606
|
});
|