@cratis/chronicle 3.0.0 → 3.1.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/ChronicleClient.ts +4 -3
- package/EventStore.ts +20 -3
- package/IEventStore.ts +16 -0
- package/README.md +40 -28
- package/auditing/CausationType.ts +10 -0
- package/compliance/ComplianceContracts.ts +84 -0
- package/compliance/IPIIManager.ts +17 -0
- package/compliance/PIIManager.ts +31 -0
- package/compliance/index.ts +2 -0
- package/connection/ChronicleConnection.ts +7 -1
- package/connection/ChronicleServices.ts +2 -0
- package/connection/Guid.ts +18 -0
- package/connection/callResults.spec.ts +90 -0
- package/connection/callResults.ts +112 -0
- package/dist/ChronicleClient.d.ts.map +1 -1
- package/dist/ChronicleClient.js +4 -3
- package/dist/ChronicleClient.js.map +1 -1
- package/dist/EventStore.d.ts +8 -0
- package/dist/EventStore.d.ts.map +1 -1
- package/dist/EventStore.js +16 -3
- package/dist/EventStore.js.map +1 -1
- package/dist/IEventStore.d.ts +12 -0
- package/dist/IEventStore.d.ts.map +1 -1
- package/dist/auditing/CausationType.d.ts +8 -0
- package/dist/auditing/CausationType.d.ts.map +1 -1
- package/dist/auditing/CausationType.js +8 -0
- package/dist/auditing/CausationType.js.map +1 -1
- package/dist/compliance/ComplianceContracts.d.ts +40 -0
- package/dist/compliance/ComplianceContracts.d.ts.map +1 -1
- package/dist/compliance/ComplianceContracts.js +71 -0
- package/dist/compliance/ComplianceContracts.js.map +1 -1
- package/dist/compliance/IPIIManager.d.ts +15 -0
- package/dist/compliance/IPIIManager.d.ts.map +1 -0
- package/dist/compliance/IPIIManager.js +4 -0
- package/dist/compliance/IPIIManager.js.map +1 -0
- package/dist/compliance/PIIManager.d.ts +20 -0
- package/dist/compliance/PIIManager.d.ts.map +1 -0
- package/dist/compliance/PIIManager.js +30 -0
- package/dist/compliance/PIIManager.js.map +1 -0
- package/dist/compliance/index.d.ts +2 -0
- package/dist/compliance/index.d.ts.map +1 -1
- package/dist/compliance/index.js +1 -0
- package/dist/compliance/index.js.map +1 -1
- package/dist/connection/ChronicleConnection.d.ts +1 -0
- package/dist/connection/ChronicleConnection.d.ts.map +1 -1
- package/dist/connection/ChronicleConnection.js +6 -1
- package/dist/connection/ChronicleConnection.js.map +1 -1
- package/dist/connection/ChronicleServices.d.ts +2 -0
- package/dist/connection/ChronicleServices.d.ts.map +1 -1
- package/dist/connection/Guid.d.ts +5 -0
- package/dist/connection/Guid.d.ts.map +1 -1
- package/dist/connection/Guid.js +15 -0
- package/dist/connection/Guid.js.map +1 -1
- package/dist/connection/callResults.d.ts +69 -0
- package/dist/connection/callResults.d.ts.map +1 -0
- package/dist/connection/callResults.js +74 -0
- package/dist/connection/callResults.js.map +1 -0
- package/dist/eventSequences/AppendOperationsBroadcaster.d.ts +16 -0
- package/dist/eventSequences/AppendOperationsBroadcaster.d.ts.map +1 -0
- package/dist/eventSequences/AppendOperationsBroadcaster.js +77 -0
- package/dist/eventSequences/AppendOperationsBroadcaster.js.map +1 -0
- package/dist/eventSequences/AppendOptions.d.ts +7 -0
- package/dist/eventSequences/AppendOptions.d.ts.map +1 -1
- package/dist/eventSequences/AppendResult.d.ts +14 -0
- package/dist/eventSequences/AppendResult.d.ts.map +1 -1
- package/dist/eventSequences/AppendedEventWithResult.d.ts +13 -0
- package/dist/eventSequences/AppendedEventWithResult.d.ts.map +1 -0
- package/dist/eventSequences/AppendedEventWithResult.js +4 -0
- package/dist/eventSequences/AppendedEventWithResult.js.map +1 -0
- package/dist/eventSequences/CompleteStreamError.d.ts +17 -0
- package/dist/eventSequences/CompleteStreamError.d.ts.map +1 -0
- package/dist/eventSequences/CompleteStreamError.js +20 -0
- package/dist/eventSequences/CompleteStreamError.js.map +1 -0
- package/dist/eventSequences/CompleteStreamResult.d.ts +14 -0
- package/dist/eventSequences/CompleteStreamResult.d.ts.map +1 -0
- package/dist/eventSequences/CompleteStreamResult.js +4 -0
- package/dist/eventSequences/CompleteStreamResult.js.map +1 -0
- package/dist/eventSequences/ConcurrencyViolation.d.ts +13 -0
- package/dist/eventSequences/ConcurrencyViolation.d.ts.map +1 -0
- package/dist/eventSequences/ConcurrencyViolation.js +4 -0
- package/dist/eventSequences/ConcurrencyViolation.js.map +1 -0
- package/dist/eventSequences/EventForEventSourceId.d.ts +8 -0
- package/dist/eventSequences/EventForEventSourceId.d.ts.map +1 -1
- package/dist/eventSequences/EventSequence.d.ts +35 -1
- package/dist/eventSequences/EventSequence.d.ts.map +1 -1
- package/dist/eventSequences/EventSequence.js +350 -19
- package/dist/eventSequences/EventSequence.js.map +1 -1
- package/dist/eventSequences/IEventSequence.d.ts +85 -1
- package/dist/eventSequences/IEventSequence.d.ts.map +1 -1
- package/dist/eventSequences/WaitForCompletionResult.d.ts +11 -0
- package/dist/eventSequences/WaitForCompletionResult.d.ts.map +1 -0
- package/dist/eventSequences/WaitForCompletionResult.js +4 -0
- package/dist/eventSequences/WaitForCompletionResult.js.map +1 -0
- package/dist/eventSequences/index.d.ts +5 -0
- package/dist/eventSequences/index.d.ts.map +1 -1
- package/dist/eventSequences/index.js +1 -0
- package/dist/eventSequences/index.js.map +1 -1
- package/dist/eventStoreSubscriptions/EventStoreSubscriptions.d.ts +3 -0
- package/dist/eventStoreSubscriptions/EventStoreSubscriptions.d.ts.map +1 -1
- package/dist/eventStoreSubscriptions/EventStoreSubscriptions.js +9 -0
- package/dist/eventStoreSubscriptions/EventStoreSubscriptions.js.map +1 -1
- package/dist/eventStoreSubscriptions/IEventStoreSubscriptions.d.ts +6 -0
- package/dist/eventStoreSubscriptions/IEventStoreSubscriptions.d.ts.map +1 -1
- package/dist/eventStoreSubscriptions/contracts.d.ts +18 -0
- package/dist/eventStoreSubscriptions/contracts.d.ts.map +1 -1
- package/dist/eventStoreSubscriptions/contracts.js +106 -0
- package/dist/eventStoreSubscriptions/contracts.js.map +1 -1
- package/dist/events/constraints/Constraints.js +4 -4
- package/dist/events/constraints/Constraints.js.map +1 -1
- package/dist/externalServices/ExternalServiceBuilder.d.ts +42 -0
- package/dist/externalServices/ExternalServiceBuilder.d.ts.map +1 -0
- package/dist/externalServices/ExternalServiceBuilder.js +110 -0
- package/dist/externalServices/ExternalServiceBuilder.js.map +1 -0
- package/dist/externalServices/ExternalServices.d.ts +19 -0
- package/dist/externalServices/ExternalServices.d.ts.map +1 -0
- package/dist/externalServices/ExternalServices.js +30 -0
- package/dist/externalServices/ExternalServices.js.map +1 -0
- package/dist/externalServices/ExternalServicesContracts.d.ts +137 -0
- package/dist/externalServices/ExternalServicesContracts.d.ts.map +1 -0
- package/dist/externalServices/ExternalServicesContracts.js +654 -0
- package/dist/externalServices/ExternalServicesContracts.js.map +1 -0
- package/dist/externalServices/IExternalServiceBuilder.d.ts +67 -0
- package/dist/externalServices/IExternalServiceBuilder.d.ts.map +1 -0
- package/dist/externalServices/IExternalServiceBuilder.js +4 -0
- package/dist/externalServices/IExternalServiceBuilder.js.map +1 -0
- package/dist/externalServices/IExternalServices.d.ts +13 -0
- package/dist/externalServices/IExternalServices.d.ts.map +1 -0
- package/dist/externalServices/IExternalServices.js +4 -0
- package/dist/externalServices/IExternalServices.js.map +1 -0
- package/dist/externalServices/index.d.ts +5 -0
- package/dist/externalServices/index.d.ts.map +1 -0
- package/dist/externalServices/index.js +5 -0
- package/dist/externalServices/index.js.map +1 -0
- package/dist/identities/IIdentityManager.d.ts +17 -0
- package/dist/identities/IIdentityManager.d.ts.map +1 -0
- package/dist/identities/IIdentityManager.js +4 -0
- package/dist/identities/IIdentityManager.js.map +1 -0
- package/dist/identities/IdentityManager.d.ts +20 -0
- package/dist/identities/IdentityManager.d.ts.map +1 -0
- package/dist/identities/IdentityManager.js +31 -0
- package/dist/identities/IdentityManager.js.map +1 -0
- package/dist/identities/index.d.ts +3 -0
- package/dist/identities/index.d.ts.map +1 -0
- package/dist/identities/index.js +4 -0
- package/dist/identities/index.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/jobs/IJobs.d.ts +4 -4
- package/dist/jobs/IJobs.d.ts.map +1 -1
- package/dist/jobs/Jobs.d.ts +4 -4
- package/dist/jobs/Jobs.d.ts.map +1 -1
- package/dist/jobs/Jobs.js +12 -10
- package/dist/jobs/Jobs.js.map +1 -1
- package/dist/observation/FailedPartition.d.ts +15 -0
- package/dist/observation/FailedPartition.d.ts.map +1 -0
- package/dist/observation/FailedPartition.js +4 -0
- package/dist/observation/FailedPartition.js.map +1 -0
- package/dist/observation/FailedPartitionAttempt.d.ts +15 -0
- package/dist/observation/FailedPartitionAttempt.d.ts.map +1 -0
- package/dist/observation/FailedPartitionAttempt.js +4 -0
- package/dist/observation/FailedPartitionAttempt.js.map +1 -0
- package/dist/observation/FailedPartitions.d.ts +24 -0
- package/dist/observation/FailedPartitions.d.ts.map +1 -0
- package/dist/observation/FailedPartitions.js +39 -0
- package/dist/observation/FailedPartitions.js.map +1 -0
- package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.d.ts +19 -0
- package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.d.ts.map +1 -0
- package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.js +4 -0
- package/dist/observation/ICanBeNotifiedWhenPartitionReplayed.js.map +1 -0
- package/dist/observation/ICanBeNotifiedWhenReplay.d.ts +17 -0
- package/dist/observation/ICanBeNotifiedWhenReplay.d.ts.map +1 -0
- package/dist/observation/ICanBeNotifiedWhenReplay.js +4 -0
- package/dist/observation/ICanBeNotifiedWhenReplay.js.map +1 -0
- package/dist/observation/IFailedPartitions.d.ts +18 -0
- package/dist/observation/IFailedPartitions.d.ts.map +1 -0
- package/dist/observation/IFailedPartitions.js +4 -0
- package/dist/observation/IFailedPartitions.js.map +1 -0
- package/dist/observation/index.d.ts +6 -0
- package/dist/observation/index.d.ts.map +1 -1
- package/dist/observation/index.js +1 -0
- package/dist/observation/index.js.map +1 -1
- package/dist/observation/notifyReplayLifecycle.d.ts +13 -0
- package/dist/observation/notifyReplayLifecycle.d.ts.map +1 -0
- package/dist/observation/notifyReplayLifecycle.js +54 -0
- package/dist/observation/notifyReplayLifecycle.js.map +1 -0
- package/dist/observation/toClientFailedPartition.d.ts +9 -0
- package/dist/observation/toClientFailedPartition.d.ts.map +1 -0
- package/dist/observation/toClientFailedPartition.js +23 -0
- package/dist/observation/toClientFailedPartition.js.map +1 -0
- package/dist/projections/Projections.d.ts +0 -4
- package/dist/projections/Projections.d.ts.map +1 -1
- package/dist/projections/Projections.js +25 -103
- package/dist/projections/Projections.js.map +1 -1
- package/dist/projections/declarative/AddBuilder.d.ts +17 -0
- package/dist/projections/declarative/AddBuilder.d.ts.map +1 -0
- package/dist/projections/declarative/AddBuilder.js +28 -0
- package/dist/projections/declarative/AddBuilder.js.map +1 -0
- package/dist/projections/declarative/AddChildBuilder.d.ts +56 -0
- package/dist/projections/declarative/AddChildBuilder.d.ts.map +1 -0
- package/dist/projections/declarative/AddChildBuilder.js +72 -0
- package/dist/projections/declarative/AddChildBuilder.js.map +1 -0
- package/dist/projections/declarative/ChildrenBuilder.d.ts +28 -0
- package/dist/projections/declarative/ChildrenBuilder.d.ts.map +1 -0
- package/dist/projections/declarative/ChildrenBuilder.js +72 -0
- package/dist/projections/declarative/ChildrenBuilder.js.map +1 -0
- package/dist/projections/declarative/CompositeKeyBuilder.d.ts +16 -0
- package/dist/projections/declarative/CompositeKeyBuilder.d.ts.map +1 -0
- package/dist/projections/declarative/CompositeKeyBuilder.js +29 -0
- package/dist/projections/declarative/CompositeKeyBuilder.js.map +1 -0
- package/dist/projections/declarative/FromBuilder.d.ts +8 -6
- package/dist/projections/declarative/FromBuilder.d.ts.map +1 -1
- package/dist/projections/declarative/FromBuilder.js +44 -14
- package/dist/projections/declarative/FromBuilder.js.map +1 -1
- package/dist/projections/declarative/ICompositeKeyBuilder.d.ts +5 -0
- package/dist/projections/declarative/ICompositeKeyBuilder.d.ts.map +1 -1
- package/dist/projections/declarative/JoinBuilder.d.ts +7 -5
- package/dist/projections/declarative/JoinBuilder.d.ts.map +1 -1
- package/dist/projections/declarative/JoinBuilder.js +50 -16
- package/dist/projections/declarative/JoinBuilder.js.map +1 -1
- package/dist/projections/declarative/NestedBuilder.d.ts +24 -0
- package/dist/projections/declarative/NestedBuilder.d.ts.map +1 -0
- package/dist/projections/declarative/NestedBuilder.js +60 -0
- package/dist/projections/declarative/NestedBuilder.js.map +1 -0
- package/dist/projections/declarative/ProjectionBuilderCore.d.ts +127 -0
- package/dist/projections/declarative/ProjectionBuilderCore.d.ts.map +1 -0
- package/dist/projections/declarative/ProjectionBuilderCore.js +180 -0
- package/dist/projections/declarative/ProjectionBuilderCore.js.map +1 -0
- package/dist/projections/declarative/ProjectionBuilderFor.d.ts +6 -32
- package/dist/projections/declarative/ProjectionBuilderFor.d.ts.map +1 -1
- package/dist/projections/declarative/ProjectionBuilderFor.js +24 -118
- package/dist/projections/declarative/ProjectionBuilderFor.js.map +1 -1
- package/dist/projections/declarative/SubtractBuilder.d.ts +17 -0
- package/dist/projections/declarative/SubtractBuilder.d.ts.map +1 -0
- package/dist/projections/declarative/SubtractBuilder.js +28 -0
- package/dist/projections/declarative/SubtractBuilder.js.map +1 -0
- package/dist/projections/declarative/index.d.ts +9 -0
- package/dist/projections/declarative/index.d.ts.map +1 -1
- package/dist/projections/declarative/index.js +8 -0
- package/dist/projections/declarative/index.js.map +1 -1
- package/dist/projections/modelBound/childrenAndNestedBuilder.d.ts +90 -0
- package/dist/projections/modelBound/childrenAndNestedBuilder.d.ts.map +1 -0
- package/dist/projections/modelBound/childrenAndNestedBuilder.js +290 -0
- package/dist/projections/modelBound/childrenAndNestedBuilder.js.map +1 -0
- package/dist/reactors/ReactorSideEffects.d.ts +29 -0
- package/dist/reactors/ReactorSideEffects.d.ts.map +1 -0
- package/dist/reactors/ReactorSideEffects.js +70 -0
- package/dist/reactors/ReactorSideEffects.js.map +1 -0
- package/dist/reactors/Reactors.d.ts +4 -1
- package/dist/reactors/Reactors.d.ts.map +1 -1
- package/dist/reactors/Reactors.js +23 -4
- package/dist/reactors/Reactors.js.map +1 -1
- package/dist/reducers/Reducers.d.ts.map +1 -1
- package/dist/reducers/Reducers.js +15 -3
- package/dist/reducers/Reducers.js.map +1 -1
- package/dist/reducers/reducer.d.ts +9 -1
- package/dist/reducers/reducer.d.ts.map +1 -1
- package/dist/reducers/reducer.js +4 -2
- package/dist/reducers/reducer.js.map +1 -1
- package/dist/transactions/IUnitOfWork.d.ts +18 -0
- package/dist/transactions/IUnitOfWork.d.ts.map +1 -1
- package/dist/transactions/UnitOfWork.d.ts +9 -0
- package/dist/transactions/UnitOfWork.d.ts.map +1 -1
- package/dist/transactions/UnitOfWork.js +14 -0
- package/dist/transactions/UnitOfWork.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/eventSequences/AppendOperationsBroadcaster.ts +83 -0
- package/eventSequences/AppendOptions.ts +8 -0
- package/eventSequences/AppendResult.ts +16 -0
- package/eventSequences/AppendedEventWithResult.ts +17 -0
- package/eventSequences/CompleteStreamError.ts +20 -0
- package/eventSequences/CompleteStreamResult.ts +13 -0
- package/eventSequences/ConcurrencyViolation.ts +18 -0
- package/eventSequences/EventForEventSourceId.ts +12 -0
- package/eventSequences/EventSequence.spec.ts +588 -0
- package/eventSequences/EventSequence.ts +406 -20
- package/eventSequences/IEventSequence.ts +109 -1
- package/eventSequences/WaitForCompletionResult.ts +15 -0
- package/eventSequences/index.ts +5 -0
- package/eventStoreSubscriptions/EventStoreSubscriptions.spec.ts +52 -0
- package/eventStoreSubscriptions/EventStoreSubscriptions.ts +19 -1
- package/eventStoreSubscriptions/IEventStoreSubscriptions.ts +7 -0
- package/eventStoreSubscriptions/contracts.ts +126 -0
- package/events/constraints/Constraints.ts +4 -4
- package/externalServices/ExternalServiceBuilder.ts +128 -0
- package/externalServices/ExternalServices.ts +34 -0
- package/externalServices/ExternalServicesContracts.ts +709 -0
- package/externalServices/IExternalServiceBuilder.ts +76 -0
- package/externalServices/IExternalServices.ts +16 -0
- package/externalServices/index.ts +7 -0
- package/identities/IIdentityManager.ts +19 -0
- package/identities/IdentityManager.ts +32 -0
- package/identities/index.ts +5 -0
- package/index.ts +6 -0
- package/jobs/IJobs.ts +4 -4
- package/jobs/Jobs.ts +16 -14
- package/observation/FailedPartition.ts +21 -0
- package/observation/FailedPartitionAttempt.ts +21 -0
- package/observation/FailedPartitions.spec.ts +75 -0
- package/observation/FailedPartitions.ts +44 -0
- package/observation/ICanBeNotifiedWhenPartitionReplayed.ts +22 -0
- package/observation/ICanBeNotifiedWhenReplay.ts +20 -0
- package/observation/IFailedPartitions.ts +22 -0
- package/observation/index.ts +6 -0
- package/observation/notifyReplayLifecycle.spec.ts +98 -0
- package/observation/notifyReplayLifecycle.ts +61 -0
- package/observation/toClientFailedPartition.ts +26 -0
- package/package.json +28 -3
- package/projections/Projections.childrenAndNested.spec.ts +188 -0
- package/projections/Projections.spec.ts +131 -0
- package/projections/Projections.ts +37 -119
- package/projections/declarative/AddBuilder.ts +28 -0
- package/projections/declarative/AddChildBuilder.ts +97 -0
- package/projections/declarative/ChildrenBuilder.spec.ts +157 -0
- package/projections/declarative/ChildrenBuilder.ts +90 -0
- package/projections/declarative/CompositeKeyBuilder.spec.ts +117 -0
- package/projections/declarative/CompositeKeyBuilder.ts +38 -0
- package/projections/declarative/FromBuilder.ts +60 -15
- package/projections/declarative/ICompositeKeyBuilder.ts +6 -0
- package/projections/declarative/JoinBuilder.ts +66 -17
- package/projections/declarative/NestedBuilder.ts +76 -0
- package/projections/declarative/ProjectionBuilderCore.ts +257 -0
- package/projections/declarative/ProjectionBuilderFor.spec.ts +115 -0
- package/projections/declarative/ProjectionBuilderFor.ts +29 -168
- package/projections/declarative/SubtractBuilder.ts +28 -0
- package/projections/declarative/index.ts +9 -0
- package/projections/modelBound/childrenAndNestedBuilder.ts +354 -0
- package/reactors/ReactorSideEffects.spec.ts +182 -0
- package/reactors/ReactorSideEffects.ts +97 -0
- package/reactors/Reactors.ts +29 -4
- package/reducers/Reducers.spec.ts +87 -0
- package/reducers/Reducers.ts +15 -3
- package/reducers/reducer.spec.ts +40 -0
- package/reducers/reducer.ts +11 -2
- package/transactions/IUnitOfWork.ts +21 -0
- package/transactions/UnitOfWork.spec.ts +82 -0
- package/transactions/UnitOfWork.ts +20 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import 'reflect-metadata';
|
|
5
|
+
import { describe, expect, it } from 'vitest';
|
|
6
|
+
import { eventType } from '../../events/eventTypeDecorator';
|
|
7
|
+
import { ProjectionBuilderFor } from './ProjectionBuilderFor';
|
|
8
|
+
|
|
9
|
+
// Decorators are applied as plain function calls (rather than `@decorator` syntax) so these
|
|
10
|
+
// fixtures don't depend on the test runner's decorator-syntax support.
|
|
11
|
+
|
|
12
|
+
class OrderLineAdded {
|
|
13
|
+
orderId!: string;
|
|
14
|
+
lineNumber!: number;
|
|
15
|
+
quantity!: number;
|
|
16
|
+
}
|
|
17
|
+
eventType()(OrderLineAdded);
|
|
18
|
+
|
|
19
|
+
class OrderLineJoined {
|
|
20
|
+
orderId!: string;
|
|
21
|
+
lineNumber!: number;
|
|
22
|
+
description!: string;
|
|
23
|
+
}
|
|
24
|
+
eventType()(OrderLineJoined);
|
|
25
|
+
|
|
26
|
+
class CompositeKey {
|
|
27
|
+
orderId!: string;
|
|
28
|
+
lineNumber!: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
class OrderLine {
|
|
32
|
+
id!: string;
|
|
33
|
+
quantity!: number;
|
|
34
|
+
description!: string;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
interface FromRecord {
|
|
38
|
+
Key: { Id: string };
|
|
39
|
+
Value: { Key: string };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
interface JoinRecord {
|
|
43
|
+
Key: { Id: string };
|
|
44
|
+
Value: { Key: string };
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface JoinRecordWithParentKey {
|
|
48
|
+
Key: { Id: string };
|
|
49
|
+
Value: { Key: string; ParentKey?: string };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
describe('CompositeKeyBuilder', () => {
|
|
53
|
+
describe('when using a composite key on a from builder', () => {
|
|
54
|
+
it('should produce a $composite expression', () => {
|
|
55
|
+
const builder = new ProjectionBuilderFor<OrderLine>();
|
|
56
|
+
builder.from(OrderLineAdded, from => from.usingCompositeKey<CompositeKey>(key => key
|
|
57
|
+
.set(target => target.orderId, event => event.orderId)
|
|
58
|
+
.set(target => target.lineNumber, event => event.lineNumber)));
|
|
59
|
+
|
|
60
|
+
const definition = builder.build('orderLine', 'OrderLine') as unknown as { From: FromRecord[] };
|
|
61
|
+
const entry = definition.From.find(candidate => candidate.Key.Id === 'OrderLineAdded')!;
|
|
62
|
+
|
|
63
|
+
expect(entry.Value.Key).toBe('$composite(orderId=orderId,lineNumber=lineNumber)');
|
|
64
|
+
});
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
describe('when using a parent composite key on a from builder', () => {
|
|
68
|
+
it('should produce a $composite expression for the parent key', () => {
|
|
69
|
+
const builder = new ProjectionBuilderFor<OrderLine>();
|
|
70
|
+
builder.from(OrderLineAdded, from => from.usingParentCompositeKey<CompositeKey>(key => key
|
|
71
|
+
.set(target => target.orderId, event => event.orderId)
|
|
72
|
+
.set(target => target.lineNumber, event => event.lineNumber)));
|
|
73
|
+
|
|
74
|
+
const definition = builder.build('orderLine', 'OrderLine') as unknown as { From: Array<{ Key: { Id: string }; Value: { ParentKey: string } }> };
|
|
75
|
+
const entry = definition.From.find(candidate => candidate.Key.Id === 'OrderLineAdded')!;
|
|
76
|
+
|
|
77
|
+
expect(entry.Value.ParentKey).toBe('$composite(orderId=orderId,lineNumber=lineNumber)');
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
describe('when using a composite key on a join builder', () => {
|
|
82
|
+
it('should produce a $composite expression', () => {
|
|
83
|
+
const builder = new ProjectionBuilderFor<OrderLine>();
|
|
84
|
+
builder.join(OrderLineJoined, join => join
|
|
85
|
+
.on(model => model.id)
|
|
86
|
+
.usingCompositeKey<CompositeKey>(key => key
|
|
87
|
+
.set(target => target.orderId, event => event.orderId)
|
|
88
|
+
.set(target => target.lineNumber, event => event.lineNumber)));
|
|
89
|
+
|
|
90
|
+
const definition = builder.build('orderLine', 'OrderLine') as unknown as { Join: JoinRecord[] };
|
|
91
|
+
const entry = definition.Join.find(candidate => candidate.Key.Id === 'OrderLineJoined')!;
|
|
92
|
+
|
|
93
|
+
expect(entry.Value.Key).toBe('$composite(orderId=orderId,lineNumber=lineNumber)');
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
describe('when using parent-key methods on a join builder', () => {
|
|
98
|
+
it('should accept the calls without throwing, matching the C# client having no wire effect for Join', () => {
|
|
99
|
+
const builder = new ProjectionBuilderFor<OrderLine>();
|
|
100
|
+
|
|
101
|
+
expect(() => builder.join(OrderLineJoined, join => join
|
|
102
|
+
.on(model => model.id)
|
|
103
|
+
.usingParentKey(event => event.orderId)
|
|
104
|
+
.usingParentKeyFromContext('someContextProperty')
|
|
105
|
+
.usingParentCompositeKey<CompositeKey>(key => key.set(target => target.orderId, event => event.orderId))
|
|
106
|
+
.usingConstantParentKey('constant')
|
|
107
|
+
)).not.toThrow();
|
|
108
|
+
|
|
109
|
+
const definition = builder.build('orderLine', 'OrderLine') as unknown as { Join: JoinRecordWithParentKey[] };
|
|
110
|
+
const entry = definition.Join.find(candidate => candidate.Key.Id === 'OrderLineJoined')!;
|
|
111
|
+
|
|
112
|
+
// JoinDefinition has no ParentKey slot on the wire, so none of the calls above
|
|
113
|
+
// should have produced a ParentKey property.
|
|
114
|
+
expect(entry.Value.ParentKey).toBeUndefined();
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { PropertyAccessor, PropertyPathResolverProxyHandler } from '@cratis/fundamentals';
|
|
5
|
+
import { ICompositeKeyBuilder } from './ICompositeKeyBuilder';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Concrete implementation of {@link ICompositeKeyBuilder} that builds a `$composite(...)` key
|
|
9
|
+
* expression from multiple event properties mapped onto named parts of a key type.
|
|
10
|
+
* @template TKeyType - The composite key type.
|
|
11
|
+
* @template TEvent - The event type.
|
|
12
|
+
*/
|
|
13
|
+
export class CompositeKeyBuilder<TKeyType, TEvent> implements ICompositeKeyBuilder<TKeyType, TEvent> {
|
|
14
|
+
private readonly _parts: Array<{ property: string; expression: string }> = [];
|
|
15
|
+
|
|
16
|
+
/** @inheritdoc */
|
|
17
|
+
set(
|
|
18
|
+
targetPropertyAccessor: PropertyAccessor<TKeyType>,
|
|
19
|
+
sourcePropertyAccessor: PropertyAccessor<TEvent>
|
|
20
|
+
): ICompositeKeyBuilder<TKeyType, TEvent> {
|
|
21
|
+
const targetHandler = new PropertyPathResolverProxyHandler();
|
|
22
|
+
const targetProxy = new Proxy({}, targetHandler);
|
|
23
|
+
targetPropertyAccessor(targetProxy as TKeyType);
|
|
24
|
+
|
|
25
|
+
const sourceHandler = new PropertyPathResolverProxyHandler();
|
|
26
|
+
const sourceProxy = new Proxy({}, sourceHandler);
|
|
27
|
+
sourcePropertyAccessor(sourceProxy as TEvent);
|
|
28
|
+
|
|
29
|
+
this._parts.push({ property: targetHandler.property, expression: sourceHandler.property });
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** @inheritdoc */
|
|
34
|
+
build(): string {
|
|
35
|
+
const parts = this._parts.map(part => `${part.property}=${part.expression}`).join(',');
|
|
36
|
+
return `$composite(${parts})`;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
3
|
|
|
4
4
|
import { PropertyAccessor, PropertyPathResolverProxyHandler } from '@cratis/fundamentals';
|
|
5
|
+
import { AddBuilder } from './AddBuilder';
|
|
6
|
+
import { AddChildBuilder, ChildAdditionEntry } from './AddChildBuilder';
|
|
7
|
+
import { CompositeKeyBuilder } from './CompositeKeyBuilder';
|
|
5
8
|
import { IAddBuilder } from './IAddBuilder';
|
|
6
9
|
import { IAddChildBuilder } from './IAddChildBuilder';
|
|
7
10
|
import { ICompositeKeyBuilder } from './ICompositeKeyBuilder';
|
|
@@ -9,6 +12,7 @@ import { IFromBuilder } from './IFromBuilder';
|
|
|
9
12
|
import { ISetBuilder } from './ISetBuilder';
|
|
10
13
|
import { ISubtractBuilder } from './ISubtractBuilder';
|
|
11
14
|
import { SetBuilder } from './SetBuilder';
|
|
15
|
+
import { SubtractBuilder } from './SubtractBuilder';
|
|
12
16
|
|
|
13
17
|
/**
|
|
14
18
|
* Accumulated property mapping for a from clause.
|
|
@@ -17,6 +21,7 @@ export interface FromEntry {
|
|
|
17
21
|
properties: Record<string, string>;
|
|
18
22
|
key: string;
|
|
19
23
|
parentKey: string;
|
|
24
|
+
children: ChildAdditionEntry[];
|
|
20
25
|
}
|
|
21
26
|
|
|
22
27
|
/**
|
|
@@ -28,7 +33,8 @@ export class FromBuilder<TReadModel, TEvent> implements IFromBuilder<TReadModel,
|
|
|
28
33
|
readonly entry: FromEntry = {
|
|
29
34
|
properties: {},
|
|
30
35
|
key: '$eventSourceId',
|
|
31
|
-
parentKey: ''
|
|
36
|
+
parentKey: '',
|
|
37
|
+
children: []
|
|
32
38
|
};
|
|
33
39
|
|
|
34
40
|
/** @inheritdoc */
|
|
@@ -75,13 +81,19 @@ export class FromBuilder<TReadModel, TEvent> implements IFromBuilder<TReadModel,
|
|
|
75
81
|
}
|
|
76
82
|
|
|
77
83
|
/** @inheritdoc */
|
|
78
|
-
usingCompositeKey<TKeyType>(
|
|
79
|
-
|
|
84
|
+
usingCompositeKey<TKeyType>(builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
|
|
85
|
+
const compositeKeyBuilder = new CompositeKeyBuilder<TKeyType, TEvent>();
|
|
86
|
+
builderCallback(compositeKeyBuilder);
|
|
87
|
+
this.entry.key = compositeKeyBuilder.build();
|
|
88
|
+
return this;
|
|
80
89
|
}
|
|
81
90
|
|
|
82
91
|
/** @inheritdoc */
|
|
83
|
-
usingParentCompositeKey<TKeyType>(
|
|
84
|
-
|
|
92
|
+
usingParentCompositeKey<TKeyType>(builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
|
|
93
|
+
const compositeKeyBuilder = new CompositeKeyBuilder<TKeyType, TEvent>();
|
|
94
|
+
builderCallback(compositeKeyBuilder);
|
|
95
|
+
this.entry.parentKey = compositeKeyBuilder.build();
|
|
96
|
+
return this;
|
|
85
97
|
}
|
|
86
98
|
|
|
87
99
|
/** @inheritdoc */
|
|
@@ -115,30 +127,63 @@ export class FromBuilder<TReadModel, TEvent> implements IFromBuilder<TReadModel,
|
|
|
115
127
|
}
|
|
116
128
|
|
|
117
129
|
/** @inheritdoc */
|
|
118
|
-
add(
|
|
119
|
-
|
|
130
|
+
add(readModelPropertyAccessor: PropertyAccessor<TReadModel>): IAddBuilder<TEvent, this> {
|
|
131
|
+
const handler = new PropertyPathResolverProxyHandler();
|
|
132
|
+
const proxy = new Proxy({}, handler);
|
|
133
|
+
readModelPropertyAccessor(proxy as TReadModel);
|
|
134
|
+
return new AddBuilder<TEvent, this>(
|
|
135
|
+
handler.property,
|
|
136
|
+
(property, expression) => { this.entry.properties[property] = expression; },
|
|
137
|
+
this
|
|
138
|
+
);
|
|
120
139
|
}
|
|
121
140
|
|
|
122
141
|
/** @inheritdoc */
|
|
123
|
-
subtract(
|
|
124
|
-
|
|
142
|
+
subtract(readModelPropertyAccessor: PropertyAccessor<TReadModel>): ISubtractBuilder<TEvent, this> {
|
|
143
|
+
const handler = new PropertyPathResolverProxyHandler();
|
|
144
|
+
const proxy = new Proxy({}, handler);
|
|
145
|
+
readModelPropertyAccessor(proxy as TReadModel);
|
|
146
|
+
return new SubtractBuilder<TEvent, this>(
|
|
147
|
+
handler.property,
|
|
148
|
+
(property, expression) => { this.entry.properties[property] = expression; },
|
|
149
|
+
this
|
|
150
|
+
);
|
|
125
151
|
}
|
|
126
152
|
|
|
127
153
|
/** @inheritdoc */
|
|
128
|
-
count(
|
|
129
|
-
|
|
154
|
+
count(readModelPropertyAccessor: PropertyAccessor<TReadModel>): this {
|
|
155
|
+
const handler = new PropertyPathResolverProxyHandler();
|
|
156
|
+
const proxy = new Proxy({}, handler);
|
|
157
|
+
readModelPropertyAccessor(proxy as TReadModel);
|
|
158
|
+
this.entry.properties[handler.property] = '$count';
|
|
159
|
+
return this;
|
|
130
160
|
}
|
|
131
161
|
|
|
132
162
|
/** @inheritdoc */
|
|
133
163
|
addChild<TChildModel>(
|
|
134
|
-
|
|
135
|
-
|
|
164
|
+
targetPropertyAccessor: PropertyAccessor<TReadModel>,
|
|
165
|
+
eventPropertyAccessorOrBuilderCallback: PropertyAccessor<TEvent> | ((builder: IAddChildBuilder<TChildModel, TEvent>) => void)
|
|
136
166
|
): this {
|
|
137
|
-
|
|
167
|
+
const targetHandler = new PropertyPathResolverProxyHandler();
|
|
168
|
+
const targetProxy = new Proxy({}, targetHandler);
|
|
169
|
+
targetPropertyAccessor(targetProxy as TReadModel);
|
|
170
|
+
|
|
171
|
+
const probe = new AddChildBuilder<TChildModel, TEvent>();
|
|
172
|
+
const probeProxy = new Proxy({}, probe);
|
|
173
|
+
(eventPropertyAccessorOrBuilderCallback as (value: unknown) => void)(probeProxy);
|
|
174
|
+
|
|
175
|
+
this.entry.children.push(probe.usedAsBuilder
|
|
176
|
+
? { targetProperty: targetHandler.property, identifiedBy: probe.identifiedByProperty, usingKey: probe.usingKeyProperty }
|
|
177
|
+
: { targetProperty: targetHandler.property, fromEventProperty: probe.capturedEventProperty });
|
|
178
|
+
return this;
|
|
138
179
|
}
|
|
139
180
|
|
|
140
181
|
/** @inheritdoc */
|
|
141
182
|
setThisValue(): ISetBuilder<TEvent, this> {
|
|
142
|
-
|
|
183
|
+
return new SetBuilder<TEvent, this>(
|
|
184
|
+
'$this',
|
|
185
|
+
(rp, expr) => { this.entry.properties[rp] = expr; },
|
|
186
|
+
this
|
|
187
|
+
);
|
|
143
188
|
}
|
|
144
189
|
}
|
|
@@ -19,4 +19,10 @@ export interface ICompositeKeyBuilder<TKeyType, TEvent> {
|
|
|
19
19
|
targetPropertyAccessor: PropertyAccessor<TKeyType>,
|
|
20
20
|
sourcePropertyAccessor: PropertyAccessor<TEvent>
|
|
21
21
|
): ICompositeKeyBuilder<TKeyType, TEvent>;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Builds the composite key expression from the configured parts.
|
|
25
|
+
* @returns The `$composite(...)` property expression.
|
|
26
|
+
*/
|
|
27
|
+
build(): string;
|
|
22
28
|
}
|
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
3
|
|
|
4
4
|
import { PropertyAccessor, PropertyPathResolverProxyHandler } from '@cratis/fundamentals';
|
|
5
|
+
import { AddBuilder } from './AddBuilder';
|
|
6
|
+
import { AddChildBuilder, ChildAdditionEntry } from './AddChildBuilder';
|
|
7
|
+
import { CompositeKeyBuilder } from './CompositeKeyBuilder';
|
|
5
8
|
import { IAddBuilder } from './IAddBuilder';
|
|
6
9
|
import { IAddChildBuilder } from './IAddChildBuilder';
|
|
7
10
|
import { ICompositeKeyBuilder } from './ICompositeKeyBuilder';
|
|
@@ -9,6 +12,7 @@ import { IJoinBuilder } from './IJoinBuilder';
|
|
|
9
12
|
import { ISetBuilder } from './ISetBuilder';
|
|
10
13
|
import { ISubtractBuilder } from './ISubtractBuilder';
|
|
11
14
|
import { SetBuilder } from './SetBuilder';
|
|
15
|
+
import { SubtractBuilder } from './SubtractBuilder';
|
|
12
16
|
|
|
13
17
|
/**
|
|
14
18
|
* Accumulated property mapping for a join clause.
|
|
@@ -17,6 +21,7 @@ export interface JoinEntry {
|
|
|
17
21
|
on: string;
|
|
18
22
|
properties: Record<string, string>;
|
|
19
23
|
key: string;
|
|
24
|
+
children: ChildAdditionEntry[];
|
|
20
25
|
}
|
|
21
26
|
|
|
22
27
|
/**
|
|
@@ -28,7 +33,8 @@ export class JoinBuilder<TReadModel, TEvent> implements IJoinBuilder<TReadModel,
|
|
|
28
33
|
readonly entry: JoinEntry = {
|
|
29
34
|
on: '',
|
|
30
35
|
properties: {},
|
|
31
|
-
key: '$eventSourceId'
|
|
36
|
+
key: '$eventSourceId',
|
|
37
|
+
children: []
|
|
32
38
|
};
|
|
33
39
|
|
|
34
40
|
/** @inheritdoc */
|
|
@@ -71,22 +77,31 @@ export class JoinBuilder<TReadModel, TEvent> implements IJoinBuilder<TReadModel,
|
|
|
71
77
|
|
|
72
78
|
/** @inheritdoc */
|
|
73
79
|
usingParentKey(_keyAccessor: PropertyAccessor<TEvent>): this {
|
|
74
|
-
|
|
80
|
+
// A join's wire definition (JoinDefinition) has no ParentKey slot - the C# client
|
|
81
|
+
// accepts this call too (it is inherited from the shared key-builder base) but its
|
|
82
|
+
// JoinBuilder.Build() only ever reads On/Properties/Key, so the value is silently
|
|
83
|
+
// unused there as well. Matching that: accept the call, but it has no effect.
|
|
84
|
+
return this;
|
|
75
85
|
}
|
|
76
86
|
|
|
77
87
|
/** @inheritdoc */
|
|
78
88
|
usingParentKeyFromContext(_contextPropertyName: string): this {
|
|
79
|
-
|
|
89
|
+
// See usingParentKey - accepted for interface parity with From, no wire effect for Join.
|
|
90
|
+
return this;
|
|
80
91
|
}
|
|
81
92
|
|
|
82
93
|
/** @inheritdoc */
|
|
83
|
-
usingCompositeKey<TKeyType>(
|
|
84
|
-
|
|
94
|
+
usingCompositeKey<TKeyType>(builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
|
|
95
|
+
const compositeKeyBuilder = new CompositeKeyBuilder<TKeyType, TEvent>();
|
|
96
|
+
builderCallback(compositeKeyBuilder);
|
|
97
|
+
this.entry.key = compositeKeyBuilder.build();
|
|
98
|
+
return this;
|
|
85
99
|
}
|
|
86
100
|
|
|
87
101
|
/** @inheritdoc */
|
|
88
102
|
usingParentCompositeKey<TKeyType>(_builderCallback: (builder: ICompositeKeyBuilder<TKeyType, TEvent>) => void): this {
|
|
89
|
-
|
|
103
|
+
// See usingParentKey - accepted for interface parity with From, no wire effect for Join.
|
|
104
|
+
return this;
|
|
90
105
|
}
|
|
91
106
|
|
|
92
107
|
/** @inheritdoc */
|
|
@@ -97,7 +112,8 @@ export class JoinBuilder<TReadModel, TEvent> implements IJoinBuilder<TReadModel,
|
|
|
97
112
|
|
|
98
113
|
/** @inheritdoc */
|
|
99
114
|
usingConstantParentKey(_value: string): this {
|
|
100
|
-
|
|
115
|
+
// See usingParentKey - accepted for interface parity with From, no wire effect for Join.
|
|
116
|
+
return this;
|
|
101
117
|
}
|
|
102
118
|
|
|
103
119
|
/** @inheritdoc */
|
|
@@ -119,30 +135,63 @@ export class JoinBuilder<TReadModel, TEvent> implements IJoinBuilder<TReadModel,
|
|
|
119
135
|
}
|
|
120
136
|
|
|
121
137
|
/** @inheritdoc */
|
|
122
|
-
add(
|
|
123
|
-
|
|
138
|
+
add(readModelPropertyAccessor: PropertyAccessor<TReadModel>): IAddBuilder<TEvent, this> {
|
|
139
|
+
const handler = new PropertyPathResolverProxyHandler();
|
|
140
|
+
const proxy = new Proxy({}, handler);
|
|
141
|
+
readModelPropertyAccessor(proxy as TReadModel);
|
|
142
|
+
return new AddBuilder<TEvent, this>(
|
|
143
|
+
handler.property,
|
|
144
|
+
(property, expression) => { this.entry.properties[property] = expression; },
|
|
145
|
+
this
|
|
146
|
+
);
|
|
124
147
|
}
|
|
125
148
|
|
|
126
149
|
/** @inheritdoc */
|
|
127
|
-
subtract(
|
|
128
|
-
|
|
150
|
+
subtract(readModelPropertyAccessor: PropertyAccessor<TReadModel>): ISubtractBuilder<TEvent, this> {
|
|
151
|
+
const handler = new PropertyPathResolverProxyHandler();
|
|
152
|
+
const proxy = new Proxy({}, handler);
|
|
153
|
+
readModelPropertyAccessor(proxy as TReadModel);
|
|
154
|
+
return new SubtractBuilder<TEvent, this>(
|
|
155
|
+
handler.property,
|
|
156
|
+
(property, expression) => { this.entry.properties[property] = expression; },
|
|
157
|
+
this
|
|
158
|
+
);
|
|
129
159
|
}
|
|
130
160
|
|
|
131
161
|
/** @inheritdoc */
|
|
132
|
-
count(
|
|
133
|
-
|
|
162
|
+
count(readModelPropertyAccessor: PropertyAccessor<TReadModel>): this {
|
|
163
|
+
const handler = new PropertyPathResolverProxyHandler();
|
|
164
|
+
const proxy = new Proxy({}, handler);
|
|
165
|
+
readModelPropertyAccessor(proxy as TReadModel);
|
|
166
|
+
this.entry.properties[handler.property] = '$count';
|
|
167
|
+
return this;
|
|
134
168
|
}
|
|
135
169
|
|
|
136
170
|
/** @inheritdoc */
|
|
137
171
|
addChild<TChildModel>(
|
|
138
|
-
|
|
139
|
-
|
|
172
|
+
targetPropertyAccessor: PropertyAccessor<TReadModel>,
|
|
173
|
+
eventPropertyAccessorOrBuilderCallback: PropertyAccessor<TEvent> | ((builder: IAddChildBuilder<TChildModel, TEvent>) => void)
|
|
140
174
|
): this {
|
|
141
|
-
|
|
175
|
+
const targetHandler = new PropertyPathResolverProxyHandler();
|
|
176
|
+
const targetProxy = new Proxy({}, targetHandler);
|
|
177
|
+
targetPropertyAccessor(targetProxy as TReadModel);
|
|
178
|
+
|
|
179
|
+
const probe = new AddChildBuilder<TChildModel, TEvent>();
|
|
180
|
+
const probeProxy = new Proxy({}, probe);
|
|
181
|
+
(eventPropertyAccessorOrBuilderCallback as (value: unknown) => void)(probeProxy);
|
|
182
|
+
|
|
183
|
+
this.entry.children.push(probe.usedAsBuilder
|
|
184
|
+
? { targetProperty: targetHandler.property, identifiedBy: probe.identifiedByProperty, usingKey: probe.usingKeyProperty }
|
|
185
|
+
: { targetProperty: targetHandler.property, fromEventProperty: probe.capturedEventProperty });
|
|
186
|
+
return this;
|
|
142
187
|
}
|
|
143
188
|
|
|
144
189
|
/** @inheritdoc */
|
|
145
190
|
setThisValue(): ISetBuilder<TEvent, this> {
|
|
146
|
-
|
|
191
|
+
return new SetBuilder<TEvent, this>(
|
|
192
|
+
'$this',
|
|
193
|
+
(rp, expr) => { this.entry.properties[rp] = expr; },
|
|
194
|
+
this
|
|
195
|
+
);
|
|
147
196
|
}
|
|
148
197
|
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
|
|
4
|
+
import { PropertyAccessor, PropertyPathResolverProxyHandler } from '@cratis/fundamentals';
|
|
5
|
+
import { ChildrenDefinitionLike, ProjectionBuilderCore } from './ProjectionBuilderCore';
|
|
6
|
+
import { IChildrenBuilder } from './IChildrenBuilder';
|
|
7
|
+
import { INestedBuilder } from './INestedBuilder';
|
|
8
|
+
import { ChildrenBuilder } from './ChildrenBuilder';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Concrete implementation of {@link INestedBuilder}, building the `ChildrenDefinition` for a
|
|
12
|
+
* nested single-object sub-projection reached through `.nested()`.
|
|
13
|
+
* @template TParentReadModel - The parent read model type.
|
|
14
|
+
* @template TNestedReadModel - The nested object read model type.
|
|
15
|
+
*/
|
|
16
|
+
export class NestedBuilder<TParentReadModel, TNestedReadModel>
|
|
17
|
+
extends ProjectionBuilderCore<TNestedReadModel, INestedBuilder<TParentReadModel, TNestedReadModel>>
|
|
18
|
+
implements INestedBuilder<TParentReadModel, TNestedReadModel> {
|
|
19
|
+
/** @inheritdoc */
|
|
20
|
+
clearWith(eventType: Function): INestedBuilder<TParentReadModel, TNestedReadModel> {
|
|
21
|
+
const contractType = this.toContractEventType(eventType);
|
|
22
|
+
this._removedWith.push({
|
|
23
|
+
Key: contractType,
|
|
24
|
+
Value: { Key: '$eventSourceId', ParentKey: '' }
|
|
25
|
+
});
|
|
26
|
+
return this;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** @inheritdoc */
|
|
30
|
+
children<TChildModel>(
|
|
31
|
+
targetPropertyAccessor: PropertyAccessor<TNestedReadModel>,
|
|
32
|
+
builderCallback: (builder: IChildrenBuilder<TNestedReadModel, TChildModel>) => void
|
|
33
|
+
): INestedBuilder<TParentReadModel, TNestedReadModel> {
|
|
34
|
+
const handler = new PropertyPathResolverProxyHandler();
|
|
35
|
+
const proxy = new Proxy({}, handler);
|
|
36
|
+
targetPropertyAccessor(proxy as TNestedReadModel);
|
|
37
|
+
|
|
38
|
+
const builder = new ChildrenBuilder<TNestedReadModel, TChildModel>();
|
|
39
|
+
builderCallback(builder);
|
|
40
|
+
this._children[handler.property] = builder.buildDefinition();
|
|
41
|
+
return this;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** @inheritdoc */
|
|
45
|
+
nested<TGrandNestedModel>(
|
|
46
|
+
targetPropertyAccessor: PropertyAccessor<TNestedReadModel>,
|
|
47
|
+
builderCallback: (builder: INestedBuilder<TNestedReadModel, TGrandNestedModel>) => void
|
|
48
|
+
): INestedBuilder<TParentReadModel, TNestedReadModel> {
|
|
49
|
+
const handler = new PropertyPathResolverProxyHandler();
|
|
50
|
+
const proxy = new Proxy({}, handler);
|
|
51
|
+
targetPropertyAccessor(proxy as TNestedReadModel);
|
|
52
|
+
|
|
53
|
+
const builder = new NestedBuilder<TNestedReadModel, TGrandNestedModel>();
|
|
54
|
+
builderCallback(builder);
|
|
55
|
+
this._nested[handler.property] = builder.buildDefinition();
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Builds the {@link ChildrenDefinitionLike} representing this nested object.
|
|
61
|
+
* @returns The accumulated nested definition.
|
|
62
|
+
*/
|
|
63
|
+
buildDefinition(): ChildrenDefinitionLike {
|
|
64
|
+
return {
|
|
65
|
+
IdentifiedBy: '',
|
|
66
|
+
From: this._from,
|
|
67
|
+
Join: this._join,
|
|
68
|
+
Children: this._children,
|
|
69
|
+
All: this._all,
|
|
70
|
+
RemovedWith: this._removedWith,
|
|
71
|
+
RemovedWithJoin: this._removedWithJoin,
|
|
72
|
+
AutoMap: this._autoMap,
|
|
73
|
+
Nested: this._nested
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|