@event-driven-io/emmett 0.4.0 → 0.5.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.
Files changed (31) hide show
  1. package/dist/commandHandling/handleCommand.d.mts +6 -3
  2. package/dist/commandHandling/handleCommand.d.ts +6 -3
  3. package/dist/commandHandling/handleCommand.js +4 -2
  4. package/dist/commandHandling/handleCommand.js.map +1 -1
  5. package/dist/commandHandling/handleCommand.mjs +4 -2
  6. package/dist/commandHandling/handleCommand.mjs.map +1 -1
  7. package/dist/commandHandling/handleCommandWithDecider.d.mts +3 -2
  8. package/dist/commandHandling/handleCommandWithDecider.d.ts +3 -2
  9. package/dist/commandHandling/index.d.mts +1 -1
  10. package/dist/commandHandling/index.d.ts +1 -1
  11. package/dist/eventStore/inMemoryEventStore.js +9 -4
  12. package/dist/eventStore/inMemoryEventStore.js.map +1 -1
  13. package/dist/eventStore/inMemoryEventStore.mjs +8 -3
  14. package/dist/eventStore/inMemoryEventStore.mjs.map +1 -1
  15. package/dist/index.d.mts +1 -1
  16. package/dist/index.d.ts +1 -1
  17. package/dist/typing/index.d.mts +8 -8
  18. package/dist/typing/index.d.ts +8 -8
  19. package/package.json +1 -10
  20. package/dist/eventStore/expectedVersion.unit.spec.d.mts +0 -2
  21. package/dist/eventStore/expectedVersion.unit.spec.d.ts +0 -2
  22. package/dist/eventStore/expectedVersion.unit.spec.js +0 -62
  23. package/dist/eventStore/expectedVersion.unit.spec.js.map +0 -1
  24. package/dist/eventStore/expectedVersion.unit.spec.mjs +0 -62
  25. package/dist/eventStore/expectedVersion.unit.spec.mjs.map +0 -1
  26. package/dist/validation/validation.spec.d.mts +0 -2
  27. package/dist/validation/validation.spec.d.ts +0 -2
  28. package/dist/validation/validation.spec.js +0 -13
  29. package/dist/validation/validation.spec.js.map +0 -1
  30. package/dist/validation/validation.spec.mjs +0 -13
  31. package/dist/validation/validation.spec.mjs.map +0 -1
@@ -1,9 +1,12 @@
1
- import { E as EventStore, e as ExpectedStreamVersion, d as AppendToStreamResult } from '../eventStore-DLezSgsV.mjs';
1
+ import { D as DefaultStreamVersionType, d as AppendToStreamResult, E as EventStore, e as ExpectedStreamVersion } from '../eventStore-DLezSgsV.mjs';
2
2
  import { Event } from '../typing/index.mjs';
3
3
  import '../errors/index.mjs';
4
4
 
5
+ type CommandHandlerResult<State, StreamVersion = DefaultStreamVersionType> = AppendToStreamResult<StreamVersion> & {
6
+ newState: State;
7
+ };
5
8
  declare const CommandHandler: <State, StreamEvent extends Event, StreamVersion = bigint>(evolve: (state: State, event: StreamEvent) => State, getInitialState: () => State, mapToStreamId?: (id: string) => string) => (eventStore: EventStore<StreamVersion>, id: string, handle: (state: State) => StreamEvent | StreamEvent[], options?: {
6
9
  expectedStreamVersion?: ExpectedStreamVersion<StreamVersion> | undefined;
7
- } | undefined) => Promise<AppendToStreamResult<StreamVersion>>;
10
+ } | undefined) => Promise<CommandHandlerResult<State, StreamVersion>>;
8
11
 
9
- export { CommandHandler };
12
+ export { CommandHandler, type CommandHandlerResult };
@@ -1,9 +1,12 @@
1
- import { E as EventStore, e as ExpectedStreamVersion, d as AppendToStreamResult } from '../eventStore-N_YMFCDT.js';
1
+ import { D as DefaultStreamVersionType, d as AppendToStreamResult, E as EventStore, e as ExpectedStreamVersion } from '../eventStore-N_YMFCDT.js';
2
2
  import { Event } from '../typing/index.js';
3
3
  import '../errors/index.js';
4
4
 
5
+ type CommandHandlerResult<State, StreamVersion = DefaultStreamVersionType> = AppendToStreamResult<StreamVersion> & {
6
+ newState: State;
7
+ };
5
8
  declare const CommandHandler: <State, StreamEvent extends Event, StreamVersion = bigint>(evolve: (state: State, event: StreamEvent) => State, getInitialState: () => State, mapToStreamId?: (id: string) => string) => (eventStore: EventStore<StreamVersion>, id: string, handle: (state: State) => StreamEvent | StreamEvent[], options?: {
6
9
  expectedStreamVersion?: ExpectedStreamVersion<StreamVersion> | undefined;
7
- } | undefined) => Promise<AppendToStreamResult<StreamVersion>>;
10
+ } | undefined) => Promise<CommandHandlerResult<State, StreamVersion>>;
8
11
 
9
- export { CommandHandler };
12
+ export { CommandHandler, type CommandHandlerResult };
@@ -16,14 +16,16 @@ const CommandHandler = (evolve, getInitialState, mapToStreamId = (id) => id) =>
16
16
  const state = _nullishCoalesce(_optionalChain([aggregationResult, 'optionalAccess', _2 => _2.state]), () => ( getInitialState()));
17
17
  const currentStreamVersion = _optionalChain([aggregationResult, 'optionalAccess', _3 => _3.currentStreamVersion]);
18
18
  const result = handle(state);
19
+ const newEvents = Array.isArray(result) ? result : [result];
19
20
  const expectedStreamVersion = _nullishCoalesce(_nullishCoalesce(_optionalChain([options, 'optionalAccess', _4 => _4.expectedStreamVersion]), () => ( currentStreamVersion)), () => ( _eventStore.STREAM_DOES_NOT_EXIST));
20
- return eventStore.appendToStream(
21
+ const appendResult = await eventStore.appendToStream(
21
22
  streamName,
22
- Array.isArray(result) ? result : [result],
23
+ newEvents,
23
24
  {
24
25
  expectedStreamVersion
25
26
  }
26
27
  );
28
+ return { ...appendResult, newState: newEvents.reduce(evolve, state) };
27
29
  };
28
30
 
