@expo/entity 0.25.2 → 0.26.1
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/ComposedEntityCacheAdapter.d.ts +4 -2
- package/build/ComposedEntityCacheAdapter.js +39 -3
- package/build/ComposedEntityCacheAdapter.js.map +1 -1
- package/build/ComposedSecondaryEntityCache.d.ts +3 -2
- package/build/ComposedSecondaryEntityCache.js +3 -2
- package/build/ComposedSecondaryEntityCache.js.map +1 -1
- package/build/Entity.js +4 -4
- package/build/Entity.js.map +1 -1
- package/build/EntityAssociationLoader.d.ts +5 -0
- package/build/EntityAssociationLoader.js +5 -0
- package/build/EntityAssociationLoader.js.map +1 -1
- package/build/EntityFieldDefinition.d.ts +16 -8
- package/build/EntityFieldDefinition.js +12 -5
- package/build/EntityFieldDefinition.js.map +1 -1
- package/build/EntityLoader.js +2 -2
- package/build/EntityLoader.js.map +1 -1
- package/build/EntityMutationInfo.d.ts +2 -0
- package/build/EntityMutator.d.ts +6 -8
- package/build/EntityMutator.js +58 -46
- package/build/EntityMutator.js.map +1 -1
- package/build/EntityMutatorFactory.d.ts +4 -4
- package/build/EntityMutatorFactory.js +6 -6
- package/build/EntityMutatorFactory.js.map +1 -1
- package/build/EntityPrivacyPolicy.d.ts +13 -0
- package/build/EntityPrivacyPolicy.js +13 -0
- package/build/EntityPrivacyPolicy.js.map +1 -1
- package/build/EntityQueryContext.d.ts +11 -0
- package/build/EntityQueryContext.js +11 -0
- package/build/EntityQueryContext.js.map +1 -1
- package/build/ViewerScopedEntityMutatorFactory.d.ts +4 -4
- package/build/ViewerScopedEntityMutatorFactory.js +6 -6
- package/build/ViewerScopedEntityMutatorFactory.js.map +1 -1
- package/build/__tests__/ComposedCacheAdapter-test.js +37 -4
- package/build/__tests__/ComposedCacheAdapter-test.js.map +1 -1
- package/build/__tests__/EntityCommonUseCases-test.js +5 -1
- package/build/__tests__/EntityCommonUseCases-test.js.map +1 -1
- package/build/__tests__/EntityCompanion-test.js +5 -1
- package/build/__tests__/EntityCompanion-test.js.map +1 -1
- package/build/__tests__/EntityCompanionProvider-test.js +5 -1
- package/build/__tests__/EntityCompanionProvider-test.js.map +1 -1
- package/build/__tests__/EntityEdges-test.js +199 -33
- package/build/__tests__/EntityEdges-test.js.map +1 -1
- package/build/__tests__/EntityLoader-test.js +5 -1
- package/build/__tests__/EntityLoader-test.js.map +1 -1
- package/build/__tests__/EntityMutator-test.js +38 -53
- package/build/__tests__/EntityMutator-test.js.map +1 -1
- package/build/__tests__/EntityPrivacyPolicy-test.js +5 -1
- package/build/__tests__/EntityPrivacyPolicy-test.js.map +1 -1
- package/build/__tests__/EntitySelfReferentialEdges-test.js +2 -2
- package/build/__tests__/EntitySelfReferentialEdges-test.js.map +1 -1
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js +5 -1
- package/build/__tests__/ViewerScopedEntityCompanionProvider-test.js.map +1 -1
- package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js +2 -3
- package/build/__tests__/ViewerScopedEntityMutatorFactory-test.js.map +1 -1
- package/build/errors/EntityCacheAdapterError.js +5 -1
- package/build/errors/EntityCacheAdapterError.js.map +1 -1
- package/build/errors/EntityDatabaseAdapterError.js +5 -1
- package/build/errors/EntityDatabaseAdapterError.js.map +1 -1
- package/build/errors/EntityInvalidFieldValueError.js +6 -2
- package/build/errors/EntityInvalidFieldValueError.js.map +1 -1
- package/build/errors/EntityNotAuthorizedError.js +5 -1
- package/build/errors/EntityNotAuthorizedError.js.map +1 -1
- package/build/errors/EntityNotFoundError.js +6 -2
- package/build/errors/EntityNotFoundError.js.map +1 -1
- package/build/index.js +5 -1
- package/build/index.js.map +1 -1
- package/build/internal/EntityDataManager.js +7 -4
- package/build/internal/EntityDataManager.js.map +1 -1
- package/build/internal/EntityFieldTransformationUtils.js +1 -1
- package/build/internal/EntityFieldTransformationUtils.js.map +1 -1
- package/build/internal/ReadThroughEntityCache.js +1 -1
- package/build/internal/ReadThroughEntityCache.js.map +1 -1
- package/build/internal/__tests__/EntityDataManager-test.js +12 -7
- package/build/internal/__tests__/EntityDataManager-test.js.map +1 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.js +5 -1
- package/build/internal/__tests__/ReadThroughEntityCache-test.js.map +1 -1
- package/build/metrics/IEntityMetricsAdapter.d.ts +62 -17
- package/build/metrics/IEntityMetricsAdapter.js +17 -1
- package/build/metrics/IEntityMetricsAdapter.js.map +1 -1
- package/build/metrics/NoOpEntityMetricsAdapter.d.ts +1 -3
- package/build/metrics/NoOpEntityMetricsAdapter.js +1 -3
- package/build/metrics/NoOpEntityMetricsAdapter.js.map +1 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js +5 -1
- package/build/rules/AlwaysAllowPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js +5 -1
- package/build/rules/AlwaysDenyPrivacyPolicyRule.js.map +1 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js +5 -1
- package/build/rules/AlwaysSkipPrivacyPolicyRule.js.map +1 -1
- package/build/utils/testing/StubDatabaseAdapter.js +6 -2
- package/build/utils/testing/StubDatabaseAdapter.js.map +1 -1
- package/package.json +1 -1
- package/src/ComposedEntityCacheAdapter.ts +44 -3
- package/src/ComposedSecondaryEntityCache.ts +3 -2
- package/src/Entity.ts +4 -4
- package/src/EntityAssociationLoader.ts +5 -0
- package/src/EntityFieldDefinition.ts +15 -6
- package/src/EntityLoader.ts +4 -2
- package/src/EntityMutationInfo.ts +2 -0
- package/src/EntityMutator.ts +98 -67
- package/src/EntityMutatorFactory.ts +4 -10
- package/src/EntityPrivacyPolicy.ts +15 -0
- package/src/EntityQueryContext.ts +11 -0
- package/src/ViewerScopedEntityMutatorFactory.ts +7 -22
- package/src/__tests__/ComposedCacheAdapter-test.ts +43 -4
- package/src/__tests__/EntityEdges-test.ts +287 -32
- package/src/__tests__/EntityMutator-test.ts +33 -54
- package/src/__tests__/EntitySelfReferentialEdges-test.ts +2 -2
- package/src/__tests__/ViewerScopedEntityMutatorFactory-test.ts +2 -6
- package/src/errors/EntityInvalidFieldValueError.ts +1 -1
- package/src/errors/EntityNotFoundError.ts +1 -1
- package/src/internal/EntityDataManager.ts +13 -5
- package/src/internal/EntityFieldTransformationUtils.ts +1 -1
- package/src/internal/ReadThroughEntityCache.ts +3 -1
- package/src/internal/__tests__/EntityDataManager-test.ts +11 -8
- package/src/metrics/IEntityMetricsAdapter.ts +72 -19
- package/src/metrics/NoOpEntityMetricsAdapter.ts +1 -5
- package/src/utils/testing/StubDatabaseAdapter.ts +4 -1
|
@@ -4,10 +4,25 @@ export declare enum EntityMetricsLoadType {
|
|
|
4
4
|
LOAD_MANY_EQUALITY_CONJUNCTION = 1,
|
|
5
5
|
LOAD_MANY_RAW = 2
|
|
6
6
|
}
|
|
7
|
+
/**
|
|
8
|
+
* Event about a single call to an {@link EntityLoader} method.
|
|
9
|
+
*/
|
|
7
10
|
export interface EntityMetricsLoadEvent {
|
|
11
|
+
/**
|
|
12
|
+
* {@link EntityMetricsLoadType} for this load.
|
|
13
|
+
*/
|
|
8
14
|
type: EntityMetricsLoadType;
|
|
15
|
+
/**
|
|
16
|
+
* Class name of the {@link Entity} being loaded.
|
|
17
|
+
*/
|
|
9
18
|
entityClassName: string;
|
|
19
|
+
/**
|
|
20
|
+
* Total duration of this load, including fetch and construction of entities.
|
|
21
|
+
*/
|
|
10
22
|
duration: number;
|
|
23
|
+
/**
|
|
24
|
+
* Number of entities returned for this load.
|
|
25
|
+
*/
|
|
11
26
|
count: number;
|
|
12
27
|
}
|
|
13
28
|
export declare enum EntityMetricsMutationType {
|
|
@@ -16,19 +31,62 @@ export declare enum EntityMetricsMutationType {
|
|
|
16
31
|
DELETE = 2
|
|
17
32
|
}
|
|
18
33
|
export interface EntityMetricsMutationEvent {
|
|
34
|
+
/**
|
|
35
|
+
* {@link EntityMetricsMutationType} for this mutation.
|
|
36
|
+
*/
|
|
19
37
|
type: EntityMetricsMutationType;
|
|
38
|
+
/**
|
|
39
|
+
* Class name of the {@link Entity} being mutated.
|
|
40
|
+
*/
|
|
20
41
|
entityClassName: string;
|
|
42
|
+
/**
|
|
43
|
+
* Total duration of this mutation.
|
|
44
|
+
*/
|
|
21
45
|
duration: number;
|
|
22
46
|
}
|
|
47
|
+
export declare enum IncrementLoadCountEventType {
|
|
48
|
+
/**
|
|
49
|
+
* Type for when a dataloader load is initiated via the standard load methods
|
|
50
|
+
* since all loads go through a dataloader.
|
|
51
|
+
*/
|
|
52
|
+
DATALOADER = 0,
|
|
53
|
+
/**
|
|
54
|
+
* Type for when a cache load is initiated due to a dataloader miss.
|
|
55
|
+
*/
|
|
56
|
+
CACHE = 1,
|
|
57
|
+
/**
|
|
58
|
+
* Type for when a database load is initiated due to a dataloader and cache miss, when an entity query doesn't support caching, or during a transaction.
|
|
59
|
+
*/
|
|
60
|
+
DATABASE = 2
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Event used to record dataloader, cache, and database load counts in {@link EntityDataManager}.
|
|
64
|
+
*/
|
|
23
65
|
export interface IncrementLoadCountEvent {
|
|
66
|
+
/**
|
|
67
|
+
* Type of this event.
|
|
68
|
+
*/
|
|
69
|
+
type: IncrementLoadCountEventType;
|
|
70
|
+
/**
|
|
71
|
+
* Number of field values being loaded for this call.
|
|
72
|
+
*/
|
|
24
73
|
fieldValueCount: number;
|
|
74
|
+
/**
|
|
75
|
+
* Class name of the {@link Entity} being loaded.
|
|
76
|
+
*/
|
|
25
77
|
entityClassName: string;
|
|
26
78
|
}
|
|
27
79
|
export declare enum EntityMetricsAuthorizationResult {
|
|
28
80
|
DENY = 0,
|
|
29
81
|
ALLOW = 1
|
|
30
82
|
}
|
|
83
|
+
/**
|
|
84
|
+
* Event used to record a singe {@link EntityPrivacyPolicy} authorization.
|
|
85
|
+
*/
|
|
31
86
|
export interface EntityMetricsAuthorizationEvent {
|
|
87
|
+
/**
|
|
88
|
+
* Class name of the {@link Entity} being authorized.
|
|
89
|
+
*/
|
|
32
90
|
entityClassName: string;
|
|
33
91
|
action: EntityAuthorizationAction;
|
|
34
92
|
evaluationResult: EntityMetricsAuthorizationResult;
|
|
@@ -55,23 +113,10 @@ export default interface IEntityMetricsAdapter {
|
|
|
55
113
|
*/
|
|
56
114
|
logMutatorMutationEvent(mutationEvent: EntityMetricsMutationEvent): void;
|
|
57
115
|
/**
|
|
58
|
-
* Called when a dataloader load is initiated via the standard
|
|
59
|
-
* load methods (not equality conjunction or raw).
|
|
60
|
-
*
|
|
61
|
-
*/
|
|
62
|
-
incrementDataManagerDataloaderLoadCount(incrementLoadCountEvent: IncrementLoadCountEvent): void;
|
|
63
|
-
/**
|
|
64
|
-
* Called when a cache load is initiated via the standard
|
|
65
|
-
* load methods (not equality conjunction or raw). Occurs upon a dataloader
|
|
66
|
-
* miss.
|
|
67
|
-
* @param fieldValueCount - count of field values being loaded for a field
|
|
68
|
-
*/
|
|
69
|
-
incrementDataManagerCacheLoadCount(incrementLoadCountEvent: IncrementLoadCountEvent): void;
|
|
70
|
-
/**
|
|
71
|
-
* Called when a database load is initiated via the standard
|
|
72
|
-
* load methods (not equality conjunction or raw). Occurs upon a cache
|
|
73
|
-
* miss or when fetching an uncacheable field.
|
|
116
|
+
* Called when a dataloader, cache, or database load is initiated via the standard
|
|
117
|
+
* load methods (not equality conjunction or raw). Most commonly used for logging
|
|
118
|
+
* a waterfall to determine dataloader and cache hit rates and ratios.
|
|
74
119
|
* @param fieldValueCount - count of field values being loaded for a field
|
|
75
120
|
*/
|
|
76
|
-
|
|
121
|
+
incrementDataManagerLoadCount(incrementLoadCountEvent: IncrementLoadCountEvent): void;
|
|
77
122
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.EntityMetricsAuthorizationResult = exports.EntityMetricsMutationType = exports.EntityMetricsLoadType = void 0;
|
|
3
|
+
exports.EntityMetricsAuthorizationResult = exports.IncrementLoadCountEventType = exports.EntityMetricsMutationType = exports.EntityMetricsLoadType = void 0;
|
|
4
4
|
var EntityMetricsLoadType;
|
|
5
5
|
(function (EntityMetricsLoadType) {
|
|
6
6
|
EntityMetricsLoadType[EntityMetricsLoadType["LOAD_MANY"] = 0] = "LOAD_MANY";
|
|
@@ -13,6 +13,22 @@ var EntityMetricsMutationType;
|
|
|
13
13
|
EntityMetricsMutationType[EntityMetricsMutationType["UPDATE"] = 1] = "UPDATE";
|
|
14
14
|
EntityMetricsMutationType[EntityMetricsMutationType["DELETE"] = 2] = "DELETE";
|
|
15
15
|
})(EntityMetricsMutationType = exports.EntityMetricsMutationType || (exports.EntityMetricsMutationType = {}));
|
|
16
|
+
var IncrementLoadCountEventType;
|
|
17
|
+
(function (IncrementLoadCountEventType) {
|
|
18
|
+
/**
|
|
19
|
+
* Type for when a dataloader load is initiated via the standard load methods
|
|
20
|
+
* since all loads go through a dataloader.
|
|
21
|
+
*/
|
|
22
|
+
IncrementLoadCountEventType[IncrementLoadCountEventType["DATALOADER"] = 0] = "DATALOADER";
|
|
23
|
+
/**
|
|
24
|
+
* Type for when a cache load is initiated due to a dataloader miss.
|
|
25
|
+
*/
|
|
26
|
+
IncrementLoadCountEventType[IncrementLoadCountEventType["CACHE"] = 1] = "CACHE";
|
|
27
|
+
/**
|
|
28
|
+
* Type for when a database load is initiated due to a dataloader and cache miss, when an entity query doesn't support caching, or during a transaction.
|
|
29
|
+
*/
|
|
30
|
+
IncrementLoadCountEventType[IncrementLoadCountEventType["DATABASE"] = 2] = "DATABASE";
|
|
31
|
+
})(IncrementLoadCountEventType = exports.IncrementLoadCountEventType || (exports.IncrementLoadCountEventType = {}));
|
|
16
32
|
var EntityMetricsAuthorizationResult;
|
|
17
33
|
(function (EntityMetricsAuthorizationResult) {
|
|
18
34
|
EntityMetricsAuthorizationResult[EntityMetricsAuthorizationResult["DENY"] = 0] = "DENY";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IEntityMetricsAdapter.js","sourceRoot":"","sources":["../../src/metrics/IEntityMetricsAdapter.ts"],"names":[],"mappings":";;;AAKA,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,2EAAS,CAAA;IACT,qHAA8B,CAAA;IAC9B,mFAAa,CAAA;AACf,CAAC,EAJW,qBAAqB,GAArB,6BAAqB,KAArB,6BAAqB,QAIhC;
|
|
1
|
+
{"version":3,"file":"IEntityMetricsAdapter.js","sourceRoot":"","sources":["../../src/metrics/IEntityMetricsAdapter.ts"],"names":[],"mappings":";;;AAKA,IAAY,qBAIX;AAJD,WAAY,qBAAqB;IAC/B,2EAAS,CAAA;IACT,qHAA8B,CAAA;IAC9B,mFAAa,CAAA;AACf,CAAC,EAJW,qBAAqB,GAArB,6BAAqB,KAArB,6BAAqB,QAIhC;AA2BD,IAAY,yBAIX;AAJD,WAAY,yBAAyB;IACnC,6EAAM,CAAA;IACN,6EAAM,CAAA;IACN,6EAAM,CAAA;AACR,CAAC,EAJW,yBAAyB,GAAzB,iCAAyB,KAAzB,iCAAyB,QAIpC;AAmBD,IAAY,2BAgBX;AAhBD,WAAY,2BAA2B;IACrC;;;OAGG;IACH,yFAAU,CAAA;IAEV;;OAEG;IACH,+EAAK,CAAA;IAEL;;OAEG;IACH,qFAAQ,CAAA;AACV,CAAC,EAhBW,2BAA2B,GAA3B,mCAA2B,KAA3B,mCAA2B,QAgBtC;AAsBD,IAAY,gCAGX;AAHD,WAAY,gCAAgC;IAC1C,uFAAI,CAAA;IACJ,yFAAK,CAAA;AACP,CAAC,EAHW,gCAAgC,GAAhC,wCAAgC,KAAhC,wCAAgC,QAG3C"}
|
|
@@ -3,7 +3,5 @@ export default class NoOpEntityMetricsAdapter implements IEntityMetricsAdapter {
|
|
|
3
3
|
logAuthorizationEvent(_authorizationEvent: EntityMetricsAuthorizationEvent): void;
|
|
4
4
|
logDataManagerLoadEvent(_loadEvent: EntityMetricsLoadEvent): void;
|
|
5
5
|
logMutatorMutationEvent(_mutationEvent: EntityMetricsMutationEvent): void;
|
|
6
|
-
|
|
7
|
-
incrementDataManagerCacheLoadCount(_incrementLoadCountEvent: IncrementLoadCountEvent): void;
|
|
8
|
-
incrementDataManagerDatabaseLoadCount(_incrementLoadCountEvent: IncrementLoadCountEvent): void;
|
|
6
|
+
incrementDataManagerLoadCount(_incrementLoadCountEvent: IncrementLoadCountEvent): void;
|
|
9
7
|
}
|
|
@@ -4,9 +4,7 @@ class NoOpEntityMetricsAdapter {
|
|
|
4
4
|
logAuthorizationEvent(_authorizationEvent) { }
|
|
5
5
|
logDataManagerLoadEvent(_loadEvent) { }
|
|
6
6
|
logMutatorMutationEvent(_mutationEvent) { }
|
|
7
|
-
|
|
8
|
-
incrementDataManagerCacheLoadCount(_incrementLoadCountEvent) { }
|
|
9
|
-
incrementDataManagerDatabaseLoadCount(_incrementLoadCountEvent) { }
|
|
7
|
+
incrementDataManagerLoadCount(_incrementLoadCountEvent) { }
|
|
10
8
|
}
|
|
11
9
|
exports.default = NoOpEntityMetricsAdapter;
|
|
12
10
|
//# sourceMappingURL=NoOpEntityMetricsAdapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NoOpEntityMetricsAdapter.js","sourceRoot":"","sources":["../../src/metrics/NoOpEntityMetricsAdapter.ts"],"names":[],"mappings":";;AAOA,MAAqB,wBAAwB;IAC3C,qBAAqB,CAAC,mBAAoD,IAAS,CAAC;IACpF,uBAAuB,CAAC,UAAkC,IAAS,CAAC;IACpE,uBAAuB,CAAC,cAA0C,IAAS,CAAC;IAC5E,
|
|
1
|
+
{"version":3,"file":"NoOpEntityMetricsAdapter.js","sourceRoot":"","sources":["../../src/metrics/NoOpEntityMetricsAdapter.ts"],"names":[],"mappings":";;AAOA,MAAqB,wBAAwB;IAC3C,qBAAqB,CAAC,mBAAoD,IAAS,CAAC;IACpF,uBAAuB,CAAC,UAAkC,IAAS,CAAC;IACpE,uBAAuB,CAAC,cAA0C,IAAS,CAAC;IAC5E,6BAA6B,CAAC,wBAAiD,IAAS,CAAC;CAC1F;AALD,2CAKC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlwaysAllowPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysAllowPrivacyPolicyRule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AlwaysAllowPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysAllowPrivacyPolicyRule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yEAA8E;AAE9E;;GAEG;AACH,MAAqB,4BAMnB,SAAQ,2BAAyE;IACjF,KAAK,CAAC,aAAa,CACjB,cAA8B,EAC9B,aAAiC,EACjC,kBAAwD,EACxD,OAAgB;QAEhB,OAAO,wCAAoB,CAAC,KAAK,CAAC;IACpC,CAAC;CACF;AAfD,+CAeC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlwaysDenyPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysDenyPrivacyPolicyRule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AlwaysDenyPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysDenyPrivacyPolicyRule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yEAA8E;AAE9E;;GAEG;AACH,MAAqB,2BAMnB,SAAQ,2BAAyE;IACjF,KAAK,CAAC,aAAa,CACjB,cAA8B,EAC9B,aAAiC,EACjC,kBAAwD,EACxD,OAAgB;QAEhB,OAAO,wCAAoB,CAAC,IAAI,CAAC;IACnC,CAAC;CACF;AAfD,8CAeC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AlwaysSkipPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysSkipPrivacyPolicyRule.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AlwaysSkipPrivacyPolicyRule.js","sourceRoot":"","sources":["../../src/rules/AlwaysSkipPrivacyPolicyRule.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yEAA8E;AAE9E;;GAEG;AACH,MAAqB,2BAMnB,SAAQ,2BAAyE;IACjF,KAAK,CAAC,aAAa,CACjB,cAA8B,EAC9B,aAAiC,EACjC,kBAAwD,EACxD,OAAgB;QAEhB,OAAO,wCAAoB,CAAC,IAAI,CAAC;IACnC,CAAC;CACF;AAfD,8CAeC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
3
|
if (k2 === undefined) k2 = k;
|
|
4
|
-
Object.
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
5
9
|
}) : (function(o, m, k, k2) {
|
|
6
10
|
if (k2 === undefined) k2 = k;
|
|
7
11
|
o[k2] = m[k];
|
|
@@ -122,7 +126,7 @@ class StubDatabaseAdapter extends EntityDatabaseAdapter_1.default {
|
|
|
122
126
|
}
|
|
123
127
|
generateRandomID() {
|
|
124
128
|
const idSchemaField = this.entityConfiguration2.schema.get(this.entityConfiguration2.idField);
|
|
125
|
-
(0, invariant_1.default)(idSchemaField, `No schema field found for ${this.entityConfiguration2.idField}`);
|
|
129
|
+
(0, invariant_1.default)(idSchemaField, `No schema field found for ${String(this.entityConfiguration2.idField)}`);
|
|
126
130
|
if (idSchemaField instanceof EntityFields_1.StringField) {
|
|
127
131
|
return (0, uuid_1.v4)();
|
|
128
132
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StubDatabaseAdapter.js","sourceRoot":"","sources":["../../../src/utils/testing/StubDatabaseAdapter.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StubDatabaseAdapter.js","sourceRoot":"","sources":["../../../src/utils/testing/StubDatabaseAdapter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -4,14 +4,16 @@ import EntityCacheAdapter from './EntityCacheAdapter';
|
|
|
4
4
|
import EntityConfiguration from './EntityConfiguration';
|
|
5
5
|
import { CacheStatus, CacheLoadResult } from './internal/ReadThroughEntityCache';
|
|
6
6
|
|
|
7
|
+
/**
|
|
8
|
+
* A {@link EntityCacheAdapter} that composes other {@link EntityCacheAdapter} instances.
|
|
9
|
+
*/
|
|
7
10
|
export default class ComposedEntityCacheAdapter<TFields> extends EntityCacheAdapter<TFields> {
|
|
8
11
|
/**
|
|
9
|
-
* A {@link EntityCacheAdapter} that composes other {@link EntityCacheAdapter} instances.
|
|
10
|
-
*
|
|
11
12
|
* @param entityConfiguration - configuration for entity being loaded
|
|
12
13
|
* @param cacheAdapters - list of cache adapters to compose in order of precedence.
|
|
13
14
|
* Earlier cache adapters are read from first and written to (including invalidations) last.
|
|
14
15
|
* Typically, caches closer to the application should be ordered before caches closer to the database.
|
|
16
|
+
* A lower layer cache is closer to the database, while a higher layer cache is closer to the application.
|
|
15
17
|
*/
|
|
16
18
|
constructor(
|
|
17
19
|
entityConfiguration: EntityConfiguration<TFields>,
|
|
@@ -25,9 +27,14 @@ export default class ComposedEntityCacheAdapter<TFields> extends EntityCacheAdap
|
|
|
25
27
|
fieldValues: readonly NonNullable<TFields[N]>[]
|
|
26
28
|
): Promise<ReadonlyMap<NonNullable<TFields[N]>, CacheLoadResult<TFields>>> {
|
|
27
29
|
const retMap = new Map<NonNullable<TFields[N]>, CacheLoadResult<TFields>>();
|
|
30
|
+
const fulfilledFieldValuesByCacheIndex: NonNullable<TFields[N]>[][] = Array.from(
|
|
31
|
+
{ length: this.cacheAdapters.length },
|
|
32
|
+
() => []
|
|
33
|
+
);
|
|
28
34
|
|
|
29
35
|
let unfulfilledFieldValues = fieldValues;
|
|
30
|
-
for (
|
|
36
|
+
for (let i = 0; i < this.cacheAdapters.length; i++) {
|
|
37
|
+
const cacheAdapter = nullthrows(this.cacheAdapters[i]);
|
|
31
38
|
const cacheResultsFromAdapter = await cacheAdapter.loadManyAsync(
|
|
32
39
|
fieldName,
|
|
33
40
|
unfulfilledFieldValues
|
|
@@ -39,9 +46,43 @@ export default class ComposedEntityCacheAdapter<TFields> extends EntityCacheAdap
|
|
|
39
46
|
newUnfulfilledFieldValues.push(fieldValue);
|
|
40
47
|
} else {
|
|
41
48
|
retMap.set(fieldValue, cacheResult);
|
|
49
|
+
nullthrows(fulfilledFieldValuesByCacheIndex[i]).push(fieldValue);
|
|
42
50
|
}
|
|
43
51
|
}
|
|
44
52
|
unfulfilledFieldValues = newUnfulfilledFieldValues;
|
|
53
|
+
if (unfulfilledFieldValues.length === 0) {
|
|
54
|
+
break;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Recache values from lower layers that were not found in higher layers
|
|
59
|
+
// Write to lower layers first
|
|
60
|
+
for (let i = this.cacheAdapters.length - 1; i >= 0; i--) {
|
|
61
|
+
const cacheAdapter = nullthrows(this.cacheAdapters[i]);
|
|
62
|
+
const hitsToCache = new Map<NonNullable<TFields[N]>, Readonly<TFields>>();
|
|
63
|
+
const negativesToCache: NonNullable<TFields[N]>[] = [];
|
|
64
|
+
|
|
65
|
+
// Loop over all lower layer caches to collect hits and misses
|
|
66
|
+
for (let j = i + 1; j < this.cacheAdapters.length; j++) {
|
|
67
|
+
const fulfilledFieldValues = nullthrows(fulfilledFieldValuesByCacheIndex[j]);
|
|
68
|
+
fulfilledFieldValues.forEach((fieldValue) => {
|
|
69
|
+
const cacheResult = nullthrows(retMap.get(fieldValue));
|
|
70
|
+
if (cacheResult.status === CacheStatus.HIT) {
|
|
71
|
+
hitsToCache.set(fieldValue, cacheResult.item);
|
|
72
|
+
} else if (cacheResult.status === CacheStatus.NEGATIVE) {
|
|
73
|
+
negativesToCache.push(fieldValue);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const promises = [];
|
|
79
|
+
if (hitsToCache.size > 0) {
|
|
80
|
+
promises.push(cacheAdapter.cacheManyAsync(fieldName, hitsToCache));
|
|
81
|
+
}
|
|
82
|
+
if (negativesToCache.length > 0) {
|
|
83
|
+
promises.push(cacheAdapter.cacheDBMissesAsync(fieldName, negativesToCache));
|
|
84
|
+
}
|
|
85
|
+
await Promise.all(promises);
|
|
45
86
|
}
|
|
46
87
|
|
|
47
88
|
for (const fieldValue of unfulfilledFieldValues) {
|
|
@@ -2,12 +2,13 @@ import nullthrows from 'nullthrows';
|
|
|
2
2
|
|
|
3
3
|
import { ISecondaryEntityCache } from './EntitySecondaryCacheLoader';
|
|
4
4
|
|
|
5
|
+
/**
|
|
6
|
+
* A {@link ISecondaryEntityCache} that composes other {@link ISecondaryEntityCache} instances.
|
|
7
|
+
*/
|
|
5
8
|
export default class ComposedSecondaryEntityCache<TLoadParams, TFields>
|
|
6
9
|
implements ISecondaryEntityCache<TFields, TLoadParams>
|
|
7
10
|
{
|
|
8
11
|
/**
|
|
9
|
-
* A {@link ISecondaryEntityCache} that composes other {@link ISecondaryEntityCache} instances.
|
|
10
|
-
*
|
|
11
12
|
* @param secondaryEntityCaches - list of caches to compose in order of precedence.
|
|
12
13
|
* Earlier caches are read from first and written to (including invalidations) last.
|
|
13
14
|
* Typically, caches closer to the application should be ordered before caches closer to the database.
|
package/src/Entity.ts
CHANGED
|
@@ -69,7 +69,7 @@ export default abstract class Entity<
|
|
|
69
69
|
return viewerContext
|
|
70
70
|
.getViewerScopedEntityCompanionForClass(this)
|
|
71
71
|
.getMutatorFactory()
|
|
72
|
-
.forCreate(queryContext
|
|
72
|
+
.forCreate(queryContext);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
/**
|
|
@@ -111,7 +111,7 @@ export default abstract class Entity<
|
|
|
111
111
|
.getViewerContext()
|
|
112
112
|
.getViewerScopedEntityCompanionForClass(this)
|
|
113
113
|
.getMutatorFactory()
|
|
114
|
-
.forUpdate(existingEntity, queryContext
|
|
114
|
+
.forUpdate(existingEntity, queryContext);
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
/**
|
|
@@ -152,7 +152,7 @@ export default abstract class Entity<
|
|
|
152
152
|
.getViewerContext()
|
|
153
153
|
.getViewerScopedEntityCompanionForClass(this)
|
|
154
154
|
.getMutatorFactory()
|
|
155
|
-
.forDelete(existingEntity, queryContext
|
|
155
|
+
.forDelete(existingEntity, queryContext)
|
|
156
156
|
.deleteAsync();
|
|
157
157
|
}
|
|
158
158
|
|
|
@@ -194,7 +194,7 @@ export default abstract class Entity<
|
|
|
194
194
|
.getViewerContext()
|
|
195
195
|
.getViewerScopedEntityCompanionForClass(this)
|
|
196
196
|
.getMutatorFactory()
|
|
197
|
-
.forDelete(existingEntity, queryContext
|
|
197
|
+
.forDelete(existingEntity, queryContext)
|
|
198
198
|
.enforceDeleteAsync();
|
|
199
199
|
}
|
|
200
200
|
|
|
@@ -6,6 +6,11 @@ import { EntityQueryContext } from './EntityQueryContext';
|
|
|
6
6
|
import ReadonlyEntity from './ReadonlyEntity';
|
|
7
7
|
import ViewerContext from './ViewerContext';
|
|
8
8
|
|
|
9
|
+
/**
|
|
10
|
+
* An association loader is a set of convenience methods for loading entities
|
|
11
|
+
* associated with an entity. In relational databases, these entities are often referenced
|
|
12
|
+
* by foreign keys.
|
|
13
|
+
*/
|
|
9
14
|
export default class EntityAssociationLoader<
|
|
10
15
|
TFields,
|
|
11
16
|
TID extends NonNullable<TFields[TSelectedFields]>,
|
|
@@ -5,13 +5,21 @@ import ViewerContext from './ViewerContext';
|
|
|
5
5
|
|
|
6
6
|
export enum EntityEdgeDeletionBehavior {
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Invalidate the cache for all entities that reference the entity
|
|
9
9
|
* being deleted through this field, and transitively run deletions on those entities.
|
|
10
10
|
* This is most useful when the database itself expresses foreign
|
|
11
|
-
* keys and cascading deletes
|
|
11
|
+
* keys and cascading deletes and the entity framework just needs to
|
|
12
12
|
* be kept consistent with the state of the database.
|
|
13
13
|
*/
|
|
14
|
-
|
|
14
|
+
CASCADE_DELETE_INVALIDATE_CACHE_ONLY,
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Invalidate the cache for all entities that reference the entity
|
|
18
|
+
* being deleted through this field. This is most useful when the database itself expresses
|
|
19
|
+
* foreign keys and cascading "SET NULL"s and the entity framework just needs to be
|
|
20
|
+
* kept consistent with the state of the database.
|
|
21
|
+
*/
|
|
22
|
+
SET_NULL_INVALIDATE_CACHE_ONLY,
|
|
15
23
|
|
|
16
24
|
/**
|
|
17
25
|
* Delete all entities that reference the entity being deleted through this field. This is very similar
|
|
@@ -74,16 +82,17 @@ export interface EntityAssociationDefinition<
|
|
|
74
82
|
*
|
|
75
83
|
* @remarks
|
|
76
84
|
* The entity framework doesn't prescribe a one-size-fits-all solution for referential
|
|
77
|
-
* integrity; instead it exposes mechanisms that
|
|
85
|
+
* integrity; instead it exposes mechanisms that support both database foreign key constraints
|
|
78
86
|
* and implicit entity-specified foreign keys. Choosing which approach to use often depends on
|
|
79
87
|
* application requirements, and sometimes even a mix-and-match is the right choice.
|
|
80
88
|
*
|
|
81
89
|
* - If referential integrity is critical to your application, database foreign key constraints
|
|
82
|
-
* combined with {@link EntityEdgeDeletionBehavior.
|
|
90
|
+
* combined with {@link EntityEdgeDeletionBehavior.CASCADE_DELETE_INVALIDATE_CACHE_ONLY} or
|
|
91
|
+
* {@link EntityEdgeDeletionBehavior.SET_NULL_INVALIDATE_CACHE_ONLY} are recommended.
|
|
83
92
|
* - If the database being used doesn't support foreign keys, then using the entity framework for referential
|
|
84
93
|
* integrity is recommended.
|
|
85
94
|
*/
|
|
86
|
-
edgeDeletionBehavior
|
|
95
|
+
edgeDeletionBehavior: EntityEdgeDeletionBehavior;
|
|
87
96
|
}
|
|
88
97
|
|
|
89
98
|
/**
|
package/src/EntityLoader.ts
CHANGED
|
@@ -126,7 +126,9 @@ export default class EntityLoader<
|
|
|
126
126
|
const entityResults = await this.loadManyByFieldEqualingAsync(uniqueFieldName, fieldValue);
|
|
127
127
|
invariant(
|
|
128
128
|
entityResults.length <= 1,
|
|
129
|
-
`loadByFieldEqualing: Multiple entities of type ${this.entityClass.name} found for ${
|
|
129
|
+
`loadByFieldEqualing: Multiple entities of type ${this.entityClass.name} found for ${String(
|
|
130
|
+
uniqueFieldName
|
|
131
|
+
)}=${fieldValue}`
|
|
130
132
|
);
|
|
131
133
|
return entityResults[0] ?? null;
|
|
132
134
|
}
|
|
@@ -350,7 +352,7 @@ export default class EntityLoader<
|
|
|
350
352
|
fieldValues: readonly TFields[N][]
|
|
351
353
|
): void {
|
|
352
354
|
const fieldDefinition = this.entityConfiguration.schema.get(fieldName);
|
|
353
|
-
invariant(fieldDefinition, `must have field definition for field = ${fieldName}`);
|
|
355
|
+
invariant(fieldDefinition, `must have field definition for field = ${String(fieldName)}`);
|
|
354
356
|
for (const fieldValue of fieldValues) {
|
|
355
357
|
const isInputValid = fieldDefinition.validateInputValue(fieldValue);
|
|
356
358
|
if (!isInputValid) {
|
|
@@ -20,6 +20,7 @@ export type EntityValidatorMutationInfo<
|
|
|
20
20
|
| {
|
|
21
21
|
type: EntityMutationType.UPDATE;
|
|
22
22
|
previousValue: TEntity;
|
|
23
|
+
cascadingDeleteCause: EntityCascadingDeletionInfo | null;
|
|
23
24
|
};
|
|
24
25
|
|
|
25
26
|
/**
|
|
@@ -50,6 +51,7 @@ export type EntityTriggerMutationInfo<
|
|
|
50
51
|
| {
|
|
51
52
|
type: EntityMutationType.UPDATE;
|
|
52
53
|
previousValue: TEntity;
|
|
54
|
+
cascadingDeleteCause: EntityCascadingDeletionInfo | null;
|
|
53
55
|
}
|
|
54
56
|
| {
|
|
55
57
|
type: EntityMutationType.DELETE;
|