@zudojs/cqrs 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +41 -0
- package/dist/command/command.core.d.ts +47 -0
- package/dist/command/command.core.d.ts.map +1 -0
- package/dist/command/command.core.js +58 -0
- package/dist/command/command.core.js.map +1 -0
- package/dist/command/commandBus.core.d.ts +91 -0
- package/dist/command/commandBus.core.d.ts.map +1 -0
- package/dist/command/commandBus.core.js +177 -0
- package/dist/command/commandBus.core.js.map +1 -0
- package/dist/command/commandHandler.core.d.ts +43 -0
- package/dist/command/commandHandler.core.d.ts.map +1 -0
- package/dist/command/commandHandler.core.js +57 -0
- package/dist/command/commandHandler.core.js.map +1 -0
- package/dist/command/commandResult.type.d.ts +57 -0
- package/dist/command/commandResult.type.d.ts.map +1 -0
- package/dist/command/commandResult.type.js +86 -0
- package/dist/command/commandResult.type.js.map +1 -0
- package/dist/command/index.d.ts +10 -0
- package/dist/command/index.d.ts.map +1 -0
- package/dist/command/index.js +10 -0
- package/dist/command/index.js.map +1 -0
- package/dist/cqrsContext/cqrsContext.core.d.ts +97 -0
- package/dist/cqrsContext/cqrsContext.core.d.ts.map +1 -0
- package/dist/cqrsContext/cqrsContext.core.js +171 -0
- package/dist/cqrsContext/cqrsContext.core.js.map +1 -0
- package/dist/cqrsContext/index.d.ts +7 -0
- package/dist/cqrsContext/index.d.ts.map +1 -0
- package/dist/cqrsContext/index.js +7 -0
- package/dist/cqrsContext/index.js.map +1 -0
- package/dist/cqrsDecorators/cqrsDecorators.core.d.ts +108 -0
- package/dist/cqrsDecorators/cqrsDecorators.core.d.ts.map +1 -0
- package/dist/cqrsDecorators/cqrsDecorators.core.js +181 -0
- package/dist/cqrsDecorators/cqrsDecorators.core.js.map +1 -0
- package/dist/cqrsDecorators/index.d.ts +7 -0
- package/dist/cqrsDecorators/index.d.ts.map +1 -0
- package/dist/cqrsDecorators/index.js +7 -0
- package/dist/cqrsDecorators/index.js.map +1 -0
- package/dist/cqrsErrors/cqrsError.base.d.ts +85 -0
- package/dist/cqrsErrors/cqrsError.base.d.ts.map +1 -0
- package/dist/cqrsErrors/cqrsError.base.js +221 -0
- package/dist/cqrsErrors/cqrsError.base.js.map +1 -0
- package/dist/cqrsErrors/index.d.ts +7 -0
- package/dist/cqrsErrors/index.d.ts.map +1 -0
- package/dist/cqrsErrors/index.js +7 -0
- package/dist/cqrsErrors/index.js.map +1 -0
- package/dist/cqrsEvents/cqrsEventBus.core.d.ts +9 -0
- package/dist/cqrsEvents/cqrsEventBus.core.d.ts.map +1 -0
- package/dist/cqrsEvents/cqrsEventBus.core.js +9 -0
- package/dist/cqrsEvents/cqrsEventBus.core.js.map +1 -0
- package/dist/cqrsEvents/cqrsEventResult.type.d.ts +81 -0
- package/dist/cqrsEvents/cqrsEventResult.type.d.ts.map +1 -0
- package/dist/cqrsEvents/cqrsEventResult.type.js +159 -0
- package/dist/cqrsEvents/cqrsEventResult.type.js.map +1 -0
- package/dist/cqrsEvents/cqrsEvents.type.d.ts +102 -0
- package/dist/cqrsEvents/cqrsEvents.type.d.ts.map +1 -0
- package/dist/cqrsEvents/cqrsEvents.type.js +103 -0
- package/dist/cqrsEvents/cqrsEvents.type.js.map +1 -0
- package/dist/cqrsEvents/index.d.ts +12 -0
- package/dist/cqrsEvents/index.d.ts.map +1 -0
- package/dist/cqrsEvents/index.js +12 -0
- package/dist/cqrsEvents/index.js.map +1 -0
- package/dist/cqrsMiddleware/cqrsMiddleware.core.d.ts +65 -0
- package/dist/cqrsMiddleware/cqrsMiddleware.core.d.ts.map +1 -0
- package/dist/cqrsMiddleware/cqrsMiddleware.core.js +185 -0
- package/dist/cqrsMiddleware/cqrsMiddleware.core.js.map +1 -0
- package/dist/cqrsMiddleware/index.d.ts +7 -0
- package/dist/cqrsMiddleware/index.d.ts.map +1 -0
- package/dist/cqrsMiddleware/index.js +7 -0
- package/dist/cqrsMiddleware/index.js.map +1 -0
- package/dist/cqrsTypes/cqrsTypes.type.d.ts +158 -0
- package/dist/cqrsTypes/cqrsTypes.type.d.ts.map +1 -0
- package/dist/cqrsTypes/cqrsTypes.type.js +34 -0
- package/dist/cqrsTypes/cqrsTypes.type.js.map +1 -0
- package/dist/cqrsTypes/index.d.ts +7 -0
- package/dist/cqrsTypes/index.d.ts.map +1 -0
- package/dist/cqrsTypes/index.js +7 -0
- package/dist/cqrsTypes/index.js.map +1 -0
- package/dist/handlerRegistry/handlerRegistry.core.d.ts +135 -0
- package/dist/handlerRegistry/handlerRegistry.core.d.ts.map +1 -0
- package/dist/handlerRegistry/handlerRegistry.core.js +209 -0
- package/dist/handlerRegistry/handlerRegistry.core.js.map +1 -0
- package/dist/handlerRegistry/index.d.ts +7 -0
- package/dist/handlerRegistry/index.d.ts.map +1 -0
- package/dist/handlerRegistry/index.js +7 -0
- package/dist/handlerRegistry/index.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/query/index.d.ts +10 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +10 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/query.core.d.ts +50 -0
- package/dist/query/query.core.d.ts.map +1 -0
- package/dist/query/query.core.js +61 -0
- package/dist/query/query.core.js.map +1 -0
- package/dist/query/queryBus.core.d.ts +91 -0
- package/dist/query/queryBus.core.d.ts.map +1 -0
- package/dist/query/queryBus.core.js +177 -0
- package/dist/query/queryBus.core.js.map +1 -0
- package/dist/query/queryHandler.core.d.ts +43 -0
- package/dist/query/queryHandler.core.d.ts.map +1 -0
- package/dist/query/queryHandler.core.js +57 -0
- package/dist/query/queryHandler.core.js.map +1 -0
- package/dist/query/queryResult.type.d.ts +56 -0
- package/dist/query/queryResult.type.d.ts.map +1 -0
- package/dist/query/queryResult.type.js +86 -0
- package/dist/query/queryResult.type.js.map +1 -0
- package/package.json +52 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { BaseError, ErrorCategory, ErrorCode, ErrorSeverity, } from "@zudojs/errors";
|
|
2
|
+
import { QueryHandler, executeQueryHandler, } from "../query/queryHandler.core.js";
|
|
3
|
+
/**
|
|
4
|
+
* Query bus implementation.
|
|
5
|
+
*
|
|
6
|
+
* The query bus resolves a handler by query type and executes it
|
|
7
|
+
* through the registered middleware pipeline.
|
|
8
|
+
*/
|
|
9
|
+
export class QueryBus {
|
|
10
|
+
handlers = new Map();
|
|
11
|
+
middleware;
|
|
12
|
+
contextFactory;
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
this.middleware = [...(options.middleware ?? [])];
|
|
15
|
+
this.contextFactory = options.contextFactory;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Registers a query handler.
|
|
19
|
+
*/
|
|
20
|
+
register(queryType, handler) {
|
|
21
|
+
if (!queryType.trim()) {
|
|
22
|
+
throw new TypeError("Query type cannot be empty.");
|
|
23
|
+
}
|
|
24
|
+
if (!handler) {
|
|
25
|
+
throw new TypeError(`A handler is required for query "${queryType}".`);
|
|
26
|
+
}
|
|
27
|
+
if (this.handlers.has(queryType)) {
|
|
28
|
+
throw new Error(`A handler is already registered for query "${queryType}".`);
|
|
29
|
+
}
|
|
30
|
+
this.handlers.set(queryType, handler);
|
|
31
|
+
return this;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Registers multiple query handlers.
|
|
35
|
+
*/
|
|
36
|
+
registerMany(registrations) {
|
|
37
|
+
for (const registration of registrations) {
|
|
38
|
+
this.register(registration.queryType, registration.handler);
|
|
39
|
+
}
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Replaces an existing query handler.
|
|
44
|
+
*/
|
|
45
|
+
replace(queryType, handler) {
|
|
46
|
+
if (!queryType.trim()) {
|
|
47
|
+
throw new TypeError("Query type cannot be empty.");
|
|
48
|
+
}
|
|
49
|
+
this.handlers.set(queryType, handler);
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Removes a query handler.
|
|
54
|
+
*/
|
|
55
|
+
unregister(queryType) {
|
|
56
|
+
return this.handlers.delete(queryType);
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Determines whether a query handler is registered.
|
|
60
|
+
*/
|
|
61
|
+
has(queryType) {
|
|
62
|
+
return this.handlers.has(queryType);
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns the registered handler for a query type.
|
|
66
|
+
*/
|
|
67
|
+
getHandler(queryType) {
|
|
68
|
+
return this.handlers.get(queryType);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Executes a query.
|
|
72
|
+
*/
|
|
73
|
+
async execute(query, context) {
|
|
74
|
+
this.validateQuery(query);
|
|
75
|
+
const handler = this.getHandler(query.type);
|
|
76
|
+
if (!handler) {
|
|
77
|
+
throw new BaseError(`No handler is registered for query "${query.type}".`, {
|
|
78
|
+
code: ErrorCode.QUERY_HANDLER_NOT_FOUND,
|
|
79
|
+
category: ErrorCategory.SYSTEM,
|
|
80
|
+
severity: ErrorSeverity.ERROR,
|
|
81
|
+
statusCode: 500,
|
|
82
|
+
expose: false,
|
|
83
|
+
isOperational: true,
|
|
84
|
+
metadata: {
|
|
85
|
+
queryType: query.type,
|
|
86
|
+
},
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const executionContext = await this.resolveContext(context);
|
|
90
|
+
const pipeline = this.buildPipeline(handler);
|
|
91
|
+
return pipeline(query, executionContext);
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Adds middleware to the end of the pipeline.
|
|
95
|
+
*/
|
|
96
|
+
use(middleware) {
|
|
97
|
+
if (typeof middleware !== "function") {
|
|
98
|
+
throw new TypeError("Query middleware must be a function.");
|
|
99
|
+
}
|
|
100
|
+
this.middleware.push(middleware);
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Returns the number of registered handlers.
|
|
105
|
+
*/
|
|
106
|
+
size() {
|
|
107
|
+
return this.handlers.size;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Removes all registered handlers.
|
|
111
|
+
*/
|
|
112
|
+
clear() {
|
|
113
|
+
this.handlers.clear();
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Returns all registered query types.
|
|
117
|
+
*/
|
|
118
|
+
getQueryTypes() {
|
|
119
|
+
return [...this.handlers.keys()];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Builds the query execution pipeline.
|
|
123
|
+
*/
|
|
124
|
+
buildPipeline(handler) {
|
|
125
|
+
let next = async (query, context) => executeQueryHandler(handler, query, context);
|
|
126
|
+
for (let index = this.middleware.length - 1; index >= 0; index--) {
|
|
127
|
+
const middleware = this.middleware[index];
|
|
128
|
+
const current = next;
|
|
129
|
+
next = async (query, context) => middleware(query, context, current);
|
|
130
|
+
}
|
|
131
|
+
return next;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Resolves the execution context.
|
|
135
|
+
*/
|
|
136
|
+
async resolveContext(context) {
|
|
137
|
+
if (context) {
|
|
138
|
+
return context;
|
|
139
|
+
}
|
|
140
|
+
if (this.contextFactory) {
|
|
141
|
+
return await this.contextFactory();
|
|
142
|
+
}
|
|
143
|
+
return {};
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Validates a query before execution.
|
|
147
|
+
*/
|
|
148
|
+
validateQuery(query) {
|
|
149
|
+
if (!query || typeof query !== "object") {
|
|
150
|
+
throw new BaseError("A valid query is required.", {
|
|
151
|
+
code: ErrorCode.INVALID_QUERY,
|
|
152
|
+
category: ErrorCategory.VALIDATION,
|
|
153
|
+
severity: ErrorSeverity.WARNING,
|
|
154
|
+
statusCode: 400,
|
|
155
|
+
expose: true,
|
|
156
|
+
isOperational: true,
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
if (typeof query.type !== "string" || query.type.trim().length === 0) {
|
|
160
|
+
throw new BaseError("Query type is required.", {
|
|
161
|
+
code: ErrorCode.INVALID_QUERY,
|
|
162
|
+
category: ErrorCategory.VALIDATION,
|
|
163
|
+
severity: ErrorSeverity.WARNING,
|
|
164
|
+
statusCode: 400,
|
|
165
|
+
expose: true,
|
|
166
|
+
isOperational: true,
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Creates a query bus.
|
|
173
|
+
*/
|
|
174
|
+
export function createQueryBus(options = {}) {
|
|
175
|
+
return new QueryBus(options);
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=queryBus.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryBus.core.js","sourceRoot":"","sources":["../../src/query/queryBus.core.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { QueryHandler as QueryHandlerContract, Query, CqrsContext } from "../cqrsTypes/cqrsTypes.type.js";
|
|
2
|
+
/**
|
|
3
|
+
* Abstract base class for query handlers.
|
|
4
|
+
*
|
|
5
|
+
* A query handler contains the application logic required to execute
|
|
6
|
+
* one specific query.
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class QueryHandler<TQuery extends Query = Query, TResult = unknown> implements QueryHandlerContract<TQuery, TResult> {
|
|
9
|
+
/**
|
|
10
|
+
* Query type handled by this handler.
|
|
11
|
+
*/
|
|
12
|
+
abstract readonly queryType: TQuery["type"];
|
|
13
|
+
/**
|
|
14
|
+
* Executes the query.
|
|
15
|
+
*/
|
|
16
|
+
abstract execute(query: TQuery, context?: CqrsContext): Promise<TResult> | TResult;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Function-based query handler implementation.
|
|
20
|
+
*/
|
|
21
|
+
export declare class FunctionQueryHandler<TQuery extends Query = Query, TResult = unknown> extends QueryHandler<TQuery, TResult> {
|
|
22
|
+
readonly queryType: TQuery["type"];
|
|
23
|
+
private readonly handler;
|
|
24
|
+
constructor(queryType: TQuery["type"], handler: (query: TQuery, context?: CqrsContext) => TResult | Promise<TResult>);
|
|
25
|
+
execute(query: TQuery, context?: CqrsContext): TResult | Promise<TResult>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Creates a function-based query handler.
|
|
29
|
+
*/
|
|
30
|
+
export declare function createQueryHandler<TQuery extends Query, TResult = unknown>(queryType: TQuery["type"], handler: (query: TQuery, context?: CqrsContext) => TResult | Promise<TResult>): FunctionQueryHandler<TQuery, TResult>;
|
|
31
|
+
/**
|
|
32
|
+
* Determines whether a value is a query handler instance.
|
|
33
|
+
*/
|
|
34
|
+
export declare function isQueryHandler(value: unknown): value is QueryHandler;
|
|
35
|
+
/**
|
|
36
|
+
* Determines whether a value can be used as a query handler.
|
|
37
|
+
*/
|
|
38
|
+
export declare function isQueryHandlerLike(value: unknown): value is QueryHandler | ((query: Query, context?: CqrsContext) => unknown);
|
|
39
|
+
/**
|
|
40
|
+
* Executes either an object-based or function-based query handler.
|
|
41
|
+
*/
|
|
42
|
+
export declare function executeQueryHandler<TQuery extends Query, TResult = unknown>(handler: QueryHandler<TQuery, TResult> | ((query: TQuery, context?: CqrsContext) => TResult | Promise<TResult>), query: TQuery, context?: CqrsContext): Promise<TResult>;
|
|
43
|
+
//# sourceMappingURL=queryHandler.core.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryHandler.core.d.ts","sourceRoot":"","sources":["../../src/query/queryHandler.core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,IAAI,oBAAoB,EACpC,KAAK,EACL,WAAW,EACZ,MAAM,gCAAgC,CAAC;AAExC;;;;;GAKG;AACH,8BAAsB,YAAY,CAChC,MAAM,SAAS,KAAK,GAAG,KAAK,EAC5B,OAAO,GAAG,OAAO,CACjB,YAAW,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC;IAChD;;OAEG;IACH,kBAAyB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAEnD;;OAEG;IACH,SAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;CAC/B;AAED;;GAEG;AACH,qBAAa,oBAAoB,CAC/B,MAAM,SAAS,KAAK,GAAG,KAAK,EAC5B,OAAO,GAAG,OAAO,CACjB,SAAQ,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC;IACrC,SAAgB,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IAE1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAGQ;IAEhC,YACE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EACzB,OAAO,EAAE,CACP,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,WAAW,KAClB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,EAWhC;IAEM,OAAO,CACZ,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAE5B;CACF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,SAAS,KAAK,EAAE,OAAO,GAAG,OAAO,EACxE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EACzB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAC5E,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAEvC;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAEpE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,OAAO,GACb,KAAK,IAAI,YAAY,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,CAE5E;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,SAAS,KAAK,EACpB,OAAO,GAAG,OAAO,EAEjB,OAAO,EACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,EAC1E,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,OAAO,CAAC,CAUlB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Abstract base class for query handlers.
|
|
3
|
+
*
|
|
4
|
+
* A query handler contains the application logic required to execute
|
|
5
|
+
* one specific query.
|
|
6
|
+
*/
|
|
7
|
+
export class QueryHandler {
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Function-based query handler implementation.
|
|
11
|
+
*/
|
|
12
|
+
export class FunctionQueryHandler extends QueryHandler {
|
|
13
|
+
queryType;
|
|
14
|
+
handler;
|
|
15
|
+
constructor(queryType, handler) {
|
|
16
|
+
super();
|
|
17
|
+
if (typeof handler !== "function") {
|
|
18
|
+
throw new TypeError("Query handler must be a function.");
|
|
19
|
+
}
|
|
20
|
+
this.queryType = queryType;
|
|
21
|
+
this.handler = handler;
|
|
22
|
+
}
|
|
23
|
+
execute(query, context) {
|
|
24
|
+
return this.handler(query, context);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Creates a function-based query handler.
|
|
29
|
+
*/
|
|
30
|
+
export function createQueryHandler(queryType, handler) {
|
|
31
|
+
return new FunctionQueryHandler(queryType, handler);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Determines whether a value is a query handler instance.
|
|
35
|
+
*/
|
|
36
|
+
export function isQueryHandler(value) {
|
|
37
|
+
return value instanceof QueryHandler;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Determines whether a value can be used as a query handler.
|
|
41
|
+
*/
|
|
42
|
+
export function isQueryHandlerLike(value) {
|
|
43
|
+
return value instanceof QueryHandler || typeof value === "function";
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Executes either an object-based or function-based query handler.
|
|
47
|
+
*/
|
|
48
|
+
export async function executeQueryHandler(handler, query, context) {
|
|
49
|
+
if (handler instanceof QueryHandler) {
|
|
50
|
+
return await handler.execute(query, context);
|
|
51
|
+
}
|
|
52
|
+
if (typeof handler === "function") {
|
|
53
|
+
return await handler(query, context);
|
|
54
|
+
}
|
|
55
|
+
throw new TypeError(`Invalid query handler for "${query.type}".`);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=queryHandler.core.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryHandler.core.js","sourceRoot":"","sources":["../../src/query/queryHandler.core.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,MAAM,OAAgB,YAAY;CAgBjC;AAED;;GAEG;AACH,MAAM,OAAO,oBAGX,SAAQ,YAA6B;IACrB,SAAS,CAAiB;IAEzB,OAAO,CAGQ;IAEhC,YACE,SAAyB,EACzB,OAG+B;QAE/B,KAAK,EAAE,CAAC;QAER,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;YAClC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAC3D,CAAC;QAED,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAE3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAEM,OAAO,CACZ,KAAa,EACb,OAAqB;QAErB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAyB,EACzB,OAA6E;IAE7E,OAAO,IAAI,oBAAoB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,KAAK,YAAY,YAAY,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAAc;IAEd,OAAO,KAAK,YAAY,YAAY,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAIvC,OAE0E,EAC1E,KAAa,EACb,OAAqB;IAErB,IAAI,OAAO,YAAY,YAAY,EAAE,CAAC;QACpC,OAAO,MAAM,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;QAClC,OAAO,MAAM,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,IAAI,SAAS,CAAC,8BAA8B,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Query } from "../cqrsTypes/cqrsTypes.type.js";
|
|
2
|
+
/**
|
|
3
|
+
* Status of a query execution.
|
|
4
|
+
*/
|
|
5
|
+
export type QueryResultStatus = "success" | "failure";
|
|
6
|
+
/**
|
|
7
|
+
* Result returned after query execution.
|
|
8
|
+
*
|
|
9
|
+
* The wrapper provides consistent execution metadata while preserving
|
|
10
|
+
* the actual value returned by the query handler.
|
|
11
|
+
*/
|
|
12
|
+
export interface QueryResult<TResult = unknown, TQuery extends Query = Query> {
|
|
13
|
+
readonly status: QueryResultStatus;
|
|
14
|
+
readonly result: TResult;
|
|
15
|
+
readonly queryType: TQuery["type"];
|
|
16
|
+
readonly executedAt: Date;
|
|
17
|
+
readonly durationMs?: number;
|
|
18
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Options for creating a query result.
|
|
22
|
+
*/
|
|
23
|
+
export interface CreateQueryResultOptions<TQuery extends Query = Query> {
|
|
24
|
+
readonly query: TQuery;
|
|
25
|
+
readonly executedAt?: Date;
|
|
26
|
+
readonly durationMs?: number;
|
|
27
|
+
readonly metadata?: Readonly<Record<string, unknown>>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Creates a successful query result.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createQueryResult<TResult, TQuery extends Query>(result: TResult, options: CreateQueryResultOptions<TQuery>): QueryResult<TResult, TQuery>;
|
|
33
|
+
/**
|
|
34
|
+
* Creates a failed query result.
|
|
35
|
+
*
|
|
36
|
+
* Query buses normally throw failures. This helper is useful for
|
|
37
|
+
* infrastructure that needs to represent a failure as a value.
|
|
38
|
+
*/
|
|
39
|
+
export declare function createFailedQueryResult<TResult = unknown, TQuery extends Query = Query>(result: TResult, options: CreateQueryResultOptions<TQuery>): QueryResult<TResult, TQuery>;
|
|
40
|
+
/**
|
|
41
|
+
* Determines whether a query result represents success.
|
|
42
|
+
*/
|
|
43
|
+
export declare function isSuccessfulQueryResult<TResult, TQuery extends Query = Query>(result: QueryResult<TResult, TQuery>): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Determines whether a query result represents failure.
|
|
46
|
+
*/
|
|
47
|
+
export declare function isFailedQueryResult<TResult, TQuery extends Query = Query>(result: QueryResult<TResult, TQuery>): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Returns the underlying query result value.
|
|
50
|
+
*/
|
|
51
|
+
export declare function unwrapQueryResult<TResult, TQuery extends Query = Query>(result: QueryResult<TResult, TQuery>): TResult;
|
|
52
|
+
/**
|
|
53
|
+
* Adds metadata to an existing query result.
|
|
54
|
+
*/
|
|
55
|
+
export declare function withQueryResultMetadata<TResult, TQuery extends Query = Query>(result: QueryResult<TResult, TQuery>, metadata: Readonly<Record<string, unknown>>): QueryResult<TResult, TQuery>;
|
|
56
|
+
//# sourceMappingURL=queryResult.type.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryResult.type.d.ts","sourceRoot":"","sources":["../../src/query/queryResult.type.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,SAAS,GAAG,SAAS,CAAC;AAEtD;;;;;GAKG;AACH,MAAM,WAAW,WAAW,CAAC,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK;IAC1E,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,UAAU,EAAE,IAAI,CAAC;IAC1B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB,CAAC,MAAM,SAAS,KAAK,GAAG,KAAK;IACpE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,IAAI,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACvD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,SAAS,KAAK,EAC7D,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,GACxC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAmB9B;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,GAAG,OAAO,EACjB,MAAM,SAAS,KAAK,GAAG,KAAK,EAE5B,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,wBAAwB,CAAC,MAAM,CAAC,GACxC,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAmB9B;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,EAC3E,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,GACnC,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,EACvE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,GACnC,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,EACrE,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,GACnC,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,SAAS,KAAK,GAAG,KAAK,EAC3E,MAAM,EAAE,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,EACpC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAC1C,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,CAU9B"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a successful query result.
|
|
3
|
+
*/
|
|
4
|
+
export function createQueryResult(result, options) {
|
|
5
|
+
const query = options.query;
|
|
6
|
+
validateQuery(query);
|
|
7
|
+
const queryResult = {
|
|
8
|
+
status: "success",
|
|
9
|
+
result,
|
|
10
|
+
queryType: query.type,
|
|
11
|
+
executedAt: options.executedAt ?? new Date(),
|
|
12
|
+
durationMs: options.durationMs,
|
|
13
|
+
metadata: options.metadata
|
|
14
|
+
? Object.freeze({
|
|
15
|
+
...options.metadata,
|
|
16
|
+
})
|
|
17
|
+
: undefined,
|
|
18
|
+
};
|
|
19
|
+
return Object.freeze(queryResult);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Creates a failed query result.
|
|
23
|
+
*
|
|
24
|
+
* Query buses normally throw failures. This helper is useful for
|
|
25
|
+
* infrastructure that needs to represent a failure as a value.
|
|
26
|
+
*/
|
|
27
|
+
export function createFailedQueryResult(result, options) {
|
|
28
|
+
const query = options.query;
|
|
29
|
+
validateQuery(query);
|
|
30
|
+
const queryResult = {
|
|
31
|
+
status: "failure",
|
|
32
|
+
result,
|
|
33
|
+
queryType: query.type,
|
|
34
|
+
executedAt: options.executedAt ?? new Date(),
|
|
35
|
+
durationMs: options.durationMs,
|
|
36
|
+
metadata: options.metadata
|
|
37
|
+
? Object.freeze({
|
|
38
|
+
...options.metadata,
|
|
39
|
+
})
|
|
40
|
+
: undefined,
|
|
41
|
+
};
|
|
42
|
+
return Object.freeze(queryResult);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Determines whether a query result represents success.
|
|
46
|
+
*/
|
|
47
|
+
export function isSuccessfulQueryResult(result) {
|
|
48
|
+
return result.status === "success";
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Determines whether a query result represents failure.
|
|
52
|
+
*/
|
|
53
|
+
export function isFailedQueryResult(result) {
|
|
54
|
+
return result.status === "failure";
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Returns the underlying query result value.
|
|
58
|
+
*/
|
|
59
|
+
export function unwrapQueryResult(result) {
|
|
60
|
+
return result.result;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Adds metadata to an existing query result.
|
|
64
|
+
*/
|
|
65
|
+
export function withQueryResultMetadata(result, metadata) {
|
|
66
|
+
const merged = {
|
|
67
|
+
...result,
|
|
68
|
+
metadata: Object.freeze({
|
|
69
|
+
...(result.metadata ?? {}),
|
|
70
|
+
...metadata,
|
|
71
|
+
}),
|
|
72
|
+
};
|
|
73
|
+
return Object.freeze(merged);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Validates the query portion of a query result.
|
|
77
|
+
*/
|
|
78
|
+
function validateQuery(query) {
|
|
79
|
+
if (!query || typeof query !== "object") {
|
|
80
|
+
throw new TypeError("A valid query is required to create a query result.");
|
|
81
|
+
}
|
|
82
|
+
if (typeof query.type !== "string" || query.type.trim().length === 0) {
|
|
83
|
+
throw new TypeError("Query type is required to create a query result.");
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=queryResult.type.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"queryResult.type.js","sourceRoot":"","sources":["../../src/query/queryResult.type.ts"],"names":[],"mappings":"AAgCA;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAe,EACf,OAAyC;IAEzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,MAAM,WAAW,GAAiC;QAChD,MAAM,EAAE,SAAS;QACjB,MAAM;QACN,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE;QAC5C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YACxB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBACZ,GAAG,OAAO,CAAC,QAAQ;aACpB,CAAC;YACJ,CAAC,CAAC,SAAS;KACd,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,uBAAuB,CAIrC,MAAe,EACf,OAAyC;IAEzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAE5B,aAAa,CAAC,KAAK,CAAC,CAAC;IAErB,MAAM,WAAW,GAAiC;QAChD,MAAM,EAAE,SAAS;QACjB,MAAM;QACN,SAAS,EAAE,KAAK,CAAC,IAAI;QACrB,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,IAAI,IAAI,EAAE;QAC5C,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,QAAQ,EAAE,OAAO,CAAC,QAAQ;YACxB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBACZ,GAAG,OAAO,CAAC,QAAQ;aACpB,CAAC;YACJ,CAAC,CAAC,SAAS;KACd,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAoC;IAEpC,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAoC;IAEpC,OAAO,MAAM,CAAC,MAAM,KAAK,SAAS,CAAC;AACrC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAAoC;IAEpC,OAAO,MAAM,CAAC,MAAM,CAAC;AACvB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CACrC,MAAoC,EACpC,QAA2C;IAE3C,MAAM,MAAM,GAAiC;QAC3C,GAAG,MAAM;QACT,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC;YACtB,GAAG,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC;YAC1B,GAAG,QAAQ;SACZ,CAAC;KACH,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAY;IACjC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrE,MAAM,IAAI,SAAS,CAAC,kDAAkD,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@zudojs/cqrs",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"description": "Command Query Responsibility Segregation (CQRS) primitives for separating read and write operations.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"module": "./dist/index.js",
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"exports": {
|
|
11
|
+
".": {
|
|
12
|
+
"types": "./dist/index.d.ts",
|
|
13
|
+
"import": "./dist/index.js",
|
|
14
|
+
"default": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"files": [
|
|
18
|
+
"dist"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "tsc -p tsconfig.json",
|
|
22
|
+
"clean": "rm -rf dist",
|
|
23
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
24
|
+
"test": "vitest run"
|
|
25
|
+
},
|
|
26
|
+
"dependencies": {
|
|
27
|
+
"@zudojs/errors": "workspace:*",
|
|
28
|
+
"@zudojs/events": "workspace:*",
|
|
29
|
+
"@zudojs/messaging": "workspace:*"
|
|
30
|
+
},
|
|
31
|
+
"devDependencies": {
|
|
32
|
+
"typescript": "^7.0.2",
|
|
33
|
+
"vitest": "^4.1.11"
|
|
34
|
+
},
|
|
35
|
+
"publishConfig": {
|
|
36
|
+
"access": "public"
|
|
37
|
+
},
|
|
38
|
+
"engines": {
|
|
39
|
+
"node": ">=24.0.0"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"zudojs",
|
|
43
|
+
"cqrs",
|
|
44
|
+
"commands",
|
|
45
|
+
"queries"
|
|
46
|
+
],
|
|
47
|
+
"homepage": "https://github.com/oyinlola-tech/zudo#readme",
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "git",
|
|
50
|
+
"url": "https://github.com/oyinlola-tech/zudo"
|
|
51
|
+
}
|
|
52
|
+
}
|