@cratis/chronicle 6.46.0 → 6.48.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.
Files changed (139) hide show
  1. package/ChronicleClient.ts +3 -0
  2. package/EventStore.ts +2 -1
  3. package/connection/ConnectionLifecycle.ts +22 -0
  4. package/dist/ChronicleClient.d.ts.map +1 -1
  5. package/dist/ChronicleClient.js +3 -0
  6. package/dist/ChronicleClient.js.map +1 -1
  7. package/dist/EventStore.d.ts.map +1 -1
  8. package/dist/EventStore.js +2 -1
  9. package/dist/EventStore.js.map +1 -1
  10. package/dist/connection/ConnectionLifecycle.d.ts +8 -0
  11. package/dist/connection/ConnectionLifecycle.d.ts.map +1 -1
  12. package/dist/connection/ConnectionLifecycle.js +21 -0
  13. package/dist/connection/ConnectionLifecycle.js.map +1 -1
  14. package/dist/events/eventSourceTypeDecorator.d.ts +18 -0
  15. package/dist/events/eventSourceTypeDecorator.d.ts.map +1 -0
  16. package/dist/events/eventSourceTypeDecorator.js +25 -0
  17. package/dist/events/eventSourceTypeDecorator.js.map +1 -0
  18. package/dist/events/eventStreamTypeDecorator.d.ts +20 -0
  19. package/dist/events/eventStreamTypeDecorator.d.ts.map +1 -0
  20. package/dist/events/eventStreamTypeDecorator.js +29 -0
  21. package/dist/events/eventStreamTypeDecorator.js.map +1 -0
  22. package/dist/events/index.d.ts +2 -0
  23. package/dist/events/index.d.ts.map +1 -1
  24. package/dist/events/index.js +2 -0
  25. package/dist/events/index.js.map +1 -1
  26. package/dist/reactors/ReactorSideEffects.d.ts +6 -3
  27. package/dist/reactors/ReactorSideEffects.d.ts.map +1 -1
  28. package/dist/reactors/ReactorSideEffects.js +12 -6
  29. package/dist/reactors/ReactorSideEffects.js.map +1 -1
  30. package/dist/reactors/Reactors.d.ts.map +1 -1
  31. package/dist/reactors/Reactors.js +4 -2
  32. package/dist/reactors/Reactors.js.map +1 -1
  33. package/dist/readModels/IReadModelWatcher.d.ts +30 -0
  34. package/dist/readModels/IReadModelWatcher.d.ts.map +1 -0
  35. package/dist/readModels/IReadModelWatcher.js +4 -0
  36. package/dist/readModels/IReadModelWatcher.js.map +1 -0
  37. package/dist/readModels/IReadModels.d.ts +16 -2
  38. package/dist/readModels/IReadModels.d.ts.map +1 -1
  39. package/dist/readModels/ReadModelChangeContext.d.ts +9 -0
  40. package/dist/readModels/ReadModelChangeContext.d.ts.map +1 -0
  41. package/dist/readModels/ReadModelChangeContext.js +4 -0
  42. package/dist/readModels/ReadModelChangeContext.js.map +1 -0
  43. package/dist/readModels/ReadModelChangeType.d.ts +7 -0
  44. package/dist/readModels/ReadModelChangeType.d.ts.map +1 -0
  45. package/dist/readModels/ReadModelChangeType.js +10 -0
  46. package/dist/readModels/ReadModelChangeType.js.map +1 -0
  47. package/dist/readModels/ReadModelChangeset.d.ts +6 -0
  48. package/dist/readModels/ReadModelChangeset.d.ts.map +1 -1
  49. package/dist/readModels/ReadModelWatchOptions.d.ts +19 -0
  50. package/dist/readModels/ReadModelWatchOptions.d.ts.map +1 -0
  51. package/dist/readModels/ReadModelWatchOptions.js +4 -0
  52. package/dist/readModels/ReadModelWatchOptions.js.map +1 -0
  53. package/dist/readModels/ReadModelWatcher.d.ts +52 -0
  54. package/dist/readModels/ReadModelWatcher.d.ts.map +1 -0
  55. package/dist/readModels/ReadModelWatcher.js +276 -0
  56. package/dist/readModels/ReadModelWatcher.js.map +1 -0
  57. package/dist/readModels/ReadModels.d.ts +11 -1
  58. package/dist/readModels/ReadModels.d.ts.map +1 -1
  59. package/dist/readModels/ReadModels.js +47 -11
  60. package/dist/readModels/ReadModels.js.map +1 -1
  61. package/dist/readModels/for_ReadModelWatcher/given/a_kernel_stream.d.ts +15 -0
  62. package/dist/readModels/for_ReadModelWatcher/given/a_kernel_stream.d.ts.map +1 -0
  63. package/dist/readModels/for_ReadModelWatcher/given/a_kernel_stream.js +45 -0
  64. package/dist/readModels/for_ReadModelWatcher/given/a_kernel_stream.js.map +1 -0
  65. package/dist/readModels/for_ReadModelWatcher/given/a_watched_read_model.d.ts +21 -0
  66. package/dist/readModels/for_ReadModelWatcher/given/a_watched_read_model.d.ts.map +1 -0
  67. package/dist/readModels/for_ReadModelWatcher/given/a_watched_read_model.js +35 -0
  68. package/dist/readModels/for_ReadModelWatcher/given/a_watched_read_model.js.map +1 -0
  69. package/dist/readModels/index.d.ts +4 -0
  70. package/dist/readModels/index.d.ts.map +1 -1
  71. package/dist/readModels/index.js +1 -0
  72. package/dist/readModels/index.js.map +1 -1
  73. package/dist/reducers/Reducers.d.ts.map +1 -1
  74. package/dist/reducers/Reducers.js +4 -2
  75. package/dist/reducers/Reducers.js.map +1 -1
  76. package/dist/testing/ReactorScenario.d.ts.map +1 -1
  77. package/dist/testing/ReactorScenario.js +11 -1
  78. package/dist/testing/ReactorScenario.js.map +1 -1
  79. package/dist/testing/ReducerReadModelProcessor.d.ts.map +1 -1
  80. package/dist/testing/ReducerReadModelProcessor.js +13 -0
  81. package/dist/testing/ReducerReadModelProcessor.js.map +1 -1
  82. package/dist/testing/UnsupportedReducerOperation.d.ts +7 -0
  83. package/dist/testing/UnsupportedReducerOperation.d.ts.map +1 -0
  84. package/dist/testing/UnsupportedReducerOperation.js +14 -0
  85. package/dist/testing/UnsupportedReducerOperation.js.map +1 -0
  86. package/dist/testing/index.d.ts +1 -0
  87. package/dist/testing/index.d.ts.map +1 -1
  88. package/dist/testing/index.js +1 -0
  89. package/dist/testing/index.js.map +1 -1
  90. package/dist/tsconfig.tsbuildinfo +1 -1
  91. package/events/eventSourceTypeDecorator.ts +28 -0
  92. package/events/eventStreamTypeDecorator.ts +33 -0
  93. package/events/for_observerFilters/when_registering/filter_registration_behaviors.fixture.ts +55 -0
  94. package/events/for_observerFilters/when_registering/with_legacy_decorators.legacy.spec.ts +30 -0
  95. package/events/for_observerFilters/when_registering/with_standard_decorators.standard.spec.ts +30 -0
  96. package/events/index.ts +2 -0
  97. package/for_ChronicleClient/when_reconnecting/with_waiting_read_model_watchers.spec.ts +117 -0
  98. package/jobs/for_Jobs/against_a_kernel/when_managing_a_replay_job.integration.spec.ts +24 -4
  99. package/package.json +2 -2
  100. package/reactors/ReactorSideEffects.ts +16 -6
  101. package/reactors/Reactors.ts +4 -2
  102. package/reactors/for_ReactorSideEffects/when_dispatching/with_reactor_source_and_stream_types.spec.ts +75 -0
  103. package/reactors/for_Reactors/against_a_kernel/when_filtering_source_and_stream_types.integration.spec.ts +147 -0
  104. package/reactors/for_Reactors/against_a_kernel/when_replaying_reactors_with_once_only_handlers.integration.spec.ts +27 -8
  105. package/readModels/IReadModelWatcher.ts +35 -0
  106. package/readModels/IReadModels.ts +17 -2
  107. package/readModels/ReadModelChangeContext.ts +11 -0
  108. package/readModels/ReadModelChangeType.ts +9 -0
  109. package/readModels/ReadModelChangeset.ts +9 -0
  110. package/readModels/ReadModelWatchOptions.ts +23 -0
  111. package/readModels/ReadModelWatcher.ts +271 -0
  112. package/readModels/ReadModels.ts +60 -11
  113. package/readModels/for_ReadModelWatcher/against_a_kernel/when_watching_changes.integration.spec.ts +104 -0
  114. package/readModels/for_ReadModelWatcher/given/a_kernel_stream.ts +50 -0
  115. package/readModels/for_ReadModelWatcher/given/a_watched_read_model.ts +37 -0
  116. package/readModels/for_ReadModelWatcher/watchCompatibility.standard.spec.ts +29 -0
  117. package/readModels/for_ReadModelWatcher/when_a_stream_cannot_recover.spec.ts +86 -0
  118. package/readModels/for_ReadModelWatcher/when_applying_backpressure.spec.ts +80 -0
  119. package/readModels/for_ReadModelWatcher/when_failing_with_buffered_changes.spec.ts +39 -0
  120. package/readModels/for_ReadModelWatcher/when_not_opting_into_resume.spec.ts +62 -0
  121. package/readModels/for_ReadModelWatcher/when_notifying_resubscription.spec.ts +128 -0
  122. package/readModels/for_ReadModelWatcher/when_opting_into_overflow.spec.ts +39 -0
  123. package/readModels/for_ReadModelWatcher/when_receiving_changes.spec.ts +69 -0
  124. package/readModels/for_ReadModelWatcher/when_reconnecting.spec.ts +99 -0
  125. package/readModels/for_ReadModelWatcher/when_reconnecting_during_conversion.spec.ts +84 -0
  126. package/readModels/for_ReadModelWatcher/when_recovering_a_stream.spec.ts +106 -0
  127. package/readModels/for_ReadModelWatcher/when_stopping.spec.ts +85 -0
  128. package/readModels/for_ReadModelWatcher/when_subscribing.spec.ts +62 -0
  129. package/readModels/for_ReadModels/when_watching.spec.ts +85 -0
  130. package/readModels/index.ts +4 -0
  131. package/reducers/Reducers.ts +4 -2
  132. package/testing/ReactorScenario.spec.ts +18 -1
  133. package/testing/ReactorScenario.ts +11 -1
  134. package/testing/ReducerReadModelProcessor.ts +13 -0
  135. package/testing/UnsupportedReducerOperation.ts +10 -0
  136. package/testing/for_ReactorScenario/when_recording_side_effects/with_declared_stream_type.spec.ts +50 -0
  137. package/testing/for_observerScenarios/when_selecting_filters/with_reducer_tag_filters.spec.ts +50 -0
  138. package/testing/for_observerScenarios/when_selecting_filters/with_source_and_stream_types.spec.ts +48 -0
  139. package/testing/index.ts +1 -0
