@event-driven-io/emmett 0.5.2 → 0.5.4

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 (179) hide show
  1. package/dist/chunk-2452BJTJ.js +1 -0
  2. package/dist/chunk-2452BJTJ.js.map +1 -0
  3. package/dist/chunk-32IWULJJ.mjs +2 -0
  4. package/dist/chunk-32IWULJJ.mjs.map +1 -0
  5. package/dist/chunk-3JE5DUJ2.js +2 -0
  6. package/dist/chunk-3JE5DUJ2.js.map +1 -0
  7. package/dist/chunk-3LYVXI5R.mjs +1 -0
  8. package/dist/chunk-3LYVXI5R.mjs.map +1 -0
  9. package/dist/chunk-45ODDXOQ.mjs +1 -0
  10. package/dist/chunk-45ODDXOQ.mjs.map +1 -0
  11. package/dist/chunk-46YIPCSN.js +2 -0
  12. package/dist/chunk-46YIPCSN.js.map +1 -0
  13. package/dist/chunk-7EZVPMJ6.js +2 -0
  14. package/dist/chunk-7EZVPMJ6.js.map +1 -0
  15. package/dist/chunk-7FJXUW3D.js +1 -0
  16. package/dist/chunk-7FJXUW3D.js.map +1 -0
  17. package/dist/chunk-7H3QW2YD.js +1 -0
  18. package/dist/chunk-7H3QW2YD.js.map +1 -0
  19. package/dist/chunk-7JLAVMM3.mjs +1 -0
  20. package/dist/chunk-7JLAVMM3.mjs.map +1 -0
  21. package/dist/chunk-AU2WZCER.js +1 -0
  22. package/dist/chunk-AU2WZCER.js.map +1 -0
  23. package/dist/chunk-BARLLX6S.js +1 -0
  24. package/dist/chunk-BARLLX6S.js.map +1 -0
  25. package/dist/chunk-BM2H4NCZ.js +2 -0
  26. package/dist/chunk-BM2H4NCZ.js.map +1 -0
  27. package/dist/chunk-C4CXU3PY.mjs +1 -0
  28. package/dist/chunk-C4CXU3PY.mjs.map +1 -0
  29. package/dist/chunk-CTCSK4FW.mjs +2 -0
  30. package/dist/chunk-CTCSK4FW.mjs.map +1 -0
  31. package/dist/chunk-D24KLTN5.mjs +1 -0
  32. package/dist/chunk-D24KLTN5.mjs.map +1 -0
  33. package/dist/chunk-DFPI5IXT.js +5 -0
  34. package/dist/chunk-DFPI5IXT.js.map +1 -0
  35. package/dist/chunk-DIW552TK.mjs +1 -0
  36. package/dist/chunk-DIW552TK.mjs.map +1 -0
  37. package/dist/chunk-ERDVHQZL.mjs +2 -0
  38. package/dist/chunk-ERDVHQZL.mjs.map +1 -0
  39. package/dist/chunk-F7QRI2VL.js +1 -0
  40. package/dist/chunk-F7QRI2VL.js.map +1 -0
  41. package/dist/chunk-FE73T2NS.js +2 -0
  42. package/dist/chunk-FE73T2NS.js.map +1 -0
  43. package/dist/chunk-HKEQAT6F.mjs +1 -0
  44. package/dist/chunk-HKEQAT6F.mjs.map +1 -0
  45. package/dist/chunk-IJGC6SHP.js +1 -0
  46. package/dist/chunk-IJGC6SHP.js.map +1 -0
  47. package/dist/chunk-IZWGWZ3P.mjs +1 -0
  48. package/dist/chunk-IZWGWZ3P.mjs.map +1 -0
  49. package/dist/chunk-JJHE2RKT.mjs +2 -0
  50. package/dist/chunk-JJHE2RKT.mjs.map +1 -0
  51. package/dist/chunk-LOJ6A4AJ.js +1 -0
  52. package/dist/chunk-LOJ6A4AJ.js.map +1 -0
  53. package/dist/chunk-LYKEARRW.js +2 -0
  54. package/dist/chunk-LYKEARRW.js.map +1 -0
  55. package/dist/chunk-O2ZUNWMO.mjs +2 -0
  56. package/dist/chunk-O2ZUNWMO.mjs.map +1 -0
  57. package/dist/chunk-O34VKX7R.js +2 -0
  58. package/dist/chunk-O34VKX7R.js.map +1 -0
  59. package/dist/chunk-OBA6MZMG.mjs +2 -0
  60. package/dist/chunk-OBA6MZMG.mjs.map +1 -0
  61. package/dist/chunk-OYAO7QEP.js +2 -0
  62. package/dist/chunk-OYAO7QEP.js.map +1 -0
  63. package/dist/chunk-PKL7KGJ3.mjs +2 -0
  64. package/dist/chunk-PKL7KGJ3.mjs.map +1 -0
  65. package/dist/chunk-PNOEBD4U.mjs +2 -0
  66. package/dist/chunk-PNOEBD4U.mjs.map +1 -0
  67. package/dist/chunk-QSAFGRYV.js +1 -0
  68. package/dist/chunk-QSAFGRYV.js.map +1 -0
  69. package/dist/chunk-RWKXC5FZ.mjs +5 -0
  70. package/dist/chunk-RWKXC5FZ.mjs.map +1 -0
  71. package/dist/chunk-U3WA3VIW.js +2 -0
  72. package/dist/chunk-U3WA3VIW.js.map +1 -0
  73. package/dist/chunk-UI6CV7VB.mjs +2 -0
  74. package/dist/chunk-UI6CV7VB.mjs.map +1 -0
  75. package/dist/chunk-UUCTMJK7.js +2 -0
  76. package/dist/chunk-UUCTMJK7.js.map +1 -0
  77. package/dist/chunk-WIMBG2PX.js +2 -0
  78. package/dist/chunk-WIMBG2PX.js.map +1 -0
  79. package/dist/chunk-XLZS42HB.mjs +1 -0
  80. package/dist/chunk-XLZS42HB.mjs.map +1 -0
  81. package/dist/chunk-YKFEDBH4.mjs +2 -0
  82. package/dist/chunk-YKFEDBH4.mjs.map +1 -0
  83. package/dist/chunk-YKICRTHH.mjs +1 -0
  84. package/dist/chunk-YKICRTHH.mjs.map +1 -0
  85. package/dist/chunk-YV6PB6LX.mjs +2 -0
  86. package/dist/chunk-YV6PB6LX.mjs.map +1 -0
  87. package/dist/chunk-Z7EDILIO.js +1 -0
  88. package/dist/chunk-Z7EDILIO.js.map +1 -0
  89. package/dist/commandHandling/handleCommand.js +1 -32
  90. package/dist/commandHandling/handleCommand.js.map +1 -1
  91. package/dist/commandHandling/handleCommand.mjs +1 -32
  92. package/dist/commandHandling/handleCommand.mjs.map +1 -1
  93. package/dist/commandHandling/handleCommandWithDecider.js +1 -13
  94. package/dist/commandHandling/handleCommandWithDecider.js.map +1 -1
  95. package/dist/commandHandling/handleCommandWithDecider.mjs +1 -13
  96. package/dist/commandHandling/handleCommandWithDecider.mjs.map +1 -1
  97. package/dist/commandHandling/index.js +1 -2
  98. package/dist/commandHandling/index.js.map +1 -1
  99. package/dist/commandHandling/index.mjs +1 -2
  100. package/dist/commandHandling/index.mjs.map +1 -1
  101. package/dist/errors/index.js +1 -56
  102. package/dist/errors/index.js.map +1 -1
  103. package/dist/errors/index.mjs +1 -56
  104. package/dist/errors/index.mjs.map +1 -1
  105. package/dist/eventStore/eventStore.js +2 -1
  106. package/dist/eventStore/eventStore.mjs +1 -0
  107. package/dist/eventStore/expectedVersion.js +1 -32
  108. package/dist/eventStore/expectedVersion.js.map +1 -1
  109. package/dist/eventStore/expectedVersion.mjs +1 -32
  110. package/dist/eventStore/expectedVersion.mjs.map +1 -1
  111. package/dist/eventStore/inMemoryEventStore.js +1 -70
  112. package/dist/eventStore/inMemoryEventStore.js.map +1 -1
  113. package/dist/eventStore/inMemoryEventStore.mjs +1 -70
  114. package/dist/eventStore/inMemoryEventStore.mjs.map +1 -1
  115. package/dist/eventStore/index.js +1 -3
  116. package/dist/eventStore/index.js.map +1 -1
  117. package/dist/eventStore/index.mjs +1 -3
  118. package/dist/eventStore/index.mjs.map +1 -1
  119. package/dist/index.js +1 -8
  120. package/dist/index.js.map +1 -1
  121. package/dist/index.mjs +1 -8
  122. package/dist/index.mjs.map +1 -1
  123. package/dist/serialization/index.js +1 -1
  124. package/dist/serialization/index.js.map +1 -1
  125. package/dist/serialization/index.mjs +1 -1
  126. package/dist/serialization/index.mjs.map +1 -1
  127. package/dist/serialization/json/JSONParser.js +1 -22
  128. package/dist/serialization/json/JSONParser.js.map +1 -1
  129. package/dist/serialization/json/JSONParser.mjs +1 -22
  130. package/dist/serialization/json/JSONParser.mjs.map +1 -1
  131. package/dist/serialization/json/index.js +1 -1
  132. package/dist/serialization/json/index.js.map +1 -1
  133. package/dist/serialization/json/index.mjs +1 -1
  134. package/dist/serialization/json/index.mjs.map +1 -1
  135. package/dist/testing/assertions.js +1 -26
  136. package/dist/testing/assertions.js.map +1 -1
  137. package/dist/testing/assertions.mjs +1 -26
  138. package/dist/testing/assertions.mjs.map +1 -1
  139. package/dist/testing/deciderSpecification.js +1 -41
  140. package/dist/testing/deciderSpecification.js.map +1 -1
  141. package/dist/testing/deciderSpecification.mjs +1 -41
  142. package/dist/testing/deciderSpecification.mjs.map +1 -1
  143. package/dist/testing/index.js +1 -2
  144. package/dist/testing/index.js.map +1 -1
  145. package/dist/testing/index.mjs +1 -2
  146. package/dist/testing/index.mjs.map +1 -1
  147. package/dist/typing/command.js +2 -1
  148. package/dist/typing/command.mjs +1 -0
  149. package/dist/typing/decider.js +2 -1
  150. package/dist/typing/decider.mjs +1 -0
  151. package/dist/typing/event.js +2 -1
  152. package/dist/typing/event.mjs +1 -0
  153. package/dist/typing/index.d.mts +8 -8
  154. package/dist/typing/index.d.ts +8 -8
  155. package/dist/typing/index.js +1 -4
  156. package/dist/typing/index.js.map +1 -1
  157. package/dist/typing/index.mjs +1 -4
  158. package/dist/typing/index.mjs.map +1 -1
  159. package/dist/typing/workflow.js +1 -55
  160. package/dist/typing/workflow.js.map +1 -1
  161. package/dist/typing/workflow.mjs +1 -55
  162. package/dist/typing/workflow.mjs.map +1 -1
  163. package/dist/utils/index.js +1 -6
  164. package/dist/utils/index.js.map +1 -1
  165. package/dist/utils/index.mjs +1 -6
  166. package/dist/utils/index.mjs.map +1 -1
  167. package/dist/utils/iterators.js +1 -11
  168. package/dist/utils/iterators.js.map +1 -1
  169. package/dist/utils/iterators.mjs +1 -11
  170. package/dist/utils/iterators.mjs.map +1 -1
  171. package/dist/utils/merge.js +1 -22
  172. package/dist/utils/merge.js.map +1 -1
  173. package/dist/utils/merge.mjs +1 -22
  174. package/dist/utils/merge.mjs.map +1 -1
  175. package/dist/validation/index.js +1 -36
  176. package/dist/validation/index.js.map +1 -1
  177. package/dist/validation/index.mjs +1 -36
  178. package/dist/validation/index.mjs.map +1 -1
  179. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-2452BJTJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ import o from"assert";var d={for:r=>n=>({when:i=>{let a=()=>{let t=(Array.isArray(n)?n:[n]).reduce(r.evolve,r.initialState());return r.decide(i,t)};return{then:e=>{let t=a(),s=Array.isArray(t)?t:[t],v=Array.isArray(e)?e:[e];o.deepEqual(s,v)},thenThrows:e=>{try{a(),o.fail("Handler did not fail as expected")}catch(t){e&&o.ok(e(t))}}}}})};export{d as a};
