@event-driven-io/emmett 0.5.5 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-4PGUBQK3.js +2 -0
- package/dist/chunk-4PGUBQK3.js.map +1 -0
- package/dist/chunk-5BGN2FV4.js +1 -0
- package/dist/chunk-6WITJBGG.js +2 -0
- package/dist/chunk-6WITJBGG.js.map +1 -0
- package/dist/chunk-7D2LV2X5.js +5 -0
- package/dist/chunk-7D2LV2X5.js.map +1 -0
- package/dist/chunk-AMRL5G7K.mjs +2 -0
- package/dist/chunk-AMRL5G7K.mjs.map +1 -0
- package/dist/chunk-AWUWW7EJ.mjs +2 -0
- package/dist/chunk-AWUWW7EJ.mjs.map +1 -0
- package/dist/chunk-AYVR4VYR.mjs +2 -0
- package/dist/chunk-AYVR4VYR.mjs.map +1 -0
- package/dist/chunk-DOHUIBZQ.mjs +1 -0
- package/dist/chunk-HVU6UBXF.mjs +5 -0
- package/dist/chunk-HVU6UBXF.mjs.map +1 -0
- package/dist/chunk-JDYZZRJE.mjs +2 -0
- package/dist/chunk-JDYZZRJE.mjs.map +1 -0
- package/dist/chunk-MHB2JU4U.js +2 -0
- package/dist/chunk-MHB2JU4U.js.map +1 -0
- package/dist/chunk-S3PRXL2J.js +2 -0
- package/dist/chunk-S3PRXL2J.js.map +1 -0
- package/dist/chunk-TDCMNVXU.mjs +1 -0
- package/dist/chunk-YWRV75GA.mjs +1 -0
- package/dist/chunk-Z4Z6POJH.js +1 -0
- package/dist/chunk-ZLASBJGR.js +1 -0
- package/dist/commandHandling/handleCommand.d.mts +3 -2
- package/dist/commandHandling/handleCommand.d.ts +3 -2
- package/dist/commandHandling/handleCommandWithDecider.d.mts +3 -2
- package/dist/commandHandling/handleCommandWithDecider.d.ts +3 -2
- package/dist/commandHandling/index.d.mts +1 -0
- package/dist/commandHandling/index.d.ts +1 -0
- package/dist/eventStore/eventStore.d.mts +1 -0
- package/dist/eventStore/eventStore.d.ts +1 -0
- package/dist/eventStore/expectedVersion.d.mts +1 -0
- package/dist/eventStore/expectedVersion.d.ts +1 -0
- package/dist/eventStore/inMemoryEventStore.d.mts +1 -0
- package/dist/eventStore/inMemoryEventStore.d.ts +1 -0
- package/dist/eventStore/index.d.mts +1 -0
- package/dist/eventStore/index.d.ts +1 -0
- package/dist/index.d.mts +4 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/dist/messageBus/index.d.mts +44 -0
- package/dist/messageBus/index.d.ts +44 -0
- package/dist/messageBus/index.js +2 -0
- package/dist/messageBus/index.js.map +1 -0
- package/dist/messageBus/index.mjs +2 -0
- package/dist/messageBus/index.mjs.map +1 -0
- package/dist/serialization/json/JSONParser.d.mts +1 -1
- package/dist/serialization/json/JSONParser.d.ts +1 -1
- package/dist/testing/assertions.js +1 -1
- package/dist/testing/assertions.mjs +1 -1
- package/dist/testing/deciderSpecification.d.mts +4 -4
- package/dist/testing/deciderSpecification.d.ts +4 -4
- package/dist/testing/features.d.mts +13 -0
- package/dist/testing/features.d.ts +13 -0
- package/dist/testing/features.js +2 -0
- package/dist/testing/features.mjs +2 -0
- package/dist/testing/index.d.mts +6 -0
- package/dist/testing/index.d.ts +6 -0
- package/dist/testing/index.js +1 -1
- package/dist/testing/index.mjs +1 -1
- package/dist/testing/shoppingCart.domain.d.mts +23 -0
- package/dist/testing/shoppingCart.domain.d.ts +23 -0
- package/dist/testing/shoppingCart.domain.js +2 -0
- package/dist/testing/shoppingCart.domain.js.map +1 -0
- package/dist/testing/shoppingCart.domain.mjs +2 -0
- package/dist/testing/shoppingCart.domain.mjs.map +1 -0
- package/dist/typing/command.d.mts +2 -1
- package/dist/typing/command.d.ts +2 -1
- package/dist/typing/command.js +1 -1
- package/dist/typing/command.mjs +1 -1
- package/dist/typing/decider.d.mts +1 -0
- package/dist/typing/decider.d.ts +1 -0
- package/dist/typing/deepReadonly.d.mts +15 -0
- package/dist/typing/deepReadonly.d.ts +15 -0
- package/dist/typing/deepReadonly.js +2 -0
- package/dist/typing/deepReadonly.js.map +1 -0
- package/dist/typing/deepReadonly.mjs +2 -0
- package/dist/typing/deepReadonly.mjs.map +1 -0
- package/dist/typing/event.d.mts +2 -1
- package/dist/typing/event.d.ts +2 -1
- package/dist/typing/event.js +1 -1
- package/dist/typing/event.mjs +1 -1
- package/dist/typing/index.d.mts +28 -11
- package/dist/typing/index.d.ts +28 -11
- package/dist/typing/index.js +1 -1
- package/dist/typing/index.mjs +1 -1
- package/dist/typing/workflow.d.mts +1 -0
- package/dist/typing/workflow.d.ts +1 -0
- package/dist/utils/index.js +1 -1
- package/dist/utils/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/chunk-7H3QW2YD.js +0 -1
- package/dist/chunk-BARLLX6S.js +0 -1
- package/dist/chunk-C4CXU3PY.mjs +0 -1
- package/dist/chunk-DFPI5IXT.js +0 -5
- package/dist/chunk-DFPI5IXT.js.map +0 -1
- package/dist/chunk-HKEQAT6F.mjs +0 -1
- package/dist/chunk-IZWGWZ3P.mjs +0 -1
- package/dist/chunk-QSAFGRYV.js +0 -1
- package/dist/chunk-RWKXC5FZ.mjs +0 -5
- package/dist/chunk-RWKXC5FZ.mjs.map +0 -1
- package/dist/chunk-YKICRTHH.mjs +0 -1
- package/dist/chunk-Z7EDILIO.js +0 -1
- /package/dist/{chunk-7H3QW2YD.js.map → chunk-5BGN2FV4.js.map} +0 -0
- /package/dist/{chunk-C4CXU3PY.mjs.map → chunk-DOHUIBZQ.mjs.map} +0 -0
- /package/dist/{chunk-HKEQAT6F.mjs.map → chunk-TDCMNVXU.mjs.map} +0 -0
- /package/dist/{chunk-IZWGWZ3P.mjs.map → chunk-YWRV75GA.mjs.map} +0 -0
- /package/dist/{chunk-BARLLX6S.js.map → chunk-Z4Z6POJH.js.map} +0 -0
- /package/dist/{chunk-QSAFGRYV.js.map → chunk-ZLASBJGR.js.map} +0 -0
- /package/dist/{chunk-Z7EDILIO.js.map → testing/features.js.map} +0 -0
- /package/dist/{chunk-YKICRTHH.mjs.map → testing/features.mjs.map} +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var n=(t,{type:r,data:o})=>{switch(r){case"ProductItemAdded":{let e=o.productItem;return{productItems:[...t.productItems,e],totalAmount:t.totalAmount+e.price*e.quantity}}case"DiscountApplied":return{...t,totalAmount:t.totalAmount*(1-o.percent/100)}}},d= exports.b =()=>({productItems:[],totalAmount:0});exports.a = n; exports.b = d;
|
|
2
|
+
//# sourceMappingURL=chunk-4PGUBQK3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing/shoppingCart.domain.ts"],"names":["evolve","state","type","data","productItem","getInitialState"],"mappings":"AAqBO,IAAMA,EAAS,CACpBC,EACA,CAAE,KAAAC,EAAM,KAAAC,CAAK,IACI,CACjB,OAAQD,EAAM,CACZ,IAAK,mBAAoB,CACvB,IAAME,EAAcD,EAAK,YACzB,MAAO,CACL,aAAc,CAAC,GAAGF,EAAM,aAAcG,CAAW,EACjD,YACEH,EAAM,YAAcG,EAAY,MAAQA,EAAY,QACxD,CACF,CACA,IAAK,kBACH,MAAO,CACL,GAAGH,EACH,YAAaA,EAAM,aAAe,EAAIE,EAAK,QAAU,IACvD,CACJ,CACF,EAEaE,EAAkB,KACtB,CAAE,aAAc,CAAC,EAAG,YAAa,CAAE","sourcesContent":["import { type Event } from '../typing';\n\nexport type PricedProductItem = {\n productId: string;\n quantity: number;\n price: number;\n};\n\nexport type ShoppingCart = {\n productItems: PricedProductItem[];\n totalAmount: number;\n};\n\nexport type ProductItemAdded = Event<\n 'ProductItemAdded',\n { productItem: PricedProductItem }\n>;\nexport type DiscountApplied = Event<'DiscountApplied', { percent: number }>;\n\nexport type ShoppingCartEvent = ProductItemAdded | DiscountApplied;\n\nexport const evolve = (\n state: ShoppingCart,\n { type, data }: ShoppingCartEvent,\n): ShoppingCart => {\n switch (type) {\n case 'ProductItemAdded': {\n const productItem = data.productItem;\n return {\n productItems: [...state.productItems, productItem],\n totalAmount:\n state.totalAmount + productItem.price * productItem.quantity,\n };\n }\n case 'DiscountApplied':\n return {\n ...state,\n totalAmount: state.totalAmount * (1 - data.percent / 100),\n };\n }\n};\n\nexport const getInitialState = (): ShoppingCart => {\n return { productItems: [], totalAmount: 0 };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";//# sourceMappingURL=chunk-5BGN2FV4.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }var _chunk4PGUBQK3js = require('./chunk-4PGUBQK3.js');var _assert = require('assert'); var _assert2 = _interopRequireDefault(_assert);var _crypto = require('crypto');var _test = require('test');async function A(c,o={getInitialIndex:()=>1n}){return _test.describe.call(void 0, "aggregateStream",()=>{let a;_test.before.call(void 0, async()=>{a=await c()}),_test.after.call(void 0, async()=>{let t=o.teardownHook;t&&await t()}),_test.it.call(void 0, "When called with `to` allows time traveling",async()=>{let t={productId:"123",quantity:10,price:3},s=10,r=_crypto.randomUUID.call(void 0, );await a.appendToStream(r,[{type:"ProductItemAdded",data:{productItem:t}}]),await a.appendToStream(r,[{type:"ProductItemAdded",data:{productItem:t}}]),await a.appendToStream(r,[{type:"DiscountApplied",data:{percent:s}}]);let d=await a.aggregateStream(r,{evolve:_chunk4PGUBQK3js.a,getInitialState:_chunk4PGUBQK3js.b,read:{to:1n}}),p=await a.aggregateStream(r,{evolve:_chunk4PGUBQK3js.a,getInitialState:_chunk4PGUBQK3js.b,read:{to:2n}}),m=await a.aggregateStream(r,{evolve:_chunk4PGUBQK3js.a,getInitialState:_chunk4PGUBQK3js.b,read:{to:3n}});_assert2.default.ok(d),_assert2.default.ok(p),_assert2.default.ok(m),_assert2.default.equal(d.currentStreamVersion,o.getInitialIndex()),_assert2.default.deepEqual(d.state,{productItems:[t],totalAmount:30}),_assert2.default.equal(p.currentStreamVersion,o.getInitialIndex()+1n),_assert2.default.deepEqual(p.state,{productItems:[t,t],totalAmount:60}),_assert2.default.equal(m.currentStreamVersion,o.getInitialIndex()+2n),_assert2.default.deepEqual(m.state,{productItems:[t,t],totalAmount:54})})})}exports.a = A;
|
|
2
|
+
//# sourceMappingURL=chunk-6WITJBGG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing/features.ts"],"names":["assert","randomUUID","after","before","describe","it","testAggregateStream","eventStoreFactory","options","eventStore","teardownHook","productItem","discount","shoppingCartId","resultAt1","evolve","getInitialState","resultAt2","resultAt3"],"mappings":"+CACA,OAAOA,MAAY,SACnB,OAAS,cAAAC,MAAkB,SAC3B,OAAS,SAAAC,EAAO,UAAAC,EAAQ,YAAAC,EAAU,MAAAC,MAAU,OAgB5C,eAAsBC,EACpBC,EACAC,EAAuB,CACrB,gBAAiB,IAAM,EACzB,EACA,CACA,OAAOJ,EAAS,kBAAmB,IAAM,CACvC,IAAIK,EAEJN,EAAO,SAAY,CACjBM,EAAa,MAAMF,EAAkB,CACvC,CAAC,EAEDL,EAAM,SAAY,CAChB,IAAMQ,EAAeF,EAAQ,aACzBE,GAAc,MAAMA,EAAa,CACvC,CAAC,EAEDL,EAAG,8CAA+C,SAAY,CAE5D,IAAMM,EAAiC,CACrC,UAAW,MACX,SAAU,GACV,MAAO,CACT,EACMC,EAAW,GACXC,EAAiBZ,EAAW,EAElC,MAAMQ,EAAW,eAAkCI,EAAgB,CACjE,CAAE,KAAM,mBAAoB,KAAM,CAAE,YAAAF,CAAY,CAAE,CACpD,CAAC,EACD,MAAMF,EAAW,eAAkCI,EAAgB,CACjE,CAAE,KAAM,mBAAoB,KAAM,CAAE,YAAAF,CAAY,CAAE,CACpD,CAAC,EACD,MAAMF,EAAW,eAAkCI,EAAgB,CACjE,CAAE,KAAM,kBAAmB,KAAM,CAAE,QAASD,CAAS,CAAE,CACzD,CAAC,EAGD,IAAME,EAAY,MAAML,EAAW,gBAAgBI,EAAgB,CACjE,OAAAE,EACA,gBAAAC,EACA,KAAM,CAAE,GAAI,EAAG,CACjB,CAAC,EACKC,EAAY,MAAMR,EAAW,gBAAgBI,EAAgB,CACjE,OAAAE,EACA,gBAAAC,EACA,KAAM,CAAE,GAAI,EAAG,CACjB,CAAC,EACKE,EAAY,MAAMT,EAAW,gBAAgBI,EAAgB,CACjE,OAAAE,EACA,gBAAAC,EACA,KAAM,CAAE,GAAI,EAAG,CACjB,CAAC,EAGDhB,EAAO,GAAGc,CAAS,EACnBd,EAAO,GAAGiB,CAAS,EACnBjB,EAAO,GAAGkB,CAAS,EAEnBlB,EAAO,MAAMc,EAAU,qBAAsBN,EAAQ,gBAAgB,CAAC,EACtER,EAAO,UAAUc,EAAU,MAAO,CAChC,aAAc,CAACH,CAAW,EAC1B,YAAa,EACf,CAAC,EAEDX,EAAO,MACLiB,EAAU,qBACVT,EAAQ,gBAAgB,EAAI,EAC9B,EACAR,EAAO,UAAUiB,EAAU,MAAO,CAChC,aAAc,CAACN,EAAaA,CAAW,EACvC,YAAa,EACf,CAAC,EAEDX,EAAO,MACLkB,EAAU,qBACVV,EAAQ,gBAAgB,EAAI,EAC9B,EACAR,EAAO,UAAUkB,EAAU,MAAO,CAChC,aAAc,CAACP,EAAaA,CAAW,EACvC,YAAa,EACf,CAAC,CACH,CAAC,CACH,CAAC,CACH","sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\nimport assert from 'node:assert';\nimport { randomUUID } from 'node:crypto';\nimport { after, before, describe, it } from 'node:test';\nimport type { EventStore } from '../eventStore';\nimport {\n evolve,\n getInitialState,\n type PricedProductItem,\n type ShoppingCartEvent,\n} from './shoppingCart.domain';\n\ntype TestOptions = {\n getInitialIndex: () => bigint;\n teardownHook?: () => Promise<void>;\n};\n\nexport type EventStoreFactory = () => Promise<EventStore<bigint>>;\n\nexport async function testAggregateStream(\n eventStoreFactory: EventStoreFactory,\n options: TestOptions = {\n getInitialIndex: () => 1n,\n },\n) {\n return describe('aggregateStream', () => {\n let eventStore: EventStore<bigint>;\n\n before(async () => {\n eventStore = await eventStoreFactory();\n });\n\n after(async () => {\n const teardownHook = options.teardownHook;\n if (teardownHook) await teardownHook();\n });\n\n it('When called with `to` allows time traveling', async () => {\n // Given\n const productItem: PricedProductItem = {\n productId: '123',\n quantity: 10,\n price: 3,\n };\n const discount = 10;\n const shoppingCartId = randomUUID();\n\n await eventStore.appendToStream<ShoppingCartEvent>(shoppingCartId, [\n { type: 'ProductItemAdded', data: { productItem } },\n ]);\n await eventStore.appendToStream<ShoppingCartEvent>(shoppingCartId, [\n { type: 'ProductItemAdded', data: { productItem } },\n ]);\n await eventStore.appendToStream<ShoppingCartEvent>(shoppingCartId, [\n { type: 'DiscountApplied', data: { percent: discount } },\n ]);\n\n // when\n const resultAt1 = await eventStore.aggregateStream(shoppingCartId, {\n evolve,\n getInitialState,\n read: { to: 1n },\n });\n const resultAt2 = await eventStore.aggregateStream(shoppingCartId, {\n evolve,\n getInitialState,\n read: { to: 2n },\n });\n const resultAt3 = await eventStore.aggregateStream(shoppingCartId, {\n evolve,\n getInitialState,\n read: { to: 3n },\n });\n\n // then\n assert.ok(resultAt1);\n assert.ok(resultAt2);\n assert.ok(resultAt3);\n\n assert.equal(resultAt1.currentStreamVersion, options.getInitialIndex());\n assert.deepEqual(resultAt1.state, {\n productItems: [productItem],\n totalAmount: 30,\n });\n\n assert.equal(\n resultAt2.currentStreamVersion,\n options.getInitialIndex() + 1n,\n );\n assert.deepEqual(resultAt2.state, {\n productItems: [productItem, productItem],\n totalAmount: 60,\n });\n\n assert.equal(\n resultAt3.currentStreamVersion,\n options.getInitialIndex() + 2n,\n );\n assert.deepEqual(resultAt3.state, {\n productItems: [productItem, productItem],\n totalAmount: 54,\n });\n });\n });\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var u=(t,o)=>{let s=t,r=o;return Object.keys(r).every(n=>typeof r[n]=="object"?u(s[n],r[n]):r[n]===s[n])},e= exports.b =(t,o)=>{if(!u(t,o))throw Error(`subObj:
|
|
2
|
+
${JSON.stringify(o)}
|
|
3
|
+
is not subset of
|
|
4
|
+
${JSON.stringify(t)}`)};exports.a = u; exports.b = e;
|
|
5
|
+
//# sourceMappingURL=chunk-7D2LV2X5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing/assertions.ts"],"names":["isSubset","superObj","subObj","sup","sub","ele","assertMatches","actual","expected"],"mappings":"AAEO,IAAMA,EAAW,CAACC,EAAmBC,IAA6B,CACvE,IAAMC,EAAMF,EACNG,EAAMF,EAEZ,OAAO,OAAO,KAAKE,CAAG,EAAE,MAAOC,GACzB,OAAOD,EAAIC,CAAG,GAAK,SACdL,EAASG,EAAIE,CAAG,EAAGD,EAAIC,CAAG,CAAC,EAE7BD,EAAIC,CAAG,IAAMF,EAAIE,CAAG,CAC5B,CACH,EAEaC,EAAgB,CAACC,EAAiBC,IAAsB,CACnE,GAAI,CAACR,EAASO,EAAQC,CAAQ,EAC5B,MAAM,MACJ;AAAA,EAAY,KAAK,UAAUA,CAAQ,CAAC;AAAA;AAAA,EAAuB,KAAK,UAAUD,CAAM,CAAC,EACnF,CACJ","sourcesContent":["import type { DefaultRecord } from '../typing';\n\nexport const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as DefaultRecord;\n const sub = subObj as DefaultRecord;\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 assertMatches = (actual: unknown, expected: unknown) => {\n if (!isSubset(actual, expected))\n throw Error(\n `subObj:\\n${JSON.stringify(expected)}\\nis not subset of\\n${JSON.stringify(actual)}`,\n );\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as n,b as i}from"./chunk-AYVR4VYR.mjs";import e from"node:assert";import{randomUUID as g}from"node:crypto";import{after as u,before as l,describe as S,it as I}from"node:test";async function A(c,o={getInitialIndex:()=>1n}){return S("aggregateStream",()=>{let a;l(async()=>{a=await c()}),u(async()=>{let t=o.teardownHook;t&&await t()}),I("When called with `to` allows time traveling",async()=>{let t={productId:"123",quantity:10,price:3},s=10,r=g();await a.appendToStream(r,[{type:"ProductItemAdded",data:{productItem:t}}]),await a.appendToStream(r,[{type:"ProductItemAdded",data:{productItem:t}}]),await a.appendToStream(r,[{type:"DiscountApplied",data:{percent:s}}]);let d=await a.aggregateStream(r,{evolve:n,getInitialState:i,read:{to:1n}}),p=await a.aggregateStream(r,{evolve:n,getInitialState:i,read:{to:2n}}),m=await a.aggregateStream(r,{evolve:n,getInitialState:i,read:{to:3n}});e.ok(d),e.ok(p),e.ok(m),e.equal(d.currentStreamVersion,o.getInitialIndex()),e.deepEqual(d.state,{productItems:[t],totalAmount:30}),e.equal(p.currentStreamVersion,o.getInitialIndex()+1n),e.deepEqual(p.state,{productItems:[t,t],totalAmount:60}),e.equal(m.currentStreamVersion,o.getInitialIndex()+2n),e.deepEqual(m.state,{productItems:[t,t],totalAmount:54})})})}export{A as a};
|
|
2
|
+
//# sourceMappingURL=chunk-AMRL5G7K.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing/features.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-floating-promises */\nimport assert from 'node:assert';\nimport { randomUUID } from 'node:crypto';\nimport { after, before, describe, it } from 'node:test';\nimport type { EventStore } from '../eventStore';\nimport {\n evolve,\n getInitialState,\n type PricedProductItem,\n type ShoppingCartEvent,\n} from './shoppingCart.domain';\n\ntype TestOptions = {\n getInitialIndex: () => bigint;\n teardownHook?: () => Promise<void>;\n};\n\nexport type EventStoreFactory = () => Promise<EventStore<bigint>>;\n\nexport async function testAggregateStream(\n eventStoreFactory: EventStoreFactory,\n options: TestOptions = {\n getInitialIndex: () => 1n,\n },\n) {\n return describe('aggregateStream', () => {\n let eventStore: EventStore<bigint>;\n\n before(async () => {\n eventStore = await eventStoreFactory();\n });\n\n after(async () => {\n const teardownHook = options.teardownHook;\n if (teardownHook) await teardownHook();\n });\n\n it('When called with `to` allows time traveling', async () => {\n // Given\n const productItem: PricedProductItem = {\n productId: '123',\n quantity: 10,\n price: 3,\n };\n const discount = 10;\n const shoppingCartId = randomUUID();\n\n await eventStore.appendToStream<ShoppingCartEvent>(shoppingCartId, [\n { type: 'ProductItemAdded', data: { productItem } },\n ]);\n await eventStore.appendToStream<ShoppingCartEvent>(shoppingCartId, [\n { type: 'ProductItemAdded', data: { productItem } },\n ]);\n await eventStore.appendToStream<ShoppingCartEvent>(shoppingCartId, [\n { type: 'DiscountApplied', data: { percent: discount } },\n ]);\n\n // when\n const resultAt1 = await eventStore.aggregateStream(shoppingCartId, {\n evolve,\n getInitialState,\n read: { to: 1n },\n });\n const resultAt2 = await eventStore.aggregateStream(shoppingCartId, {\n evolve,\n getInitialState,\n read: { to: 2n },\n });\n const resultAt3 = await eventStore.aggregateStream(shoppingCartId, {\n evolve,\n getInitialState,\n read: { to: 3n },\n });\n\n // then\n assert.ok(resultAt1);\n assert.ok(resultAt2);\n assert.ok(resultAt3);\n\n assert.equal(resultAt1.currentStreamVersion, options.getInitialIndex());\n assert.deepEqual(resultAt1.state, {\n productItems: [productItem],\n totalAmount: 30,\n });\n\n assert.equal(\n resultAt2.currentStreamVersion,\n options.getInitialIndex() + 1n,\n );\n assert.deepEqual(resultAt2.state, {\n productItems: [productItem, productItem],\n totalAmount: 60,\n });\n\n assert.equal(\n resultAt3.currentStreamVersion,\n options.getInitialIndex() + 2n,\n );\n assert.deepEqual(resultAt3.state, {\n productItems: [productItem, productItem],\n totalAmount: 54,\n });\n });\n });\n}\n"],"mappings":"gDACA,OAAOA,MAAY,cACnB,OAAS,cAAAC,MAAkB,cAC3B,OAAS,SAAAC,EAAO,UAAAC,EAAQ,YAAAC,EAAU,MAAAC,MAAU,YAgB5C,eAAsBC,EACpBC,EACAC,EAAuB,CACrB,gBAAiB,IAAM,EACzB,EACA,CACA,OAAOC,EAAS,kBAAmB,IAAM,CACvC,IAAIC,EAEJC,EAAO,SAAY,CACjBD,EAAa,MAAMH,EAAkB,CACvC,CAAC,EAEDK,EAAM,SAAY,CAChB,IAAMC,EAAeL,EAAQ,aACzBK,GAAc,MAAMA,EAAa,CACvC,CAAC,EAEDC,EAAG,8CAA+C,SAAY,CAE5D,IAAMC,EAAiC,CACrC,UAAW,MACX,SAAU,GACV,MAAO,CACT,EACMC,EAAW,GACXC,EAAiBC,EAAW,EAElC,MAAMR,EAAW,eAAkCO,EAAgB,CACjE,CAAE,KAAM,mBAAoB,KAAM,CAAE,YAAAF,CAAY,CAAE,CACpD,CAAC,EACD,MAAML,EAAW,eAAkCO,EAAgB,CACjE,CAAE,KAAM,mBAAoB,KAAM,CAAE,YAAAF,CAAY,CAAE,CACpD,CAAC,EACD,MAAML,EAAW,eAAkCO,EAAgB,CACjE,CAAE,KAAM,kBAAmB,KAAM,CAAE,QAASD,CAAS,CAAE,CACzD,CAAC,EAGD,IAAMG,EAAY,MAAMT,EAAW,gBAAgBO,EAAgB,CACjE,OAAAG,EACA,gBAAAC,EACA,KAAM,CAAE,GAAI,EAAG,CACjB,CAAC,EACKC,EAAY,MAAMZ,EAAW,gBAAgBO,EAAgB,CACjE,OAAAG,EACA,gBAAAC,EACA,KAAM,CAAE,GAAI,EAAG,CACjB,CAAC,EACKE,EAAY,MAAMb,EAAW,gBAAgBO,EAAgB,CACjE,OAAAG,EACA,gBAAAC,EACA,KAAM,CAAE,GAAI,EAAG,CACjB,CAAC,EAGDG,EAAO,GAAGL,CAAS,EACnBK,EAAO,GAAGF,CAAS,EACnBE,EAAO,GAAGD,CAAS,EAEnBC,EAAO,MAAML,EAAU,qBAAsBX,EAAQ,gBAAgB,CAAC,EACtEgB,EAAO,UAAUL,EAAU,MAAO,CAChC,aAAc,CAACJ,CAAW,EAC1B,YAAa,EACf,CAAC,EAEDS,EAAO,MACLF,EAAU,qBACVd,EAAQ,gBAAgB,EAAI,EAC9B,EACAgB,EAAO,UAAUF,EAAU,MAAO,CAChC,aAAc,CAACP,EAAaA,CAAW,EACvC,YAAa,EACf,CAAC,EAEDS,EAAO,MACLD,EAAU,qBACVf,EAAQ,gBAAgB,EAAI,EAC9B,EACAgB,EAAO,UAAUD,EAAU,MAAO,CAChC,aAAc,CAACR,EAAaA,CAAW,EACvC,YAAa,EACf,CAAC,CACH,CAAC,CACH,CAAC,CACH","names":["assert","randomUUID","after","before","describe","it","testAggregateStream","eventStoreFactory","options","describe","eventStore","before","after","teardownHook","it","productItem","discount","shoppingCartId","randomUUID","resultAt1","evolve","getInitialState","resultAt2","resultAt3","assert"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/typing/event.ts"],"sourcesContent":["import type { DefaultRecord, Flavour } from './';\n\nexport type Event<\n EventType extends string = string,\n EventData extends DefaultRecord = DefaultRecord,\n EventMetaData extends DefaultRecord = DefaultRecord,\n> = Flavour<\n Readonly<{\n type: EventType;\n data: EventData;\n metadata?: EventMetaData;\n }>,\n 'Event'\n>;\n\nexport type EventTypeOf<T extends Event> = T['type'];\nexport type EventDataOf<T extends Event> = T['data'];\nexport type EventMetaDataOf<T extends Event> = T['metadata'];\n\nexport type CreateEventType<\n EventType extends string,\n EventData extends DefaultRecord,\n EventMetaData extends DefaultRecord | undefined,\n> = Readonly<{\n type: EventType;\n data: EventData;\n metadata?: EventMetaData;\n}>;\n\nexport const event = <EventType extends Event>(\n type: EventTypeOf<EventType>,\n data: EventDataOf<EventType>,\n metadata?: EventMetaDataOf<EventType>,\n): CreateEventType<\n EventTypeOf<EventType>,\n EventDataOf<EventType>,\n EventMetaDataOf<EventType>\n> => {\n return {\n type,\n data,\n metadata,\n };\n};\n"],"mappings":"AA6BO,IAAMA,EAAQ,CACnBC,EACAC,EACAC,KAMO,CACL,KAAAF,EACA,KAAAC,EACA,SAAAC,CACF","names":["event","type","data","metadata"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var n=(t,{type:r,data:o})=>{switch(r){case"ProductItemAdded":{let e=o.productItem;return{productItems:[...t.productItems,e],totalAmount:t.totalAmount+e.price*e.quantity}}case"DiscountApplied":return{...t,totalAmount:t.totalAmount*(1-o.percent/100)}}},d=()=>({productItems:[],totalAmount:0});export{n as a,d as b};
|
|
2
|
+
//# sourceMappingURL=chunk-AYVR4VYR.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing/shoppingCart.domain.ts"],"sourcesContent":["import { type Event } from '../typing';\n\nexport type PricedProductItem = {\n productId: string;\n quantity: number;\n price: number;\n};\n\nexport type ShoppingCart = {\n productItems: PricedProductItem[];\n totalAmount: number;\n};\n\nexport type ProductItemAdded = Event<\n 'ProductItemAdded',\n { productItem: PricedProductItem }\n>;\nexport type DiscountApplied = Event<'DiscountApplied', { percent: number }>;\n\nexport type ShoppingCartEvent = ProductItemAdded | DiscountApplied;\n\nexport const evolve = (\n state: ShoppingCart,\n { type, data }: ShoppingCartEvent,\n): ShoppingCart => {\n switch (type) {\n case 'ProductItemAdded': {\n const productItem = data.productItem;\n return {\n productItems: [...state.productItems, productItem],\n totalAmount:\n state.totalAmount + productItem.price * productItem.quantity,\n };\n }\n case 'DiscountApplied':\n return {\n ...state,\n totalAmount: state.totalAmount * (1 - data.percent / 100),\n };\n }\n};\n\nexport const getInitialState = (): ShoppingCart => {\n return { productItems: [], totalAmount: 0 };\n};\n"],"mappings":"AAqBO,IAAMA,EAAS,CACpBC,EACA,CAAE,KAAAC,EAAM,KAAAC,CAAK,IACI,CACjB,OAAQD,EAAM,CACZ,IAAK,mBAAoB,CACvB,IAAME,EAAcD,EAAK,YACzB,MAAO,CACL,aAAc,CAAC,GAAGF,EAAM,aAAcG,CAAW,EACjD,YACEH,EAAM,YAAcG,EAAY,MAAQA,EAAY,QACxD,CACF,CACA,IAAK,kBACH,MAAO,CACL,GAAGH,EACH,YAAaA,EAAM,aAAe,EAAIE,EAAK,QAAU,IACvD,CACJ,CACF,EAEaE,EAAkB,KACtB,CAAE,aAAc,CAAC,EAAG,YAAa,CAAE","names":["evolve","state","type","data","productItem","getInitialState"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-DOHUIBZQ.mjs.map
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
var u=(t,o)=>{let s=t,r=o;return Object.keys(r).every(n=>typeof r[n]=="object"?u(s[n],r[n]):r[n]===s[n])},e=(t,o)=>{if(!u(t,o))throw Error(`subObj:
|
|
2
|
+
${JSON.stringify(o)}
|
|
3
|
+
is not subset of
|
|
4
|
+
${JSON.stringify(t)}`)};export{u as a,e as b};
|
|
5
|
+
//# sourceMappingURL=chunk-HVU6UBXF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/testing/assertions.ts"],"sourcesContent":["import type { DefaultRecord } from '../typing';\n\nexport const isSubset = (superObj: unknown, subObj: unknown): boolean => {\n const sup = superObj as DefaultRecord;\n const sub = subObj as DefaultRecord;\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 assertMatches = (actual: unknown, expected: unknown) => {\n if (!isSubset(actual, expected))\n throw Error(\n `subObj:\\n${JSON.stringify(expected)}\\nis not subset of\\n${JSON.stringify(actual)}`,\n );\n};\n"],"mappings":"AAEO,IAAMA,EAAW,CAACC,EAAmBC,IAA6B,CACvE,IAAMC,EAAMF,EACNG,EAAMF,EAEZ,OAAO,OAAO,KAAKE,CAAG,EAAE,MAAOC,GACzB,OAAOD,EAAIC,CAAG,GAAK,SACdL,EAASG,EAAIE,CAAG,EAAGD,EAAIC,CAAG,CAAC,EAE7BD,EAAIC,CAAG,IAAMF,EAAIE,CAAG,CAC5B,CACH,EAEaC,EAAgB,CAACC,EAAiBC,IAAsB,CACnE,GAAI,CAACR,EAASO,EAAQC,CAAQ,EAC5B,MAAM,MACJ;AAAA,EAAY,KAAK,UAAUA,CAAQ,CAAC;AAAA;AAAA,EAAuB,KAAK,UAAUD,CAAM,CAAC,EACnF,CACJ","names":["isSubset","superObj","subObj","sup","sub","ele","assertMatches","actual","expected"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/typing/command.ts"],"sourcesContent":["import type { DefaultRecord, Flavour } from './';\nexport type Command<\n CommandType extends string = string,\n CommandData extends DefaultRecord = DefaultRecord,\n CommandMetaData extends DefaultRecord = DefaultCommandMetadata,\n> = Flavour<\n Readonly<{\n type: CommandType;\n data: Readonly<CommandData>;\n metadata?: CommandMetaData | undefined;\n }>,\n 'Command'\n>;\n\nexport type CommandTypeOf<T extends Command> = T['type'];\nexport type CommandDataOf<T extends Command> = T['data'];\nexport type CommandMetaDataOf<T extends Command> = T['metadata'];\n\nexport type CreateCommandType<\n CommandType extends string,\n CommandData extends DefaultRecord,\n CommandMetaData extends DefaultRecord | undefined,\n> = Readonly<{\n type: CommandType;\n data: CommandData;\n metadata?: CommandMetaData;\n}>;\n\nexport const command = <CommandType extends Command>(\n type: CommandTypeOf<CommandType>,\n data: CommandDataOf<CommandType>,\n metadata?: CommandMetaDataOf<CommandType>,\n): CreateCommandType<\n CommandTypeOf<CommandType>,\n CommandDataOf<CommandType>,\n CommandMetaDataOf<CommandType>\n> => {\n return {\n type,\n data,\n metadata,\n };\n};\n\nexport type DefaultCommandMetadata = { now: Date };\n"],"mappings":"AA4BO,IAAMA,EAAU,CACrBC,EACAC,EACAC,KAMO,CACL,KAAAF,EACA,KAAAC,EACA,SAAAC,CACF","names":["command","type","data","metadata"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/typing/command.ts"],"names":["command","type","data","metadata"],"mappings":"AA4BO,IAAMA,EAAU,CACrBC,EACAC,EACAC,KAMO,CACL,KAAAF,EACA,KAAAC,EACA,SAAAC,CACF","sourcesContent":["import type { DefaultRecord, Flavour } from './';\nexport type Command<\n CommandType extends string = string,\n CommandData extends DefaultRecord = DefaultRecord,\n CommandMetaData extends DefaultRecord = DefaultCommandMetadata,\n> = Flavour<\n Readonly<{\n type: CommandType;\n data: Readonly<CommandData>;\n metadata?: CommandMetaData | undefined;\n }>,\n 'Command'\n>;\n\nexport type CommandTypeOf<T extends Command> = T['type'];\nexport type CommandDataOf<T extends Command> = T['data'];\nexport type CommandMetaDataOf<T extends Command> = T['metadata'];\n\nexport type CreateCommandType<\n CommandType extends string,\n CommandData extends DefaultRecord,\n CommandMetaData extends DefaultRecord | undefined,\n> = Readonly<{\n type: CommandType;\n data: CommandData;\n metadata?: CommandMetaData;\n}>;\n\nexport const command = <CommandType extends Command>(\n type: CommandTypeOf<CommandType>,\n data: CommandDataOf<CommandType>,\n metadata?: CommandMetaDataOf<CommandType>,\n): CreateCommandType<\n CommandTypeOf<CommandType>,\n CommandDataOf<CommandType>,\n CommandMetaDataOf<CommandType>\n> => {\n return {\n type,\n data,\n metadata,\n };\n};\n\nexport type DefaultCommandMetadata = { now: Date };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/typing/event.ts"],"names":["event","type","data","metadata"],"mappings":"AA6BO,IAAMA,EAAQ,CACnBC,EACAC,EACAC,KAMO,CACL,KAAAF,EACA,KAAAC,EACA,SAAAC,CACF","sourcesContent":["import type { DefaultRecord, Flavour } from './';\n\nexport type Event<\n EventType extends string = string,\n EventData extends DefaultRecord = DefaultRecord,\n EventMetaData extends DefaultRecord = DefaultRecord,\n> = Flavour<\n Readonly<{\n type: EventType;\n data: EventData;\n metadata?: EventMetaData;\n }>,\n 'Event'\n>;\n\nexport type EventTypeOf<T extends Event> = T['type'];\nexport type EventDataOf<T extends Event> = T['data'];\nexport type EventMetaDataOf<T extends Event> = T['metadata'];\n\nexport type CreateEventType<\n EventType extends string,\n EventData extends DefaultRecord,\n EventMetaData extends DefaultRecord | undefined,\n> = Readonly<{\n type: EventType;\n data: EventData;\n metadata?: EventMetaData;\n}>;\n\nexport const event = <EventType extends Event>(\n type: EventTypeOf<EventType>,\n data: EventDataOf<EventType>,\n metadata?: EventMetaDataOf<EventType>,\n): CreateEventType<\n EventTypeOf<EventType>,\n EventDataOf<EventType>,\n EventMetaDataOf<EventType>\n> => {\n return {\n type,\n data,\n metadata,\n };\n};\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-TDCMNVXU.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=chunk-YWRV75GA.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";//# sourceMappingURL=chunk-Z4Z6POJH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";//# sourceMappingURL=chunk-ZLASBJGR.js.map
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { D as DefaultStreamVersionType, d as AppendToStreamResult, E as EventStore, e as ExpectedStreamVersion } from '../eventStore-DLezSgsV.mjs';
|
|
2
2
|
import { Event } from '../typing/index.mjs';
|
|
3
3
|
import '../errors/index.mjs';
|
|
4
|
+
import '../typing/deepReadonly.mjs';
|
|
4
5
|
|
|
5
6
|
type CommandHandlerResult<State, StreamVersion = DefaultStreamVersionType> = AppendToStreamResult<StreamVersion> & {
|
|
6
7
|
newState: State;
|
|
7
8
|
};
|
|
8
9
|
declare const CommandHandler: <State, StreamEvent extends Event, StreamVersion = bigint>(evolve: (state: State, event: StreamEvent) => State, getInitialState: () => State, mapToStreamId?: (id: string) => string) => (eventStore: EventStore<StreamVersion>, id: string, handle: (state: State) => StreamEvent | StreamEvent[], options?: {
|
|
9
|
-
expectedStreamVersion?: ExpectedStreamVersion<StreamVersion
|
|
10
|
-
}
|
|
10
|
+
expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;
|
|
11
|
+
}) => Promise<CommandHandlerResult<State, StreamVersion>>;
|
|
11
12
|
|
|
12
13
|
export { CommandHandler, type CommandHandlerResult };
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { D as DefaultStreamVersionType, d as AppendToStreamResult, E as EventStore, e as ExpectedStreamVersion } from '../eventStore-N_YMFCDT.js';
|
|
2
2
|
import { Event } from '../typing/index.js';
|
|
3
3
|
import '../errors/index.js';
|
|
4
|
+
import '../typing/deepReadonly.js';
|
|
4
5
|
|
|
5
6
|
type CommandHandlerResult<State, StreamVersion = DefaultStreamVersionType> = AppendToStreamResult<StreamVersion> & {
|
|
6
7
|
newState: State;
|
|
7
8
|
};
|
|
8
9
|
declare const CommandHandler: <State, StreamEvent extends Event, StreamVersion = bigint>(evolve: (state: State, event: StreamEvent) => State, getInitialState: () => State, mapToStreamId?: (id: string) => string) => (eventStore: EventStore<StreamVersion>, id: string, handle: (state: State) => StreamEvent | StreamEvent[], options?: {
|
|
9
|
-
expectedStreamVersion?: ExpectedStreamVersion<StreamVersion
|
|
10
|
-
}
|
|
10
|
+
expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;
|
|
11
|
+
}) => Promise<CommandHandlerResult<State, StreamVersion>>;
|
|
11
12
|
|
|
12
13
|
export { CommandHandler, type CommandHandlerResult };
|
|
@@ -2,9 +2,10 @@ import { CommandHandlerResult } from './handleCommand.mjs';
|
|
|
2
2
|
import { E as EventStore, e as ExpectedStreamVersion } from '../eventStore-DLezSgsV.mjs';
|
|
3
3
|
import { Command, Event, Decider } from '../typing/index.mjs';
|
|
4
4
|
import '../errors/index.mjs';
|
|
5
|
+
import '../typing/deepReadonly.mjs';
|
|
5
6
|
|
|
6
7
|
declare const DeciderCommandHandler: <State, CommandType extends Command, StreamEvent extends Event, StreamVersion = bigint>({ decide, evolve, getInitialState, }: Decider<State, CommandType, StreamEvent>, mapToStreamId?: (id: string) => string) => (eventStore: EventStore<StreamVersion>, id: string, command: CommandType, options?: {
|
|
7
|
-
expectedStreamVersion?: ExpectedStreamVersion<StreamVersion
|
|
8
|
-
}
|
|
8
|
+
expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;
|
|
9
|
+
}) => Promise<CommandHandlerResult<State, StreamVersion>>;
|
|
9
10
|
|
|
10
11
|
export { DeciderCommandHandler };
|
|
@@ -2,9 +2,10 @@ import { CommandHandlerResult } from './handleCommand.js';
|
|
|
2
2
|
import { E as EventStore, e as ExpectedStreamVersion } from '../eventStore-N_YMFCDT.js';
|
|
3
3
|
import { Command, Event, Decider } from '../typing/index.js';
|
|
4
4
|
import '../errors/index.js';
|
|
5
|
+
import '../typing/deepReadonly.js';
|
|
5
6
|
|
|
6
7
|
declare const DeciderCommandHandler: <State, CommandType extends Command, StreamEvent extends Event, StreamVersion = bigint>({ decide, evolve, getInitialState, }: Decider<State, CommandType, StreamEvent>, mapToStreamId?: (id: string) => string) => (eventStore: EventStore<StreamVersion>, id: string, command: CommandType, options?: {
|
|
7
|
-
expectedStreamVersion?: ExpectedStreamVersion<StreamVersion
|
|
8
|
-
}
|
|
8
|
+
expectedStreamVersion?: ExpectedStreamVersion<StreamVersion>;
|
|
9
|
+
}) => Promise<CommandHandlerResult<State, StreamVersion>>;
|
|
9
10
|
|
|
10
11
|
export { DeciderCommandHandler };
|
|
@@ -2,4 +2,5 @@ export { CommandHandler, CommandHandlerResult } from './handleCommand.mjs';
|
|
|
2
2
|
export { DeciderCommandHandler } from './handleCommandWithDecider.mjs';
|
|
3
3
|
import '../eventStore-DLezSgsV.mjs';
|
|
4
4
|
import '../typing/index.mjs';
|
|
5
|
+
import '../typing/deepReadonly.mjs';
|
|
5
6
|
import '../errors/index.mjs';
|
|
@@ -2,4 +2,5 @@ export { CommandHandler, CommandHandlerResult } from './handleCommand.js';
|
|
|
2
2
|
export { DeciderCommandHandler } from './handleCommandWithDecider.js';
|
|
3
3
|
import '../eventStore-N_YMFCDT.js';
|
|
4
4
|
import '../typing/index.js';
|
|
5
|
+
import '../typing/deepReadonly.js';
|
|
5
6
|
import '../errors/index.js';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import '../typing/index.mjs';
|
|
2
2
|
export { A as AggregateStreamOptions, b as AggregateStreamResult, c as AppendToStreamOptions, d as AppendToStreamResult, D as DefaultStreamVersionType, E as EventStore, R as ReadStreamOptions, a as ReadStreamResult } from '../eventStore-DLezSgsV.mjs';
|
|
3
|
+
import '../typing/deepReadonly.mjs';
|
|
3
4
|
import '../errors/index.mjs';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import '../typing/index.js';
|
|
2
2
|
export { A as AggregateStreamOptions, b as AggregateStreamResult, c as AppendToStreamOptions, d as AppendToStreamResult, D as DefaultStreamVersionType, E as EventStore, R as ReadStreamOptions, a as ReadStreamResult } from '../eventStore-N_YMFCDT.js';
|
|
3
|
+
import '../typing/deepReadonly.js';
|
|
3
4
|
import '../errors/index.js';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import '../errors/index.mjs';
|
|
2
2
|
import '../typing/index.mjs';
|
|
3
3
|
export { e as ExpectedStreamVersion, g as ExpectedStreamVersionGeneral, f as ExpectedStreamVersionWithValue, j as ExpectedVersionConflictError, N as NO_CONCURRENCY_CHECK, h as STREAM_DOES_NOT_EXIST, S as STREAM_EXISTS, i as assertExpectedVersionMatchesCurrent, m as matchesExpectedVersion } from '../eventStore-DLezSgsV.mjs';
|
|
4
|
+
import '../typing/deepReadonly.mjs';
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import '../errors/index.js';
|
|
2
2
|
import '../typing/index.js';
|
|
3
3
|
export { e as ExpectedStreamVersion, g as ExpectedStreamVersionGeneral, f as ExpectedStreamVersionWithValue, j as ExpectedVersionConflictError, N as NO_CONCURRENCY_CHECK, h as STREAM_DOES_NOT_EXIST, S as STREAM_EXISTS, i as assertExpectedVersionMatchesCurrent, m as matchesExpectedVersion } from '../eventStore-N_YMFCDT.js';
|
|
4
|
+
import '../typing/deepReadonly.js';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { A as AggregateStreamOptions, b as AggregateStreamResult, c as AppendToStreamOptions, d as AppendToStreamResult, D as DefaultStreamVersionType, E as EventStore, e as ExpectedStreamVersion, g as ExpectedStreamVersionGeneral, f as ExpectedStreamVersionWithValue, j as ExpectedVersionConflictError, N as NO_CONCURRENCY_CHECK, R as ReadStreamOptions, a as ReadStreamResult, h as STREAM_DOES_NOT_EXIST, S as STREAM_EXISTS, i as assertExpectedVersionMatchesCurrent, m as matchesExpectedVersion } from '../eventStore-DLezSgsV.mjs';
|
|
2
2
|
export { EventEnvelope, EventHandler, EventMetadata, getInMemoryEventStore } from './inMemoryEventStore.mjs';
|
|
3
3
|
import '../typing/index.mjs';
|
|
4
|
+
import '../typing/deepReadonly.mjs';
|
|
4
5
|
import '../errors/index.mjs';
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { A as AggregateStreamOptions, b as AggregateStreamResult, c as AppendToStreamOptions, d as AppendToStreamResult, D as DefaultStreamVersionType, E as EventStore, e as ExpectedStreamVersion, g as ExpectedStreamVersionGeneral, f as ExpectedStreamVersionWithValue, j as ExpectedVersionConflictError, N as NO_CONCURRENCY_CHECK, R as ReadStreamOptions, a as ReadStreamResult, h as STREAM_DOES_NOT_EXIST, S as STREAM_EXISTS, i as assertExpectedVersionMatchesCurrent, m as matchesExpectedVersion } from '../eventStore-N_YMFCDT.js';
|
|
2
2
|
export { EventEnvelope, EventHandler, EventMetadata, getInMemoryEventStore } from './inMemoryEventStore.js';
|
|
3
3
|
import '../typing/index.js';
|
|
4
|
+
import '../typing/deepReadonly.js';
|
|
4
5
|
import '../errors/index.js';
|
package/dist/index.d.mts
CHANGED
|
@@ -6,7 +6,10 @@ export { EventEnvelope, EventHandler, EventMetadata, getInMemoryEventStore } fro
|
|
|
6
6
|
export { JSONParser, Mapper, MapperArgs, ParseError, ParseOptions, StringifyOptions } from './serialization/json/JSONParser.mjs';
|
|
7
7
|
export { assertMatches, isSubset } from './testing/assertions.mjs';
|
|
8
8
|
export { DeciderSpecfication, DeciderSpecification } from './testing/deciderSpecification.mjs';
|
|
9
|
-
export {
|
|
9
|
+
export { EventStoreFactory, testAggregateStream } from './testing/features.mjs';
|
|
10
|
+
export { DiscountApplied, PricedProductItem, ProductItemAdded, ShoppingCart, ShoppingCartEvent, evolve, getInitialState } from './testing/shoppingCart.domain.mjs';
|
|
11
|
+
export { Brand, Command, CommandDataOf, CommandMetaDataOf, CommandTypeOf, CreateCommandType, CreateEventType, Decider, DefaultCommandMetadata, DefaultRecord, Event, EventDataOf, EventMetaDataOf, EventTypeOf, Flavour, Workflow, WorkflowCommand, WorkflowEvent, WorkflowOutput, accept, command, complete, error, event, ignore, publish, reply, schedule, send } from './typing/index.mjs';
|
|
10
12
|
export { sum } from './utils/iterators.mjs';
|
|
11
13
|
export { merge } from './utils/merge.mjs';
|
|
12
14
|
export { ValidationErrors, assertNotEmptyString, assertPositiveNumber, assertUnsignedBigInt, isNumber, isString } from './validation/index.mjs';
|
|
15
|
+
export { DeepReadonly, Mutable } from './typing/deepReadonly.mjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,10 @@ export { EventEnvelope, EventHandler, EventMetadata, getInMemoryEventStore } fro
|
|
|
6
6
|
export { JSONParser, Mapper, MapperArgs, ParseError, ParseOptions, StringifyOptions } from './serialization/json/JSONParser.js';
|
|
7
7
|
export { assertMatches, isSubset } from './testing/assertions.js';
|
|
8
8
|
export { DeciderSpecfication, DeciderSpecification } from './testing/deciderSpecification.js';
|
|
9
|
-
export {
|
|
9
|
+
export { EventStoreFactory, testAggregateStream } from './testing/features.js';
|
|
10
|
+
export { DiscountApplied, PricedProductItem, ProductItemAdded, ShoppingCart, ShoppingCartEvent, evolve, getInitialState } from './testing/shoppingCart.domain.js';
|
|
11
|
+
export { Brand, Command, CommandDataOf, CommandMetaDataOf, CommandTypeOf, CreateCommandType, CreateEventType, Decider, DefaultCommandMetadata, DefaultRecord, Event, EventDataOf, EventMetaDataOf, EventTypeOf, Flavour, Workflow, WorkflowCommand, WorkflowEvent, WorkflowOutput, accept, command, complete, error, event, ignore, publish, reply, schedule, send } from './typing/index.js';
|
|
10
12
|
export { sum } from './utils/iterators.js';
|
|
11
13
|
export { merge } from './utils/merge.js';
|
|
12
14
|
export { ValidationErrors, assertNotEmptyString, assertPositiveNumber, assertUnsignedBigInt, isNumber, isString } from './validation/index.js';
|
|
15
|
+
export { DeepReadonly, Mutable } from './typing/deepReadonly.js';
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});require('./chunk-WIMBG2PX.js');var _chunk3JE5DUJ2js = require('./chunk-3JE5DUJ2.js');var _chunkFE73T2NSjs = require('./chunk-FE73T2NS.js');require('./chunk-LOJ6A4AJ.js');require('./chunk-AU2WZCER.js');var _chunkLYKEARRWjs = require('./chunk-LYKEARRW.js');require('./chunk-Z4Z6POJH.js');var _chunk7D2LV2X5js = require('./chunk-7D2LV2X5.js');var _chunkO34VKX7Rjs = require('./chunk-O34VKX7R.js');var _chunk6WITJBGGjs = require('./chunk-6WITJBGG.js');var _chunk4PGUBQK3js = require('./chunk-4PGUBQK3.js');require('./chunk-ZLASBJGR.js');var _chunkMHB2JU4Ujs = require('./chunk-MHB2JU4U.js');require('./chunk-7FJXUW3D.js');require('./chunk-5BGN2FV4.js');var _chunkS3PRXL2Jjs = require('./chunk-S3PRXL2J.js');var _chunk7EZVPMJ6js = require('./chunk-7EZVPMJ6.js');require('./chunk-F7QRI2VL.js');var _chunkU3WA3VIWjs = require('./chunk-U3WA3VIW.js');var _chunkOYAO7QEPjs = require('./chunk-OYAO7QEP.js');require('./chunk-2452BJTJ.js');var _chunkBM2H4NCZjs = require('./chunk-BM2H4NCZ.js');require('./chunk-IJGC6SHP.js');var _chunk46YIPCSNjs = require('./chunk-46YIPCSN.js');var _chunkUUCTMJK7js = require('./chunk-UUCTMJK7.js');exports.CommandHandler = _chunkOYAO7QEPjs.a; exports.ConcurrencyError = _chunkUUCTMJK7js.h; exports.DeciderCommandHandler = _chunkU3WA3VIWjs.a; exports.DeciderSpecification = _chunkO34VKX7Rjs.a; exports.EmmettError = _chunkUUCTMJK7js.g; exports.ExpectedVersionConflictError = _chunk46YIPCSNjs.f; exports.IllegalStateError = _chunkUUCTMJK7js.j; exports.JSONParser = _chunkLYKEARRWjs.b; exports.NO_CONCURRENCY_CHECK = _chunk46YIPCSNjs.c; exports.NotFoundError = _chunkUUCTMJK7js.k; exports.ParseError = _chunkLYKEARRWjs.a; exports.STREAM_DOES_NOT_EXIST = _chunk46YIPCSNjs.b; exports.STREAM_EXISTS = _chunk46YIPCSNjs.a; exports.ValidationError = _chunkUUCTMJK7js.i; exports.ValidationErrors = _chunkUUCTMJK7js.a; exports.accept = _chunk7EZVPMJ6js.h; exports.assertExpectedVersionMatchesCurrent = _chunk46YIPCSNjs.e; exports.assertMatches = _chunk7D2LV2X5js.b; exports.assertNotEmptyString = _chunkUUCTMJK7js.d; exports.assertPositiveNumber = _chunkUUCTMJK7js.e; exports.assertUnsignedBigInt = _chunkUUCTMJK7js.f; exports.command = _chunkMHB2JU4Ujs.a; exports.complete = _chunk7EZVPMJ6js.e; exports.error = _chunk7EZVPMJ6js.g; exports.event = _chunkS3PRXL2Jjs.a; exports.evolve = _chunk4PGUBQK3js.a; exports.getInMemoryEventStore = _chunkBM2H4NCZjs.a; exports.getInitialState = _chunk4PGUBQK3js.b; exports.ignore = _chunk7EZVPMJ6js.f; exports.isNumber = _chunkUUCTMJK7js.b; exports.isString = _chunkUUCTMJK7js.c; exports.isSubset = _chunk7D2LV2X5js.a; exports.matchesExpectedVersion = _chunk46YIPCSNjs.d; exports.merge = _chunk3JE5DUJ2js.a; exports.publish = _chunk7EZVPMJ6js.c; exports.reply = _chunk7EZVPMJ6js.a; exports.schedule = _chunk7EZVPMJ6js.d; exports.send = _chunk7EZVPMJ6js.b; exports.sum = _chunkFE73T2NSjs.a; exports.testAggregateStream = _chunk6WITJBGGjs.a;
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import"./chunk-
|
|
1
|
+
import"./chunk-PNOEBD4U.mjs";import{a as N}from"./chunk-YKFEDBH4.mjs";import{a as M}from"./chunk-OBA6MZMG.mjs";import"./chunk-DIW552TK.mjs";import"./chunk-7JLAVMM3.mjs";import{a as s,b as u}from"./chunk-PKL7KGJ3.mjs";import"./chunk-TDCMNVXU.mjs";import{a as v,b as w}from"./chunk-HVU6UBXF.mjs";import{a as y}from"./chunk-32IWULJJ.mjs";import{a as L}from"./chunk-AMRL5G7K.mjs";import{a as J,b as K}from"./chunk-AYVR4VYR.mjs";import"./chunk-YWRV75GA.mjs";import{a as z}from"./chunk-JDYZZRJE.mjs";import"./chunk-3LYVXI5R.mjs";import"./chunk-DOHUIBZQ.mjs";import{a as A}from"./chunk-AWUWW7EJ.mjs";import{a as B,b as C,c as D,d as E,e as F,f as G,g as H,h as I}from"./chunk-ERDVHQZL.mjs";import"./chunk-XLZS42HB.mjs";import{a as q}from"./chunk-O2ZUNWMO.mjs";import{a as n}from"./chunk-JJHE2RKT.mjs";import"./chunk-45ODDXOQ.mjs";import{a as l}from"./chunk-CTCSK4FW.mjs";import"./chunk-D24KLTN5.mjs";import{a as d,b as g,c as h,d as i,e as j,f as k}from"./chunk-UI6CV7VB.mjs";import{a as o,b as r,c as e,d as f,e as m,f as p,g as t,h as x,i as a,j as b,k as c}from"./chunk-YV6PB6LX.mjs";export{n as CommandHandler,x as ConcurrencyError,q as DeciderCommandHandler,y as DeciderSpecification,t as EmmettError,k as ExpectedVersionConflictError,b as IllegalStateError,u as JSONParser,h as NO_CONCURRENCY_CHECK,c as NotFoundError,s as ParseError,g as STREAM_DOES_NOT_EXIST,d as STREAM_EXISTS,a as ValidationError,o as ValidationErrors,I as accept,j as assertExpectedVersionMatchesCurrent,w as assertMatches,f as assertNotEmptyString,m as assertPositiveNumber,p as assertUnsignedBigInt,z as command,F as complete,H as error,A as event,J as evolve,l as getInMemoryEventStore,K as getInitialState,G as ignore,r as isNumber,e as isString,v as isSubset,i as matchesExpectedVersion,N as merge,D as publish,B as reply,E as schedule,C as send,M as sum,L as testAggregateStream};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Command, Event, CommandTypeOf, EventTypeOf } from '../typing/index.mjs';
|
|
2
|
+
import '../typing/deepReadonly.mjs';
|
|
3
|
+
|
|
4
|
+
interface CommandSender {
|
|
5
|
+
send<CommandType extends Command = Command>(command: CommandType): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
interface EventsPublisher {
|
|
8
|
+
publish<EventType extends Event = Event>(event: EventType): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
type ScheduleOptions = {
|
|
11
|
+
afterInMs: number;
|
|
12
|
+
} | {
|
|
13
|
+
at: Date;
|
|
14
|
+
};
|
|
15
|
+
interface MessageScheduler<CommandOrEvent extends Command | Event> {
|
|
16
|
+
schedule<MessageType extends CommandOrEvent>(message: MessageType, when?: ScheduleOptions): void;
|
|
17
|
+
}
|
|
18
|
+
interface CommandBus extends CommandSender, MessageScheduler<Command> {
|
|
19
|
+
}
|
|
20
|
+
interface EventBus extends EventsPublisher, MessageScheduler<Event> {
|
|
21
|
+
}
|
|
22
|
+
interface MessageBus extends CommandBus, EventBus {
|
|
23
|
+
schedule<MessageType extends Command | Event>(message: MessageType, when?: ScheduleOptions): void;
|
|
24
|
+
}
|
|
25
|
+
type CommandHandler<CommandType extends Command = Command> = (command: CommandType) => Promise<void> | void;
|
|
26
|
+
interface CommandProcessor {
|
|
27
|
+
handle<CommandType extends Command>(commandHandler: CommandHandler<CommandType>, ...commandTypes: CommandTypeOf<CommandType>[]): void;
|
|
28
|
+
}
|
|
29
|
+
type EventHandler<EventType extends Event = Event> = (event: EventType) => Promise<void> | void;
|
|
30
|
+
interface EventProcessor {
|
|
31
|
+
subscribe<EventType extends Event>(eventHandler: EventHandler<EventType>, ...eventTypes: EventTypeOf<EventType>[]): void;
|
|
32
|
+
}
|
|
33
|
+
type ScheduledMessage = {
|
|
34
|
+
message: Event | Command;
|
|
35
|
+
options?: ScheduleOptions;
|
|
36
|
+
};
|
|
37
|
+
interface ScheduledMessageProcessor {
|
|
38
|
+
dequeue(): ScheduledMessage[];
|
|
39
|
+
}
|
|
40
|
+
type MessageHandler = CommandHandler | EventHandler;
|
|
41
|
+
type MessageProcessor = EventProcessor | CommandProcessor;
|
|
42
|
+
declare const getInMemoryMessageBus: () => MessageBus & MessageProcessor & ScheduledMessageProcessor;
|
|
43
|
+
|
|
44
|
+
export { type CommandBus, type CommandHandler, type CommandProcessor, type CommandSender, type EventBus, type EventHandler, type EventProcessor, type EventsPublisher, type MessageBus, type MessageHandler, type MessageProcessor, type MessageScheduler, type ScheduleOptions, type ScheduledMessage, type ScheduledMessageProcessor, getInMemoryMessageBus };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Command, Event, CommandTypeOf, EventTypeOf } from '../typing/index.js';
|
|
2
|
+
import '../typing/deepReadonly.js';
|
|
3
|
+
|
|
4
|
+
interface CommandSender {
|
|
5
|
+
send<CommandType extends Command = Command>(command: CommandType): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
interface EventsPublisher {
|
|
8
|
+
publish<EventType extends Event = Event>(event: EventType): Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
type ScheduleOptions = {
|
|
11
|
+
afterInMs: number;
|
|
12
|
+
} | {
|
|
13
|
+
at: Date;
|
|
14
|
+
};
|
|
15
|
+
interface MessageScheduler<CommandOrEvent extends Command | Event> {
|
|
16
|
+
schedule<MessageType extends CommandOrEvent>(message: MessageType, when?: ScheduleOptions): void;
|
|
17
|
+
}
|
|
18
|
+
interface CommandBus extends CommandSender, MessageScheduler<Command> {
|
|
19
|
+
}
|
|
20
|
+
interface EventBus extends EventsPublisher, MessageScheduler<Event> {
|
|
21
|
+
}
|
|
22
|
+
interface MessageBus extends CommandBus, EventBus {
|
|
23
|
+
schedule<MessageType extends Command | Event>(message: MessageType, when?: ScheduleOptions): void;
|
|
24
|
+
}
|
|
25
|
+
type CommandHandler<CommandType extends Command = Command> = (command: CommandType) => Promise<void> | void;
|
|
26
|
+
interface CommandProcessor {
|
|
27
|
+
handle<CommandType extends Command>(commandHandler: CommandHandler<CommandType>, ...commandTypes: CommandTypeOf<CommandType>[]): void;
|
|
28
|
+
}
|
|
29
|
+
type EventHandler<EventType extends Event = Event> = (event: EventType) => Promise<void> | void;
|
|
30
|
+
interface EventProcessor {
|
|
31
|
+
subscribe<EventType extends Event>(eventHandler: EventHandler<EventType>, ...eventTypes: EventTypeOf<EventType>[]): void;
|
|
32
|
+
}
|
|
33
|
+
type ScheduledMessage = {
|
|
34
|
+
message: Event | Command;
|
|
35
|
+
options?: ScheduleOptions;
|
|
36
|
+
};
|
|
37
|
+
interface ScheduledMessageProcessor {
|
|
38
|
+
dequeue(): ScheduledMessage[];
|
|
39
|
+
}
|
|
40
|
+
type MessageHandler = CommandHandler | EventHandler;
|
|
41
|
+
type MessageProcessor = EventProcessor | CommandProcessor;
|
|
42
|
+
declare const getInMemoryMessageBus: () => MessageBus & MessageProcessor & ScheduledMessageProcessor;
|
|
43
|
+
|
|
44
|
+
export { type CommandBus, type CommandHandler, type CommandProcessor, type CommandSender, type EventBus, type EventHandler, type EventProcessor, type EventsPublisher, type MessageBus, type MessageHandler, type MessageProcessor, type MessageScheduler, type ScheduleOptions, type ScheduledMessage, type ScheduledMessageProcessor, getInMemoryMessageBus };
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }require('../chunk-ZLASBJGR.js');require('../chunk-MHB2JU4U.js');require('../chunk-7FJXUW3D.js');require('../chunk-5BGN2FV4.js');require('../chunk-S3PRXL2J.js');require('../chunk-7EZVPMJ6.js');var _chunkUUCTMJK7js = require('../chunk-UUCTMJK7.js');var p=()=>{let t=new Map,d=[];return{send:async e=>{let n=t.get(e.type);if(n===void 0||n.length===0)throw new (0, _chunkUUCTMJK7js.g)(`No handler registered for command ${e.type}!`);let s=n[0];await s(e)},publish:async e=>{let n=_nullishCoalesce(t.get(e.type), () => ([]));for(let s of n)await s(e)},schedule:(e,n)=>{d=[...d,{message:e,options:n}]},handle:(e,...n)=>{let s=[...t.keys()].filter(o=>n.includes(o));if(s.length>0)throw new (0, _chunkUUCTMJK7js.g)(`Cannot register handler for commands ${s.join(", ")} as they're already registered!`);for(let o of n)t.set(o,[e])},subscribe(e,...n){for(let s of n)t.has(s)||t.set(s,[]),t.set(s,[..._nullishCoalesce(t.get(s), () => ([])),e])},dequeue:()=>{let e=d;return d=[],e}}};exports.getInMemoryMessageBus = p;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/messageBus/index.ts"],"names":["getInMemoryMessageBus","allHandlers","pendingMessages","command","handlers","EmmettError","commandHandler","event","handler","message","when","commandTypes","alreadyRegistered","registered","commandType","eventHandler","eventTypes","eventType","pending"],"mappings":"uNAyEO,IAAMA,EAAwB,IAEN,CAC7B,IAAMC,EAAc,IAAI,IACpBC,EAAsC,CAAC,EAE3C,MAAO,CACL,KAAM,MACJC,GACkB,CAClB,IAAMC,EAAWH,EAAY,IAAIE,EAAQ,IAAI,EAE7C,GAAIC,IAAa,QAAaA,EAAS,SAAW,EAChD,MAAM,IAAIC,EACR,qCAAqCF,EAAQ,IAAI,GACnD,EAEF,IAAMG,EAAiBF,EAAS,CAAC,EAEjC,MAAME,EAAeH,CAAO,CAC9B,EAEA,QAAS,MACPI,GACkB,CAClB,IAAMH,EAAWH,EAAY,IAAIM,EAAM,IAAI,GAAK,CAAC,EAEjD,QAAWC,KAAWJ,EAGpB,MAFqBI,EAEFD,CAAK,CAE5B,EAEA,SAAU,CACRE,EACAC,IACS,CACTR,EAAkB,CAAC,GAAGA,EAAiB,CAAE,QAAAO,EAAS,QAASC,CAAK,CAAC,CACnE,EAEA,OAAQ,CACNJ,KACGK,IACM,CACT,IAAMC,EAAoB,CAAC,GAAGX,EAAY,KAAK,CAAC,EAAE,OAAQY,GACxDF,EAAa,SAASE,CAAU,CAClC,EAEA,GAAID,EAAkB,OAAS,EAC7B,MAAM,IAAIP,EACR,wCAAwCO,EAAkB,KAAK,IAAI,CAAC,iCACtE,EACF,QAAWE,KAAeH,EACxBV,EAAY,IAAIa,EAAa,CAACR,CAAgC,CAAC,CAEnE,EAEA,UACES,KACGC,EACG,CACN,QAAWC,KAAaD,EACjBf,EAAY,IAAIgB,CAAS,GAAGhB,EAAY,IAAIgB,EAAW,CAAC,CAAC,EAE9DhB,EAAY,IAAIgB,EAAW,CACzB,GAAIhB,EAAY,IAAIgB,CAAS,GAAK,CAAC,EACnCF,CACF,CAAC,CAEL,EAEA,QAAS,IAA0B,CACjC,IAAMG,EAAUhB,EAChB,OAAAA,EAAkB,CAAC,EACZgB,CACT,CACF,CACF","sourcesContent":["import { EmmettError } from '../errors';\nimport {\n type Command,\n type CommandTypeOf,\n type Event,\n type EventTypeOf,\n} from '../typing';\n\nexport interface CommandSender {\n send<CommandType extends Command = Command>(\n command: CommandType,\n ): Promise<void>;\n}\n\nexport interface EventsPublisher {\n publish<EventType extends Event = Event>(event: EventType): Promise<void>;\n}\n\nexport type ScheduleOptions = { afterInMs: number } | { at: Date };\n\nexport interface MessageScheduler<CommandOrEvent extends Command | Event> {\n schedule<MessageType extends CommandOrEvent>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void;\n}\n\nexport interface CommandBus extends CommandSender, MessageScheduler<Command> {}\n\nexport interface EventBus extends EventsPublisher, MessageScheduler<Event> {}\n\nexport interface MessageBus extends CommandBus, EventBus {\n schedule<MessageType extends Command | Event>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void;\n}\n\nexport type CommandHandler<CommandType extends Command = Command> = (\n command: CommandType,\n) => Promise<void> | void;\n\nexport interface CommandProcessor {\n handle<CommandType extends Command>(\n commandHandler: CommandHandler<CommandType>,\n ...commandTypes: CommandTypeOf<CommandType>[]\n ): void;\n}\n\nexport type EventHandler<EventType extends Event = Event> = (\n event: EventType,\n) => Promise<void> | void;\n\nexport interface EventProcessor {\n subscribe<EventType extends Event>(\n eventHandler: EventHandler<EventType>,\n ...eventTypes: EventTypeOf<EventType>[]\n ): void;\n}\n\nexport type ScheduledMessage = {\n message: Event | Command;\n options?: ScheduleOptions;\n};\n\nexport interface ScheduledMessageProcessor {\n dequeue(): ScheduledMessage[];\n}\n\nexport type MessageHandler = CommandHandler | EventHandler;\n\nexport type MessageProcessor = EventProcessor | CommandProcessor;\n\nexport const getInMemoryMessageBus = (): MessageBus &\n MessageProcessor &\n ScheduledMessageProcessor => {\n const allHandlers = new Map<string, MessageHandler[]>();\n let pendingMessages: ScheduledMessage[] = [];\n\n return {\n send: async <CommandType extends Command = Command>(\n command: CommandType,\n ): Promise<void> => {\n const handlers = allHandlers.get(command.type);\n\n if (handlers === undefined || handlers.length === 0)\n throw new EmmettError(\n `No handler registered for command ${command.type}!`,\n );\n\n const commandHandler = handlers[0] as CommandHandler<CommandType>;\n\n await commandHandler(command);\n },\n\n publish: async <EventType extends Event = Event>(\n event: EventType,\n ): Promise<void> => {\n const handlers = allHandlers.get(event.type) ?? [];\n\n for (const handler of handlers) {\n const eventHandler = handler as EventHandler<EventType>;\n\n await eventHandler(event);\n }\n },\n\n schedule: <MessageType extends Command | Event>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void => {\n pendingMessages = [...pendingMessages, { message, options: when }];\n },\n\n handle: <CommandType extends Command>(\n commandHandler: CommandHandler<CommandType>,\n ...commandTypes: CommandTypeOf<CommandType>[]\n ): void => {\n const alreadyRegistered = [...allHandlers.keys()].filter((registered) =>\n commandTypes.includes(registered),\n );\n\n if (alreadyRegistered.length > 0)\n throw new EmmettError(\n `Cannot register handler for commands ${alreadyRegistered.join(', ')} as they're already registered!`,\n );\n for (const commandType of commandTypes) {\n allHandlers.set(commandType, [commandHandler as MessageHandler]);\n }\n },\n\n subscribe<EventType extends Event>(\n eventHandler: EventHandler<EventType>,\n ...eventTypes: EventTypeOf<EventType>[]\n ): void {\n for (const eventType of eventTypes) {\n if (!allHandlers.has(eventType)) allHandlers.set(eventType, []);\n\n allHandlers.set(eventType, [\n ...(allHandlers.get(eventType) ?? []),\n eventHandler as MessageHandler,\n ]);\n }\n },\n\n dequeue: (): ScheduledMessage[] => {\n const pending = pendingMessages;\n pendingMessages = [];\n return pending;\n },\n };\n};\n"]}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import"../chunk-YWRV75GA.mjs";import"../chunk-JDYZZRJE.mjs";import"../chunk-3LYVXI5R.mjs";import"../chunk-DOHUIBZQ.mjs";import"../chunk-AWUWW7EJ.mjs";import"../chunk-ERDVHQZL.mjs";import{g as a}from"../chunk-YV6PB6LX.mjs";var p=()=>{let t=new Map,d=[];return{send:async e=>{let n=t.get(e.type);if(n===void 0||n.length===0)throw new a(`No handler registered for command ${e.type}!`);let s=n[0];await s(e)},publish:async e=>{let n=t.get(e.type)??[];for(let s of n)await s(e)},schedule:(e,n)=>{d=[...d,{message:e,options:n}]},handle:(e,...n)=>{let s=[...t.keys()].filter(o=>n.includes(o));if(s.length>0)throw new a(`Cannot register handler for commands ${s.join(", ")} as they're already registered!`);for(let o of n)t.set(o,[e])},subscribe(e,...n){for(let s of n)t.has(s)||t.set(s,[]),t.set(s,[...t.get(s)??[],e])},dequeue:()=>{let e=d;return d=[],e}}};export{p as getInMemoryMessageBus};
|
|
2
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/messageBus/index.ts"],"sourcesContent":["import { EmmettError } from '../errors';\nimport {\n type Command,\n type CommandTypeOf,\n type Event,\n type EventTypeOf,\n} from '../typing';\n\nexport interface CommandSender {\n send<CommandType extends Command = Command>(\n command: CommandType,\n ): Promise<void>;\n}\n\nexport interface EventsPublisher {\n publish<EventType extends Event = Event>(event: EventType): Promise<void>;\n}\n\nexport type ScheduleOptions = { afterInMs: number } | { at: Date };\n\nexport interface MessageScheduler<CommandOrEvent extends Command | Event> {\n schedule<MessageType extends CommandOrEvent>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void;\n}\n\nexport interface CommandBus extends CommandSender, MessageScheduler<Command> {}\n\nexport interface EventBus extends EventsPublisher, MessageScheduler<Event> {}\n\nexport interface MessageBus extends CommandBus, EventBus {\n schedule<MessageType extends Command | Event>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void;\n}\n\nexport type CommandHandler<CommandType extends Command = Command> = (\n command: CommandType,\n) => Promise<void> | void;\n\nexport interface CommandProcessor {\n handle<CommandType extends Command>(\n commandHandler: CommandHandler<CommandType>,\n ...commandTypes: CommandTypeOf<CommandType>[]\n ): void;\n}\n\nexport type EventHandler<EventType extends Event = Event> = (\n event: EventType,\n) => Promise<void> | void;\n\nexport interface EventProcessor {\n subscribe<EventType extends Event>(\n eventHandler: EventHandler<EventType>,\n ...eventTypes: EventTypeOf<EventType>[]\n ): void;\n}\n\nexport type ScheduledMessage = {\n message: Event | Command;\n options?: ScheduleOptions;\n};\n\nexport interface ScheduledMessageProcessor {\n dequeue(): ScheduledMessage[];\n}\n\nexport type MessageHandler = CommandHandler | EventHandler;\n\nexport type MessageProcessor = EventProcessor | CommandProcessor;\n\nexport const getInMemoryMessageBus = (): MessageBus &\n MessageProcessor &\n ScheduledMessageProcessor => {\n const allHandlers = new Map<string, MessageHandler[]>();\n let pendingMessages: ScheduledMessage[] = [];\n\n return {\n send: async <CommandType extends Command = Command>(\n command: CommandType,\n ): Promise<void> => {\n const handlers = allHandlers.get(command.type);\n\n if (handlers === undefined || handlers.length === 0)\n throw new EmmettError(\n `No handler registered for command ${command.type}!`,\n );\n\n const commandHandler = handlers[0] as CommandHandler<CommandType>;\n\n await commandHandler(command);\n },\n\n publish: async <EventType extends Event = Event>(\n event: EventType,\n ): Promise<void> => {\n const handlers = allHandlers.get(event.type) ?? [];\n\n for (const handler of handlers) {\n const eventHandler = handler as EventHandler<EventType>;\n\n await eventHandler(event);\n }\n },\n\n schedule: <MessageType extends Command | Event>(\n message: MessageType,\n when?: ScheduleOptions,\n ): void => {\n pendingMessages = [...pendingMessages, { message, options: when }];\n },\n\n handle: <CommandType extends Command>(\n commandHandler: CommandHandler<CommandType>,\n ...commandTypes: CommandTypeOf<CommandType>[]\n ): void => {\n const alreadyRegistered = [...allHandlers.keys()].filter((registered) =>\n commandTypes.includes(registered),\n );\n\n if (alreadyRegistered.length > 0)\n throw new EmmettError(\n `Cannot register handler for commands ${alreadyRegistered.join(', ')} as they're already registered!`,\n );\n for (const commandType of commandTypes) {\n allHandlers.set(commandType, [commandHandler as MessageHandler]);\n }\n },\n\n subscribe<EventType extends Event>(\n eventHandler: EventHandler<EventType>,\n ...eventTypes: EventTypeOf<EventType>[]\n ): void {\n for (const eventType of eventTypes) {\n if (!allHandlers.has(eventType)) allHandlers.set(eventType, []);\n\n allHandlers.set(eventType, [\n ...(allHandlers.get(eventType) ?? []),\n eventHandler as MessageHandler,\n ]);\n }\n },\n\n dequeue: (): ScheduledMessage[] => {\n const pending = pendingMessages;\n pendingMessages = [];\n return pending;\n },\n };\n};\n"],"mappings":"8NAyEO,IAAMA,EAAwB,IAEN,CAC7B,IAAMC,EAAc,IAAI,IACpBC,EAAsC,CAAC,EAE3C,MAAO,CACL,KAAM,MACJC,GACkB,CAClB,IAAMC,EAAWH,EAAY,IAAIE,EAAQ,IAAI,EAE7C,GAAIC,IAAa,QAAaA,EAAS,SAAW,EAChD,MAAM,IAAIC,EACR,qCAAqCF,EAAQ,IAAI,GACnD,EAEF,IAAMG,EAAiBF,EAAS,CAAC,EAEjC,MAAME,EAAeH,CAAO,CAC9B,EAEA,QAAS,MACPI,GACkB,CAClB,IAAMH,EAAWH,EAAY,IAAIM,EAAM,IAAI,GAAK,CAAC,EAEjD,QAAWC,KAAWJ,EAGpB,MAFqBI,EAEFD,CAAK,CAE5B,EAEA,SAAU,CACRE,EACAC,IACS,CACTR,EAAkB,CAAC,GAAGA,EAAiB,CAAE,QAAAO,EAAS,QAASC,CAAK,CAAC,CACnE,EAEA,OAAQ,CACNJ,KACGK,IACM,CACT,IAAMC,EAAoB,CAAC,GAAGX,EAAY,KAAK,CAAC,EAAE,OAAQY,GACxDF,EAAa,SAASE,CAAU,CAClC,EAEA,GAAID,EAAkB,OAAS,EAC7B,MAAM,IAAIP,EACR,wCAAwCO,EAAkB,KAAK,IAAI,CAAC,iCACtE,EACF,QAAWE,KAAeH,EACxBV,EAAY,IAAIa,EAAa,CAACR,CAAgC,CAAC,CAEnE,EAEA,UACES,KACGC,EACG,CACN,QAAWC,KAAaD,EACjBf,EAAY,IAAIgB,CAAS,GAAGhB,EAAY,IAAIgB,EAAW,CAAC,CAAC,EAE9DhB,EAAY,IAAIgB,EAAW,CACzB,GAAIhB,EAAY,IAAIgB,CAAS,GAAK,CAAC,EACnCF,CACF,CAAC,CAEL,EAEA,QAAS,IAA0B,CACjC,IAAMG,EAAUhB,EAChB,OAAAA,EAAkB,CAAC,EACZgB,CACT,CACF,CACF","names":["getInMemoryMessageBus","allHandlers","pendingMessages","command","handlers","EmmettError","commandHandler","event","handler","message","when","commandTypes","alreadyRegistered","registered","commandType","eventHandler","eventTypes","eventType","pending"]}
|
|
@@ -12,7 +12,7 @@ type StringifyOptions<From, To = From> = {
|
|
|
12
12
|
map?: Mapper<From, To>;
|
|
13
13
|
};
|
|
14
14
|
declare const JSONParser: {
|
|
15
|
-
stringify: <From, To = From>(value: From, options?: StringifyOptions<From, To>
|
|
15
|
+
stringify: <From, To = From>(value: From, options?: StringifyOptions<From, To>) => string;
|
|
16
16
|
parse: <From_1, To_1 = From_1>(text: string, options?: ParseOptions<From_1, To_1> | undefined) => To_1 | undefined;
|
|
17
17
|
};
|
|
18
18
|
|
|
@@ -12,7 +12,7 @@ type StringifyOptions<From, To = From> = {
|
|
|
12
12
|
map?: Mapper<From, To>;
|
|
13
13
|
};
|
|
14
14
|
declare const JSONParser: {
|
|
15
|
-
stringify: <From, To = From>(value: From, options?: StringifyOptions<From, To>
|
|
15
|
+
stringify: <From, To = From>(value: From, options?: StringifyOptions<From, To>) => string;
|
|
16
16
|
parse: <From_1, To_1 = From_1>(text: string, options?: ParseOptions<From_1, To_1> | undefined) => To_1 | undefined;
|
|
17
17
|
};
|
|
18
18
|
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunk7D2LV2X5js = require('../chunk-7D2LV2X5.js');exports.assertMatches = _chunk7D2LV2X5js.b; exports.isSubset = _chunk7D2LV2X5js.a;
|
|
2
2
|
//# sourceMappingURL=assertions.js.map
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a,b}from"../chunk-
|
|
1
|
+
import{a,b}from"../chunk-HVU6UBXF.mjs";export{b as assertMatches,a as isSubset};
|
|
2
2
|
//# sourceMappingURL=assertions.mjs.map
|
|
@@ -5,11 +5,11 @@ type DeciderSpecfication<Command, Event> = (givenEvents: Event | Event[]) => {
|
|
|
5
5
|
};
|
|
6
6
|
};
|
|
7
7
|
declare const DeciderSpecification: {
|
|
8
|
-
for: <Command,
|
|
9
|
-
decide: (command: Command, state: State) =>
|
|
10
|
-
evolve: (state: State, event:
|
|
8
|
+
for: <Command, Event, State>(decider: {
|
|
9
|
+
decide: (command: Command, state: State) => Event | Event[];
|
|
10
|
+
evolve: (state: State, event: Event) => State;
|
|
11
11
|
initialState: () => State;
|
|
12
|
-
}) => DeciderSpecfication<Command,
|
|
12
|
+
}) => DeciderSpecfication<Command, Event>;
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
export { type DeciderSpecfication, DeciderSpecification };
|
|
@@ -5,11 +5,11 @@ type DeciderSpecfication<Command, Event> = (givenEvents: Event | Event[]) => {
|
|
|
5
5
|
};
|
|
6
6
|
};
|
|
7
7
|
declare const DeciderSpecification: {
|
|
8
|
-
for: <Command,
|
|
9
|
-
decide: (command: Command, state: State) =>
|
|
10
|
-
evolve: (state: State, event:
|
|
8
|
+
for: <Command, Event, State>(decider: {
|
|
9
|
+
decide: (command: Command, state: State) => Event | Event[];
|
|
10
|
+
evolve: (state: State, event: Event) => State;
|
|
11
11
|
initialState: () => State;
|
|
12
|
-
}) => DeciderSpecfication<Command,
|
|
12
|
+
}) => DeciderSpecfication<Command, Event>;
|
|
13
13
|
};
|
|
14
14
|
|
|
15
15
|
export { type DeciderSpecfication, DeciderSpecification };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { E as EventStore } from '../eventStore-DLezSgsV.mjs';
|
|
2
|
+
import '../typing/index.mjs';
|
|
3
|
+
import '../typing/deepReadonly.mjs';
|
|
4
|
+
import '../errors/index.mjs';
|
|
5
|
+
|
|
6
|
+
type TestOptions = {
|
|
7
|
+
getInitialIndex: () => bigint;
|
|
8
|
+
teardownHook?: () => Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
type EventStoreFactory = () => Promise<EventStore<bigint>>;
|
|
11
|
+
declare function testAggregateStream(eventStoreFactory: EventStoreFactory, options?: TestOptions): Promise<void>;
|
|
12
|
+
|
|
13
|
+
export { type EventStoreFactory, testAggregateStream };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { E as EventStore } from '../eventStore-N_YMFCDT.js';
|
|
2
|
+
import '../typing/index.js';
|
|
3
|
+
import '../typing/deepReadonly.js';
|
|
4
|
+
import '../errors/index.js';
|
|
5
|
+
|
|
6
|
+
type TestOptions = {
|
|
7
|
+
getInitialIndex: () => bigint;
|
|
8
|
+
teardownHook?: () => Promise<void>;
|
|
9
|
+
};
|
|
10
|
+
type EventStoreFactory = () => Promise<EventStore<bigint>>;
|
|
11
|
+
declare function testAggregateStream(eventStoreFactory: EventStoreFactory, options?: TestOptions): Promise<void>;
|
|
12
|
+
|
|
13
|
+
export { type EventStoreFactory, testAggregateStream };
|