@@ -13,6 +13,8 @@ import type { AppendedEvent } from '../events/AppendedEvent.js';
13
13
  import type { EventContext } from '../events/EventContext.js';
14
14
  import { getEventTypeMetadata } from '../events/eventTypeDecorator.js';
15
15
  import { getFilterTagsFor } from '../events/filterEventsByTagDecorator.js';
16
+ import { getEventSourceTypeFor } from '../events/eventSourceTypeDecorator.js';
17
+ import { getDeclaredEventStreamTypeFor, getEventStreamTypeFor } from '../events/eventStreamTypeDecorator.js';
16
18
  import type { IEventLog } from '../eventSequences/IEventLog.js';
17
19
  import type { EventForEventSourceId } from '../eventSequences/EventForEventSourceId.js';
18
20
  import type { AppendOptions } from '../eventSequences/AppendOptions.js';
@@ -63,6 +65,12 @@ export class ReactorScenario {
63
65
  if (getFilterTagsFor(_reactor).length) {
64
66
  throw new UnsupportedReactorOperation('reactor.filterEventsByTag', _reactor.name, 'Tag-filtered delivery is not fixture-backed.');
65
67
  }
68
+ if (getEventSourceTypeFor(_reactor) !== '') {
69
+ throw new UnsupportedReactorOperation('reactor.eventSourceType', _reactor.name, 'Source-type-filtered delivery is not fixture-backed.');
70
+ }
71
+ if (getEventStreamTypeFor(_reactor) !== 'All') {
72
+ throw new UnsupportedReactorOperation('reactor.eventStreamType', _reactor.name, 'Stream-type-filtered delivery is not fixture-backed.');
73
+ }
66
74
  if (_options.commandTypes?.length) {
67
75
  throw new UnsupportedReactorOperation('options.commandTypes', _reactor.name, 'Command classification belongs to the explicit-composition increment.');
68
76
  }
@@ -97,6 +105,7 @@ export class ReactorScenario {
97
105
  'getSnapshotsById', 'dehydrateSession', 'release', 'releaseMany']);
