@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.
Files changed (157) hide show
  1. package/.circleci/config.yml +3 -3
  2. package/.nvmrc +1 -0
  3. package/README.md +0 -1
  4. package/dist/aggregate-root.d.ts +3 -67
  5. package/dist/aggregate-root.js +6 -83
  6. package/dist/classes/command.d.ts +2 -2
  7. package/dist/classes/command.js +2 -6
  8. package/dist/classes/constants.js +1 -4
  9. package/dist/classes/index.d.ts +2 -2
  10. package/dist/classes/index.js +2 -18
  11. package/dist/classes/query.d.ts +2 -2
  12. package/dist/classes/query.js +2 -6
  13. package/dist/command-bus.d.ts +8 -5
  14. package/dist/command-bus.js +32 -32
  15. package/dist/constants.js +1 -4
  16. package/dist/cqrs.module.d.ts +8 -5
  17. package/dist/cqrs.module.js +37 -37
  18. package/dist/decorators/command-handler.decorator.d.ts +3 -1
  19. package/dist/decorators/command-handler.decorator.js +11 -13
  20. package/dist/decorators/constants.js +7 -10
  21. package/dist/decorators/events-handler.decorator.d.ts +3 -1
  22. package/dist/decorators/events-handler.decorator.js +12 -14
  23. package/dist/decorators/index.d.ts +5 -5
  24. package/dist/decorators/index.js +5 -21
  25. package/dist/decorators/publishable.decorator.d.ts +2 -0
  26. package/dist/decorators/publishable.decorator.js +5 -6
  27. package/dist/decorators/query-handler.decorator.d.ts +3 -1
  28. package/dist/decorators/query-handler.decorator.js +11 -13
  29. package/dist/decorators/saga.decorator.d.ts +2 -0
  30. package/dist/decorators/saga.decorator.js +7 -9
  31. package/dist/event-bus.d.ts +13 -8
  32. package/dist/event-bus.js +54 -51
  33. package/dist/event-publisher.d.ts +9 -7
  34. package/dist/event-publisher.js +10 -10
  35. package/dist/exceptions/command-not-found.exception.d.ts +3 -0
  36. package/dist/exceptions/command-not-found.exception.js +4 -5
  37. package/dist/exceptions/index.d.ts +7 -7
  38. package/dist/exceptions/index.js +7 -23
  39. package/dist/exceptions/invalid-command-handler.exception.d.ts +3 -0
  40. package/dist/exceptions/invalid-command-handler.exception.js +4 -5
  41. package/dist/exceptions/invalid-events-handler.exception.d.ts +3 -0
  42. package/dist/exceptions/invalid-events-handler.exception.js +4 -5
  43. package/dist/exceptions/invalid-query-handler.exception.js +1 -5
  44. package/dist/exceptions/invalid-saga.exception.d.ts +3 -0
  45. package/dist/exceptions/invalid-saga.exception.js +4 -5
  46. package/dist/exceptions/query-not-found.exception.d.ts +3 -0
  47. package/dist/exceptions/query-not-found.exception.js +4 -5
  48. package/dist/exceptions/unsupported-saga-scope.exception.d.ts +3 -0
  49. package/dist/exceptions/unsupported-saga-scope.exception.js +4 -5
  50. package/dist/helpers/default-command-pubsub.d.ts +1 -1
  51. package/dist/helpers/default-command-pubsub.js +1 -5
  52. package/dist/helpers/default-event-id-provider.d.ts +1 -1
  53. package/dist/helpers/default-event-id-provider.js +3 -6
  54. package/dist/helpers/default-pubsub.d.ts +1 -1
  55. package/dist/helpers/default-pubsub.js +1 -5
  56. package/dist/helpers/default-query-pubsub.d.ts +1 -1
  57. package/dist/helpers/default-query-pubsub.js +1 -5
  58. package/dist/helpers/default-unhandled-exception-pubsub.d.ts +1 -1
  59. package/dist/helpers/default-unhandled-exception-pubsub.js +1 -5
  60. package/dist/index.d.ts +15 -14
  61. package/dist/index.js +15 -30
  62. package/dist/interfaces/aggregate-root.interface.d.ts +53 -0
  63. package/dist/interfaces/aggregate-root.interface.js +1 -0
  64. package/dist/interfaces/commands/command-bus.interface.d.ts +5 -3
  65. package/dist/interfaces/commands/command-bus.interface.js +1 -2
  66. package/dist/interfaces/commands/command-handler.interface.d.ts +4 -2
  67. package/dist/interfaces/commands/command-handler.interface.js +1 -2
  68. package/dist/interfaces/commands/command-metadata.interface.js +1 -2
  69. package/dist/interfaces/commands/command-publisher.interface.d.ts +6 -1
  70. package/dist/interfaces/commands/command-publisher.interface.js +1 -2
  71. package/dist/interfaces/commands/command.interface.js +1 -2
  72. package/dist/interfaces/cqrs-module-options.interface.d.ts +17 -5
  73. package/dist/interfaces/cqrs-module-options.interface.js +1 -2
  74. package/dist/interfaces/events/event-bus.interface.d.ts +2 -2
  75. package/dist/interfaces/events/event-bus.interface.js +1 -2
  76. package/dist/interfaces/events/event-handler.interface.d.ts +1 -1
  77. package/dist/interfaces/events/event-handler.interface.js +1 -2
  78. package/dist/interfaces/events/event-id-provider.interface.d.ts +1 -1
  79. package/dist/interfaces/events/event-id-provider.interface.js +1 -2
  80. package/dist/interfaces/events/event-publisher.interface.d.ts +2 -2
  81. package/dist/interfaces/events/event-publisher.interface.js +1 -2
  82. package/dist/interfaces/events/event.interface.js +1 -2
  83. package/dist/interfaces/events/message-source.interface.d.ts +1 -1
  84. package/dist/interfaces/events/message-source.interface.js +1 -2
  85. package/dist/interfaces/exceptions/unhandled-exception-info.interface.d.ts +2 -2
  86. package/dist/interfaces/exceptions/unhandled-exception-info.interface.js +1 -2
  87. package/dist/interfaces/exceptions/unhandled-exception-publisher.interface.d.ts +3 -3
  88. package/dist/interfaces/exceptions/unhandled-exception-publisher.interface.js +1 -2
  89. package/dist/interfaces/index.d.ts +20 -19
  90. package/dist/interfaces/index.js +20 -35
  91. package/dist/interfaces/providers-introspection-result.interface.d.ts +4 -4
  92. package/dist/interfaces/providers-introspection-result.interface.js +1 -2
  93. package/dist/interfaces/queries/query-bus.interface.d.ts +5 -3
  94. package/dist/interfaces/queries/query-bus.interface.js +1 -2
  95. package/dist/interfaces/queries/query-handler.interface.d.ts +4 -2
  96. package/dist/interfaces/queries/query-handler.interface.js +1 -2
  97. package/dist/interfaces/queries/query-metadata.interface.js +1 -2
  98. package/dist/interfaces/queries/query-publisher.interface.d.ts +6 -1
  99. package/dist/interfaces/queries/query-publisher.interface.js +1 -2
  100. package/dist/interfaces/queries/query-result.interface.js +1 -2
  101. package/dist/interfaces/queries/query.interface.js +1 -2
  102. package/dist/interfaces/saga.type.d.ts +2 -2
  103. package/dist/interfaces/saga.type.js +1 -2
  104. package/dist/mixins/index.d.ts +1 -0
  105. package/dist/mixins/index.js +1 -0
  106. package/dist/mixins/with-aggregate-root.mixin.d.ts +11 -0
  107. package/dist/mixins/with-aggregate-root.mixin.js +67 -0
  108. package/dist/operators/index.d.ts +1 -1
  109. package/dist/operators/index.js +1 -17
  110. package/dist/operators/of-type.d.ts +1 -1
  111. package/dist/operators/of-type.js +3 -6
  112. package/dist/query-bus.d.ts +8 -5
  113. package/dist/query-bus.js +31 -31
  114. package/dist/scopes/async.context.js +9 -13
  115. package/dist/scopes/index.d.ts +1 -1
  116. package/dist/scopes/index.js +1 -17
  117. package/dist/services/explorer.service.d.ts +5 -5
  118. package/dist/services/explorer.service.js +14 -20
  119. package/dist/storages/aggregate-root.storage.d.ts +3 -3
  120. package/dist/storages/aggregate-root.storage.js +1 -5
  121. package/dist/unhandled-exception-bus.d.ts +2 -2
  122. package/dist/unhandled-exception-bus.js +14 -17
  123. package/dist/utils/index.d.ts +1 -1
  124. package/dist/utils/index.js +1 -17
  125. package/dist/utils/observable-bus.js +3 -7
  126. package/package.json +35 -27
  127. package/test/e2e/basic-flows.spec.ts +46 -26
  128. package/test/e2e/generics.spec.ts +3 -3
  129. package/test/e2e/request-scope.spec.ts +23 -22
  130. package/test/e2e/sync-event-handlers-app.spec.ts +123 -0
  131. package/test/e2e/unhandled-exceptions.spec.ts +36 -20
  132. package/tsconfig.build.json +3 -2
  133. package/vitest.config.e2e.ts +13 -0
  134. package/vitest.config.ts +8 -0
  135. package/dist/exceptions/invalid-module-ref.exception.d.ts +0 -3
  136. package/dist/exceptions/invalid-module-ref.exception.js +0 -8
  137. package/dist/helpers/default-get-event-id.d.ts +0 -9
  138. package/dist/helpers/default-get-event-id.js +0 -18
  139. package/dist/helpers/default-get-event-name.d.ts +0 -2
  140. package/dist/helpers/default-get-event-name.js +0 -8
  141. package/dist/interfaces/cqrs-options.interface.d.ts +0 -10
  142. package/dist/interfaces/cqrs-options.interface.js +0 -2
  143. package/dist/interfaces/event-observable.interface.d.ts +0 -4
  144. package/dist/interfaces/event-observable.interface.js +0 -2
  145. package/dist/utils/command-handler.decorator.d.ts +0 -3
  146. package/dist/utils/command-handler.decorator.js +0 -9
  147. package/dist/utils/constants.d.ts +0 -2
  148. package/dist/utils/constants.js +0 -4
  149. package/dist/utils/default-pubsub.d.ts +0 -9
  150. package/dist/utils/default-pubsub.js +0 -14
  151. package/dist/utils/events-handler.decorator.d.ts +0 -3
  152. package/dist/utils/events-handler.decorator.js +0 -9
  153. package/eslint.config.mjs +0 -42
  154. package/index.d.ts +0 -1
  155. package/index.js +0 -6
  156. package/jest.config.js +0 -9
  157. 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', (done) => {
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
- unhandledExceptionBus.pipe(take(1)).subscribe((exceptionInfo) => {
44
- expect(exceptionInfo.exception).toEqual(
45
- new Error(`Unhandled exception in ${command.failAt}`),
46
- );
47
- expect(exceptionInfo.cause).toBeInstanceOf(UnhandledExceptionEvent);
48
- done();
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
- commandBus.execute(command).catch((err) => done(err));
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', (done) => {
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
- unhandledExceptionBus.pipe(take(1)).subscribe((exceptionInfo) => {
60
- expect(exceptionInfo.exception).toEqual(
61
- new Error(`Unhandled exception in ${command.failAt}`),
62
- );
63
- expect(exceptionInfo.cause).toEqual('onError');
64
- done();
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
- commandBus.execute(command).catch((err) => done(err));
81
+
82
+ await exceptionPromise;
67
83
  });
68
84
  });
