@event-driven-io/emmett-expressjs 0.11.2 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/application.js +1 -1
  2. package/dist/application.mjs +1 -1
  3. package/dist/{chunk-CRSLFS6Q.js → chunk-2OMIUKHG.js} +2 -2
  4. package/dist/{chunk-TIHSL46W.js → chunk-2ZZC7RGZ.js} +2 -2
  5. package/dist/{chunk-TIHSL46W.js.map → chunk-2ZZC7RGZ.js.map} +1 -1
  6. package/dist/{chunk-EVM4ZBYB.mjs → chunk-33CTWFPV.mjs} +2 -2
  7. package/dist/{chunk-3SNIQKLF.mjs → chunk-3A5QCRIL.mjs} +2 -2
  8. package/dist/{chunk-Y43VLATL.mjs → chunk-4YSVF3JC.mjs} +2 -2
  9. package/dist/{chunk-Y43VLATL.mjs.map → chunk-4YSVF3JC.mjs.map} +1 -1
  10. package/dist/{chunk-NFF4ZR5G.js → chunk-BAE5MJFD.js} +2 -2
  11. package/dist/{chunk-IJQIPTU6.js → chunk-BAXKZVNV.js} +2 -2
  12. package/dist/chunk-FPBLKFXX.mjs +7 -0
  13. package/dist/chunk-FPBLKFXX.mjs.map +1 -0
  14. package/dist/{chunk-TZWWEITQ.mjs → chunk-FX4MW62Q.mjs} +2 -2
  15. package/dist/{chunk-56DKNUKX.mjs → chunk-FZF5SWLV.mjs} +2 -2
  16. package/dist/{chunk-BTHOS2SZ.js → chunk-RQIBUNWK.js} +2 -2
  17. package/dist/chunk-SUF35K5H.js +7 -0
  18. package/dist/chunk-SUF35K5H.js.map +1 -0
  19. package/dist/e2e/decider/api.js +1 -1
  20. package/dist/e2e/decider/api.mjs +1 -1
  21. package/dist/e2e/decider/businessLogic.js +1 -1
  22. package/dist/e2e/decider/businessLogic.mjs +1 -1
  23. package/dist/e2e/decider/shoppingCart.js +1 -1
  24. package/dist/e2e/decider/shoppingCart.mjs +1 -1
  25. package/dist/e2e/testing.js +1 -1
  26. package/dist/e2e/testing.mjs +1 -1
  27. package/dist/etag.js +1 -1
  28. package/dist/etag.mjs +1 -1
  29. package/dist/handler.js +1 -1
  30. package/dist/handler.mjs +1 -1
  31. package/dist/index.js +1 -1
  32. package/dist/index.mjs +1 -1
  33. package/dist/middlewares/problemDetailsMiddleware.js +1 -1
  34. package/dist/middlewares/problemDetailsMiddleware.mjs +1 -1
  35. package/dist/responses.js +1 -1
  36. package/dist/responses.mjs +1 -1
  37. package/dist/testing/apiE2ESpecification.js +1 -1
  38. package/dist/testing/apiE2ESpecification.mjs +1 -1
  39. package/dist/testing/apiSpecification.js +1 -1
  40. package/dist/testing/apiSpecification.mjs +1 -1
  41. package/dist/testing/index.js +1 -1
  42. package/dist/testing/index.mjs +1 -1
  43. package/package.json +2 -2
  44. package/dist/chunk-CIIR5CXZ.js +0 -8
  45. package/dist/chunk-CIIR5CXZ.js.map +0 -1
  46. package/dist/chunk-IQQWOHEF.mjs +0 -8
  47. package/dist/chunk-IQQWOHEF.mjs.map +0 -1
  48. /package/dist/{chunk-CRSLFS6Q.js.map → chunk-2OMIUKHG.js.map} +0 -0
  49. /package/dist/{chunk-EVM4ZBYB.mjs.map → chunk-33CTWFPV.mjs.map} +0 -0
  50. /package/dist/{chunk-3SNIQKLF.mjs.map → chunk-3A5QCRIL.mjs.map} +0 -0
  51. /package/dist/{chunk-NFF4ZR5G.js.map → chunk-BAE5MJFD.js.map} +0 -0
  52. /package/dist/{chunk-IJQIPTU6.js.map → chunk-BAXKZVNV.js.map} +0 -0
  53. /package/dist/{chunk-TZWWEITQ.mjs.map → chunk-FX4MW62Q.mjs.map} +0 -0
  54. /package/dist/{chunk-56DKNUKX.mjs.map → chunk-FZF5SWLV.mjs.map} +0 -0
  55. /package/dist/{chunk-BTHOS2SZ.js.map → chunk-RQIBUNWK.js.map} +0 -0
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkNFF4ZR5Gjs = require('./chunk-NFF4ZR5G.js');require('./chunk-7H3QW2YD.js');require('./chunk-IJQIPTU6.js');require('./chunk-TIHSL46W.js');require('./chunk-NZI5RAYP.js');require('./chunk-E4DZPUJH.js');require('./chunk-CIIR5CXZ.js');exports.getApplication = _chunkNFF4ZR5Gjs.o; exports.startAPI = _chunkNFF4ZR5Gjs.p;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkBAE5MJFDjs = require('./chunk-BAE5MJFD.js');require('./chunk-7H3QW2YD.js');require('./chunk-BAXKZVNV.js');require('./chunk-2ZZC7RGZ.js');require('./chunk-NZI5RAYP.js');require('./chunk-E4DZPUJH.js');require('./chunk-SUF35K5H.js');exports.getApplication = _chunkBAE5MJFDjs.o; exports.startAPI = _chunkBAE5MJFDjs.p;
2
2
  //# sourceMappingURL=application.js.map
@@ -1,2 +1,2 @@
1
- import{o as a,p as b}from"./chunk-56DKNUKX.mjs";import"./chunk-HKEQAT6F.mjs";import"./chunk-3SNIQKLF.mjs";import"./chunk-Y43VLATL.mjs";import"./chunk-5C7LP2V7.mjs";import"./chunk-GEU24YU2.mjs";import"./chunk-IQQWOHEF.mjs";export{a as getApplication,b as startAPI};
1
+ import{o as a,p as b}from"./chunk-FZF5SWLV.mjs";import"./chunk-HKEQAT6F.mjs";import"./chunk-3A5QCRIL.mjs";import"./chunk-4YSVF3JC.mjs";import"./chunk-5C7LP2V7.mjs";import"./chunk-GEU24YU2.mjs";import"./chunk-FPBLKFXX.mjs";export{a as getApplication,b as startAPI};
2
2
  //# sourceMappingURL=application.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkCIIR5CXZjs = require('./chunk-CIIR5CXZ.js');var o=(n=>(n.Empty="Empty",n.Pending="Pending",n.Confirmed="Confirmed",n.Canceled="Canceled",n))(o||{}),c= exports.b ={status:"Empty"},a= exports.c =(e,{type:i,data:r})=>{switch(i){case"ShoppingCartOpened":return{id:r.shoppingCartId,clientId:r.clientId,openedAt:r.openedAt,productItems:[],status:"Pending"};case"ProductItemAddedToShoppingCart":{if(e.status!=="Pending")return e;let{productItems:d}=e,{productItem:n}=r;return{...e,productItems:_chunkCIIR5CXZjs.l.call(void 0, d,n,t=>t.productId===n.productId&&t.unitPrice===n.unitPrice,t=>({...t,quantity:t.quantity+n.quantity}),()=>n)}}case"ProductItemRemovedFromShoppingCart":{if(e.status!=="Pending")return e;let{productItems:d}=e,{productItem:n}=r;return{...e,productItems:_chunkCIIR5CXZjs.l.call(void 0, d,n,t=>t.productId===n.productId&&t.unitPrice===n.unitPrice,t=>({...t,quantity:t.quantity-n.quantity}))}}case"ShoppingCartConfirmed":return e.status!=="Pending"?e:{...e,status:"Confirmed",confirmedAt:r.confirmedAt};case"ShoppingCartCanceled":return e.status!=="Pending"?e:{...e,status:"Canceled",canceledAt:r.canceledAt}}},s= exports.d =e=>e.reduce(a,c),u= exports.e =(t=>(t.CART_IS_ALREADY_CLOSED="CART_IS_ALREADY_CLOSED",t.PRODUCT_ITEM_NOT_FOUND="PRODUCT_ITEM_NOT_FOUND",t.CART_IS_EMPTY="CART_IS_EMPTY",t.UNKNOWN_EVENT_TYPE="UNKNOWN_EVENT_TYPE",t.UNKNOWN_COMMAND_TYPE="UNKNOWN_COMMAND_TYPE",t))(u||{});exports.a = o; exports.b = c; exports.c = a; exports.d = s; exports.e = u;