98
106
  const readModels = new Proxy({}, { get: (_, key) => {
99
107
  if (key === 'watch') return async function* () { unsupported('readModels.watch'); };
108
+ if (key === 'createWatcher') return () => unsupported('readModels.createWatcher');
100
109
  if (key === 'materialized') return unsupported('readModels.materialized');
101
110
  if (typeof key !== 'string' || !readModelMethods.has(key)) return undefined;
102
111
  return async () => unsupported(`readModels.${key}`);
@@ -282,7 +291,8 @@ export class ReactorScenario {
282
291
  if (result == null) return;
283
292
  const items = Array.isArray(result) ? result : [result];
284
293
  const events = normalizeReactorSideEffects(result, context.eventSourceId,
285
- context.eventStreamType ?? 'Default', context.eventStreamId ?? context.eventSourceId);
294
+ context.eventStreamType ?? 'Default', context.eventStreamId ?? context.eventSourceId,
295
+ getEventSourceTypeFor(this._reactor), getDeclaredEventStreamTypeFor(this._reactor));
286
296
  if (items.length !== events.length || events.some(entry => !this._eventTypes.includes(entry.event.constructor as Constructor))) {
287
297
  throw new UnsupportedReactorOperation('handler.return', this._reactor.name,
288
298
  'Only registered events and production EventForEventSourceId wrappers may be recorded; commands and unknown values are unsupported.');
@@ -3,6 +3,10 @@
3
3
 
4
4
  import type { Constructor } from '@cratis/fundamentals';
5
5
  import { ReducerEventDispatcher } from '../reducers/ReducerEventDispatcher.js';
6
+ import { getEventSourceTypeFor } from '../events/eventSourceTypeDecorator.js';
7
+ import { getEventStreamTypeFor } from '../events/eventStreamTypeDecorator.js';
8
+ import { getFilterTagsFor } from '../events/filterEventsByTagDecorator.js';
9
+ import { UnsupportedReducerOperation } from './UnsupportedReducerOperation.js';
6
10
  import type { IReadModelProcessor } from './IReadModelProcessor.js';
7
11
  import type { ReadModelState } from './ReadModelState.js';
8
12
  import type { ScenarioEvent } from './ScenarioEvent.js';
@@ -12,6 +16,15 @@ export class ReducerReadModelProcessor<TReadModel extends object> implements IRe
12
16
  private readonly _dispatcher: ReducerEventDispatcher;
13
17
 
14
18
  constructor(private readonly _readModelType: Constructor<TReadModel>, private readonly _reducerType: Constructor, eventTypes: Constructor[]) {
19
+ if (getFilterTagsFor(_reducerType).length) {
20
+ throw new UnsupportedReducerOperation('reducer.filterEventsByTag', _reducerType.name, 'Tag-filtered delivery is not fixture-backed.');
21
+ }
22
+ if (getEventSourceTypeFor(_reducerType) !== '') {
23
+ throw new UnsupportedReducerOperation('reducer.eventSourceType', _reducerType.name, 'Source-type-filtered delivery is not fixture-backed.');
24
+ }
25
+ if (getEventStreamTypeFor(_reducerType) !== 'All') {
26
+ throw new UnsupportedReducerOperation('reducer.eventStreamType', _reducerType.name, 'Stream-type-filtered delivery is not fixture-backed.');
27
+ }
15
28
  this._dispatcher = new ReducerEventDispatcher(_reducerType, eventTypes);
16
29
  }
17
30
 
@@ -0,0 +1,10 @@
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
+ /** An operation whose kernel/observer semantics have not been established for this scenario. */
5
+ export class UnsupportedReducerOperation extends Error {
6
+ constructor(readonly operation: string, readonly artifact: string, reason: string) {
7
+ super(`Unsupported reducer operation '${operation}' for '${artifact}': ${reason} Use a kernel-backed test.`);
8
+ this.name = 'UnsupportedReducerOperation';
9
+ }
10
+ }
@@ -0,0 +1,50 @@
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 { field } from '@cratis/fundamentals';
5
+ import { beforeEach, chai, describe, it, vi } from 'vitest';
6
+ import { eventType } from '../../../events/eventTypeDecorator.js';
7
+ import { eventStreamType } from '../../../events/eventStreamTypeDecorator.js';
8
+ import type { EventForEventSourceId } from '../../../eventSequences/EventForEventSourceId.js';
9
+ import type { IEventLog } from '../../../eventSequences/IEventLog.js';
10
+ import { reactor } from '../../../reactors/reactor.js';
11
+ import { dispatchReactorSideEffects } from '../../../reactors/ReactorSideEffects.js';
12
+ import { ReactorScenario } from '../../ReactorScenario.js';
13
+
14
+ chai.should();
15
+ @eventType('scenario-type-side-effect-input')
16
+ class Input { @field(String) name = 'input'; }
17
+ @eventType('scenario-type-side-effect-output')
18
+ class Outbound { @field(String) name = 'output'; }
19
+ const bare = new Outbound();
20
+ const explicit = { eventSourceId: 'other', event: new Outbound(), eventSourceType: 'explicit-source', eventStreamType: 'explicit-stream' };
21
+ const omitted = { eventSourceId: 'omitted', event: new Outbound() };
22
+
23
+ @reactor('scenario-type-side-effects')
24
+ @eventStreamType('All')
25
+ class AllStreamsReactor { input() { return [bare, explicit, omitted]; } }
26
+
27
+ // Non-default filters still require kernel-backed delivery. An explicit unrestricted stream
28
+ // decorator exercises declared side-effect metadata without pretending to implement filtering.
29
+ describe('when recording side effects with an explicit unrestricted stream decorator', () => {
30
+ let scenario: ReactorScenario;
31
+ let appended: EventForEventSourceId[];
32
+ beforeEach(async () => {
33
+ scenario = new ReactorScenario(AllStreamsReactor, { artifacts: { eventTypes: [Input, Outbound] }, constraints: 'disabled' });
34
+ await scenario.when.forEventSource('trigger').events(new Input());
35
+ const eventLog = { appendMany: vi.fn(async (events: EventForEventSourceId[]) => {
36
+ appended = events;
37
+ return [{ isSuccess: true, errors: [], constraintViolations: [] }];
38
+ }) } as unknown as IEventLog;
39
+ await dispatchReactorSideEffects(eventLog, [bare, explicit, omitted], scenario.sideEffects[0].triggeringContext,
40
+ AllStreamsReactor, 'store', 'namespace');
41
+ });
42
+ it('should record the same target metadata as production dispatch', () => {
43
+ scenario.sideEffects.map(effect => effect.target).should.deep.equal(appended);
44
+ scenario.sideEffects[0].target.eventStreamType!.should.equal('All');
45
+ });
46
+ it('should preserve explicitly targeted events instead of inheriting reactor metadata', () => {
47
+ scenario.sideEffects[1].target.should.equal(explicit);
48
+ scenario.sideEffects[2].target.should.equal(omitted);
49
+ });
50
+ });
@@ -0,0 +1,50 @@
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 { chai, describe, it } from 'vitest';
5
+ import { filterEventsByTag, reducer, tag } from '../../../index.js';
6
+ import { ReadModelScenario, UnsupportedReducerOperation } from '../../index.js';
7
+
8
+ chai.should();
9
+ class State { count = 0; }
10
+ let created = false;
11
+ @reducer('tag-filtered-scenario', undefined, State)
12
+ @filterEventsByTag('vip')
13
+ class TagFiltered {
14
+ constructor() { created = true; }
15
+ }
16
+ class InheritedTagFiltered extends TagFiltered {}
17
+ @reducer('label-only-scenario', undefined, State)
18
+ @tag('vip')
19
+ class Labeled {}
20
+ @reducer('empty-tag-filter-scenario', undefined, State)
21
+ @filterEventsByTag('')
22
+ class EmptyFilter {}
23
+
24
+ for (const type of [TagFiltered, InheritedTagFiltered]) {
25
+ describe(`when creating a reducer scenario for ${type.name}`, () => {
26
+ it('should reject tag-filtered delivery before activating the reducer', () => {
27
+ created = false;
28
+ try {
29
+ new ReadModelScenario(State, { reducers: [type], eventTypes: [], projections: [] });
30
+ throw new Error('Expected unsupported reducer operation');
31
+ } catch (error) {
32
+ (error instanceof UnsupportedReducerOperation).should.be.true;
33
+ const unsupported = error as UnsupportedReducerOperation;
34
+ unsupported.operation.should.equal('reducer.filterEventsByTag');
35
+ unsupported.artifact.should.equal(type.name);
36
+ unsupported.message.should.contain('Tag-filtered delivery is not fixture-backed.');
37
+ unsupported.message.should.contain('Use a kernel-backed test.');
38
+ }
39
+ created.should.be.false;
40
+ });
41
+ });
42
+ }
43
+
44
+ for (const type of [Labeled, EmptyFilter]) {
45
+ describe(`when creating a reducer scenario for ${type.name}`, () => {
46
+ it('should allow metadata that does not restrict delivery', () => {
47
+ (() => new ReadModelScenario(State, { reducers: [type], eventTypes: [], projections: [] })).should.not.throw();
48
+ });
49
+ });
50
+ }
@@ -0,0 +1,48 @@
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 { chai, describe, it } from 'vitest';
5
+ import { eventSourceType, eventStreamType, reactor, reducer } from '../../../index.js';
6
+ import { ReactorScenario, ReadModelScenario, UnsupportedReactorOperation, UnsupportedReducerOperation } from '../../index.js';
7
+
8
+ chai.should();
9
+ function should(value: unknown): ReturnType<typeof chai.expect> {
10
+ return (value as { should: ReturnType<typeof chai.expect> }).should;
11
+ }
12
+
13
+ class State { count = 0; }
14
+ @reactor('source-filtered-scenario')
15
+ @reducer('source-filtered-scenario', undefined, State)
16
+ @eventSourceType('Customers')
17
+ class SourceFiltered {}
18
+ @reactor('stream-filtered-scenario')
19
+ @reducer('stream-filtered-scenario', undefined, State)
20
+ @eventStreamType('Orders')
21
+ class StreamFiltered {}
22
+ @reactor('default-filtered-scenario')
23
+ @reducer('default-filtered-scenario', undefined, State)
24
+ @eventSourceType('')
25
+ @eventStreamType('All')
26
+ class DefaultFiltered {}
27
+ class InheritedSourceFiltered extends SourceFiltered {}
28
+
29
+ for (const type of [SourceFiltered, StreamFiltered, InheritedSourceFiltered]) {
30
+ describe(`when creating observer scenarios for ${type.name}`, () => {
31
+ it('should reject unproven reactor filter semantics before delivering events', () => {
32
+ should(() => new ReactorScenario(type)).throw(UnsupportedReactorOperation, 'Use a kernel-backed test.');
33
+ });
34
+ it('should reject unproven reducer filter semantics before folding events', () => {
35
+ should(() => new ReadModelScenario(State, { reducers: [type], eventTypes: [], projections: [] }))
36
+ .throw(UnsupportedReducerOperation, 'Use a kernel-backed test.');
37
+ });
38
+ });
39
+ }
40
+
41
+ describe('when creating observer scenarios with explicit default filters', () => {
42
+ it('should allow the existing unrestricted reactor scenario', () => {
43
+ should(() => new ReactorScenario(DefaultFiltered, { artifacts: { eventTypes: [] } })).not.throw();
44
+ });
45
+ it('should allow the existing unrestricted reducer scenario', () => {
46
+ should(() => new ReadModelScenario(State, { reducers: [DefaultFiltered], eventTypes: [], projections: [] })).not.throw();
47
+ });
48
+ });
package/testing/index.ts CHANGED
@@ -7,6 +7,7 @@ export type { ReactorScenarioOptions } from './ReactorScenarioOptions.js';
7
7
  export type { ReactorDeliveryResult } from './ReactorDeliveryResult.js';
8
8
  export type { RecordedReactorSideEffect } from './RecordedReactorSideEffect.js';
9
9
  export { UnsupportedReactorOperation } from './UnsupportedReactorOperation.js';
10
+ export { UnsupportedReducerOperation } from './UnsupportedReducerOperation.js';
10
11
  export type { EventScenarioOptions } from './EventScenarioOptions.js';
11
12
  export { EventScenarioGivenBuilder } from './EventScenarioGivenBuilder.js';
12
13
  export { EventScenarioGiven } from './EventScenarioGiven.js';