@cratis/chronicle 6.13.0 → 6.14.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 +11 -0
- package/dist/ChronicleClient.d.ts.map +1 -1
- package/dist/ChronicleClient.js +7 -0
- package/dist/ChronicleClient.js.map +1 -1
- package/dist/readModels/ReadModels.js +1 -1
- package/dist/readModels/ReadModels.js.map +1 -1
- package/dist/readModels/rootReadModelTypes.d.ts +2 -0
- package/dist/readModels/rootReadModelTypes.d.ts.map +1 -1
- package/dist/readModels/rootReadModelTypes.js +10 -2
- package/dist/readModels/rootReadModelTypes.js.map +1 -1
- package/dist/reducers/ReducerEventDispatcher.d.ts +14 -0
- package/dist/reducers/ReducerEventDispatcher.d.ts.map +1 -0
- package/dist/reducers/ReducerEventDispatcher.js +35 -0
- package/dist/reducers/ReducerEventDispatcher.js.map +1 -0
- package/dist/reducers/ReducerEventHandler.d.ts +7 -0
- package/dist/reducers/ReducerEventHandler.d.ts.map +1 -0
- package/dist/reducers/ReducerEventHandler.js +4 -0
- package/dist/reducers/ReducerEventHandler.js.map +1 -0
- package/dist/reducers/Reducers.d.ts +0 -1
- package/dist/reducers/Reducers.d.ts.map +1 -1
- package/dist/reducers/Reducers.js +11 -30
- package/dist/reducers/Reducers.js.map +1 -1
- package/dist/testing/ReadModelScenario.d.ts +33 -0
- package/dist/testing/ReadModelScenario.d.ts.map +1 -0
- package/dist/testing/ReadModelScenario.js +137 -0
- package/dist/testing/ReadModelScenario.js.map +1 -0
- package/dist/testing/ReadModelScenarioGiven.d.ts +11 -0
- package/dist/testing/ReadModelScenarioGiven.d.ts.map +1 -0
- package/dist/testing/ReadModelScenarioGiven.js +18 -0
- package/dist/testing/ReadModelScenarioGiven.js.map +1 -0
- package/dist/testing/ReadModelScenarioGivenBuilder.d.ts +10 -0
- package/dist/testing/ReadModelScenarioGivenBuilder.d.ts.map +1 -0
- package/dist/testing/ReadModelScenarioGivenBuilder.js +15 -0
- package/dist/testing/ReadModelScenarioGivenBuilder.js.map +1 -0
- package/dist/testing/index.d.ts +4 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +6 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types/TypeDiscoverer.d.ts.map +1 -1
- package/dist/types/TypeDiscoverer.js +7 -4
- package/dist/types/TypeDiscoverer.js.map +1 -1
- package/dist/types/modelBoundProperty.d.ts.map +1 -1
- package/dist/types/modelBoundProperty.js +7 -2
- package/dist/types/modelBoundProperty.js.map +1 -1
- package/dist/types/modelBoundPropertyMetadata.d.ts +9 -0
- package/dist/types/modelBoundPropertyMetadata.d.ts.map +1 -0
- package/dist/types/modelBoundPropertyMetadata.js +66 -0
- package/dist/types/modelBoundPropertyMetadata.js.map +1 -0
- package/for_ChronicleClient/when_registering_artifacts/with_legacy_property_mappings.legacy.spec.ts +31 -0
- package/for_ChronicleClient/when_registering_artifacts/with_standard_property_mappings.standard.spec.ts +138 -0
- package/package.json +7 -2
- package/projections/modelBound/decorators.standard.spec.ts +2 -2
- package/readModels/ReadModels.ts +1 -1
- package/readModels/discovery.spec.ts +2 -2
- package/readModels/registration.legacy.spec.ts +38 -0
- package/readModels/registration.standard.spec.ts +108 -0
- package/readModels/rootReadModelTypes.ts +12 -2
- package/reducers/ReducerEventDispatcher.ts +47 -0
- package/reducers/ReducerEventHandler.ts +9 -0
- package/reducers/Reducers.ts +13 -42
- package/testing/ReadModelScenario.example.ts +29 -0
- package/testing/ReadModelScenario.spec.ts +191 -0
- package/testing/ReadModelScenario.ts +151 -0
- package/testing/ReadModelScenarioGiven.ts +16 -0
- package/testing/ReadModelScenarioGivenBuilder.ts +15 -0
- package/testing/index.ts +6 -0
- package/types/TypeDiscoverer.ts +6 -5
- package/types/modelBoundProperty.ts +5 -2
- package/types/modelBoundPropertyMetadata.ts +67 -0
|
@@ -0,0 +1,67 @@
|
|
|
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 { getStandardMetadata } from './standardDecoratorMetadata.js';
|
|
6
|
+
|
|
7
|
+
// The standard field decorator has no constructor, but its metadata object is attached to
|
|
8
|
+
// the declaring class after evaluation. Discovery can match that object to a module export.
|
|
9
|
+
const mappedMetadata = new WeakMap<object, Set<string>>();
|
|
10
|
+
const pendingMetadata = new Set<WeakRef<object>>();
|
|
11
|
+
const finalizedMetadata = new FinalizationRegistry<WeakRef<object>>(reference => pendingMetadata.delete(reference));
|
|
12
|
+
|
|
13
|
+
export const modelBoundPropertyKeys = [
|
|
14
|
+
'setFrom', 'setFromContext', 'setValue', 'addFrom', 'subtractFrom',
|
|
15
|
+
'increment', 'decrement', 'count', 'childrenFrom', 'join', 'fromEvery', 'fromAll'
|
|
16
|
+
].map(name => `chronicle:projection:${name}`);
|
|
17
|
+
|
|
18
|
+
/** Records a standard-decorated class with an event mapping on one of its fields. */
|
|
19
|
+
export function trackModelBoundMetadata(metadata: object, property: string): void {
|
|
20
|
+
if (!modelBoundPropertyKeys.some(key => Reflect.hasOwnMetadata(key, metadata, property))) return;
|
|
21
|
+
let properties = mappedMetadata.get(metadata);
|
|
22
|
+
if (!properties) {
|
|
23
|
+
properties = new Set<string>();
|
|
24
|
+
mappedMetadata.set(metadata, properties);
|
|
25
|
+
const reference = new WeakRef(metadata);
|
|
26
|
+
pendingMetadata.add(reference);
|
|
27
|
+
finalizedMetadata.register(metadata, reference, reference);
|
|
28
|
+
}
|
|
29
|
+
properties.add(property);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Whether a class's standard decorator metadata contains a mapped property. */
|
|
33
|
+
export function hasModelBoundMetadata(metadata: object): boolean {
|
|
34
|
+
return mappedMetadata.has(metadata);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Returns unresolved mappings grouped by class metadata, dropping resolved and collected entries. */
|
|
38
|
+
export function takeUnregisteredModelBoundMappings(registeredTypes: Function[]): string[] {
|
|
39
|
+
const registeredMetadata = new Set<object>();
|
|
40
|
+
for (const type of registeredTypes) {
|
|
41
|
+
for (let metadata: object | null | undefined = getStandardMetadata(type); metadata; metadata = Object.getPrototypeOf(metadata) as object | null) {
|
|
42
|
+
registeredMetadata.add(metadata);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
const unmapped: string[] = [];
|
|
46
|
+
for (const reference of pendingMetadata) {
|
|
47
|
+
const metadata = reference.deref();
|
|
48
|
+
pendingMetadata.delete(reference);
|
|
49
|
+
finalizedMetadata.unregister(reference);
|
|
50
|
+
if (!metadata || registeredMetadata.has(metadata)) continue;
|
|
51
|
+
const mappingsForClass = new Set<string>();
|
|
52
|
+
for (const property of mappedMetadata.get(metadata) ?? []) {
|
|
53
|
+
for (const key of modelBoundPropertyKeys) {
|
|
54
|
+
const value = Reflect.getOwnMetadata(key, metadata, property) as unknown;
|
|
55
|
+
if (value === undefined) continue;
|
|
56
|
+
const mappings: unknown[] = Array.isArray(value) ? value : [value];
|
|
57
|
+
for (const mapping of mappings) {
|
|
58
|
+
const eventType = mapping && typeof mapping === 'object' && 'eventType' in mapping ? mapping.eventType : undefined;
|
|
59
|
+
const eventName = typeof eventType === 'function' ? eventType.name : 'all events';
|
|
60
|
+
mappingsForClass.add(`${property} <- ${eventName}`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (mappingsForClass.size > 0) unmapped.push(`{${[...mappingsForClass].join(', ')}}`);
|
|
65
|
+
}
|
|
66
|
+
return unmapped;
|
|
67
|
+
}
|