69
85
 
@@ -2,10 +2,11 @@
2
2
  "extends": "./tsconfig.json",
3
3
  "compilerOptions": {
4
4
  "outDir": "./dist",
5
- "rootDir": "./src"
5
+ "rootDir": "./src",
6
+ "types": ["node"]
6
7
  },
7
8
  "include": [
8
- "src/**/*",
9
+ "src/**/*"
9
10
  ],
10
11
  "exclude": [
11
12
  "node_modules",
@@ -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
+ });
@@ -0,0 +1,8 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ oxc: {
5
+ transform: { decorators: { legacy: true, emitDecoratorMetadata: true } },
6
+ },
7
+ test: { globals: true, environment: 'node', include: ['src/**/*.spec.ts'] },
8
+ });
@@ -1,3 +0,0 @@
1
- export declare class InvalidModuleRefException extends Error {
2
- constructor();
3
- }
@@ -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,2 +0,0 @@
1
- import { IEvent } from '../interfaces';
2
- export declare const defaultGetEventName: <EventBase extends IEvent = IEvent>(event: EventBase) => string;
@@ -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,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,4 +0,0 @@
1
- import { Observable } from 'rxjs';
2
- export interface EventObservable<T> {
3
- ofType(...events: any[]): Observable<T>;
4
- }
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,3 +0,0 @@
1
- import 'reflect-metadata';
2
- import { ICommand } from '../index';
3
- export declare const CommandHandler: (command: ICommand) => ClassDecorator;
@@ -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
- };
@@ -1,2 +0,0 @@
1
- export declare const COMMAND_HANDLER_METADATA = '__commandHandler__';
2
- export declare const EVENTS_HANDLER_METADATA = '__eventsHandler';
@@ -1,4 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.COMMAND_HANDLER_METADATA = '__commandHandler__';
4
- exports.EVENTS_HANDLER_METADATA = '__eventsHandler';
@@ -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,3 +0,0 @@
1
- import 'reflect-metadata';
2
- import { IEvent } from '../index';
3
- export declare const EventsHandler: (...events: IEvent[]) => ClassDecorator;
@@ -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
@@ -1,6 +0,0 @@
1
- "use strict";
2
- function __export(m) {
3
- for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
4
- }
5
- exports.__esModule = true;
6
- __export(require("./dist"));
package/jest.config.js DELETED
@@ -1,9 +0,0 @@
1
- module.exports = {
2
- preset: 'ts-jest',
3
- testEnvironment: 'node',
4
- rootDir: '.',
5
- testMatch: ['<rootDir>/src/**/*.spec.ts'],
6
- transform: {
7
- '^.+\\.ts$': 'ts-jest'
8
- },
9
- };
@@ -1,9 +0,0 @@
1
- {
2
- "moduleFileExtensions": ["js", "json", "ts"],
3
- "rootDir": ".",
4
- "testEnvironment": "node",
5
- "testRegex": ".spec.ts$",
6
- "transform": {
7
- "^.+\\.(t|j)s$": ["ts-jest", { "tsconfig": "./test/tsconfig.json" }]
8
- }
9
- }