@nestjs/cqrs 7.0.0-next.3 → 8.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/.circleci/config.yml +1 -1
- package/.github/ISSUE_TEMPLATE/Bug_report.yml +106 -0
- package/.github/ISSUE_TEMPLATE/Feature_request.yml +52 -0
- package/.github/ISSUE_TEMPLATE/Regression.yml +78 -0
- package/.github/ISSUE_TEMPLATE/config.yml +7 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +10 -14
- package/CONTRIBUTING.md +4 -3
- package/LICENSE +21 -0
- package/dist/aggregate-root.d.ts +4 -2
- package/dist/aggregate-root.js +2 -1
- package/dist/command-bus.d.ts +4 -4
- package/dist/command-bus.js +56 -53
- package/dist/cqrs.module.js +25 -28
- package/dist/decorators/command-handler.decorator.d.ts +10 -0
- package/dist/decorators/command-handler.decorator.js +16 -1
- package/dist/decorators/constants.d.ts +3 -1
- package/dist/decorators/constants.js +4 -2
- package/dist/decorators/events-handler.decorator.d.ts +10 -0
- package/dist/decorators/events-handler.decorator.js +12 -1
- package/dist/decorators/index.js +2 -2
- package/dist/decorators/query-handler.decorator.d.ts +10 -0
- package/dist/decorators/query-handler.decorator.js +16 -1
- package/dist/decorators/saga.decorator.d.ts +5 -0
- package/dist/decorators/saga.decorator.js +7 -1
- package/dist/event-bus.js +77 -80
- package/dist/event-publisher.js +29 -26
- package/dist/exceptions/index.js +2 -2
- package/dist/helpers/default-get-event-name.js +2 -1
- package/dist/index.js +8 -2
- package/dist/interfaces/commands/command-bus.interface.d.ts +1 -1
- package/dist/interfaces/commands/command-metadata.interface.d.ts +3 -0
- package/dist/interfaces/commands/command-metadata.interface.js +2 -0
- package/dist/interfaces/index.js +2 -2
- package/dist/interfaces/queries/query-metadata.interface.d.ts +3 -0
- package/dist/interfaces/queries/query-metadata.interface.js +2 -0
- package/dist/interfaces/queries/query-publisher.interface.d.ts +1 -1
- package/dist/operators/index.js +2 -2
- package/dist/operators/of-type.d.ts +8 -0
- package/dist/operators/of-type.js +9 -1
- package/dist/query-bus.d.ts +3 -3
- package/dist/query-bus.js +59 -56
- package/dist/services/explorer.service.js +35 -38
- package/dist/utils/index.js +2 -2
- package/package.json +26 -23
- package/.github/ISSUE_TEMPLATE.md +0 -46
|
@@ -3,8 +3,19 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.EventsHandler = void 0;
|
|
4
4
|
require("reflect-metadata");
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Decorator that marks a class as a Nest event handler. An event handler
|
|
8
|
+
* handles events executed by your application code.
|
|
9
|
+
*
|
|
10
|
+
* The decorated class must implement the `IEventHandler` interface.
|
|
11
|
+
*
|
|
12
|
+
* @param events one or more event *types* to be handled by this handler.
|
|
13
|
+
*
|
|
14
|
+
* @see https://docs.nestjs.com/recipes/cqrs#events
|
|
15
|
+
*/
|
|
16
|
+
const EventsHandler = (...events) => {
|
|
7
17
|
return (target) => {
|
|
8
18
|
Reflect.defineMetadata(constants_1.EVENTS_HANDLER_METADATA, events, target);
|
|
9
19
|
};
|
|
10
20
|
};
|
|
21
|
+
exports.EventsHandler = EventsHandler;
|
package/dist/decorators/index.js
CHANGED
|
@@ -7,8 +7,8 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
7
7
|
o[k2] = m[k];
|
|
8
8
|
}));
|
|
9
9
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
-
for (var p in m) if (p !== "default" && !
|
|
11
|
-
}
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
__exportStar(require("./command-handler.decorator"), exports);
|
|
14
14
|
__exportStar(require("./events-handler.decorator"), exports);
|
|
@@ -1,3 +1,13 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import { IQuery } from '../interfaces';
|
|
3
|
+
/**
|
|
4
|
+
* Decorator that marks a class as a Nest query handler. A query handler
|
|
5
|
+
* handles queries executed by your application code.
|
|
6
|
+
*
|
|
7
|
+
* The decorated class must implement the `IQueryHandler` interface.
|
|
8
|
+
*
|
|
9
|
+
* @param query query *type* to be handled by this handler.
|
|
10
|
+
*
|
|
11
|
+
* @see https://docs.nestjs.com/recipes/cqrs#queries
|
|
12
|
+
*/
|
|
3
13
|
export declare const QueryHandler: (query: IQuery) => ClassDecorator;
|
|
@@ -3,8 +3,23 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.QueryHandler = void 0;
|
|
4
4
|
require("reflect-metadata");
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
|
-
|
|
6
|
+
const uuid_1 = require("uuid");
|
|
7
|
+
/**
|
|
8
|
+
* Decorator that marks a class as a Nest query handler. A query handler
|
|
9
|
+
* handles queries executed by your application code.
|
|
10
|
+
*
|
|
11
|
+
* The decorated class must implement the `IQueryHandler` interface.
|
|
12
|
+
*
|
|
13
|
+
* @param query query *type* to be handled by this handler.
|
|
14
|
+
*
|
|
15
|
+
* @see https://docs.nestjs.com/recipes/cqrs#queries
|
|
16
|
+
*/
|
|
17
|
+
const QueryHandler = (query) => {
|
|
7
18
|
return (target) => {
|
|
19
|
+
if (!Reflect.hasMetadata(constants_1.QUERY_METADATA, query)) {
|
|
20
|
+
Reflect.defineMetadata(constants_1.QUERY_METADATA, { id: (0, uuid_1.v4)() }, query);
|
|
21
|
+
}
|
|
8
22
|
Reflect.defineMetadata(constants_1.QUERY_HANDLER_METADATA, query, target);
|
|
9
23
|
};
|
|
10
24
|
};
|
|
25
|
+
exports.QueryHandler = QueryHandler;
|
|
@@ -3,9 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Saga = void 0;
|
|
4
4
|
require("reflect-metadata");
|
|
5
5
|
const constants_1 = require("./constants");
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Decorator that marks a class as a Nest saga. Sagas may listen and react to 1..N events.
|
|
8
|
+
*
|
|
9
|
+
* @see https://docs.nestjs.com/recipes/cqrs#sagas
|
|
10
|
+
*/
|
|
11
|
+
const Saga = () => {
|
|
7
12
|
return (target, propertyKey) => {
|
|
8
13
|
const properties = Reflect.getMetadata(constants_1.SAGA_METADATA, target.constructor) || [];
|
|
9
14
|
Reflect.defineMetadata(constants_1.SAGA_METADATA, [...properties, propertyKey], target.constructor);
|
|
10
15
|
};
|
|
11
16
|
};
|
|
17
|
+
exports.Saga = Saga;
|
package/dist/event-bus.js
CHANGED
|
@@ -21,91 +21,88 @@ const exceptions_1 = require("./exceptions");
|
|
|
21
21
|
const default_get_event_name_1 = require("./helpers/default-get-event-name");
|
|
22
22
|
const default_pubsub_1 = require("./helpers/default-pubsub");
|
|
23
23
|
const utils_1 = require("./utils");
|
|
24
|
-
let EventBus =
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
24
|
+
let EventBus = class EventBus extends utils_1.ObservableBus {
|
|
25
|
+
constructor(commandBus, moduleRef) {
|
|
26
|
+
super();
|
|
27
|
+
this.commandBus = commandBus;
|
|
28
|
+
this.moduleRef = moduleRef;
|
|
29
|
+
this.subscriptions = [];
|
|
30
|
+
this.getEventName = default_get_event_name_1.defaultGetEventName;
|
|
31
|
+
this.useDefaultPublisher();
|
|
32
|
+
}
|
|
33
|
+
get publisher() {
|
|
34
|
+
return this._publisher;
|
|
35
|
+
}
|
|
36
|
+
set publisher(_publisher) {
|
|
37
|
+
this._publisher = _publisher;
|
|
38
|
+
}
|
|
39
|
+
onModuleDestroy() {
|
|
40
|
+
this.subscriptions.forEach((subscription) => subscription.unsubscribe());
|
|
41
|
+
}
|
|
42
|
+
publish(event) {
|
|
43
|
+
return this._publisher.publish(event);
|
|
44
|
+
}
|
|
45
|
+
publishAll(events) {
|
|
46
|
+
if (this._publisher.publishAll) {
|
|
47
|
+
return this._publisher.publishAll(events);
|
|
33
48
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
publishAll(events) {
|
|
47
|
-
if (this._publisher.publishAll) {
|
|
48
|
-
return this._publisher.publishAll(events);
|
|
49
|
-
}
|
|
50
|
-
return (events || []).map((event) => this._publisher.publish(event));
|
|
51
|
-
}
|
|
52
|
-
bind(handler, name) {
|
|
53
|
-
const stream$ = name ? this.ofEventName(name) : this.subject$;
|
|
54
|
-
const subscription = stream$.subscribe((event) => handler.handle(event));
|
|
55
|
-
this.subscriptions.push(subscription);
|
|
56
|
-
}
|
|
57
|
-
registerSagas(types = []) {
|
|
58
|
-
const sagas = types
|
|
59
|
-
.map((target) => {
|
|
60
|
-
const metadata = Reflect.getMetadata(constants_1.SAGA_METADATA, target) || [];
|
|
61
|
-
const instance = this.moduleRef.get(target, { strict: false });
|
|
62
|
-
if (!instance) {
|
|
63
|
-
throw new exceptions_1.InvalidSagaException();
|
|
64
|
-
}
|
|
65
|
-
return metadata.map((key) => instance[key]);
|
|
66
|
-
})
|
|
67
|
-
.reduce((a, b) => a.concat(b), []);
|
|
68
|
-
sagas.forEach((saga) => this.registerSaga(saga));
|
|
69
|
-
}
|
|
70
|
-
register(handlers = []) {
|
|
71
|
-
handlers.forEach((handler) => this.registerHandler(handler));
|
|
72
|
-
}
|
|
73
|
-
registerHandler(handler) {
|
|
74
|
-
const instance = this.moduleRef.get(handler, { strict: false });
|
|
49
|
+
return (events || []).map((event) => this._publisher.publish(event));
|
|
50
|
+
}
|
|
51
|
+
bind(handler, name) {
|
|
52
|
+
const stream$ = name ? this.ofEventName(name) : this.subject$;
|
|
53
|
+
const subscription = stream$.subscribe((event) => handler.handle(event));
|
|
54
|
+
this.subscriptions.push(subscription);
|
|
55
|
+
}
|
|
56
|
+
registerSagas(types = []) {
|
|
57
|
+
const sagas = types
|
|
58
|
+
.map((target) => {
|
|
59
|
+
const metadata = Reflect.getMetadata(constants_1.SAGA_METADATA, target) || [];
|
|
60
|
+
const instance = this.moduleRef.get(target, { strict: false });
|
|
75
61
|
if (!instance) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
const eventsNames = this.reflectEventsNames(handler);
|
|
79
|
-
eventsNames.map((event) => this.bind(instance, event.name));
|
|
80
|
-
}
|
|
81
|
-
ofEventName(name) {
|
|
82
|
-
return this.subject$.pipe(operators_1.filter((event) => this.getEventName(event) === name));
|
|
83
|
-
}
|
|
84
|
-
registerSaga(saga) {
|
|
85
|
-
if (!util_1.isFunction(saga)) {
|
|
86
62
|
throw new exceptions_1.InvalidSagaException();
|
|
87
63
|
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
64
|
+
return metadata.map((key) => instance[key].bind(instance));
|
|
65
|
+
})
|
|
66
|
+
.reduce((a, b) => a.concat(b), []);
|
|
67
|
+
sagas.forEach((saga) => this.registerSaga(saga));
|
|
68
|
+
}
|
|
69
|
+
register(handlers = []) {
|
|
70
|
+
handlers.forEach((handler) => this.registerHandler(handler));
|
|
71
|
+
}
|
|
72
|
+
registerHandler(handler) {
|
|
73
|
+
const instance = this.moduleRef.get(handler, { strict: false });
|
|
74
|
+
if (!instance) {
|
|
75
|
+
return;
|
|
96
76
|
}
|
|
97
|
-
reflectEventsNames(handler)
|
|
98
|
-
|
|
77
|
+
const eventsNames = this.reflectEventsNames(handler);
|
|
78
|
+
eventsNames.map((event) => this.bind(instance, event.name));
|
|
79
|
+
}
|
|
80
|
+
ofEventName(name) {
|
|
81
|
+
return this.subject$.pipe((0, operators_1.filter)((event) => this.getEventName(event) === name));
|
|
82
|
+
}
|
|
83
|
+
registerSaga(saga) {
|
|
84
|
+
if (!(0, util_1.isFunction)(saga)) {
|
|
85
|
+
throw new exceptions_1.InvalidSagaException();
|
|
99
86
|
}
|
|
100
|
-
|
|
101
|
-
|
|
87
|
+
const stream$ = saga(this);
|
|
88
|
+
if (!(stream$ instanceof rxjs_1.Observable)) {
|
|
89
|
+
throw new exceptions_1.InvalidSagaException();
|
|
102
90
|
}
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
}
|
|
91
|
+
const subscription = stream$
|
|
92
|
+
.pipe((0, operators_1.filter)((e) => !!e))
|
|
93
|
+
.subscribe((command) => this.commandBus.execute(command));
|
|
94
|
+
this.subscriptions.push(subscription);
|
|
95
|
+
}
|
|
96
|
+
reflectEventsNames(handler) {
|
|
97
|
+
return Reflect.getMetadata(constants_1.EVENTS_HANDLER_METADATA, handler);
|
|
98
|
+
}
|
|
99
|
+
useDefaultPublisher() {
|
|
100
|
+
this._publisher = new default_pubsub_1.DefaultPubSub(this.subject$);
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
EventBus = __decorate([
|
|
104
|
+
(0, common_1.Injectable)(),
|
|
105
|
+
__metadata("design:paramtypes", [command_bus_1.CommandBus,
|
|
106
|
+
core_1.ModuleRef])
|
|
107
|
+
], EventBus);
|
|
111
108
|
exports.EventBus = EventBus;
|
package/dist/event-publisher.js
CHANGED
|
@@ -12,31 +12,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
exports.EventPublisher = void 0;
|
|
13
13
|
const common_1 = require("@nestjs/common");
|
|
14
14
|
const event_bus_1 = require("./event-bus");
|
|
15
|
-
let EventPublisher =
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
publish(event) {
|
|
24
|
-
eventBus.publish(event);
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
mergeObjectContext(object) {
|
|
29
|
-
const eventBus = this.eventBus;
|
|
30
|
-
object.publish = (event) => {
|
|
15
|
+
let EventPublisher = class EventPublisher {
|
|
16
|
+
constructor(eventBus) {
|
|
17
|
+
this.eventBus = eventBus;
|
|
18
|
+
}
|
|
19
|
+
mergeClassContext(metatype) {
|
|
20
|
+
const eventBus = this.eventBus;
|
|
21
|
+
return class extends metatype {
|
|
22
|
+
publish(event) {
|
|
31
23
|
eventBus.publish(event);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
24
|
+
}
|
|
25
|
+
publishAll(events) {
|
|
26
|
+
eventBus.publishAll(events);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
mergeObjectContext(object) {
|
|
31
|
+
const eventBus = this.eventBus;
|
|
32
|
+
object.publish = (event) => {
|
|
33
|
+
eventBus.publish(event);
|
|
34
|
+
};
|
|
35
|
+
object.publishAll = (events) => {
|
|
36
|
+
eventBus.publishAll(events);
|
|
37
|
+
};
|
|
38
|
+
return object;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
EventPublisher = __decorate([
|
|
42
|
+
(0, common_1.Injectable)(),
|
|
43
|
+
__metadata("design:paramtypes", [event_bus_1.EventBus])
|
|
44
|
+
], EventPublisher);
|
|
42
45
|
exports.EventPublisher = EventPublisher;
|
package/dist/exceptions/index.js
CHANGED
|
@@ -7,8 +7,8 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
7
7
|
o[k2] = m[k];
|
|
8
8
|
}));
|
|
9
9
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
-
for (var p in m) if (p !== "default" && !
|
|
11
|
-
}
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
__exportStar(require("./command-not-found.exception"), exports);
|
|
14
14
|
__exportStar(require("./invalid-command-handler.exception"), exports);
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.defaultGetEventName = void 0;
|
|
4
|
-
|
|
4
|
+
const defaultGetEventName = (event) => {
|
|
5
5
|
const { constructor } = Object.getPrototypeOf(event);
|
|
6
6
|
return constructor.name;
|
|
7
7
|
};
|
|
8
|
+
exports.defaultGetEventName = defaultGetEventName;
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Nest CQRS Module
|
|
4
|
+
* Copyright(c) 2017-... Kamil Mysliwiec
|
|
5
|
+
* www.kamilmysliwiec.com
|
|
6
|
+
* MIT Licensed
|
|
7
|
+
*/
|
|
2
8
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
9
|
if (k2 === undefined) k2 = k;
|
|
4
10
|
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
@@ -7,8 +13,8 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
7
13
|
o[k2] = m[k];
|
|
8
14
|
}));
|
|
9
15
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
-
for (var p in m) if (p !== "default" && !
|
|
11
|
-
}
|
|
16
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
17
|
+
};
|
|
12
18
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
19
|
__exportStar(require("./aggregate-root"), exports);
|
|
14
20
|
__exportStar(require("./command-bus"), exports);
|
package/dist/interfaces/index.js
CHANGED
|
@@ -7,8 +7,8 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
7
7
|
o[k2] = m[k];
|
|
8
8
|
}));
|
|
9
9
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
-
for (var p in m) if (p !== "default" && !
|
|
11
|
-
}
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
__exportStar(require("./commands/command-bus.interface"), exports);
|
|
14
14
|
__exportStar(require("./commands/command-handler.interface"), exports);
|
package/dist/operators/index.js
CHANGED
|
@@ -7,7 +7,7 @@ var __createBinding = (this && this.__createBinding) || (Object.create ? (functi
|
|
|
7
7
|
o[k2] = m[k];
|
|
8
8
|
}));
|
|
9
9
|
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
10
|
-
for (var p in m) if (p !== "default" && !
|
|
11
|
-
}
|
|
10
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
11
|
+
};
|
|
12
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
13
|
__exportStar(require("./of-type"), exports);
|
|
@@ -1,4 +1,12 @@
|
|
|
1
1
|
import { Type } from '@nestjs/common';
|
|
2
2
|
import { Observable } from 'rxjs';
|
|
3
3
|
import { IEvent } from '../interfaces';
|
|
4
|
+
/**
|
|
5
|
+
* Filter values depending on their instance type (comparison is made
|
|
6
|
+
* using native `instanceof`).
|
|
7
|
+
*
|
|
8
|
+
* @param types List of types implementing `IEvent`.
|
|
9
|
+
*
|
|
10
|
+
* @return A stream only emitting the filtered instances.
|
|
11
|
+
*/
|
|
4
12
|
export declare function ofType<TInput extends IEvent, TOutput extends IEvent>(...types: Type<TOutput>[]): (source: Observable<TInput>) => Observable<TOutput>;
|
|
@@ -2,8 +2,16 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ofType = void 0;
|
|
4
4
|
const operators_1 = require("rxjs/operators");
|
|
5
|
+
/**
|
|
6
|
+
* Filter values depending on their instance type (comparison is made
|
|
7
|
+
* using native `instanceof`).
|
|
8
|
+
*
|
|
9
|
+
* @param types List of types implementing `IEvent`.
|
|
10
|
+
*
|
|
11
|
+
* @return A stream only emitting the filtered instances.
|
|
12
|
+
*/
|
|
5
13
|
function ofType(...types) {
|
|
6
14
|
const isInstanceOf = (event) => !!types.find((classType) => event instanceof classType);
|
|
7
|
-
return (source) => source.pipe(operators_1.filter(isInstanceOf));
|
|
15
|
+
return (source) => source.pipe((0, operators_1.filter)(isInstanceOf));
|
|
8
16
|
}
|
|
9
17
|
exports.ofType = ofType;
|
package/dist/query-bus.d.ts
CHANGED
|
@@ -12,10 +12,10 @@ export declare class QueryBus<QueryBase extends IQuery = IQuery> extends Observa
|
|
|
12
12
|
get publisher(): IQueryPublisher<QueryBase>;
|
|
13
13
|
set publisher(_publisher: IQueryPublisher<QueryBase>);
|
|
14
14
|
execute<T extends QueryBase, TResult = any>(query: T): Promise<TResult>;
|
|
15
|
-
bind<T extends QueryBase, TResult = any>(handler: IQueryHandler<T, TResult>,
|
|
15
|
+
bind<T extends QueryBase, TResult = any>(handler: IQueryHandler<T, TResult>, queryId: string): void;
|
|
16
16
|
register(handlers?: QueryHandlerType<QueryBase>[]): void;
|
|
17
17
|
protected registerHandler(handler: QueryHandlerType<QueryBase>): void;
|
|
18
|
-
private
|
|
19
|
-
private
|
|
18
|
+
private getQueryId;
|
|
19
|
+
private reflectQueryId;
|
|
20
20
|
private useDefaultPublisher;
|
|
21
21
|
}
|
package/dist/query-bus.js
CHANGED
|
@@ -27,64 +27,67 @@ const exceptions_1 = require("./exceptions");
|
|
|
27
27
|
const invalid_query_handler_exception_1 = require("./exceptions/invalid-query-handler.exception");
|
|
28
28
|
const default_query_pubsub_1 = require("./helpers/default-query-pubsub");
|
|
29
29
|
const observable_bus_1 = require("./utils/observable-bus");
|
|
30
|
-
let QueryBus =
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
throw new exceptions_1.QueryHandlerNotFoundException(queryName);
|
|
50
|
-
}
|
|
51
|
-
this.subject$.next(query);
|
|
52
|
-
const result = yield handler.execute(query);
|
|
53
|
-
return result;
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
bind(handler, name) {
|
|
57
|
-
this.handlers.set(name, handler);
|
|
58
|
-
}
|
|
59
|
-
register(handlers = []) {
|
|
60
|
-
handlers.forEach((handler) => this.registerHandler(handler));
|
|
61
|
-
}
|
|
62
|
-
registerHandler(handler) {
|
|
63
|
-
const instance = this.moduleRef.get(handler, { strict: false });
|
|
64
|
-
if (!instance) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const target = this.reflectQueryName(handler);
|
|
68
|
-
if (!target) {
|
|
69
|
-
throw new invalid_query_handler_exception_1.InvalidQueryHandlerException();
|
|
30
|
+
let QueryBus = class QueryBus extends observable_bus_1.ObservableBus {
|
|
31
|
+
constructor(moduleRef) {
|
|
32
|
+
super();
|
|
33
|
+
this.moduleRef = moduleRef;
|
|
34
|
+
this.handlers = new Map();
|
|
35
|
+
this.useDefaultPublisher();
|
|
36
|
+
}
|
|
37
|
+
get publisher() {
|
|
38
|
+
return this._publisher;
|
|
39
|
+
}
|
|
40
|
+
set publisher(_publisher) {
|
|
41
|
+
this._publisher = _publisher;
|
|
42
|
+
}
|
|
43
|
+
execute(query) {
|
|
44
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
+
const queryId = this.getQueryId(query);
|
|
46
|
+
const handler = this.handlers.get(queryId);
|
|
47
|
+
if (!handler) {
|
|
48
|
+
throw new exceptions_1.QueryHandlerNotFoundException(queryId);
|
|
70
49
|
}
|
|
71
|
-
this.
|
|
50
|
+
this.subject$.next(query);
|
|
51
|
+
const result = yield handler.execute(query);
|
|
52
|
+
return result;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
bind(handler, queryId) {
|
|
56
|
+
this.handlers.set(queryId, handler);
|
|
57
|
+
}
|
|
58
|
+
register(handlers = []) {
|
|
59
|
+
handlers.forEach((handler) => this.registerHandler(handler));
|
|
60
|
+
}
|
|
61
|
+
registerHandler(handler) {
|
|
62
|
+
const instance = this.moduleRef.get(handler, { strict: false });
|
|
63
|
+
if (!instance) {
|
|
64
|
+
return;
|
|
72
65
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
66
|
+
const target = this.reflectQueryId(handler);
|
|
67
|
+
if (!target) {
|
|
68
|
+
throw new invalid_query_handler_exception_1.InvalidQueryHandlerException();
|
|
76
69
|
}
|
|
77
|
-
|
|
78
|
-
|
|
70
|
+
this.bind(instance, target);
|
|
71
|
+
}
|
|
72
|
+
getQueryId(query) {
|
|
73
|
+
const { constructor: queryType } = Object.getPrototypeOf(query);
|
|
74
|
+
const queryMetadata = Reflect.getMetadata(constants_1.QUERY_METADATA, queryType);
|
|
75
|
+
if (!queryMetadata) {
|
|
76
|
+
throw new exceptions_1.QueryHandlerNotFoundException(queryType.name);
|
|
79
77
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
}
|
|
78
|
+
return queryMetadata.id;
|
|
79
|
+
}
|
|
80
|
+
reflectQueryId(handler) {
|
|
81
|
+
const query = Reflect.getMetadata(constants_1.QUERY_HANDLER_METADATA, handler);
|
|
82
|
+
const queryMetadata = Reflect.getMetadata(constants_1.QUERY_METADATA, query);
|
|
83
|
+
return queryMetadata.id;
|
|
84
|
+
}
|
|
85
|
+
useDefaultPublisher() {
|
|
86
|
+
this._publisher = new default_query_pubsub_1.DefaultQueryPubSub(this.subject$);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
QueryBus = __decorate([
|
|
90
|
+
(0, common_1.Injectable)(),
|
|
91
|
+
__metadata("design:paramtypes", [core_1.ModuleRef])
|
|
92
|
+
], QueryBus);
|
|
90
93
|
exports.QueryBus = QueryBus;
|