2
- //# sourceMappingURL=chunk-CRSLFS6Q.js.map
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkSUF35K5Hjs = require('./chunk-SUF35K5H.js');var o=(n=>(n.Empty="Empty",n.Pending="Pending",n.Confirmed="Confirmed",n.Canceled="Canceled",n))(o||{}),c= exports.b ={status:"Empty"},a= exports.c =(e,{type:i,data:r})=>{switch(i){case"ShoppingCartOpened":return{id:r.shoppingCartId,clientId:r.clientId,openedAt:r.openedAt,productItems:[],status:"Pending"};case"ProductItemAddedToShoppingCart":{if(e.status!=="Pending")return e;let{productItems:d}=e,{productItem:n}=r;return{...e,productItems:_chunkSUF35K5Hjs.l.call(void 0, d,n,t=>t.productId===n.productId&&t.unitPrice===n.unitPrice,t=>({...t,quantity:t.quantity+n.quantity}),()=>n)}}case"ProductItemRemovedFromShoppingCart":{if(e.status!=="Pending")return e;let{productItems:d}=e,{productItem:n}=r;return{...e,productItems:_chunkSUF35K5Hjs.l.call(void 0, d,n,t=>t.productId===n.productId&&t.unitPrice===n.unitPrice,t=>({...t,quantity:t.quantity-n.quantity}))}}case"ShoppingCartConfirmed":return e.status!=="Pending"?e:{...e,status:"Confirmed",confirmedAt:r.confirmedAt};case"ShoppingCartCanceled":return e.status!=="Pending"?e:{...e,status:"Canceled",canceledAt:r.canceledAt}}},s= exports.d =e=>e.reduce(a,c),u= exports.e =(t=>(t.CART_IS_ALREADY_CLOSED="CART_IS_ALREADY_CLOSED",t.PRODUCT_ITEM_NOT_FOUND="PRODUCT_ITEM_NOT_FOUND",t.CART_IS_EMPTY="CART_IS_EMPTY",t.UNKNOWN_EVENT_TYPE="UNKNOWN_EVENT_TYPE",t.UNKNOWN_COMMAND_TYPE="UNKNOWN_COMMAND_TYPE",t))(u||{});exports.a = o; exports.b = c; exports.c = a; exports.d = s; exports.e = u;
2
+ //# sourceMappingURL=chunk-2OMIUKHG.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkCIIR5CXZjs = require('./chunk-CIIR5CXZ.js');require('express');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var R=(t,e)=>[t,e],b= exports.b =(t,e)=>[t,e],g= exports.c =(t,e)=>[t,e],f= exports.d =(t,e)=>r=>{let{body:s,headers:o}=_nullishCoalesce(e, () => ({}));_chunkCIIR5CXZjs.e.call(void 0, r.statusCode,t),s&&_chunkCIIR5CXZjs.c.call(void 0, r.body,s),o&&_chunkCIIR5CXZjs.c.call(void 0, r.headers,o)},h= exports.e =(t,e)=>f(t,e?{body:e}:void 0),q= exports.f ={for:(t,e)=>(...r)=>{let s=_chunkCIIR5CXZjs.a.call(void 0, t()),o=e(s);return{when:y=>{let m=async()=>{for(let[n,p]of r)await s.setup(n,p);return y(_supertest2.default.call(void 0, o))};return{then:async n=>{let p=await m();if(typeof n=="function")n(p)===!1&&_chunkCIIR5CXZjs.b.call(void 0, );else if(Array.isArray(n)){let[i,...T]=n;typeof i=="function"&&i(p)===!1&&_chunkCIIR5CXZjs.b.call(void 0, );let u=typeof i=="function"?T:n;_chunkCIIR5CXZjs.c.call(void 0, Array.from(s.appendedEvents.values()),u)}}}}}}};exports.a = R; exports.b = b; exports.c = g; exports.d = f; exports.e = h; exports.f = q;
2
- //# sourceMappingURL=chunk-TIHSL46W.js.map
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkSUF35K5Hjs = require('./chunk-SUF35K5H.js');require('express');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var R=(t,e)=>[t,e],b= exports.b =(t,e)=>[t,e],g= exports.c =(t,e)=>[t,e],f= exports.d =(t,e)=>r=>{let{body:s,headers:o}=_nullishCoalesce(e, () => ({}));_chunkSUF35K5Hjs.e.call(void 0, r.statusCode,t),s&&_chunkSUF35K5Hjs.c.call(void 0, r.body,s),o&&_chunkSUF35K5Hjs.c.call(void 0, r.headers,o)},h= exports.e =(t,e)=>f(t,e?{body:e}:void 0),q= exports.f ={for:(t,e)=>(...r)=>{let s=_chunkSUF35K5Hjs.a.call(void 0, t()),o=e(s);return{when:y=>{let m=async()=>{for(let[n,p]of r)await s.setup(n,p);return y(_supertest2.default.call(void 0, o))};return{then:async n=>{let p=await m();if(typeof n=="function")n(p)===!1&&_chunkSUF35K5Hjs.b.call(void 0, );else if(Array.isArray(n)){let[i,...T]=n;typeof i=="function"&&i(p)===!1&&_chunkSUF35K5Hjs.b.call(void 0, );let u=typeof i=="function"?T:n;_chunkSUF35K5Hjs.c.call(void 0, Array.from(s.appendedEvents.values()),u)}}}}}}};exports.a = R; exports.b = b; exports.c = g; exports.d = f; exports.e = h; exports.f = q;
2
+ //# sourceMappingURL=chunk-2ZZC7RGZ.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/testing/apiSpecification.ts"],"names":["supertest","existingStream","streamId","events","expect","expectNewEvents","expectResponse","statusCode","options","response","body","headers","i","k","expectError","errorCode","problemDetails","ApiSpecification","getEventStore","getApplication","givenStreams","eventStore","S","application","setupRequest","handle","streamName","verify","d","first","rest"],"mappings":"6DAUA,MAAiC,UAGjC,OAAOA,MAAe,YASf,IAAMC,EAAiB,CAC5BC,EACAC,IAEO,CAACD,EAAUC,CAAM,EAcbC,EAAS,CACpBF,EACAC,IAEO,CAACD,EAAUC,CAAM,EAGbE,EAAkB,CAC7BH,EACAC,IAEO,CAACD,EAAUC,CAAM,EAGbG,EACX,CACEC,EACAC,IAEDC,GAA6B,CAC5B,GAAM,CAAE,KAAAC,EAAM,QAAAC,CAAQ,EAAIH,GAAW,CAAC,EACtCI,EAAYH,EAAS,WAAYF,CAAU,EACvCG,GAAMG,EAAcJ,EAAS,KAAMC,CAAI,EACvCC,GAASE,EAAcJ,EAAS,QAASE,CAAO,CACtD,EAEWG,EAAc,CACzBC,EACAC,IAEAV,EACES,EACAC,EAAiB,CAAE,KAAMA,CAAe,EAAI,MAC9C,EAcWC,EAAmB,CAC9B,IAAK,CAIHC,EACAC,IAGS,IAAIC,IAA+C,CACxD,IAAMC,EAAaC,EAAeJ,EAAc,CAAC,EAC3CK,EAAcJ,EAAeE,CAAU,EAE7C,MAAO,CACL,KAAOG,GAA8B,CACnC,IAAMC,EAAS,SAAY,CACzB,OAAW,CAACC,EAAYvB,CAAM,IAAKiB,EACjC,MAAMC,EAAW,MAAMK,EAAYvB,CAAM,EAG3C,OAAOqB,EAAaxB,EAAUuB,CAAW,CAAC,CAC5C,EAEA,MAAO,CACL,KAAM,MACJI,GACkB,CAClB,IAAMlB,EAAW,MAAMgB,EAAO,EAE9B,GAAI,OAAOE,GAAW,WACFA,EAAOlB,CAAQ,IAEf,IAAOmB,EAAY,UAC5B,MAAM,QAAQD,CAAM,EAAG,CAChC,GAAM,CAACE,EAAO,GAAGC,CAAI,EAAIH,EAErB,OAAOE,GAAU,YACDA,EAAMpB,CAAQ,IAEd,IAAOmB,EAAY,EAGvC,IAAMzB,EAAS,OAAO0B,GAAU,WAAaC,EAAOH,EAEpDd,EACE,MAAM,KAAKQ,EAAW,eAAe,OAAO,CAAC,EAC7ClB,CACF,CACF,CACF,CACF,CACF,CACF,CACF,CAGN","sourcesContent":["import {\n WrapEventStore,\n assertEqual,\n assertFails,\n assertMatches,\n type DefaultStreamVersionType,\n type Event,\n type EventStore,\n type TestEventStream,\n} from '@event-driven-io/emmett';\nimport { type Application } from 'express';\nimport type { ProblemDocument } from 'http-problem-details';\nimport type { Response, Test } from 'supertest';\nimport supertest from 'supertest';\nimport type TestAgent from 'supertest/lib/agent';\n\n////////////////////////////////\n/////////// Setup\n////////////////////////////////\n\nexport type TestRequest = (request: TestAgent<supertest.Test>) => Test;\n\nexport const existingStream = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\n////////////////////////////////\n/////////// Asserts\n////////////////////////////////\n\nexport type ResponseAssert = (response: Response) => boolean | void;\n\nexport type ApiSpecificationAssert<EventType extends Event = Event> =\n | TestEventStream<EventType>[]\n | ResponseAssert\n | [ResponseAssert, ...TestEventStream<EventType>[]];\n\nexport const expect = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\nexport const expectNewEvents = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\nexport const expectResponse =\n <Body = unknown>(\n statusCode: number,\n options?: { body?: Body; headers?: { [index: string]: string } },\n ) =>\n (response: Response): void => {\n const { body, headers } = options ?? {};\n assertEqual(response.statusCode, statusCode);\n if (body) assertMatches(response.body, body);\n if (headers) assertMatches(response.headers, headers);\n };\n\nexport const expectError = (\n errorCode: number,\n problemDetails?: Partial<ProblemDocument>,\n) =>\n expectResponse(\n errorCode,\n problemDetails ? { body: problemDetails } : undefined,\n );\n\n////////////////////////////////\n/////////// Api Specification\n////////////////////////////////\n\nexport type ApiSpecification<EventType extends Event = Event> = (\n ...givenStreams: TestEventStream<EventType>[]\n) => {\n when: (setupRequest: TestRequest) => {\n then: (verify: ApiSpecificationAssert<EventType>) => Promise<void>;\n };\n};\n\nexport const ApiSpecification = {\n for: <\n EventType extends Event = Event,\n StreamVersion = DefaultStreamVersionType,\n >(\n getEventStore: () => EventStore<StreamVersion>,\n getApplication: (eventStore: EventStore<StreamVersion>) => Application,\n ): ApiSpecification<EventType> => {\n {\n return (...givenStreams: TestEventStream<EventType>[]) => {\n const eventStore = WrapEventStore(getEventStore());\n const application = getApplication(eventStore);\n\n return {\n when: (setupRequest: TestRequest) => {\n const handle = async () => {\n for (const [streamName, events] of givenStreams) {\n await eventStore.setup(streamName, events);\n }\n\n return setupRequest(supertest(application));\n };\n\n return {\n then: async (\n verify: ApiSpecificationAssert<EventType>,\n ): Promise<void> => {\n const response = await handle();\n\n if (typeof verify === 'function') {\n const succeeded = verify(response);\n\n if (succeeded === false) assertFails();\n } else if (Array.isArray(verify)) {\n const [first, ...rest] = verify;\n\n if (typeof first === 'function') {\n const succeeded = first(response);\n\n if (succeeded === false) assertFails();\n }\n\n const events = typeof first === 'function' ? rest : verify;\n\n assertMatches(\n Array.from(eventStore.appendedEvents.values()),\n events,\n );\n }\n },\n };\n },\n };\n };\n }\n },\n};\n"]}
1
+ {"version":3,"sources":["../src/testing/apiSpecification.ts"],"names":["supertest","existingStream","streamId","events","expect","expectNewEvents","expectResponse","statusCode","options","response","body","headers","i","k","expectError","errorCode","problemDetails","ApiSpecification","getEventStore","getApplication","givenStreams","eventStore","S","application","setupRequest","handle","streamName","verify","p","first","rest"],"mappings":"6DAUA,MAAiC,UAGjC,OAAOA,MAAe,YASf,IAAMC,EAAiB,CAC5BC,EACAC,IAEO,CAACD,EAAUC,CAAM,EAcbC,EAAS,CACpBF,EACAC,IAEO,CAACD,EAAUC,CAAM,EAGbE,EAAkB,CAC7BH,EACAC,IAEO,CAACD,EAAUC,CAAM,EAGbG,EACX,CACEC,EACAC,IAEDC,GAA6B,CAC5B,GAAM,CAAE,KAAAC,EAAM,QAAAC,CAAQ,EAAIH,GAAW,CAAC,EACtCI,EAAYH,EAAS,WAAYF,CAAU,EACvCG,GAAMG,EAAcJ,EAAS,KAAMC,CAAI,EACvCC,GAASE,EAAcJ,EAAS,QAASE,CAAO,CACtD,EAEWG,EAAc,CACzBC,EACAC,IAEAV,EACES,EACAC,EAAiB,CAAE,KAAMA,CAAe,EAAI,MAC9C,EAcWC,EAAmB,CAC9B,IAAK,CAIHC,EACAC,IAGS,IAAIC,IAA+C,CACxD,IAAMC,EAAaC,EAAeJ,EAAc,CAAC,EAC3CK,EAAcJ,EAAeE,CAAU,EAE7C,MAAO,CACL,KAAOG,GAA8B,CACnC,IAAMC,EAAS,SAAY,CACzB,OAAW,CAACC,EAAYvB,CAAM,IAAKiB,EACjC,MAAMC,EAAW,MAAMK,EAAYvB,CAAM,EAG3C,OAAOqB,EAAaxB,EAAUuB,CAAW,CAAC,CAC5C,EAEA,MAAO,CACL,KAAM,MACJI,GACkB,CAClB,IAAMlB,EAAW,MAAMgB,EAAO,EAE9B,GAAI,OAAOE,GAAW,WACFA,EAAOlB,CAAQ,IAEf,IAAOmB,EAAY,UAC5B,MAAM,QAAQD,CAAM,EAAG,CAChC,GAAM,CAACE,EAAO,GAAGC,CAAI,EAAIH,EAErB,OAAOE,GAAU,YACDA,EAAMpB,CAAQ,IAEd,IAAOmB,EAAY,EAGvC,IAAMzB,EAAS,OAAO0B,GAAU,WAAaC,EAAOH,EAEpDd,EACE,MAAM,KAAKQ,EAAW,eAAe,OAAO,CAAC,EAC7ClB,CACF,CACF,CACF,CACF,CACF,CACF,CACF,CAGN","sourcesContent":["import {\n WrapEventStore,\n assertEqual,\n assertFails,\n assertMatches,\n type DefaultStreamVersionType,\n type Event,\n type EventStore,\n type TestEventStream,\n} from '@event-driven-io/emmett';\nimport { type Application } from 'express';\nimport type { ProblemDocument } from 'http-problem-details';\nimport type { Response, Test } from 'supertest';\nimport supertest from 'supertest';\nimport type TestAgent from 'supertest/lib/agent';\n\n////////////////////////////////\n/////////// Setup\n////////////////////////////////\n\nexport type TestRequest = (request: TestAgent<supertest.Test>) => Test;\n\nexport const existingStream = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\n////////////////////////////////\n/////////// Asserts\n////////////////////////////////\n\nexport type ResponseAssert = (response: Response) => boolean | void;\n\nexport type ApiSpecificationAssert<EventType extends Event = Event> =\n | TestEventStream<EventType>[]\n | ResponseAssert\n | [ResponseAssert, ...TestEventStream<EventType>[]];\n\nexport const expect = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\nexport const expectNewEvents = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\nexport const expectResponse =\n <Body = unknown>(\n statusCode: number,\n options?: { body?: Body; headers?: { [index: string]: string } },\n ) =>\n (response: Response): void => {\n const { body, headers } = options ?? {};\n assertEqual(response.statusCode, statusCode);\n if (body) assertMatches(response.body, body);\n if (headers) assertMatches(response.headers, headers);\n };\n\nexport const expectError = (\n errorCode: number,\n problemDetails?: Partial<ProblemDocument>,\n) =>\n expectResponse(\n errorCode,\n problemDetails ? { body: problemDetails } : undefined,\n );\n\n////////////////////////////////\n/////////// Api Specification\n////////////////////////////////\n\nexport type ApiSpecification<EventType extends Event = Event> = (\n ...givenStreams: TestEventStream<EventType>[]\n) => {\n when: (setupRequest: TestRequest) => {\n then: (verify: ApiSpecificationAssert<EventType>) => Promise<void>;\n };\n};\n\nexport const ApiSpecification = {\n for: <\n EventType extends Event = Event,\n StreamVersion = DefaultStreamVersionType,\n >(\n getEventStore: () => EventStore<StreamVersion>,\n getApplication: (eventStore: EventStore<StreamVersion>) => Application,\n ): ApiSpecification<EventType> => {\n {\n return (...givenStreams: TestEventStream<EventType>[]) => {\n const eventStore = WrapEventStore(getEventStore());\n const application = getApplication(eventStore);\n\n return {\n when: (setupRequest: TestRequest) => {\n const handle = async () => {\n for (const [streamName, events] of givenStreams) {\n await eventStore.setup(streamName, events);\n }\n\n return setupRequest(supertest(application));\n };\n\n return {\n then: async (\n verify: ApiSpecificationAssert<EventType>,\n ): Promise<void> => {\n const response = await handle();\n\n if (typeof verify === 'function') {\n const succeeded = verify(response);\n\n if (succeeded === false) assertFails();\n } else if (Array.isArray(verify)) {\n const [first, ...rest] = verify;\n\n if (typeof first === 'function') {\n const succeeded = first(response);\n\n if (succeeded === false) assertFails();\n }\n\n const events = typeof first === 'function' ? rest : verify;\n\n assertMatches(\n Array.from(eventStore.appendedEvents.values()),\n events,\n );\n }\n },\n };\n },\n };\n };\n }\n },\n};\n"]}
@@ -1,2 +1,2 @@
1
- import{l as p}from"./chunk-IQQWOHEF.mjs";var o=(n=>(n.Empty="Empty",n.Pending="Pending",n.Confirmed="Confirmed",n.Canceled="Canceled",n))(o||{}),c={status:"Empty"},a=(e,{type:i,data:r})=>{switch(i){case"ShoppingCartOpened":return{id:r.shoppingCartId,clientId:r.clientId,openedAt:r.openedAt,productItems:[],status:"Pending"};case"ProductItemAddedToShoppingCart":{if(e.status!=="Pending")return e;let{productItems:d}=e,{productItem:n}=r;return{...e,productItems:p(d,n,t=>t.productId===n.productId&&t.unitPrice===n.unitPrice,t=>({...t,quantity:t.quantity+n.quantity}),()=>n)}}case"ProductItemRemovedFromShoppingCart":{if(e.status!=="Pending")return e;let{productItems:d}=e,{productItem:n}=r;return{...e,productItems:p(d,n,t=>t.productId===n.productId&&t.unitPrice===n.unitPrice,t=>({...t,quantity:t.quantity-n.quantity}))}}case"ShoppingCartConfirmed":return e.status!=="Pending"?e:{...e,status:"Confirmed",confirmedAt:r.confirmedAt};case"ShoppingCartCanceled":return e.status!=="Pending"?e:{...e,status:"Canceled",canceledAt:r.canceledAt}}},s=e=>e.reduce(a,c),u=(t=>(t.CART_IS_ALREADY_CLOSED="CART_IS_ALREADY_CLOSED",t.PRODUCT_ITEM_NOT_FOUND="PRODUCT_ITEM_NOT_FOUND",t.CART_IS_EMPTY="CART_IS_EMPTY",t.UNKNOWN_EVENT_TYPE="UNKNOWN_EVENT_TYPE",t.UNKNOWN_COMMAND_TYPE="UNKNOWN_COMMAND_TYPE",t))(u||{});export{o as a,c as b,a as c,s as d,u as e};
2
- //# sourceMappingURL=chunk-EVM4ZBYB.mjs.map
1
+ import{l as p}from"./chunk-FPBLKFXX.mjs";var o=(n=>(n.Empty="Empty",n.Pending="Pending",n.Confirmed="Confirmed",n.Canceled="Canceled",n))(o||{}),c={status:"Empty"},a=(e,{type:i,data:r})=>{switch(i){case"ShoppingCartOpened":return{id:r.shoppingCartId,clientId:r.clientId,openedAt:r.openedAt,productItems:[],status:"Pending"};case"ProductItemAddedToShoppingCart":{if(e.status!=="Pending")return e;let{productItems:d}=e,{productItem:n}=r;return{...e,productItems:p(d,n,t=>t.productId===n.productId&&t.unitPrice===n.unitPrice,t=>({...t,quantity:t.quantity+n.quantity}),()=>n)}}case"ProductItemRemovedFromShoppingCart":{if(e.status!=="Pending")return e;let{productItems:d}=e,{productItem:n}=r;return{...e,productItems:p(d,n,t=>t.productId===n.productId&&t.unitPrice===n.unitPrice,t=>({...t,quantity:t.quantity-n.quantity}))}}case"ShoppingCartConfirmed":return e.status!=="Pending"?e:{...e,status:"Confirmed",confirmedAt:r.confirmedAt};case"ShoppingCartCanceled":return e.status!=="Pending"?e:{...e,status:"Canceled",canceledAt:r.canceledAt}}},s=e=>e.reduce(a,c),u=(t=>(t.CART_IS_ALREADY_CLOSED="CART_IS_ALREADY_CLOSED",t.PRODUCT_ITEM_NOT_FOUND="PRODUCT_ITEM_NOT_FOUND",t.CART_IS_EMPTY="CART_IS_EMPTY",t.UNKNOWN_EVENT_TYPE="UNKNOWN_EVENT_TYPE",t.UNKNOWN_COMMAND_TYPE="UNKNOWN_COMMAND_TYPE",t))(u||{});export{o as a,c as b,a as c,s as d,u as e};
2
+ //# sourceMappingURL=chunk-33CTWFPV.mjs.map
@@ -1,2 +1,2 @@
1
- import{a as o}from"./chunk-IQQWOHEF.mjs";import s from"supertest";import E from"assert";var y={for:(r,i)=>(...n)=>{let p=o(r()),t=i(p);return{when:a=>{let c=async()=>{for(let e of n)await e(s(t));return a(s(t))};return{then:async e=>{let f=await c();e.forEach(m=>{m(f)===!1&&E.fail()})}}}}}};export{y as a};
2
- //# sourceMappingURL=chunk-3SNIQKLF.mjs.map
1
+ import{a as o}from"./chunk-FPBLKFXX.mjs";import s from"supertest";import E from"assert";var y={for:(r,i)=>(...n)=>{let p=o(r()),t=i(p);return{when:a=>{let c=async()=>{for(let e of n)await e(s(t));return a(s(t))};return{then:async e=>{let f=await c();e.forEach(m=>{m(f)===!1&&E.fail()})}}}}}};export{y as a};
2
+ //# sourceMappingURL=chunk-3A5QCRIL.mjs.map
@@ -1,2 +1,2 @@
1
- import{a as c,b as v,c as a,e as E}from"./chunk-IQQWOHEF.mjs";import"express";import d from"supertest";var R=(t,e)=>[t,e],b=(t,e)=>[t,e],g=(t,e)=>[t,e],f=(t,e)=>r=>{let{body:s,headers:o}=e??{};E(r.statusCode,t),s&&a(r.body,s),o&&a(r.headers,o)},h=(t,e)=>f(t,e?{body:e}:void 0),q={for:(t,e)=>(...r)=>{let s=c(t()),o=e(s);return{when:y=>{let m=async()=>{for(let[n,p]of r)await s.setup(n,p);return y(d(o))};return{then:async n=>{let p=await m();if(typeof n=="function")n(p)===!1&&v();else if(Array.isArray(n)){let[i,...T]=n;typeof i=="function"&&i(p)===!1&&v();let u=typeof i=="function"?T:n;a(Array.from(s.appendedEvents.values()),u)}}}}}}};export{R as a,b,g as c,f as d,h as e,q as f};
2
- //# sourceMappingURL=chunk-Y43VLATL.mjs.map
1
+ import{a as c,b as v,c as a,e as E}from"./chunk-FPBLKFXX.mjs";import"express";import d from"supertest";var R=(t,e)=>[t,e],b=(t,e)=>[t,e],g=(t,e)=>[t,e],f=(t,e)=>r=>{let{body:s,headers:o}=e??{};E(r.statusCode,t),s&&a(r.body,s),o&&a(r.headers,o)},h=(t,e)=>f(t,e?{body:e}:void 0),q={for:(t,e)=>(...r)=>{let s=c(t()),o=e(s);return{when:y=>{let m=async()=>{for(let[n,p]of r)await s.setup(n,p);return y(d(o))};return{then:async n=>{let p=await m();if(typeof n=="function")n(p)===!1&&v();else if(Array.isArray(n)){let[i,...T]=n;typeof i=="function"&&i(p)===!1&&v();let u=typeof i=="function"?T:n;a(Array.from(s.appendedEvents.values()),u)}}}}}}};export{R as a,b,g as c,f as d,h as e,q as f};
2
+ //# sourceMappingURL=chunk-4YSVF3JC.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/testing/apiSpecification.ts"],"sourcesContent":["import {\n WrapEventStore,\n assertEqual,\n assertFails,\n assertMatches,\n type DefaultStreamVersionType,\n type Event,\n type EventStore,\n type TestEventStream,\n} from '@event-driven-io/emmett';\nimport { type Application } from 'express';\nimport type { ProblemDocument } from 'http-problem-details';\nimport type { Response, Test } from 'supertest';\nimport supertest from 'supertest';\nimport type TestAgent from 'supertest/lib/agent';\n\n////////////////////////////////\n/////////// Setup\n////////////////////////////////\n\nexport type TestRequest = (request: TestAgent<supertest.Test>) => Test;\n\nexport const existingStream = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\n////////////////////////////////\n/////////// Asserts\n////////////////////////////////\n\nexport type ResponseAssert = (response: Response) => boolean | void;\n\nexport type ApiSpecificationAssert<EventType extends Event = Event> =\n | TestEventStream<EventType>[]\n | ResponseAssert\n | [ResponseAssert, ...TestEventStream<EventType>[]];\n\nexport const expect = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\nexport const expectNewEvents = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\nexport const expectResponse =\n <Body = unknown>(\n statusCode: number,\n options?: { body?: Body; headers?: { [index: string]: string } },\n ) =>\n (response: Response): void => {\n const { body, headers } = options ?? {};\n assertEqual(response.statusCode, statusCode);\n if (body) assertMatches(response.body, body);\n if (headers) assertMatches(response.headers, headers);\n };\n\nexport const expectError = (\n errorCode: number,\n problemDetails?: Partial<ProblemDocument>,\n) =>\n expectResponse(\n errorCode,\n problemDetails ? { body: problemDetails } : undefined,\n );\n\n////////////////////////////////\n/////////// Api Specification\n////////////////////////////////\n\nexport type ApiSpecification<EventType extends Event = Event> = (\n ...givenStreams: TestEventStream<EventType>[]\n) => {\n when: (setupRequest: TestRequest) => {\n then: (verify: ApiSpecificationAssert<EventType>) => Promise<void>;\n };\n};\n\nexport const ApiSpecification = {\n for: <\n EventType extends Event = Event,\n StreamVersion = DefaultStreamVersionType,\n >(\n getEventStore: () => EventStore<StreamVersion>,\n getApplication: (eventStore: EventStore<StreamVersion>) => Application,\n ): ApiSpecification<EventType> => {\n {\n return (...givenStreams: TestEventStream<EventType>[]) => {\n const eventStore = WrapEventStore(getEventStore());\n const application = getApplication(eventStore);\n\n return {\n when: (setupRequest: TestRequest) => {\n const handle = async () => {\n for (const [streamName, events] of givenStreams) {\n await eventStore.setup(streamName, events);\n }\n\n return setupRequest(supertest(application));\n };\n\n return {\n then: async (\n verify: ApiSpecificationAssert<EventType>,\n ): Promise<void> => {\n const response = await handle();\n\n if (typeof verify === 'function') {\n const succeeded = verify(response);\n\n if (succeeded === false) assertFails();\n } else if (Array.isArray(verify)) {\n const [first, ...rest] = verify;\n\n if (typeof first === 'function') {\n const succeeded = first(response);\n\n if (succeeded === false) assertFails();\n }\n\n const events = typeof first === 'function' ? rest : verify;\n\n assertMatches(\n Array.from(eventStore.appendedEvents.values()),\n events,\n );\n }\n },\n };\n },\n };\n };\n }\n },\n};\n"],"mappings":"8DAUA,MAAiC,UAGjC,OAAOA,MAAe,YASf,IAAMC,EAAiB,CAC5BC,EACAC,IAEO,CAACD,EAAUC,CAAM,EAcbC,EAAS,CACpBF,EACAC,IAEO,CAACD,EAAUC,CAAM,EAGbE,EAAkB,CAC7BH,EACAC,IAEO,CAACD,EAAUC,CAAM,EAGbG,EACX,CACEC,EACAC,IAEDC,GAA6B,CAC5B,GAAM,CAAE,KAAAC,EAAM,QAAAC,CAAQ,EAAIH,GAAW,CAAC,EACtCI,EAAYH,EAAS,WAAYF,CAAU,EACvCG,GAAMG,EAAcJ,EAAS,KAAMC,CAAI,EACvCC,GAASE,EAAcJ,EAAS,QAASE,CAAO,CACtD,EAEWG,EAAc,CACzBC,EACAC,IAEAV,EACES,EACAC,EAAiB,CAAE,KAAMA,CAAe,EAAI,MAC9C,EAcWC,EAAmB,CAC9B,IAAK,CAIHC,EACAC,IAGS,IAAIC,IAA+C,CACxD,IAAMC,EAAaC,EAAeJ,EAAc,CAAC,EAC3CK,EAAcJ,EAAeE,CAAU,EAE7C,MAAO,CACL,KAAOG,GAA8B,CACnC,IAAMC,EAAS,SAAY,CACzB,OAAW,CAACC,EAAYvB,CAAM,IAAKiB,EACjC,MAAMC,EAAW,MAAMK,EAAYvB,CAAM,EAG3C,OAAOqB,EAAaxB,EAAUuB,CAAW,CAAC,CAC5C,EAEA,MAAO,CACL,KAAM,MACJI,GACkB,CAClB,IAAMlB,EAAW,MAAMgB,EAAO,EAE9B,GAAI,OAAOE,GAAW,WACFA,EAAOlB,CAAQ,IAEf,IAAOmB,EAAY,UAC5B,MAAM,QAAQD,CAAM,EAAG,CAChC,GAAM,CAACE,EAAO,GAAGC,CAAI,EAAIH,EAErB,OAAOE,GAAU,YACDA,EAAMpB,CAAQ,IAEd,IAAOmB,EAAY,EAGvC,IAAMzB,EAAS,OAAO0B,GAAU,WAAaC,EAAOH,EAEpDd,EACE,MAAM,KAAKQ,EAAW,eAAe,OAAO,CAAC,EAC7ClB,CACF,CACF,CACF,CACF,CACF,CACF,CACF,CAGN","names":["supertest","existingStream","streamId","events","expect","expectNewEvents","expectResponse","statusCode","options","response","body","headers","i","k","expectError","errorCode","problemDetails","ApiSpecification","getEventStore","getApplication","givenStreams","eventStore","S","application","setupRequest","handle","streamName","verify","d","first","rest"]}
1
+ {"version":3,"sources":["../src/testing/apiSpecification.ts"],"sourcesContent":["import {\n WrapEventStore,\n assertEqual,\n assertFails,\n assertMatches,\n type DefaultStreamVersionType,\n type Event,\n type EventStore,\n type TestEventStream,\n} from '@event-driven-io/emmett';\nimport { type Application } from 'express';\nimport type { ProblemDocument } from 'http-problem-details';\nimport type { Response, Test } from 'supertest';\nimport supertest from 'supertest';\nimport type TestAgent from 'supertest/lib/agent';\n\n////////////////////////////////\n/////////// Setup\n////////////////////////////////\n\nexport type TestRequest = (request: TestAgent<supertest.Test>) => Test;\n\nexport const existingStream = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\n////////////////////////////////\n/////////// Asserts\n////////////////////////////////\n\nexport type ResponseAssert = (response: Response) => boolean | void;\n\nexport type ApiSpecificationAssert<EventType extends Event = Event> =\n | TestEventStream<EventType>[]\n | ResponseAssert\n | [ResponseAssert, ...TestEventStream<EventType>[]];\n\nexport const expect = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\nexport const expectNewEvents = <EventType extends Event = Event>(\n streamId: string,\n events: EventType[],\n): TestEventStream<EventType> => {\n return [streamId, events];\n};\n\nexport const expectResponse =\n <Body = unknown>(\n statusCode: number,\n options?: { body?: Body; headers?: { [index: string]: string } },\n ) =>\n (response: Response): void => {\n const { body, headers } = options ?? {};\n assertEqual(response.statusCode, statusCode);\n if (body) assertMatches(response.body, body);\n if (headers) assertMatches(response.headers, headers);\n };\n\nexport const expectError = (\n errorCode: number,\n problemDetails?: Partial<ProblemDocument>,\n) =>\n expectResponse(\n errorCode,\n problemDetails ? { body: problemDetails } : undefined,\n );\n\n////////////////////////////////\n/////////// Api Specification\n////////////////////////////////\n\nexport type ApiSpecification<EventType extends Event = Event> = (\n ...givenStreams: TestEventStream<EventType>[]\n) => {\n when: (setupRequest: TestRequest) => {\n then: (verify: ApiSpecificationAssert<EventType>) => Promise<void>;\n };\n};\n\nexport const ApiSpecification = {\n for: <\n EventType extends Event = Event,\n StreamVersion = DefaultStreamVersionType,\n >(\n getEventStore: () => EventStore<StreamVersion>,\n getApplication: (eventStore: EventStore<StreamVersion>) => Application,\n ): ApiSpecification<EventType> => {\n {\n return (...givenStreams: TestEventStream<EventType>[]) => {\n const eventStore = WrapEventStore(getEventStore());\n const application = getApplication(eventStore);\n\n return {\n when: (setupRequest: TestRequest) => {\n const handle = async () => {\n for (const [streamName, events] of givenStreams) {\n await eventStore.setup(streamName, events);\n }\n\n return setupRequest(supertest(application));\n };\n\n return {\n then: async (\n verify: ApiSpecificationAssert<EventType>,\n ): Promise<void> => {\n const response = await handle();\n\n if (typeof verify === 'function') {\n const succeeded = verify(response);\n\n if (succeeded === false) assertFails();\n } else if (Array.isArray(verify)) {\n const [first, ...rest] = verify;\n\n if (typeof first === 'function') {\n const succeeded = first(response);\n\n if (succeeded === false) assertFails();\n }\n\n const events = typeof first === 'function' ? rest : verify;\n\n assertMatches(\n Array.from(eventStore.appendedEvents.values()),\n events,\n );\n }\n },\n };\n },\n };\n };\n }\n },\n};\n"],"mappings":"8DAUA,MAAiC,UAGjC,OAAOA,MAAe,YASf,IAAMC,EAAiB,CAC5BC,EACAC,IAEO,CAACD,EAAUC,CAAM,EAcbC,EAAS,CACpBF,EACAC,IAEO,CAACD,EAAUC,CAAM,EAGbE,EAAkB,CAC7BH,EACAC,IAEO,CAACD,EAAUC,CAAM,EAGbG,EACX,CACEC,EACAC,IAEDC,GAA6B,CAC5B,GAAM,CAAE,KAAAC,EAAM,QAAAC,CAAQ,EAAIH,GAAW,CAAC,EACtCI,EAAYH,EAAS,WAAYF,CAAU,EACvCG,GAAMG,EAAcJ,EAAS,KAAMC,CAAI,EACvCC,GAASE,EAAcJ,EAAS,QAASE,CAAO,CACtD,EAEWG,EAAc,CACzBC,EACAC,IAEAV,EACES,EACAC,EAAiB,CAAE,KAAMA,CAAe,EAAI,MAC9C,EAcWC,EAAmB,CAC9B,IAAK,CAIHC,EACAC,IAGS,IAAIC,IAA+C,CACxD,IAAMC,EAAaC,EAAeJ,EAAc,CAAC,EAC3CK,EAAcJ,EAAeE,CAAU,EAE7C,MAAO,CACL,KAAOG,GAA8B,CACnC,IAAMC,EAAS,SAAY,CACzB,OAAW,CAACC,EAAYvB,CAAM,IAAKiB,EACjC,MAAMC,EAAW,MAAMK,EAAYvB,CAAM,EAG3C,OAAOqB,EAAaxB,EAAUuB,CAAW,CAAC,CAC5C,EAEA,MAAO,CACL,KAAM,MACJI,GACkB,CAClB,IAAMlB,EAAW,MAAMgB,EAAO,EAE9B,GAAI,OAAOE,GAAW,WACFA,EAAOlB,CAAQ,IAEf,IAAOmB,EAAY,UAC5B,MAAM,QAAQD,CAAM,EAAG,CAChC,GAAM,CAACE,EAAO,GAAGC,CAAI,EAAIH,EAErB,OAAOE,GAAU,YACDA,EAAMpB,CAAQ,IAEd,IAAOmB,EAAY,EAGvC,IAAMzB,EAAS,OAAO0B,GAAU,WAAaC,EAAOH,EAEpDd,EACE,MAAM,KAAKQ,EAAW,eAAe,OAAO,CAAC,EAC7ClB,CACF,CACF,CACF,CACF,CACF,CACF,CACF,CAGN","names":["supertest","existingStream","streamId","events","expect","expectNewEvents","expectResponse","statusCode","options","response","body","headers","i","k","expectError","errorCode","problemDetails","ApiSpecification","getEventStore","getApplication","givenStreams","eventStore","S","application","setupRequest","handle","streamName","verify","p","first","rest"]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkNZI5RAYPjs = require('./chunk-NZI5RAYP.js');var _chunkCIIR5CXZjs = require('./chunk-CIIR5CXZ.js');var _express = require('express'); var _express2 = _interopRequireDefault(_express);require('express-async-errors');var _http = require('http'); var _http2 = _interopRequireDefault(_http);var _httpproblemdetails = require('http-problem-details');var u=e=>(t,o,s,i)=>{let p;e&&(p=e(t,o)),p=_nullishCoalesce(p, () => (P(t))),_chunkNZI5RAYPjs.f.call(void 0, s,p.status,{problem:p})},P= exports.n =e=>{let t=500;return"errorCode"in e&&_chunkCIIR5CXZjs.f.call(void 0, e.errorCode)&&e.errorCode>=100&&e.errorCode<600&&(t=e.errorCode),new (0, _httpproblemdetails.ProblemDocument)({detail:e.message,status:t})};var N=e=>{let t=_express2.default.call(void 0, ),{apis:o,mapError:s,enableDefaultExpressEtag:i,disableJsonMiddleware:p,disableUrlEncodingMiddleware:b,disableProblemDetailsMiddleware:x}=e,d=_express.Router.call(void 0, );t.set("etag",_nullishCoalesce(i, () => (!1))),p||t.use(_express2.default.json()),b||t.use(_express2.default.urlencoded({extended:!0}));for(let H of o)H(d);return t.use(d),x||t.use(u(s)),t},v= exports.p =(e,t={port:3e3})=>{let{port:o}=t,s=_http2.default.createServer(e);return s.on("listening",()=>{console.info("server up listening")}),s.listen(o)};var K=e=>async(t,o,s)=>(await Promise.resolve(e(t)))(o),k= exports.b =e=>t=>{_chunkNZI5RAYPjs.e.call(void 0, t,200,e)},z= exports.c =e=>t=>{_chunkNZI5RAYPjs.c.call(void 0, t,e)},G= exports.d =e=>t=>{_chunkNZI5RAYPjs.d.call(void 0, t,e)},L= exports.e =e=>A(204,e),A= exports.f =(e,t)=>o=>{_chunkNZI5RAYPjs.e.call(void 0, o,e,t)},Q= exports.g =e=>n(400,e),V= exports.h =e=>n(403,e),X= exports.i =e=>n(404,e),Y= exports.j =e=>n(409,e),Z= exports.k =e=>n(412,e),n= exports.l =(e,t)=>o=>{_chunkNZI5RAYPjs.f.call(void 0, o,e,t)};exports.a = K; exports.b = k; exports.c = z; exports.d = G; exports.e = L; exports.f = A; exports.g = Q; exports.h = V; exports.i = X; exports.j = Y; exports.k = Z; exports.l = n; exports.m = u; exports.n = P; exports.o = N; exports.p = v;
2
- //# sourceMappingURL=chunk-NFF4ZR5G.js.map
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }var _chunkNZI5RAYPjs = require('./chunk-NZI5RAYP.js');var _chunkSUF35K5Hjs = require('./chunk-SUF35K5H.js');var _express = require('express'); var _express2 = _interopRequireDefault(_express);require('express-async-errors');var _http = require('http'); var _http2 = _interopRequireDefault(_http);var _httpproblemdetails = require('http-problem-details');var u=e=>(t,o,s,i)=>{let p;e&&(p=e(t,o)),p=_nullishCoalesce(p, () => (P(t))),_chunkNZI5RAYPjs.f.call(void 0, s,p.status,{problem:p})},P= exports.n =e=>{let t=500;return"errorCode"in e&&_chunkSUF35K5Hjs.f.call(void 0, e.errorCode)&&e.errorCode>=100&&e.errorCode<600&&(t=e.errorCode),new (0, _httpproblemdetails.ProblemDocument)({detail:e.message,status:t})};var N=e=>{let t=_express2.default.call(void 0, ),{apis:o,mapError:s,enableDefaultExpressEtag:i,disableJsonMiddleware:p,disableUrlEncodingMiddleware:b,disableProblemDetailsMiddleware:x}=e,d=_express.Router.call(void 0, );t.set("etag",_nullishCoalesce(i, () => (!1))),p||t.use(_express2.default.json()),b||t.use(_express2.default.urlencoded({extended:!0}));for(let H of o)H(d);return t.use(d),x||t.use(u(s)),t},v= exports.p =(e,t={port:3e3})=>{let{port:o}=t,s=_http2.default.createServer(e);return s.on("listening",()=>{console.info("server up listening")}),s.listen(o)};var K=e=>async(t,o,s)=>(await Promise.resolve(e(t)))(o),k= exports.b =e=>t=>{_chunkNZI5RAYPjs.e.call(void 0, t,200,e)},z= exports.c =e=>t=>{_chunkNZI5RAYPjs.c.call(void 0, t,e)},G= exports.d =e=>t=>{_chunkNZI5RAYPjs.d.call(void 0, t,e)},L= exports.e =e=>A(204,e),A= exports.f =(e,t)=>o=>{_chunkNZI5RAYPjs.e.call(void 0, o,e,t)},Q= exports.g =e=>n(400,e),V= exports.h =e=>n(403,e),X= exports.i =e=>n(404,e),Y= exports.j =e=>n(409,e),Z= exports.k =e=>n(412,e),n= exports.l =(e,t)=>o=>{_chunkNZI5RAYPjs.f.call(void 0, o,e,t)};exports.a = K; exports.b = k; exports.c = z; exports.d = G; exports.e = L; exports.f = A; exports.g = Q; exports.h = V; exports.i = X; exports.j = Y; exports.k = Z; exports.l = n; exports.m = u; exports.n = P; exports.o = N; exports.p = v;
2
+ //# sourceMappingURL=chunk-BAE5MJFD.js.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunkCIIR5CXZjs = require('./chunk-CIIR5CXZ.js');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var _assert = require('assert'); var _assert2 = _interopRequireDefault(_assert);var y={for:(r,i)=>(...n)=>{let p=_chunkCIIR5CXZjs.a.call(void 0, r()),t=i(p);return{when:a=>{let c=async()=>{for(let e of n)await e(_supertest2.default.call(void 0, t));return a(_supertest2.default.call(void 0, t))};return{then:async e=>{let f=await c();e.forEach(m=>{m(f)===!1&&_assert2.default.fail()})}}}}}};exports.a = y;
2
- //# sourceMappingURL=chunk-IJQIPTU6.js.map
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunkSUF35K5Hjs = require('./chunk-SUF35K5H.js');var _supertest = require('supertest'); var _supertest2 = _interopRequireDefault(_supertest);var _assert = require('assert'); var _assert2 = _interopRequireDefault(_assert);var y={for:(r,i)=>(...n)=>{let p=_chunkSUF35K5Hjs.a.call(void 0, r()),t=i(p);return{when:a=>{let c=async()=>{for(let e of n)await e(_supertest2.default.call(void 0, t));return a(_supertest2.default.call(void 0, t))};return{then:async e=>{let f=await c();e.forEach(m=>{m(f)===!1&&_assert2.default.fail()})}}}}}};exports.a = y;
2
+ //# sourceMappingURL=chunk-BAXKZVNV.js.map
@@ -0,0 +1,7 @@
1
+ var M=e=>{let t=new Map;return{async aggregateStream(r,a){return e.aggregateStream(r,a)},readStream(r,a){return e.readStream(r,a)},appendToStream:async(r,a,s)=>{let i=await e.appendToStream(r,a,s),n=t.get(r)??[r,[]];return t.set(r,[r,[...n[1],...a]]),i},appendedEvents:t,setup:async(r,a)=>e.appendToStream(r,a)}};var x=class extends Error{constructor(e){super(`Cannot parse! ${e}`)}},l={stringify:(e,t)=>JSON.stringify(t?.map?t.map(e):e,(r,a)=>typeof a=="bigint"?a.toString():a),parse:(e,t)=>{let r=JSON.parse(e,t?.reviver);if(t?.typeCheck&&!t?.typeCheck(r))throw new x(e);return t?.map?t.map(r):r}};var c=class extends Error{constructor(e){super(e)}},g=(e,t)=>{let r=e,a=t;return h(r),h(a),Object.keys(a).every(s=>typeof a[s]=="object"?g(r[s],a[s]):a[s]===r[s])},j=e=>{throw new c(e??"That should not ever happened, right?")};var T=(e,t,r)=>{if(!g(e,t))throw new c(r??`subObj:
2
+ ${l.stringify(t)}
3
+ is not subset of
4
+ ${l.stringify(e)}`)};function h(e,t){if(!e)throw new c(t??"Condition is not truthy")}function B(e,t,r){if(e!==t)throw new c(r??`Objects are not equal:
5
+ Expected: ${l.stringify(e)}
6
+ Actual:${l.stringify(t)}`)}var O=(e=>(e.NOT_A_NONEMPTY_STRING="NOT_A_NONEMPTY_STRING",e.NOT_A_POSITIVE_NUMBER="NOT_A_POSITIVE_NUMBER",e.NOT_AN_UNSIGNED_BIGINT="NOT_AN_UNSIGNED_BIGINT",e))(O||{}),y=e=>typeof e=="number"&&e===e,w=e=>typeof e=="string",D=e=>{if(!w(e)||e.length===0)throw new f("NOT_A_NONEMPTY_STRING");return e},V=e=>{if(!y(e)||e<=0)throw new f("NOT_A_POSITIVE_NUMBER");return e},$=e=>{let t=BigInt(e);if(t<0)throw new f("NOT_AN_UNSIGNED_BIGINT");return t};var d=class N extends Error{errorCode;constructor(t){let r=t&&typeof t=="object"&&"errorCode"in t?t.errorCode:y(t)?t:500,a=t&&typeof t=="object"&&"message"in t?t.message:w(t)?t:`Error with status code '${r}' ocurred during Emmett processing`;super(a),this.errorCode=r,Object.setPrototypeOf(this,N.prototype)}};var f=class C extends d{constructor(t){super({errorCode:400,message:t??"Validation Error ocurred during Emmett processing"}),Object.setPrototypeOf(this,C.prototype)}},P=class A extends d{constructor(t){super({errorCode:403,message:t??"Illegal State ocurred during Emmett processing"}),Object.setPrototypeOf(this,A.prototype)}};var U=(e,t,r,a,s=()=>{})=>{let i=!1,n=e.map(o=>r(o)?(i=!0,a(o)):o).filter(o=>o!==void 0).map(o=>{if(!o)throw Error("That should not happen");return o});return!i&&s()!==void 0?[...e,t]:n};var S="STREAM_DOES_NOT_EXIST",E="NO_CONCURRENCY_CHECK";var v=(e,t,r=a=>a)=>async(a,s,i,n)=>{let o=r(s),m=await a.aggregateStream(o,{evolve:e,initialState:t,read:{expectedStreamVersion:n?.expectedStreamVersion??E}}),b=m?.state??t(),k=m?.currentStreamVersion,u=i(b),p=Array.isArray(u)?u:[u],I=n?.expectedStreamVersion??k??S;return{...await a.appendToStream(o,p,{...n,expectedStreamVersion:I}),newEvents:p,newState:p.reduce(e,b)}};var q=({decide:e,evolve:t,initialState:r},a=s=>s)=>async(s,i,n,o)=>v(t,r,a)(s,i,m=>e(n,m),o);import Ne from"async-retry";import{TransformStream as Ae}from"web-streams-polyfill";import{v4 as Fe}from"uuid";export{M as a,j as b,T as c,h as d,B as e,y as f,D as g,V as h,$ as i,d as j,P as k,U as l,S as m,q as n};
7
+ //# sourceMappingURL=chunk-FPBLKFXX.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../emmett/src/testing/wrapEventStore.ts","../../emmett/src/serialization/json/JSONParser.ts","../../emmett/src/testing/assertions.ts","../../emmett/src/validation/index.ts","../../emmett/src/errors/index.ts","../../emmett/src/validation/dates.ts","../../emmett/src/utils/merge.ts","../../emmett/src/eventStore/expectedVersion.ts","../../emmett/src/commandHandling/handleCommand.ts","../../emmett/src/commandHandling/handleCommandWithDecider.ts","../../emmett/src/streaming/restream.ts","../../emmett/src/eventStore/inMemoryEventStore.ts"],"sourcesContent":["import type {\n AggregateStreamOptions,\n AggregateStreamResult,\n AppendToStreamOptions,\n AppendToStreamResult,\n DefaultStreamVersionType,\n EventStore,\n ReadStreamOptions,\n ReadStreamResult,\n} from '../eventStore';\nimport { type Event } from '../typing';\n\nexport type TestEventStream<EventType extends Event = Event> = [\n string,\n EventType[],\n];\n\nexport const WrapEventStore = <StreamVersion = DefaultStreamVersionType>(\n eventStore: EventStore<StreamVersion>,\n): EventStore<StreamVersion> & {\n appendedEvents: Map<string, TestEventStream>;\n setup<EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamVersion>>;\n} => {\n const appendedEvents = new Map<string, TestEventStream>();\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType, StreamVersion>,\n ): Promise<AggregateStreamResult<State, StreamVersion> | null> {\n return eventStore.aggregateStream(streamName, options);\n },\n\n readStream<EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<StreamVersion>,\n ): Promise<ReadStreamResult<EventType, StreamVersion>> {\n return eventStore.readStream(streamName, options);\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions<StreamVersion>,\n ): Promise<AppendToStreamResult<StreamVersion>> => {\n const result = await eventStore.appendToStream(\n streamName,\n events,\n options,\n );\n\n const currentStream = appendedEvents.get(streamName) ?? [streamName, []];\n\n appendedEvents.set(streamName, [\n streamName,\n [...currentStream[1], ...events],\n ]);\n\n return result;\n },\n\n appendedEvents,\n\n setup: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamVersion>> => {\n return eventStore.appendToStream(streamName, events);\n },\n };\n};\n","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 //TODO: Consider adding support to DateTime and adding specific format to mark that's a bigint\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (_, v) => (typeof v === 'bigint' ? v.toString() : v),\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","import { JSONParser } from '../serialization';\nimport type { DefaultRecord } from '../typing';\nimport { deepEquals } from '../utils';\n\nexport class AssertionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\nexport const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as DefaultRecord;\n const sub = subObj as DefaultRecord;\n\n assertOk(sup);\n assertOk(sub);\n\n return Object.keys(sub).every((ele: string) => {\n if (typeof sub[ele] == 'object') {\n return isSubset(sup[ele], sub[ele]);\n }\n return sub[ele] === sup[ele];\n });\n};\n\nexport const assertFails = (message?: string) => {\n throw new AssertionError(message ?? 'That should not ever happened, right?');\n};\n\nexport const assertThrowsAsync = async <TError extends Error>(\n fun: () => Promise<void>,\n errorCheck?: (error: Error) => boolean,\n): Promise<TError> => {\n try {\n await fun();\n throw new AssertionError(\"Function didn't throw expected error\");\n } catch (error) {\n const typedError = error as TError;\n if (errorCheck) assertTrue(errorCheck(typedError));\n return typedError;\n }\n};\n\nexport const assertThrows = <TError extends Error>(\n fun: () => void,\n errorCheck?: (error: Error) => boolean,\n): TError => {\n try {\n fun();\n throw new AssertionError(\"Function didn't throw expected error\");\n } catch (error) {\n const typedError = error as TError;\n if (errorCheck) assertTrue(errorCheck(typedError));\n return typedError;\n }\n};\nexport const assertMatches = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!isSubset(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis not subset of\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertDeepEqual = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!deepEquals(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis equals to\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertThat = <T>(item: T) => {\n return {\n isEqualTo: (other: T) => assertTrue(deepEquals(item, other)),\n };\n};\n\nexport function assertFalse(\n condition: boolean,\n message?: string,\n): asserts condition is false {\n if (condition) throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertTrue(\n condition: boolean,\n message?: string,\n): asserts condition is true {\n if (!condition) throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertOk<T>(\n obj: T | null | undefined,\n message?: string,\n): asserts obj is T {\n if (!obj) throw new AssertionError(message ?? `Condition is not truthy`);\n}\n\nexport function assertEqual<T>(\n expected: T | null | undefined,\n actual: T | null | undefined,\n message?: string,\n): void {\n if (expected !== actual)\n throw new AssertionError(\n message ??\n `Objects are not equal:\\nExpected: ${JSONParser.stringify(expected)}\\nActual:${JSONParser.stringify(actual)}`,\n );\n}\n\nexport function assertNotEqual<T>(\n obj: T | null | undefined,\n other: T | null | undefined,\n message?: string,\n): void {\n if (obj === other)\n throw new AssertionError(\n message ?? `Objects are equal: ${JSONParser.stringify(obj)}`,\n );\n}\n\nexport function assertIsNotNull<T extends object | bigint>(\n result: T | null,\n): asserts result is T {\n assertNotEqual(result, null);\n assertOk(result);\n}\n\nexport function assertIsNull<T extends object>(\n result: T | null,\n): asserts result is null {\n assertEqual(result, null);\n}\n\ntype Call = {\n arguments: unknown[];\n result: unknown;\n target: unknown;\n this: unknown;\n};\n\nexport type ArgumentMatcher = (arg: unknown) => boolean;\n\nexport const argValue =\n <T>(value: T): ArgumentMatcher =>\n (arg) =>\n deepEquals(arg, value);\n\nexport const argMatches =\n <T>(matches: (arg: T) => boolean): ArgumentMatcher =>\n (arg) =>\n matches(arg as T);\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type MockedFunction = Function & { mock?: { calls: Call[] } };\n\nexport function verifyThat(fn: MockedFunction) {\n return {\n calledTimes: (times: number) => {\n assertEqual(fn.mock?.calls?.length, times);\n },\n notCalled: () => {\n assertEqual(fn?.mock?.calls?.length, 0);\n },\n called: () => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length > 0,\n );\n },\n calledWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledOnceWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length === 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length >= 1,\n );\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some(\n (call) =>\n call.arguments &&\n call.arguments.length >= matches.length &&\n matches.every((match, index) => match(call.arguments[index])),\n ),\n );\n },\n notCalledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertFalse(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls[0]!.arguments &&\n fn.mock.calls[0]!.arguments.length >= matches.length &&\n matches.every((match, index) =>\n match(fn.mock!.calls[0]!.arguments[index]),\n ),\n );\n },\n };\n}\n\nexport const assertThatArray = <T>(array: T[]) => {\n return {\n isEmpty: () => assertEqual(array.length, 0),\n hasSize: (length: number) => assertEqual(array.length, length),\n containsElements: (...other: T[]) => {\n assertTrue(other.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrder: (...other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrderElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n for (let i = 0; i < array.length; i++) {\n assertTrue(deepEquals(array[i], other[i]));\n }\n },\n containsExactly: (elem: T) => {\n assertEqual(array.length, 1);\n assertTrue(deepEquals(array[0], elem));\n },\n contains: (elem: T) => {\n assertTrue(array.some((a) => deepEquals(a, elem)));\n },\n containsOnlyOnceElementsOf: (other: T[]) => {\n assertTrue(\n other\n .map((o) => array.filter((a) => deepEquals(a, o)).length)\n .filter((a) => a === 1).length === other.length,\n );\n },\n containsAnyOf: (...other: T[]) => {\n assertTrue(array.some((a) => other.some((o) => deepEquals(a, o))));\n },\n allMatch: (matches: (item: T) => boolean) => {\n assertTrue(array.every(matches));\n },\n anyMatches: (matches: (item: T) => boolean) => {\n assertTrue(array.some(matches));\n },\n allMatchAsync: async (\n matches: (item: T) => Promise<boolean>,\n ): Promise<void> => {\n for (const item of array) {\n assertTrue(await matches(item));\n }\n },\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\nexport * from './dates';\n","import { isNumber, isString } from '../validation';\n\nexport type ErrorConstructor<ErrorType extends Error> = new (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: any[]\n) => ErrorType;\n\nexport const isErrorConstructor = <ErrorType extends Error>(\n // eslint-disable-next-line @typescript-eslint/ban-types\n expect: Function,\n): expect is ErrorConstructor<ErrorType> => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return (\n typeof expect === 'function' &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype.constructor === expect\n );\n};\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 formatDateToUtcYYYYMMDD = (date: Date) => {\n // Use the 'en-CA' locale which formats as 'yyyy-mm-dd'\n const formatter = new Intl.DateTimeFormat('en-CA', {\n timeZone: 'UTC',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n\n // Format the date\n return formatter.format(date);\n};\n\n// Function to validate 'yyyy-mm-dd' format\nexport const isValidYYYYMMDD = (dateString: string) => {\n const regex = /^\\d{4}-\\d{2}-\\d{2}$/;\n return regex.test(dateString);\n};\n\nexport const parseDateFromUtcYYYYMMDD = (dateString: string) => {\n const date = new Date(dateString + 'T00:00:00Z');\n\n if (!isValidYYYYMMDD(dateString)) {\n throw new ValidationError('Invalid date format, must be yyyy-mm-dd');\n }\n\n if (isNaN(date.getTime())) {\n throw new ValidationError('Invalid date format');\n }\n\n return date;\n};\n","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","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","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 StreamEvent extends Event,\n StreamVersion = DefaultStreamVersionType,\n> = AppendToStreamResult<StreamVersion> & {\n newState: State;\n newEvents: StreamEvent[];\n};\n\nexport const CommandHandler =\n <State, StreamEvent extends Event, StreamVersion = DefaultStreamVersionType>(\n evolve: (state: State, event: StreamEvent) => State,\n initialState: () => State,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async <Store extends EventStore<StreamVersion>>(\n eventStore: Store,\n id: string,\n handle: (state: State) => StreamEvent | StreamEvent[],\n options?: Parameters<Store['appendToStream']>[2] & {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ): Promise<CommandHandlerResult<State, StreamEvent, 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 initialState,\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 ?? initialState();\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 ...options,\n expectedStreamVersion,\n },\n );\n\n // 5. Return result with updated state\n return {\n ...appendResult,\n newEvents,\n newState: newEvents.reduce(evolve, state),\n };\n };\n// #endregion command-handler\n","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 { decide, evolve, initialState }: 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 initialState,\n mapToStreamId,\n )(eventStore, id, (state) => decide(command, state), options);\n// #endregion command-handler\n","import retry from 'async-retry';\nimport {\n ReadableStream,\n ReadableStreamDefaultReader,\n TransformStream,\n TransformStreamDefaultController,\n} from 'web-streams-polyfill';\nimport type { Decoder } from './decoders';\nimport { DefaultDecoder } from './decoders/composite';\n\nexport const restream = <\n Source = unknown,\n Transformed = Source,\n StreamType = object,\n>(\n createSourceStream: () => ReadableStream<StreamType>,\n transform: (input: Source) => Transformed = (source) =>\n source as unknown as Transformed,\n retryOptions: retry.Options = { forever: true, minTimeout: 25 },\n decoder: Decoder<StreamType, Source> = new DefaultDecoder<Source>(),\n): ReadableStream<Transformed> =>\n new TransformStream<Source, Transformed>({\n start(controller) {\n retry(\n () => onRestream(createSourceStream, controller, transform, decoder),\n retryOptions,\n ).catch((error) => {\n controller.error(error);\n });\n },\n }).readable;\n\nconst onRestream = async <StreamType, Source, Transformed = Source>(\n createSourceStream: () => ReadableStream<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<void> => {\n const sourceStream = createSourceStream();\n const reader = sourceStream.getReader();\n try {\n let done: boolean;\n\n do {\n done = await restreamChunk(reader, controller, transform, decoder);\n } while (!done);\n } finally {\n reader.releaseLock();\n }\n};\n\nconst restreamChunk = async <StreamType, Source, Transformed = Source>(\n reader: ReadableStreamDefaultReader<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<boolean> => {\n const { done: isDone, value } = await reader.read();\n\n if (value) decoder.addToBuffer(value);\n\n if (!isDone && !decoder.hasCompleteMessage()) return false;\n\n decodeAndTransform(decoder, transform, controller);\n\n if (isDone) {\n controller.terminate();\n }\n\n return isDone;\n};\n\nconst decodeAndTransform = <StreamType, Source, Transformed = Source>(\n decoder: Decoder<StreamType, Source>,\n transform: (input: Source) => Transformed,\n controller: TransformStreamDefaultController<Transformed>,\n) => {\n try {\n const decoded = decoder.decode();\n if (!decoded) return;\n\n const transformed = transform(decoded);\n controller.enqueue(transformed);\n } catch (error) {\n controller.error(new Error(`Decoding error: ${error?.toString()}`));\n }\n};\n","import { v4 as randomUUID } from 'uuid';\nimport type {\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../typing';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type DefaultStreamVersionType,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\n\nexport type EventHandler<E extends Event = Event> = (\n eventEnvelope: ReadEvent<E>,\n) => void;\n\nexport const getInMemoryEventStore = (): EventStore<\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n> => {\n const streams = new Map<string, ReadEvent[]>();\n\n const getAllEventsCount = () => {\n return Array.from<ReadEvent[]>(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, initialState, 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, initialState()),\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<\n ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n >\n > => {\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\n .map(\n (e) =>\n e as ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n )\n .slice(from, to)\n : [];\n\n const result: ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n > =\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: ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >[] = events.map((event, index) => {\n return {\n ...event,\n metadata: {\n ...(event.metadata ?? {}),\n streamName,\n eventId: randomUUID(),\n streamPosition: BigInt(currentEvents.length + index + 1),\n globalPosition: 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":"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","names":["WrapEventStore","eventStore","appendedEvents","streamName","options","events","result","currentStream","ParseError","text","JSONParser","value","options","_","v","parsed","AssertionError","message","isSubset","superObj","subObj","sup","sub","assertOk","ele","assertFails","assertMatches","actual","expected","message","isSubset","AssertionError","JSONParser","assertOk","obj","message","AssertionError","assertEqual","expected","actual","JSONParser","ValidationErrors","isNumber","val","isString","assertNotEmptyString","value","ValidationError","assertPositiveNumber","assertUnsignedBigInt","number","EmmettError","_EmmettError","options","errorCode","isNumber","message","isString","ValidationError","_ValidationError","EmmettError","message","IllegalStateError","_IllegalStateError","merge","array","item","where","onExisting","onNotFound","wasFound","result","p","STREAM_DOES_NOT_EXIST","NO_CONCURRENCY_CHECK","CommandHandler","evolve","initialState","mapToStreamId","id","eventStore","handle","options","streamName","aggregationResult","NO_CONCURRENCY_CHECK","state","currentStreamVersion","result","newEvents","expectedStreamVersion","STREAM_DOES_NOT_EXIST","DeciderCommandHandler","decide","evolve","initialState","mapToStreamId","id","eventStore","command","options","CommandHandler","state","retry","TransformStream","randomUUID"]}
@@ -1,2 +1,2 @@
1
- import{b as C,c as d}from"./chunk-EVM4ZBYB.mjs";import{j as a,k as e}from"./chunk-IQQWOHEF.mjs";var S=(p=>(p.CART_ALREADY_EXISTS="CART_ALREADY_EXISTS",p.CART_IS_ALREADY_CLOSED="CART_IS_ALREADY_CLOSED",p.PRODUCT_ITEM_NOT_FOUND="PRODUCT_ITEM_NOT_FOUND",p.CART_IS_EMPTY="CART_IS_EMPTY",p.UNKNOWN_EVENT_TYPE="UNKNOWN_EVENT_TYPE",p.UNKNOWN_COMMAND_TYPE="UNKNOWN_COMMAND_TYPE",p))(S||{}),I=(o,{productId:t,quantity:r,unitPrice:n})=>{if((o.find(i=>i.productId===t&&i.unitPrice==n)?.quantity??0)<r)throw new e("PRODUCT_ITEM_NOT_FOUND")},g=({type:o,data:t},r)=>{switch(o){case"OpenShoppingCart":{if(r.status!=="Empty")throw new e("CART_ALREADY_EXISTS");return{type:"ShoppingCartOpened",data:{shoppingCartId:t.shoppingCartId,clientId:t.clientId,openedAt:t.now}}}case"AddProductItemToShoppingCart":{if(r.status!=="Pending")throw new e("CART_IS_ALREADY_CLOSED");return{type:"ProductItemAddedToShoppingCart",data:{shoppingCartId:t.shoppingCartId,productItem:t.productItem}}}case"RemoveProductItemFromShoppingCart":{if(r.status!=="Pending")throw new e("CART_IS_ALREADY_CLOSED");return I(r.productItems,t.productItem),{type:"ProductItemRemovedFromShoppingCart",data:{shoppingCartId:t.shoppingCartId,productItem:t.productItem}}}case"ConfirmShoppingCart":{if(r.status!=="Pending")throw new e("CART_IS_ALREADY_CLOSED");if(r.productItems.length===0)throw new e("CART_IS_EMPTY");return{type:"ShoppingCartConfirmed",data:{shoppingCartId:t.shoppingCartId,confirmedAt:t.now}}}case"CancelShoppingCart":{if(r.status!=="Pending")throw new e("CART_IS_ALREADY_CLOSED");return{type:"ShoppingCartCanceled",data:{shoppingCartId:t.shoppingCartId,canceledAt:t.now}}}default:{let n=t;throw new a("UNKNOWN_COMMAND_TYPE")}}},u={decide:g,evolve:d,initialState:()=>C};export{S as a,I as b,g as c,u as d};
2
- //# sourceMappingURL=chunk-TZWWEITQ.mjs.map
1
+ import{b as C,c as d}from"./chunk-33CTWFPV.mjs";import{j as a,k as e}from"./chunk-FPBLKFXX.mjs";var S=(p=>(p.CART_ALREADY_EXISTS="CART_ALREADY_EXISTS",p.CART_IS_ALREADY_CLOSED="CART_IS_ALREADY_CLOSED",p.PRODUCT_ITEM_NOT_FOUND="PRODUCT_ITEM_NOT_FOUND",p.CART_IS_EMPTY="CART_IS_EMPTY",p.UNKNOWN_EVENT_TYPE="UNKNOWN_EVENT_TYPE",p.UNKNOWN_COMMAND_TYPE="UNKNOWN_COMMAND_TYPE",p))(S||{}),I=(o,{productId:t,quantity:r,unitPrice:n})=>{if((o.find(i=>i.productId===t&&i.unitPrice==n)?.quantity??0)<r)throw new e("PRODUCT_ITEM_NOT_FOUND")},g=({type:o,data:t},r)=>{switch(o){case"OpenShoppingCart":{if(r.status!=="Empty")throw new e("CART_ALREADY_EXISTS");return{type:"ShoppingCartOpened",data:{shoppingCartId:t.shoppingCartId,clientId:t.clientId,openedAt:t.now}}}case"AddProductItemToShoppingCart":{if(r.status!=="Pending")throw new e("CART_IS_ALREADY_CLOSED");return{type:"ProductItemAddedToShoppingCart",data:{shoppingCartId:t.shoppingCartId,productItem:t.productItem}}}case"RemoveProductItemFromShoppingCart":{if(r.status!=="Pending")throw new e("CART_IS_ALREADY_CLOSED");return I(r.productItems,t.productItem),{type:"ProductItemRemovedFromShoppingCart",data:{shoppingCartId:t.shoppingCartId,productItem:t.productItem}}}case"ConfirmShoppingCart":{if(r.status!=="Pending")throw new e("CART_IS_ALREADY_CLOSED");if(r.productItems.length===0)throw new e("CART_IS_EMPTY");return{type:"ShoppingCartConfirmed",data:{shoppingCartId:t.shoppingCartId,confirmedAt:t.now}}}case"CancelShoppingCart":{if(r.status!=="Pending")throw new e("CART_IS_ALREADY_CLOSED");return{type:"ShoppingCartCanceled",data:{shoppingCartId:t.shoppingCartId,canceledAt:t.now}}}default:{let n=t;throw new a("UNKNOWN_COMMAND_TYPE")}}},u={decide:g,evolve:d,initialState:()=>C};export{S as a,I as b,g as c,u as d};
2
+ //# sourceMappingURL=chunk-FX4MW62Q.mjs.map
@@ -1,2 +1,2 @@
1
- import{c as R,d as c,e as l,f as r}from"./chunk-5C7LP2V7.mjs";import{f as m}from"./chunk-IQQWOHEF.mjs";import"express";import"express-async-errors";import a,{Router as y}from"express";import"express-async-errors";import O from"http";import{ProblemDocument as f}from"http-problem-details";var u=e=>(t,o,s,i)=>{let p;e&&(p=e(t,o)),p=p??P(t),r(s,p.status,{problem:p})},P=e=>{let t=500;return"errorCode"in e&&m(e.errorCode)&&e.errorCode>=100&&e.errorCode<600&&(t=e.errorCode),new f({detail:e.message,status:t})};var N=e=>{let t=a(),{apis:o,mapError:s,enableDefaultExpressEtag:i,disableJsonMiddleware:p,disableUrlEncodingMiddleware:b,disableProblemDetailsMiddleware:x}=e,d=y();t.set("etag",i??!1),p||t.use(a.json()),b||t.use(a.urlencoded({extended:!0}));for(let H of o)H(d);return t.use(d),x||t.use(u(s)),t},v=(e,t={port:3e3})=>{let{port:o}=t,s=O.createServer(e);return s.on("listening",()=>{console.info("server up listening")}),s.listen(o)};var K=e=>async(t,o,s)=>(await Promise.resolve(e(t)))(o),k=e=>t=>{l(t,200,e)},z=e=>t=>{R(t,e)},G=e=>t=>{c(t,e)},L=e=>A(204,e),A=(e,t)=>o=>{l(o,e,t)},Q=e=>n(400,e),V=e=>n(403,e),X=e=>n(404,e),Y=e=>n(409,e),Z=e=>n(412,e),n=(e,t)=>o=>{r(o,e,t)};export{K as a,k as b,z as c,G as d,L as e,A as f,Q as g,V as h,X as i,Y as j,Z as k,n as l,u as m,P as n,N as o,v as p};
2
- //# sourceMappingURL=chunk-56DKNUKX.mjs.map
1
+ import{c as R,d as c,e as l,f as r}from"./chunk-5C7LP2V7.mjs";import{f as m}from"./chunk-FPBLKFXX.mjs";import"express";import"express-async-errors";import a,{Router as y}from"express";import"express-async-errors";import O from"http";import{ProblemDocument as f}from"http-problem-details";var u=e=>(t,o,s,i)=>{let p;e&&(p=e(t,o)),p=p??P(t),r(s,p.status,{problem:p})},P=e=>{let t=500;return"errorCode"in e&&m(e.errorCode)&&e.errorCode>=100&&e.errorCode<600&&(t=e.errorCode),new f({detail:e.message,status:t})};var N=e=>{let t=a(),{apis:o,mapError:s,enableDefaultExpressEtag:i,disableJsonMiddleware:p,disableUrlEncodingMiddleware:b,disableProblemDetailsMiddleware:x}=e,d=y();t.set("etag",i??!1),p||t.use(a.json()),b||t.use(a.urlencoded({extended:!0}));for(let H of o)H(d);return t.use(d),x||t.use(u(s)),t},v=(e,t={port:3e3})=>{let{port:o}=t,s=O.createServer(e);return s.on("listening",()=>{console.info("server up listening")}),s.listen(o)};var K=e=>async(t,o,s)=>(await Promise.resolve(e(t)))(o),k=e=>t=>{l(t,200,e)},z=e=>t=>{R(t,e)},G=e=>t=>{c(t,e)},L=e=>A(204,e),A=(e,t)=>o=>{l(o,e,t)},Q=e=>n(400,e),V=e=>n(403,e),X=e=>n(404,e),Y=e=>n(409,e),Z=e=>n(412,e),n=(e,t)=>o=>{r(o,e,t)};export{K as a,k as b,z as c,G as d,L as e,A as f,Q as g,V as h,X as i,Y as j,Z as k,n as l,u as m,P as n,N as o,v as p};
2
+ //# sourceMappingURL=chunk-FZF5SWLV.mjs.map
@@ -1,2 +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 _chunkCRSLFS6Qjs = require('./chunk-CRSLFS6Q.js');var _chunkCIIR5CXZjs = require('./chunk-CIIR5CXZ.js');var S=(p=>(p.CART_ALREADY_EXISTS="CART_ALREADY_EXISTS",p.CART_IS_ALREADY_CLOSED="CART_IS_ALREADY_CLOSED",p.PRODUCT_ITEM_NOT_FOUND="PRODUCT_ITEM_NOT_FOUND",p.CART_IS_EMPTY="CART_IS_EMPTY",p.UNKNOWN_EVENT_TYPE="UNKNOWN_EVENT_TYPE",p.UNKNOWN_COMMAND_TYPE="UNKNOWN_COMMAND_TYPE",p))(S||{}),I= exports.b =(o,{productId:t,quantity:r,unitPrice:n})=>{if((_nullishCoalesce(_optionalChain([o, 'access', _ => _.find, 'call', _2 => _2(i=>i.productId===t&&i.unitPrice==n), 'optionalAccess', _3 => _3.quantity]), () => (0)))<r)throw new (0, _chunkCIIR5CXZjs.k)("PRODUCT_ITEM_NOT_FOUND")},g= exports.c =({type:o,data:t},r)=>{switch(o){case"OpenShoppingCart":{if(r.status!=="Empty")throw new (0, _chunkCIIR5CXZjs.k)("CART_ALREADY_EXISTS");return{type:"ShoppingCartOpened",data:{shoppingCartId:t.shoppingCartId,clientId:t.clientId,openedAt:t.now}}}case"AddProductItemToShoppingCart":{if(r.status!=="Pending")throw new (0, _chunkCIIR5CXZjs.k)("CART_IS_ALREADY_CLOSED");return{type:"ProductItemAddedToShoppingCart",data:{shoppingCartId:t.shoppingCartId,productItem:t.productItem}}}case"RemoveProductItemFromShoppingCart":{if(r.status!=="Pending")throw new (0, _chunkCIIR5CXZjs.k)("CART_IS_ALREADY_CLOSED");return I(r.productItems,t.productItem),{type:"ProductItemRemovedFromShoppingCart",data:{shoppingCartId:t.shoppingCartId,productItem:t.productItem}}}case"ConfirmShoppingCart":{if(r.status!=="Pending")throw new (0, _chunkCIIR5CXZjs.k)("CART_IS_ALREADY_CLOSED");if(r.productItems.length===0)throw new (0, _chunkCIIR5CXZjs.k)("CART_IS_EMPTY");return{type:"ShoppingCartConfirmed",data:{shoppingCartId:t.shoppingCartId,confirmedAt:t.now}}}case"CancelShoppingCart":{if(r.status!=="Pending")throw new (0, _chunkCIIR5CXZjs.k)("CART_IS_ALREADY_CLOSED");return{type:"ShoppingCartCanceled",data:{shoppingCartId:t.shoppingCartId,canceledAt:t.now}}}default:{let n=t;throw new (0, _chunkCIIR5CXZjs.j)("UNKNOWN_COMMAND_TYPE")}}},u= exports.d ={decide:g,evolve:_chunkCRSLFS6Qjs.c,initialState:()=>_chunkCRSLFS6Qjs.b};exports.a = S; exports.b = I; exports.c = g; exports.d = u;
2
- //# sourceMappingURL=chunk-BTHOS2SZ.js.map
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 _chunk2OMIUKHGjs = require('./chunk-2OMIUKHG.js');var _chunkSUF35K5Hjs = require('./chunk-SUF35K5H.js');var S=(p=>(p.CART_ALREADY_EXISTS="CART_ALREADY_EXISTS",p.CART_IS_ALREADY_CLOSED="CART_IS_ALREADY_CLOSED",p.PRODUCT_ITEM_NOT_FOUND="PRODUCT_ITEM_NOT_FOUND",p.CART_IS_EMPTY="CART_IS_EMPTY",p.UNKNOWN_EVENT_TYPE="UNKNOWN_EVENT_TYPE",p.UNKNOWN_COMMAND_TYPE="UNKNOWN_COMMAND_TYPE",p))(S||{}),I= exports.b =(o,{productId:t,quantity:r,unitPrice:n})=>{if((_nullishCoalesce(_optionalChain([o, 'access', _ => _.find, 'call', _2 => _2(i=>i.productId===t&&i.unitPrice==n), 'optionalAccess', _3 => _3.quantity]), () => (0)))<r)throw new (0, _chunkSUF35K5Hjs.k)("PRODUCT_ITEM_NOT_FOUND")},g= exports.c =({type:o,data:t},r)=>{switch(o){case"OpenShoppingCart":{if(r.status!=="Empty")throw new (0, _chunkSUF35K5Hjs.k)("CART_ALREADY_EXISTS");return{type:"ShoppingCartOpened",data:{shoppingCartId:t.shoppingCartId,clientId:t.clientId,openedAt:t.now}}}case"AddProductItemToShoppingCart":{if(r.status!=="Pending")throw new (0, _chunkSUF35K5Hjs.k)("CART_IS_ALREADY_CLOSED");return{type:"ProductItemAddedToShoppingCart",data:{shoppingCartId:t.shoppingCartId,productItem:t.productItem}}}case"RemoveProductItemFromShoppingCart":{if(r.status!=="Pending")throw new (0, _chunkSUF35K5Hjs.k)("CART_IS_ALREADY_CLOSED");return I(r.productItems,t.productItem),{type:"ProductItemRemovedFromShoppingCart",data:{shoppingCartId:t.shoppingCartId,productItem:t.productItem}}}case"ConfirmShoppingCart":{if(r.status!=="Pending")throw new (0, _chunkSUF35K5Hjs.k)("CART_IS_ALREADY_CLOSED");if(r.productItems.length===0)throw new (0, _chunkSUF35K5Hjs.k)("CART_IS_EMPTY");return{type:"ShoppingCartConfirmed",data:{shoppingCartId:t.shoppingCartId,confirmedAt:t.now}}}case"CancelShoppingCart":{if(r.status!=="Pending")throw new (0, _chunkSUF35K5Hjs.k)("CART_IS_ALREADY_CLOSED");return{type:"ShoppingCartCanceled",data:{shoppingCartId:t.shoppingCartId,canceledAt:t.now}}}default:{let n=t;throw new (0, _chunkSUF35K5Hjs.j)("UNKNOWN_COMMAND_TYPE")}}},u= exports.d ={decide:g,evolve:_chunk2OMIUKHGjs.c,initialState:()=>_chunk2OMIUKHGjs.b};exports.a = S; exports.b = I; exports.c = g; exports.d = u;
2
+ //# sourceMappingURL=chunk-RQIBUNWK.js.map
@@ -0,0 +1,7 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 M=e=>{let t=new Map;return{async aggregateStream(r,a){return e.aggregateStream(r,a)},readStream(r,a){return e.readStream(r,a)},appendToStream:async(r,a,s)=>{let i=await e.appendToStream(r,a,s),n=_nullishCoalesce(t.get(r), () => ([r,[]]));return t.set(r,[r,[...n[1],...a]]),i},appendedEvents:t,setup:async(r,a)=>e.appendToStream(r,a)}};var x=class extends Error{constructor(e){super(`Cannot parse! ${e}`)}},l={stringify:(e,t)=>JSON.stringify(_optionalChain([t, 'optionalAccess', _ => _.map])?t.map(e):e,(r,a)=>typeof a=="bigint"?a.toString():a),parse:(e,t)=>{let r=JSON.parse(e,_optionalChain([t, 'optionalAccess', _2 => _2.reviver]));if(_optionalChain([t, 'optionalAccess', _3 => _3.typeCheck])&&!_optionalChain([t, 'optionalAccess', _4 => _4.typeCheck, 'call', _5 => _5(r)]))throw new x(e);return _optionalChain([t, 'optionalAccess', _6 => _6.map])?t.map(r):r}};var c=class extends Error{constructor(e){super(e)}},g=(e,t)=>{let r=e,a=t;return h(r),h(a),Object.keys(a).every(s=>typeof a[s]=="object"?g(r[s],a[s]):a[s]===r[s])},j= exports.b =e=>{throw new c(_nullishCoalesce(e, () => ("That should not ever happened, right?")))};var T=(e,t,r)=>{if(!g(e,t))throw new c(_nullishCoalesce(r, () => (`subObj:
2
+ ${l.stringify(t)}
3
+ is not subset of
4
+ ${l.stringify(e)}`)))};function h(e,t){if(!e)throw new c(_nullishCoalesce(t, () => ("Condition is not truthy")))}function B(e,t,r){if(e!==t)throw new c(_nullishCoalesce(r, () => (`Objects are not equal:
5
+ Expected: ${l.stringify(e)}
6
+ Actual:${l.stringify(t)}`)))}var O=(e=>(e.NOT_A_NONEMPTY_STRING="NOT_A_NONEMPTY_STRING",e.NOT_A_POSITIVE_NUMBER="NOT_A_POSITIVE_NUMBER",e.NOT_AN_UNSIGNED_BIGINT="NOT_AN_UNSIGNED_BIGINT",e))(O||{}),y= exports.f =e=>typeof e=="number"&&e===e,w=e=>typeof e=="string",D= exports.g =e=>{if(!w(e)||e.length===0)throw new f("NOT_A_NONEMPTY_STRING");return e},V= exports.h =e=>{if(!y(e)||e<=0)throw new f("NOT_A_POSITIVE_NUMBER");return e},$= exports.i =e=>{let t=BigInt(e);if(t<0)throw new f("NOT_AN_UNSIGNED_BIGINT");return t};var d=class N extends Error{constructor(t){let r=t&&typeof t=="object"&&"errorCode"in t?t.errorCode:y(t)?t:500,a=t&&typeof t=="object"&&"message"in t?t.message:w(t)?t:`Error with status code '${r}' ocurred during Emmett processing`;super(a),this.errorCode=r,Object.setPrototypeOf(this,N.prototype)}};var f=class C extends d{constructor(t){super({errorCode:400,message:_nullishCoalesce(t, () => ("Validation Error ocurred during Emmett processing"))}),Object.setPrototypeOf(this,C.prototype)}},P= exports.k =class A extends d{constructor(t){super({errorCode:403,message:_nullishCoalesce(t, () => ("Illegal State ocurred during Emmett processing"))}),Object.setPrototypeOf(this,A.prototype)}};var U=(e,t,r,a,s=()=>{})=>{let i=!1,n=e.map(o=>r(o)?(i=!0,a(o)):o).filter(o=>o!==void 0).map(o=>{if(!o)throw Error("That should not happen");return o});return!i&&s()!==void 0?[...e,t]:n};var S="STREAM_DOES_NOT_EXIST",E="NO_CONCURRENCY_CHECK";var v=(e,t,r=a=>a)=>async(a,s,i,n)=>{let o=r(s),m=await a.aggregateStream(o,{evolve:e,initialState:t,read:{expectedStreamVersion:_nullishCoalesce(_optionalChain([n, 'optionalAccess', _7 => _7.expectedStreamVersion]), () => (E))}}),b=_nullishCoalesce(_optionalChain([m, 'optionalAccess', _8 => _8.state]), () => (t())),k=_optionalChain([m, 'optionalAccess', _9 => _9.currentStreamVersion]),u=i(b),p=Array.isArray(u)?u:[u],I=_nullishCoalesce(_nullishCoalesce(_optionalChain([n, 'optionalAccess', _10 => _10.expectedStreamVersion]), () => (k)), () => (S));return{...await a.appendToStream(o,p,{...n,expectedStreamVersion:I}),newEvents:p,newState:p.reduce(e,b)}};var q=({decide:e,evolve:t,initialState:r},a=s=>s)=>async(s,i,n,o)=>v(t,r,a)(s,i,m=>e(n,m),o);var _asyncretry = require('async-retry'); var _asyncretry2 = _interopRequireDefault(_asyncretry);var _webstreamspolyfill = require('web-streams-polyfill');var _uuid = require('uuid');exports.a = M; exports.b = j; exports.c = T; exports.d = h; exports.e = B; exports.f = y; exports.g = D; exports.h = V; exports.i = $; exports.j = d; exports.k = P; exports.l = U; exports.m = S; exports.n = q;
7
+ //# sourceMappingURL=chunk-SUF35K5H.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../emmett/src/testing/wrapEventStore.ts","../../emmett/src/serialization/json/JSONParser.ts","../../emmett/src/testing/assertions.ts","../../emmett/src/validation/index.ts","../../emmett/src/errors/index.ts","../../emmett/src/utils/merge.ts","../../emmett/src/eventStore/expectedVersion.ts","../../emmett/src/commandHandling/handleCommand.ts","../../emmett/src/commandHandling/handleCommandWithDecider.ts","../../emmett/src/streaming/restream.ts","../../emmett/src/eventStore/inMemoryEventStore.ts"],"names":["WrapEventStore","eventStore","appendedEvents","streamName","options","events","result","currentStream","ParseError","text","JSONParser","value","_","v","parsed","AssertionError","message","isSubset","superObj","subObj","sup","sub","assertOk","ele","assertFails","assertMatches","actual","expected","obj","assertEqual","ValidationErrors","isNumber","val","isString","assertNotEmptyString","ValidationError","assertPositiveNumber","assertUnsignedBigInt","number","EmmettError","_EmmettError","errorCode","_ValidationError","IllegalStateError","_IllegalStateError","merge","array","item","where","onExisting","onNotFound","wasFound","p","STREAM_DOES_NOT_EXIST","NO_CONCURRENCY_CHECK","CommandHandler","evolve","initialState","mapToStreamId","id","handle","aggregationResult","state","currentStreamVersion","newEvents","expectedStreamVersion","DeciderCommandHandler","decide","command","retry","TransformStream","randomUUID"],"mappings":"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","sourcesContent":["import type {\n AggregateStreamOptions,\n AggregateStreamResult,\n AppendToStreamOptions,\n AppendToStreamResult,\n DefaultStreamVersionType,\n EventStore,\n ReadStreamOptions,\n ReadStreamResult,\n} from '../eventStore';\nimport { type Event } from '../typing';\n\nexport type TestEventStream<EventType extends Event = Event> = [\n string,\n EventType[],\n];\n\nexport const WrapEventStore = <StreamVersion = DefaultStreamVersionType>(\n eventStore: EventStore<StreamVersion>,\n): EventStore<StreamVersion> & {\n appendedEvents: Map<string, TestEventStream>;\n setup<EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamVersion>>;\n} => {\n const appendedEvents = new Map<string, TestEventStream>();\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType, StreamVersion>,\n ): Promise<AggregateStreamResult<State, StreamVersion> | null> {\n return eventStore.aggregateStream(streamName, options);\n },\n\n readStream<EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<StreamVersion>,\n ): Promise<ReadStreamResult<EventType, StreamVersion>> {\n return eventStore.readStream(streamName, options);\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions<StreamVersion>,\n ): Promise<AppendToStreamResult<StreamVersion>> => {\n const result = await eventStore.appendToStream(\n streamName,\n events,\n options,\n );\n\n const currentStream = appendedEvents.get(streamName) ?? [streamName, []];\n\n appendedEvents.set(streamName, [\n streamName,\n [...currentStream[1], ...events],\n ]);\n\n return result;\n },\n\n appendedEvents,\n\n setup: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamVersion>> => {\n return eventStore.appendToStream(streamName, events);\n },\n };\n};\n","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 //TODO: Consider adding support to DateTime and adding specific format to mark that's a bigint\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n (_, v) => (typeof v === 'bigint' ? v.toString() : v),\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","import { JSONParser } from '../serialization';\nimport type { DefaultRecord } from '../typing';\nimport { deepEquals } from '../utils';\n\nexport class AssertionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\nexport const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as DefaultRecord;\n const sub = subObj as DefaultRecord;\n\n assertOk(sup);\n assertOk(sub);\n\n return Object.keys(sub).every((ele: string) => {\n if (typeof sub[ele] == 'object') {\n return isSubset(sup[ele], sub[ele]);\n }\n return sub[ele] === sup[ele];\n });\n};\n\nexport const assertFails = (message?: string) => {\n throw new AssertionError(message ?? 'That should not ever happened, right?');\n};\n\nexport const assertThrowsAsync = async <TError extends Error>(\n fun: () => Promise<void>,\n errorCheck?: (error: Error) => boolean,\n): Promise<TError> => {\n try {\n await fun();\n throw new AssertionError(\"Function didn't throw expected error\");\n } catch (error) {\n const typedError = error as TError;\n if (errorCheck) assertTrue(errorCheck(typedError));\n return typedError;\n }\n};\n\nexport const assertThrows = <TError extends Error>(\n fun: () => void,\n errorCheck?: (error: Error) => boolean,\n): TError => {\n try {\n fun();\n throw new AssertionError(\"Function didn't throw expected error\");\n } catch (error) {\n const typedError = error as TError;\n if (errorCheck) assertTrue(errorCheck(typedError));\n return typedError;\n }\n};\nexport const assertMatches = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!isSubset(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis not subset of\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertDeepEqual = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!deepEquals(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSONParser.stringify(expected)}\\nis equals to\\n${JSONParser.stringify(actual)}`,\n );\n};\n\nexport const assertThat = <T>(item: T) => {\n return {\n isEqualTo: (other: T) => assertTrue(deepEquals(item, other)),\n };\n};\n\nexport function assertFalse(\n condition: boolean,\n message?: string,\n): asserts condition is false {\n if (condition) throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertTrue(\n condition: boolean,\n message?: string,\n): asserts condition is true {\n if (!condition) throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertOk<T>(\n obj: T | null | undefined,\n message?: string,\n): asserts obj is T {\n if (!obj) throw new AssertionError(message ?? `Condition is not truthy`);\n}\n\nexport function assertEqual<T>(\n expected: T | null | undefined,\n actual: T | null | undefined,\n message?: string,\n): void {\n if (expected !== actual)\n throw new AssertionError(\n message ??\n `Objects are not equal:\\nExpected: ${JSONParser.stringify(expected)}\\nActual:${JSONParser.stringify(actual)}`,\n );\n}\n\nexport function assertNotEqual<T>(\n obj: T | null | undefined,\n other: T | null | undefined,\n message?: string,\n): void {\n if (obj === other)\n throw new AssertionError(\n message ?? `Objects are equal: ${JSONParser.stringify(obj)}`,\n );\n}\n\nexport function assertIsNotNull<T extends object | bigint>(\n result: T | null,\n): asserts result is T {\n assertNotEqual(result, null);\n assertOk(result);\n}\n\nexport function assertIsNull<T extends object>(\n result: T | null,\n): asserts result is null {\n assertEqual(result, null);\n}\n\ntype Call = {\n arguments: unknown[];\n result: unknown;\n target: unknown;\n this: unknown;\n};\n\nexport type ArgumentMatcher = (arg: unknown) => boolean;\n\nexport const argValue =\n <T>(value: T): ArgumentMatcher =>\n (arg) =>\n deepEquals(arg, value);\n\nexport const argMatches =\n <T>(matches: (arg: T) => boolean): ArgumentMatcher =>\n (arg) =>\n matches(arg as T);\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type MockedFunction = Function & { mock?: { calls: Call[] } };\n\nexport function verifyThat(fn: MockedFunction) {\n return {\n calledTimes: (times: number) => {\n assertEqual(fn.mock?.calls?.length, times);\n },\n notCalled: () => {\n assertEqual(fn?.mock?.calls?.length, 0);\n },\n called: () => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length > 0,\n );\n },\n calledWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledOnceWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length === 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length >= 1,\n );\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some(\n (call) =>\n call.arguments &&\n call.arguments.length >= matches.length &&\n matches.every((match, index) => match(call.arguments[index])),\n ),\n );\n },\n notCalledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertFalse(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls[0]!.arguments &&\n fn.mock.calls[0]!.arguments.length >= matches.length &&\n matches.every((match, index) =>\n match(fn.mock!.calls[0]!.arguments[index]),\n ),\n );\n },\n };\n}\n\nexport const assertThatArray = <T>(array: T[]) => {\n return {\n isEmpty: () => assertEqual(array.length, 0),\n hasSize: (length: number) => assertEqual(array.length, length),\n containsElements: (...other: T[]) => {\n assertTrue(other.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrder: (...other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrderElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n for (let i = 0; i < array.length; i++) {\n assertTrue(deepEquals(array[i], other[i]));\n }\n },\n containsExactly: (elem: T) => {\n assertEqual(array.length, 1);\n assertTrue(deepEquals(array[0], elem));\n },\n contains: (elem: T) => {\n assertTrue(array.some((a) => deepEquals(a, elem)));\n },\n containsOnlyOnceElementsOf: (other: T[]) => {\n assertTrue(\n other\n .map((o) => array.filter((a) => deepEquals(a, o)).length)\n .filter((a) => a === 1).length === other.length,\n );\n },\n containsAnyOf: (...other: T[]) => {\n assertTrue(array.some((a) => other.some((o) => deepEquals(a, o))));\n },\n allMatch: (matches: (item: T) => boolean) => {\n assertTrue(array.every(matches));\n },\n anyMatches: (matches: (item: T) => boolean) => {\n assertTrue(array.some(matches));\n },\n allMatchAsync: async (\n matches: (item: T) => Promise<boolean>,\n ): Promise<void> => {\n for (const item of array) {\n assertTrue(await matches(item));\n }\n },\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\nexport * from './dates';\n","import { isNumber, isString } from '../validation';\n\nexport type ErrorConstructor<ErrorType extends Error> = new (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: any[]\n) => ErrorType;\n\nexport const isErrorConstructor = <ErrorType extends Error>(\n // eslint-disable-next-line @typescript-eslint/ban-types\n expect: Function,\n): expect is ErrorConstructor<ErrorType> => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return (\n typeof expect === 'function' &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype.constructor === expect\n );\n};\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","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","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","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 StreamEvent extends Event,\n StreamVersion = DefaultStreamVersionType,\n> = AppendToStreamResult<StreamVersion> & {\n newState: State;\n newEvents: StreamEvent[];\n};\n\nexport const CommandHandler =\n <State, StreamEvent extends Event, StreamVersion = DefaultStreamVersionType>(\n evolve: (state: State, event: StreamEvent) => State,\n initialState: () => State,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async <Store extends EventStore<StreamVersion>>(\n eventStore: Store,\n id: string,\n handle: (state: State) => StreamEvent | StreamEvent[],\n options?: Parameters<Store['appendToStream']>[2] & {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ): Promise<CommandHandlerResult<State, StreamEvent, 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 initialState,\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 ?? initialState();\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 ...options,\n expectedStreamVersion,\n },\n );\n\n // 5. Return result with updated state\n return {\n ...appendResult,\n newEvents,\n newState: newEvents.reduce(evolve, state),\n };\n };\n// #endregion command-handler\n","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 { decide, evolve, initialState }: 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 initialState,\n mapToStreamId,\n )(eventStore, id, (state) => decide(command, state), options);\n// #endregion command-handler\n","import retry from 'async-retry';\nimport {\n ReadableStream,\n ReadableStreamDefaultReader,\n TransformStream,\n TransformStreamDefaultController,\n} from 'web-streams-polyfill';\nimport type { Decoder } from './decoders';\nimport { DefaultDecoder } from './decoders/composite';\n\nexport const restream = <\n Source = unknown,\n Transformed = Source,\n StreamType = object,\n>(\n createSourceStream: () => ReadableStream<StreamType>,\n transform: (input: Source) => Transformed = (source) =>\n source as unknown as Transformed,\n retryOptions: retry.Options = { forever: true, minTimeout: 25 },\n decoder: Decoder<StreamType, Source> = new DefaultDecoder<Source>(),\n): ReadableStream<Transformed> =>\n new TransformStream<Source, Transformed>({\n start(controller) {\n retry(\n () => onRestream(createSourceStream, controller, transform, decoder),\n retryOptions,\n ).catch((error) => {\n controller.error(error);\n });\n },\n }).readable;\n\nconst onRestream = async <StreamType, Source, Transformed = Source>(\n createSourceStream: () => ReadableStream<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<void> => {\n const sourceStream = createSourceStream();\n const reader = sourceStream.getReader();\n try {\n let done: boolean;\n\n do {\n done = await restreamChunk(reader, controller, transform, decoder);\n } while (!done);\n } finally {\n reader.releaseLock();\n }\n};\n\nconst restreamChunk = async <StreamType, Source, Transformed = Source>(\n reader: ReadableStreamDefaultReader<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<boolean> => {\n const { done: isDone, value } = await reader.read();\n\n if (value) decoder.addToBuffer(value);\n\n if (!isDone && !decoder.hasCompleteMessage()) return false;\n\n decodeAndTransform(decoder, transform, controller);\n\n if (isDone) {\n controller.terminate();\n }\n\n return isDone;\n};\n\nconst decodeAndTransform = <StreamType, Source, Transformed = Source>(\n decoder: Decoder<StreamType, Source>,\n transform: (input: Source) => Transformed,\n controller: TransformStreamDefaultController<Transformed>,\n) => {\n try {\n const decoded = decoder.decode();\n if (!decoded) return;\n\n const transformed = transform(decoded);\n controller.enqueue(transformed);\n } catch (error) {\n controller.error(new Error(`Decoding error: ${error?.toString()}`));\n }\n};\n","import { v4 as randomUUID } from 'uuid';\nimport type {\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../typing';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type DefaultStreamVersionType,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\n\nexport type EventHandler<E extends Event = Event> = (\n eventEnvelope: ReadEvent<E>,\n) => void;\n\nexport const getInMemoryEventStore = (): EventStore<\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n> => {\n const streams = new Map<string, ReadEvent[]>();\n\n const getAllEventsCount = () => {\n return Array.from<ReadEvent[]>(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, initialState, 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, initialState()),\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<\n ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n >\n > => {\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\n .map(\n (e) =>\n e as ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n )\n .slice(from, to)\n : [];\n\n const result: ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n > =\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: ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >[] = events.map((event, index) => {\n return {\n ...event,\n metadata: {\n ...(event.metadata ?? {}),\n streamName,\n eventId: randomUUID(),\n streamPosition: BigInt(currentEvents.length + index + 1),\n globalPosition: BigInt(getAllEventsCount() + index + 1),\n },\n };\n });\n\n const positionOfLastEventInTheStream = BigInt(\n eventEnvelopes.slice(-1)[0]!.metadata.streamPosition,\n );\n\n streams.set(streamName, [...currentEvents, ...eventEnvelopes]);\n\n const result: AppendToStreamResult = {\n nextExpectedStreamVersion: positionOfLastEventInTheStream,\n };\n\n return Promise.resolve(result);\n },\n };\n};\n"]}
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkBTHOS2SZjs = require('../../chunk-BTHOS2SZ.js');require('../../chunk-CRSLFS6Q.js');var _chunkNFF4ZR5Gjs = require('../../chunk-NFF4ZR5G.js');require('../../chunk-7H3QW2YD.js');require('../../chunk-IJQIPTU6.js');require('../../chunk-TIHSL46W.js');require('../../chunk-NZI5RAYP.js');var _chunkE4DZPUJHjs = require('../../chunk-E4DZPUJH.js');var _chunkCIIR5CXZjs = require('../../chunk-CIIR5CXZ.js');require('express');var u=_chunkCIIR5CXZjs.n.call(void 0, _chunkBTHOS2SZjs.d),P=o=>100,T= exports.shoppingCartApi =o=>i=>{i.post("/clients/:clientId/shopping-carts/",_chunkNFF4ZR5Gjs.a.call(void 0, async t=>{let e=_chunkCIIR5CXZjs.g.call(void 0, t.params.clientId),r=e,d=await u(o,r,{type:"OpenShoppingCart",data:{clientId:e,shoppingCartId:r,now:new Date}},{expectedStreamVersion:_chunkCIIR5CXZjs.m});return _chunkNFF4ZR5Gjs.c.call(void 0, {createdId:r,eTag:_chunkE4DZPUJHjs.f.call(void 0, d.nextExpectedStreamVersion)})})),i.post("/clients/:clientId/shopping-carts/:shoppingCartId/product-items",_chunkNFF4ZR5Gjs.a.call(void 0, async t=>{let e=_chunkCIIR5CXZjs.g.call(void 0, t.params.shoppingCartId),r={productId:_chunkCIIR5CXZjs.g.call(void 0, t.body.productId),quantity:_chunkCIIR5CXZjs.h.call(void 0, t.body.quantity)},d=P(r.productId),C=await u(o,e,{type:"AddProductItemToShoppingCart",data:{shoppingCartId:e,productItem:{...r,unitPrice:d}}},{expectedStreamVersion:_chunkCIIR5CXZjs.i.call(void 0, _chunkE4DZPUJHjs.j.call(void 0, t))});return _chunkNFF4ZR5Gjs.e.call(void 0, {eTag:_chunkE4DZPUJHjs.f.call(void 0, C.nextExpectedStreamVersion)})})),i.delete("/clients/:clientId/shopping-carts/:shoppingCartId/product-items",_chunkNFF4ZR5Gjs.a.call(void 0, async t=>{let e=_chunkCIIR5CXZjs.g.call(void 0, t.params.shoppingCartId),r={productId:_chunkCIIR5CXZjs.g.call(void 0, t.query.productId),quantity:_chunkCIIR5CXZjs.h.call(void 0, Number(t.query.quantity)),unitPrice:_chunkCIIR5CXZjs.h.call(void 0, Number(t.query.unitPrice))},d=await u(o,e,{type:"RemoveProductItemFromShoppingCart",data:{shoppingCartId:e,productItem:r}},{expectedStreamVersion:_chunkCIIR5CXZjs.i.call(void 0, _chunkE4DZPUJHjs.j.call(void 0, t))});return _chunkNFF4ZR5Gjs.e.call(void 0, {eTag:_chunkE4DZPUJHjs.f.call(void 0, d.nextExpectedStreamVersion)})})),i.post("/clients/:clientId/shopping-carts/:shoppingCartId/confirm",_chunkNFF4ZR5Gjs.a.call(void 0, async t=>{let e=_chunkCIIR5CXZjs.g.call(void 0, t.params.shoppingCartId),r=await u(o,e,{type:"ConfirmShoppingCart",data:{shoppingCartId:e,now:new Date}},{expectedStreamVersion:_chunkCIIR5CXZjs.i.call(void 0, _chunkE4DZPUJHjs.j.call(void 0, t))});return _chunkNFF4ZR5Gjs.e.call(void 0, {eTag:_chunkE4DZPUJHjs.f.call(void 0, r.nextExpectedStreamVersion)})})),i.delete("/clients/:clientId/shopping-carts/:shoppingCartId",_chunkNFF4ZR5Gjs.a.call(void 0, async t=>{let e=_chunkCIIR5CXZjs.g.call(void 0, t.params.shoppingCartId),r=await u(o,e,{type:"CancelShoppingCart",data:{shoppingCartId:e,now:new Date}},{expectedStreamVersion:_chunkCIIR5CXZjs.i.call(void 0, _chunkE4DZPUJHjs.j.call(void 0, t))});return _chunkNFF4ZR5Gjs.e.call(void 0, {eTag:_chunkE4DZPUJHjs.f.call(void 0, r.nextExpectedStreamVersion)})}))};exports.handle = u; exports.shoppingCartApi = T;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkRQIBUNWKjs = require('../../chunk-RQIBUNWK.js');require('../../chunk-2OMIUKHG.js');var _chunkBAE5MJFDjs = require('../../chunk-BAE5MJFD.js');require('../../chunk-7H3QW2YD.js');require('../../chunk-BAXKZVNV.js');require('../../chunk-2ZZC7RGZ.js');require('../../chunk-NZI5RAYP.js');var _chunkE4DZPUJHjs = require('../../chunk-E4DZPUJH.js');var _chunkSUF35K5Hjs = require('../../chunk-SUF35K5H.js');require('express');var u=_chunkSUF35K5Hjs.n.call(void 0, _chunkRQIBUNWKjs.d),P=o=>100,T= exports.shoppingCartApi =o=>i=>{i.post("/clients/:clientId/shopping-carts/",_chunkBAE5MJFDjs.a.call(void 0, async t=>{let e=_chunkSUF35K5Hjs.g.call(void 0, t.params.clientId),r=e,d=await u(o,r,{type:"OpenShoppingCart",data:{clientId:e,shoppingCartId:r,now:new Date}},{expectedStreamVersion:_chunkSUF35K5Hjs.m});return _chunkBAE5MJFDjs.c.call(void 0, {createdId:r,eTag:_chunkE4DZPUJHjs.f.call(void 0, d.nextExpectedStreamVersion)})})),i.post("/clients/:clientId/shopping-carts/:shoppingCartId/product-items",_chunkBAE5MJFDjs.a.call(void 0, async t=>{let e=_chunkSUF35K5Hjs.g.call(void 0, t.params.shoppingCartId),r={productId:_chunkSUF35K5Hjs.g.call(void 0, t.body.productId),quantity:_chunkSUF35K5Hjs.h.call(void 0, t.body.quantity)},d=P(r.productId),C=await u(o,e,{type:"AddProductItemToShoppingCart",data:{shoppingCartId:e,productItem:{...r,unitPrice:d}}},{expectedStreamVersion:_chunkSUF35K5Hjs.i.call(void 0, _chunkE4DZPUJHjs.j.call(void 0, t))});return _chunkBAE5MJFDjs.e.call(void 0, {eTag:_chunkE4DZPUJHjs.f.call(void 0, C.nextExpectedStreamVersion)})})),i.delete("/clients/:clientId/shopping-carts/:shoppingCartId/product-items",_chunkBAE5MJFDjs.a.call(void 0, async t=>{let e=_chunkSUF35K5Hjs.g.call(void 0, t.params.shoppingCartId),r={productId:_chunkSUF35K5Hjs.g.call(void 0, t.query.productId),quantity:_chunkSUF35K5Hjs.h.call(void 0, Number(t.query.quantity)),unitPrice:_chunkSUF35K5Hjs.h.call(void 0, Number(t.query.unitPrice))},d=await u(o,e,{type:"RemoveProductItemFromShoppingCart",data:{shoppingCartId:e,productItem:r}},{expectedStreamVersion:_chunkSUF35K5Hjs.i.call(void 0, _chunkE4DZPUJHjs.j.call(void 0, t))});return _chunkBAE5MJFDjs.e.call(void 0, {eTag:_chunkE4DZPUJHjs.f.call(void 0, d.nextExpectedStreamVersion)})})),i.post("/clients/:clientId/shopping-carts/:shoppingCartId/confirm",_chunkBAE5MJFDjs.a.call(void 0, async t=>{let e=_chunkSUF35K5Hjs.g.call(void 0, t.params.shoppingCartId),r=await u(o,e,{type:"ConfirmShoppingCart",data:{shoppingCartId:e,now:new Date}},{expectedStreamVersion:_chunkSUF35K5Hjs.i.call(void 0, _chunkE4DZPUJHjs.j.call(void 0, t))});return _chunkBAE5MJFDjs.e.call(void 0, {eTag:_chunkE4DZPUJHjs.f.call(void 0, r.nextExpectedStreamVersion)})})),i.delete("/clients/:clientId/shopping-carts/:shoppingCartId",_chunkBAE5MJFDjs.a.call(void 0, async t=>{let e=_chunkSUF35K5Hjs.g.call(void 0, t.params.shoppingCartId),r=await u(o,e,{type:"CancelShoppingCart",data:{shoppingCartId:e,now:new Date}},{expectedStreamVersion:_chunkSUF35K5Hjs.i.call(void 0, _chunkE4DZPUJHjs.j.call(void 0, t))});return _chunkBAE5MJFDjs.e.call(void 0, {eTag:_chunkE4DZPUJHjs.f.call(void 0, r.nextExpectedStreamVersion)})}))};exports.handle = u; exports.shoppingCartApi = T;
2
2
  //# sourceMappingURL=api.js.map