29
31
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commandHandling/handleCommand.ts"],"names":[],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AAIA,MAAM,iBACX,CACE,QACA,iBACA,gBAAwC,CAAC,OAAO,OAElD,OACE,YACA,IACA,QACA,YAGG;AACH,QAAM,aAAa,cAAc,EAAE;AAGnC,QAAM,oBAAoB,MAAM,WAAW,gBAGzC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,MAAM;AAAA;AAAA;AAAA,MAGJ,uBACE,SAAS,yBAAyB;AAAA,IACtC;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,mBAAmB,SAAS,gBAAgB;AAC1D,QAAM,uBAAuB,mBAAmB;AAGhD,QAAM,SAAS,OAAO,KAAK;AAM3B,QAAM,wBACJ,SAAS,yBACT,wBACA;AAGF,SAAO,WAAW;AAAA,IAChB;AAAA,IACA,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAAA,IACxC;AAAA,MACE;AAAA,IACF;AAAA,EACF;AACF","sourcesContent":["import {\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n type DefaultStreamVersionType,\n type EventStore,\n type ExpectedStreamVersion,\n} from '../eventStore';\nimport type { Event } from '../typing';\n\n// #region command-handler\nexport const CommandHandler =\n <State, StreamEvent extends Event, StreamVersion = DefaultStreamVersionType>(\n evolve: (state: State, event: StreamEvent) => State,\n getInitialState: () => State,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async (\n eventStore: EventStore<StreamVersion>,\n id: string,\n handle: (state: State) => StreamEvent | StreamEvent[],\n options?: {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ) => {\n const streamName = mapToStreamId(id);\n\n // 1. Aggregate the stream\n const aggregationResult = await eventStore.aggregateStream<\n State,\n StreamEvent\n >(streamName, {\n evolve,\n getInitialState,\n read: {\n // expected stream version is passed to fail fast\n // if stream is in the wrong state\n expectedStreamVersion:\n options?.expectedStreamVersion ?? NO_CONCURRENCY_CHECK,\n },\n });\n\n // 2. Use the aggregate state or the initial one (when e.g. stream does not exist)\n const state = aggregationResult?.state ?? getInitialState();\n const currentStreamVersion = aggregationResult?.currentStreamVersion;\n\n // 3. Run business logic\n const result = handle(state);\n\n // Either use:\n // - provided expected stream version,\n // - current stream version got from stream aggregation,\n // - or expect stream not to exists otherwise.\n const expectedStreamVersion: ExpectedStreamVersion<StreamVersion> =\n options?.expectedStreamVersion ??\n currentStreamVersion ??\n STREAM_DOES_NOT_EXIST;\n\n // 4. Append result to the stream\n return eventStore.appendToStream(\n streamName,\n Array.isArray(result) ? result : [result],\n {\n expectedStreamVersion,\n },\n );\n };\n// #endregion command-handler\n"]}
1
+ {"version":3,"sources":["../../src/commandHandling/handleCommand.ts"],"names":[],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AASA,MAAM,iBACX,CACE,QACA,iBACA,gBAAwC,CAAC,OAAO,OAElD,OACE,YACA,IACA,QACA,YAGwD;AACxD,QAAM,aAAa,cAAc,EAAE;AAGnC,QAAM,oBAAoB,MAAM,WAAW,gBAGzC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,MAAM;AAAA;AAAA;AAAA,MAGJ,uBACE,SAAS,yBAAyB;AAAA,IACtC;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,mBAAmB,SAAS,gBAAgB;AAC1D,QAAM,uBAAuB,mBAAmB;AAGhD,QAAM,SAAS,OAAO,KAAK;AAE3B,QAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAM1D,QAAM,wBACJ,SAAS,yBACT,wBACA;AAGF,QAAM,eAAe,MAAM,WAAW;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,IACF;AAAA,EACF;AAGA,SAAO,EAAE,GAAG,cAAc,UAAU,UAAU,OAAO,QAAQ,KAAK,EAAE;AACtE","sourcesContent":["import {\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n type AppendToStreamResult,\n type DefaultStreamVersionType,\n type EventStore,\n type ExpectedStreamVersion,\n} from '../eventStore';\nimport type { Event } from '../typing';\n\n// #region command-handler\nexport type CommandHandlerResult<\n State,\n StreamVersion = DefaultStreamVersionType,\n> = AppendToStreamResult<StreamVersion> & { newState: State };\n\nexport const CommandHandler =\n <State, StreamEvent extends Event, StreamVersion = DefaultStreamVersionType>(\n evolve: (state: State, event: StreamEvent) => State,\n getInitialState: () => State,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async (\n eventStore: EventStore<StreamVersion>,\n id: string,\n handle: (state: State) => StreamEvent | StreamEvent[],\n options?: {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ): Promise<CommandHandlerResult<State, StreamVersion>> => {\n const streamName = mapToStreamId(id);\n\n // 1. Aggregate the stream\n const aggregationResult = await eventStore.aggregateStream<\n State,\n StreamEvent\n >(streamName, {\n evolve,\n getInitialState,\n read: {\n // expected stream version is passed to fail fast\n // if stream is in the wrong state\n expectedStreamVersion:\n options?.expectedStreamVersion ?? NO_CONCURRENCY_CHECK,\n },\n });\n\n // 2. Use the aggregate state or the initial one (when e.g. stream does not exist)\n const state = aggregationResult?.state ?? getInitialState();\n const currentStreamVersion = aggregationResult?.currentStreamVersion;\n\n // 3. Run business logic\n const result = handle(state);\n\n const newEvents = Array.isArray(result) ? result : [result];\n\n // Either use:\n // - provided expected stream version,\n // - current stream version got from stream aggregation,\n // - or expect stream not to exists otherwise.\n const expectedStreamVersion: ExpectedStreamVersion<StreamVersion> =\n options?.expectedStreamVersion ??\n currentStreamVersion ??\n STREAM_DOES_NOT_EXIST;\n\n // 4. Append result to the stream\n const appendResult = await eventStore.appendToStream(\n streamName,\n newEvents,\n {\n expectedStreamVersion,\n },\n );\n\n // 5. Return result with updated state\n return { ...appendResult, newState: newEvents.reduce(evolve, state) };\n };\n// #endregion command-handler\n"]}
@@ -16,14 +16,16 @@ const CommandHandler = (evolve, getInitialState, mapToStreamId = (id) => id) =>
16
16
  const state = aggregationResult?.state ?? getInitialState();
17
17
  const currentStreamVersion = aggregationResult?.currentStreamVersion;
18
18
  const result = handle(state);
19
+ const newEvents = Array.isArray(result) ? result : [result];
19
20
  const expectedStreamVersion = options?.expectedStreamVersion ?? currentStreamVersion ?? STREAM_DOES_NOT_EXIST;
20
- return eventStore.appendToStream(
21
+ const appendResult = await eventStore.appendToStream(
21
22
  streamName,
22
- Array.isArray(result) ? result : [result],
23
+ newEvents,
23
24
  {
24
25
  expectedStreamVersion
25
26
  }
26
27
  );
28
+ return { ...appendResult, newState: newEvents.reduce(evolve, state) };
27
29
  };
28
30
  export {
29
31
  CommandHandler
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/commandHandling/handleCommand.ts"],"sourcesContent":["import {\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n type DefaultStreamVersionType,\n type EventStore,\n type ExpectedStreamVersion,\n} from '../eventStore';\nimport type { Event } from '../typing';\n\n// #region command-handler\nexport const CommandHandler =\n <State, StreamEvent extends Event, StreamVersion = DefaultStreamVersionType>(\n evolve: (state: State, event: StreamEvent) => State,\n getInitialState: () => State,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async (\n eventStore: EventStore<StreamVersion>,\n id: string,\n handle: (state: State) => StreamEvent | StreamEvent[],\n options?: {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ) => {\n const streamName = mapToStreamId(id);\n\n // 1. Aggregate the stream\n const aggregationResult = await eventStore.aggregateStream<\n State,\n StreamEvent\n >(streamName, {\n evolve,\n getInitialState,\n read: {\n // expected stream version is passed to fail fast\n // if stream is in the wrong state\n expectedStreamVersion:\n options?.expectedStreamVersion ?? NO_CONCURRENCY_CHECK,\n },\n });\n\n // 2. Use the aggregate state or the initial one (when e.g. stream does not exist)\n const state = aggregationResult?.state ?? getInitialState();\n const currentStreamVersion = aggregationResult?.currentStreamVersion;\n\n // 3. Run business logic\n const result = handle(state);\n\n // Either use:\n // - provided expected stream version,\n // - current stream version got from stream aggregation,\n // - or expect stream not to exists otherwise.\n const expectedStreamVersion: ExpectedStreamVersion<StreamVersion> =\n options?.expectedStreamVersion ??\n currentStreamVersion ??\n STREAM_DOES_NOT_EXIST;\n\n // 4. Append result to the stream\n return eventStore.appendToStream(\n streamName,\n Array.isArray(result) ? result : [result],\n {\n expectedStreamVersion,\n },\n );\n };\n// #endregion command-handler\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAIK;AAIA,MAAM,iBACX,CACE,QACA,iBACA,gBAAwC,CAAC,OAAO,OAElD,OACE,YACA,IACA,QACA,YAGG;AACH,QAAM,aAAa,cAAc,EAAE;AAGnC,QAAM,oBAAoB,MAAM,WAAW,gBAGzC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,MAAM;AAAA;AAAA;AAAA,MAGJ,uBACE,SAAS,yBAAyB;AAAA,IACtC;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,mBAAmB,SAAS,gBAAgB;AAC1D,QAAM,uBAAuB,mBAAmB;AAGhD,QAAM,SAAS,OAAO,KAAK;AAM3B,QAAM,wBACJ,SAAS,yBACT,wBACA;AAGF,SAAO,WAAW;AAAA,IAChB;AAAA,IACA,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAAA,IACxC;AAAA,MACE;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/commandHandling/handleCommand.ts"],"sourcesContent":["import {\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n type AppendToStreamResult,\n type DefaultStreamVersionType,\n type EventStore,\n type ExpectedStreamVersion,\n} from '../eventStore';\nimport type { Event } from '../typing';\n\n// #region command-handler\nexport type CommandHandlerResult<\n State,\n StreamVersion = DefaultStreamVersionType,\n> = AppendToStreamResult<StreamVersion> & { newState: State };\n\nexport const CommandHandler =\n <State, StreamEvent extends Event, StreamVersion = DefaultStreamVersionType>(\n evolve: (state: State, event: StreamEvent) => State,\n getInitialState: () => State,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async (\n eventStore: EventStore<StreamVersion>,\n id: string,\n handle: (state: State) => StreamEvent | StreamEvent[],\n options?: {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ): Promise<CommandHandlerResult<State, StreamVersion>> => {\n const streamName = mapToStreamId(id);\n\n // 1. Aggregate the stream\n const aggregationResult = await eventStore.aggregateStream<\n State,\n StreamEvent\n >(streamName, {\n evolve,\n getInitialState,\n read: {\n // expected stream version is passed to fail fast\n // if stream is in the wrong state\n expectedStreamVersion:\n options?.expectedStreamVersion ?? NO_CONCURRENCY_CHECK,\n },\n });\n\n // 2. Use the aggregate state or the initial one (when e.g. stream does not exist)\n const state = aggregationResult?.state ?? getInitialState();\n const currentStreamVersion = aggregationResult?.currentStreamVersion;\n\n // 3. Run business logic\n const result = handle(state);\n\n const newEvents = Array.isArray(result) ? result : [result];\n\n // Either use:\n // - provided expected stream version,\n // - current stream version got from stream aggregation,\n // - or expect stream not to exists otherwise.\n const expectedStreamVersion: ExpectedStreamVersion<StreamVersion> =\n options?.expectedStreamVersion ??\n currentStreamVersion ??\n STREAM_DOES_NOT_EXIST;\n\n // 4. Append result to the stream\n const appendResult = await eventStore.appendToStream(\n streamName,\n newEvents,\n {\n expectedStreamVersion,\n },\n );\n\n // 5. Return result with updated state\n return { ...appendResult, newState: newEvents.reduce(evolve, state) };\n };\n// #endregion command-handler\n"],"mappings":"AAAA;AAAA,EACE;AAAA,EACA;AAAA,OAKK;AASA,MAAM,iBACX,CACE,QACA,iBACA,gBAAwC,CAAC,OAAO,OAElD,OACE,YACA,IACA,QACA,YAGwD;AACxD,QAAM,aAAa,cAAc,EAAE;AAGnC,QAAM,oBAAoB,MAAM,WAAW,gBAGzC,YAAY;AAAA,IACZ;AAAA,IACA;AAAA,IACA,MAAM;AAAA;AAAA;AAAA,MAGJ,uBACE,SAAS,yBAAyB;AAAA,IACtC;AAAA,EACF,CAAC;AAGD,QAAM,QAAQ,mBAAmB,SAAS,gBAAgB;AAC1D,QAAM,uBAAuB,mBAAmB;AAGhD,QAAM,SAAS,OAAO,KAAK;AAE3B,QAAM,YAAY,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,MAAM;AAM1D,QAAM,wBACJ,SAAS,yBACT,wBACA;AAGF,QAAM,eAAe,MAAM,WAAW;AAAA,IACpC;AAAA,IACA;AAAA,IACA;AAAA,MACE;AAAA,IACF;AAAA,EACF;AAGA,SAAO,EAAE,GAAG,cAAc,UAAU,UAAU,OAAO,QAAQ,KAAK,EAAE;AACtE;","names":[]}
@@ -1,9 +1,10 @@
1
- import { E as EventStore, e as ExpectedStreamVersion, d as AppendToStreamResult } from '../eventStore-DLezSgsV.mjs';
1
+ import { CommandHandlerResult } from './handleCommand.mjs';
2
+ import { E as EventStore, e as ExpectedStreamVersion } from '../eventStore-DLezSgsV.mjs';
2
3
  import { Command, Event, Decider } from '../typing/index.mjs';
3
4
  import '../errors/index.mjs';
4
5
 
5
6
  declare const DeciderCommandHandler: <State, CommandType extends Command, StreamEvent extends Event, StreamVersion = bigint>({ decide, evolve, getInitialState, }: Decider<State, CommandType, StreamEvent>, mapToStreamId?: (id: string) => string) => (eventStore: EventStore<StreamVersion>, id: string, command: CommandType, options?: {
6
7
  expectedStreamVersion?: ExpectedStreamVersion<StreamVersion> | undefined;
7
- } | undefined) => Promise<AppendToStreamResult<StreamVersion>>;
8
+ } | undefined) => Promise<CommandHandlerResult<State, StreamVersion>>;
8
9
 