2
+ //# sourceMappingURL=chunk-32IWULJJ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testing/deciderSpecification.ts"],"sourcesContent":["import assert from 'assert';\n\nexport type DeciderSpecfication<Command, Event> = (\n givenEvents: Event | Event[],\n) => {\n when: (command: Command) => {\n then: (expectedEvents: Event | Event[]) => void;\n thenThrows: <Error>(assert: (error: Error) => boolean) => void;\n };\n};\n\nexport const DeciderSpecification = {\n for: <Command, Event, State>(decider: {\n decide: (command: Command, state: State) => Event | Event[];\n evolve: (state: State, event: Event) => State;\n initialState: () => State;\n }): DeciderSpecfication<Command, Event> => {\n {\n return (givenEvents: Event | Event[]) => {\n return {\n when: (command: Command) => {\n const handle = () => {\n const existingEvents = Array.isArray(givenEvents)\n ? givenEvents\n : [givenEvents];\n\n const currentState = existingEvents.reduce<State>(\n decider.evolve,\n decider.initialState(),\n );\n\n return decider.decide(command, currentState);\n };\n\n return {\n then: (expectedEvents: Event | Event[]): void => {\n const resultEvents = handle();\n\n const resultEventsArray = Array.isArray(resultEvents)\n ? resultEvents\n : [resultEvents];\n\n const expectedEventsArray = Array.isArray(expectedEvents)\n ? expectedEvents\n : [expectedEvents];\n\n assert.deepEqual(resultEventsArray, expectedEventsArray);\n },\n thenThrows: <Error>(check?: (error: Error) => boolean): void => {\n try {\n handle();\n assert.fail('Handler did not fail as expected');\n } catch (error) {\n if (check) assert.ok(check(error as Error));\n }\n },\n };\n },\n };\n };\n }\n },\n};\n"],"mappings":"AAAA,OAAOA,MAAY,SAWZ,IAAMC,EAAuB,CAClC,IAA6BC,GAMjBC,IACC,CACL,KAAOC,GAAqB,CAC1B,IAAMC,EAAS,IAAM,CAKnB,IAAMC,GAJiB,MAAM,QAAQH,CAAW,EAC5CA,EACA,CAACA,CAAW,GAEoB,OAClCD,EAAQ,OACRA,EAAQ,aAAa,CACvB,EAEA,OAAOA,EAAQ,OAAOE,EAASE,CAAY,CAC7C,EAEA,MAAO,CACL,KAAOC,GAA0C,CAC/C,IAAMC,EAAeH,EAAO,EAEtBI,EAAoB,MAAM,QAAQD,CAAY,EAChDA,EACA,CAACA,CAAY,EAEXE,EAAsB,MAAM,QAAQH,CAAc,EACpDA,EACA,CAACA,CAAc,EAEnBP,EAAO,UAAUS,EAAmBC,CAAmB,CACzD,EACA,WAAoBC,GAA4C,CAC9D,GAAI,CACFN,EAAO,EACPL,EAAO,KAAK,kCAAkC,CAChD,OAASY,EAAO,CACVD,GAAOX,EAAO,GAAGW,EAAMC,CAAc,CAAC,CAC5C,CACF,CACF,CACF,CACF,EAIR","names":["assert","DeciderSpecification","decider","givenEvents","command","handle","currentState","expectedEvents","resultEvents","resultEventsArray","expectedEventsArray","check","error"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var i=(r,t,u,o,d=()=>{})=>{let n=!1,f=r.map(e=>u(e)?(n=!0,o(e)):e).filter(e=>e!==void 0).map(e=>{if(!e)throw Error("That should not happen");return e});return!n&&d()!==void 0?[...r,t]:f};exports.a = i;
2
+ //# sourceMappingURL=chunk-3JE5DUJ2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/merge.ts"],"names":["merge","array","item","where","onExisting","onNotFound","wasFound","result","p"],"mappings":"AAAO,IAAMA,EAAQ,CACnBC,EACAC,EACAC,EACAC,EACAC,EAAkC,IAAG,KAClC,CACH,IAAIC,EAAW,GAETC,EAASN,EAEZ,IAAKO,GACCL,EAAMK,CAAC,GAEZF,EAAW,GACJF,EAAWI,CAAC,GAHGA,CAIvB,EAGA,OAAQA,GAAMA,IAAM,MAAS,EAE7B,IAAKA,GAAM,CACV,GAAI,CAACA,EAAG,MAAM,MAAM,wBAAwB,EAE5C,OAAOA,CACT,CAAC,EAIH,MAAI,CAACF,GACYD,EAAW,IAEX,OAAkB,CAAC,GAAGJ,EAAOC,CAAI,EAG3CK,CACT","sourcesContent":["export const merge = <T>(\n array: T[],\n item: T,\n where: (current: T) => boolean,\n onExisting: (current: T) => T,\n onNotFound: () => T | undefined = () => undefined,\n) => {\n let wasFound = false;\n\n const result = array\n // merge the existing item if matches condition\n .map((p: T) => {\n if (!where(p)) return p;\n\n wasFound = true;\n return onExisting(p);\n })\n // filter out item if undefined was returned\n // for cases of removal\n .filter((p) => p !== undefined)\n // make TypeScript happy\n .map((p) => {\n if (!p) throw Error('That should not happen');\n\n return p;\n });\n\n // if item was not found and onNotFound action is defined\n // try to generate new item\n if (!wasFound) {\n const result = onNotFound();\n\n if (result !== undefined) return [...array, item];\n }\n\n return result;\n};\n"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-3LYVXI5R.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-45ODDXOQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 _chunkUUCTMJK7js = require('./chunk-UUCTMJK7.js');var s="STREAM_EXISTS",a= exports.b ="STREAM_DOES_NOT_EXIST",n= exports.c ="NO_CONCURRENCY_CHECK",S= exports.d =(r,e)=>e===n?!0:e==a?r===void 0:e==s?r!==void 0:r===e,V= exports.e =(r,e)=>{if(e??=n,!S(r,e))throw new t(r,e)},t= exports.f =class r extends _chunkUUCTMJK7js.h{constructor(e,i){super(_optionalChain([e, 'optionalAccess', _ => _.toString, 'call', _2 => _2()]),_optionalChain([i, 'optionalAccess', _3 => _3.toString, 'call', _4 => _4()])),Object.setPrototypeOf(this,r.prototype)}};exports.a = s; exports.b = a; exports.c = n; exports.d = S; exports.e = V; exports.f = t;
2
+ //# sourceMappingURL=chunk-46YIPCSN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/eventStore/expectedVersion.ts"],"names":["STREAM_EXISTS","STREAM_DOES_NOT_EXIST","NO_CONCURRENCY_CHECK","matchesExpectedVersion","current","expected","assertExpectedVersionMatchesCurrent","ExpectedVersionConflictError","_ExpectedVersionConflictError","ConcurrencyError"],"mappings":"wCAiBO,IAAMA,EAAgB,gBAChBC,EACX,wBACWC,EACX,uBAEWC,EAAyB,CAGpCC,EACAC,IAEIA,IAAaH,EAA6B,GAE1CG,GAAYJ,EAA8BG,IAAY,OAEtDC,GAAYL,EAAsBI,IAAY,OAE3CA,IAAYC,EAGRC,EAAsC,CAGjDF,EACAC,IACS,CAGT,GAFAA,IAAaH,EAET,CAACC,EAAuBC,EAASC,CAAQ,EAC3C,MAAM,IAAIE,EAA6BH,EAASC,CAAQ,CAC5D,EAEaE,EAAN,MAAMC,UAEHC,CAAiB,CACzB,YACEL,EACAC,EACA,CACA,MAAMD,GAAS,SAAS,EAAGC,GAAU,SAAS,CAAC,EAG/C,OAAO,eAAe,KAAMG,EAA6B,SAAS,CACpE,CACF","sourcesContent":["import { ConcurrencyError } from '../errors';\nimport type { Flavour } from '../typing';\nimport type { DefaultStreamVersionType } from './eventStore';\n\nexport type ExpectedStreamVersion<VersionType = DefaultStreamVersionType> =\n | ExpectedStreamVersionWithValue<VersionType>\n | ExpectedStreamVersionGeneral;\n\nexport type ExpectedStreamVersionWithValue<\n VersionType = DefaultStreamVersionType,\n> = Flavour<VersionType, 'StreamVersion'>;\n\nexport type ExpectedStreamVersionGeneral = Flavour<\n 'STREAM_EXISTS' | 'STREAM_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK',\n 'StreamVersion'\n>;\n\nexport const STREAM_EXISTS = 'STREAM_EXISTS' as ExpectedStreamVersionGeneral;\nexport const STREAM_DOES_NOT_EXIST =\n 'STREAM_DOES_NOT_EXIST' as ExpectedStreamVersionGeneral;\nexport const NO_CONCURRENCY_CHECK =\n 'NO_CONCURRENCY_CHECK' as ExpectedStreamVersionGeneral;\n\nexport const matchesExpectedVersion = <\n StreamVersion = DefaultStreamVersionType,\n>(\n current: StreamVersion | undefined,\n expected: ExpectedStreamVersion<StreamVersion>,\n): boolean => {\n if (expected === NO_CONCURRENCY_CHECK) return true;\n\n if (expected == STREAM_DOES_NOT_EXIST) return current === undefined;\n\n if (expected == STREAM_EXISTS) return current !== undefined;\n\n return current === expected;\n};\n\nexport const assertExpectedVersionMatchesCurrent = <\n StreamVersion = DefaultStreamVersionType,\n>(\n current: StreamVersion | undefined,\n expected: ExpectedStreamVersion<StreamVersion> | undefined,\n): void => {\n expected ??= NO_CONCURRENCY_CHECK;\n\n if (!matchesExpectedVersion(current, expected))\n throw new ExpectedVersionConflictError(current, expected);\n};\n\nexport class ExpectedVersionConflictError<\n VersionType = DefaultStreamVersionType,\n> extends ConcurrencyError {\n constructor(\n current: VersionType | undefined,\n expected: ExpectedStreamVersion<VersionType>,\n ) {\n super(current?.toString(), expected?.toString());\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ExpectedVersionConflictError.prototype);\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var n=t=>({kind:"Reply",message:t}),u= exports.b =t=>({kind:"Send",message:t}),o= exports.c =t=>({kind:"Publish",message:t}),r= exports.d =(t,e)=>({kind:"Schedule",message:t,when:e}),p= exports.e =()=>({kind:"Complete"}),d= exports.f =t=>({kind:"Ignore",reason:t}),m= exports.g =t=>({kind:"Error",reason:t}),a= exports.h =()=>({kind:"Accept"});exports.a = n; exports.b = u; exports.c = o; exports.d = r; exports.e = p; exports.f = d; exports.g = m; exports.h = a;
2
+ //# sourceMappingURL=chunk-7EZVPMJ6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/typing/workflow.ts"],"names":["reply","message","send","publish","schedule","when","complete","ignore","reason","error","accept"],"mappings":"AAuCO,IAAMA,EACXC,IAEO,CACL,KAAM,QACN,QAAAA,CACF,GAGWC,EACXD,IAEO,CACL,KAAM,OACN,QAAAA,CACF,GAGWE,EACXF,IAEO,CACL,KAAM,UACN,QAAAA,CACF,GAGWG,EAAW,CACtBH,EACAI,KAEO,CACL,KAAM,WACN,QAAAJ,EACA,KAAAI,CACF,GAGWC,EAAW,KAGf,CACL,KAAM,UACR,GAGWC,EACXC,IAEO,CACL,KAAM,SACN,OAAAA,CACF,GAGWC,EACXD,IAEO,CACL,KAAM,QACN,OAAAA,CACF,GAGWE,EAAS,KAGb,CAAE,KAAM,QAAS","sourcesContent":["import type { Command } from './command';\nimport type { Event } from './event';\n\n/// Inspired by https://blog.bittacklr.be/the-workflow-pattern.html\n\nexport type Workflow<\n Input extends Event | Command,\n State,\n Output extends Event | Command,\n> = {\n decide: (command: Input, state: State) => WorkflowOutput<Output>[];\n evolve: (currentState: State, event: WorkflowEvent<Output>) => State;\n getInitialState: () => State;\n};\n\nexport type WorkflowEvent<Output extends Command | Event> = Extract<\n Output,\n { __brand?: 'Event' }\n>;\n\nexport type WorkflowCommand<Output extends Command | Event> = Extract<\n Output,\n { __brand?: 'Command' }\n>;\n\nexport type WorkflowOutput<TOutput extends Command | Event> =\n | { kind: 'Reply'; message: TOutput }\n | { kind: 'Send'; message: WorkflowCommand<TOutput> }\n | { kind: 'Publish'; message: WorkflowEvent<TOutput> }\n | {\n kind: 'Schedule';\n message: TOutput;\n when: { afterInMs: number } | { at: Date };\n }\n | { kind: 'Complete' }\n | { kind: 'Accept' }\n | { kind: 'Ignore'; reason: string }\n | { kind: 'Error'; reason: string };\n\nexport const reply = <TOutput extends Command | Event>(\n message: TOutput,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Reply',\n message,\n };\n};\n\nexport const send = <TOutput extends Command | Event>(\n message: WorkflowCommand<TOutput>,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Send',\n message,\n };\n};\n\nexport const publish = <TOutput extends Command | Event>(\n message: WorkflowEvent<TOutput>,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Publish',\n message,\n };\n};\n\nexport const schedule = <TOutput extends Command | Event>(\n message: TOutput,\n when: { afterInMs: number } | { at: Date },\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Schedule',\n message,\n when,\n };\n};\n\nexport const complete = <\n TOutput extends Command | Event,\n>(): WorkflowOutput<TOutput> => {\n return {\n kind: 'Complete',\n };\n};\n\nexport const ignore = <TOutput extends Command | Event>(\n reason: string,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Ignore',\n reason,\n };\n};\n\nexport const error = <TOutput extends Command | Event>(\n reason: string,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Error',\n reason,\n };\n};\n\nexport const accept = <\n TOutput extends Command | Event,\n>(): WorkflowOutput<TOutput> => {\n return { kind: 'Accept' };\n};\n"]}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-7FJXUW3D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-7H3QW2YD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-7JLAVMM3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-AU2WZCER.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-BARLLX6S.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
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 _chunk46YIPCSNjs = require('./chunk-46YIPCSN.js');var _crypto = require('crypto');var S=()=>{let m=new Map,E=()=>Array.from(m.values()).map(n=>n.length).reduce((n,e)=>n+e,0);return{async aggregateStream(n,e){let{evolve:t,getInitialState:r,read:o}=e,a=await this.readStream(n,o);if(!a)return null;let s=_nullishCoalesce(_optionalChain([a, 'optionalAccess', _ => _.events]), () => ([]));return{currentStreamVersion:BigInt(s.length),state:s.reduce(t,r())}},readStream:(n,e)=>{let t=m.get(n),r=t?BigInt(t.length):void 0;_chunk46YIPCSNjs.e.call(void 0, r,_optionalChain([e, 'optionalAccess', _2 => _2.expectedStreamVersion]));let o=Number(e&&"from"in e?e.from:0),a=Number(e&&"to"in e?e.to:e&&"maxCount"in e&&e.maxCount?e.from+e.maxCount:_nullishCoalesce(_optionalChain([t, 'optionalAccess', _3 => _3.length]), () => (1))),s=t&&t.length>0?t.map(p=>p.event).slice(o,a):[],v=t&&t.length>0?{currentStreamVersion:r,events:s}:null;return Promise.resolve(v)},appendToStream:(n,e,t)=>{let r=_nullishCoalesce(m.get(n), () => ([])),o=r.length>0?BigInt(r.length):void 0;_chunk46YIPCSNjs.e.call(void 0, o,_optionalChain([t, 'optionalAccess', _4 => _4.expectedStreamVersion]));let a=e.map((p,l)=>({event:p,metadata:{eventId:_crypto.randomUUID.call(void 0, ),streamPosition:r.length+l+1,logPosition:BigInt(E()+l+1)}})),s=BigInt(a.slice(-1)[0].metadata.streamPosition);m.set(n,[...r,...a]);let v={nextExpectedStreamVersion:s};return Promise.resolve(v)}}};exports.a = S;
2
+ //# sourceMappingURL=chunk-BM2H4NCZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/eventStore/inMemoryEventStore.ts"],"names":["randomUUID","getInMemoryEventStore","streams","getAllEventsCount","s","p","c","streamName","options","evolve","getInitialState","read","result","events","currentStreamVersion","assertExpectedVersionMatchesCurrent","from","to","resultEvents","e","currentEvents","eventEnvelopes","event","index","positionOfLastEventInTheStream"],"mappings":"wCAAA,OAAS,cAAAA,MAAkB,SA4BpB,IAAMC,EAAwB,IAAkB,CACrD,IAAMC,EAAU,IAAI,IAEdC,EAAoB,IACjB,MAAM,KAAsBD,EAAQ,OAAO,CAAC,EAChD,IAAKE,GAAMA,EAAE,MAAM,EACnB,OAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EAG9B,MAAO,CACL,MAAM,gBACJC,EACAC,EAC8C,CAC9C,GAAM,CAAE,OAAAC,EAAQ,gBAAAC,EAAiB,KAAAC,CAAK,EAAIH,EAEpCI,EAAS,MAAM,KAAK,WAAsBL,EAAYI,CAAI,EAEhE,GAAI,CAACC,EAAQ,OAAO,KAEpB,IAAMC,EAASD,GAAQ,QAAU,CAAC,EAElC,MAAO,CACL,qBAAsB,OAAOC,EAAO,MAAM,EAC1C,MAAOA,EAAO,OAAOJ,EAAQC,EAAgB,CAAC,CAChD,CACF,EAEA,WAAY,CACVH,EACAC,IACyC,CACzC,IAAMK,EAASX,EAAQ,IAAIK,CAAU,EAC/BO,EAAuBD,EAAS,OAAOA,EAAO,MAAM,EAAI,OAE9DE,EACED,EACAN,GAAS,qBACX,EAEA,IAAMQ,EAAO,OAAOR,GAAW,SAAUA,EAAUA,EAAQ,KAAO,CAAC,EAC7DS,EAAK,OACTT,GAAW,OAAQA,EACfA,EAAQ,GACRA,GAAW,aAAcA,GAAWA,EAAQ,SAC1CA,EAAQ,KAAOA,EAAQ,SACvBK,GAAQ,QAAU,CAC1B,EAEMK,EACJL,GAAUA,EAAO,OAAS,EACtBA,EAAO,IAAKM,GAAMA,EAAE,KAAkB,EAAE,MAAMH,EAAMC,CAAE,EACtD,CAAC,EAEDL,EACJC,GAAUA,EAAO,OAAS,EACtB,CACE,qBAAsBC,EACtB,OAAQI,CACV,EACA,KAEN,OAAO,QAAQ,QAAQN,CAAM,CAC/B,EAEA,eAAgB,CACdL,EACAM,EACAL,IACkC,CAClC,IAAMY,EAAgBlB,EAAQ,IAAIK,CAAU,GAAK,CAAC,EAC5CO,EACJM,EAAc,OAAS,EAAI,OAAOA,EAAc,MAAM,EAAI,OAE5DL,EACED,EACAN,GAAS,qBACX,EAEA,IAAMa,EAAkCR,EAAO,IAAI,CAACS,EAAOC,KAClD,CACL,MAAAD,EACA,SAAU,CACR,QAAStB,EAAW,EACpB,eAAgBoB,EAAc,OAASG,EAAQ,EAC/C,YAAa,OAAOpB,EAAkB,EAAIoB,EAAQ,CAAC,CACrD,CACF,EACD,EAEKC,EAAiC,OACrCH,EAAe,MAAM,EAAE,EAAE,CAAC,EAAG,SAAS,cACxC,EAEAnB,EAAQ,IAAIK,EAAY,CAAC,GAAGa,EAAe,GAAGC,CAAc,CAAC,EAE7D,IAAMT,EAA+B,CACnC,0BAA2BY,CAC7B,EAEA,OAAO,QAAQ,QAAQZ,CAAM,CAC/B,CACF,CACF","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"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-C4CXU3PY.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ import{e as i}from"./chunk-UI6CV7VB.mjs";import{randomUUID as g}from"crypto";var S=()=>{let m=new Map,E=()=>Array.from(m.values()).map(n=>n.length).reduce((n,e)=>n+e,0);return{async aggregateStream(n,e){let{evolve:t,getInitialState:r,read:o}=e,a=await this.readStream(n,o);if(!a)return null;let s=a?.events??[];return{currentStreamVersion:BigInt(s.length),state:s.reduce(t,r())}},readStream:(n,e)=>{let t=m.get(n),r=t?BigInt(t.length):void 0;i(r,e?.expectedStreamVersion);let o=Number(e&&"from"in e?e.from:0),a=Number(e&&"to"in e?e.to:e&&"maxCount"in e&&e.maxCount?e.from+e.maxCount:t?.length??1),s=t&&t.length>0?t.map(p=>p.event).slice(o,a):[],v=t&&t.length>0?{currentStreamVersion:r,events:s}:null;return Promise.resolve(v)},appendToStream:(n,e,t)=>{let r=m.get(n)??[],o=r.length>0?BigInt(r.length):void 0;i(o,t?.expectedStreamVersion);let a=e.map((p,l)=>({event:p,metadata:{eventId:g(),streamPosition:r.length+l+1,logPosition:BigInt(E()+l+1)}})),s=BigInt(a.slice(-1)[0].metadata.streamPosition);m.set(n,[...r,...a]);let v={nextExpectedStreamVersion:s};return Promise.resolve(v)}}};export{S as a};
2
+ //# sourceMappingURL=chunk-CTCSK4FW.mjs.map
@@ -0,0 +1 @@
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":"yCAAA,OAAS,cAAAA,MAAkB,SA4BpB,IAAMC,EAAwB,IAAkB,CACrD,IAAMC,EAAU,IAAI,IAEdC,EAAoB,IACjB,MAAM,KAAsBD,EAAQ,OAAO,CAAC,EAChD,IAAKE,GAAMA,EAAE,MAAM,EACnB,OAAO,CAACC,EAAGC,IAAMD,EAAIC,EAAG,CAAC,EAG9B,MAAO,CACL,MAAM,gBACJC,EACAC,EAC8C,CAC9C,GAAM,CAAE,OAAAC,EAAQ,gBAAAC,EAAiB,KAAAC,CAAK,EAAIH,EAEpCI,EAAS,MAAM,KAAK,WAAsBL,EAAYI,CAAI,EAEhE,GAAI,CAACC,EAAQ,OAAO,KAEpB,IAAMC,EAASD,GAAQ,QAAU,CAAC,EAElC,MAAO,CACL,qBAAsB,OAAOC,EAAO,MAAM,EAC1C,MAAOA,EAAO,OAAOJ,EAAQC,EAAgB,CAAC,CAChD,CACF,EAEA,WAAY,CACVH,EACAC,IACyC,CACzC,IAAMK,EAASX,EAAQ,IAAIK,CAAU,EAC/BO,EAAuBD,EAAS,OAAOA,EAAO,MAAM,EAAI,OAE9DE,EACED,EACAN,GAAS,qBACX,EAEA,IAAMQ,EAAO,OAAOR,GAAW,SAAUA,EAAUA,EAAQ,KAAO,CAAC,EAC7DS,EAAK,OACTT,GAAW,OAAQA,EACfA,EAAQ,GACRA,GAAW,aAAcA,GAAWA,EAAQ,SAC1CA,EAAQ,KAAOA,EAAQ,SACvBK,GAAQ,QAAU,CAC1B,EAEMK,EACJL,GAAUA,EAAO,OAAS,EACtBA,EAAO,IAAKM,GAAMA,EAAE,KAAkB,EAAE,MAAMH,EAAMC,CAAE,EACtD,CAAC,EAEDL,EACJC,GAAUA,EAAO,OAAS,EACtB,CACE,qBAAsBC,EACtB,OAAQI,CACV,EACA,KAEN,OAAO,QAAQ,QAAQN,CAAM,CAC/B,EAEA,eAAgB,CACdL,EACAM,EACAL,IACkC,CAClC,IAAMY,EAAgBlB,EAAQ,IAAIK,CAAU,GAAK,CAAC,EAC5CO,EACJM,EAAc,OAAS,EAAI,OAAOA,EAAc,MAAM,EAAI,OAE5DL,EACED,EACAN,GAAS,qBACX,EAEA,IAAMa,EAAkCR,EAAO,IAAI,CAACS,EAAOC,KAClD,CACL,MAAAD,EACA,SAAU,CACR,QAASE,EAAW,EACpB,eAAgBJ,EAAc,OAASG,EAAQ,EAC/C,YAAa,OAAOpB,EAAkB,EAAIoB,EAAQ,CAAC,CACrD,CACF,EACD,EAEKE,EAAiC,OACrCJ,EAAe,MAAM,EAAE,EAAE,CAAC,EAAG,SAAS,cACxC,EAEAnB,EAAQ,IAAIK,EAAY,CAAC,GAAGa,EAAe,GAAGC,CAAc,CAAC,EAE7D,IAAMT,EAA+B,CACnC,0BAA2Ba,CAC7B,EAEA,OAAO,QAAQ,QAAQb,CAAM,CAC/B,CACF,CACF","names":["randomUUID","getInMemoryEventStore","streams","getAllEventsCount","s","p","c","streamName","options","evolve","getInitialState","read","result","events","currentStreamVersion","assertExpectedVersionMatchesCurrent","from","to","resultEvents","e","currentEvents","eventEnvelopes","event","index","randomUUID","positionOfLastEventInTheStream"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-D24KLTN5.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,5 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var u=(s,o)=>{let t=s,r=o;return Object.keys(r).every(n=>typeof r[n]=="object"?u(t[n],r[n]):r[n]===t[n])},i= exports.b =(s,o)=>{if(!u(s,o))throw Error(`subObj:
2
+ ${JSON.stringify(o)}
3
+ is not subset of
4
+ ${JSON.stringify(s)}`)};exports.a = u; exports.b = i;
5
+ //# sourceMappingURL=chunk-DFPI5IXT.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testing/assertions.ts"],"names":["isSubset","superObj","subObj","sup","sub","ele","assertMatches","actual","expected"],"mappings":"AAAO,IAAMA,EAAW,CAACC,EAAmBC,IAA6B,CACvE,IAAMC,EAAMF,EACNG,EAAMF,EAEZ,OAAO,OAAO,KAAKE,CAAG,EAAE,MAAOC,GACzB,OAAOD,EAAIC,CAAG,GAAK,SACdL,EACLG,EAAIE,CAAG,EACPD,EAAIC,CAAG,CACT,EAEKD,EAAIC,CAAG,IAAMF,EAAIE,CAAG,CAC5B,CACH,EAEaC,EAAgB,CAACC,EAAiBC,IAAsB,CACnE,GAAI,CAACR,EAASO,EAAQC,CAAQ,EAC5B,MAAM,MACJ;AAAA,EAAY,KAAK,UAAUA,CAAQ,CAAC;AAAA;AAAA,EAAuB,KAAK,UAAUD,CAAM,CAAC,EACnF,CACJ","sourcesContent":["export const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as Record<string, unknown>;\n const sub = subObj as Record<string, unknown>;\n\n return Object.keys(sub).every((ele: string) => {\n if (typeof sub[ele] == 'object') {\n return isSubset(\n sup[ele] as Record<string, unknown>,\n sub[ele] as Record<string, unknown>,\n );\n }\n return sub[ele] === sup[ele];\n });\n};\n\nexport const assertMatches = (actual: unknown, expected: unknown) => {\n if (!isSubset(actual, expected))\n throw Error(\n `subObj:\\n${JSON.stringify(expected)}\\nis not subset of\\n${JSON.stringify(actual)}`,\n );\n};\n"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-DIW552TK.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ var n=t=>({kind:"Reply",message:t}),u=t=>({kind:"Send",message:t}),o=t=>({kind:"Publish",message:t}),r=(t,e)=>({kind:"Schedule",message:t,when:e}),p=()=>({kind:"Complete"}),d=t=>({kind:"Ignore",reason:t}),m=t=>({kind:"Error",reason:t}),a=()=>({kind:"Accept"});export{n as a,u as b,o as c,r as d,p as e,d as f,m as g,a as h};
2
+ //# sourceMappingURL=chunk-ERDVHQZL.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/typing/workflow.ts"],"sourcesContent":["import type { Command } from './command';\nimport type { Event } from './event';\n\n/// Inspired by https://blog.bittacklr.be/the-workflow-pattern.html\n\nexport type Workflow<\n Input extends Event | Command,\n State,\n Output extends Event | Command,\n> = {\n decide: (command: Input, state: State) => WorkflowOutput<Output>[];\n evolve: (currentState: State, event: WorkflowEvent<Output>) => State;\n getInitialState: () => State;\n};\n\nexport type WorkflowEvent<Output extends Command | Event> = Extract<\n Output,\n { __brand?: 'Event' }\n>;\n\nexport type WorkflowCommand<Output extends Command | Event> = Extract<\n Output,\n { __brand?: 'Command' }\n>;\n\nexport type WorkflowOutput<TOutput extends Command | Event> =\n | { kind: 'Reply'; message: TOutput }\n | { kind: 'Send'; message: WorkflowCommand<TOutput> }\n | { kind: 'Publish'; message: WorkflowEvent<TOutput> }\n | {\n kind: 'Schedule';\n message: TOutput;\n when: { afterInMs: number } | { at: Date };\n }\n | { kind: 'Complete' }\n | { kind: 'Accept' }\n | { kind: 'Ignore'; reason: string }\n | { kind: 'Error'; reason: string };\n\nexport const reply = <TOutput extends Command | Event>(\n message: TOutput,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Reply',\n message,\n };\n};\n\nexport const send = <TOutput extends Command | Event>(\n message: WorkflowCommand<TOutput>,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Send',\n message,\n };\n};\n\nexport const publish = <TOutput extends Command | Event>(\n message: WorkflowEvent<TOutput>,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Publish',\n message,\n };\n};\n\nexport const schedule = <TOutput extends Command | Event>(\n message: TOutput,\n when: { afterInMs: number } | { at: Date },\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Schedule',\n message,\n when,\n };\n};\n\nexport const complete = <\n TOutput extends Command | Event,\n>(): WorkflowOutput<TOutput> => {\n return {\n kind: 'Complete',\n };\n};\n\nexport const ignore = <TOutput extends Command | Event>(\n reason: string,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Ignore',\n reason,\n };\n};\n\nexport const error = <TOutput extends Command | Event>(\n reason: string,\n): WorkflowOutput<TOutput> => {\n return {\n kind: 'Error',\n reason,\n };\n};\n\nexport const accept = <\n TOutput extends Command | Event,\n>(): WorkflowOutput<TOutput> => {\n return { kind: 'Accept' };\n};\n"],"mappings":"AAuCO,IAAMA,EACXC,IAEO,CACL,KAAM,QACN,QAAAA,CACF,GAGWC,EACXD,IAEO,CACL,KAAM,OACN,QAAAA,CACF,GAGWE,EACXF,IAEO,CACL,KAAM,UACN,QAAAA,CACF,GAGWG,EAAW,CACtBH,EACAI,KAEO,CACL,KAAM,WACN,QAAAJ,EACA,KAAAI,CACF,GAGWC,EAAW,KAGf,CACL,KAAM,UACR,GAGWC,EACXC,IAEO,CACL,KAAM,SACN,OAAAA,CACF,GAGWC,EACXD,IAEO,CACL,KAAM,QACN,OAAAA,CACF,GAGWE,EAAS,KAGb,CAAE,KAAM,QAAS","names":["reply","message","send","publish","schedule","when","complete","ignore","reason","error","accept"]}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-F7QRI2VL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var u=t=>{let e,n,r=0;do({value:e,done:n}=t.next()),r+=e||0;while(!n);return r};exports.a = u;
2
+ //# sourceMappingURL=chunk-FE73T2NS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/iterators.ts"],"names":["sum","iterator","value","done"],"mappings":"AAAO,IAAMA,EACXC,GACG,CACH,IAAIC,EACFC,EACAH,EAAM,EACR,GAEG,CAAE,MAAAE,EAAO,KAAAC,CAAK,EAAIF,EAAS,KAAK,GACjCD,GAAOE,GAAS,QACT,CAACC,GACV,OAAOH,CACT","sourcesContent":["export const sum = (\n iterator: Iterator<number, number, number> | Iterator<number>,\n) => {\n let value,\n done: boolean | undefined,\n sum = 0;\n do {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n ({ value, done } = iterator.next());\n sum += value || 0;\n } while (!done);\n return sum;\n};\n"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-HKEQAT6F.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-IJGC6SHP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-IZWGWZ3P.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ import{b as p,c as i}from"./chunk-UI6CV7VB.mjs";var x=(r,a,d=e=>e)=>async(e,c,V,n)=>{let s=d(c),S=await e.aggregateStream(s,{evolve:r,getInitialState:a,read:{expectedStreamVersion:n?.expectedStreamVersion??i}}),m=S?.state??a(),E=S?.currentStreamVersion,t=V(m),o=Array.isArray(t)?t:[t],u=n?.expectedStreamVersion??E??p;return{...await e.appendToStream(s,o,{expectedStreamVersion:u}),newState:o.reduce(r,m)}};export{x as a};
2
+ //# sourceMappingURL=chunk-JJHE2RKT.mjs.map
@@ -0,0 +1 @@
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":"gDAgBO,IAAMA,EACX,CACEC,EACAC,EACAC,EAAyCC,GAAOA,IAElD,MACEC,EACAD,EACAE,EACAC,IAGwD,CACxD,IAAMC,EAAaL,EAAcC,CAAE,EAG7BK,EAAoB,MAAMJ,EAAW,gBAGzCG,EAAY,CACZ,OAAAP,EACA,gBAAAC,EACA,KAAM,CAGJ,sBACEK,GAAS,uBAAyBG,CACtC,CACF,CAAC,EAGKC,EAAQF,GAAmB,OAASP,EAAgB,EACpDU,EAAuBH,GAAmB,qBAG1CI,EAASP,EAAOK,CAAK,EAErBG,EAAY,MAAM,QAAQD,CAAM,EAAIA,EAAS,CAACA,CAAM,EAMpDE,EACJR,GAAS,uBACTK,GACAI,EAYF,MAAO,CAAE,GATY,MAAMX,EAAW,eACpCG,EACAM,EACA,CACE,sBAAAC,CACF,CACF,EAG0B,SAAUD,EAAU,OAAOb,EAAQU,CAAK,CAAE,CACtE","names":["CommandHandler","evolve","getInitialState","mapToStreamId","id","eventStore","handle","options","streamName","aggregationResult","NO_CONCURRENCY_CHECK","state","currentStreamVersion","result","newEvents","expectedStreamVersion","STREAM_DOES_NOT_EXIST"]}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-LOJ6A4AJ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); 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 a=class extends Error{constructor(r){super(`Cannot parse! ${r}`)}},p= exports.b ={stringify:(o,r)=>JSON.stringify(_optionalChain([r, 'optionalAccess', _ => _.map])?r.map(o):o),parse:(o,r)=>{let e=JSON.parse(o,_optionalChain([r, 'optionalAccess', _2 => _2.reviver]));if(_optionalChain([r, 'optionalAccess', _3 => _3.typeCheck])&&!_optionalChain([r, 'optionalAccess', _4 => _4.typeCheck, 'call', _5 => _5(e)]))throw new a(o);return _optionalChain([r, 'optionalAccess', _6 => _6.map])?r.map(e):e}};exports.a = a; exports.b = p;
2
+ //# sourceMappingURL=chunk-LYKEARRW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/serialization/json/JSONParser.ts"],"names":["ParseError","text","JSONParser","value","options","parsed"],"mappings":"AAAO,IAAMA,EAAN,cAAyB,KAAM,CACpC,YAAYC,EAAc,CACxB,MAAM,iBAAiBA,CAAI,EAAE,CAC/B,CACF,EA0BaC,EAAa,CACxB,UAAW,CACTC,EACAC,IAEO,KAAK,UACVA,GAAS,IAAMA,EAAQ,IAAID,CAA6B,EAAIA,CAC9D,EAEF,MAAO,CACLF,EACAG,IACmB,CACnB,IAAMC,EAAkB,KAAK,MAAMJ,EAAMG,GAAS,OAAO,EAEzD,GAAIA,GAAS,WAAa,CAACA,GAAS,UAAcC,CAAM,EACtD,MAAM,IAAIL,EAAWC,CAAI,EAE3B,OAAOG,GAAS,IACZA,EAAQ,IAAIC,CAA8B,EACzCA,CACP,CACF","sourcesContent":["export class ParseError extends Error {\n constructor(text: string) {\n super(`Cannot parse! ${text}`);\n }\n}\n\nexport type Mapper<From, To = From> =\n | ((value: unknown) => To)\n | ((value: Partial<From>) => To)\n | ((value: From) => To)\n | ((value: Partial<To>) => To)\n | ((value: To) => To)\n | ((value: Partial<To | From>) => To)\n | ((value: To | From) => To);\n\nexport type MapperArgs<From, To = From> = Partial<From> &\n From &\n Partial<To> &\n To;\n\nexport type ParseOptions<From, To = From> = {\n reviver?: (key: string, value: unknown) => unknown;\n map?: Mapper<From, To>;\n typeCheck?: <To>(value: unknown) => value is To;\n};\n\nexport type StringifyOptions<From, To = From> = {\n map?: Mapper<From, To>;\n};\n\nexport const JSONParser = {\n stringify: <From, To = From>(\n value: From,\n options?: StringifyOptions<From, To>,\n ) => {\n return JSON.stringify(\n options?.map ? options.map(value as MapperArgs<From, To>) : value,\n );\n },\n parse: <From, To = From>(\n text: string,\n options?: ParseOptions<From, To>,\n ): To | undefined => {\n const parsed: unknown = JSON.parse(text, options?.reviver);\n\n if (options?.typeCheck && !options?.typeCheck<To>(parsed))\n throw new ParseError(text);\n\n return options?.map\n ? options.map(parsed as MapperArgs<From, To>)\n : (parsed as To | undefined);\n },\n};\n"]}
@@ -0,0 +1,2 @@
1
+ import{a as t}from"./chunk-JJHE2RKT.mjs";var s=({decide:r,evolve:n,getInitialState:m},o=e=>e)=>async(e,a,i,d)=>t(n,m,o)(e,a,p=>r(i,p),d);export{s as a};
2
+ //# sourceMappingURL=chunk-O2ZUNWMO.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commandHandling/handleCommandWithDecider.ts"],"sourcesContent":["import type {\n DefaultStreamVersionType,\n EventStore,\n ExpectedStreamVersion,\n} from '../eventStore';\nimport type { Command, Event } from '../typing';\nimport type { Decider } from '../typing/decider';\nimport { CommandHandler } from './handleCommand';\n\n// #region command-handler\nexport const DeciderCommandHandler =\n <\n State,\n CommandType extends Command,\n StreamEvent extends Event,\n StreamVersion = DefaultStreamVersionType,\n >(\n {\n decide,\n evolve,\n getInitialState,\n }: Decider<State, CommandType, StreamEvent>,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async (\n eventStore: EventStore<StreamVersion>,\n id: string,\n command: CommandType,\n options?: {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ) =>\n CommandHandler<State, StreamEvent, StreamVersion>(\n evolve,\n getInitialState,\n mapToStreamId,\n )(eventStore, id, (state) => decide(command, state), options);\n// #endregion command-handler\n"],"mappings":"yCAUO,IAAMA,EACX,CAME,CACE,OAAAC,EACA,OAAAC,EACA,gBAAAC,CACF,EACAC,EAAyCC,GAAOA,IAElD,MACEC,EACAD,EACAE,EACAC,IAIAC,EACEP,EACAC,EACAC,CACF,EAAEE,EAAYD,EAAKK,GAAUT,EAAOM,EAASG,CAAK,EAAGF,CAAO","names":["DeciderCommandHandler","decide","evolve","getInitialState","mapToStreamId","id","eventStore","command","options","CommandHandler","state"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _assert = require('assert'); var _assert2 = _interopRequireDefault(_assert);var d={for:r=>n=>({when:i=>{let a=()=>{let t=(Array.isArray(n)?n:[n]).reduce(r.evolve,r.initialState());return r.decide(i,t)};return{then:e=>{let t=a(),s=Array.isArray(t)?t:[t],v=Array.isArray(e)?e:[e];_assert2.default.deepEqual(s,v)},thenThrows:e=>{try{a(),_assert2.default.fail("Handler did not fail as expected")}catch(t){e&&_assert2.default.ok(e(t))}}}}})};exports.a = d;
2
+ //# sourceMappingURL=chunk-O34VKX7R.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testing/deciderSpecification.ts"],"names":["assert","DeciderSpecification","decider","givenEvents","command","handle","currentState","expectedEvents","resultEvents","resultEventsArray","expectedEventsArray","check","error"],"mappings":"AAAA,OAAOA,MAAY,SAWZ,IAAMC,EAAuB,CAClC,IAA6BC,GAMjBC,IACC,CACL,KAAOC,GAAqB,CAC1B,IAAMC,EAAS,IAAM,CAKnB,IAAMC,GAJiB,MAAM,QAAQH,CAAW,EAC5CA,EACA,CAACA,CAAW,GAEoB,OAClCD,EAAQ,OACRA,EAAQ,aAAa,CACvB,EAEA,OAAOA,EAAQ,OAAOE,EAASE,CAAY,CAC7C,EAEA,MAAO,CACL,KAAOC,GAA0C,CAC/C,IAAMC,EAAeH,EAAO,EAEtBI,EAAoB,MAAM,QAAQD,CAAY,EAChDA,EACA,CAACA,CAAY,EAEXE,EAAsB,MAAM,QAAQH,CAAc,EACpDA,EACA,CAACA,CAAc,EAEnBP,EAAO,UAAUS,EAAmBC,CAAmB,CACzD,EACA,WAAoBC,GAA4C,CAC9D,GAAI,CACFN,EAAO,EACPL,EAAO,KAAK,kCAAkC,CAChD,OAASY,EAAO,CACVD,GAAOX,EAAO,GAAGW,EAAMC,CAAc,CAAC,CAC5C,CACF,CACF,CACF,CACF,EAIR","sourcesContent":["import assert from 'assert';\n\nexport type DeciderSpecfication<Command, Event> = (\n givenEvents: Event | Event[],\n) => {\n when: (command: Command) => {\n then: (expectedEvents: Event | Event[]) => void;\n thenThrows: <Error>(assert: (error: Error) => boolean) => void;\n };\n};\n\nexport const DeciderSpecification = {\n for: <Command, Event, State>(decider: {\n decide: (command: Command, state: State) => Event | Event[];\n evolve: (state: State, event: Event) => State;\n initialState: () => State;\n }): DeciderSpecfication<Command, Event> => {\n {\n return (givenEvents: Event | Event[]) => {\n return {\n when: (command: Command) => {\n const handle = () => {\n const existingEvents = Array.isArray(givenEvents)\n ? givenEvents\n : [givenEvents];\n\n const currentState = existingEvents.reduce<State>(\n decider.evolve,\n decider.initialState(),\n );\n\n return decider.decide(command, currentState);\n };\n\n return {\n then: (expectedEvents: Event | Event[]): void => {\n const resultEvents = handle();\n\n const resultEventsArray = Array.isArray(resultEvents)\n ? resultEvents\n : [resultEvents];\n\n const expectedEventsArray = Array.isArray(expectedEvents)\n ? expectedEvents\n : [expectedEvents];\n\n assert.deepEqual(resultEventsArray, expectedEventsArray);\n },\n thenThrows: <Error>(check?: (error: Error) => boolean): void => {\n try {\n handle();\n assert.fail('Handler did not fail as expected');\n } catch (error) {\n if (check) assert.ok(check(error as Error));\n }\n },\n };\n },\n };\n };\n }\n },\n};\n"]}
@@ -0,0 +1,2 @@
1
+ var u=t=>{let e,n,r=0;do({value:e,done:n}=t.next()),r+=e||0;while(!n);return r};export{u as a};
2
+ //# sourceMappingURL=chunk-OBA6MZMG.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/iterators.ts"],"sourcesContent":["export const sum = (\n iterator: Iterator<number, number, number> | Iterator<number>,\n) => {\n let value,\n done: boolean | undefined,\n sum = 0;\n do {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n ({ value, done } = iterator.next());\n sum += value || 0;\n } while (!done);\n return sum;\n};\n"],"mappings":"AAAO,IAAMA,EACXC,GACG,CACH,IAAIC,EACFC,EACAH,EAAM,EACR,GAEG,CAAE,MAAAE,EAAO,KAAAC,CAAK,EAAIF,EAAS,KAAK,GACjCD,GAAOE,GAAS,QACT,CAACC,GACV,OAAOH,CACT","names":["sum","iterator","value","done"]}
@@ -0,0 +1,2 @@
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 _chunk46YIPCSNjs = require('./chunk-46YIPCSN.js');var x=(r,a,d=e=>e)=>async(e,c,V,n)=>{let s=d(c),S=await e.aggregateStream(s,{evolve:r,getInitialState:a,read:{expectedStreamVersion:_nullishCoalesce(_optionalChain([n, 'optionalAccess', _ => _.expectedStreamVersion]), () => (_chunk46YIPCSNjs.c))}}),m=_nullishCoalesce(_optionalChain([S, 'optionalAccess', _2 => _2.state]), () => (a())),E=_optionalChain([S, 'optionalAccess', _3 => _3.currentStreamVersion]),t=V(m),o=Array.isArray(t)?t:[t],u=_nullishCoalesce(_nullishCoalesce(_optionalChain([n, 'optionalAccess', _4 => _4.expectedStreamVersion]), () => (E)), () => (_chunk46YIPCSNjs.b));return{...await e.appendToStream(s,o,{expectedStreamVersion:u}),newState:o.reduce(r,m)}};exports.a = x;
2
+ //# sourceMappingURL=chunk-OYAO7QEP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commandHandling/handleCommand.ts"],"names":["CommandHandler","evolve","getInitialState","mapToStreamId","id","eventStore","handle","options","streamName","aggregationResult","NO_CONCURRENCY_CHECK","state","currentStreamVersion","result","newEvents","expectedStreamVersion","STREAM_DOES_NOT_EXIST"],"mappings":"+CAgBO,IAAMA,EACX,CACEC,EACAC,EACAC,EAAyCC,GAAOA,IAElD,MACEC,EACAD,EACAE,EACAC,IAGwD,CACxD,IAAMC,EAAaL,EAAcC,CAAE,EAG7BK,EAAoB,MAAMJ,EAAW,gBAGzCG,EAAY,CACZ,OAAAP,EACA,gBAAAC,EACA,KAAM,CAGJ,sBACEK,GAAS,uBAAyBG,CACtC,CACF,CAAC,EAGKC,EAAQF,GAAmB,OAASP,EAAgB,EACpDU,EAAuBH,GAAmB,qBAG1CI,EAASP,EAAOK,CAAK,EAErBG,EAAY,MAAM,QAAQD,CAAM,EAAIA,EAAS,CAACA,CAAM,EAMpDE,EACJR,GAAS,uBACTK,GACAI,EAYF,MAAO,CAAE,GATY,MAAMX,EAAW,eACpCG,EACAM,EACA,CACE,sBAAAC,CACF,CACF,EAG0B,SAAUD,EAAU,OAAOb,EAAQU,CAAK,CAAE,CACtE","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"]}
@@ -0,0 +1,2 @@
1
+ var a=class extends Error{constructor(r){super(`Cannot parse! ${r}`)}},p={stringify:(o,r)=>JSON.stringify(r?.map?r.map(o):o),parse:(o,r)=>{let e=JSON.parse(o,r?.reviver);if(r?.typeCheck&&!r?.typeCheck(e))throw new a(o);return r?.map?r.map(e):e}};export{a,p as b};
2
+ //# sourceMappingURL=chunk-PKL7KGJ3.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/serialization/json/JSONParser.ts"],"sourcesContent":["export class ParseError extends Error {\n constructor(text: string) {\n super(`Cannot parse! ${text}`);\n }\n}\n\nexport type Mapper<From, To = From> =\n | ((value: unknown) => To)\n | ((value: Partial<From>) => To)\n | ((value: From) => To)\n | ((value: Partial<To>) => To)\n | ((value: To) => To)\n | ((value: Partial<To | From>) => To)\n | ((value: To | From) => To);\n\nexport type MapperArgs<From, To = From> = Partial<From> &\n From &\n Partial<To> &\n To;\n\nexport type ParseOptions<From, To = From> = {\n reviver?: (key: string, value: unknown) => unknown;\n map?: Mapper<From, To>;\n typeCheck?: <To>(value: unknown) => value is To;\n};\n\nexport type StringifyOptions<From, To = From> = {\n map?: Mapper<From, To>;\n};\n\nexport const JSONParser = {\n stringify: <From, To = From>(\n value: From,\n options?: StringifyOptions<From, To>,\n ) => {\n return JSON.stringify(\n options?.map ? options.map(value as MapperArgs<From, To>) : value,\n );\n },\n parse: <From, To = From>(\n text: string,\n options?: ParseOptions<From, To>,\n ): To | undefined => {\n const parsed: unknown = JSON.parse(text, options?.reviver);\n\n if (options?.typeCheck && !options?.typeCheck<To>(parsed))\n throw new ParseError(text);\n\n return options?.map\n ? options.map(parsed as MapperArgs<From, To>)\n : (parsed as To | undefined);\n },\n};\n"],"mappings":"AAAO,IAAMA,EAAN,cAAyB,KAAM,CACpC,YAAYC,EAAc,CACxB,MAAM,iBAAiBA,CAAI,EAAE,CAC/B,CACF,EA0BaC,EAAa,CACxB,UAAW,CACTC,EACAC,IAEO,KAAK,UACVA,GAAS,IAAMA,EAAQ,IAAID,CAA6B,EAAIA,CAC9D,EAEF,MAAO,CACLF,EACAG,IACmB,CACnB,IAAMC,EAAkB,KAAK,MAAMJ,EAAMG,GAAS,OAAO,EAEzD,GAAIA,GAAS,WAAa,CAACA,GAAS,UAAcC,CAAM,EACtD,MAAM,IAAIL,EAAWC,CAAI,EAE3B,OAAOG,GAAS,IACZA,EAAQ,IAAIC,CAA8B,EACzCA,CACP,CACF","names":["ParseError","text","JSONParser","value","options","parsed"]}
@@ -0,0 +1,2 @@
1
+ var o={};export{o as a};
2
+ //# sourceMappingURL=chunk-PNOEBD4U.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/index.ts"],"sourcesContent":["export * from './iterators';\nexport * from './merge';\n\nexport default {};\n"],"mappings":"AAGA,IAAOA,EAAQ,CAAC","names":["utils_default"]}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-QSAFGRYV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -0,0 +1,5 @@
1
+ var u=(s,o)=>{let t=s,r=o;return Object.keys(r).every(n=>typeof r[n]=="object"?u(t[n],r[n]):r[n]===t[n])},i=(s,o)=>{if(!u(s,o))throw Error(`subObj:
2
+ ${JSON.stringify(o)}
3
+ is not subset of
4
+ ${JSON.stringify(s)}`)};export{u as a,i as b};
5
+ //# sourceMappingURL=chunk-RWKXC5FZ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/testing/assertions.ts"],"sourcesContent":["export const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as Record<string, unknown>;\n const sub = subObj as Record<string, unknown>;\n\n return Object.keys(sub).every((ele: string) => {\n if (typeof sub[ele] == 'object') {\n return isSubset(\n sup[ele] as Record<string, unknown>,\n sub[ele] as Record<string, unknown>,\n );\n }\n return sub[ele] === sup[ele];\n });\n};\n\nexport const assertMatches = (actual: unknown, expected: unknown) => {\n if (!isSubset(actual, expected))\n throw Error(\n `subObj:\\n${JSON.stringify(expected)}\\nis not subset of\\n${JSON.stringify(actual)}`,\n );\n};\n"],"mappings":"AAAO,IAAMA,EAAW,CAACC,EAAmBC,IAA6B,CACvE,IAAMC,EAAMF,EACNG,EAAMF,EAEZ,OAAO,OAAO,KAAKE,CAAG,EAAE,MAAOC,GACzB,OAAOD,EAAIC,CAAG,GAAK,SACdL,EACLG,EAAIE,CAAG,EACPD,EAAIC,CAAG,CACT,EAEKD,EAAIC,CAAG,IAAMF,EAAIE,CAAG,CAC5B,CACH,EAEaC,EAAgB,CAACC,EAAiBC,IAAsB,CACnE,GAAI,CAACR,EAASO,EAAQC,CAAQ,EAC5B,MAAM,MACJ;AAAA,EAAY,KAAK,UAAUA,CAAQ,CAAC;AAAA;AAAA,EAAuB,KAAK,UAAUD,CAAM,CAAC,EACnF,CACJ","names":["isSubset","superObj","subObj","sup","sub","ele","assertMatches","actual","expected"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkOYAO7QEPjs = require('./chunk-OYAO7QEP.js');var s=({decide:r,evolve:n,getInitialState:m},o=e=>e)=>async(e,a,i,d)=>_chunkOYAO7QEPjs.a.call(void 0, n,m,o)(e,a,p=>r(i,p),d);exports.a = s;
2
+ //# sourceMappingURL=chunk-U3WA3VIW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/commandHandling/handleCommandWithDecider.ts"],"names":["DeciderCommandHandler","decide","evolve","getInitialState","mapToStreamId","id","eventStore","command","options","CommandHandler","state"],"mappings":"wCAUO,IAAMA,EACX,CAME,CACE,OAAAC,EACA,OAAAC,EACA,gBAAAC,CACF,EACAC,EAAyCC,GAAOA,IAElD,MACEC,EACAD,EACAE,EACAC,IAIAC,EACEP,EACAC,EACAC,CACF,EAAEE,EAAYD,EAAKK,GAAUT,EAAOM,EAASG,CAAK,EAAGF,CAAO","sourcesContent":["import type {\n DefaultStreamVersionType,\n EventStore,\n ExpectedStreamVersion,\n} from '../eventStore';\nimport type { Command, Event } from '../typing';\nimport type { Decider } from '../typing/decider';\nimport { CommandHandler } from './handleCommand';\n\n// #region command-handler\nexport const DeciderCommandHandler =\n <\n State,\n CommandType extends Command,\n StreamEvent extends Event,\n StreamVersion = DefaultStreamVersionType,\n >(\n {\n decide,\n evolve,\n getInitialState,\n }: Decider<State, CommandType, StreamEvent>,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async (\n eventStore: EventStore<StreamVersion>,\n id: string,\n command: CommandType,\n options?: {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ) =>\n CommandHandler<State, StreamEvent, StreamVersion>(\n evolve,\n getInitialState,\n mapToStreamId,\n )(eventStore, id, (state) => decide(command, state), options);\n// #endregion command-handler\n"]}
@@ -0,0 +1,2 @@
1
+ import{h as o}from"./chunk-YV6PB6LX.mjs";var s="STREAM_EXISTS",a="STREAM_DOES_NOT_EXIST",n="NO_CONCURRENCY_CHECK",S=(r,e)=>e===n?!0:e==a?r===void 0:e==s?r!==void 0:r===e,V=(r,e)=>{if(e??=n,!S(r,e))throw new t(r,e)},t=class r extends o{constructor(e,i){super(e?.toString(),i?.toString()),Object.setPrototypeOf(this,r.prototype)}};export{s as a,a as b,n as c,S as d,V as e,t as f};
2
+ //# sourceMappingURL=chunk-UI6CV7VB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/eventStore/expectedVersion.ts"],"sourcesContent":["import { ConcurrencyError } from '../errors';\nimport type { Flavour } from '../typing';\nimport type { DefaultStreamVersionType } from './eventStore';\n\nexport type ExpectedStreamVersion<VersionType = DefaultStreamVersionType> =\n | ExpectedStreamVersionWithValue<VersionType>\n | ExpectedStreamVersionGeneral;\n\nexport type ExpectedStreamVersionWithValue<\n VersionType = DefaultStreamVersionType,\n> = Flavour<VersionType, 'StreamVersion'>;\n\nexport type ExpectedStreamVersionGeneral = Flavour<\n 'STREAM_EXISTS' | 'STREAM_DOES_NOT_EXIST' | 'NO_CONCURRENCY_CHECK',\n 'StreamVersion'\n>;\n\nexport const STREAM_EXISTS = 'STREAM_EXISTS' as ExpectedStreamVersionGeneral;\nexport const STREAM_DOES_NOT_EXIST =\n 'STREAM_DOES_NOT_EXIST' as ExpectedStreamVersionGeneral;\nexport const NO_CONCURRENCY_CHECK =\n 'NO_CONCURRENCY_CHECK' as ExpectedStreamVersionGeneral;\n\nexport const matchesExpectedVersion = <\n StreamVersion = DefaultStreamVersionType,\n>(\n current: StreamVersion | undefined,\n expected: ExpectedStreamVersion<StreamVersion>,\n): boolean => {\n if (expected === NO_CONCURRENCY_CHECK) return true;\n\n if (expected == STREAM_DOES_NOT_EXIST) return current === undefined;\n\n if (expected == STREAM_EXISTS) return current !== undefined;\n\n return current === expected;\n};\n\nexport const assertExpectedVersionMatchesCurrent = <\n StreamVersion = DefaultStreamVersionType,\n>(\n current: StreamVersion | undefined,\n expected: ExpectedStreamVersion<StreamVersion> | undefined,\n): void => {\n expected ??= NO_CONCURRENCY_CHECK;\n\n if (!matchesExpectedVersion(current, expected))\n throw new ExpectedVersionConflictError(current, expected);\n};\n\nexport class ExpectedVersionConflictError<\n VersionType = DefaultStreamVersionType,\n> extends ConcurrencyError {\n constructor(\n current: VersionType | undefined,\n expected: ExpectedStreamVersion<VersionType>,\n ) {\n super(current?.toString(), expected?.toString());\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ExpectedVersionConflictError.prototype);\n }\n}\n"],"mappings":"yCAiBO,IAAMA,EAAgB,gBAChBC,EACX,wBACWC,EACX,uBAEWC,EAAyB,CAGpCC,EACAC,IAEIA,IAAaH,EAA6B,GAE1CG,GAAYJ,EAA8BG,IAAY,OAEtDC,GAAYL,EAAsBI,IAAY,OAE3CA,IAAYC,EAGRC,EAAsC,CAGjDF,EACAC,IACS,CAGT,GAFAA,IAAaH,EAET,CAACC,EAAuBC,EAASC,CAAQ,EAC3C,MAAM,IAAIE,EAA6BH,EAASC,CAAQ,CAC5D,EAEaE,EAAN,MAAMC,UAEHC,CAAiB,CACzB,YACEL,EACAC,EACA,CACA,MAAMD,GAAS,SAAS,EAAGC,GAAU,SAAS,CAAC,EAG/C,OAAO,eAAe,KAAMG,EAA6B,SAAS,CACpE,CACF","names":["STREAM_EXISTS","STREAM_DOES_NOT_EXIST","NO_CONCURRENCY_CHECK","matchesExpectedVersion","current","expected","assertExpectedVersionMatchesCurrent","ExpectedVersionConflictError","_ExpectedVersionConflictError","ConcurrencyError"]}
@@ -0,0 +1,2 @@
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 s=class t extends Error{constructor(e){let o=e&&typeof e=="object"&&"errorCode"in e?e.errorCode:i(e)?e:500,r=e&&typeof e=="object"&&"message"in e?e.message:g(e)?e:`Error with status code '${o}' ocurred during Emmett processing`;super(r),this.errorCode=o,Object.setPrototypeOf(this,t.prototype)}},c= exports.h =class t extends s{constructor(o,r,m){super({errorCode:412,message:_nullishCoalesce(m, () => (`Expected version ${r.toString()} does not match current ${_optionalChain([o, 'optionalAccess', _2 => _2.toString, 'call', _3 => _3()])}`))});this.current=o;this.expected=r;Object.setPrototypeOf(this,t.prototype)}},n= exports.i =class t extends s{constructor(e){super({errorCode:400,message:_nullishCoalesce(e, () => ("Validation Error ocurred during Emmett processing"))}),Object.setPrototypeOf(this,t.prototype)}},u= exports.j =class t extends s{constructor(e){super({errorCode:403,message:_nullishCoalesce(e, () => ("Illegal State ocurred during Emmett processing"))}),Object.setPrototypeOf(this,t.prototype)}},d= exports.k =class t extends s{constructor(e){super({errorCode:404,message:_nullishCoalesce(_optionalChain([e, 'optionalAccess', _4 => _4.message]), () => ((_optionalChain([e, 'optionalAccess', _5 => _5.id])?e.type?`${e.type} with ${e.id} was not found during Emmett processing`:`State with ${e.id} was not found during Emmett processing`:_optionalChain([e, 'optionalAccess', _6 => _6.type])?`${e.type} was not found during Emmett processing`:"State was not found during Emmett processing")))}),Object.setPrototypeOf(this,t.prototype)}};var p=(r=>(r.NOT_A_NONEMPTY_STRING="NOT_A_NONEMPTY_STRING",r.NOT_A_POSITIVE_NUMBER="NOT_A_POSITIVE_NUMBER",r.NOT_AN_UNSIGNED_BIGINT="NOT_AN_UNSIGNED_BIGINT",r))(p||{}),i= exports.b =t=>typeof t=="number"&&t===t,g= exports.c =t=>typeof t=="string",_= exports.d =t=>{if(!g(t)||t.length===0)throw new n("NOT_A_NONEMPTY_STRING");return t},b= exports.e =t=>{if(!i(t)||t<=0)throw new n("NOT_A_POSITIVE_NUMBER");return t},T= exports.f =t=>{let e=BigInt(t);if(e<0)throw new n("NOT_AN_UNSIGNED_BIGINT");return e};exports.a = p; exports.b = i; exports.c = g; exports.d = _; exports.e = b; exports.f = T; exports.g = s; exports.h = c; exports.i = n; exports.j = u; exports.k = d;
2
+ //# sourceMappingURL=chunk-UUCTMJK7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/validation/index.ts"],"names":["EmmettError","_EmmettError","options","errorCode","isNumber","message","isString","ConcurrencyError","_ConcurrencyError","current","expected","ValidationError","_ValidationError","IllegalStateError","_IllegalStateError","NotFoundError","_NotFoundError","ValidationErrors","val","assertNotEmptyString","value","assertPositiveNumber","assertUnsignedBigInt","number"],"mappings":"AAEO,IAAMA,EAAN,MAAMC,UAAoB,KAAM,CAC9B,UAEP,YACEC,EACA,CACA,IAAMC,EACJD,GAAW,OAAOA,GAAY,UAAY,cAAeA,EACrDA,EAAQ,UACRE,EAASF,CAAO,EACdA,EACA,IACFG,EACJH,GAAW,OAAOA,GAAY,UAAY,YAAaA,EACnDA,EAAQ,QACRI,EAASJ,CAAO,EACdA,EACA,2BAA2BC,CAAS,qCAE5C,MAAME,CAAO,EACb,KAAK,UAAYF,EAGjB,OAAO,eAAe,KAAMF,EAAY,SAAS,CACnD,CACF,EAEaM,EAAN,MAAMC,UAAyBR,CAAY,CAChD,YACSS,EACAC,EACPL,EACA,CACA,MAAM,CACJ,UAAW,IACX,QACEA,GACA,oBAAoBK,EAAS,SAAS,CAAC,2BAA2BD,GAAS,SAAS,CAAC,EACzF,CAAC,EATM,aAAAA,EACA,cAAAC,EAWP,OAAO,eAAe,KAAMF,EAAiB,SAAS,CACxD,CACF,EAEaG,EAAN,MAAMC,UAAwBZ,CAAY,CAC/C,YAAYK,EAAkB,CAC5B,MAAM,CACJ,UAAW,IACX,QAASA,GAAW,mDACtB,CAAC,EAGD,OAAO,eAAe,KAAMO,EAAgB,SAAS,CACvD,CACF,EAEaC,EAAN,MAAMC,UAA0Bd,CAAY,CACjD,YAAYK,EAAkB,CAC5B,MAAM,CACJ,UAAW,IACX,QAASA,GAAW,gDACtB,CAAC,EAGD,OAAO,eAAe,KAAMS,EAAkB,SAAS,CACzD,CACF,EAEaC,EAAN,MAAMC,UAAsBhB,CAAY,CAC7C,YAAYE,EAA0D,CACpE,MAAM,CACJ,UAAW,IACX,QACEA,GAAS,UACRA,GAAS,GACNA,EAAQ,KACN,GAAGA,EAAQ,IAAI,SAASA,EAAQ,EAAE,0CAClC,cAAcA,EAAQ,EAAE,0CAC1BA,GAAS,KACP,GAAGA,EAAQ,IAAI,0CACf,+CACV,CAAC,EAGD,OAAO,eAAe,KAAMc,EAAc,SAAS,CACrD,CACF,ECvFO,IAAWC,OAChBA,EAAA,sBAAwB,wBACxBA,EAAA,sBAAwB,wBACxBA,EAAA,uBAAyB,yBAHTA,OAAA,IAMLb,EAAYc,GACvB,OAAOA,GAAQ,UAAYA,IAAQA,EAExBZ,EAAYY,GACvB,OAAOA,GAAQ,SAEJC,EAAwBC,GAA2B,CAC9D,GAAI,CAACd,EAASc,CAAK,GAAKA,EAAM,SAAW,EACvC,MAAM,IAAIT,EAAgB,uBAAsC,EAElE,OAAOS,CACT,EAEaC,EAAwBD,GAA2B,CAC9D,GAAI,CAAChB,EAASgB,CAAK,GAAKA,GAAS,EAC/B,MAAM,IAAIT,EAAgB,uBAAsC,EAElE,OAAOS,CACT,EAEaE,EAAwBF,GAA0B,CAC7D,IAAMG,EAAS,OAAOH,CAAK,EAC3B,GAAIG,EAAS,EACX,MAAM,IAAIZ,EAAgB,wBAAuC,EAEnE,OAAOY,CACT","sourcesContent":["import { isNumber, isString } from '../validation';\n\nexport class EmmettError extends Error {\n public errorCode: number;\n\n constructor(\n options?: { errorCode: number; message?: string } | string | number,\n ) {\n const errorCode =\n options && typeof options === 'object' && 'errorCode' in options\n ? options.errorCode\n : isNumber(options)\n ? options\n : 500;\n const message =\n options && typeof options === 'object' && 'message' in options\n ? options.message\n : isString(options)\n ? options\n : `Error with status code '${errorCode}' ocurred during Emmett processing`;\n\n super(message);\n this.errorCode = errorCode;\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, EmmettError.prototype);\n }\n}\n\nexport class ConcurrencyError extends EmmettError {\n constructor(\n public current: string | undefined,\n public expected: string,\n message?: string,\n ) {\n super({\n errorCode: 412,\n message:\n message ??\n `Expected version ${expected.toString()} does not match current ${current?.toString()}`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ConcurrencyError.prototype);\n }\n}\n\nexport class ValidationError extends EmmettError {\n constructor(message?: string) {\n super({\n errorCode: 400,\n message: message ?? `Validation Error ocurred during Emmett processing`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\nexport class IllegalStateError extends EmmettError {\n constructor(message?: string) {\n super({\n errorCode: 403,\n message: message ?? `Illegal State ocurred during Emmett processing`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, IllegalStateError.prototype);\n }\n}\n\nexport class NotFoundError extends EmmettError {\n constructor(options?: { id: string; type: string; message?: string }) {\n super({\n errorCode: 404,\n message:\n options?.message ??\n (options?.id\n ? options.type\n ? `${options.type} with ${options.id} was not found during Emmett processing`\n : `State with ${options.id} was not found during Emmett processing`\n : options?.type\n ? `${options.type} was not found during Emmett processing`\n : 'State was not found during Emmett processing'),\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, NotFoundError.prototype);\n }\n}\n","import { ValidationError } from '../errors';\n\nexport const enum ValidationErrors {\n NOT_A_NONEMPTY_STRING = 'NOT_A_NONEMPTY_STRING',\n NOT_A_POSITIVE_NUMBER = 'NOT_A_POSITIVE_NUMBER',\n NOT_AN_UNSIGNED_BIGINT = 'NOT_AN_UNSIGNED_BIGINT',\n}\n\nexport const isNumber = (val: unknown): val is number =>\n typeof val === 'number' && val === val;\n\nexport const isString = (val: unknown): val is string =>\n typeof val === 'string';\n\nexport const assertNotEmptyString = (value: unknown): string => {\n if (!isString(value) || value.length === 0) {\n throw new ValidationError(ValidationErrors.NOT_A_NONEMPTY_STRING);\n }\n return value;\n};\n\nexport const assertPositiveNumber = (value: unknown): number => {\n if (!isNumber(value) || value <= 0) {\n throw new ValidationError(ValidationErrors.NOT_A_POSITIVE_NUMBER);\n }\n return value;\n};\n\nexport const assertUnsignedBigInt = (value: string): bigint => {\n const number = BigInt(value);\n if (number < 0) {\n throw new ValidationError(ValidationErrors.NOT_AN_UNSIGNED_BIGINT);\n }\n return number;\n};\n"]}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var o={};exports.a = o;
2
+ //# sourceMappingURL=chunk-WIMBG2PX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/index.ts"],"names":["utils_default"],"mappings":"AAGA,IAAOA,EAAQ,CAAC","sourcesContent":["export * from './iterators';\nexport * from './merge';\n\nexport default {};\n"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-XLZS42HB.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ var i=(r,t,u,o,d=()=>{})=>{let n=!1,f=r.map(e=>u(e)?(n=!0,o(e)):e).filter(e=>e!==void 0).map(e=>{if(!e)throw Error("That should not happen");return e});return!n&&d()!==void 0?[...r,t]:f};export{i as a};
2
+ //# sourceMappingURL=chunk-YKFEDBH4.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/merge.ts"],"sourcesContent":["export const merge = <T>(\n array: T[],\n item: T,\n where: (current: T) => boolean,\n onExisting: (current: T) => T,\n onNotFound: () => T | undefined = () => undefined,\n) => {\n let wasFound = false;\n\n const result = array\n // merge the existing item if matches condition\n .map((p: T) => {\n if (!where(p)) return p;\n\n wasFound = true;\n return onExisting(p);\n })\n // filter out item if undefined was returned\n // for cases of removal\n .filter((p) => p !== undefined)\n // make TypeScript happy\n .map((p) => {\n if (!p) throw Error('That should not happen');\n\n return p;\n });\n\n // if item was not found and onNotFound action is defined\n // try to generate new item\n if (!wasFound) {\n const result = onNotFound();\n\n if (result !== undefined) return [...array, item];\n }\n\n return result;\n};\n"],"mappings":"AAAO,IAAMA,EAAQ,CACnBC,EACAC,EACAC,EACAC,EACAC,EAAkC,IAAG,KAClC,CACH,IAAIC,EAAW,GAETC,EAASN,EAEZ,IAAKO,GACCL,EAAMK,CAAC,GAEZF,EAAW,GACJF,EAAWI,CAAC,GAHGA,CAIvB,EAGA,OAAQA,GAAMA,IAAM,MAAS,EAE7B,IAAKA,GAAM,CACV,GAAI,CAACA,EAAG,MAAM,MAAM,wBAAwB,EAE5C,OAAOA,CACT,CAAC,EAIH,MAAI,CAACF,GACYD,EAAW,IAEX,OAAkB,CAAC,GAAGJ,EAAOC,CAAI,EAG3CK,CACT","names":["merge","array","item","where","onExisting","onNotFound","wasFound","result","p"]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=chunk-YKICRTHH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,2 @@
1
+ var s=class t extends Error{errorCode;constructor(e){let o=e&&typeof e=="object"&&"errorCode"in e?e.errorCode:i(e)?e:500,r=e&&typeof e=="object"&&"message"in e?e.message:g(e)?e:`Error with status code '${o}' ocurred during Emmett processing`;super(r),this.errorCode=o,Object.setPrototypeOf(this,t.prototype)}},c=class t extends s{constructor(o,r,m){super({errorCode:412,message:m??`Expected version ${r.toString()} does not match current ${o?.toString()}`});this.current=o;this.expected=r;Object.setPrototypeOf(this,t.prototype)}},n=class t extends s{constructor(e){super({errorCode:400,message:e??"Validation Error ocurred during Emmett processing"}),Object.setPrototypeOf(this,t.prototype)}},u=class t extends s{constructor(e){super({errorCode:403,message:e??"Illegal State ocurred during Emmett processing"}),Object.setPrototypeOf(this,t.prototype)}},d=class t extends s{constructor(e){super({errorCode:404,message:e?.message??(e?.id?e.type?`${e.type} with ${e.id} was not found during Emmett processing`:`State with ${e.id} was not found during Emmett processing`:e?.type?`${e.type} was not found during Emmett processing`:"State was not found during Emmett processing")}),Object.setPrototypeOf(this,t.prototype)}};var p=(r=>(r.NOT_A_NONEMPTY_STRING="NOT_A_NONEMPTY_STRING",r.NOT_A_POSITIVE_NUMBER="NOT_A_POSITIVE_NUMBER",r.NOT_AN_UNSIGNED_BIGINT="NOT_AN_UNSIGNED_BIGINT",r))(p||{}),i=t=>typeof t=="number"&&t===t,g=t=>typeof t=="string",_=t=>{if(!g(t)||t.length===0)throw new n("NOT_A_NONEMPTY_STRING");return t},b=t=>{if(!i(t)||t<=0)throw new n("NOT_A_POSITIVE_NUMBER");return t},T=t=>{let e=BigInt(t);if(e<0)throw new n("NOT_AN_UNSIGNED_BIGINT");return e};export{p as a,i as b,g as c,_ as d,b as e,T as f,s as g,c as h,n as i,u as j,d as k};
2
+ //# sourceMappingURL=chunk-YV6PB6LX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors/index.ts","../src/validation/index.ts"],"sourcesContent":["import { isNumber, isString } from '../validation';\n\nexport class EmmettError extends Error {\n public errorCode: number;\n\n constructor(\n options?: { errorCode: number; message?: string } | string | number,\n ) {\n const errorCode =\n options && typeof options === 'object' && 'errorCode' in options\n ? options.errorCode\n : isNumber(options)\n ? options\n : 500;\n const message =\n options && typeof options === 'object' && 'message' in options\n ? options.message\n : isString(options)\n ? options\n : `Error with status code '${errorCode}' ocurred during Emmett processing`;\n\n super(message);\n this.errorCode = errorCode;\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, EmmettError.prototype);\n }\n}\n\nexport class ConcurrencyError extends EmmettError {\n constructor(\n public current: string | undefined,\n public expected: string,\n message?: string,\n ) {\n super({\n errorCode: 412,\n message:\n message ??\n `Expected version ${expected.toString()} does not match current ${current?.toString()}`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ConcurrencyError.prototype);\n }\n}\n\nexport class ValidationError extends EmmettError {\n constructor(message?: string) {\n super({\n errorCode: 400,\n message: message ?? `Validation Error ocurred during Emmett processing`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, ValidationError.prototype);\n }\n}\n\nexport class IllegalStateError extends EmmettError {\n constructor(message?: string) {\n super({\n errorCode: 403,\n message: message ?? `Illegal State ocurred during Emmett processing`,\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, IllegalStateError.prototype);\n }\n}\n\nexport class NotFoundError extends EmmettError {\n constructor(options?: { id: string; type: string; message?: string }) {\n super({\n errorCode: 404,\n message:\n options?.message ??\n (options?.id\n ? options.type\n ? `${options.type} with ${options.id} was not found during Emmett processing`\n : `State with ${options.id} was not found during Emmett processing`\n : options?.type\n ? `${options.type} was not found during Emmett processing`\n : 'State was not found during Emmett processing'),\n });\n\n // 👇️ because we are extending a built-in class\n Object.setPrototypeOf(this, NotFoundError.prototype);\n }\n}\n","import { ValidationError } from '../errors';\n\nexport const enum ValidationErrors {\n NOT_A_NONEMPTY_STRING = 'NOT_A_NONEMPTY_STRING',\n NOT_A_POSITIVE_NUMBER = 'NOT_A_POSITIVE_NUMBER',\n NOT_AN_UNSIGNED_BIGINT = 'NOT_AN_UNSIGNED_BIGINT',\n}\n\nexport const isNumber = (val: unknown): val is number =>\n typeof val === 'number' && val === val;\n\nexport const isString = (val: unknown): val is string =>\n typeof val === 'string';\n\nexport const assertNotEmptyString = (value: unknown): string => {\n if (!isString(value) || value.length === 0) {\n throw new ValidationError(ValidationErrors.NOT_A_NONEMPTY_STRING);\n }\n return value;\n};\n\nexport const assertPositiveNumber = (value: unknown): number => {\n if (!isNumber(value) || value <= 0) {\n throw new ValidationError(ValidationErrors.NOT_A_POSITIVE_NUMBER);\n }\n return value;\n};\n\nexport const assertUnsignedBigInt = (value: string): bigint => {\n const number = BigInt(value);\n if (number < 0) {\n throw new ValidationError(ValidationErrors.NOT_AN_UNSIGNED_BIGINT);\n }\n return number;\n};\n"],"mappings":"AAEO,IAAMA,EAAN,MAAMC,UAAoB,KAAM,CAC9B,UAEP,YACEC,EACA,CACA,IAAMC,EACJD,GAAW,OAAOA,GAAY,UAAY,cAAeA,EACrDA,EAAQ,UACRE,EAASF,CAAO,EACdA,EACA,IACFG,EACJH,GAAW,OAAOA,GAAY,UAAY,YAAaA,EACnDA,EAAQ,QACRI,EAASJ,CAAO,EACdA,EACA,2BAA2BC,CAAS,qCAE5C,MAAME,CAAO,EACb,KAAK,UAAYF,EAGjB,OAAO,eAAe,KAAMF,EAAY,SAAS,CACnD,CACF,EAEaM,EAAN,MAAMC,UAAyBR,CAAY,CAChD,YACSS,EACAC,EACPL,EACA,CACA,MAAM,CACJ,UAAW,IACX,QACEA,GACA,oBAAoBK,EAAS,SAAS,CAAC,2BAA2BD,GAAS,SAAS,CAAC,EACzF,CAAC,EATM,aAAAA,EACA,cAAAC,EAWP,OAAO,eAAe,KAAMF,EAAiB,SAAS,CACxD,CACF,EAEaG,EAAN,MAAMC,UAAwBZ,CAAY,CAC/C,YAAYK,EAAkB,CAC5B,MAAM,CACJ,UAAW,IACX,QAASA,GAAW,mDACtB,CAAC,EAGD,OAAO,eAAe,KAAMO,EAAgB,SAAS,CACvD,CACF,EAEaC,EAAN,MAAMC,UAA0Bd,CAAY,CACjD,YAAYK,EAAkB,CAC5B,MAAM,CACJ,UAAW,IACX,QAASA,GAAW,gDACtB,CAAC,EAGD,OAAO,eAAe,KAAMS,EAAkB,SAAS,CACzD,CACF,EAEaC,EAAN,MAAMC,UAAsBhB,CAAY,CAC7C,YAAYE,EAA0D,CACpE,MAAM,CACJ,UAAW,IACX,QACEA,GAAS,UACRA,GAAS,GACNA,EAAQ,KACN,GAAGA,EAAQ,IAAI,SAASA,EAAQ,EAAE,0CAClC,cAAcA,EAAQ,EAAE,0CAC1BA,GAAS,KACP,GAAGA,EAAQ,IAAI,0CACf,+CACV,CAAC,EAGD,OAAO,eAAe,KAAMc,EAAc,SAAS,CACrD,CACF,ECvFO,IAAWC,OAChBA,EAAA,sBAAwB,wBACxBA,EAAA,sBAAwB,wBACxBA,EAAA,uBAAyB,yBAHTA,OAAA,IAMLC,EAAYC,GACvB,OAAOA,GAAQ,UAAYA,IAAQA,EAExBC,EAAYD,GACvB,OAAOA,GAAQ,SAEJE,EAAwBC,GAA2B,CAC9D,GAAI,CAACF,EAASE,CAAK,GAAKA,EAAM,SAAW,EACvC,MAAM,IAAIC,EAAgB,uBAAsC,EAElE,OAAOD,CACT,EAEaE,EAAwBF,GAA2B,CAC9D,GAAI,CAACJ,EAASI,CAAK,GAAKA,GAAS,EAC/B,MAAM,IAAIC,EAAgB,uBAAsC,EAElE,OAAOD,CACT,EAEaG,EAAwBH,GAA0B,CAC7D,IAAMI,EAAS,OAAOJ,CAAK,EAC3B,GAAII,EAAS,EACX,MAAM,IAAIH,EAAgB,wBAAuC,EAEnE,OAAOG,CACT","names":["EmmettError","_EmmettError","options","errorCode","isNumber","message","isString","ConcurrencyError","_ConcurrencyError","current","expected","ValidationError","_ValidationError","IllegalStateError","_IllegalStateError","NotFoundError","_NotFoundError","ValidationErrors","isNumber","val","isString","assertNotEmptyString","value","ValidationError","assertPositiveNumber","assertUnsignedBigInt","number"]}
@@ -0,0 +1 @@
1
+ "use strict";//# sourceMappingURL=chunk-Z7EDILIO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":""}
@@ -1,33 +1,2 @@
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; }
2
-
3
-
4
- var _eventStore = require('../eventStore');
5
- const CommandHandler = (evolve, getInitialState, mapToStreamId = (id) => id) => async (eventStore, id, handle, options) => {
6
- const streamName = mapToStreamId(id);
7
- const aggregationResult = await eventStore.aggregateStream(streamName, {
8
- evolve,
9
- getInitialState,
10
- read: {
11
- // expected stream version is passed to fail fast
12
- // if stream is in the wrong state
13
- expectedStreamVersion: _nullishCoalesce(_optionalChain([options, 'optionalAccess', _ => _.expectedStreamVersion]), () => ( _eventStore.NO_CONCURRENCY_CHECK))
14
- }
15
- });
16
- const state = _nullishCoalesce(_optionalChain([aggregationResult, 'optionalAccess', _2 => _2.state]), () => ( getInitialState()));
17
- const currentStreamVersion = _optionalChain([aggregationResult, 'optionalAccess', _3 => _3.currentStreamVersion]);
18
- const result = handle(state);
19
- const newEvents = Array.isArray(result) ? result : [result];
20
- const expectedStreamVersion = _nullishCoalesce(_nullishCoalesce(_optionalChain([options, 'optionalAccess', _4 => _4.expectedStreamVersion]), () => ( currentStreamVersion)), () => ( _eventStore.STREAM_DOES_NOT_EXIST));
21
- const appendResult = await eventStore.appendToStream(
22
- streamName,
23
- newEvents,
24
- {
25
- expectedStreamVersion
26
- }
27
- );
28
- return { ...appendResult, newState: newEvents.reduce(evolve, state) };
29
- };
30
-
31
-
32
- exports.CommandHandler = CommandHandler;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkOYAO7QEPjs = require('../chunk-OYAO7QEP.js');require('../chunk-2452BJTJ.js');require('../chunk-BM2H4NCZ.js');require('../chunk-IJGC6SHP.js');require('../chunk-46YIPCSN.js');require('../chunk-UUCTMJK7.js');exports.CommandHandler = _chunkOYAO7QEPjs.a;
33
2
  //# sourceMappingURL=handleCommand.js.map
@@ -1 +1 @@
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"]}
1
+ {"version":3,"sources":[],"names":[],"mappings":""}