@@ -1,2 +1,2 @@
1
- import{d as l}from"../../chunk-TZWWEITQ.mjs";import"../../chunk-EVM4ZBYB.mjs";import{a as p,c as h,e as m}from"../../chunk-56DKNUKX.mjs";import"../../chunk-HKEQAT6F.mjs";import"../../chunk-3SNIQKLF.mjs";import"../../chunk-Y43VLATL.mjs";import"../../chunk-5C7LP2V7.mjs";import{f as a,j as c}from"../../chunk-GEU24YU2.mjs";import{g as n,h as I,i as s,m as g,n as y}from"../../chunk-IQQWOHEF.mjs";import"express";var u=y(l),P=o=>100,T=o=>i=>{i.post("/clients/:clientId/shopping-carts/",p(async t=>{let e=n(t.params.clientId),r=e,d=await u(o,r,{type:"OpenShoppingCart",data:{clientId:e,shoppingCartId:r,now:new Date}},{expectedStreamVersion:g});return h({createdId:r,eTag:a(d.nextExpectedStreamVersion)})})),i.post("/clients/:clientId/shopping-carts/:shoppingCartId/product-items",p(async t=>{let e=n(t.params.shoppingCartId),r={productId:n(t.body.productId),quantity:I(t.body.quantity)},d=P(r.productId),C=await u(o,e,{type:"AddProductItemToShoppingCart",data:{shoppingCartId:e,productItem:{...r,unitPrice:d}}},{expectedStreamVersion:s(c(t))});return m({eTag:a(C.nextExpectedStreamVersion)})})),i.delete("/clients/:clientId/shopping-carts/:shoppingCartId/product-items",p(async t=>{let e=n(t.params.shoppingCartId),r={productId:n(t.query.productId),quantity:I(Number(t.query.quantity)),unitPrice:I(Number(t.query.unitPrice))},d=await u(o,e,{type:"RemoveProductItemFromShoppingCart",data:{shoppingCartId:e,productItem:r}},{expectedStreamVersion:s(c(t))});return m({eTag:a(d.nextExpectedStreamVersion)})})),i.post("/clients/:clientId/shopping-carts/:shoppingCartId/confirm",p(async t=>{let e=n(t.params.shoppingCartId),r=await u(o,e,{type:"ConfirmShoppingCart",data:{shoppingCartId:e,now:new Date}},{expectedStreamVersion:s(c(t))});return m({eTag:a(r.nextExpectedStreamVersion)})})),i.delete("/clients/:clientId/shopping-carts/:shoppingCartId",p(async t=>{let e=n(t.params.shoppingCartId),r=await u(o,e,{type:"CancelShoppingCart",data:{shoppingCartId:e,now:new Date}},{expectedStreamVersion:s(c(t))});return m({eTag:a(r.nextExpectedStreamVersion)})}))};export{u as handle,T as shoppingCartApi};
1
+ import{d as l}from"../../chunk-FX4MW62Q.mjs";import"../../chunk-33CTWFPV.mjs";import{a as p,c as h,e as m}from"../../chunk-FZF5SWLV.mjs";import"../../chunk-HKEQAT6F.mjs";import"../../chunk-3A5QCRIL.mjs";import"../../chunk-4YSVF3JC.mjs";import"../../chunk-5C7LP2V7.mjs";import{f as a,j as c}from"../../chunk-GEU24YU2.mjs";import{g as n,h as I,i as s,m as g,n as y}from"../../chunk-FPBLKFXX.mjs";import"express";var u=y(l),P=o=>100,T=o=>i=>{i.post("/clients/:clientId/shopping-carts/",p(async t=>{let e=n(t.params.clientId),r=e,d=await u(o,r,{type:"OpenShoppingCart",data:{clientId:e,shoppingCartId:r,now:new Date}},{expectedStreamVersion:g});return h({createdId:r,eTag:a(d.nextExpectedStreamVersion)})})),i.post("/clients/:clientId/shopping-carts/:shoppingCartId/product-items",p(async t=>{let e=n(t.params.shoppingCartId),r={productId:n(t.body.productId),quantity:I(t.body.quantity)},d=P(r.productId),C=await u(o,e,{type:"AddProductItemToShoppingCart",data:{shoppingCartId:e,productItem:{...r,unitPrice:d}}},{expectedStreamVersion:s(c(t))});return m({eTag:a(C.nextExpectedStreamVersion)})})),i.delete("/clients/:clientId/shopping-carts/:shoppingCartId/product-items",p(async t=>{let e=n(t.params.shoppingCartId),r={productId:n(t.query.productId),quantity:I(Number(t.query.quantity)),unitPrice:I(Number(t.query.unitPrice))},d=await u(o,e,{type:"RemoveProductItemFromShoppingCart",data:{shoppingCartId:e,productItem:r}},{expectedStreamVersion:s(c(t))});return m({eTag:a(d.nextExpectedStreamVersion)})})),i.post("/clients/:clientId/shopping-carts/:shoppingCartId/confirm",p(async t=>{let e=n(t.params.shoppingCartId),r=await u(o,e,{type:"ConfirmShoppingCart",data:{shoppingCartId:e,now:new Date}},{expectedStreamVersion:s(c(t))});return m({eTag:a(r.nextExpectedStreamVersion)})})),i.delete("/clients/:clientId/shopping-carts/:shoppingCartId",p(async t=>{let e=n(t.params.shoppingCartId),r=await u(o,e,{type:"CancelShoppingCart",data:{shoppingCartId:e,now:new Date}},{expectedStreamVersion:s(c(t))});return m({eTag:a(r.nextExpectedStreamVersion)})}))};export{u as handle,T as shoppingCartApi};
2
2
  //# sourceMappingURL=api.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkBTHOS2SZjs = require('../../chunk-BTHOS2SZ.js');require('../../chunk-CRSLFS6Q.js');require('../../chunk-CIIR5CXZ.js');exports.ShoppingCartErrors = _chunkBTHOS2SZjs.a; exports.assertProductItemExists = _chunkBTHOS2SZjs.b; exports.decide = _chunkBTHOS2SZjs.c; exports.decider = _chunkBTHOS2SZjs.d;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkRQIBUNWKjs = require('../../chunk-RQIBUNWK.js');require('../../chunk-2OMIUKHG.js');require('../../chunk-SUF35K5H.js');exports.ShoppingCartErrors = _chunkRQIBUNWKjs.a; exports.assertProductItemExists = _chunkRQIBUNWKjs.b; exports.decide = _chunkRQIBUNWKjs.c; exports.decider = _chunkRQIBUNWKjs.d;