9
10
  export { DeciderCommandHandler };
@@ -1,9 +1,10 @@
1
- import { E as EventStore, e as ExpectedStreamVersion, d as AppendToStreamResult } from '../eventStore-N_YMFCDT.js';
1
+ import { CommandHandlerResult } from './handleCommand.js';
2
+ import { E as EventStore, e as ExpectedStreamVersion } from '../eventStore-N_YMFCDT.js';
2
3
  import { Command, Event, Decider } from '../typing/index.js';
3
4
  import '../errors/index.js';
4
5
 
5
6
  declare const DeciderCommandHandler: <State, CommandType extends Command, StreamEvent extends Event, StreamVersion = bigint>({ decide, evolve, getInitialState, }: Decider<State, CommandType, StreamEvent>, mapToStreamId?: (id: string) => string) => (eventStore: EventStore<StreamVersion>, id: string, command: CommandType, options?: {
6
7
  expectedStreamVersion?: ExpectedStreamVersion<StreamVersion> | undefined;
7
- } | undefined) => Promise<AppendToStreamResult<StreamVersion>>;
8
+ } | undefined) => Promise<CommandHandlerResult<State, StreamVersion>>;
8
9
 
9
10
  export { DeciderCommandHandler };
@@ -1,4 +1,4 @@
1
- export { CommandHandler } from './handleCommand.mjs';
1
+ export { CommandHandler, CommandHandlerResult } from './handleCommand.mjs';
2
2
  export { DeciderCommandHandler } from './handleCommandWithDecider.mjs';
3
3
  import '../eventStore-DLezSgsV.mjs';
4
4
  import '../typing/index.mjs';
@@ -1,4 +1,4 @@
1
- export { CommandHandler } from './handleCommand.js';
1
+ export { CommandHandler, CommandHandlerResult } from './handleCommand.js';
2
2
  export { DeciderCommandHandler } from './handleCommandWithDecider.js';
3
3
  import '../eventStore-N_YMFCDT.js';
4
4
  import '../typing/index.js';
@@ -1,4 +1,4 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _uuid = require('uuid');
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _crypto = require('crypto');
2
2
 
3
3
  require('./eventStore');
4
4
  var _expectedVersion = require('./expectedVersion');
@@ -26,9 +26,14 @@ const getInMemoryEventStore = () => {
26
26
  currentStreamVersion,
27
27
  _optionalChain([options, 'optionalAccess', _2 => _2.expectedStreamVersion])
28
28
  );
29
+ const from = Number(options && "from" in options ? options.from : 0);
30
+ const to = Number(
31
+ options && "to" in options ? options.to : options && "maxCount" in options && options.maxCount ? options.from + options.maxCount : _nullishCoalesce(_optionalChain([events, 'optionalAccess', _3 => _3.length]), () => ( 1))
32
+ );
33
+ const resultEvents = events && events.length > 0 ? events.map((e) => e.event).slice(from, to) : [];
29
34
  const result = events && events.length > 0 ? {
30
35
  currentStreamVersion,
31
- events: events.map((e) => e.event)
36
+ events: resultEvents
32
37
  } : null;
33
38
  return Promise.resolve(result);
34
39
  },
