@nestjs/cqrs 11.0.2 → 12.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.circleci/config.yml +3 -3
- package/.nvmrc +1 -0
- package/README.md +0 -1
- package/dist/aggregate-root.d.ts +3 -67
- package/dist/aggregate-root.js +6 -83
- package/dist/classes/command.d.ts +2 -2
- package/dist/classes/command.js +2 -6
- package/dist/classes/constants.js +1 -4
- package/dist/classes/index.d.ts +2 -2
- package/dist/classes/index.js +2 -18
- package/dist/classes/query.d.ts +2 -2
- package/dist/classes/query.js +2 -6
- package/dist/command-bus.d.ts +8 -5
- package/dist/command-bus.js +32 -32
- package/dist/constants.js +1 -4
- package/dist/cqrs.module.d.ts +8 -5
- package/dist/cqrs.module.js +37 -37
- package/dist/decorators/command-handler.decorator.d.ts +3 -1
- package/dist/decorators/command-handler.decorator.js +11 -13
- package/dist/decorators/constants.js +7 -10
- package/dist/decorators/events-handler.decorator.d.ts +3 -1
- package/dist/decorators/events-handler.decorator.js +12 -14
- package/dist/decorators/index.d.ts +5 -5
- package/dist/decorators/index.js +5 -21
- package/dist/decorators/publishable.decorator.d.ts +2 -0
- package/dist/decorators/publishable.decorator.js +5 -6
- package/dist/decorators/query-handler.decorator.d.ts +3 -1
- package/dist/decorators/query-handler.decorator.js +11 -13
- package/dist/decorators/saga.decorator.d.ts +2 -0
- package/dist/decorators/saga.decorator.js +7 -9
- package/dist/event-bus.d.ts +13 -8
- package/dist/event-bus.js +54 -51
- package/dist/event-publisher.d.ts +9 -7
- package/dist/event-publisher.js +10 -10
- package/dist/exceptions/command-not-found.exception.d.ts +3 -0
- package/dist/exceptions/command-not-found.exception.js +4 -5
- package/dist/exceptions/index.d.ts +7 -7
- package/dist/exceptions/index.js +7 -23
- package/dist/exceptions/invalid-command-handler.exception.d.ts +3 -0
- package/dist/exceptions/invalid-command-handler.exception.js +4 -5
- package/dist/exceptions/invalid-events-handler.exception.d.ts +3 -0
- package/dist/exceptions/invalid-events-handler.exception.js +4 -5
- package/dist/exceptions/invalid-query-handler.exception.js +1 -5
- package/dist/exceptions/invalid-saga.exception.d.ts +3 -0
- package/dist/exceptions/invalid-saga.exception.js +4 -5
- package/dist/exceptions/query-not-found.exception.d.ts +3 -0
- package/dist/exceptions/query-not-found.exception.js +4 -5
- package/dist/exceptions/unsupported-saga-scope.exception.d.ts +3 -0
- package/dist/exceptions/unsupported-saga-scope.exception.js +4 -5
- package/dist/helpers/default-command-pubsub.d.ts +1 -1
- package/dist/helpers/default-command-pubsub.js +1 -5
- package/dist/helpers/default-event-id-provider.d.ts +1 -1
- package/dist/helpers/default-event-id-provider.js +3 -6
- package/dist/helpers/default-pubsub.d.ts +1 -1
- package/dist/helpers/default-pubsub.js +1 -5
- package/dist/helpers/default-query-pubsub.d.ts +1 -1
- package/dist/helpers/default-query-pubsub.js +1 -5
- package/dist/helpers/default-unhandled-exception-pubsub.d.ts +1 -1
- package/dist/helpers/default-unhandled-exception-pubsub.js +1 -5
- package/dist/index.d.ts +15 -14
- package/dist/index.js +15 -30
- package/dist/interfaces/aggregate-root.interface.d.ts +53 -0
- package/dist/interfaces/aggregate-root.interface.js +1 -0
- package/dist/interfaces/commands/command-bus.interface.d.ts +5 -3
- package/dist/interfaces/commands/command-bus.interface.js +1 -2
- package/dist/interfaces/commands/command-handler.interface.d.ts +4 -2
- package/dist/interfaces/commands/command-handler.interface.js +1 -2
- package/dist/interfaces/commands/command-metadata.interface.js +1 -2
- package/dist/interfaces/commands/command-publisher.interface.d.ts +6 -1
- package/dist/interfaces/commands/command-publisher.interface.js +1 -2
- package/dist/interfaces/commands/command.interface.js +1 -2
- package/dist/interfaces/cqrs-module-options.interface.d.ts +17 -5
- package/dist/interfaces/cqrs-module-options.interface.js +1 -2
- package/dist/interfaces/events/event-bus.interface.d.ts +2 -2
- package/dist/interfaces/events/event-bus.interface.js +1 -2
- package/dist/interfaces/events/event-handler.interface.d.ts +1 -1
- package/dist/interfaces/events/event-handler.interface.js +1 -2
- package/dist/interfaces/events/event-id-provider.interface.d.ts +1 -1
- package/dist/interfaces/events/event-id-provider.interface.js +1 -2
- package/dist/interfaces/events/event-publisher.interface.d.ts +2 -2
- package/dist/interfaces/events/event-publisher.interface.js +1 -2
- package/dist/interfaces/events/event.interface.js +1 -2
- package/dist/interfaces/events/message-source.interface.d.ts +1 -1
- package/dist/interfaces/events/message-source.interface.js +1 -2
- package/dist/interfaces/exceptions/unhandled-exception-info.interface.d.ts +2 -2
- package/dist/interfaces/exceptions/unhandled-exception-info.interface.js +1 -2
- package/dist/interfaces/exceptions/unhandled-exception-publisher.interface.d.ts +3 -3
- package/dist/interfaces/exceptions/unhandled-exception-publisher.interface.js +1 -2
- package/dist/interfaces/index.d.ts +20 -19
- package/dist/interfaces/index.js +20 -35
- package/dist/interfaces/providers-introspection-result.interface.d.ts +4 -4
- package/dist/interfaces/providers-introspection-result.interface.js +1 -2
- package/dist/interfaces/queries/query-bus.interface.d.ts +5 -3
- package/dist/interfaces/queries/query-bus.interface.js +1 -2
- package/dist/interfaces/queries/query-handler.interface.d.ts +4 -2
- package/dist/interfaces/queries/query-handler.interface.js +1 -2
- package/dist/interfaces/queries/query-metadata.interface.js +1 -2
- package/dist/interfaces/queries/query-publisher.interface.d.ts +6 -1
- package/dist/interfaces/queries/query-publisher.interface.js +1 -2
- package/dist/interfaces/queries/query-result.interface.js +1 -2
- package/dist/interfaces/queries/query.interface.js +1 -2
- package/dist/interfaces/saga.type.d.ts +2 -2
- package/dist/interfaces/saga.type.js +1 -2
- package/dist/mixins/index.d.ts +1 -0
- package/dist/mixins/index.js +1 -0
- package/dist/mixins/with-aggregate-root.mixin.d.ts +11 -0
- package/dist/mixins/with-aggregate-root.mixin.js +67 -0
- package/dist/operators/index.d.ts +1 -1
- package/dist/operators/index.js +1 -17
- package/dist/operators/of-type.d.ts +1 -1
- package/dist/operators/of-type.js +3 -6
- package/dist/query-bus.d.ts +8 -5
- package/dist/query-bus.js +31 -31
- package/dist/scopes/async.context.js +9 -13
- package/dist/scopes/index.d.ts +1 -1
- package/dist/scopes/index.js +1 -17
- package/dist/services/explorer.service.d.ts +5 -5
- package/dist/services/explorer.service.js +14 -20
- package/dist/storages/aggregate-root.storage.d.ts +3 -3
- package/dist/storages/aggregate-root.storage.js +1 -5
- package/dist/unhandled-exception-bus.d.ts +2 -2
- package/dist/unhandled-exception-bus.js +14 -17
- package/dist/utils/index.d.ts +1 -1
- package/dist/utils/index.js +1 -17
- package/dist/utils/observable-bus.js +3 -7
- package/package.json +35 -27
- package/test/e2e/basic-flows.spec.ts +46 -26
- package/test/e2e/generics.spec.ts +3 -3
- package/test/e2e/request-scope.spec.ts +23 -22
- package/test/e2e/sync-event-handlers-app.spec.ts +123 -0
- package/test/e2e/unhandled-exceptions.spec.ts +36 -20
- package/tsconfig.build.json +3 -2
- package/vitest.config.e2e.ts +13 -0
- package/vitest.config.ts +8 -0
- package/dist/exceptions/invalid-module-ref.exception.d.ts +0 -3
- package/dist/exceptions/invalid-module-ref.exception.js +0 -8
- package/dist/helpers/default-get-event-id.d.ts +0 -9
- package/dist/helpers/default-get-event-id.js +0 -18
- package/dist/helpers/default-get-event-name.d.ts +0 -2
- package/dist/helpers/default-get-event-name.js +0 -8
- package/dist/interfaces/cqrs-options.interface.d.ts +0 -10
- package/dist/interfaces/cqrs-options.interface.js +0 -2
- package/dist/interfaces/event-observable.interface.d.ts +0 -4
- package/dist/interfaces/event-observable.interface.js +0 -2
- package/dist/utils/command-handler.decorator.d.ts +0 -3
- package/dist/utils/command-handler.decorator.js +0 -9
- package/dist/utils/constants.d.ts +0 -2
- package/dist/utils/constants.js +0 -4
- package/dist/utils/default-pubsub.d.ts +0 -9
- package/dist/utils/default-pubsub.js +0 -14
- package/dist/utils/events-handler.decorator.d.ts +0 -3
- package/dist/utils/events-handler.decorator.js +0 -9
- package/eslint.config.mjs +0 -42
- package/index.d.ts +0 -1
- package/index.js +0 -6
- package/jest.config.js +0 -9
- package/test/jest-e2e.json +0 -9
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { Test, TestingModule } from '@nestjs/testing';
|
|
2
2
|
import { take } from 'rxjs';
|
|
3
|
-
import { CommandBus, UnhandledExceptionBus } from '../../src';
|
|
4
|
-
import { AppModule } from '../src/app.module';
|
|
5
|
-
import { UnhandledExceptionCommand } from '../src/errors/commands/unhandled-exception.command';
|
|
6
|
-
import { UnhandledExceptionEvent } from '../src/errors/events/unhandled-exception.event';
|
|
3
|
+
import { CommandBus, UnhandledExceptionBus } from '../../src/index.js';
|
|
4
|
+
import { AppModule } from '../src/app.module.js';
|
|
5
|
+
import { UnhandledExceptionCommand } from '../src/errors/commands/unhandled-exception.command.js';
|
|
6
|
+
import { UnhandledExceptionEvent } from '../src/errors/events/unhandled-exception.event.js';
|
|
7
7
|
|
|
8
8
|
describe('Unhandled exceptions', () => {
|
|
9
9
|
let moduleRef: TestingModule;
|
|
@@ -36,34 +36,50 @@ describe('Unhandled exceptions', () => {
|
|
|
36
36
|
});
|
|
37
37
|
|
|
38
38
|
describe('when exception is thrown from event handler', () => {
|
|
39
|
-
it('should forward exception to UnhandledExceptionBus', (
|
|
39
|
+
it('should forward exception to UnhandledExceptionBus', async () => {
|
|
40
40
|
const command = new UnhandledExceptionCommand('event');
|
|
41
41
|
const commandBus = moduleRef.get(CommandBus);
|
|
42
42
|
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
const exceptionPromise = new Promise<void>((resolve, reject) => {
|
|
44
|
+
unhandledExceptionBus.pipe(take(1)).subscribe((exceptionInfo) => {
|
|
45
|
+
try {
|
|
46
|
+
expect(exceptionInfo.exception).toEqual(
|
|
47
|
+
new Error(`Unhandled exception in ${command.failAt}`),
|
|
48
|
+
);
|
|
49
|
+
expect(exceptionInfo.cause).toBeInstanceOf(UnhandledExceptionEvent);
|
|
50
|
+
resolve();
|
|
51
|
+
} catch (err) {
|
|
52
|
+
reject(err);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
commandBus.execute(command).catch((err) => reject(err));
|
|
49
56
|
});
|
|
50
|
-
|
|
57
|
+
|
|
58
|
+
await exceptionPromise;
|
|
51
59
|
});
|
|
52
60
|
});
|
|
53
61
|
|
|
54
62
|
describe('when exception is thrown from saga', () => {
|
|
55
|
-
it('should forward exception to UnhandledExceptionBus', (
|
|
63
|
+
it('should forward exception to UnhandledExceptionBus', async () => {
|
|
56
64
|
const command = new UnhandledExceptionCommand('saga');
|
|
57
65
|
const commandBus = moduleRef.get(CommandBus);
|
|
58
66
|
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
67
|
+
const exceptionPromise = new Promise<void>((resolve, reject) => {
|
|
68
|
+
unhandledExceptionBus.pipe(take(1)).subscribe((exceptionInfo) => {
|
|
69
|
+
try {
|
|
70
|
+
expect(exceptionInfo.exception).toEqual(
|
|
71
|
+
new Error(`Unhandled exception in ${command.failAt}`),
|
|
72
|
+
);
|
|
73
|
+
expect(exceptionInfo.cause).toEqual('onError');
|
|
74
|
+
resolve();
|
|
75
|
+
} catch (err) {
|
|
76
|
+
reject(err);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
commandBus.execute(command).catch((err) => reject(err));
|
|
65
80
|
});
|
|
66
|
-
|
|
81
|
+
|
|
82
|
+
await exceptionPromise;
|
|
67
83
|
});
|
|
68
84
|
});
|
|
69
85
|
|
package/tsconfig.build.json
CHANGED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { defineConfig } from 'vitest/config';
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
oxc: {
|
|
5
|
+
transform: { decorators: { legacy: true, emitDecoratorMetadata: true } },
|
|
6
|
+
},
|
|
7
|
+
test: {
|
|
8
|
+
globals: true,
|
|
9
|
+
environment: 'node',
|
|
10
|
+
include: ['test/e2e/**/*.spec.ts'],
|
|
11
|
+
fileParallelism: false,
|
|
12
|
+
},
|
|
13
|
+
});
|
package/vitest.config.ts
ADDED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
class InvalidModuleRefException extends Error {
|
|
4
|
-
constructor() {
|
|
5
|
-
super(`Invalid ModuleRef exception. Remember to set module reference "setModuleRef()".`);
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
exports.InvalidModuleRefException = InvalidModuleRefException;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { IEvent } from '../interfaces';
|
|
2
|
-
import { Type } from '@nestjs/common';
|
|
3
|
-
/**
|
|
4
|
-
* Null if the published class is not connected to any handler
|
|
5
|
-
* @param event
|
|
6
|
-
* @returns
|
|
7
|
-
*/
|
|
8
|
-
export declare const defaultGetEventId: <EventBase extends IEvent = IEvent>(event: EventBase) => string;
|
|
9
|
-
export declare const defaultReflectEventId: <EventBase extends Type<IEvent> = Type<IEvent>>(event: EventBase) => string;
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.defaultReflectEventId = exports.defaultGetEventId = void 0;
|
|
4
|
-
const constants_1 = require("../decorators/constants");
|
|
5
|
-
/**
|
|
6
|
-
* Null if the published class is not connected to any handler
|
|
7
|
-
* @param event
|
|
8
|
-
* @returns
|
|
9
|
-
*/
|
|
10
|
-
const defaultGetEventId = (event) => {
|
|
11
|
-
const { constructor } = Object.getPrototypeOf(event);
|
|
12
|
-
return Reflect.getMetadata(constants_1.EVENT_METADATA, constructor)?.id ?? null;
|
|
13
|
-
};
|
|
14
|
-
exports.defaultGetEventId = defaultGetEventId;
|
|
15
|
-
const defaultReflectEventId = (event) => {
|
|
16
|
-
return Reflect.getMetadata(constants_1.EVENT_METADATA, event).id;
|
|
17
|
-
};
|
|
18
|
-
exports.defaultReflectEventId = defaultReflectEventId;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.defaultGetEventName = void 0;
|
|
4
|
-
const defaultGetEventName = (event) => {
|
|
5
|
-
const { constructor } = Object.getPrototypeOf(event);
|
|
6
|
-
return constructor.name;
|
|
7
|
-
};
|
|
8
|
-
exports.defaultGetEventName = defaultGetEventName;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { Type } from '@nestjs/common';
|
|
2
|
-
import { ICommandHandler } from './commands/command-handler.interface';
|
|
3
|
-
import { IEventHandler } from './events/event-handler.interface';
|
|
4
|
-
import { IQueryHandler } from './queries/query-handler.interface';
|
|
5
|
-
export interface CqrsOptions {
|
|
6
|
-
events?: Type<IEventHandler>[];
|
|
7
|
-
queries?: Type<IQueryHandler>[];
|
|
8
|
-
commands?: Type<ICommandHandler>[];
|
|
9
|
-
sagas?: Type<any>[];
|
|
10
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
require("reflect-metadata");
|
|
4
|
-
const constants_1 = require("./constants");
|
|
5
|
-
exports.CommandHandler = (command) => {
|
|
6
|
-
return (target) => {
|
|
7
|
-
Reflect.defineMetadata(constants_1.COMMAND_HANDLER_METADATA, command, target);
|
|
8
|
-
};
|
|
9
|
-
};
|
package/dist/utils/constants.js
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { Subject } from 'rxjs';
|
|
2
|
-
import { IEvent } from '../interfaces';
|
|
3
|
-
import { IEventPublisher } from '../interfaces/events/event-publisher.interface';
|
|
4
|
-
import { IMessageSource } from '../interfaces/events/message-source.interface';
|
|
5
|
-
export declare class DefaultPubSub implements IEventPublisher, IMessageSource {
|
|
6
|
-
private subject$;
|
|
7
|
-
publish<T extends IEvent>(event: T): void;
|
|
8
|
-
bridgeEventsTo<T extends IEvent>(subject: Subject<T>): void;
|
|
9
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
class DefaultPubSub {
|
|
4
|
-
publish(event) {
|
|
5
|
-
if (!this.subject$) {
|
|
6
|
-
throw new Error('Invalid underlying subject (call bridgeEventsTo())');
|
|
7
|
-
}
|
|
8
|
-
this.subject$.next(event);
|
|
9
|
-
}
|
|
10
|
-
bridgeEventsTo(subject) {
|
|
11
|
-
this.subject$ = subject;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
exports.DefaultPubSub = DefaultPubSub;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
require("reflect-metadata");
|
|
4
|
-
const constants_1 = require("./constants");
|
|
5
|
-
exports.EventsHandler = (...events) => {
|
|
6
|
-
return (target) => {
|
|
7
|
-
Reflect.defineMetadata(constants_1.EVENTS_HANDLER_METADATA, events, target);
|
|
8
|
-
};
|
|
9
|
-
};
|
package/eslint.config.mjs
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
// @ts-check
|
|
2
|
-
import eslint from '@eslint/js';
|
|
3
|
-
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
|
|
4
|
-
import globals from 'globals';
|
|
5
|
-
import tseslint from 'typescript-eslint';
|
|
6
|
-
|
|
7
|
-
export default tseslint.config(
|
|
8
|
-
{
|
|
9
|
-
ignores: ['tests/**'],
|
|
10
|
-
},
|
|
11
|
-
eslint.configs.recommended,
|
|
12
|
-
...tseslint.configs.recommendedTypeChecked,
|
|
13
|
-
eslintPluginPrettierRecommended,
|
|
14
|
-
{
|
|
15
|
-
languageOptions: {
|
|
16
|
-
globals: {
|
|
17
|
-
...globals.node,
|
|
18
|
-
...globals.jest,
|
|
19
|
-
},
|
|
20
|
-
ecmaVersion: 5,
|
|
21
|
-
sourceType: 'module',
|
|
22
|
-
parserOptions: {
|
|
23
|
-
projectService: true,
|
|
24
|
-
tsconfigRootDir: import.meta.dirname,
|
|
25
|
-
},
|
|
26
|
-
},
|
|
27
|
-
},
|
|
28
|
-
{
|
|
29
|
-
rules: {
|
|
30
|
-
'@typescript-eslint/no-explicit-any': 'off',
|
|
31
|
-
'@typescript-eslint/no-unsafe-assignment': 'off',
|
|
32
|
-
'@typescript-eslint/no-unsafe-call': 'off',
|
|
33
|
-
'@typescript-eslint/no-unsafe-member-access': 'off',
|
|
34
|
-
'@typescript-eslint/no-unsafe-function-type': 'off',
|
|
35
|
-
'@typescript-eslint/no-unsafe-argument': 'off',
|
|
36
|
-
'@typescript-eslint/no-unsafe-return': 'off',
|
|
37
|
-
'@typescript-eslint/require-await': 'warn',
|
|
38
|
-
'@typescript-eslint/no-unused-expressions': 'warn',
|
|
39
|
-
'@typescript-eslint/no-empty-object-type': 'off',
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
);
|
package/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from './dist';
|
package/index.js
DELETED
package/jest.config.js
DELETED