2
2
  //# sourceMappingURL=businessLogic.js.map
@@ -1,2 +1,2 @@
1
- import{a,b,c,d}from"../../chunk-TZWWEITQ.mjs";import"../../chunk-EVM4ZBYB.mjs";import"../../chunk-IQQWOHEF.mjs";export{a as ShoppingCartErrors,b as assertProductItemExists,c as decide,d as decider};
1
+ import{a,b,c,d}from"../../chunk-FX4MW62Q.mjs";import"../../chunk-33CTWFPV.mjs";import"../../chunk-FPBLKFXX.mjs";export{a as ShoppingCartErrors,b as assertProductItemExists,c as decide,d as decider};
2
2
  //# sourceMappingURL=businessLogic.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkCRSLFS6Qjs = require('../../chunk-CRSLFS6Q.js');require('../../chunk-CIIR5CXZ.js');exports.ShoppingCartErrors = _chunkCRSLFS6Qjs.e; exports.ShoppingCartStatus = _chunkCRSLFS6Qjs.a; exports.emptyShoppingCart = _chunkCRSLFS6Qjs.b; exports.evolve = _chunkCRSLFS6Qjs.c; exports.getShoppingCart = _chunkCRSLFS6Qjs.d;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk2OMIUKHGjs = require('../../chunk-2OMIUKHG.js');require('../../chunk-SUF35K5H.js');exports.ShoppingCartErrors = _chunk2OMIUKHGjs.e; exports.ShoppingCartStatus = _chunk2OMIUKHGjs.a; exports.emptyShoppingCart = _chunk2OMIUKHGjs.b; exports.evolve = _chunk2OMIUKHGjs.c; exports.getShoppingCart = _chunk2OMIUKHGjs.d;