@@ -37,13 +42,13 @@ const getInMemoryEventStore = () => {
37
42
  const currentStreamVersion = currentEvents.length > 0 ? BigInt(currentEvents.length) : void 0;
38
43
  _expectedVersion.assertExpectedVersionMatchesCurrent.call(void 0,
39
44
  currentStreamVersion,
40
- _optionalChain([options, 'optionalAccess', _3 => _3.expectedStreamVersion])
45
+ _optionalChain([options, 'optionalAccess', _4 => _4.expectedStreamVersion])
41
46
  );
42
47
  const eventEnvelopes = events.map((event, index) => {
43
48
  return {
44
49
  event,
45
50
  metadata: {
46
- eventId: _uuid.v4.call(void 0, ),
51
+ eventId: _crypto.randomUUID.call(void 0, ),
47
52
  streamPosition: currentEvents.length + index + 1,
48
53
  logPosition: BigInt(getAllEventsCount() + index + 1)
49
54
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/eventStore/inMemoryEventStore.ts"],"names":[],"mappings":"AAAA,SAAS,MAAM,YAAY;AAE3B;AAAA,OAQO;AACP,SAAS,2CAA2C;AAiB7C,MAAM,wBAAwB,MAAkB;AACrD,QAAM,UAAU,oBAAI,IAA6B;AAEjD,QAAM,oBAAoB,MAAM;AAC9B,WAAO,MAAM,KAAsB,QAAQ,OAAO,CAAC,EAChD,IAAI,CAAC,MAAM,EAAE,MAAM,EACnB,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,MAAM,gBACJ,YACA,SAC8C;AAC9C,YAAM,EAAE,QAAQ,iBAAiB,KAAK,IAAI;AAE1C,YAAM,SAAS,MAAM,KAAK,WAAsB,YAAY,IAAI;AAEhE,UAAI,CAAC;AAAQ,eAAO;AAEpB,YAAM,SAAS,QAAQ,UAAU,CAAC;AAElC,aAAO;AAAA,QACL,sBAAsB,OAAO,OAAO,MAAM;AAAA,QAC1C,OAAO,OAAO,OAAO,QAAQ,gBAAgB,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,IAEA,YAAY,CACV,YACA,YACyC;AACzC,YAAM,SAAS,QAAQ,IAAI,UAAU;AACrC,YAAM,uBAAuB,SAAS,OAAO,OAAO,MAAM,IAAI;AAE9D;AAAA,QACE;AAAA,QACA,SAAS;AAAA,MACX;AAEA,YAAM,SACJ,UAAU,OAAO,SAAS,IACtB;AAAA,QACE;AAAA,QACA,QAAQ,OAAO,IAAI,CAAC,MAAM,EAAE,KAAkB;AAAA,MAChD,IACA;AAEN,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,IAEA,gBAAgB,CACd,YACA,QACA,YACkC;AAClC,YAAM,gBAAgB,QAAQ,IAAI,UAAU,KAAK,CAAC;AAClD,YAAM,uBACJ,cAAc,SAAS,IAAI,OAAO,cAAc,MAAM,IAAI;AAE5D;AAAA,QACE;AAAA,QACA,SAAS;AAAA,MACX;AAEA,YAAM,iBAAkC,OAAO,IAAI,CAAC,OAAO,UAAU;AACnE,eAAO;AAAA,UACL;AAAA,UACA,UAAU;AAAA,YACR,SAAS,KAAK;AAAA,YACd,gBAAgB,cAAc,SAAS,QAAQ;AAAA,YAC/C,aAAa,OAAO,kBAAkB,IAAI,QAAQ,CAAC;AAAA,UACrD;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,iCAAiC;AAAA,QACrC,eAAe,MAAM,EAAE,EAAE,CAAC,EAAG,SAAS;AAAA,MACxC;AAEA,cAAQ,IAAI,YAAY,CAAC,GAAG,eAAe,GAAG,cAAc,CAAC;AAE7D,YAAM,SAA+B;AAAA,QACnC,2BAA2B;AAAA,MAC7B;AAEA,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,EACF;AACF","sourcesContent":["import { v4 as uuid } from 'uuid';\nimport type { Event } from '../typing';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\n\nexport type EventMetadata = Readonly<{\n eventId: string;\n streamPosition: number;\n logPosition: bigint;\n}>;\n\nexport type EventEnvelope<E extends Event = Event> = {\n event: E;\n metadata: EventMetadata;\n};\n\nexport type EventHandler<E extends Event = Event> = (\n eventEnvelope: EventEnvelope<E>,\n) => void;\n\nexport const getInMemoryEventStore = (): EventStore => {\n const streams = new Map<string, EventEnvelope[]>();\n\n const getAllEventsCount = () => {\n return Array.from<EventEnvelope[]>(streams.values())\n .map((s) => s.length)\n .reduce((p, c) => p + c, 0);\n };\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType>,\n ): Promise<AggregateStreamResult<State> | null> {\n const { evolve, getInitialState, read } = options;\n\n const result = await this.readStream<EventType>(streamName, read);\n\n if (!result) return null;\n\n const events = result?.events ?? [];\n\n return {\n currentStreamVersion: BigInt(events.length),\n state: events.reduce(evolve, getInitialState()),\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<ReadStreamResult<EventType>> => {\n const events = streams.get(streamName);\n const currentStreamVersion = events ? BigInt(events.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const result: ReadStreamResult<EventType> =\n events && events.length > 0\n ? {\n currentStreamVersion: currentStreamVersion!,\n events: events.map((e) => e.event as EventType),\n }\n : null;\n\n return Promise.resolve(result);\n },\n\n appendToStream: <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions,\n ): Promise<AppendToStreamResult> => {\n const currentEvents = streams.get(streamName) ?? [];\n const currentStreamVersion =\n currentEvents.length > 0 ? BigInt(currentEvents.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const eventEnvelopes: EventEnvelope[] = events.map((event, index) => {\n return {\n event,\n metadata: {\n eventId: uuid(),\n streamPosition: currentEvents.length + index + 1,\n logPosition: BigInt(getAllEventsCount() + index + 1),\n },\n };\n });\n\n const positionOfLastEventInTheStream = BigInt(\n eventEnvelopes.slice(-1)[0]!.metadata.streamPosition,\n );\n\n streams.set(streamName, [...currentEvents, ...eventEnvelopes]);\n\n const result: AppendToStreamResult = {\n nextExpectedStreamVersion: positionOfLastEventInTheStream,\n };\n\n return Promise.resolve(result);\n },\n };\n};\n"]}
1
+ {"version":3,"sources":["../../src/eventStore/inMemoryEventStore.ts"],"names":[],"mappings":"AAAA,SAAS,kBAAkB;AAE3B;AAAA,OAQO;AACP,SAAS,2CAA2C;AAiB7C,MAAM,wBAAwB,MAAkB;AACrD,QAAM,UAAU,oBAAI,IAA6B;AAEjD,QAAM,oBAAoB,MAAM;AAC9B,WAAO,MAAM,KAAsB,QAAQ,OAAO,CAAC,EAChD,IAAI,CAAC,MAAM,EAAE,MAAM,EACnB,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,MAAM,gBACJ,YACA,SAC8C;AAC9C,YAAM,EAAE,QAAQ,iBAAiB,KAAK,IAAI;AAE1C,YAAM,SAAS,MAAM,KAAK,WAAsB,YAAY,IAAI;AAEhE,UAAI,CAAC;AAAQ,eAAO;AAEpB,YAAM,SAAS,QAAQ,UAAU,CAAC;AAElC,aAAO;AAAA,QACL,sBAAsB,OAAO,OAAO,MAAM;AAAA,QAC1C,OAAO,OAAO,OAAO,QAAQ,gBAAgB,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,IAEA,YAAY,CACV,YACA,YACyC;AACzC,YAAM,SAAS,QAAQ,IAAI,UAAU;AACrC,YAAM,uBAAuB,SAAS,OAAO,OAAO,MAAM,IAAI;AAE9D;AAAA,QACE;AAAA,QACA,SAAS;AAAA,MACX;AAEA,YAAM,OAAO,OAAO,WAAW,UAAU,UAAU,QAAQ,OAAO,CAAC;AACnE,YAAM,KAAK;AAAA,QACT,WAAW,QAAQ,UACf,QAAQ,KACR,WAAW,cAAc,WAAW,QAAQ,WAC1C,QAAQ,OAAO,QAAQ,WACvB,QAAQ,UAAU;AAAA,MAC1B;AAEA,YAAM,eACJ,UAAU,OAAO,SAAS,IACtB,OAAO,IAAI,CAAC,MAAM,EAAE,KAAkB,EAAE,MAAM,MAAM,EAAE,IACtD,CAAC;AAEP,YAAM,SACJ,UAAU,OAAO,SAAS,IACtB;AAAA,QACE;AAAA,QACA,QAAQ;AAAA,MACV,IACA;AAEN,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,IAEA,gBAAgB,CACd,YACA,QACA,YACkC;AAClC,YAAM,gBAAgB,QAAQ,IAAI,UAAU,KAAK,CAAC;AAClD,YAAM,uBACJ,cAAc,SAAS,IAAI,OAAO,cAAc,MAAM,IAAI;AAE5D;AAAA,QACE;AAAA,QACA,SAAS;AAAA,MACX;AAEA,YAAM,iBAAkC,OAAO,IAAI,CAAC,OAAO,UAAU;AACnE,eAAO;AAAA,UACL;AAAA,UACA,UAAU;AAAA,YACR,SAAS,WAAW;AAAA,YACpB,gBAAgB,cAAc,SAAS,QAAQ;AAAA,YAC/C,aAAa,OAAO,kBAAkB,IAAI,QAAQ,CAAC;AAAA,UACrD;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,iCAAiC;AAAA,QACrC,eAAe,MAAM,EAAE,EAAE,CAAC,EAAG,SAAS;AAAA,MACxC;AAEA,cAAQ,IAAI,YAAY,CAAC,GAAG,eAAe,GAAG,cAAc,CAAC;AAE7D,YAAM,SAA+B;AAAA,QACnC,2BAA2B;AAAA,MAC7B;AAEA,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,EACF;AACF","sourcesContent":["import { randomUUID } from 'crypto';\nimport type { Event } from '../typing';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\n\nexport type EventMetadata = Readonly<{\n eventId: string;\n streamPosition: number;\n logPosition: bigint;\n}>;\n\nexport type EventEnvelope<E extends Event = Event> = {\n event: E;\n metadata: EventMetadata;\n};\n\nexport type EventHandler<E extends Event = Event> = (\n eventEnvelope: EventEnvelope<E>,\n) => void;\n\nexport const getInMemoryEventStore = (): EventStore => {\n const streams = new Map<string, EventEnvelope[]>();\n\n const getAllEventsCount = () => {\n return Array.from<EventEnvelope[]>(streams.values())\n .map((s) => s.length)\n .reduce((p, c) => p + c, 0);\n };\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType>,\n ): Promise<AggregateStreamResult<State> | null> {\n const { evolve, getInitialState, read } = options;\n\n const result = await this.readStream<EventType>(streamName, read);\n\n if (!result) return null;\n\n const events = result?.events ?? [];\n\n return {\n currentStreamVersion: BigInt(events.length),\n state: events.reduce(evolve, getInitialState()),\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<ReadStreamResult<EventType>> => {\n const events = streams.get(streamName);\n const currentStreamVersion = events ? BigInt(events.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const from = Number(options && 'from' in options ? options.from : 0);\n const to = Number(\n options && 'to' in options\n ? options.to\n : options && 'maxCount' in options && options.maxCount\n ? options.from + options.maxCount\n : events?.length ?? 1,\n );\n\n const resultEvents =\n events && events.length > 0\n ? events.map((e) => e.event as EventType).slice(from, to)\n : [];\n\n const result: ReadStreamResult<EventType> =\n events && events.length > 0\n ? {\n currentStreamVersion: currentStreamVersion!,\n events: resultEvents,\n }\n : null;\n\n return Promise.resolve(result);\n },\n\n appendToStream: <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions,\n ): Promise<AppendToStreamResult> => {\n const currentEvents = streams.get(streamName) ?? [];\n const currentStreamVersion =\n currentEvents.length > 0 ? BigInt(currentEvents.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const eventEnvelopes: EventEnvelope[] = events.map((event, index) => {\n return {\n event,\n metadata: {\n eventId: randomUUID(),\n streamPosition: currentEvents.length + index + 1,\n logPosition: BigInt(getAllEventsCount() + index + 1),\n },\n };\n });\n\n const positionOfLastEventInTheStream = BigInt(\n eventEnvelopes.slice(-1)[0]!.metadata.streamPosition,\n );\n\n streams.set(streamName, [...currentEvents, ...eventEnvelopes]);\n\n const result: AppendToStreamResult = {\n nextExpectedStreamVersion: positionOfLastEventInTheStream,\n };\n\n return Promise.resolve(result);\n },\n };\n};\n"]}
@@ -1,4 +1,4 @@
1
- import { v4 as uuid } from "uuid";
1
+ import { randomUUID } from "crypto";
2
2
  import {
3
3
  } from "./eventStore";
4
4
  import { assertExpectedVersionMatchesCurrent } from "./expectedVersion";
@@ -26,9 +26,14 @@ const getInMemoryEventStore = () => {
26
26
  currentStreamVersion,
27
27
  options?.expectedStreamVersion
28
28
  );
29
+ const from = Number(options && "from" in options ? options.from : 0);
30
+ const to = Number(
31
+ options && "to" in options ? options.to : options && "maxCount" in options && options.maxCount ? options.from + options.maxCount : events?.length ?? 1
32
+ );
33
+ const resultEvents = events && events.length > 0 ? events.map((e) => e.event).slice(from, to) : [];
29
34
  const result = events && events.length > 0 ? {
30
35
  currentStreamVersion,
31
- events: events.map((e) => e.event)
36
+ events: resultEvents
32
37
  } : null;
33
38
  return Promise.resolve(result);
34
39
  },
@@ -43,7 +48,7 @@ const getInMemoryEventStore = () => {
43
48
  return {
44
49
  event,
45
50
  metadata: {
46
- eventId: uuid(),
51
+ eventId: randomUUID(),
47
52
  streamPosition: currentEvents.length + index + 1,
48
53
  logPosition: BigInt(getAllEventsCount() + index + 1)
49
54
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/eventStore/inMemoryEventStore.ts"],"sourcesContent":["import { v4 as uuid } from 'uuid';\nimport type { Event } from '../typing';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\n\nexport type EventMetadata = Readonly<{\n eventId: string;\n streamPosition: number;\n logPosition: bigint;\n}>;\n\nexport type EventEnvelope<E extends Event = Event> = {\n event: E;\n metadata: EventMetadata;\n};\n\nexport type EventHandler<E extends Event = Event> = (\n eventEnvelope: EventEnvelope<E>,\n) => void;\n\nexport const getInMemoryEventStore = (): EventStore => {\n const streams = new Map<string, EventEnvelope[]>();\n\n const getAllEventsCount = () => {\n return Array.from<EventEnvelope[]>(streams.values())\n .map((s) => s.length)\n .reduce((p, c) => p + c, 0);\n };\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType>,\n ): Promise<AggregateStreamResult<State> | null> {\n const { evolve, getInitialState, read } = options;\n\n const result = await this.readStream<EventType>(streamName, read);\n\n if (!result) return null;\n\n const events = result?.events ?? [];\n\n return {\n currentStreamVersion: BigInt(events.length),\n state: events.reduce(evolve, getInitialState()),\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<ReadStreamResult<EventType>> => {\n const events = streams.get(streamName);\n const currentStreamVersion = events ? BigInt(events.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const result: ReadStreamResult<EventType> =\n events && events.length > 0\n ? {\n currentStreamVersion: currentStreamVersion!,\n events: events.map((e) => e.event as EventType),\n }\n : null;\n\n return Promise.resolve(result);\n },\n\n appendToStream: <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions,\n ): Promise<AppendToStreamResult> => {\n const currentEvents = streams.get(streamName) ?? [];\n const currentStreamVersion =\n currentEvents.length > 0 ? BigInt(currentEvents.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const eventEnvelopes: EventEnvelope[] = events.map((event, index) => {\n return {\n event,\n metadata: {\n eventId: uuid(),\n streamPosition: currentEvents.length + index + 1,\n logPosition: BigInt(getAllEventsCount() + index + 1),\n },\n };\n });\n\n const positionOfLastEventInTheStream = BigInt(\n eventEnvelopes.slice(-1)[0]!.metadata.streamPosition,\n );\n\n streams.set(streamName, [...currentEvents, ...eventEnvelopes]);\n\n const result: AppendToStreamResult = {\n nextExpectedStreamVersion: positionOfLastEventInTheStream,\n };\n\n return Promise.resolve(result);\n },\n };\n};\n"],"mappings":"AAAA,SAAS,MAAM,YAAY;AAE3B;AAAA,OAQO;AACP,SAAS,2CAA2C;AAiB7C,MAAM,wBAAwB,MAAkB;AACrD,QAAM,UAAU,oBAAI,IAA6B;AAEjD,QAAM,oBAAoB,MAAM;AAC9B,WAAO,MAAM,KAAsB,QAAQ,OAAO,CAAC,EAChD,IAAI,CAAC,MAAM,EAAE,MAAM,EACnB,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,MAAM,gBACJ,YACA,SAC8C;AAC9C,YAAM,EAAE,QAAQ,iBAAiB,KAAK,IAAI;AAE1C,YAAM,SAAS,MAAM,KAAK,WAAsB,YAAY,IAAI;AAEhE,UAAI,CAAC;AAAQ,eAAO;AAEpB,YAAM,SAAS,QAAQ,UAAU,CAAC;AAElC,aAAO;AAAA,QACL,sBAAsB,OAAO,OAAO,MAAM;AAAA,QAC1C,OAAO,OAAO,OAAO,QAAQ,gBAAgB,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,IAEA,YAAY,CACV,YACA,YACyC;AACzC,YAAM,SAAS,QAAQ,IAAI,UAAU;AACrC,YAAM,uBAAuB,SAAS,OAAO,OAAO,MAAM,IAAI;AAE9D;AAAA,QACE;AAAA,QACA,SAAS;AAAA,MACX;AAEA,YAAM,SACJ,UAAU,OAAO,SAAS,IACtB;AAAA,QACE;AAAA,QACA,QAAQ,OAAO,IAAI,CAAC,MAAM,EAAE,KAAkB;AAAA,MAChD,IACA;AAEN,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,IAEA,gBAAgB,CACd,YACA,QACA,YACkC;AAClC,YAAM,gBAAgB,QAAQ,IAAI,UAAU,KAAK,CAAC;AAClD,YAAM,uBACJ,cAAc,SAAS,IAAI,OAAO,cAAc,MAAM,IAAI;AAE5D;AAAA,QACE;AAAA,QACA,SAAS;AAAA,MACX;AAEA,YAAM,iBAAkC,OAAO,IAAI,CAAC,OAAO,UAAU;AACnE,eAAO;AAAA,UACL;AAAA,UACA,UAAU;AAAA,YACR,SAAS,KAAK;AAAA,YACd,gBAAgB,cAAc,SAAS,QAAQ;AAAA,YAC/C,aAAa,OAAO,kBAAkB,IAAI,QAAQ,CAAC;AAAA,UACrD;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,iCAAiC;AAAA,QACrC,eAAe,MAAM,EAAE,EAAE,CAAC,EAAG,SAAS;AAAA,MACxC;AAEA,cAAQ,IAAI,YAAY,CAAC,GAAG,eAAe,GAAG,cAAc,CAAC;AAE7D,YAAM,SAA+B;AAAA,QACnC,2BAA2B;AAAA,MAC7B;AAEA,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,EACF;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/eventStore/inMemoryEventStore.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport type { Event } from '../typing';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\n\nexport type EventMetadata = Readonly<{\n eventId: string;\n streamPosition: number;\n logPosition: bigint;\n}>;\n\nexport type EventEnvelope<E extends Event = Event> = {\n event: E;\n metadata: EventMetadata;\n};\n\nexport type EventHandler<E extends Event = Event> = (\n eventEnvelope: EventEnvelope<E>,\n) => void;\n\nexport const getInMemoryEventStore = (): EventStore => {\n const streams = new Map<string, EventEnvelope[]>();\n\n const getAllEventsCount = () => {\n return Array.from<EventEnvelope[]>(streams.values())\n .map((s) => s.length)\n .reduce((p, c) => p + c, 0);\n };\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType>,\n ): Promise<AggregateStreamResult<State> | null> {\n const { evolve, getInitialState, read } = options;\n\n const result = await this.readStream<EventType>(streamName, read);\n\n if (!result) return null;\n\n const events = result?.events ?? [];\n\n return {\n currentStreamVersion: BigInt(events.length),\n state: events.reduce(evolve, getInitialState()),\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<ReadStreamResult<EventType>> => {\n const events = streams.get(streamName);\n const currentStreamVersion = events ? BigInt(events.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const from = Number(options && 'from' in options ? options.from : 0);\n const to = Number(\n options && 'to' in options\n ? options.to\n : options && 'maxCount' in options && options.maxCount\n ? options.from + options.maxCount\n : events?.length ?? 1,\n );\n\n const resultEvents =\n events && events.length > 0\n ? events.map((e) => e.event as EventType).slice(from, to)\n : [];\n\n const result: ReadStreamResult<EventType> =\n events && events.length > 0\n ? {\n currentStreamVersion: currentStreamVersion!,\n events: resultEvents,\n }\n : null;\n\n return Promise.resolve(result);\n },\n\n appendToStream: <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions,\n ): Promise<AppendToStreamResult> => {\n const currentEvents = streams.get(streamName) ?? [];\n const currentStreamVersion =\n currentEvents.length > 0 ? BigInt(currentEvents.length) : undefined;\n\n assertExpectedVersionMatchesCurrent(\n currentStreamVersion,\n options?.expectedStreamVersion,\n );\n\n const eventEnvelopes: EventEnvelope[] = events.map((event, index) => {\n return {\n event,\n metadata: {\n eventId: randomUUID(),\n streamPosition: currentEvents.length + index + 1,\n logPosition: BigInt(getAllEventsCount() + index + 1),\n },\n };\n });\n\n const positionOfLastEventInTheStream = BigInt(\n eventEnvelopes.slice(-1)[0]!.metadata.streamPosition,\n );\n\n streams.set(streamName, [...currentEvents, ...eventEnvelopes]);\n\n const result: AppendToStreamResult = {\n nextExpectedStreamVersion: positionOfLastEventInTheStream,\n };\n\n return Promise.resolve(result);\n },\n };\n};\n"],"mappings":"AAAA,SAAS,kBAAkB;AAE3B;AAAA,OAQO;AACP,SAAS,2CAA2C;AAiB7C,MAAM,wBAAwB,MAAkB;AACrD,QAAM,UAAU,oBAAI,IAA6B;AAEjD,QAAM,oBAAoB,MAAM;AAC9B,WAAO,MAAM,KAAsB,QAAQ,OAAO,CAAC,EAChD,IAAI,CAAC,MAAM,EAAE,MAAM,EACnB,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,CAAC;AAAA,EAC9B;AAEA,SAAO;AAAA,IACL,MAAM,gBACJ,YACA,SAC8C;AAC9C,YAAM,EAAE,QAAQ,iBAAiB,KAAK,IAAI;AAE1C,YAAM,SAAS,MAAM,KAAK,WAAsB,YAAY,IAAI;AAEhE,UAAI,CAAC;AAAQ,eAAO;AAEpB,YAAM,SAAS,QAAQ,UAAU,CAAC;AAElC,aAAO;AAAA,QACL,sBAAsB,OAAO,OAAO,MAAM;AAAA,QAC1C,OAAO,OAAO,OAAO,QAAQ,gBAAgB,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,IAEA,YAAY,CACV,YACA,YACyC;AACzC,YAAM,SAAS,QAAQ,IAAI,UAAU;AACrC,YAAM,uBAAuB,SAAS,OAAO,OAAO,MAAM,IAAI;AAE9D;AAAA,QACE;AAAA,QACA,SAAS;AAAA,MACX;AAEA,YAAM,OAAO,OAAO,WAAW,UAAU,UAAU,QAAQ,OAAO,CAAC;AACnE,YAAM,KAAK;AAAA,QACT,WAAW,QAAQ,UACf,QAAQ,KACR,WAAW,cAAc,WAAW,QAAQ,WAC1C,QAAQ,OAAO,QAAQ,WACvB,QAAQ,UAAU;AAAA,MAC1B;AAEA,YAAM,eACJ,UAAU,OAAO,SAAS,IACtB,OAAO,IAAI,CAAC,MAAM,EAAE,KAAkB,EAAE,MAAM,MAAM,EAAE,IACtD,CAAC;AAEP,YAAM,SACJ,UAAU,OAAO,SAAS,IACtB;AAAA,QACE;AAAA,QACA,QAAQ;AAAA,MACV,IACA;AAEN,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,IAEA,gBAAgB,CACd,YACA,QACA,YACkC;AAClC,YAAM,gBAAgB,QAAQ,IAAI,UAAU,KAAK,CAAC;AAClD,YAAM,uBACJ,cAAc,SAAS,IAAI,OAAO,cAAc,MAAM,IAAI;AAE5D;AAAA,QACE;AAAA,QACA,SAAS;AAAA,MACX;AAEA,YAAM,iBAAkC,OAAO,IAAI,CAAC,OAAO,UAAU;AACnE,eAAO;AAAA,UACL;AAAA,UACA,UAAU;AAAA,YACR,SAAS,WAAW;AAAA,YACpB,gBAAgB,cAAc,SAAS,QAAQ;AAAA,YAC/C,aAAa,OAAO,kBAAkB,IAAI,QAAQ,CAAC;AAAA,UACrD;AAAA,QACF;AAAA,MACF,CAAC;AAED,YAAM,iCAAiC;AAAA,QACrC,eAAe,MAAM,EAAE,EAAE,CAAC,EAAG,SAAS;AAAA,MACxC;AAEA,cAAQ,IAAI,YAAY,CAAC,GAAG,eAAe,GAAG,cAAc,CAAC;AAE7D,YAAM,SAA+B;AAAA,QACnC,2BAA2B;AAAA,MAC7B;AAEA,aAAO,QAAQ,QAAQ,MAAM;AAAA,IAC/B;AAAA,EACF;AACF;","names":[]}
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- export { CommandHandler } from './commandHandling/handleCommand.mjs';
1
+ export { CommandHandler, CommandHandlerResult } from './commandHandling/handleCommand.mjs';
2
2
  export { DeciderCommandHandler } from './commandHandling/handleCommandWithDecider.mjs';
3
3
  export { ConcurrencyError, EmmettError, IllegalStateError, NotFoundError, ValidationError } from './errors/index.mjs';
4
4
  export { A as AggregateStreamOptions, b as AggregateStreamResult, c as AppendToStreamOptions, d as AppendToStreamResult, D as DefaultStreamVersionType, E as EventStore, e as ExpectedStreamVersion, g as ExpectedStreamVersionGeneral, f as ExpectedStreamVersionWithValue, j as ExpectedVersionConflictError, N as NO_CONCURRENCY_CHECK, R as ReadStreamOptions, a as ReadStreamResult, h as STREAM_DOES_NOT_EXIST, S as STREAM_EXISTS, i as assertExpectedVersionMatchesCurrent, m as matchesExpectedVersion } from './eventStore-DLezSgsV.mjs';
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { CommandHandler } from './commandHandling/handleCommand.js';
1
+ export { CommandHandler, CommandHandlerResult } from './commandHandling/handleCommand.js';
2
2
  export { DeciderCommandHandler } from './commandHandling/handleCommandWithDecider.js';
3
3
  export { ConcurrencyError, EmmettError, IllegalStateError, NotFoundError, ValidationError } from './errors/index.js';
4
4
  export { A as AggregateStreamOptions, b as AggregateStreamResult, c as AppendToStreamOptions, d as AppendToStreamResult, D as DefaultStreamVersionType, E as EventStore, e as ExpectedStreamVersion, g as ExpectedStreamVersionGeneral, f as ExpectedStreamVersionWithValue, j as ExpectedVersionConflictError, N as NO_CONCURRENCY_CHECK, R as ReadStreamOptions, a as ReadStreamResult, h as STREAM_DOES_NOT_EXIST, S as STREAM_EXISTS, i as assertExpectedVersionMatchesCurrent, m as matchesExpectedVersion } from './eventStore-N_YMFCDT.js';
@@ -58,22 +58,22 @@ type WorkflowOutput<TOutput extends Command | Event> = {
58
58
  kind: 'Error';
59
59
  reason: string;
60
60
  };
61
- declare const reply: <TOutput extends Command | Event>(message: TOutput) => WorkflowOutput<TOutput>;
62
- declare const send: <TOutput extends Command | Event>(message: Extract<TOutput, {
61
+ declare const reply: <TOutput extends Event | Command>(message: TOutput) => WorkflowOutput<TOutput>;
62
+ declare const send: <TOutput extends Event | Command>(message: Extract<TOutput, {
63
63
  __brand?: "Command" | undefined;
64
64
  }>) => WorkflowOutput<TOutput>;
65
- declare const publish: <TOutput extends Command | Event>(message: Extract<TOutput, {
65
+ declare const publish: <TOutput extends Event | Command>(message: Extract<TOutput, {
66
66
  __brand?: "Event" | undefined;
67
67
  }>) => WorkflowOutput<TOutput>;
68
- declare const schedule: <TOutput extends Command | Event>(message: TOutput, when: {
68
+ declare const schedule: <TOutput extends Event | Command>(message: TOutput, when: {
69
69
  afterInMs: number;
70
70
  } | {
71
71
  at: Date;
72
72
  }) => WorkflowOutput<TOutput>;
73
- declare const complete: <TOutput extends Command | Event>() => WorkflowOutput<TOutput>;
74
- declare const ignore: <TOutput extends Command | Event>(reason: string) => WorkflowOutput<TOutput>;
75
- declare const error: <TOutput extends Command | Event>(reason: string) => WorkflowOutput<TOutput>;
76
- declare const accept: <TOutput extends Command | Event>() => WorkflowOutput<TOutput>;
73
+ declare const complete: <TOutput extends Event | Command>() => WorkflowOutput<TOutput>;
74
+ declare const ignore: <TOutput extends Event | Command>(reason: string) => WorkflowOutput<TOutput>;
75
+ declare const error: <TOutput extends Event | Command>(reason: string) => WorkflowOutput<TOutput>;
76
+ declare const accept: <TOutput extends Event | Command>() => WorkflowOutput<TOutput>;
77
77
 
78
78
  type Brand<K, T> = K & {
79
79
  readonly __brand: T;
@@ -58,22 +58,22 @@ type WorkflowOutput<TOutput extends Command | Event> = {
58
58
  kind: 'Error';
59
59
  reason: string;
60
60
  };
61
- declare const reply: <TOutput extends Command | Event>(message: TOutput) => WorkflowOutput<TOutput>;
62
- declare const send: <TOutput extends Command | Event>(message: Extract<TOutput, {
61
+ declare const reply: <TOutput extends Event | Command>(message: TOutput) => WorkflowOutput<TOutput>;
62
+ declare const send: <TOutput extends Event | Command>(message: Extract<TOutput, {
63
63
  __brand?: "Command" | undefined;
64
64
  }>) => WorkflowOutput<TOutput>;
65
- declare const publish: <TOutput extends Command | Event>(message: Extract<TOutput, {
65
+ declare const publish: <TOutput extends Event | Command>(message: Extract<TOutput, {
66
66
  __brand?: "Event" | undefined;
67
67
  }>) => WorkflowOutput<TOutput>;
68
- declare const schedule: <TOutput extends Command | Event>(message: TOutput, when: {
68
+ declare const schedule: <TOutput extends Event | Command>(message: TOutput, when: {
69
69
  afterInMs: number;
70
70
  } | {
71
71
  at: Date;
72
72
  }) => WorkflowOutput<TOutput>;
73
- declare const complete: <TOutput extends Command | Event>() => WorkflowOutput<TOutput>;
74
- declare const ignore: <TOutput extends Command | Event>(reason: string) => WorkflowOutput<TOutput>;
75
- declare const error: <TOutput extends Command | Event>(reason: string) => WorkflowOutput<TOutput>;
76
- declare const accept: <TOutput extends Command | Event>() => WorkflowOutput<TOutput>;
73
+ declare const complete: <TOutput extends Event | Command>() => WorkflowOutput<TOutput>;
74
+ declare const ignore: <TOutput extends Event | Command>(reason: string) => WorkflowOutput<TOutput>;
75
+ declare const error: <TOutput extends Event | Command>(reason: string) => WorkflowOutput<TOutput>;
76
+ declare const accept: <TOutput extends Event | Command>() => WorkflowOutput<TOutput>;
77
77
 
78
78
  type Brand<K, T> = K & {
79
79
  readonly __brand: T;
package/package.json CHANGED
@@ -1,17 +1,11 @@
1
1
  {
2
2
  "name": "@event-driven-io/emmett",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "Emmett - Event Sourcing development made simple",
5
5
  "scripts": {
6
6
  "build": "tsup",
7
7
  "build:ts": "tsc",
8
8
  "build:ts:watch": "tsc --watch",
9
- "lint": "npm run lint:eslint && npm run lint:prettier",
10
- "lint:prettier": "prettier --check \"**/**/!(*.d).{ts,json,md}\"",
11
- "lint:eslint": "eslint **/*.ts",
12
- "fix": "run-s fix:eslint fix:prettier",
13
- "fix:prettier": "prettier --write \"**/**/!(*.d).{ts,json,md}\"",
14
- "fix:eslint": "eslint **/*.ts --fix",
15
9
  "test": "run-s test:unit test:int test:e2e",
16
10
  "test:unit": "glob -c \"node --import tsx --test\" **/*.unit.spec.ts",
17
11
  "test:int": "glob -c \"node --import tsx --test\" **/*.int.spec.ts",
@@ -39,8 +33,5 @@
39
33
  "files": [
40
34
  "dist"
41
35
  ],
42
- "dependencies": {
43
- "uuid": "9.0.1"
44
- },
45
36
  "devDependencies": {}
46
37
  }
@@ -1,2 +0,0 @@
1
-
2
- export { }
@@ -1,2 +0,0 @@
1
-
2
- export { }
@@ -1,62 +0,0 @@
1
- "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _strict = require('node:assert/strict'); var _strict2 = _interopRequireDefault(_strict);
2
- var _nodetest = require('node:test');
3
-
4
-
5
-
6
-
7
-
8
- var _expectedVersion = require('./expectedVersion');
9
- _nodetest.describe.call(void 0, "matchesExpectedVersion", () => {
10
- _nodetest.it.call(void 0, "When NO_CONCURRENCY_CHECK provided returns `true` for any current version", () => {
11
- const allCurrentVersions = [void 0, 0, -1, 1, 100, "random", ""];
12
- for (const currentStreamVersion of allCurrentVersions) {
13
- _strict2.default.ok(
14
- _expectedVersion.matchesExpectedVersion.call(void 0, currentStreamVersion, _expectedVersion.NO_CONCURRENCY_CHECK)
15
- );
16
- }
17
- });
18
- _nodetest.it.call(void 0, "When STREAM_DOES_NOT_EXIST provided returns `true` for current equals `undefined`", () => {
19
- _strict2.default.ok(_expectedVersion.matchesExpectedVersion.call(void 0, void 0, _expectedVersion.STREAM_DOES_NOT_EXIST));
20
- });
21
- _nodetest.it.call(void 0, "When STREAM_DOES_NOT_EXIST provided returns `false` for current different than `undefined`", () => {
22
- const definedStreamVersion = [0, -1, 1, 100, "random", ""];
23
- for (const currentStreamVersion of definedStreamVersion) {
24
- _strict2.default.equal(
25
- _expectedVersion.matchesExpectedVersion.call(void 0, currentStreamVersion, _expectedVersion.STREAM_DOES_NOT_EXIST),
26
- false
27
- );
28
- }
29
- });
30
- _nodetest.it.call(void 0, "When STREAM_EXISTS provided returns `true` for current different than `undefined`", () => {
31
- const definedStreamVersion = [0, -1, 1, 100, "random", ""];
32
- for (const currentStreamVersion of definedStreamVersion) {
33
- _strict2.default.ok(_expectedVersion.matchesExpectedVersion.call(void 0, currentStreamVersion, _expectedVersion.STREAM_EXISTS));
34
- }
35
- });
36
- _nodetest.it.call(void 0, "When STREAM_EXISTS provided returns `false` for current equals `undefined`", () => {
37
- _strict2.default.equal(_expectedVersion.matchesExpectedVersion.call(void 0, void 0, _expectedVersion.STREAM_EXISTS), false);
38
- });
39
- _nodetest.it.call(void 0, "When value provided returns `true` for current matching expected value", () => {
40
- const definedStreamVersion = [0, -1, 1, 100, "random", ""];
41
- for (const streamVersion of definedStreamVersion) {
42
- _strict2.default.ok(_expectedVersion.matchesExpectedVersion.call(void 0, streamVersion, streamVersion));
43
- }
44
- });
45
- _nodetest.it.call(void 0, "When value provided returns `false` for current notmatching expected value", () => {
46
- const definedStreamVersion = [
47
- { current: 100, expected: 0 },
48
- { current: 0, expected: -1 },
49
- { current: -1, expected: 1 },
50
- { current: 0, expected: 100 },
51
- { current: "", expected: "random" },
52
- { current: "random", expected: "" }
53
- ];
54
- for (const streamVersion of definedStreamVersion) {
55
- _strict2.default.equal(
56
- _expectedVersion.matchesExpectedVersion.call(void 0, streamVersion.current, streamVersion.expected),
57
- false
58
- );
59
- }
60
- });
61
- });
62
- //# sourceMappingURL=expectedVersion.unit.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/eventStore/expectedVersion.unit.spec.ts"],"names":[],"mappings":"AACA,OAAO,YAAY;AACnB,SAAS,UAAU,UAAU;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,0BAA0B,MAAM;AACvC,KAAG,6EAA6E,MAAM;AACpF,UAAM,qBAAqB,CAAC,QAAW,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE;AAElE,eAAW,wBAAwB,oBAAoB;AACrD,aAAO;AAAA,QACL,uBAAuB,sBAAsB,oBAAoB;AAAA,MACnE;AAAA,IACF;AAAA,EACF,CAAC;AAED,KAAG,qFAAqF,MAAM;AAC5F,WAAO,GAAG,uBAAuB,QAAW,qBAAqB,CAAC;AAAA,EACpE,CAAC;AAED,KAAG,8FAA8F,MAAM;AACrG,UAAM,uBAAuB,CAAC,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE;AAEzD,eAAW,wBAAwB,sBAAsB;AACvD,aAAO;AAAA,QACL,uBAAuB,sBAAsB,qBAAqB;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,KAAG,qFAAqF,MAAM;AAC5F,UAAM,uBAAuB,CAAC,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE;AAEzD,eAAW,wBAAwB,sBAAsB;AACvD,aAAO,GAAG,uBAAuB,sBAAsB,aAAa,CAAC;AAAA,IACvE;AAAA,EACF,CAAC;AAED,KAAG,8EAA8E,MAAM;AACrF,WAAO,MAAM,uBAAuB,QAAW,aAAa,GAAG,KAAK;AAAA,EACtE,CAAC;AAED,KAAG,0EAA0E,MAAM;AACjF,UAAM,uBAAuB,CAAC,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE;AAEzD,eAAW,iBAAiB,sBAAsB;AAChD,aAAO,GAAG,uBAAuB,eAAe,aAAa,CAAC;AAAA,IAChE;AAAA,EACF,CAAC;AAED,KAAG,8EAA8E,MAAM;AACrF,UAAM,uBAAuB;AAAA,MAC3B,EAAE,SAAS,KAAK,UAAU,EAAE;AAAA,MAC5B,EAAE,SAAS,GAAG,UAAU,GAAG;AAAA,MAC3B,EAAE,SAAS,IAAI,UAAU,EAAE;AAAA,MAC3B,EAAE,SAAS,GAAG,UAAU,IAAI;AAAA,MAC5B,EAAE,SAAS,IAAI,UAAU,SAAS;AAAA,MAClC,EAAE,SAAS,UAAU,UAAU,GAAG;AAAA,IACpC;AAEA,eAAW,iBAAiB,sBAAsB;AAChD,aAAO;AAAA,QACL,uBAAuB,cAAc,SAAS,cAAc,QAAQ;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\nimport assert from 'node:assert/strict';\nimport { describe, it } from 'node:test';\nimport {\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n STREAM_EXISTS,\n matchesExpectedVersion,\n} from './expectedVersion';\n\ndescribe('matchesExpectedVersion', () => {\n it('When NO_CONCURRENCY_CHECK provided returns `true` for any current version', () => {\n const allCurrentVersions = [undefined, 0, -1, 1, 100, 'random', ''];\n\n for (const currentStreamVersion of allCurrentVersions) {\n assert.ok(\n matchesExpectedVersion(currentStreamVersion, NO_CONCURRENCY_CHECK),\n );\n }\n });\n\n it('When STREAM_DOES_NOT_EXIST provided returns `true` for current equals `undefined`', () => {\n assert.ok(matchesExpectedVersion(undefined, STREAM_DOES_NOT_EXIST));\n });\n\n it('When STREAM_DOES_NOT_EXIST provided returns `false` for current different than `undefined`', () => {\n const definedStreamVersion = [0, -1, 1, 100, 'random', ''];\n\n for (const currentStreamVersion of definedStreamVersion) {\n assert.equal(\n matchesExpectedVersion(currentStreamVersion, STREAM_DOES_NOT_EXIST),\n false,\n );\n }\n });\n\n it('When STREAM_EXISTS provided returns `true` for current different than `undefined`', () => {\n const definedStreamVersion = [0, -1, 1, 100, 'random', ''];\n\n for (const currentStreamVersion of definedStreamVersion) {\n assert.ok(matchesExpectedVersion(currentStreamVersion, STREAM_EXISTS));\n }\n });\n\n it('When STREAM_EXISTS provided returns `false` for current equals `undefined`', () => {\n assert.equal(matchesExpectedVersion(undefined, STREAM_EXISTS), false);\n });\n\n it('When value provided returns `true` for current matching expected value', () => {\n const definedStreamVersion = [0, -1, 1, 100, 'random', ''];\n\n for (const streamVersion of definedStreamVersion) {\n assert.ok(matchesExpectedVersion(streamVersion, streamVersion));\n }\n });\n\n it('When value provided returns `false` for current notmatching expected value', () => {\n const definedStreamVersion = [\n { current: 100, expected: 0 },\n { current: 0, expected: -1 },\n { current: -1, expected: 1 },\n { current: 0, expected: 100 },\n { current: '', expected: 'random' },\n { current: 'random', expected: '' },\n ];\n\n for (const streamVersion of definedStreamVersion) {\n assert.equal(\n matchesExpectedVersion(streamVersion.current, streamVersion.expected),\n false,\n );\n }\n });\n});\n"]}
@@ -1,62 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import { describe, it } from "node:test";
3
- import {
4
- NO_CONCURRENCY_CHECK,
5
- STREAM_DOES_NOT_EXIST,
6
- STREAM_EXISTS,
7
- matchesExpectedVersion
8
- } from "./expectedVersion";
9
- describe("matchesExpectedVersion", () => {
10
- it("When NO_CONCURRENCY_CHECK provided returns `true` for any current version", () => {
11
- const allCurrentVersions = [void 0, 0, -1, 1, 100, "random", ""];
12
- for (const currentStreamVersion of allCurrentVersions) {
13
- assert.ok(
14
- matchesExpectedVersion(currentStreamVersion, NO_CONCURRENCY_CHECK)
15
- );
16
- }
17
- });
18
- it("When STREAM_DOES_NOT_EXIST provided returns `true` for current equals `undefined`", () => {
19
- assert.ok(matchesExpectedVersion(void 0, STREAM_DOES_NOT_EXIST));
20
- });
21
- it("When STREAM_DOES_NOT_EXIST provided returns `false` for current different than `undefined`", () => {
22
- const definedStreamVersion = [0, -1, 1, 100, "random", ""];
23
- for (const currentStreamVersion of definedStreamVersion) {
24
- assert.equal(
25
- matchesExpectedVersion(currentStreamVersion, STREAM_DOES_NOT_EXIST),
26
- false
27
- );
28
- }
29
- });
30
- it("When STREAM_EXISTS provided returns `true` for current different than `undefined`", () => {
31
- const definedStreamVersion = [0, -1, 1, 100, "random", ""];
32
- for (const currentStreamVersion of definedStreamVersion) {
33
- assert.ok(matchesExpectedVersion(currentStreamVersion, STREAM_EXISTS));
34
- }
35
- });
36
- it("When STREAM_EXISTS provided returns `false` for current equals `undefined`", () => {
37
- assert.equal(matchesExpectedVersion(void 0, STREAM_EXISTS), false);
38
- });
39
- it("When value provided returns `true` for current matching expected value", () => {
40
- const definedStreamVersion = [0, -1, 1, 100, "random", ""];
41
- for (const streamVersion of definedStreamVersion) {
42
- assert.ok(matchesExpectedVersion(streamVersion, streamVersion));
43
- }
44
- });
45
- it("When value provided returns `false` for current notmatching expected value", () => {
46
- const definedStreamVersion = [
47
- { current: 100, expected: 0 },
48
- { current: 0, expected: -1 },
49
- { current: -1, expected: 1 },
50
- { current: 0, expected: 100 },
51
- { current: "", expected: "random" },
52
- { current: "random", expected: "" }
53
- ];
54
- for (const streamVersion of definedStreamVersion) {
55
- assert.equal(
56
- matchesExpectedVersion(streamVersion.current, streamVersion.expected),
57
- false
58
- );
59
- }
60
- });
61
- });
62
- //# sourceMappingURL=expectedVersion.unit.spec.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/eventStore/expectedVersion.unit.spec.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\nimport assert from 'node:assert/strict';\nimport { describe, it } from 'node:test';\nimport {\n NO_CONCURRENCY_CHECK,\n STREAM_DOES_NOT_EXIST,\n STREAM_EXISTS,\n matchesExpectedVersion,\n} from './expectedVersion';\n\ndescribe('matchesExpectedVersion', () => {\n it('When NO_CONCURRENCY_CHECK provided returns `true` for any current version', () => {\n const allCurrentVersions = [undefined, 0, -1, 1, 100, 'random', ''];\n\n for (const currentStreamVersion of allCurrentVersions) {\n assert.ok(\n matchesExpectedVersion(currentStreamVersion, NO_CONCURRENCY_CHECK),\n );\n }\n });\n\n it('When STREAM_DOES_NOT_EXIST provided returns `true` for current equals `undefined`', () => {\n assert.ok(matchesExpectedVersion(undefined, STREAM_DOES_NOT_EXIST));\n });\n\n it('When STREAM_DOES_NOT_EXIST provided returns `false` for current different than `undefined`', () => {\n const definedStreamVersion = [0, -1, 1, 100, 'random', ''];\n\n for (const currentStreamVersion of definedStreamVersion) {\n assert.equal(\n matchesExpectedVersion(currentStreamVersion, STREAM_DOES_NOT_EXIST),\n false,\n );\n }\n });\n\n it('When STREAM_EXISTS provided returns `true` for current different than `undefined`', () => {\n const definedStreamVersion = [0, -1, 1, 100, 'random', ''];\n\n for (const currentStreamVersion of definedStreamVersion) {\n assert.ok(matchesExpectedVersion(currentStreamVersion, STREAM_EXISTS));\n }\n });\n\n it('When STREAM_EXISTS provided returns `false` for current equals `undefined`', () => {\n assert.equal(matchesExpectedVersion(undefined, STREAM_EXISTS), false);\n });\n\n it('When value provided returns `true` for current matching expected value', () => {\n const definedStreamVersion = [0, -1, 1, 100, 'random', ''];\n\n for (const streamVersion of definedStreamVersion) {\n assert.ok(matchesExpectedVersion(streamVersion, streamVersion));\n }\n });\n\n it('When value provided returns `false` for current notmatching expected value', () => {\n const definedStreamVersion = [\n { current: 100, expected: 0 },\n { current: 0, expected: -1 },\n { current: -1, expected: 1 },\n { current: 0, expected: 100 },\n { current: '', expected: 'random' },\n { current: 'random', expected: '' },\n ];\n\n for (const streamVersion of definedStreamVersion) {\n assert.equal(\n matchesExpectedVersion(streamVersion.current, streamVersion.expected),\n false,\n );\n }\n });\n});\n"],"mappings":"AACA,OAAO,YAAY;AACnB,SAAS,UAAU,UAAU;AAC7B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,0BAA0B,MAAM;AACvC,KAAG,6EAA6E,MAAM;AACpF,UAAM,qBAAqB,CAAC,QAAW,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE;AAElE,eAAW,wBAAwB,oBAAoB;AACrD,aAAO;AAAA,QACL,uBAAuB,sBAAsB,oBAAoB;AAAA,MACnE;AAAA,IACF;AAAA,EACF,CAAC;AAED,KAAG,qFAAqF,MAAM;AAC5F,WAAO,GAAG,uBAAuB,QAAW,qBAAqB,CAAC;AAAA,EACpE,CAAC;AAED,KAAG,8FAA8F,MAAM;AACrG,UAAM,uBAAuB,CAAC,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE;AAEzD,eAAW,wBAAwB,sBAAsB;AACvD,aAAO;AAAA,QACL,uBAAuB,sBAAsB,qBAAqB;AAAA,QAClE;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AAED,KAAG,qFAAqF,MAAM;AAC5F,UAAM,uBAAuB,CAAC,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE;AAEzD,eAAW,wBAAwB,sBAAsB;AACvD,aAAO,GAAG,uBAAuB,sBAAsB,aAAa,CAAC;AAAA,IACvE;AAAA,EACF,CAAC;AAED,KAAG,8EAA8E,MAAM;AACrF,WAAO,MAAM,uBAAuB,QAAW,aAAa,GAAG,KAAK;AAAA,EACtE,CAAC;AAED,KAAG,0EAA0E,MAAM;AACjF,UAAM,uBAAuB,CAAC,GAAG,IAAI,GAAG,KAAK,UAAU,EAAE;AAEzD,eAAW,iBAAiB,sBAAsB;AAChD,aAAO,GAAG,uBAAuB,eAAe,aAAa,CAAC;AAAA,IAChE;AAAA,EACF,CAAC;AAED,KAAG,8EAA8E,MAAM;AACrF,UAAM,uBAAuB;AAAA,MAC3B,EAAE,SAAS,KAAK,UAAU,EAAE;AAAA,MAC5B,EAAE,SAAS,GAAG,UAAU,GAAG;AAAA,MAC3B,EAAE,SAAS,IAAI,UAAU,EAAE;AAAA,MAC3B,EAAE,SAAS,GAAG,UAAU,IAAI;AAAA,MAC5B,EAAE,SAAS,IAAI,UAAU,SAAS;AAAA,MAClC,EAAE,SAAS,UAAU,UAAU,GAAG;AAAA,IACpC;AAEA,eAAW,iBAAiB,sBAAsB;AAChD,aAAO;AAAA,QACL,uBAAuB,cAAc,SAAS,cAAc,QAAQ;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;","names":[]}
@@ -1,2 +0,0 @@
1
-
2
- export { }
@@ -1,2 +0,0 @@
1
-
2
- export { }
@@ -1,13 +0,0 @@
1
- "use strict"; function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _strict = require('node:assert/strict'); var _strict2 = _interopRequireDefault(_strict);
2
- var _nodetest = require('node:test'); var _nodetest2 = _interopRequireDefault(_nodetest);
3
- var _index = require('./index');
4
- _nodetest.describe.call(void 0, "Validation", () => {
5
- _nodetest.describe.call(void 0, "assertNotEmptyString", () => {
6
- _nodetest2.default.call(void 0, "should throw an error if the value is an empty string", () => {
7
- const value = "";
8
- const invalidAction = () => _index.assertNotEmptyString.call(void 0, value);
9
- _strict2.default.throws(invalidAction);
10
- });
11
- });
12
- });
13
- //# sourceMappingURL=validation.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/validation/validation.spec.ts"],"names":[],"mappings":"AACA,OAAO,YAAY;AACnB,OAAO,QAAQ,gBAAgB;AAC/B,SAAS,4BAA4B;AAErC,SAAS,cAAc,MAAM;AAC3B,WAAS,wBAAwB,MAAM;AACrC,SAAK,yDAAyD,MAAM;AAElE,YAAM,QAAQ;AAGd,YAAM,gBAAgB,MAAM,qBAAqB,KAAK;AAGtD,aAAO,OAAO,aAAa;AAAA,IAC7B,CAAC;AAAA,EACH,CAAC;AACH,CAAC","sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\nimport assert from 'node:assert/strict';\nimport test, { describe } from 'node:test';\nimport { assertNotEmptyString } from './index';\n\ndescribe('Validation', () => {\n describe('assertNotEmptyString', () => {\n test('should throw an error if the value is an empty string', () => {\n // Arrange\n const value = '';\n\n // Act\n const invalidAction = () => assertNotEmptyString(value);\n\n // Assert\n assert.throws(invalidAction);\n });\n });\n});\n"]}
@@ -1,13 +0,0 @@
1
- import assert from "node:assert/strict";
2
- import test, { describe } from "node:test";
3
- import { assertNotEmptyString } from "./index";
4
- describe("Validation", () => {
5
- describe("assertNotEmptyString", () => {
6
- test("should throw an error if the value is an empty string", () => {
7
- const value = "";
8
- const invalidAction = () => assertNotEmptyString(value);
9
- assert.throws(invalidAction);
10
- });
11
- });
12
- });
13
- //# sourceMappingURL=validation.spec.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/validation/validation.spec.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\nimport assert from 'node:assert/strict';\nimport test, { describe } from 'node:test';\nimport { assertNotEmptyString } from './index';\n\ndescribe('Validation', () => {\n describe('assertNotEmptyString', () => {\n test('should throw an error if the value is an empty string', () => {\n // Arrange\n const value = '';\n\n // Act\n const invalidAction = () => assertNotEmptyString(value);\n\n // Assert\n assert.throws(invalidAction);\n });\n });\n});\n"],"mappings":"AACA,OAAO,YAAY;AACnB,OAAO,QAAQ,gBAAgB;AAC/B,SAAS,4BAA4B;AAErC,SAAS,cAAc,MAAM;AAC3B,WAAS,wBAAwB,MAAM;AACrC,SAAK,yDAAyD,MAAM;AAElE,YAAM,QAAQ;AAGd,YAAM,gBAAgB,MAAM,qBAAqB,KAAK;AAGtD,aAAO,OAAO,aAAa;AAAA,IAC7B,CAAC;AAAA,EACH,CAAC;AACH,CAAC;","names":[]}