atomservices 0.15.4 → 0.15.5

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/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require(`uuidv7`);const t=t=>{let{name:n,aggregateType:r}=t,i=({aggregateID:t,payloads:i,_version:a,_createdBy:o,_metadata:s})=>({_id:(0,e.uuidv7)(),name:n,aggregateID:t??(0,e.uuidv7)(),aggregateType:r,payloads:i,_version:a,_createdAt:new Date,_createdBy:o,_metadata:s??{}});return{transform:e=>({action:i,handler:{name:n,aggregateType:r,transform:e}})}},n=e=>{let t={};return e.forEach(e=>{let{aggregateType:n,name:r}=e;t[n]||(t[n]={}),t[n][r]||(t[n][r]=[]),t[n][r].push(e)}),{resolve:(e,n)=>t[e]?.[n]||[]}},r=e=>{let t={};return e.forEach(e=>{if(t[e.aggregateType]||(t[e.aggregateType]={}),t[e.aggregateType][e.name])throw Error(`Duplicate command handler for ${e.aggregateType} and ${e.name}`);t[e.aggregateType][e.name]=e}),{transform:e=>{let n=t[e.aggregateType]?.[e.name];if(!n)throw Error(`No command handler found for ${e.aggregateType} and ${e.name}`);return n.transform(e)}}},i=e=>{let{EventStore:t,ServiceContainers:i,onReactionError:a}=e,o=i.flatMap(e=>e.CommandHandlers),s=i.flatMap(e=>e.Projections),c=i.flatMap(e=>e.Reactions),l=n(s),u=n(c),d=r(o);return{dispatch:async(e,n)=>{try{let r={},i=d.transform(e);await t.append(i);let o=l.resolve(i.aggregateType,i.name);return await Promise.all(o.map(async e=>{r[e.stateType]=await e.project(i)})),u.resolve(i.aggregateType,i.name).forEach(e=>{e.on(i).catch(t=>{let n=t instanceof Error?t:Error(String(t));a&&a({reactionName:e.name,eventName:i.name,eventID:i._id,error:n})})}),n?.(r,void 0),i}catch(e){let t=e instanceof Error?e:Error(String(e));throw n?.({},t),t}},async getVersion(e){return{aggregateID:e,_version:await t.getVersion(e)}}}},a=(...e)=>e.flatMap(e=>Object.values(e)),o=()=>(0,e.uuidv7)();exports.createService=i,exports.defineCommand=t,exports.generateID=o,exports.remap=a;
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("uuidv7");const t=t=>{let{name:n,aggregateType:r}=t,i=({aggregateID:t,payloads:i,_version:a,_createdBy:o,_metadata:s})=>({name:n,aggregateID:t??(0,e.uuidv7)(),aggregateType:r,payloads:i,_version:a,_createdBy:o,_metadata:s??{}});return{transform:e=>({action:i,handler:{name:n,aggregateType:r,transform:e}})}},n=e=>{let t={};return e.forEach(e=>{let{aggregateType:n,name:r}=e;t[n]||(t[n]={}),t[n][r]||(t[n][r]=[]),t[n][r].push(e)}),{resolve:(e,n)=>t[e]?.[n]||[]}},r=e=>{let t={};return e.forEach(e=>{if(t[e.aggregateType]||(t[e.aggregateType]={}),t[e.aggregateType][e.name])throw Error(`Duplicate command handler for ${e.aggregateType} and ${e.name}`);t[e.aggregateType][e.name]=e}),{transform:e=>{let n=t[e.aggregateType]?.[e.name];if(!n)throw Error(`No command handler found for ${e.aggregateType} and ${e.name}`);return n.transform(e)}}},i=t=>({...t,_id:(0,e.uuidv7)(),_createdAt:new Date}),a=e=>{let{EventStore:t,ServiceContainers:a,onReactionError:o}=e,s=a.flatMap(e=>e.CommandHandlers),c=a.flatMap(e=>e.Projections),l=a.flatMap(e=>e.Reactions),u=n(c),d=n(l),f=r(s);return{dispatch:async(e,n)=>{try{let r={},a=f.transform(i(e));await t.append(a);let s=u.resolve(a.aggregateType,a.name);return await Promise.all(s.map(async e=>{r[e.stateType]=await e.project(a)})),d.resolve(a.aggregateType,a.name).forEach(e=>{e.on(a).catch(t=>{let n=t instanceof Error?t:Error(String(t));o&&o({reactionName:e.name,eventName:a.name,eventID:a._id,error:n})})}),n?.(r,void 0),a}catch(e){let t=e instanceof Error?e:Error(String(e));throw n?.({},t),t}},async getVersion(e){return{aggregateID:e,_version:await t.getVersion(e)}}}},o=(...e)=>e.flatMap(e=>Object.values(e)),s=()=>(0,e.uuidv7)();exports.createService=a,exports.defineCommand=t,exports.generateID=s,exports.remap=o;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":[],"sources":["../src/defineCommand.ts","../src/common/composeMapper.ts","../src/common/composeCommandHandlers.ts","../src/createService.ts","../src/util.ts"],"sourcesContent":["// src/defineCommand.ts\r\n\r\nimport { uuidv7 } from \"uuidv7\";\r\nimport { ICommand } from \"./core/ICommand\";\r\nimport { IEvent } from \"./core/IEvent\";\r\n\r\nexport const defineCommand = <C extends ICommand, E extends IEvent>(definitions: {\r\n name: string;\r\n aggregateType: string;\r\n}) => {\r\n const { name, aggregateType } = definitions;\r\n\r\n const action = ({\r\n aggregateID,\r\n payloads,\r\n _version,\r\n _createdBy,\r\n _metadata,\r\n }: {\r\n aggregateID?: string;\r\n payloads: C[\"payloads\"];\r\n _version: C[\"_version\"];\r\n _createdBy: C[\"_createdBy\"];\r\n _metadata?: C[\"_metadata\"];\r\n }): C => ({\r\n _id: uuidv7(),\r\n name,\r\n aggregateID: aggregateID ?? uuidv7(),\r\n aggregateType,\r\n payloads,\r\n _version,\r\n _createdAt: new Date(),\r\n _createdBy,\r\n _metadata: _metadata ?? ({} as C[\"_metadata\"]),\r\n } as unknown as C);\r\n\r\n return {\r\n transform: (fn: (command: C) => E) => ({\r\n action,\r\n handler: {\r\n name,\r\n aggregateType,\r\n transform: fn,\r\n },\r\n })\r\n };\r\n};\r\n","// src/common/composeMapper.ts\r\n\r\n// A generic utility to compose Mappers for Projections and Reactions based on aggregateType and name\r\nexport const composeMapper = <T extends { aggregateType: string; name: string; }>(components: T[]): {\r\n resolve: (aggregateType: string, name: string) => T[];\r\n} => {\r\n const Registry = {} as Record<string, Record<string, T[]>>;\r\n\r\n components.forEach((component) => {\r\n const { aggregateType, name } = component;\r\n if (!Registry[aggregateType]) {\r\n Registry[aggregateType] = {};\r\n }\r\n\r\n if (!Registry[aggregateType][name]) {\r\n Registry[aggregateType][name] = [];\r\n }\r\n\r\n Registry[aggregateType][name].push(component);\r\n });\r\n\r\n return {\r\n // Resolve returns an array of components matching the aggregateType and name, or an empty array if none found\r\n resolve: (aggregateType: string, name: string): T[] =>\r\n Registry[aggregateType]?.[name] || [],\r\n };\r\n};\r\n","// src/common/composeCommandHandlers.ts\r\n\r\nimport { ICommand } from \"../core/ICommand\";\r\nimport { ICommandHandler } from \"../core/ICommandHandler\";\r\n\r\nexport const composeCommandHandlers = (handlers: ICommandHandler[]) => {\r\n const Registry = {} as Record<string, Record<string, ICommandHandler>>;\r\n\r\n handlers.forEach(handler => {\r\n if (!Registry[handler.aggregateType]) {\r\n Registry[handler.aggregateType] = {};\r\n }\r\n\r\n if (Registry[handler.aggregateType][handler.name]) {\r\n throw new Error(`Duplicate command handler for ${handler.aggregateType} and ${handler.name}`);\r\n }\r\n\r\n Registry[handler.aggregateType][handler.name] = handler;\r\n });\r\n\r\n return {\r\n transform: (command: ICommand) => {\r\n const handler = Registry[command.aggregateType]?.[command.name];\r\n\r\n if (!handler) {\r\n throw new Error(`No command handler found for ${command.aggregateType} and ${command.name}`);\r\n }\r\n\r\n return handler.transform(command);\r\n },\r\n };\r\n};\r\n","// src/createService.ts\r\n\r\nimport { composeMapper } from \"./common/composeMapper\";\r\nimport { composeCommandHandlers } from \"./common/composeCommandHandlers\";\r\nimport { IEventStore } from \"./core/IEventStore\";\r\nimport { IProjection } from \"./core/IProjection\";\r\nimport { IReaction } from \"./core/IReaction\";\r\nimport { IReactionError } from \"./core/IReactionError\";\r\nimport { IService } from \"./core/IService\";\r\nimport { IServiceContainer } from \"./core/IServiceContainer\";\r\n\r\nexport const createService = (definition: {\r\n EventStore: IEventStore;\r\n ServiceContainers: IServiceContainer[];\r\n onReactionError?: (context: IReactionError) => void;\r\n}): IService => {\r\n const { EventStore, ServiceContainers, onReactionError } = definition;\r\n\r\n // Flatten command handlers, projections, and reactions from each container\r\n const CommandHandlers = ServiceContainers.flatMap((c) => c.CommandHandlers);\r\n const Projections = ServiceContainers.flatMap((c) => c.Projections);\r\n const Reactions = ServiceContainers.flatMap((c) => c.Reactions);\r\n\r\n // Initialize Mappers\r\n const _ProjectionMapper = composeMapper<IProjection>(Projections);\r\n const _ReactionMapper = composeMapper<IReaction>(Reactions);\r\n const _CommandHandler = composeCommandHandlers(CommandHandlers);\r\n\r\n const service: IService = {\r\n dispatch: async (command, afterHandler) => {\r\n try {\r\n const results: Record<string, any> = {};\r\n\r\n const event = _CommandHandler.transform(command);\r\n await EventStore.append(event);\r\n\r\n const projections = _ProjectionMapper.resolve(event.aggregateType, event.name);\r\n await Promise.all(\r\n projections.map(async (p) => {\r\n results[p.stateType] = await p.project(event);\r\n })\r\n );\r\n\r\n const reactions = _ReactionMapper.resolve(event.aggregateType, event.name);\r\n reactions.forEach((r) => {\r\n r.on(event).catch((error) => {\r\n const wrappedError = error instanceof Error ? error : new Error(String(error));\r\n if (onReactionError) {\r\n onReactionError({\r\n reactionName: r.name,\r\n eventName: event.name,\r\n eventID: event._id,\r\n error: wrappedError,\r\n });\r\n }\r\n });\r\n });\r\n\r\n afterHandler?.(results, undefined);\r\n return event;\r\n } catch (error) {\r\n const wrappedError = error instanceof Error ? error : new Error(String(error));\r\n afterHandler?.({}, wrappedError);\r\n throw wrappedError;\r\n }\r\n },\r\n async getVersion(aggregateID) {\r\n const version = await EventStore.getVersion(aggregateID);\r\n return { aggregateID, _version: version };\r\n }\r\n };\r\n\r\n return service;\r\n};\r\n","import { uuidv7 } from \"uuidv7\";\r\n\r\nexport const remap = <T>(...objs: Record<string, T>[]): T[] =>\r\n objs.flatMap(obj => Object.values(obj));\r\n\r\nexport const generateID = (): string => uuidv7();\r\n"],"mappings":"2FAMA,MAAa,EAAuD,GAG9D,CACJ,GAAM,CAAE,OAAM,iBAAkB,EAE1B,GAAU,CACd,cACA,WACA,WACA,aACA,gBAOQ,CACR,KAAA,EAAA,EAAA,SAAa,CACb,OACA,YAAa,IAAA,EAAA,EAAA,SAAuB,CACpC,gBACA,WACA,WACA,WAAY,IAAI,KAChB,aACA,UAAW,GAAc,EAAE,CAC5B,EAED,MAAO,CACL,UAAY,IAA2B,CACrC,SACA,QAAS,CACP,OACA,gBACA,UAAW,EACZ,CACF,EACF,EC1CU,EAAqE,GAE7E,CACH,IAAM,EAAW,EAAE,CAenB,OAbA,EAAW,QAAS,GAAc,CAChC,GAAM,CAAE,gBAAe,QAAS,EAC3B,EAAS,KACZ,EAAS,GAAiB,EAAE,EAGzB,EAAS,GAAe,KAC3B,EAAS,GAAe,GAAQ,EAAE,EAGpC,EAAS,GAAe,GAAM,KAAK,EAAU,EAC7C,CAEK,CAEL,SAAU,EAAuB,IAC/B,EAAS,KAAiB,IAAS,EAAE,CACxC,ECpBU,EAA0B,GAAgC,CACrE,IAAM,EAAW,EAAE,CAcnB,OAZA,EAAS,QAAQ,GAAW,CAK1B,GAJK,EAAS,EAAQ,iBACpB,EAAS,EAAQ,eAAiB,EAAE,EAGlC,EAAS,EAAQ,eAAe,EAAQ,MAC1C,MAAU,MAAM,iCAAiC,EAAQ,cAAc,OAAO,EAAQ,OAAO,CAG/F,EAAS,EAAQ,eAAe,EAAQ,MAAQ,GAChD,CAEK,CACL,UAAY,GAAsB,CAChC,IAAM,EAAU,EAAS,EAAQ,iBAAiB,EAAQ,MAE1D,GAAI,CAAC,EACH,MAAU,MAAM,gCAAgC,EAAQ,cAAc,OAAO,EAAQ,OAAO,CAG9F,OAAO,EAAQ,UAAU,EAAQ,EAEpC,ECnBU,EAAiB,GAId,CACd,GAAM,CAAE,aAAY,oBAAmB,mBAAoB,EAGrD,EAAkB,EAAkB,QAAS,GAAM,EAAE,gBAAgB,CACrE,EAAc,EAAkB,QAAS,GAAM,EAAE,YAAY,CAC7D,EAAY,EAAkB,QAAS,GAAM,EAAE,UAAU,CAGzD,EAAoB,EAA2B,EAAY,CAC3D,EAAkB,EAAyB,EAAU,CACrD,EAAkB,EAAuB,EAAgB,CA8C/D,MAAO,CA3CL,SAAU,MAAO,EAAS,IAAiB,CACzC,GAAI,CACF,IAAM,EAA+B,EAAE,CAEjC,EAAQ,EAAgB,UAAU,EAAQ,CAChD,MAAM,EAAW,OAAO,EAAM,CAE9B,IAAM,EAAc,EAAkB,QAAQ,EAAM,cAAe,EAAM,KAAK,CAuB9E,OAtBA,MAAM,QAAQ,IACZ,EAAY,IAAI,KAAO,IAAM,CAC3B,EAAQ,EAAE,WAAa,MAAM,EAAE,QAAQ,EAAM,EAC7C,CACH,CAEiB,EAAgB,QAAQ,EAAM,cAAe,EAAM,KAC5D,CAAC,QAAS,GAAM,CACvB,EAAE,GAAG,EAAM,CAAC,MAAO,GAAU,CAC3B,IAAM,EAAe,aAAiB,MAAQ,EAAY,MAAM,OAAO,EAAM,CAAC,CAC1E,GACF,EAAgB,CACd,aAAc,EAAE,KAChB,UAAW,EAAM,KACjB,QAAS,EAAM,IACf,MAAO,EACR,CAAC,EAEJ,EACF,CAEF,IAAe,EAAS,IAAA,GAAU,CAC3B,QACA,EAAO,CACd,IAAM,EAAe,aAAiB,MAAQ,EAAY,MAAM,OAAO,EAAM,CAAC,CAE9E,MADA,IAAe,EAAE,CAAE,EAAa,CAC1B,IAGV,MAAM,WAAW,EAAa,CAE5B,MAAO,CAAE,cAAa,SAAU,MADV,EAAW,WAAW,EAAY,CACf,EAI/B,ECtEH,GAAY,GAAG,IAC1B,EAAK,QAAQ,GAAO,OAAO,OAAO,EAAI,CAAC,CAE5B,OAAA,EAAA,EAAA,SAAmC"}
1
+ {"version":3,"file":"index.cjs","names":[],"sources":["../src/defineCommand.ts","../src/common/composeMapper.ts","../src/common/composeCommandHandlers.ts","../src/common/toManagedCommand.ts","../src/createService.ts","../src/util.ts"],"sourcesContent":["// src/defineCommand.ts\r\n\r\nimport { uuidv7 } from \"uuidv7\";\r\nimport { ICommand } from \"./core/ICommand\";\r\nimport { IEvent } from \"./core/IEvent\";\r\nimport { IManagedCommand } from \"./core/IManagedCommand\";\r\n\r\nexport const defineCommand = <C extends ICommand, E extends IEvent>(definitions: {\r\n name: C[\"name\"];\r\n aggregateType: C[\"aggregateType\"];\r\n}) => {\r\n const { name, aggregateType } = definitions;\r\n\r\n const action = ({\r\n aggregateID,\r\n payloads,\r\n _version,\r\n _createdBy,\r\n _metadata,\r\n }: {\r\n aggregateID?: C[\"aggregateID\"];\r\n payloads: C[\"payloads\"];\r\n _version: C[\"_version\"];\r\n _createdBy: C[\"_createdBy\"];\r\n _metadata?: C[\"_metadata\"];\r\n }): C => ({\r\n name,\r\n aggregateID: aggregateID ?? uuidv7(),\r\n aggregateType,\r\n payloads,\r\n _version,\r\n _createdBy,\r\n _metadata: _metadata ?? ({} as C[\"_metadata\"]),\r\n } as C);\r\n\r\n return {\r\n transform: (fn: (command: IManagedCommand<C>) => E) => ({\r\n action,\r\n handler: {\r\n name,\r\n aggregateType,\r\n transform: fn,\r\n },\r\n })\r\n };\r\n};\r\n","// src/common/composeMapper.ts\r\n\r\n// A generic utility to compose Mappers for Projections and Reactions based on aggregateType and name\r\nexport const composeMapper = <T extends { aggregateType: string; name: string; }>(components: T[]): {\r\n resolve: (aggregateType: string, name: string) => T[];\r\n} => {\r\n const Registry = {} as Record<string, Record<string, T[]>>;\r\n\r\n components.forEach((component) => {\r\n const { aggregateType, name } = component;\r\n if (!Registry[aggregateType]) {\r\n Registry[aggregateType] = {};\r\n }\r\n\r\n if (!Registry[aggregateType][name]) {\r\n Registry[aggregateType][name] = [];\r\n }\r\n\r\n Registry[aggregateType][name].push(component);\r\n });\r\n\r\n return {\r\n // Resolve returns an array of components matching the aggregateType and name, or an empty array if none found\r\n resolve: (aggregateType: string, name: string): T[] =>\r\n Registry[aggregateType]?.[name] || [],\r\n };\r\n};\r\n","// src/common/composeCommandHandlers.ts\r\n\r\nimport { ICommand } from \"../core/ICommand\";\r\nimport { ICommandHandler } from \"../core/ICommandHandler\";\r\nimport { IManagedCommand } from \"../core/IManagedCommand\";\r\n\r\nexport const composeCommandHandlers = (handlers: ICommandHandler[]) => {\r\n const Registry = {} as Record<string, Record<string, ICommandHandler>>;\r\n\r\n handlers.forEach(handler => {\r\n if (!Registry[handler.aggregateType]) {\r\n Registry[handler.aggregateType] = {};\r\n }\r\n\r\n if (Registry[handler.aggregateType][handler.name]) {\r\n throw new Error(`Duplicate command handler for ${handler.aggregateType} and ${handler.name}`);\r\n }\r\n\r\n Registry[handler.aggregateType][handler.name] = handler;\r\n });\r\n\r\n return {\r\n transform: (command: IManagedCommand<ICommand>) => {\r\n const handler = Registry[command.aggregateType]?.[command.name];\r\n\r\n if (!handler) {\r\n throw new Error(`No command handler found for ${command.aggregateType} and ${command.name}`);\r\n }\r\n\r\n return handler.transform(command);\r\n },\r\n };\r\n};\r\n","import { uuidv7 } from \"uuidv7\";\r\nimport { ICommand } from \"../core/ICommand\";\r\nimport { IManagedCommand } from \"../core/IManagedCommand\";\r\n\r\nexport const toManagedCommand = <C extends ICommand>(command: C): IManagedCommand<C> => ({\r\n ...command,\r\n _id: uuidv7(),\r\n _createdAt: new Date(),\r\n});\r\n","// src/createService.ts\r\n\r\nimport { composeMapper } from \"./common/composeMapper\";\r\nimport { composeCommandHandlers } from \"./common/composeCommandHandlers\";\r\nimport { IEventStore } from \"./core/IEventStore\";\r\nimport { IProjection } from \"./core/IProjection\";\r\nimport { IReaction } from \"./core/IReaction\";\r\nimport { IReactionError } from \"./core/IReactionError\";\r\nimport { IService } from \"./core/IService\";\r\nimport { IServiceContainer } from \"./core/IServiceContainer\";\r\nimport { toManagedCommand } from \"./common/toManagedCommand\";\r\n\r\nexport const createService = (definition: {\r\n EventStore: IEventStore;\r\n ServiceContainers: IServiceContainer[];\r\n onReactionError?: (context: IReactionError) => void;\r\n}): IService => {\r\n const { EventStore, ServiceContainers, onReactionError } = definition;\r\n\r\n // Flatten command handlers, projections, and reactions from each container\r\n const CommandHandlers = ServiceContainers.flatMap((c) => c.CommandHandlers);\r\n const Projections = ServiceContainers.flatMap((c) => c.Projections);\r\n const Reactions = ServiceContainers.flatMap((c) => c.Reactions);\r\n\r\n // Initialize Mappers\r\n const _ProjectionMapper = composeMapper<IProjection>(Projections);\r\n const _ReactionMapper = composeMapper<IReaction>(Reactions);\r\n const _CommandHandler = composeCommandHandlers(CommandHandlers);\r\n\r\n const service: IService = {\r\n dispatch: async (command, afterProjections) => {\r\n try {\r\n const results: Record<string, any> = {};\r\n\r\n const event = _CommandHandler.transform(toManagedCommand(command));\r\n await EventStore.append(event);\r\n\r\n const projections = _ProjectionMapper.resolve(event.aggregateType, event.name);\r\n await Promise.all(\r\n projections.map(async (p) => {\r\n results[p.stateType] = await p.project(event);\r\n })\r\n );\r\n\r\n const reactions = _ReactionMapper.resolve(event.aggregateType, event.name);\r\n reactions.forEach((r) => {\r\n r.on(event).catch((error) => {\r\n const wrappedError = error instanceof Error ? error : new Error(String(error));\r\n if (onReactionError) {\r\n onReactionError({\r\n reactionName: r.name,\r\n eventName: event.name,\r\n eventID: event._id,\r\n error: wrappedError,\r\n });\r\n }\r\n });\r\n });\r\n\r\n afterProjections?.(results, undefined);\r\n return event;\r\n } catch (error) {\r\n const wrappedError = error instanceof Error ? error : new Error(String(error));\r\n afterProjections?.({}, wrappedError);\r\n throw wrappedError;\r\n }\r\n },\r\n async getVersion(aggregateID) {\r\n const version = await EventStore.getVersion(aggregateID);\r\n return { aggregateID, _version: version };\r\n }\r\n };\r\n\r\n return service;\r\n};\r\n","import { uuidv7 } from \"uuidv7\";\r\n\r\nexport const remap = <T>(...objs: Record<string, T>[]): T[] =>\r\n objs.flatMap(obj => Object.values(obj));\r\n\r\nexport const generateID = (): string => uuidv7();\r\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -13,22 +13,33 @@ interface IEvent<Payloads extends Record<string, unknown> = {}, Metadata extends
13
13
  //#endregion
14
14
  //#region src/core/ICommand.d.ts
15
15
  interface ICommand<E extends IEvent = IEvent, Payloads = E["payloads"], Metadata = E["_metadata"]> {
16
- _id: string;
17
16
  name: string;
18
17
  aggregateID: string;
19
18
  aggregateType: string;
20
19
  payloads: Payloads;
21
20
  _version: number;
22
- _createdAt: Date;
23
21
  _createdBy: string;
24
22
  _metadata: Metadata;
25
23
  }
26
24
  //#endregion
25
+ //#region src/core/IManagedCommand.d.ts
26
+ interface IManagedCommand<C extends ICommand> {
27
+ _id: string;
28
+ name: string;
29
+ aggregateID: string;
30
+ aggregateType: string;
31
+ payloads: C["payloads"];
32
+ _version: number;
33
+ _createdAt: Date;
34
+ _createdBy: string;
35
+ _metadata: C["_metadata"];
36
+ }
37
+ //#endregion
27
38
  //#region src/core/ICommandHandler.d.ts
28
39
  interface ICommandHandler<Command extends ICommand = ICommand, Event extends IEvent = IEvent> {
29
40
  name: string;
30
41
  aggregateType: string;
31
- transform: (command: Command) => Event;
42
+ transform: (command: IManagedCommand<Command>) => Event;
32
43
  }
33
44
  //#endregion
34
45
  //#region src/core/IEventStore.d.ts
@@ -91,9 +102,9 @@ interface IService {
91
102
  * 4. Project: Update the State Store (Read Models) via Projections.
92
103
  * 5. React: Trigger side-effects (e.g., emails, external APIs) via Reactions.
93
104
  * * @param command - The ICommand object representing the intent.
94
- * @param afterHandler - Optional callback executed after the state is synchronized.
105
+ * @param afterProjections - Optional callback executed after the state is synchronized.
95
106
  */
96
- dispatch: (command: ICommand, afterHandler?: (results: Record<string, any>, error?: Error) => void) => Promise<IEvent<any>>;
107
+ dispatch: (command: ICommand, afterProjections?: (results: Record<string, any>, error?: Error) => void) => Promise<IEvent<any>>;
97
108
  getVersion: (aggregateID: string) => Promise<{
98
109
  aggregateID: string;
99
110
  _version: number;
@@ -110,10 +121,10 @@ interface IServiceContainer {
110
121
  //#endregion
111
122
  //#region src/defineCommand.d.ts
112
123
  declare const defineCommand: <C extends ICommand, E extends IEvent>(definitions: {
113
- name: string;
114
- aggregateType: string;
124
+ name: C["name"];
125
+ aggregateType: C["aggregateType"];
115
126
  }) => {
116
- transform: (fn: (command: C) => E) => {
127
+ transform: (fn: (command: IManagedCommand<C>) => E) => {
117
128
  action: ({
118
129
  aggregateID,
119
130
  payloads,
@@ -121,16 +132,16 @@ declare const defineCommand: <C extends ICommand, E extends IEvent>(definitions:
121
132
  _createdBy,
122
133
  _metadata
123
134
  }: {
124
- aggregateID?: string;
135
+ aggregateID?: C["aggregateID"];
125
136
  payloads: C["payloads"];
126
137
  _version: C["_version"];
127
138
  _createdBy: C["_createdBy"];
128
139
  _metadata?: C["_metadata"];
129
140
  }) => C;
130
141
  handler: {
131
- name: string;
132
- aggregateType: string;
133
- transform: (command: C) => E;
142
+ name: C["name"];
143
+ aggregateType: C["aggregateType"];
144
+ transform: (command: IManagedCommand<C>) => E;
134
145
  };
135
146
  };
136
147
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/core/IEvent.ts","../src/core/ICommand.ts","../src/core/ICommandHandler.ts","../src/core/IEventStore.ts","../src/core/IProjection.ts","../src/core/IReaction.ts","../src/core/IReactionError.ts","../src/core/IReducer.ts","../src/core/IService.ts","../src/core/IServiceContainer.ts","../src/defineCommand.ts","../src/createService.ts","../src/util.ts"],"mappings":";UAEiB,MAAA,kBAAwB,MAAA,yCAA+C,MAAA;EACtF,GAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,QAAA;EACV,QAAA;EACA,UAAA,EAAY,IAAA;EACZ,UAAA;EACA,SAAA,EAAW,QAAA;AAAA;;;UCPI,QAAA,WAAmB,MAAA,GAAS,MAAA,aAAmB,CAAA,yBAA0B,CAAA;EACxF,GAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,QAAA;EACV,QAAA;EACA,UAAA,EAAY,IAAA;EACZ,UAAA;EACA,SAAA,EAAW,QAAA;AAAA;;;UCVI,eAAA,iBAAgC,QAAA,GAAW,QAAA,gBAAwB,MAAA,GAAS,MAAA;EAC3F,IAAA;EACA,aAAA;EACA,SAAA,GAAY,OAAA,EAAS,OAAA,KAAY,KAAA;AAAA;;;UCFlB,WAAA;EACf,MAAA,GAAS,KAAA,EAAO,MAAA,KAAW,OAAA;EAC3B,UAAA,GAAa,WAAA,aAAwB,OAAA;AAAA;;;AHJvC;;;;;AAAA,UIOiB,WAAA,eAA0B,MAAA,GAAS,MAAA;EAClD,IAAA;EACA,aAAA;EACA,SAAA;EACA,OAAA,GAAU,KAAA,EAAO,KAAA,KAAU,OAAA;AAAA;;;AJX7B;;;;;AAAA,UKKiB,SAAA,eAAwB,MAAA,GAAS,MAAA;EAChD,IAAA;EACA,aAAA;EACA,EAAA,GAAK,KAAA,EAAO,KAAA,KAAU,OAAA;AAAA;;;UCVP,cAAA;EACf,YAAA;EACA,SAAA;EACA,OAAA;EACA,KAAA,EAAO,KAAA;AAAA;;;ANFT;;;;;AAAA,UOOiB,QAAA;EAAA,CACd,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,GAAS,KAAA;AAAA;;;UCLhB,QAAA;ERHM;;;;;;;;;;;EQerB,QAAA,GAAW,OAAA,EAAS,QAAA,EAAU,YAAA,IAAgB,OAAA,EAAS,MAAA,eAAqB,KAAA,GAAQ,KAAA,cAAmB,OAAA,CAAQ,MAAA;EAG/G,UAAA,GAAa,WAAA,aAAwB,OAAA;IAAU,WAAA;IAAqB,QAAA;EAAA;AAAA;;;UChBrD,iBAAA;EACf,aAAA;EACA,eAAA,EAAiB,eAAA;EACjB,WAAA,EAAa,WAAA;EACb,SAAA,EAAW,SAAA;AAAA;;;cCFA,aAAA,aAA2B,QAAA,YAAoB,MAAA,EAAQ,WAAA;EAClE,IAAA;EACA,aAAA;AAAA;mBA6BmB,OAAA,EAAS,CAAA,KAAM,CAAA;;;;;;;;MAlBhC,WAAA;MACA,QAAA,EAAU,CAAA;MACV,QAAA,EAAU,CAAA;MACV,UAAA,EAAY,CAAA;MACZ,SAAA,GAAY,CAAA;IAAA,MACV,CAAA;;;;2BAawB,CAAA,KAAM,CAAA;IAAA;EAAA;AAAA;;;cC1BvB,aAAA,GAAiB,UAAA;EAC5B,UAAA,EAAY,WAAA;EACZ,iBAAA,EAAmB,iBAAA;EACnB,eAAA,IAAmB,OAAA,EAAS,cAAA;AAAA,MAC1B,QAAA;;;cCbS,KAAA,SAAe,IAAA,EAAM,MAAA,SAAe,CAAA,QAAO,CAAA;AAAA,cAG3C,UAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/core/IEvent.ts","../src/core/ICommand.ts","../src/core/IManagedCommand.ts","../src/core/ICommandHandler.ts","../src/core/IEventStore.ts","../src/core/IProjection.ts","../src/core/IReaction.ts","../src/core/IReactionError.ts","../src/core/IReducer.ts","../src/core/IService.ts","../src/core/IServiceContainer.ts","../src/defineCommand.ts","../src/createService.ts","../src/util.ts"],"mappings":";UAEiB,MAAA,kBAAwB,MAAA,yCAA+C,MAAA;EACtF,GAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,QAAA;EACV,QAAA;EACA,UAAA,EAAY,IAAA;EACZ,UAAA;EACA,SAAA,EAAW,QAAA;AAAA;;;UCPI,QAAA,WAAmB,MAAA,GAAS,MAAA,aAAmB,CAAA,yBAA0B,CAAA;EACxF,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,QAAA;EACV,QAAA;EACA,UAAA;EACA,SAAA,EAAW,QAAA;AAAA;;;UCPI,eAAA,WAA0B,QAAA;EACzC,GAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,CAAA;EACV,QAAA;EACA,UAAA,EAAY,IAAA;EACZ,UAAA;EACA,SAAA,EAAW,CAAA;AAAA;;;UCTI,eAAA,iBAAgC,QAAA,GAAW,QAAA,gBAAwB,MAAA,GAAS,MAAA;EAC3F,IAAA;EACA,aAAA;EACA,SAAA,GAAY,OAAA,EAAS,eAAA,CAAgB,OAAA,MAAa,KAAA;AAAA;;;UCHnC,WAAA;EACf,MAAA,GAAS,KAAA,EAAO,MAAA,KAAW,OAAA;EAC3B,UAAA,GAAa,WAAA,aAAwB,OAAA;AAAA;;;AJJvC;;;;;AAAA,UKOiB,WAAA,eAA0B,MAAA,GAAS,MAAA;EAClD,IAAA;EACA,aAAA;EACA,SAAA;EACA,OAAA,GAAU,KAAA,EAAO,KAAA,KAAU,OAAA;AAAA;;;ALX7B;;;;;AAAA,UMKiB,SAAA,eAAwB,MAAA,GAAS,MAAA;EAChD,IAAA;EACA,aAAA;EACA,EAAA,GAAK,KAAA,EAAO,KAAA,KAAU,OAAA;AAAA;;;UCVP,cAAA;EACf,YAAA;EACA,SAAA;EACA,OAAA;EACA,KAAA,EAAO,KAAK;AAAA;;;APFd;;;;;AAAA,UQOiB,QAAA;EAAA,CACd,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,GAAS,KAAA;AAAA;;;UCLhB,QAAA;ETHM;;;;;;;;;;;ESerB,QAAA,GAAW,OAAA,EAAS,QAAA,EAAU,gBAAA,IAAoB,OAAA,EAAS,MAAA,eAAqB,KAAA,GAAQ,KAAA,cAAmB,OAAA,CAAQ,MAAA;EAGnH,UAAA,GAAa,WAAA,aAAwB,OAAA;IAAU,WAAA;IAAqB,QAAA;EAAA;AAAA;;;UChBrD,iBAAA;EACf,aAAA;EACA,eAAA,EAAiB,eAAA;EACjB,WAAA,EAAa,WAAA;EACb,SAAA,EAAW,SAAA;AAAA;;;cCDA,aAAA,aAA2B,QAAA,YAAoB,MAAA,EAAQ,WAAA;EAClE,IAAA,EAAM,CAAA;EACN,aAAA,EAAe,CAAA;AAAA;mBA2BI,OAAA,EAAS,eAAA,CAAgB,CAAA,MAAO,CAAA;;;;;;;;MAhBjD,WAAA,GAAc,CAAA;MACd,QAAA,EAAU,CAAA;MACV,QAAA,EAAU,CAAA;MACV,UAAA,EAAY,CAAA;MACZ,SAAA,GAAY,CAAA;IAAA,MACV,CAAA;;;;2BAWwB,eAAA,CAAgB,CAAA,MAAO,CAAA;IAAA;EAAA;AAAA;;;cCxBxC,aAAA,GAAiB,UAAA;EAC5B,UAAA,EAAY,WAAA;EACZ,iBAAA,EAAmB,iBAAA;EACnB,eAAA,IAAmB,OAAA,EAAS,cAAA;AAAA,MAC1B,QAAA;;;cCdS,KAAA,SAAe,IAAA,EAAM,MAAA,SAAe,CAAA,QAAO,CAAA;AAAA,cAG3C,UAAA"}
package/dist/index.d.mts CHANGED
@@ -13,22 +13,33 @@ interface IEvent<Payloads extends Record<string, unknown> = {}, Metadata extends
13
13
  //#endregion
14
14
  //#region src/core/ICommand.d.ts
15
15
  interface ICommand<E extends IEvent = IEvent, Payloads = E["payloads"], Metadata = E["_metadata"]> {
16
- _id: string;
17
16
  name: string;
18
17
  aggregateID: string;
19
18
  aggregateType: string;
20
19
  payloads: Payloads;
21
20
  _version: number;
22
- _createdAt: Date;
23
21
  _createdBy: string;
24
22
  _metadata: Metadata;
25
23
  }
26
24
  //#endregion
25
+ //#region src/core/IManagedCommand.d.ts
26
+ interface IManagedCommand<C extends ICommand> {
27
+ _id: string;
28
+ name: string;
29
+ aggregateID: string;
30
+ aggregateType: string;
31
+ payloads: C["payloads"];
32
+ _version: number;
33
+ _createdAt: Date;
34
+ _createdBy: string;
35
+ _metadata: C["_metadata"];
36
+ }
37
+ //#endregion
27
38
  //#region src/core/ICommandHandler.d.ts
28
39
  interface ICommandHandler<Command extends ICommand = ICommand, Event extends IEvent = IEvent> {
29
40
  name: string;
30
41
  aggregateType: string;
31
- transform: (command: Command) => Event;
42
+ transform: (command: IManagedCommand<Command>) => Event;
32
43
  }
33
44
  //#endregion
34
45
  //#region src/core/IEventStore.d.ts
@@ -91,9 +102,9 @@ interface IService {
91
102
  * 4. Project: Update the State Store (Read Models) via Projections.
92
103
  * 5. React: Trigger side-effects (e.g., emails, external APIs) via Reactions.
93
104
  * * @param command - The ICommand object representing the intent.
94
- * @param afterHandler - Optional callback executed after the state is synchronized.
105
+ * @param afterProjections - Optional callback executed after the state is synchronized.
95
106
  */
96
- dispatch: (command: ICommand, afterHandler?: (results: Record<string, any>, error?: Error) => void) => Promise<IEvent<any>>;
107
+ dispatch: (command: ICommand, afterProjections?: (results: Record<string, any>, error?: Error) => void) => Promise<IEvent<any>>;
97
108
  getVersion: (aggregateID: string) => Promise<{
98
109
  aggregateID: string;
99
110
  _version: number;
@@ -110,10 +121,10 @@ interface IServiceContainer {
110
121
  //#endregion
111
122
  //#region src/defineCommand.d.ts
112
123
  declare const defineCommand: <C extends ICommand, E extends IEvent>(definitions: {
113
- name: string;
114
- aggregateType: string;
124
+ name: C["name"];
125
+ aggregateType: C["aggregateType"];
115
126
  }) => {
116
- transform: (fn: (command: C) => E) => {
127
+ transform: (fn: (command: IManagedCommand<C>) => E) => {
117
128
  action: ({
118
129
  aggregateID,
119
130
  payloads,
@@ -121,16 +132,16 @@ declare const defineCommand: <C extends ICommand, E extends IEvent>(definitions:
121
132
  _createdBy,
122
133
  _metadata
123
134
  }: {
124
- aggregateID?: string;
135
+ aggregateID?: C["aggregateID"];
125
136
  payloads: C["payloads"];
126
137
  _version: C["_version"];
127
138
  _createdBy: C["_createdBy"];
128
139
  _metadata?: C["_metadata"];
129
140
  }) => C;
130
141
  handler: {
131
- name: string;
132
- aggregateType: string;
133
- transform: (command: C) => E;
142
+ name: C["name"];
143
+ aggregateType: C["aggregateType"];
144
+ transform: (command: IManagedCommand<C>) => E;
134
145
  };
135
146
  };
136
147
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/IEvent.ts","../src/core/ICommand.ts","../src/core/ICommandHandler.ts","../src/core/IEventStore.ts","../src/core/IProjection.ts","../src/core/IReaction.ts","../src/core/IReactionError.ts","../src/core/IReducer.ts","../src/core/IService.ts","../src/core/IServiceContainer.ts","../src/defineCommand.ts","../src/createService.ts","../src/util.ts"],"mappings":";UAEiB,MAAA,kBAAwB,MAAA,yCAA+C,MAAA;EACtF,GAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,QAAA;EACV,QAAA;EACA,UAAA,EAAY,IAAA;EACZ,UAAA;EACA,SAAA,EAAW,QAAA;AAAA;;;UCPI,QAAA,WAAmB,MAAA,GAAS,MAAA,aAAmB,CAAA,yBAA0B,CAAA;EACxF,GAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,QAAA;EACV,QAAA;EACA,UAAA,EAAY,IAAA;EACZ,UAAA;EACA,SAAA,EAAW,QAAA;AAAA;;;UCVI,eAAA,iBAAgC,QAAA,GAAW,QAAA,gBAAwB,MAAA,GAAS,MAAA;EAC3F,IAAA;EACA,aAAA;EACA,SAAA,GAAY,OAAA,EAAS,OAAA,KAAY,KAAA;AAAA;;;UCFlB,WAAA;EACf,MAAA,GAAS,KAAA,EAAO,MAAA,KAAW,OAAA;EAC3B,UAAA,GAAa,WAAA,aAAwB,OAAA;AAAA;;;AHJvC;;;;;AAAA,UIOiB,WAAA,eAA0B,MAAA,GAAS,MAAA;EAClD,IAAA;EACA,aAAA;EACA,SAAA;EACA,OAAA,GAAU,KAAA,EAAO,KAAA,KAAU,OAAA;AAAA;;;AJX7B;;;;;AAAA,UKKiB,SAAA,eAAwB,MAAA,GAAS,MAAA;EAChD,IAAA;EACA,aAAA;EACA,EAAA,GAAK,KAAA,EAAO,KAAA,KAAU,OAAA;AAAA;;;UCVP,cAAA;EACf,YAAA;EACA,SAAA;EACA,OAAA;EACA,KAAA,EAAO,KAAA;AAAA;;;ANFT;;;;;AAAA,UOOiB,QAAA;EAAA,CACd,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,GAAS,KAAA;AAAA;;;UCLhB,QAAA;ERHM;;;;;;;;;;;EQerB,QAAA,GAAW,OAAA,EAAS,QAAA,EAAU,YAAA,IAAgB,OAAA,EAAS,MAAA,eAAqB,KAAA,GAAQ,KAAA,cAAmB,OAAA,CAAQ,MAAA;EAG/G,UAAA,GAAa,WAAA,aAAwB,OAAA;IAAU,WAAA;IAAqB,QAAA;EAAA;AAAA;;;UChBrD,iBAAA;EACf,aAAA;EACA,eAAA,EAAiB,eAAA;EACjB,WAAA,EAAa,WAAA;EACb,SAAA,EAAW,SAAA;AAAA;;;cCFA,aAAA,aAA2B,QAAA,YAAoB,MAAA,EAAQ,WAAA;EAClE,IAAA;EACA,aAAA;AAAA;mBA6BmB,OAAA,EAAS,CAAA,KAAM,CAAA;;;;;;;;MAlBhC,WAAA;MACA,QAAA,EAAU,CAAA;MACV,QAAA,EAAU,CAAA;MACV,UAAA,EAAY,CAAA;MACZ,SAAA,GAAY,CAAA;IAAA,MACV,CAAA;;;;2BAawB,CAAA,KAAM,CAAA;IAAA;EAAA;AAAA;;;cC1BvB,aAAA,GAAiB,UAAA;EAC5B,UAAA,EAAY,WAAA;EACZ,iBAAA,EAAmB,iBAAA;EACnB,eAAA,IAAmB,OAAA,EAAS,cAAA;AAAA,MAC1B,QAAA;;;cCbS,KAAA,SAAe,IAAA,EAAM,MAAA,SAAe,CAAA,QAAO,CAAA;AAAA,cAG3C,UAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/core/IEvent.ts","../src/core/ICommand.ts","../src/core/IManagedCommand.ts","../src/core/ICommandHandler.ts","../src/core/IEventStore.ts","../src/core/IProjection.ts","../src/core/IReaction.ts","../src/core/IReactionError.ts","../src/core/IReducer.ts","../src/core/IService.ts","../src/core/IServiceContainer.ts","../src/defineCommand.ts","../src/createService.ts","../src/util.ts"],"mappings":";UAEiB,MAAA,kBAAwB,MAAA,yCAA+C,MAAA;EACtF,GAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,QAAA;EACV,QAAA;EACA,UAAA,EAAY,IAAA;EACZ,UAAA;EACA,SAAA,EAAW,QAAA;AAAA;;;UCPI,QAAA,WAAmB,MAAA,GAAS,MAAA,aAAmB,CAAA,yBAA0B,CAAA;EACxF,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,QAAA;EACV,QAAA;EACA,UAAA;EACA,SAAA,EAAW,QAAA;AAAA;;;UCPI,eAAA,WAA0B,QAAA;EACzC,GAAA;EACA,IAAA;EACA,WAAA;EACA,aAAA;EACA,QAAA,EAAU,CAAA;EACV,QAAA;EACA,UAAA,EAAY,IAAA;EACZ,UAAA;EACA,SAAA,EAAW,CAAA;AAAA;;;UCTI,eAAA,iBAAgC,QAAA,GAAW,QAAA,gBAAwB,MAAA,GAAS,MAAA;EAC3F,IAAA;EACA,aAAA;EACA,SAAA,GAAY,OAAA,EAAS,eAAA,CAAgB,OAAA,MAAa,KAAA;AAAA;;;UCHnC,WAAA;EACf,MAAA,GAAS,KAAA,EAAO,MAAA,KAAW,OAAA;EAC3B,UAAA,GAAa,WAAA,aAAwB,OAAA;AAAA;;;AJJvC;;;;;AAAA,UKOiB,WAAA,eAA0B,MAAA,GAAS,MAAA;EAClD,IAAA;EACA,aAAA;EACA,SAAA;EACA,OAAA,GAAU,KAAA,EAAO,KAAA,KAAU,OAAA;AAAA;;;ALX7B;;;;;AAAA,UMKiB,SAAA,eAAwB,MAAA,GAAS,MAAA;EAChD,IAAA;EACA,aAAA;EACA,EAAA,GAAK,KAAA,EAAO,KAAA,KAAU,OAAA;AAAA;;;UCVP,cAAA;EACf,YAAA;EACA,SAAA;EACA,OAAA;EACA,KAAA,EAAO,KAAK;AAAA;;;APFd;;;;;AAAA,UQOiB,QAAA;EAAA,CACd,KAAA,EAAO,KAAA,EAAO,KAAA,EAAO,MAAA,GAAS,KAAA;AAAA;;;UCLhB,QAAA;ETHM;;;;;;;;;;;ESerB,QAAA,GAAW,OAAA,EAAS,QAAA,EAAU,gBAAA,IAAoB,OAAA,EAAS,MAAA,eAAqB,KAAA,GAAQ,KAAA,cAAmB,OAAA,CAAQ,MAAA;EAGnH,UAAA,GAAa,WAAA,aAAwB,OAAA;IAAU,WAAA;IAAqB,QAAA;EAAA;AAAA;;;UChBrD,iBAAA;EACf,aAAA;EACA,eAAA,EAAiB,eAAA;EACjB,WAAA,EAAa,WAAA;EACb,SAAA,EAAW,SAAA;AAAA;;;cCDA,aAAA,aAA2B,QAAA,YAAoB,MAAA,EAAQ,WAAA;EAClE,IAAA,EAAM,CAAA;EACN,aAAA,EAAe,CAAA;AAAA;mBA2BI,OAAA,EAAS,eAAA,CAAgB,CAAA,MAAO,CAAA;;;;;;;;MAhBjD,WAAA,GAAc,CAAA;MACd,QAAA,EAAU,CAAA;MACV,QAAA,EAAU,CAAA;MACV,UAAA,EAAY,CAAA;MACZ,SAAA,GAAY,CAAA;IAAA,MACV,CAAA;;;;2BAWwB,eAAA,CAAgB,CAAA,MAAO,CAAA;IAAA;EAAA;AAAA;;;cCxBxC,aAAA,GAAiB,UAAA;EAC5B,UAAA,EAAY,WAAA;EACZ,iBAAA,EAAmB,iBAAA;EACnB,eAAA,IAAmB,OAAA,EAAS,cAAA;AAAA,MAC1B,QAAA;;;cCdS,KAAA,SAAe,IAAA,EAAM,MAAA,SAAe,CAAA,QAAO,CAAA;AAAA,cAG3C,UAAA"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import{uuidv7 as e}from"uuidv7";const t=t=>{let{name:n,aggregateType:r}=t,i=({aggregateID:t,payloads:i,_version:a,_createdBy:o,_metadata:s})=>({_id:e(),name:n,aggregateID:t??e(),aggregateType:r,payloads:i,_version:a,_createdAt:new Date,_createdBy:o,_metadata:s??{}});return{transform:e=>({action:i,handler:{name:n,aggregateType:r,transform:e}})}},n=e=>{let t={};return e.forEach(e=>{let{aggregateType:n,name:r}=e;t[n]||(t[n]={}),t[n][r]||(t[n][r]=[]),t[n][r].push(e)}),{resolve:(e,n)=>t[e]?.[n]||[]}},r=e=>{let t={};return e.forEach(e=>{if(t[e.aggregateType]||(t[e.aggregateType]={}),t[e.aggregateType][e.name])throw Error(`Duplicate command handler for ${e.aggregateType} and ${e.name}`);t[e.aggregateType][e.name]=e}),{transform:e=>{let n=t[e.aggregateType]?.[e.name];if(!n)throw Error(`No command handler found for ${e.aggregateType} and ${e.name}`);return n.transform(e)}}},i=e=>{let{EventStore:t,ServiceContainers:i,onReactionError:a}=e,o=i.flatMap(e=>e.CommandHandlers),s=i.flatMap(e=>e.Projections),c=i.flatMap(e=>e.Reactions),l=n(s),u=n(c),d=r(o);return{dispatch:async(e,n)=>{try{let r={},i=d.transform(e);await t.append(i);let o=l.resolve(i.aggregateType,i.name);return await Promise.all(o.map(async e=>{r[e.stateType]=await e.project(i)})),u.resolve(i.aggregateType,i.name).forEach(e=>{e.on(i).catch(t=>{let n=t instanceof Error?t:Error(String(t));a&&a({reactionName:e.name,eventName:i.name,eventID:i._id,error:n})})}),n?.(r,void 0),i}catch(e){let t=e instanceof Error?e:Error(String(e));throw n?.({},t),t}},async getVersion(e){return{aggregateID:e,_version:await t.getVersion(e)}}}},a=(...e)=>e.flatMap(e=>Object.values(e)),o=()=>e();export{i as createService,t as defineCommand,o as generateID,a as remap};
1
+ import{uuidv7 as e}from"uuidv7";const t=t=>{let{name:n,aggregateType:r}=t,i=({aggregateID:t,payloads:i,_version:a,_createdBy:o,_metadata:s})=>({name:n,aggregateID:t??e(),aggregateType:r,payloads:i,_version:a,_createdBy:o,_metadata:s??{}});return{transform:e=>({action:i,handler:{name:n,aggregateType:r,transform:e}})}},n=e=>{let t={};return e.forEach(e=>{let{aggregateType:n,name:r}=e;t[n]||(t[n]={}),t[n][r]||(t[n][r]=[]),t[n][r].push(e)}),{resolve:(e,n)=>t[e]?.[n]||[]}},r=e=>{let t={};return e.forEach(e=>{if(t[e.aggregateType]||(t[e.aggregateType]={}),t[e.aggregateType][e.name])throw Error(`Duplicate command handler for ${e.aggregateType} and ${e.name}`);t[e.aggregateType][e.name]=e}),{transform:e=>{let n=t[e.aggregateType]?.[e.name];if(!n)throw Error(`No command handler found for ${e.aggregateType} and ${e.name}`);return n.transform(e)}}},i=t=>({...t,_id:e(),_createdAt:new Date}),a=e=>{let{EventStore:t,ServiceContainers:a,onReactionError:o}=e,s=a.flatMap(e=>e.CommandHandlers),c=a.flatMap(e=>e.Projections),l=a.flatMap(e=>e.Reactions),u=n(c),d=n(l),f=r(s);return{dispatch:async(e,n)=>{try{let r={},a=f.transform(i(e));await t.append(a);let s=u.resolve(a.aggregateType,a.name);return await Promise.all(s.map(async e=>{r[e.stateType]=await e.project(a)})),d.resolve(a.aggregateType,a.name).forEach(e=>{e.on(a).catch(t=>{let n=t instanceof Error?t:Error(String(t));o&&o({reactionName:e.name,eventName:a.name,eventID:a._id,error:n})})}),n?.(r,void 0),a}catch(e){let t=e instanceof Error?e:Error(String(e));throw n?.({},t),t}},async getVersion(e){return{aggregateID:e,_version:await t.getVersion(e)}}}},o=(...e)=>e.flatMap(e=>Object.values(e)),s=()=>e();export{a as createService,t as defineCommand,s as generateID,o as remap};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/defineCommand.ts","../src/common/composeMapper.ts","../src/common/composeCommandHandlers.ts","../src/createService.ts","../src/util.ts"],"sourcesContent":["// src/defineCommand.ts\r\n\r\nimport { uuidv7 } from \"uuidv7\";\r\nimport { ICommand } from \"./core/ICommand\";\r\nimport { IEvent } from \"./core/IEvent\";\r\n\r\nexport const defineCommand = <C extends ICommand, E extends IEvent>(definitions: {\r\n name: string;\r\n aggregateType: string;\r\n}) => {\r\n const { name, aggregateType } = definitions;\r\n\r\n const action = ({\r\n aggregateID,\r\n payloads,\r\n _version,\r\n _createdBy,\r\n _metadata,\r\n }: {\r\n aggregateID?: string;\r\n payloads: C[\"payloads\"];\r\n _version: C[\"_version\"];\r\n _createdBy: C[\"_createdBy\"];\r\n _metadata?: C[\"_metadata\"];\r\n }): C => ({\r\n _id: uuidv7(),\r\n name,\r\n aggregateID: aggregateID ?? uuidv7(),\r\n aggregateType,\r\n payloads,\r\n _version,\r\n _createdAt: new Date(),\r\n _createdBy,\r\n _metadata: _metadata ?? ({} as C[\"_metadata\"]),\r\n } as unknown as C);\r\n\r\n return {\r\n transform: (fn: (command: C) => E) => ({\r\n action,\r\n handler: {\r\n name,\r\n aggregateType,\r\n transform: fn,\r\n },\r\n })\r\n };\r\n};\r\n","// src/common/composeMapper.ts\r\n\r\n// A generic utility to compose Mappers for Projections and Reactions based on aggregateType and name\r\nexport const composeMapper = <T extends { aggregateType: string; name: string; }>(components: T[]): {\r\n resolve: (aggregateType: string, name: string) => T[];\r\n} => {\r\n const Registry = {} as Record<string, Record<string, T[]>>;\r\n\r\n components.forEach((component) => {\r\n const { aggregateType, name } = component;\r\n if (!Registry[aggregateType]) {\r\n Registry[aggregateType] = {};\r\n }\r\n\r\n if (!Registry[aggregateType][name]) {\r\n Registry[aggregateType][name] = [];\r\n }\r\n\r\n Registry[aggregateType][name].push(component);\r\n });\r\n\r\n return {\r\n // Resolve returns an array of components matching the aggregateType and name, or an empty array if none found\r\n resolve: (aggregateType: string, name: string): T[] =>\r\n Registry[aggregateType]?.[name] || [],\r\n };\r\n};\r\n","// src/common/composeCommandHandlers.ts\r\n\r\nimport { ICommand } from \"../core/ICommand\";\r\nimport { ICommandHandler } from \"../core/ICommandHandler\";\r\n\r\nexport const composeCommandHandlers = (handlers: ICommandHandler[]) => {\r\n const Registry = {} as Record<string, Record<string, ICommandHandler>>;\r\n\r\n handlers.forEach(handler => {\r\n if (!Registry[handler.aggregateType]) {\r\n Registry[handler.aggregateType] = {};\r\n }\r\n\r\n if (Registry[handler.aggregateType][handler.name]) {\r\n throw new Error(`Duplicate command handler for ${handler.aggregateType} and ${handler.name}`);\r\n }\r\n\r\n Registry[handler.aggregateType][handler.name] = handler;\r\n });\r\n\r\n return {\r\n transform: (command: ICommand) => {\r\n const handler = Registry[command.aggregateType]?.[command.name];\r\n\r\n if (!handler) {\r\n throw new Error(`No command handler found for ${command.aggregateType} and ${command.name}`);\r\n }\r\n\r\n return handler.transform(command);\r\n },\r\n };\r\n};\r\n","// src/createService.ts\r\n\r\nimport { composeMapper } from \"./common/composeMapper\";\r\nimport { composeCommandHandlers } from \"./common/composeCommandHandlers\";\r\nimport { IEventStore } from \"./core/IEventStore\";\r\nimport { IProjection } from \"./core/IProjection\";\r\nimport { IReaction } from \"./core/IReaction\";\r\nimport { IReactionError } from \"./core/IReactionError\";\r\nimport { IService } from \"./core/IService\";\r\nimport { IServiceContainer } from \"./core/IServiceContainer\";\r\n\r\nexport const createService = (definition: {\r\n EventStore: IEventStore;\r\n ServiceContainers: IServiceContainer[];\r\n onReactionError?: (context: IReactionError) => void;\r\n}): IService => {\r\n const { EventStore, ServiceContainers, onReactionError } = definition;\r\n\r\n // Flatten command handlers, projections, and reactions from each container\r\n const CommandHandlers = ServiceContainers.flatMap((c) => c.CommandHandlers);\r\n const Projections = ServiceContainers.flatMap((c) => c.Projections);\r\n const Reactions = ServiceContainers.flatMap((c) => c.Reactions);\r\n\r\n // Initialize Mappers\r\n const _ProjectionMapper = composeMapper<IProjection>(Projections);\r\n const _ReactionMapper = composeMapper<IReaction>(Reactions);\r\n const _CommandHandler = composeCommandHandlers(CommandHandlers);\r\n\r\n const service: IService = {\r\n dispatch: async (command, afterHandler) => {\r\n try {\r\n const results: Record<string, any> = {};\r\n\r\n const event = _CommandHandler.transform(command);\r\n await EventStore.append(event);\r\n\r\n const projections = _ProjectionMapper.resolve(event.aggregateType, event.name);\r\n await Promise.all(\r\n projections.map(async (p) => {\r\n results[p.stateType] = await p.project(event);\r\n })\r\n );\r\n\r\n const reactions = _ReactionMapper.resolve(event.aggregateType, event.name);\r\n reactions.forEach((r) => {\r\n r.on(event).catch((error) => {\r\n const wrappedError = error instanceof Error ? error : new Error(String(error));\r\n if (onReactionError) {\r\n onReactionError({\r\n reactionName: r.name,\r\n eventName: event.name,\r\n eventID: event._id,\r\n error: wrappedError,\r\n });\r\n }\r\n });\r\n });\r\n\r\n afterHandler?.(results, undefined);\r\n return event;\r\n } catch (error) {\r\n const wrappedError = error instanceof Error ? error : new Error(String(error));\r\n afterHandler?.({}, wrappedError);\r\n throw wrappedError;\r\n }\r\n },\r\n async getVersion(aggregateID) {\r\n const version = await EventStore.getVersion(aggregateID);\r\n return { aggregateID, _version: version };\r\n }\r\n };\r\n\r\n return service;\r\n};\r\n","import { uuidv7 } from \"uuidv7\";\r\n\r\nexport const remap = <T>(...objs: Record<string, T>[]): T[] =>\r\n objs.flatMap(obj => Object.values(obj));\r\n\r\nexport const generateID = (): string => uuidv7();\r\n"],"mappings":"gCAMA,MAAa,EAAuD,GAG9D,CACJ,GAAM,CAAE,OAAM,iBAAkB,EAE1B,GAAU,CACd,cACA,WACA,WACA,aACA,gBAOQ,CACR,IAAK,GAAQ,CACb,OACA,YAAa,GAAe,GAAQ,CACpC,gBACA,WACA,WACA,WAAY,IAAI,KAChB,aACA,UAAW,GAAc,EAAE,CAC5B,EAED,MAAO,CACL,UAAY,IAA2B,CACrC,SACA,QAAS,CACP,OACA,gBACA,UAAW,EACZ,CACF,EACF,EC1CU,EAAqE,GAE7E,CACH,IAAM,EAAW,EAAE,CAenB,OAbA,EAAW,QAAS,GAAc,CAChC,GAAM,CAAE,gBAAe,QAAS,EAC3B,EAAS,KACZ,EAAS,GAAiB,EAAE,EAGzB,EAAS,GAAe,KAC3B,EAAS,GAAe,GAAQ,EAAE,EAGpC,EAAS,GAAe,GAAM,KAAK,EAAU,EAC7C,CAEK,CAEL,SAAU,EAAuB,IAC/B,EAAS,KAAiB,IAAS,EAAE,CACxC,ECpBU,EAA0B,GAAgC,CACrE,IAAM,EAAW,EAAE,CAcnB,OAZA,EAAS,QAAQ,GAAW,CAK1B,GAJK,EAAS,EAAQ,iBACpB,EAAS,EAAQ,eAAiB,EAAE,EAGlC,EAAS,EAAQ,eAAe,EAAQ,MAC1C,MAAU,MAAM,iCAAiC,EAAQ,cAAc,OAAO,EAAQ,OAAO,CAG/F,EAAS,EAAQ,eAAe,EAAQ,MAAQ,GAChD,CAEK,CACL,UAAY,GAAsB,CAChC,IAAM,EAAU,EAAS,EAAQ,iBAAiB,EAAQ,MAE1D,GAAI,CAAC,EACH,MAAU,MAAM,gCAAgC,EAAQ,cAAc,OAAO,EAAQ,OAAO,CAG9F,OAAO,EAAQ,UAAU,EAAQ,EAEpC,ECnBU,EAAiB,GAId,CACd,GAAM,CAAE,aAAY,oBAAmB,mBAAoB,EAGrD,EAAkB,EAAkB,QAAS,GAAM,EAAE,gBAAgB,CACrE,EAAc,EAAkB,QAAS,GAAM,EAAE,YAAY,CAC7D,EAAY,EAAkB,QAAS,GAAM,EAAE,UAAU,CAGzD,EAAoB,EAA2B,EAAY,CAC3D,EAAkB,EAAyB,EAAU,CACrD,EAAkB,EAAuB,EAAgB,CA8C/D,MAAO,CA3CL,SAAU,MAAO,EAAS,IAAiB,CACzC,GAAI,CACF,IAAM,EAA+B,EAAE,CAEjC,EAAQ,EAAgB,UAAU,EAAQ,CAChD,MAAM,EAAW,OAAO,EAAM,CAE9B,IAAM,EAAc,EAAkB,QAAQ,EAAM,cAAe,EAAM,KAAK,CAuB9E,OAtBA,MAAM,QAAQ,IACZ,EAAY,IAAI,KAAO,IAAM,CAC3B,EAAQ,EAAE,WAAa,MAAM,EAAE,QAAQ,EAAM,EAC7C,CACH,CAEiB,EAAgB,QAAQ,EAAM,cAAe,EAAM,KAC5D,CAAC,QAAS,GAAM,CACvB,EAAE,GAAG,EAAM,CAAC,MAAO,GAAU,CAC3B,IAAM,EAAe,aAAiB,MAAQ,EAAY,MAAM,OAAO,EAAM,CAAC,CAC1E,GACF,EAAgB,CACd,aAAc,EAAE,KAChB,UAAW,EAAM,KACjB,QAAS,EAAM,IACf,MAAO,EACR,CAAC,EAEJ,EACF,CAEF,IAAe,EAAS,IAAA,GAAU,CAC3B,QACA,EAAO,CACd,IAAM,EAAe,aAAiB,MAAQ,EAAY,MAAM,OAAO,EAAM,CAAC,CAE9E,MADA,IAAe,EAAE,CAAE,EAAa,CAC1B,IAGV,MAAM,WAAW,EAAa,CAE5B,MAAO,CAAE,cAAa,SAAU,MADV,EAAW,WAAW,EAAY,CACf,EAI/B,ECtEH,GAAY,GAAG,IAC1B,EAAK,QAAQ,GAAO,OAAO,OAAO,EAAI,CAAC,CAE5B,MAA2B,GAAQ"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/defineCommand.ts","../src/common/composeMapper.ts","../src/common/composeCommandHandlers.ts","../src/common/toManagedCommand.ts","../src/createService.ts","../src/util.ts"],"sourcesContent":["// src/defineCommand.ts\r\n\r\nimport { uuidv7 } from \"uuidv7\";\r\nimport { ICommand } from \"./core/ICommand\";\r\nimport { IEvent } from \"./core/IEvent\";\r\nimport { IManagedCommand } from \"./core/IManagedCommand\";\r\n\r\nexport const defineCommand = <C extends ICommand, E extends IEvent>(definitions: {\r\n name: C[\"name\"];\r\n aggregateType: C[\"aggregateType\"];\r\n}) => {\r\n const { name, aggregateType } = definitions;\r\n\r\n const action = ({\r\n aggregateID,\r\n payloads,\r\n _version,\r\n _createdBy,\r\n _metadata,\r\n }: {\r\n aggregateID?: C[\"aggregateID\"];\r\n payloads: C[\"payloads\"];\r\n _version: C[\"_version\"];\r\n _createdBy: C[\"_createdBy\"];\r\n _metadata?: C[\"_metadata\"];\r\n }): C => ({\r\n name,\r\n aggregateID: aggregateID ?? uuidv7(),\r\n aggregateType,\r\n payloads,\r\n _version,\r\n _createdBy,\r\n _metadata: _metadata ?? ({} as C[\"_metadata\"]),\r\n } as C);\r\n\r\n return {\r\n transform: (fn: (command: IManagedCommand<C>) => E) => ({\r\n action,\r\n handler: {\r\n name,\r\n aggregateType,\r\n transform: fn,\r\n },\r\n })\r\n };\r\n};\r\n","// src/common/composeMapper.ts\r\n\r\n// A generic utility to compose Mappers for Projections and Reactions based on aggregateType and name\r\nexport const composeMapper = <T extends { aggregateType: string; name: string; }>(components: T[]): {\r\n resolve: (aggregateType: string, name: string) => T[];\r\n} => {\r\n const Registry = {} as Record<string, Record<string, T[]>>;\r\n\r\n components.forEach((component) => {\r\n const { aggregateType, name } = component;\r\n if (!Registry[aggregateType]) {\r\n Registry[aggregateType] = {};\r\n }\r\n\r\n if (!Registry[aggregateType][name]) {\r\n Registry[aggregateType][name] = [];\r\n }\r\n\r\n Registry[aggregateType][name].push(component);\r\n });\r\n\r\n return {\r\n // Resolve returns an array of components matching the aggregateType and name, or an empty array if none found\r\n resolve: (aggregateType: string, name: string): T[] =>\r\n Registry[aggregateType]?.[name] || [],\r\n };\r\n};\r\n","// src/common/composeCommandHandlers.ts\r\n\r\nimport { ICommand } from \"../core/ICommand\";\r\nimport { ICommandHandler } from \"../core/ICommandHandler\";\r\nimport { IManagedCommand } from \"../core/IManagedCommand\";\r\n\r\nexport const composeCommandHandlers = (handlers: ICommandHandler[]) => {\r\n const Registry = {} as Record<string, Record<string, ICommandHandler>>;\r\n\r\n handlers.forEach(handler => {\r\n if (!Registry[handler.aggregateType]) {\r\n Registry[handler.aggregateType] = {};\r\n }\r\n\r\n if (Registry[handler.aggregateType][handler.name]) {\r\n throw new Error(`Duplicate command handler for ${handler.aggregateType} and ${handler.name}`);\r\n }\r\n\r\n Registry[handler.aggregateType][handler.name] = handler;\r\n });\r\n\r\n return {\r\n transform: (command: IManagedCommand<ICommand>) => {\r\n const handler = Registry[command.aggregateType]?.[command.name];\r\n\r\n if (!handler) {\r\n throw new Error(`No command handler found for ${command.aggregateType} and ${command.name}`);\r\n }\r\n\r\n return handler.transform(command);\r\n },\r\n };\r\n};\r\n","import { uuidv7 } from \"uuidv7\";\r\nimport { ICommand } from \"../core/ICommand\";\r\nimport { IManagedCommand } from \"../core/IManagedCommand\";\r\n\r\nexport const toManagedCommand = <C extends ICommand>(command: C): IManagedCommand<C> => ({\r\n ...command,\r\n _id: uuidv7(),\r\n _createdAt: new Date(),\r\n});\r\n","// src/createService.ts\r\n\r\nimport { composeMapper } from \"./common/composeMapper\";\r\nimport { composeCommandHandlers } from \"./common/composeCommandHandlers\";\r\nimport { IEventStore } from \"./core/IEventStore\";\r\nimport { IProjection } from \"./core/IProjection\";\r\nimport { IReaction } from \"./core/IReaction\";\r\nimport { IReactionError } from \"./core/IReactionError\";\r\nimport { IService } from \"./core/IService\";\r\nimport { IServiceContainer } from \"./core/IServiceContainer\";\r\nimport { toManagedCommand } from \"./common/toManagedCommand\";\r\n\r\nexport const createService = (definition: {\r\n EventStore: IEventStore;\r\n ServiceContainers: IServiceContainer[];\r\n onReactionError?: (context: IReactionError) => void;\r\n}): IService => {\r\n const { EventStore, ServiceContainers, onReactionError } = definition;\r\n\r\n // Flatten command handlers, projections, and reactions from each container\r\n const CommandHandlers = ServiceContainers.flatMap((c) => c.CommandHandlers);\r\n const Projections = ServiceContainers.flatMap((c) => c.Projections);\r\n const Reactions = ServiceContainers.flatMap((c) => c.Reactions);\r\n\r\n // Initialize Mappers\r\n const _ProjectionMapper = composeMapper<IProjection>(Projections);\r\n const _ReactionMapper = composeMapper<IReaction>(Reactions);\r\n const _CommandHandler = composeCommandHandlers(CommandHandlers);\r\n\r\n const service: IService = {\r\n dispatch: async (command, afterProjections) => {\r\n try {\r\n const results: Record<string, any> = {};\r\n\r\n const event = _CommandHandler.transform(toManagedCommand(command));\r\n await EventStore.append(event);\r\n\r\n const projections = _ProjectionMapper.resolve(event.aggregateType, event.name);\r\n await Promise.all(\r\n projections.map(async (p) => {\r\n results[p.stateType] = await p.project(event);\r\n })\r\n );\r\n\r\n const reactions = _ReactionMapper.resolve(event.aggregateType, event.name);\r\n reactions.forEach((r) => {\r\n r.on(event).catch((error) => {\r\n const wrappedError = error instanceof Error ? error : new Error(String(error));\r\n if (onReactionError) {\r\n onReactionError({\r\n reactionName: r.name,\r\n eventName: event.name,\r\n eventID: event._id,\r\n error: wrappedError,\r\n });\r\n }\r\n });\r\n });\r\n\r\n afterProjections?.(results, undefined);\r\n return event;\r\n } catch (error) {\r\n const wrappedError = error instanceof Error ? error : new Error(String(error));\r\n afterProjections?.({}, wrappedError);\r\n throw wrappedError;\r\n }\r\n },\r\n async getVersion(aggregateID) {\r\n const version = await EventStore.getVersion(aggregateID);\r\n return { aggregateID, _version: version };\r\n }\r\n };\r\n\r\n return service;\r\n};\r\n","import { uuidv7 } from \"uuidv7\";\r\n\r\nexport const remap = <T>(...objs: Record<string, T>[]): T[] =>\r\n objs.flatMap(obj => Object.values(obj));\r\n\r\nexport const generateID = (): string => uuidv7();\r\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atomservices",
3
- "version": "0.15.4",
3
+ "version": "0.15.5",
4
4
  "type": "module",
5
5
  "main": "./dist/index.cjs",
6
6
  "module": "./dist/index.mjs",
@@ -30,10 +30,10 @@
30
30
  "prepublishOnly": "npm run build"
31
31
  },
32
32
  "devDependencies": {
33
- "@types/node": "^25.6.0",
34
- "tsdown": "^0.21.10",
33
+ "@types/node": "^26.0.1",
34
+ "tsdown": "^0.22.3",
35
35
  "typescript": "^6.0.3",
36
- "vitest": "^4.1.5"
36
+ "vitest": "^4.1.9"
37
37
  },
38
38
  "dependencies": {
39
39
  "uuidv7": "^1.2.1"