2
2
  //# sourceMappingURL=shoppingCart.js.map
@@ -1,2 +1,2 @@
1
- import{a,b,c,d,e}from"../../chunk-EVM4ZBYB.mjs";import"../../chunk-IQQWOHEF.mjs";export{e as ShoppingCartErrors,a as ShoppingCartStatus,b as emptyShoppingCart,c as evolve,d as getShoppingCart};
1
+ import{a,b,c,d,e}from"../../chunk-33CTWFPV.mjs";import"../../chunk-FPBLKFXX.mjs";export{e as ShoppingCartErrors,a as ShoppingCartStatus,b as emptyShoppingCart,c as evolve,d as getShoppingCart};
2
2
  //# sourceMappingURL=shoppingCart.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE4DZPUJHjs = require('../chunk-E4DZPUJH.js');var _chunkCIIR5CXZjs = require('../chunk-CIIR5CXZ.js');require('supertest');var x=t=>{let s=t.headers.etag;_chunkCIIR5CXZjs.d.call(void 0, s),_chunkCIIR5CXZjs.c.call(void 0, s,/W\/"\d+.*"/);let e=_chunkE4DZPUJHjs.e.call(void 0, s);return _chunkCIIR5CXZjs.i.call(void 0, e)},m= exports.runTwice =t=>({expect:async e=>{let{first:c,second:p}=e,i=await c(t());return await p(t()),i}}),R= exports.statuses =(t,s)=>({first:e=>e.expect(t),second:e=>e.expect(s)});exports.expectNextRevisionInResponseEtag = x; exports.runTwice = m; exports.statuses = R;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE4DZPUJHjs = require('../chunk-E4DZPUJH.js');var _chunkSUF35K5Hjs = require('../chunk-SUF35K5H.js');require('supertest');var x=t=>{let s=t.headers.etag;_chunkSUF35K5Hjs.d.call(void 0, s),_chunkSUF35K5Hjs.c.call(void 0, s,/W\/"\d+.*"/);let e=_chunkE4DZPUJHjs.e.call(void 0, s);return _chunkSUF35K5Hjs.i.call(void 0, e)},m= exports.runTwice =t=>({expect:async e=>{let{first:c,second:p}=e,i=await c(t());return await p(t()),i}}),R= exports.statuses =(t,s)=>({first:e=>e.expect(t),second:e=>e.expect(s)});exports.expectNextRevisionInResponseEtag = x; exports.runTwice = m; exports.statuses = R;
2
2
  //# sourceMappingURL=testing.js.map
@@ -1,2 +1,2 @@
1
- import{e as a}from"../chunk-GEU24YU2.mjs";import{c as r,d as o,i as n}from"../chunk-IQQWOHEF.mjs";import"supertest";var x=t=>{let s=t.headers.etag;o(s),r(s,/W\/"\d+.*"/);let e=a(s);return n(e)},m=t=>({expect:async e=>{let{first:c,second:p}=e,i=await c(t());return await p(t()),i}}),R=(t,s)=>({first:e=>e.expect(t),second:e=>e.expect(s)});export{x as expectNextRevisionInResponseEtag,m as runTwice,R as statuses};
1
+ import{e as a}from"../chunk-GEU24YU2.mjs";import{c as r,d as o,i as n}from"../chunk-FPBLKFXX.mjs";import"supertest";var x=t=>{let s=t.headers.etag;o(s),r(s,/W\/"\d+.*"/);let e=a(s);return n(e)},m=t=>({expect:async e=>{let{first:c,second:p}=e,i=await c(t());return await p(t()),i}}),R=(t,s)=>({first:e=>e.expect(t),second:e=>e.expect(s)});export{x as expectNextRevisionInResponseEtag,m as runTwice,R as statuses};
2
2
  //# sourceMappingURL=testing.mjs.map
package/dist/etag.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE4DZPUJHjs = require('./chunk-E4DZPUJH.js');require('./chunk-CIIR5CXZ.js');exports.ETagErrors = _chunkE4DZPUJHjs.c; exports.HeaderNames = _chunkE4DZPUJHjs.a; exports.WeakETagRegex = _chunkE4DZPUJHjs.b; exports.getETagFromIfMatch = _chunkE4DZPUJHjs.g; exports.getETagFromIfNotMatch = _chunkE4DZPUJHjs.h; exports.getETagValueFromIfMatch = _chunkE4DZPUJHjs.j; exports.getWeakETagValue = _chunkE4DZPUJHjs.e; exports.isWeakETag = _chunkE4DZPUJHjs.d; exports.setETag = _chunkE4DZPUJHjs.i; exports.toWeakETag = _chunkE4DZPUJHjs.f;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkE4DZPUJHjs = require('./chunk-E4DZPUJH.js');require('./chunk-SUF35K5H.js');exports.ETagErrors = _chunkE4DZPUJHjs.c; exports.HeaderNames = _chunkE4DZPUJHjs.a; exports.WeakETagRegex = _chunkE4DZPUJHjs.b; exports.getETagFromIfMatch = _chunkE4DZPUJHjs.g; exports.getETagFromIfNotMatch = _chunkE4DZPUJHjs.h; exports.getETagValueFromIfMatch = _chunkE4DZPUJHjs.j; exports.getWeakETagValue = _chunkE4DZPUJHjs.e; exports.isWeakETag = _chunkE4DZPUJHjs.d; exports.setETag = _chunkE4DZPUJHjs.i; exports.toWeakETag = _chunkE4DZPUJHjs.f;
2
2
  //# sourceMappingURL=etag.js.map
package/dist/etag.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{a,b,c,d,e,f,g,h,i,j}from"./chunk-GEU24YU2.mjs";import"./chunk-IQQWOHEF.mjs";export{c as ETagErrors,a as HeaderNames,b as WeakETagRegex,g as getETagFromIfMatch,h as getETagFromIfNotMatch,j as getETagValueFromIfMatch,e as getWeakETagValue,d as isWeakETag,i as setETag,f as toWeakETag};
1
+ import{a,b,c,d,e,f,g,h,i,j}from"./chunk-GEU24YU2.mjs";import"./chunk-FPBLKFXX.mjs";export{c as ETagErrors,a as HeaderNames,b as WeakETagRegex,g as getETagFromIfMatch,h as getETagFromIfNotMatch,j as getETagValueFromIfMatch,e as getWeakETagValue,d as isWeakETag,i as setETag,f as toWeakETag};
2
2
  //# sourceMappingURL=etag.mjs.map
package/dist/handler.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkNFF4ZR5Gjs = require('./chunk-NFF4ZR5G.js');require('./chunk-7H3QW2YD.js');require('./chunk-IJQIPTU6.js');require('./chunk-TIHSL46W.js');require('./chunk-NZI5RAYP.js');require('./chunk-E4DZPUJH.js');require('./chunk-CIIR5CXZ.js');exports.Accepted = _chunkNFF4ZR5Gjs.d; exports.BadRequest = _chunkNFF4ZR5Gjs.g; exports.Conflict = _chunkNFF4ZR5Gjs.j; exports.Created = _chunkNFF4ZR5Gjs.c; exports.Forbidden = _chunkNFF4ZR5Gjs.h; exports.HttpProblem = _chunkNFF4ZR5Gjs.l; exports.HttpResponse = _chunkNFF4ZR5Gjs.f; exports.NoContent = _chunkNFF4ZR5Gjs.e; exports.NotFound = _chunkNFF4ZR5Gjs.i; exports.OK = _chunkNFF4ZR5Gjs.b; exports.PreconditionFailed = _chunkNFF4ZR5Gjs.k; exports.on = _chunkNFF4ZR5Gjs.a;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkBAE5MJFDjs = require('./chunk-BAE5MJFD.js');require('./chunk-7H3QW2YD.js');require('./chunk-BAXKZVNV.js');require('./chunk-2ZZC7RGZ.js');require('./chunk-NZI5RAYP.js');require('./chunk-E4DZPUJH.js');require('./chunk-SUF35K5H.js');exports.Accepted = _chunkBAE5MJFDjs.d; exports.BadRequest = _chunkBAE5MJFDjs.g; exports.Conflict = _chunkBAE5MJFDjs.j; exports.Created = _chunkBAE5MJFDjs.c; exports.Forbidden = _chunkBAE5MJFDjs.h; exports.HttpProblem = _chunkBAE5MJFDjs.l; exports.HttpResponse = _chunkBAE5MJFDjs.f; exports.NoContent = _chunkBAE5MJFDjs.e; exports.NotFound = _chunkBAE5MJFDjs.i; exports.OK = _chunkBAE5MJFDjs.b; exports.PreconditionFailed = _chunkBAE5MJFDjs.k; exports.on = _chunkBAE5MJFDjs.a;
2
2
  //# sourceMappingURL=handler.js.map
package/dist/handler.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{a,b,c,d,e,f,g,h,i,j,k,l}from"./chunk-56DKNUKX.mjs";import"./chunk-HKEQAT6F.mjs";import"./chunk-3SNIQKLF.mjs";import"./chunk-Y43VLATL.mjs";import"./chunk-5C7LP2V7.mjs";import"./chunk-GEU24YU2.mjs";import"./chunk-IQQWOHEF.mjs";export{d as Accepted,g as BadRequest,j as Conflict,c as Created,h as Forbidden,l as HttpProblem,f as HttpResponse,e as NoContent,i as NotFound,b as OK,k as PreconditionFailed,a as on};
1
+ import{a,b,c,d,e,f,g,h,i,j,k,l}from"./chunk-FZF5SWLV.mjs";import"./chunk-HKEQAT6F.mjs";import"./chunk-3A5QCRIL.mjs";import"./chunk-4YSVF3JC.mjs";import"./chunk-5C7LP2V7.mjs";import"./chunk-GEU24YU2.mjs";import"./chunk-FPBLKFXX.mjs";export{d as Accepted,g as BadRequest,j as Conflict,c as Created,h as Forbidden,l as HttpProblem,f as HttpResponse,e as NoContent,i as NotFound,b as OK,k as PreconditionFailed,a as on};
2
2
  //# sourceMappingURL=handler.mjs.map
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkNFF4ZR5Gjs = require('./chunk-NFF4ZR5G.js');require('./chunk-7H3QW2YD.js');var _chunkIJQIPTU6js = require('./chunk-IJQIPTU6.js');var _chunkTIHSL46Wjs = require('./chunk-TIHSL46W.js');var _chunkNZI5RAYPjs = require('./chunk-NZI5RAYP.js');var _chunkE4DZPUJHjs = require('./chunk-E4DZPUJH.js');require('./chunk-CIIR5CXZ.js');exports.Accepted = _chunkNFF4ZR5Gjs.d; exports.ApiE2ESpecification = _chunkIJQIPTU6js.a; exports.ApiSpecification = _chunkTIHSL46Wjs.f; exports.BadRequest = _chunkNFF4ZR5Gjs.g; exports.Conflict = _chunkNFF4ZR5Gjs.j; exports.Created = _chunkNFF4ZR5Gjs.c; exports.DefaultHttpProblemResponseOptions = _chunkNZI5RAYPjs.b; exports.DefaultHttpResponseOptions = _chunkNZI5RAYPjs.a; exports.ETagErrors = _chunkE4DZPUJHjs.c; exports.Forbidden = _chunkNFF4ZR5Gjs.h; exports.HeaderNames = _chunkE4DZPUJHjs.a; exports.HttpProblem = _chunkNFF4ZR5Gjs.l; exports.HttpResponse = _chunkNFF4ZR5Gjs.f; exports.NoContent = _chunkNFF4ZR5Gjs.e; exports.NotFound = _chunkNFF4ZR5Gjs.i; exports.OK = _chunkNFF4ZR5Gjs.b; exports.PreconditionFailed = _chunkNFF4ZR5Gjs.k; exports.WeakETagRegex = _chunkE4DZPUJHjs.b; exports.existingStream = _chunkTIHSL46Wjs.a; exports.expect = _chunkTIHSL46Wjs.b; exports.expectError = _chunkTIHSL46Wjs.e; exports.expectNewEvents = _chunkTIHSL46Wjs.c; exports.expectResponse = _chunkTIHSL46Wjs.d; exports.getApplication = _chunkNFF4ZR5Gjs.o; exports.getETagFromIfMatch = _chunkE4DZPUJHjs.g; exports.getETagFromIfNotMatch = _chunkE4DZPUJHjs.h; exports.getETagValueFromIfMatch = _chunkE4DZPUJHjs.j; exports.getWeakETagValue = _chunkE4DZPUJHjs.e; exports.isWeakETag = _chunkE4DZPUJHjs.d; exports.on = _chunkNFF4ZR5Gjs.a; exports.send = _chunkNZI5RAYPjs.e; exports.sendAccepted = _chunkNZI5RAYPjs.d; exports.sendCreated = _chunkNZI5RAYPjs.c; exports.sendProblem = _chunkNZI5RAYPjs.f; exports.setETag = _chunkE4DZPUJHjs.i; exports.startAPI = _chunkNFF4ZR5Gjs.p; exports.toWeakETag = _chunkE4DZPUJHjs.f;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkBAE5MJFDjs = require('./chunk-BAE5MJFD.js');require('./chunk-7H3QW2YD.js');var _chunkBAXKZVNVjs = require('./chunk-BAXKZVNV.js');var _chunk2ZZC7RGZjs = require('./chunk-2ZZC7RGZ.js');var _chunkNZI5RAYPjs = require('./chunk-NZI5RAYP.js');var _chunkE4DZPUJHjs = require('./chunk-E4DZPUJH.js');require('./chunk-SUF35K5H.js');exports.Accepted = _chunkBAE5MJFDjs.d; exports.ApiE2ESpecification = _chunkBAXKZVNVjs.a; exports.ApiSpecification = _chunk2ZZC7RGZjs.f; exports.BadRequest = _chunkBAE5MJFDjs.g; exports.Conflict = _chunkBAE5MJFDjs.j; exports.Created = _chunkBAE5MJFDjs.c; exports.DefaultHttpProblemResponseOptions = _chunkNZI5RAYPjs.b; exports.DefaultHttpResponseOptions = _chunkNZI5RAYPjs.a; exports.ETagErrors = _chunkE4DZPUJHjs.c; exports.Forbidden = _chunkBAE5MJFDjs.h; exports.HeaderNames = _chunkE4DZPUJHjs.a; exports.HttpProblem = _chunkBAE5MJFDjs.l; exports.HttpResponse = _chunkBAE5MJFDjs.f; exports.NoContent = _chunkBAE5MJFDjs.e; exports.NotFound = _chunkBAE5MJFDjs.i; exports.OK = _chunkBAE5MJFDjs.b; exports.PreconditionFailed = _chunkBAE5MJFDjs.k; exports.WeakETagRegex = _chunkE4DZPUJHjs.b; exports.existingStream = _chunk2ZZC7RGZjs.a; exports.expect = _chunk2ZZC7RGZjs.b; exports.expectError = _chunk2ZZC7RGZjs.e; exports.expectNewEvents = _chunk2ZZC7RGZjs.c; exports.expectResponse = _chunk2ZZC7RGZjs.d; exports.getApplication = _chunkBAE5MJFDjs.o; exports.getETagFromIfMatch = _chunkE4DZPUJHjs.g; exports.getETagFromIfNotMatch = _chunkE4DZPUJHjs.h; exports.getETagValueFromIfMatch = _chunkE4DZPUJHjs.j; exports.getWeakETagValue = _chunkE4DZPUJHjs.e; exports.isWeakETag = _chunkE4DZPUJHjs.d; exports.on = _chunkBAE5MJFDjs.a; exports.send = _chunkNZI5RAYPjs.e; exports.sendAccepted = _chunkNZI5RAYPjs.d; exports.sendCreated = _chunkNZI5RAYPjs.c; exports.sendProblem = _chunkNZI5RAYPjs.f; exports.setETag = _chunkE4DZPUJHjs.i; exports.startAPI = _chunkBAE5MJFDjs.p; exports.toWeakETag = _chunkE4DZPUJHjs.f;
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{a as k,b as l,c as m,d as n,e as o,f as p,g as q,h as r,i as s,j as t,k as u,l as v,o as J,p as K}from"./chunk-56DKNUKX.mjs";import"./chunk-HKEQAT6F.mjs";import{a as C}from"./chunk-3SNIQKLF.mjs";import{a as D,b as E,c as F,d as G,e as H,f as I}from"./chunk-Y43VLATL.mjs";import{a as w,b as x,c as y,d as z,e as A,f as B}from"./chunk-5C7LP2V7.mjs";import{a,b,c,d,e,f,g,h,i,j}from"./chunk-GEU24YU2.mjs";import"./chunk-IQQWOHEF.mjs";export{n as Accepted,C as ApiE2ESpecification,I as ApiSpecification,q as BadRequest,t as Conflict,m as Created,x as DefaultHttpProblemResponseOptions,w as DefaultHttpResponseOptions,c as ETagErrors,r as Forbidden,a as HeaderNames,v as HttpProblem,p as HttpResponse,o as NoContent,s as NotFound,l as OK,u as PreconditionFailed,b as WeakETagRegex,D as existingStream,E as expect,H as expectError,F as expectNewEvents,G as expectResponse,J as getApplication,g as getETagFromIfMatch,h as getETagFromIfNotMatch,j as getETagValueFromIfMatch,e as getWeakETagValue,d as isWeakETag,k as on,A as send,z as sendAccepted,y as sendCreated,B as sendProblem,i as setETag,K as startAPI,f as toWeakETag};
1
+ import{a as k,b as l,c as m,d as n,e as o,f as p,g as q,h as r,i as s,j as t,k as u,l as v,o as J,p as K}from"./chunk-FZF5SWLV.mjs";import"./chunk-HKEQAT6F.mjs";import{a as C}from"./chunk-3A5QCRIL.mjs";import{a as D,b as E,c as F,d as G,e as H,f as I}from"./chunk-4YSVF3JC.mjs";import{a as w,b as x,c as y,d as z,e as A,f as B}from"./chunk-5C7LP2V7.mjs";import{a,b,c,d,e,f,g,h,i,j}from"./chunk-GEU24YU2.mjs";import"./chunk-FPBLKFXX.mjs";export{n as Accepted,C as ApiE2ESpecification,I as ApiSpecification,q as BadRequest,t as Conflict,m as Created,x as DefaultHttpProblemResponseOptions,w as DefaultHttpResponseOptions,c as ETagErrors,r as Forbidden,a as HeaderNames,v as HttpProblem,p as HttpResponse,o as NoContent,s as NotFound,l as OK,u as PreconditionFailed,b as WeakETagRegex,D as existingStream,E as expect,H as expectError,F as expectNewEvents,G as expectResponse,J as getApplication,g as getETagFromIfMatch,h as getETagFromIfNotMatch,j as getETagValueFromIfMatch,e as getWeakETagValue,d as isWeakETag,k as on,A as send,z as sendAccepted,y as sendCreated,B as sendProblem,i as setETag,K as startAPI,f as toWeakETag};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkNFF4ZR5Gjs = require('../chunk-NFF4ZR5G.js');require('../chunk-7H3QW2YD.js');require('../chunk-IJQIPTU6.js');require('../chunk-TIHSL46W.js');require('../chunk-NZI5RAYP.js');require('../chunk-E4DZPUJH.js');require('../chunk-CIIR5CXZ.js');exports.defaulErrorToProblemDetailsMapping = _chunkNFF4ZR5Gjs.n; exports.problemDetailsMiddleware = _chunkNFF4ZR5Gjs.m;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkBAE5MJFDjs = require('../chunk-BAE5MJFD.js');require('../chunk-7H3QW2YD.js');require('../chunk-BAXKZVNV.js');require('../chunk-2ZZC7RGZ.js');require('../chunk-NZI5RAYP.js');require('../chunk-E4DZPUJH.js');require('../chunk-SUF35K5H.js');exports.defaulErrorToProblemDetailsMapping = _chunkBAE5MJFDjs.n; exports.problemDetailsMiddleware = _chunkBAE5MJFDjs.m;
2
2
  //# sourceMappingURL=problemDetailsMiddleware.js.map
@@ -1,2 +1,2 @@
1
- import{m as a,n as b}from"../chunk-56DKNUKX.mjs";import"../chunk-HKEQAT6F.mjs";import"../chunk-3SNIQKLF.mjs";import"../chunk-Y43VLATL.mjs";import"../chunk-5C7LP2V7.mjs";import"../chunk-GEU24YU2.mjs";import"../chunk-IQQWOHEF.mjs";export{b as defaulErrorToProblemDetailsMapping,a as problemDetailsMiddleware};
1
+ import{m as a,n as b}from"../chunk-FZF5SWLV.mjs";import"../chunk-HKEQAT6F.mjs";import"../chunk-3A5QCRIL.mjs";import"../chunk-4YSVF3JC.mjs";import"../chunk-5C7LP2V7.mjs";import"../chunk-GEU24YU2.mjs";import"../chunk-FPBLKFXX.mjs";export{b as defaulErrorToProblemDetailsMapping,a as problemDetailsMiddleware};
2
2
  //# sourceMappingURL=problemDetailsMiddleware.mjs.map
package/dist/responses.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkNZI5RAYPjs = require('./chunk-NZI5RAYP.js');require('./chunk-E4DZPUJH.js');require('./chunk-CIIR5CXZ.js');exports.DefaultHttpProblemResponseOptions = _chunkNZI5RAYPjs.b; exports.DefaultHttpResponseOptions = _chunkNZI5RAYPjs.a; exports.send = _chunkNZI5RAYPjs.e; exports.sendAccepted = _chunkNZI5RAYPjs.d; exports.sendCreated = _chunkNZI5RAYPjs.c; exports.sendProblem = _chunkNZI5RAYPjs.f;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkNZI5RAYPjs = require('./chunk-NZI5RAYP.js');require('./chunk-E4DZPUJH.js');require('./chunk-SUF35K5H.js');exports.DefaultHttpProblemResponseOptions = _chunkNZI5RAYPjs.b; exports.DefaultHttpResponseOptions = _chunkNZI5RAYPjs.a; exports.send = _chunkNZI5RAYPjs.e; exports.sendAccepted = _chunkNZI5RAYPjs.d; exports.sendCreated = _chunkNZI5RAYPjs.c; exports.sendProblem = _chunkNZI5RAYPjs.f;
2
2
  //# sourceMappingURL=responses.js.map
@@ -1,2 +1,2 @@
1
- import{a,b,c,d,e,f}from"./chunk-5C7LP2V7.mjs";import"./chunk-GEU24YU2.mjs";import"./chunk-IQQWOHEF.mjs";export{b as DefaultHttpProblemResponseOptions,a as DefaultHttpResponseOptions,e as send,d as sendAccepted,c as sendCreated,f as sendProblem};
1
+ import{a,b,c,d,e,f}from"./chunk-5C7LP2V7.mjs";import"./chunk-GEU24YU2.mjs";import"./chunk-FPBLKFXX.mjs";export{b as DefaultHttpProblemResponseOptions,a as DefaultHttpResponseOptions,e as send,d as sendAccepted,c as sendCreated,f as sendProblem};
2
2
  //# sourceMappingURL=responses.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkIJQIPTU6js = require('../chunk-IJQIPTU6.js');require('../chunk-CIIR5CXZ.js');exports.ApiE2ESpecification = _chunkIJQIPTU6js.a;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkBAXKZVNVjs = require('../chunk-BAXKZVNV.js');require('../chunk-SUF35K5H.js');exports.ApiE2ESpecification = _chunkBAXKZVNVjs.a;
2
2
  //# sourceMappingURL=apiE2ESpecification.js.map
@@ -1,2 +1,2 @@
1
- import{a}from"../chunk-3SNIQKLF.mjs";import"../chunk-IQQWOHEF.mjs";export{a as ApiE2ESpecification};
1
+ import{a}from"../chunk-3A5QCRIL.mjs";import"../chunk-FPBLKFXX.mjs";export{a as ApiE2ESpecification};
2
2
  //# sourceMappingURL=apiE2ESpecification.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkTIHSL46Wjs = require('../chunk-TIHSL46W.js');require('../chunk-CIIR5CXZ.js');exports.ApiSpecification = _chunkTIHSL46Wjs.f; exports.existingStream = _chunkTIHSL46Wjs.a; exports.expect = _chunkTIHSL46Wjs.b; exports.expectError = _chunkTIHSL46Wjs.e; exports.expectNewEvents = _chunkTIHSL46Wjs.c; exports.expectResponse = _chunkTIHSL46Wjs.d;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk2ZZC7RGZjs = require('../chunk-2ZZC7RGZ.js');require('../chunk-SUF35K5H.js');exports.ApiSpecification = _chunk2ZZC7RGZjs.f; exports.existingStream = _chunk2ZZC7RGZjs.a; exports.expect = _chunk2ZZC7RGZjs.b; exports.expectError = _chunk2ZZC7RGZjs.e; exports.expectNewEvents = _chunk2ZZC7RGZjs.c; exports.expectResponse = _chunk2ZZC7RGZjs.d;
2
2
  //# sourceMappingURL=apiSpecification.js.map
@@ -1,2 +1,2 @@
1
- import{a,b,c,d,e,f}from"../chunk-Y43VLATL.mjs";import"../chunk-IQQWOHEF.mjs";export{f as ApiSpecification,a as existingStream,b as expect,e as expectError,c as expectNewEvents,d as expectResponse};
1
+ import{a,b,c,d,e,f}from"../chunk-4YSVF3JC.mjs";import"../chunk-FPBLKFXX.mjs";export{f as ApiSpecification,a as existingStream,b as expect,e as expectError,c as expectNewEvents,d as expectResponse};
2
2
  //# sourceMappingURL=apiSpecification.mjs.map
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-7H3QW2YD.js');var _chunkIJQIPTU6js = require('../chunk-IJQIPTU6.js');var _chunkTIHSL46Wjs = require('../chunk-TIHSL46W.js');require('../chunk-CIIR5CXZ.js');exports.ApiE2ESpecification = _chunkIJQIPTU6js.a; exports.ApiSpecification = _chunkTIHSL46Wjs.f; exports.existingStream = _chunkTIHSL46Wjs.a; exports.expect = _chunkTIHSL46Wjs.b; exports.expectError = _chunkTIHSL46Wjs.e; exports.expectNewEvents = _chunkTIHSL46Wjs.c; exports.expectResponse = _chunkTIHSL46Wjs.d;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});require('../chunk-7H3QW2YD.js');var _chunkBAXKZVNVjs = require('../chunk-BAXKZVNV.js');var _chunk2ZZC7RGZjs = require('../chunk-2ZZC7RGZ.js');require('../chunk-SUF35K5H.js');exports.ApiE2ESpecification = _chunkBAXKZVNVjs.a; exports.ApiSpecification = _chunk2ZZC7RGZjs.f; exports.existingStream = _chunk2ZZC7RGZjs.a; exports.expect = _chunk2ZZC7RGZjs.b; exports.expectError = _chunk2ZZC7RGZjs.e; exports.expectNewEvents = _chunk2ZZC7RGZjs.c; exports.expectResponse = _chunk2ZZC7RGZjs.d;
2
2
  //# sourceMappingURL=index.js.map
@@ -1,2 +1,2 @@
1
- import"../chunk-HKEQAT6F.mjs";import{a}from"../chunk-3SNIQKLF.mjs";import{a as b,b as c,c as d,d as e,e as f,f as g}from"../chunk-Y43VLATL.mjs";import"../chunk-IQQWOHEF.mjs";export{a as ApiE2ESpecification,g as ApiSpecification,b as existingStream,c as expect,f as expectError,d as expectNewEvents,e as expectResponse};
1
+ import"../chunk-HKEQAT6F.mjs";import{a}from"../chunk-3A5QCRIL.mjs";import{a as b,b as c,c as d,d as e,e as f,f as g}from"../chunk-4YSVF3JC.mjs";import"../chunk-FPBLKFXX.mjs";export{a as ApiE2ESpecification,g as ApiSpecification,b as existingStream,c as expect,f as expectError,d as expectNewEvents,e as expectResponse};
2
2
  //# sourceMappingURL=index.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@event-driven-io/emmett-expressjs",
3
- "version": "0.11.2",
3
+ "version": "0.12.1",
4
4
  "description": "Emmett - Event Sourcing development made simple",
5
5
  "scripts": {
6
6
  "build": "tsup",
@@ -48,7 +48,7 @@
48
48
  "dependencies": {},
49
49
  "devDependencies": {},
50
50
  "peerDependencies": {
51
- "@event-driven-io/emmett": "0.11.2",
51
+ "@event-driven-io/emmett": "0.12.1",
52
52
  "@types/express": "4.17.21",
53
53
  "@types/supertest": "6.0.2",
54
54
  "express": "4.19.2",
@@ -1,8 +0,0 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 I=e=>{let t=new Map;return{async aggregateStream(r,a){return e.aggregateStream(r,a)},readStream(r,a){return e.readStream(r,a)},appendToStream:async(r,a,s)=>{let i=await e.appendToStream(r,a,s),n=_nullishCoalesce(t.get(r), () => ([r,[]]));return t.set(r,[r,[...n[1],...a]]),i},appendedEvents:t,setup:async(r,a)=>e.appendToStream(r,a)}};var l=class extends Error{constructor(e){super(e)}},h=(e,t)=>{let r=e,a=t;return p(r),p(a),Object.keys(a).every(s=>typeof a[s]=="object"?h(r[s],a[s]):a[s]===r[s])},M= exports.b =()=>{throw new l("That should not ever happened, right?")};var b=(e,t,r)=>{if(!h(e,t))throw new l(_nullishCoalesce(r, () => (`subObj:
2
- ${JSON.stringify(t)}
3
- is not subset of
4
- ${JSON.stringify(e)}`)))};function p(e,t){if(!e)throw new l(_nullishCoalesce(t, () => ("Condition is not truthy")))}function _(e,t,r){if(e!==t)throw new l(_nullishCoalesce(r, () => (`Objects are not equal:
5
- ${JSON.stringify(e)}
6
- compared:
7
- ${JSON.stringify(t)}`)))}var O=(e=>(e.NOT_A_NONEMPTY_STRING="NOT_A_NONEMPTY_STRING",e.NOT_A_POSITIVE_NUMBER="NOT_A_POSITIVE_NUMBER",e.NOT_AN_UNSIGNED_BIGINT="NOT_AN_UNSIGNED_BIGINT",e))(O||{}),g= exports.f =e=>typeof e=="number"&&e===e,y=e=>typeof e=="string",j= exports.g =e=>{if(!y(e)||e.length===0)throw new d("NOT_A_NONEMPTY_STRING");return e},B= exports.h =e=>{if(!g(e)||e<=0)throw new d("NOT_A_POSITIVE_NUMBER");return e},D= exports.i =e=>{let t=BigInt(e);if(t<0)throw new d("NOT_AN_UNSIGNED_BIGINT");return t};var c=class N extends Error{constructor(t){let r=t&&typeof t=="object"&&"errorCode"in t?t.errorCode:g(t)?t:500,a=t&&typeof t=="object"&&"message"in t?t.message:y(t)?t:`Error with status code '${r}' ocurred during Emmett processing`;super(a),this.errorCode=r,Object.setPrototypeOf(this,N.prototype)}};var d=class x extends c{constructor(t){super({errorCode:400,message:_nullishCoalesce(t, () => ("Validation Error ocurred during Emmett processing"))}),Object.setPrototypeOf(this,x.prototype)}},V= exports.k =class T extends c{constructor(t){super({errorCode:403,message:_nullishCoalesce(t, () => ("Illegal State ocurred during Emmett processing"))}),Object.setPrototypeOf(this,T.prototype)}};var $=(e,t,r,a,s=()=>{})=>{let i=!1,n=e.map(o=>r(o)?(i=!0,a(o)):o).filter(o=>o!==void 0).map(o=>{if(!o)throw Error("That should not happen");return o});return!i&&s()!==void 0?[...e,t]:n};var S="STREAM_DOES_NOT_EXIST",w="NO_CONCURRENCY_CHECK";var E=(e,t,r=a=>a)=>async(a,s,i,n)=>{let o=r(s),m=await a.aggregateStream(o,{evolve:e,initialState:t,read:{expectedStreamVersion:_nullishCoalesce(_optionalChain([n, 'optionalAccess', _2 => _2.expectedStreamVersion]), () => (w))}}),v=_nullishCoalesce(_optionalChain([m, 'optionalAccess', _3 => _3.state]), () => (t())),C=_optionalChain([m, 'optionalAccess', _4 => _4.currentStreamVersion]),f=i(v),u=Array.isArray(f)?f:[f],k=_nullishCoalesce(_nullishCoalesce(_optionalChain([n, 'optionalAccess', _5 => _5.expectedStreamVersion]), () => (C)), () => (S));return{...await a.appendToStream(o,u,{...n,expectedStreamVersion:k}),newEvents:u,newState:u.reduce(e,v)}};var U=({decide:e,evolve:t,initialState:r},a=s=>s)=>async(s,i,n,o)=>E(t,r,a)(s,i,m=>e(n,m),o);var _asyncretry = require('async-retry'); var _asyncretry2 = _interopRequireDefault(_asyncretry);var _webstreamspolyfill = require('web-streams-polyfill');var _uuid = require('uuid');exports.a = I; exports.b = M; exports.c = b; exports.d = p; exports.e = _; exports.f = g; exports.g = j; exports.h = B; exports.i = D; exports.j = c; exports.k = V; exports.l = $; exports.m = S; exports.n = U;
8
- //# sourceMappingURL=chunk-CIIR5CXZ.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../emmett/src/testing/wrapEventStore.ts","../../emmett/src/testing/assertions.ts","../../emmett/src/validation/index.ts","../../emmett/src/errors/index.ts","../../emmett/src/utils/merge.ts","../../emmett/src/eventStore/expectedVersion.ts","../../emmett/src/commandHandling/handleCommand.ts","../../emmett/src/commandHandling/handleCommandWithDecider.ts","../../emmett/src/streaming/restream.ts","../../emmett/src/eventStore/inMemoryEventStore.ts"],"names":["WrapEventStore","eventStore","appendedEvents","streamName","options","events","result","currentStream","AssertionError","message","isSubset","superObj","subObj","sup","sub","assertOk","ele","assertFails","assertMatches","actual","expected","obj","assertEqual","other","ValidationErrors","isNumber","val","isString","assertNotEmptyString","value","ValidationError","assertPositiveNumber","assertUnsignedBigInt","number","EmmettError","_EmmettError","errorCode","_ValidationError","IllegalStateError","_IllegalStateError","merge","array","item","where","onExisting","onNotFound","wasFound","p","STREAM_DOES_NOT_EXIST","NO_CONCURRENCY_CHECK","CommandHandler","evolve","initialState","mapToStreamId","id","handle","aggregationResult","state","currentStreamVersion","newEvents","expectedStreamVersion","DeciderCommandHandler","decide","command","retry","TransformStream","randomUUID"],"mappings":"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","sourcesContent":["import type {\n AggregateStreamOptions,\n AggregateStreamResult,\n AppendToStreamOptions,\n AppendToStreamResult,\n DefaultStreamVersionType,\n EventStore,\n ReadStreamOptions,\n ReadStreamResult,\n} from '../eventStore';\nimport { type Event } from '../typing';\n\nexport type TestEventStream<EventType extends Event = Event> = [\n string,\n EventType[],\n];\n\nexport const WrapEventStore = <StreamVersion = DefaultStreamVersionType>(\n eventStore: EventStore<StreamVersion>,\n): EventStore<StreamVersion> & {\n appendedEvents: Map<string, TestEventStream>;\n setup<EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamVersion>>;\n} => {\n const appendedEvents = new Map<string, TestEventStream>();\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType, StreamVersion>,\n ): Promise<AggregateStreamResult<State, StreamVersion> | null> {\n return eventStore.aggregateStream(streamName, options);\n },\n\n readStream<EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<StreamVersion>,\n ): Promise<ReadStreamResult<EventType, StreamVersion>> {\n return eventStore.readStream(streamName, options);\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions<StreamVersion>,\n ): Promise<AppendToStreamResult<StreamVersion>> => {\n const result = await eventStore.appendToStream(\n streamName,\n events,\n options,\n );\n\n const currentStream = appendedEvents.get(streamName) ?? [streamName, []];\n\n appendedEvents.set(streamName, [\n streamName,\n [...currentStream[1], ...events],\n ]);\n\n return result;\n },\n\n appendedEvents,\n\n setup: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamVersion>> => {\n return eventStore.appendToStream(streamName, events);\n },\n };\n};\n","import type { DefaultRecord } from '../typing';\nimport { deepEquals } from '../utils';\n\nexport class AssertionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\nexport const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as DefaultRecord;\n const sub = subObj as DefaultRecord;\n\n assertOk(sup);\n assertOk(sub);\n\n return Object.keys(sub).every((ele: string) => {\n if (typeof sub[ele] == 'object') {\n return isSubset(sup[ele], sub[ele]);\n }\n return sub[ele] === sup[ele];\n });\n};\n\nexport const assertFails = () => {\n throw new AssertionError('That should not ever happened, right?');\n};\n\nexport const assertThrows = (\n fun: () => void,\n errorCheck?: (error: Error) => boolean,\n) => {\n try {\n fun();\n throw new AssertionError(\"Function didn't throw expected error\");\n } catch (error) {\n if (errorCheck) assertTrue(errorCheck(error as Error));\n }\n};\n\nexport const assertMatches = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!isSubset(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSON.stringify(expected)}\\nis not subset of\\n${JSON.stringify(actual)}`,\n );\n};\n\nexport const assertDeepEqual = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!deepEquals(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSON.stringify(expected)}\\nis equals to\\n${JSON.stringify(actual)}`,\n );\n};\n\nexport const assertThat = <T>(item: T) => {\n return {\n isEqualTo: (other: T) => assertTrue(deepEquals(item, other)),\n };\n};\n\nexport function assertFalse(\n condition: boolean,\n message?: string,\n): asserts condition is false {\n if (condition) throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertTrue(\n condition: boolean,\n message?: string,\n): asserts condition is true {\n if (!condition) throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertOk<T>(\n obj: T | null | undefined,\n message?: string,\n): asserts obj is T {\n if (!obj) throw new AssertionError(message ?? `Condition is not truthy`);\n}\n\nexport function assertEqual<T>(\n obj: T | null | undefined,\n other: T | null | undefined,\n message?: string,\n): void {\n if (obj !== other)\n throw new AssertionError(\n message ??\n `Objects are not equal:\\n ${JSON.stringify(obj)}\\ncompared:\\n${JSON.stringify(other)}`,\n );\n}\n\nexport function assertNotEqual<T>(\n obj: T | null | undefined,\n other: T | null | undefined,\n message?: string,\n): void {\n if (obj === other)\n throw new AssertionError(\n message ?? `Objects are equal: ${JSON.stringify(obj)}`,\n );\n}\n\nexport function assertIsNotNull<T extends object>(\n result: T | null,\n): asserts result is T {\n assertNotEqual(result, null);\n assertOk(result);\n}\n\nexport function assertIsNull<T extends object>(\n result: T | null,\n): asserts result is null {\n assertEqual(result, null);\n}\n\ntype Call = {\n arguments: unknown[];\n result: unknown;\n target: unknown;\n this: unknown;\n};\n\nexport type ArgumentMatcher = (arg: unknown) => boolean;\n\nexport const argValue =\n <T>(value: T): ArgumentMatcher =>\n (arg) =>\n deepEquals(arg, value);\n\nexport const argMatches =\n <T>(matches: (arg: T) => boolean): ArgumentMatcher =>\n (arg) =>\n matches(arg as T);\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type MockedFunction = Function & { mock?: { calls: Call[] } };\n\nexport function verifyThat(fn: MockedFunction) {\n return {\n calledTimes: (times: number) => {\n assertEqual(fn.mock?.calls?.length, times);\n },\n notCalled: () => {\n assertEqual(fn?.mock?.calls?.length, 0);\n },\n called: () => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length > 0,\n );\n },\n calledWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledOnceWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length === 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length >= 1,\n );\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some(\n (call) =>\n call.arguments &&\n call.arguments.length >= matches.length &&\n matches.every((match, index) => match(call.arguments[index])),\n ),\n );\n },\n notCalledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertFalse(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls[0]!.arguments &&\n fn.mock.calls[0]!.arguments.length >= matches.length &&\n matches.every((match, index) =>\n match(fn.mock!.calls[0]!.arguments[index]),\n ),\n );\n },\n };\n}\n\nexport const assertThatArray = <T>(array: T[]) => {\n return {\n isEmpty: () => assertEqual(array.length, 0),\n hasSize: (length: number) => assertEqual(array.length, length),\n containsElements: (...other: T[]) => {\n assertTrue(other.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrder: (...other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrderElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n for (let i = 0; i < array.length; i++) {\n assertTrue(deepEquals(array[i], other[i]));\n }\n },\n containsExactly: (elem: T) => {\n assertEqual(array.length, 1);\n assertTrue(deepEquals(array[0], elem));\n },\n contains: (elem: T) => {\n assertTrue(array.some((a) => deepEquals(a, elem)));\n },\n containsOnlyOnceElementsOf: (other: T[]) => {\n assertTrue(\n other\n .map((o) => array.filter((a) => deepEquals(a, o)).length)\n .filter((a) => a === 1).length === other.length,\n );\n },\n containsAnyOf: (...other: T[]) => {\n assertTrue(array.some((a) => other.some((o) => deepEquals(a, o))));\n },\n allMatch: (matches: (item: T) => boolean) => {\n assertTrue(array.every(matches));\n },\n anyMatches: (matches: (item: T) => boolean) => {\n assertTrue(array.some(matches));\n },\n allMatchAsync: async (\n matches: (item: T) => Promise<boolean>,\n ): Promise<void> => {\n for (const item of array) {\n assertTrue(await matches(item));\n }\n },\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\nexport * from './dates';\n","import { isNumber, isString } from '../validation';\n\nexport type ErrorConstructor<ErrorType extends Error> = new (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: any[]\n) => ErrorType;\n\nexport const isErrorConstructor = <ErrorType extends Error>(\n // eslint-disable-next-line @typescript-eslint/ban-types\n expect: Function,\n): expect is ErrorConstructor<ErrorType> => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return (\n typeof expect === 'function' &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype.constructor === expect\n );\n};\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","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","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","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 StreamEvent extends Event,\n StreamVersion = DefaultStreamVersionType,\n> = AppendToStreamResult<StreamVersion> & {\n newState: State;\n newEvents: StreamEvent[];\n};\n\nexport const CommandHandler =\n <State, StreamEvent extends Event, StreamVersion = DefaultStreamVersionType>(\n evolve: (state: State, event: StreamEvent) => State,\n initialState: () => State,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async <Store extends EventStore<StreamVersion>>(\n eventStore: Store,\n id: string,\n handle: (state: State) => StreamEvent | StreamEvent[],\n options?: Parameters<Store['appendToStream']>[2] & {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ): Promise<CommandHandlerResult<State, StreamEvent, 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 initialState,\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 ?? initialState();\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 ...options,\n expectedStreamVersion,\n },\n );\n\n // 5. Return result with updated state\n return {\n ...appendResult,\n newEvents,\n newState: newEvents.reduce(evolve, state),\n };\n };\n// #endregion command-handler\n","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 { decide, evolve, initialState }: 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 initialState,\n mapToStreamId,\n )(eventStore, id, (state) => decide(command, state), options);\n// #endregion command-handler\n","import retry from 'async-retry';\nimport {\n ReadableStream,\n ReadableStreamDefaultReader,\n TransformStream,\n TransformStreamDefaultController,\n} from 'web-streams-polyfill';\nimport type { Decoder } from './decoders';\nimport { DefaultDecoder } from './decoders/composite';\n\nexport const restream = <\n Source = unknown,\n Transformed = Source,\n StreamType = object,\n>(\n createSourceStream: () => ReadableStream<StreamType>,\n transform: (input: Source) => Transformed = (source) =>\n source as unknown as Transformed,\n retryOptions: retry.Options = { forever: true, minTimeout: 25 },\n decoder: Decoder<StreamType, Source> = new DefaultDecoder<Source>(),\n): ReadableStream<Transformed> =>\n new TransformStream<Source, Transformed>({\n start(controller) {\n retry(\n () => onRestream(createSourceStream, controller, transform, decoder),\n retryOptions,\n ).catch((error) => {\n controller.error(error);\n });\n },\n }).readable;\n\nconst onRestream = async <StreamType, Source, Transformed = Source>(\n createSourceStream: () => ReadableStream<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<void> => {\n const sourceStream = createSourceStream();\n const reader = sourceStream.getReader();\n try {\n let done: boolean;\n\n do {\n done = await restreamChunk(reader, controller, transform, decoder);\n } while (!done);\n } finally {\n reader.releaseLock();\n }\n};\n\nconst restreamChunk = async <StreamType, Source, Transformed = Source>(\n reader: ReadableStreamDefaultReader<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<boolean> => {\n const { done: isDone, value } = await reader.read();\n\n if (value) decoder.addToBuffer(value);\n\n if (!isDone && !decoder.hasCompleteMessage()) return false;\n\n decodeAndTransform(decoder, transform, controller);\n\n if (isDone) {\n controller.terminate();\n }\n\n return isDone;\n};\n\nconst decodeAndTransform = <StreamType, Source, Transformed = Source>(\n decoder: Decoder<StreamType, Source>,\n transform: (input: Source) => Transformed,\n controller: TransformStreamDefaultController<Transformed>,\n) => {\n try {\n const decoded = decoder.decode();\n if (!decoded) return;\n\n const transformed = transform(decoded);\n controller.enqueue(transformed);\n } catch (error) {\n controller.error(new Error(`Decoding error: ${error?.toString()}`));\n }\n};\n","import { v4 as randomUUID } from 'uuid';\nimport type {\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../typing';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type DefaultStreamVersionType,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\n\nexport type EventHandler<E extends Event = Event> = (\n eventEnvelope: ReadEvent<E>,\n) => void;\n\nexport const getInMemoryEventStore = (): EventStore<\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n> => {\n const streams = new Map<string, ReadEvent[]>();\n\n const getAllEventsCount = () => {\n return Array.from<ReadEvent[]>(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, initialState, 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, initialState()),\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<\n ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n >\n > => {\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\n .map(\n (e) =>\n e as ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n )\n .slice(from, to)\n : [];\n\n const result: ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n > =\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: ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >[] = events.map((event, index) => {\n return {\n ...event,\n metadata: {\n ...(event.metadata ?? {}),\n streamName,\n eventId: randomUUID(),\n streamPosition: BigInt(currentEvents.length + index + 1),\n globalPosition: BigInt(getAllEventsCount() + index + 1),\n },\n };\n });\n\n const positionOfLastEventInTheStream = BigInt(\n eventEnvelopes.slice(-1)[0]!.metadata.streamPosition,\n );\n\n streams.set(streamName, [...currentEvents, ...eventEnvelopes]);\n\n const result: AppendToStreamResult = {\n nextExpectedStreamVersion: positionOfLastEventInTheStream,\n };\n\n return Promise.resolve(result);\n },\n };\n};\n"]}
@@ -1,8 +0,0 @@
1
- var I=e=>{let t=new Map;return{async aggregateStream(r,a){return e.aggregateStream(r,a)},readStream(r,a){return e.readStream(r,a)},appendToStream:async(r,a,s)=>{let i=await e.appendToStream(r,a,s),n=t.get(r)??[r,[]];return t.set(r,[r,[...n[1],...a]]),i},appendedEvents:t,setup:async(r,a)=>e.appendToStream(r,a)}};var l=class extends Error{constructor(e){super(e)}},h=(e,t)=>{let r=e,a=t;return p(r),p(a),Object.keys(a).every(s=>typeof a[s]=="object"?h(r[s],a[s]):a[s]===r[s])},M=()=>{throw new l("That should not ever happened, right?")};var b=(e,t,r)=>{if(!h(e,t))throw new l(r??`subObj:
2
- ${JSON.stringify(t)}
3
- is not subset of
4
- ${JSON.stringify(e)}`)};function p(e,t){if(!e)throw new l(t??"Condition is not truthy")}function _(e,t,r){if(e!==t)throw new l(r??`Objects are not equal:
5
- ${JSON.stringify(e)}
6
- compared:
7
- ${JSON.stringify(t)}`)}var O=(e=>(e.NOT_A_NONEMPTY_STRING="NOT_A_NONEMPTY_STRING",e.NOT_A_POSITIVE_NUMBER="NOT_A_POSITIVE_NUMBER",e.NOT_AN_UNSIGNED_BIGINT="NOT_AN_UNSIGNED_BIGINT",e))(O||{}),g=e=>typeof e=="number"&&e===e,y=e=>typeof e=="string",j=e=>{if(!y(e)||e.length===0)throw new d("NOT_A_NONEMPTY_STRING");return e},B=e=>{if(!g(e)||e<=0)throw new d("NOT_A_POSITIVE_NUMBER");return e},D=e=>{let t=BigInt(e);if(t<0)throw new d("NOT_AN_UNSIGNED_BIGINT");return t};var c=class N extends Error{errorCode;constructor(t){let r=t&&typeof t=="object"&&"errorCode"in t?t.errorCode:g(t)?t:500,a=t&&typeof t=="object"&&"message"in t?t.message:y(t)?t:`Error with status code '${r}' ocurred during Emmett processing`;super(a),this.errorCode=r,Object.setPrototypeOf(this,N.prototype)}};var d=class x extends c{constructor(t){super({errorCode:400,message:t??"Validation Error ocurred during Emmett processing"}),Object.setPrototypeOf(this,x.prototype)}},V=class T extends c{constructor(t){super({errorCode:403,message:t??"Illegal State ocurred during Emmett processing"}),Object.setPrototypeOf(this,T.prototype)}};var $=(e,t,r,a,s=()=>{})=>{let i=!1,n=e.map(o=>r(o)?(i=!0,a(o)):o).filter(o=>o!==void 0).map(o=>{if(!o)throw Error("That should not happen");return o});return!i&&s()!==void 0?[...e,t]:n};var S="STREAM_DOES_NOT_EXIST",w="NO_CONCURRENCY_CHECK";var E=(e,t,r=a=>a)=>async(a,s,i,n)=>{let o=r(s),m=await a.aggregateStream(o,{evolve:e,initialState:t,read:{expectedStreamVersion:n?.expectedStreamVersion??w}}),v=m?.state??t(),C=m?.currentStreamVersion,f=i(v),u=Array.isArray(f)?f:[f],k=n?.expectedStreamVersion??C??S;return{...await a.appendToStream(o,u,{...n,expectedStreamVersion:k}),newEvents:u,newState:u.reduce(e,v)}};var U=({decide:e,evolve:t,initialState:r},a=s=>s)=>async(s,i,n,o)=>E(t,r,a)(s,i,m=>e(n,m),o);import ve from"async-retry";import{TransformStream as Oe}from"web-streams-polyfill";import{v4 as Ue}from"uuid";export{I as a,M as b,b as c,p as d,_ as e,g as f,j as g,B as h,D as i,c as j,V as k,$ as l,S as m,U as n};
8
- //# sourceMappingURL=chunk-IQQWOHEF.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../emmett/src/testing/wrapEventStore.ts","../../emmett/src/testing/assertions.ts","../../emmett/src/validation/index.ts","../../emmett/src/errors/index.ts","../../emmett/src/validation/dates.ts","../../emmett/src/utils/merge.ts","../../emmett/src/eventStore/expectedVersion.ts","../../emmett/src/commandHandling/handleCommand.ts","../../emmett/src/commandHandling/handleCommandWithDecider.ts","../../emmett/src/streaming/restream.ts","../../emmett/src/eventStore/inMemoryEventStore.ts"],"sourcesContent":["import type {\n AggregateStreamOptions,\n AggregateStreamResult,\n AppendToStreamOptions,\n AppendToStreamResult,\n DefaultStreamVersionType,\n EventStore,\n ReadStreamOptions,\n ReadStreamResult,\n} from '../eventStore';\nimport { type Event } from '../typing';\n\nexport type TestEventStream<EventType extends Event = Event> = [\n string,\n EventType[],\n];\n\nexport const WrapEventStore = <StreamVersion = DefaultStreamVersionType>(\n eventStore: EventStore<StreamVersion>,\n): EventStore<StreamVersion> & {\n appendedEvents: Map<string, TestEventStream>;\n setup<EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamVersion>>;\n} => {\n const appendedEvents = new Map<string, TestEventStream>();\n\n return {\n async aggregateStream<State, EventType extends Event>(\n streamName: string,\n options: AggregateStreamOptions<State, EventType, StreamVersion>,\n ): Promise<AggregateStreamResult<State, StreamVersion> | null> {\n return eventStore.aggregateStream(streamName, options);\n },\n\n readStream<EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions<StreamVersion>,\n ): Promise<ReadStreamResult<EventType, StreamVersion>> {\n return eventStore.readStream(streamName, options);\n },\n\n appendToStream: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n options?: AppendToStreamOptions<StreamVersion>,\n ): Promise<AppendToStreamResult<StreamVersion>> => {\n const result = await eventStore.appendToStream(\n streamName,\n events,\n options,\n );\n\n const currentStream = appendedEvents.get(streamName) ?? [streamName, []];\n\n appendedEvents.set(streamName, [\n streamName,\n [...currentStream[1], ...events],\n ]);\n\n return result;\n },\n\n appendedEvents,\n\n setup: async <EventType extends Event>(\n streamName: string,\n events: EventType[],\n ): Promise<AppendToStreamResult<StreamVersion>> => {\n return eventStore.appendToStream(streamName, events);\n },\n };\n};\n","import type { DefaultRecord } from '../typing';\nimport { deepEquals } from '../utils';\n\nexport class AssertionError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\nexport const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as DefaultRecord;\n const sub = subObj as DefaultRecord;\n\n assertOk(sup);\n assertOk(sub);\n\n return Object.keys(sub).every((ele: string) => {\n if (typeof sub[ele] == 'object') {\n return isSubset(sup[ele], sub[ele]);\n }\n return sub[ele] === sup[ele];\n });\n};\n\nexport const assertFails = () => {\n throw new AssertionError('That should not ever happened, right?');\n};\n\nexport const assertThrows = (\n fun: () => void,\n errorCheck?: (error: Error) => boolean,\n) => {\n try {\n fun();\n throw new AssertionError(\"Function didn't throw expected error\");\n } catch (error) {\n if (errorCheck) assertTrue(errorCheck(error as Error));\n }\n};\n\nexport const assertMatches = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!isSubset(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSON.stringify(expected)}\\nis not subset of\\n${JSON.stringify(actual)}`,\n );\n};\n\nexport const assertDeepEqual = (\n actual: unknown,\n expected: unknown,\n message?: string,\n) => {\n if (!deepEquals(actual, expected))\n throw new AssertionError(\n message ??\n `subObj:\\n${JSON.stringify(expected)}\\nis equals to\\n${JSON.stringify(actual)}`,\n );\n};\n\nexport const assertThat = <T>(item: T) => {\n return {\n isEqualTo: (other: T) => assertTrue(deepEquals(item, other)),\n };\n};\n\nexport function assertFalse(\n condition: boolean,\n message?: string,\n): asserts condition is false {\n if (condition) throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertTrue(\n condition: boolean,\n message?: string,\n): asserts condition is true {\n if (!condition) throw new AssertionError(message ?? `Condition is false`);\n}\n\nexport function assertOk<T>(\n obj: T | null | undefined,\n message?: string,\n): asserts obj is T {\n if (!obj) throw new AssertionError(message ?? `Condition is not truthy`);\n}\n\nexport function assertEqual<T>(\n obj: T | null | undefined,\n other: T | null | undefined,\n message?: string,\n): void {\n if (obj !== other)\n throw new AssertionError(\n message ??\n `Objects are not equal:\\n ${JSON.stringify(obj)}\\ncompared:\\n${JSON.stringify(other)}`,\n );\n}\n\nexport function assertNotEqual<T>(\n obj: T | null | undefined,\n other: T | null | undefined,\n message?: string,\n): void {\n if (obj === other)\n throw new AssertionError(\n message ?? `Objects are equal: ${JSON.stringify(obj)}`,\n );\n}\n\nexport function assertIsNotNull<T extends object>(\n result: T | null,\n): asserts result is T {\n assertNotEqual(result, null);\n assertOk(result);\n}\n\nexport function assertIsNull<T extends object>(\n result: T | null,\n): asserts result is null {\n assertEqual(result, null);\n}\n\ntype Call = {\n arguments: unknown[];\n result: unknown;\n target: unknown;\n this: unknown;\n};\n\nexport type ArgumentMatcher = (arg: unknown) => boolean;\n\nexport const argValue =\n <T>(value: T): ArgumentMatcher =>\n (arg) =>\n deepEquals(arg, value);\n\nexport const argMatches =\n <T>(matches: (arg: T) => boolean): ArgumentMatcher =>\n (arg) =>\n matches(arg as T);\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport type MockedFunction = Function & { mock?: { calls: Call[] } };\n\nexport function verifyThat(fn: MockedFunction) {\n return {\n calledTimes: (times: number) => {\n assertEqual(fn.mock?.calls?.length, times);\n },\n notCalled: () => {\n assertEqual(fn?.mock?.calls?.length, 0);\n },\n called: () => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length > 0,\n );\n },\n calledWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledOnceWith: (...args: unknown[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length === 1 &&\n fn.mock.calls.some((call) => deepEquals(call.arguments, args)),\n );\n },\n calledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertTrue(\n fn.mock?.calls.length !== undefined && fn.mock.calls.length >= 1,\n );\n assertTrue(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls.some(\n (call) =>\n call.arguments &&\n call.arguments.length >= matches.length &&\n matches.every((match, index) => match(call.arguments[index])),\n ),\n );\n },\n notCalledWithArgumentMatching: (...matches: ArgumentMatcher[]) => {\n assertFalse(\n fn.mock?.calls.length !== undefined &&\n fn.mock.calls.length >= 1 &&\n fn.mock.calls[0]!.arguments &&\n fn.mock.calls[0]!.arguments.length >= matches.length &&\n matches.every((match, index) =>\n match(fn.mock!.calls[0]!.arguments[index]),\n ),\n );\n },\n };\n}\n\nexport const assertThatArray = <T>(array: T[]) => {\n return {\n isEmpty: () => assertEqual(array.length, 0),\n hasSize: (length: number) => assertEqual(array.length, length),\n containsElements: (...other: T[]) => {\n assertTrue(other.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrder: (...other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyInAnyOrderElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n assertTrue(array.every((ts) => other.some((o) => deepEquals(ts, o))));\n },\n containsExactlyElementsOf: (other: T[]) => {\n assertEqual(array.length, other.length);\n for (let i = 0; i < array.length; i++) {\n assertTrue(deepEquals(array[i], other[i]));\n }\n },\n containsExactly: (elem: T) => {\n assertEqual(array.length, 1);\n assertTrue(deepEquals(array[0], elem));\n },\n contains: (elem: T) => {\n assertTrue(array.some((a) => deepEquals(a, elem)));\n },\n containsOnlyOnceElementsOf: (other: T[]) => {\n assertTrue(\n other\n .map((o) => array.filter((a) => deepEquals(a, o)).length)\n .filter((a) => a === 1).length === other.length,\n );\n },\n containsAnyOf: (...other: T[]) => {\n assertTrue(array.some((a) => other.some((o) => deepEquals(a, o))));\n },\n allMatch: (matches: (item: T) => boolean) => {\n assertTrue(array.every(matches));\n },\n anyMatches: (matches: (item: T) => boolean) => {\n assertTrue(array.some(matches));\n },\n allMatchAsync: async (\n matches: (item: T) => Promise<boolean>,\n ): Promise<void> => {\n for (const item of array) {\n assertTrue(await matches(item));\n }\n },\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\nexport * from './dates';\n","import { isNumber, isString } from '../validation';\n\nexport type ErrorConstructor<ErrorType extends Error> = new (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ...args: any[]\n) => ErrorType;\n\nexport const isErrorConstructor = <ErrorType extends Error>(\n // eslint-disable-next-line @typescript-eslint/ban-types\n expect: Function,\n): expect is ErrorConstructor<ErrorType> => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-return\n return (\n typeof expect === 'function' &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype &&\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n expect.prototype.constructor === expect\n );\n};\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 formatDateToUtcYYYYMMDD = (date: Date) => {\n // Use the 'en-CA' locale which formats as 'yyyy-mm-dd'\n const formatter = new Intl.DateTimeFormat('en-CA', {\n timeZone: 'UTC',\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n });\n\n // Format the date\n return formatter.format(date);\n};\n\n// Function to validate 'yyyy-mm-dd' format\nexport const isValidYYYYMMDD = (dateString: string) => {\n const regex = /^\\d{4}-\\d{2}-\\d{2}$/;\n return regex.test(dateString);\n};\n\nexport const parseDateFromUtcYYYYMMDD = (dateString: string) => {\n const date = new Date(dateString + 'T00:00:00Z');\n\n if (!isValidYYYYMMDD(dateString)) {\n throw new ValidationError('Invalid date format, must be yyyy-mm-dd');\n }\n\n if (isNaN(date.getTime())) {\n throw new ValidationError('Invalid date format');\n }\n\n return date;\n};\n","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","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","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 StreamEvent extends Event,\n StreamVersion = DefaultStreamVersionType,\n> = AppendToStreamResult<StreamVersion> & {\n newState: State;\n newEvents: StreamEvent[];\n};\n\nexport const CommandHandler =\n <State, StreamEvent extends Event, StreamVersion = DefaultStreamVersionType>(\n evolve: (state: State, event: StreamEvent) => State,\n initialState: () => State,\n mapToStreamId: (id: string) => string = (id) => id,\n ) =>\n async <Store extends EventStore<StreamVersion>>(\n eventStore: Store,\n id: string,\n handle: (state: State) => StreamEvent | StreamEvent[],\n options?: Parameters<Store['appendToStream']>[2] & {\n expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;\n },\n ): Promise<CommandHandlerResult<State, StreamEvent, 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 initialState,\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 ?? initialState();\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 ...options,\n expectedStreamVersion,\n },\n );\n\n // 5. Return result with updated state\n return {\n ...appendResult,\n newEvents,\n newState: newEvents.reduce(evolve, state),\n };\n };\n// #endregion command-handler\n","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 { decide, evolve, initialState }: 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 initialState,\n mapToStreamId,\n )(eventStore, id, (state) => decide(command, state), options);\n// #endregion command-handler\n","import retry from 'async-retry';\nimport {\n ReadableStream,\n ReadableStreamDefaultReader,\n TransformStream,\n TransformStreamDefaultController,\n} from 'web-streams-polyfill';\nimport type { Decoder } from './decoders';\nimport { DefaultDecoder } from './decoders/composite';\n\nexport const restream = <\n Source = unknown,\n Transformed = Source,\n StreamType = object,\n>(\n createSourceStream: () => ReadableStream<StreamType>,\n transform: (input: Source) => Transformed = (source) =>\n source as unknown as Transformed,\n retryOptions: retry.Options = { forever: true, minTimeout: 25 },\n decoder: Decoder<StreamType, Source> = new DefaultDecoder<Source>(),\n): ReadableStream<Transformed> =>\n new TransformStream<Source, Transformed>({\n start(controller) {\n retry(\n () => onRestream(createSourceStream, controller, transform, decoder),\n retryOptions,\n ).catch((error) => {\n controller.error(error);\n });\n },\n }).readable;\n\nconst onRestream = async <StreamType, Source, Transformed = Source>(\n createSourceStream: () => ReadableStream<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<void> => {\n const sourceStream = createSourceStream();\n const reader = sourceStream.getReader();\n try {\n let done: boolean;\n\n do {\n done = await restreamChunk(reader, controller, transform, decoder);\n } while (!done);\n } finally {\n reader.releaseLock();\n }\n};\n\nconst restreamChunk = async <StreamType, Source, Transformed = Source>(\n reader: ReadableStreamDefaultReader<StreamType>,\n controller: TransformStreamDefaultController<Transformed>,\n transform: (input: Source) => Transformed,\n decoder: Decoder<StreamType, Source>,\n): Promise<boolean> => {\n const { done: isDone, value } = await reader.read();\n\n if (value) decoder.addToBuffer(value);\n\n if (!isDone && !decoder.hasCompleteMessage()) return false;\n\n decodeAndTransform(decoder, transform, controller);\n\n if (isDone) {\n controller.terminate();\n }\n\n return isDone;\n};\n\nconst decodeAndTransform = <StreamType, Source, Transformed = Source>(\n decoder: Decoder<StreamType, Source>,\n transform: (input: Source) => Transformed,\n controller: TransformStreamDefaultController<Transformed>,\n) => {\n try {\n const decoded = decoder.decode();\n if (!decoded) return;\n\n const transformed = transform(decoded);\n controller.enqueue(transformed);\n } catch (error) {\n controller.error(new Error(`Decoding error: ${error?.toString()}`));\n }\n};\n","import { v4 as randomUUID } from 'uuid';\nimport type {\n Event,\n ReadEvent,\n ReadEventMetadataWithGlobalPosition,\n} from '../typing';\nimport {\n type AggregateStreamOptions,\n type AggregateStreamResult,\n type AppendToStreamOptions,\n type AppendToStreamResult,\n type DefaultStreamVersionType,\n type EventStore,\n type ReadStreamOptions,\n type ReadStreamResult,\n} from './eventStore';\nimport { assertExpectedVersionMatchesCurrent } from './expectedVersion';\n\nexport type EventHandler<E extends Event = Event> = (\n eventEnvelope: ReadEvent<E>,\n) => void;\n\nexport const getInMemoryEventStore = (): EventStore<\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n> => {\n const streams = new Map<string, ReadEvent[]>();\n\n const getAllEventsCount = () => {\n return Array.from<ReadEvent[]>(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, initialState, 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, initialState()),\n };\n },\n\n readStream: <EventType extends Event>(\n streamName: string,\n options?: ReadStreamOptions,\n ): Promise<\n ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n >\n > => {\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\n .map(\n (e) =>\n e as ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >,\n )\n .slice(from, to)\n : [];\n\n const result: ReadStreamResult<\n EventType,\n DefaultStreamVersionType,\n ReadEventMetadataWithGlobalPosition\n > =\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: ReadEvent<\n EventType,\n ReadEventMetadataWithGlobalPosition\n >[] = events.map((event, index) => {\n return {\n ...event,\n metadata: {\n ...(event.metadata ?? {}),\n streamName,\n eventId: randomUUID(),\n streamPosition: BigInt(currentEvents.length + index + 1),\n globalPosition: 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":"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","names":["WrapEventStore","eventStore","appendedEvents","streamName","options","events","result","currentStream","AssertionError","message","isSubset","superObj","subObj","sup","sub","assertOk","ele","assertFails","assertMatches","actual","expected","message","isSubset","AssertionError","assertOk","obj","message","AssertionError","assertEqual","other","ValidationErrors","isNumber","val","isString","assertNotEmptyString","value","ValidationError","assertPositiveNumber","assertUnsignedBigInt","number","EmmettError","_EmmettError","options","errorCode","isNumber","message","isString","ValidationError","_ValidationError","EmmettError","message","IllegalStateError","_IllegalStateError","merge","array","item","where","onExisting","onNotFound","wasFound","result","p","STREAM_DOES_NOT_EXIST","NO_CONCURRENCY_CHECK","CommandHandler","evolve","initialState","mapToStreamId","id","eventStore","handle","options","streamName","aggregationResult","NO_CONCURRENCY_CHECK","state","currentStreamVersion","result","newEvents","expectedStreamVersion","STREAM_DOES_NOT_EXIST","DeciderCommandHandler","decide","evolve","initialState","mapToStreamId","id","eventStore","command","options","CommandHandler","state","retry","TransformStream","randomUUID"]}