@jdevel/tnest 0.0.4 → 0.0.6
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 +46 -11
- package/dist/contracts/__tests__/contract-types.spec.js +11 -0
- package/dist/contracts/__tests__/contract-types.spec.js.map +1 -1
- package/dist/contracts/index.d.ts +1 -1
- package/dist/contracts/utility-types.d.ts +5 -0
- package/dist/handlers/__tests__/typed-event-pattern.spec.js +6 -5
- package/dist/handlers/__tests__/typed-event-pattern.spec.js.map +1 -1
- package/dist/handlers/__tests__/typed-message-pattern.spec.js +9 -8
- package/dist/handlers/__tests__/typed-message-pattern.spec.js.map +1 -1
- package/dist/handlers/typed-event-pattern.decorator.d.ts +1 -1
- package/dist/handlers/typed-event-pattern.decorator.js +4 -2
- package/dist/handlers/typed-event-pattern.decorator.js.map +1 -1
- package/dist/handlers/typed-message-pattern.decorator.d.ts +1 -1
- package/dist/handlers/typed-message-pattern.decorator.js +4 -2
- package/dist/handlers/typed-message-pattern.decorator.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -259,24 +259,24 @@ this.users.send('user.created', { userId: '1', email: 'a@b.com' });
|
|
|
259
259
|
// ~~~~~~~~~~~~~~ ERROR: 'user.created' is an event, use emit()
|
|
260
260
|
```
|
|
261
261
|
|
|
262
|
-
|
|
262
|
+
The typed handler decorators also catch handler signature mismatches:
|
|
263
263
|
|
|
264
264
|
```ts
|
|
265
|
-
|
|
265
|
+
const MessagePattern = TypedMessagePattern<UserContracts>();
|
|
266
|
+
|
|
267
|
+
@MessagePattern('user.create')
|
|
266
268
|
async create(payload: { wrong: number }) {
|
|
267
269
|
// ~~~~~~~~~~~~~~~~ ERROR: expects { email: string; name: string }
|
|
268
270
|
return { id: '1' };
|
|
269
271
|
}
|
|
270
272
|
|
|
271
|
-
@
|
|
273
|
+
@MessagePattern('user.get')
|
|
272
274
|
async get(payload: { id: string }): Promise<{ wrong: boolean }> {
|
|
273
275
|
// ~~~~~~~~~~~~~~~~~ ERROR: must return User
|
|
274
276
|
return { wrong: true };
|
|
275
277
|
}
|
|
276
278
|
```
|
|
277
279
|
|
|
278
|
-
> **Note:** Omitting the second type parameter preserves the existing behavior — the decorator validates the pattern string but does not constrain the method signature.
|
|
279
|
-
|
|
280
280
|
### 4. Handle messages (consumer)
|
|
281
281
|
|
|
282
282
|
#### Using decorators
|
|
@@ -287,21 +287,24 @@ import { Controller } from '@nestjs/common';
|
|
|
287
287
|
import { TypedMessagePattern, TypedEventPattern } from '@jdevel/tnest';
|
|
288
288
|
import type { UserContracts } from './contracts/user.contracts';
|
|
289
289
|
|
|
290
|
+
// Bind the registry type once — pattern is specified only at the call site
|
|
291
|
+
const MessagePattern = TypedMessagePattern<UserContracts>();
|
|
292
|
+
const EventPattern = TypedEventPattern<UserContracts>();
|
|
293
|
+
|
|
290
294
|
@Controller()
|
|
291
295
|
export class UserController {
|
|
292
|
-
//
|
|
293
|
-
|
|
294
|
-
@TypedMessagePattern<UserContracts, 'user.create'>('user.create')
|
|
296
|
+
// The compiler enforces that payload and return type match the contract
|
|
297
|
+
@MessagePattern('user.create')
|
|
295
298
|
async create(payload: { email: string; name: string }) {
|
|
296
299
|
return { id: crypto.randomUUID(), ...payload };
|
|
297
300
|
}
|
|
298
301
|
|
|
299
|
-
@
|
|
302
|
+
@MessagePattern('user.get')
|
|
300
303
|
async get(payload: { id: string }) {
|
|
301
304
|
return { id: payload.id, email: 'user@example.com', name: 'Example' };
|
|
302
305
|
}
|
|
303
306
|
|
|
304
|
-
@
|
|
307
|
+
@EventPattern('user.created')
|
|
305
308
|
async handleCreated(payload: { userId: string; email: string }) {
|
|
306
309
|
console.log(`User created: ${payload.userId}`);
|
|
307
310
|
}
|
|
@@ -414,7 +417,9 @@ class ZodValidator implements ContractValidator {
|
|
|
414
417
|
{ provide: CONTRACT_VALIDATOR, useClass: ZodValidator }
|
|
415
418
|
|
|
416
419
|
// Apply to handlers — validation runs before the handler method
|
|
417
|
-
|
|
420
|
+
const MessagePattern = TypedMessagePattern<UserContracts>();
|
|
421
|
+
|
|
422
|
+
@MessagePattern('user.create')
|
|
418
423
|
@ValidateContract()
|
|
419
424
|
async create(payload: CreateUserDto) {
|
|
420
425
|
// payload has been validated at runtime
|
|
@@ -451,6 +456,34 @@ class MsgpackSerializer implements PayloadSerializer, PayloadDeserializer {
|
|
|
451
456
|
|
|
452
457
|
A `DefaultPayloadSerializer` (pass-through) is included and used when no custom serializer is registered.
|
|
453
458
|
|
|
459
|
+
## Wrapping Responses with HTTP Status
|
|
460
|
+
|
|
461
|
+
Use the `HttpResponse<T>` utility type to wrap command or query responses with an `HttpStatus` code from `@nestjs/common`:
|
|
462
|
+
|
|
463
|
+
```ts
|
|
464
|
+
import { defineRegistry, command, query } from '@jdevel/tnest';
|
|
465
|
+
import type { HttpResponse } from '@jdevel/tnest';
|
|
466
|
+
|
|
467
|
+
export const userContracts = defineRegistry({
|
|
468
|
+
'user.create': command<CreateUserDto, HttpResponse<User>>(),
|
|
469
|
+
'user.get': query<{ id: string }, HttpResponse<User>>(),
|
|
470
|
+
});
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
Handlers then return the wrapped shape:
|
|
474
|
+
|
|
475
|
+
```ts
|
|
476
|
+
import { HttpStatus } from '@nestjs/common';
|
|
477
|
+
|
|
478
|
+
@MessagePattern('user.create')
|
|
479
|
+
async create(payload: { email: string; name: string }) {
|
|
480
|
+
const user = await this.userRepo.create(payload);
|
|
481
|
+
return { status: HttpStatus.CREATED, data: user };
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
The response type is `{ status: HttpStatus; data: T }`.
|
|
486
|
+
|
|
454
487
|
## Utility Types
|
|
455
488
|
|
|
456
489
|
Extract type information from your contract registry:
|
|
@@ -460,6 +493,7 @@ import type {
|
|
|
460
493
|
PatternOf,
|
|
461
494
|
PayloadOf,
|
|
462
495
|
ResponseOf,
|
|
496
|
+
HttpResponse,
|
|
463
497
|
CommandPatterns,
|
|
464
498
|
EventPatterns,
|
|
465
499
|
QueryPatterns,
|
|
@@ -509,6 +543,7 @@ type Validated = ValidateRegistry<UserContracts>;
|
|
|
509
543
|
| `Command` / `Event` / `Query` | Type | Contract type interfaces |
|
|
510
544
|
| `ContractRegistry` | Type | Base type for a registry of contracts |
|
|
511
545
|
| `ValidateRegistry` | Type | Validates registry keys match contract patterns |
|
|
546
|
+
| `HttpResponse` | Type | Wraps a response with `HttpStatus` |
|
|
512
547
|
| `PayloadOf` / `ResponseOf` / `PatternOf` | Type | Extract parts of a contract |
|
|
513
548
|
| `CommandsOf` / `EventsOf` / `QueriesOf` | Type | Filter registry by contract kind |
|
|
514
549
|
| `CommandPatterns` / `EventPatterns` / `QueryPatterns` | Type | Pattern string unions by kind |
|
|
@@ -81,6 +81,17 @@ describe('ValidateRegistry', () => {
|
|
|
81
81
|
(0, expect_type_1.expectTypeOf)().toEqualTypeOf();
|
|
82
82
|
});
|
|
83
83
|
});
|
|
84
|
+
describe('HttpResponse', () => {
|
|
85
|
+
it('wraps a type with status and data fields', () => {
|
|
86
|
+
(0, expect_type_1.expectTypeOf)().toEqualTypeOf();
|
|
87
|
+
});
|
|
88
|
+
it('works as a command response type', () => {
|
|
89
|
+
(0, expect_type_1.expectTypeOf)().toEqualTypeOf();
|
|
90
|
+
});
|
|
91
|
+
it('works as a query response type', () => {
|
|
92
|
+
(0, expect_type_1.expectTypeOf)().toEqualTypeOf();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
84
95
|
describe('AnyContract', () => {
|
|
85
96
|
it('accepts Command, Event, and Query', () => {
|
|
86
97
|
(0, expect_type_1.expectTypeOf)().toExtend();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-types.spec.js","sourceRoot":"","sources":["../../../src/contracts/__tests__/contract-types.spec.ts"],"names":[],"mappings":";;AAAA,6CAA2C;
|
|
1
|
+
{"version":3,"file":"contract-types.spec.js","sourceRoot":"","sources":["../../../src/contracts/__tests__/contract-types.spec.ts"],"names":[],"mappings":";;AAAA,6CAA2C;AA6C3C,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,IAAA,0BAAY,GAAmC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAA,0BAAY,GAA6C,CAAC,aAAa,EAAa,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,IAAA,0BAAY,GAAyB,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QAC/D,IAAA,0BAAY,GAAmC,CAAC,aAAa,EAAW,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,IAAA,0BAAY,GAAiC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACvE,IAAA,0BAAY,GAA2C,CAAC,aAAa,EAAW,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAExD,IAAA,0BAAY,GAAgB,CAAC,aAAa,EAAS,CAAC;QACpD,IAAA,0BAAY,GAAgB,CAAC,aAAa,EAAU,CAAC;QACrD,IAAA,0BAAY,GAAiB,CAAC,aAAa,EAAU,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAE3C,IAAA,0BAAY,GAAgB,CAAC,aAAa,EAAS,CAAC;QACpD,IAAA,0BAAY,GAAgB,CAAC,aAAa,EAAU,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QAEtD,IAAA,0BAAY,GAAgB,CAAC,aAAa,EAAS,CAAC;QACpD,IAAA,0BAAY,GAAgB,CAAC,aAAa,EAAU,CAAC;QACrD,IAAA,0BAAY,GAAiB,CAAC,aAAa,EAAU,CAAC;IACxD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,IAAA,0BAAY,GAA2C,CAAC,aAAa,EAAO,CAAC;QAC7E,IAAA,0BAAY,GAAiC,CAAC,aAAa,EAAO,CAAC;QACnE,IAAA,0BAAY,GAA0C,CAAC,aAAa,EAAO,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,IAAA,0BAAY,GAA2C,CAAC,aAAa,EAAU,CAAC;QAChF,IAAA,0BAAY,GAAkC,CAAC,aAAa,EAAW,CAAC;QACxE,IAAA,0BAAY,GAA2C,CAAC,aAAa,EAAY,CAAC;IACpF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,IAAA,0BAAY,GAA4C,CAAC,aAAa,EAAU,CAAC;QACjF,IAAA,0BAAY,GAA2C,CAAC,aAAa,EAAW,CAAC;IACnF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,IAAA,0BAAY,GAAkC,CAAC,aAAa,EAAa,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAE7C,IAAA,0BAAY,GAAQ,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;QACnD,IAAA,0BAAY,GAAc,CAAC,aAAa,EAAiB,CAAC;IAC5D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAEzC,IAAA,0BAAY,GAAQ,CAAC,cAAc,CAAC,cAAc,CAAC,CAAC;QACpD,IAAA,0BAAY,GAAc,CAAC,aAAa,EAAkB,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAE3C,IAAA,0BAAY,GAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAA,0BAAY,GAAa,CAAC,aAAa,EAAc,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;QACvD,IAAA,0BAAY,GAAiC,CAAC,aAAa,EAAiB,CAAC;IAC/E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,IAAA,0BAAY,GAA+B,CAAC,aAAa,EAAkB,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,IAAA,0BAAY,GAA+B,CAAC,aAAa,EAAc,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,IAAA,0BAAY,GAAkC,CAAC,aAAa,EAA8B,CAAC;IAC7F,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAExD,IAAA,0BAAY,GAAwB,CAAC,aAAa,EAA+B,CAAC;QAClF,IAAA,0BAAY,GAAyB,CAAC,aAAa,EAAgC,CAAC;QACpF,IAAA,0BAAY,GAAqB,CAAC,aAAa,EAA4B,CAAC;IAC9E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,IAAA,0BAAY,GAAsB,CAAC,aAAa,EAAsC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAE1C,IAAA,0BAAY,GAAiB,CAAC,aAAa,EAAsB,CAAC;IACpE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QAExC,IAAA,0BAAY,GAAiB,CAAC,aAAa,EAAwB,CAAC;IACtE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,IAAA,0BAAY,GAAgC,CAAC,QAAQ,EAAe,CAAC;QACrE,IAAA,0BAAY,GAAsB,CAAC,QAAQ,EAAe,CAAC;QAC3D,IAAA,0BAAY,GAA8B,CAAC,QAAQ,EAAe,CAAC;IACrE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -3,4 +3,4 @@ export type { Event } from './event';
|
|
|
3
3
|
export type { Query } from './query';
|
|
4
4
|
export type { ValidateRegistry } from './registry';
|
|
5
5
|
export { command, event, query, defineRegistry } from './define-helpers';
|
|
6
|
-
export type { AnyContract, PatternOf, PayloadOf, ResponseOf, ContractRegistry, CommandsOf, EventsOf, QueriesOf, CommandPatterns, EventPatterns, QueryPatterns, SendablePatterns, } from './utility-types';
|
|
6
|
+
export type { AnyContract, PatternOf, PayloadOf, ResponseOf, ContractRegistry, CommandsOf, EventsOf, QueriesOf, CommandPatterns, EventPatterns, QueryPatterns, SendablePatterns, HttpResponse, } from './utility-types';
|
|
@@ -1,6 +1,11 @@
|
|
|
1
|
+
import type { HttpStatus } from '@nestjs/common';
|
|
1
2
|
import type { Command } from './command';
|
|
2
3
|
import type { Event } from './event';
|
|
3
4
|
import type { Query } from './query';
|
|
5
|
+
export interface HttpResponse<T> {
|
|
6
|
+
status: HttpStatus;
|
|
7
|
+
data: T;
|
|
8
|
+
}
|
|
4
9
|
export type AnyContract = Command<string, any, any> | Event<string, any> | Query<string, any, any>;
|
|
5
10
|
export type PatternOf<C extends AnyContract> = C['pattern'];
|
|
6
11
|
export type PayloadOf<C extends AnyContract> = C['payload'];
|
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
require("reflect-metadata");
|
|
13
13
|
const constants_1 = require("@nestjs/microservices/constants");
|
|
14
14
|
const typed_event_pattern_decorator_1 = require("../typed-event-pattern.decorator");
|
|
15
|
+
const EventPatternDecorator = (0, typed_event_pattern_decorator_1.TypedEventPattern)();
|
|
15
16
|
describe('TypedEventPattern', () => {
|
|
16
17
|
it('applies @EventPattern metadata with the given pattern', () => {
|
|
17
18
|
class TestHandler {
|
|
@@ -19,7 +20,7 @@ describe('TypedEventPattern', () => {
|
|
|
19
20
|
}
|
|
20
21
|
}
|
|
21
22
|
__decorate([
|
|
22
|
-
(
|
|
23
|
+
EventPatternDecorator('user.created'),
|
|
23
24
|
__metadata("design:type", Function),
|
|
24
25
|
__metadata("design:paramtypes", [Object]),
|
|
25
26
|
__metadata("design:returntype", void 0)
|
|
@@ -29,13 +30,13 @@ describe('TypedEventPattern', () => {
|
|
|
29
30
|
expect(metadata).toEqual(['user.created']);
|
|
30
31
|
expect(handlerType).toBe(2);
|
|
31
32
|
});
|
|
32
|
-
it('enforces method signature
|
|
33
|
+
it('enforces method signature', () => {
|
|
33
34
|
class TestHandler {
|
|
34
35
|
handle(_payload) {
|
|
35
36
|
}
|
|
36
37
|
}
|
|
37
38
|
__decorate([
|
|
38
|
-
(
|
|
39
|
+
EventPatternDecorator('user.created'),
|
|
39
40
|
__metadata("design:type", Function),
|
|
40
41
|
__metadata("design:paramtypes", [Object]),
|
|
41
42
|
__metadata("design:returntype", void 0)
|
|
@@ -43,13 +44,13 @@ describe('TypedEventPattern', () => {
|
|
|
43
44
|
const metadata = Reflect.getMetadata(constants_1.PATTERN_METADATA, TestHandler.prototype.handle);
|
|
44
45
|
expect(metadata).toEqual(['user.created']);
|
|
45
46
|
});
|
|
46
|
-
it('enforces async method signature
|
|
47
|
+
it('enforces async method signature', () => {
|
|
47
48
|
class TestHandler {
|
|
48
49
|
async handle(_payload) {
|
|
49
50
|
}
|
|
50
51
|
}
|
|
51
52
|
__decorate([
|
|
52
|
-
(
|
|
53
|
+
EventPatternDecorator('user.created'),
|
|
53
54
|
__metadata("design:type", Function),
|
|
54
55
|
__metadata("design:paramtypes", [Object]),
|
|
55
56
|
__metadata("design:returntype", Promise)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-event-pattern.spec.js","sourceRoot":"","sources":["../../../src/handlers/__tests__/typed-event-pattern.spec.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4BAA0B;AAC1B,+DAA6F;AAC7F,oFAAqE;AAQrE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,WAAW;YAEf,MAAM,CAAC,QAA4B;YAEnC,CAAC;SACF;QAHC;YADC,
|
|
1
|
+
{"version":3,"file":"typed-event-pattern.spec.js","sourceRoot":"","sources":["../../../src/handlers/__tests__/typed-event-pattern.spec.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4BAA0B;AAC1B,+DAA6F;AAC7F,oFAAqE;AAQrE,MAAM,qBAAqB,GAAG,IAAA,iDAAiB,GAAgB,CAAC;AAEhE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,WAAW;YAEf,MAAM,CAAC,QAA4B;YAEnC,CAAC;SACF;QAHC;YADC,qBAAqB,CAAC,cAAc,CAAC;;;;iDAGrC;QAIH,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,4BAAgB,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAErF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,oCAAwB,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAEhG,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,WAAW;YAEf,MAAM,CAAC,QAA4B;YAEnC,CAAC;SACF;QAHC;YADC,qBAAqB,CAAC,cAAc,CAAC;;;;iDAGrC;QAIH,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,4BAAgB,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAErF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,WAAW;YAET,AAAN,KAAK,CAAC,MAAM,CAAC,QAA4B;YAEzC,CAAC;SACF;QAHO;YADL,qBAAqB,CAAC,cAAc,CAAC;;;;iDAGrC;QAIH,MAAM,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,4BAAgB,EAAE,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAErF,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -12,6 +12,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
12
12
|
require("reflect-metadata");
|
|
13
13
|
const constants_1 = require("@nestjs/microservices/constants");
|
|
14
14
|
const typed_message_pattern_decorator_1 = require("../typed-message-pattern.decorator");
|
|
15
|
+
const MessagePattern = (0, typed_message_pattern_decorator_1.TypedMessagePattern)();
|
|
15
16
|
describe('TypedMessagePattern', () => {
|
|
16
17
|
it('applies @MessagePattern metadata with the given pattern', () => {
|
|
17
18
|
class TestHandler {
|
|
@@ -20,7 +21,7 @@ describe('TypedMessagePattern', () => {
|
|
|
20
21
|
}
|
|
21
22
|
}
|
|
22
23
|
__decorate([
|
|
23
|
-
(
|
|
24
|
+
MessagePattern('user.create'),
|
|
24
25
|
__metadata("design:type", Function),
|
|
25
26
|
__metadata("design:paramtypes", [Object]),
|
|
26
27
|
__metadata("design:returntype", Object)
|
|
@@ -37,7 +38,7 @@ describe('TypedMessagePattern', () => {
|
|
|
37
38
|
}
|
|
38
39
|
}
|
|
39
40
|
__decorate([
|
|
40
|
-
(
|
|
41
|
+
MessagePattern('user.get'),
|
|
41
42
|
__metadata("design:type", Function),
|
|
42
43
|
__metadata("design:paramtypes", [Object]),
|
|
43
44
|
__metadata("design:returntype", Object)
|
|
@@ -45,14 +46,14 @@ describe('TypedMessagePattern', () => {
|
|
|
45
46
|
const metadata = Reflect.getMetadata(constants_1.PATTERN_METADATA, TestHandler.prototype.handle);
|
|
46
47
|
expect(metadata).toEqual(['user.get']);
|
|
47
48
|
});
|
|
48
|
-
it('enforces method signature
|
|
49
|
+
it('enforces method signature for command patterns', () => {
|
|
49
50
|
class TestHandler {
|
|
50
51
|
handle(_payload) {
|
|
51
52
|
return { id: '1' };
|
|
52
53
|
}
|
|
53
54
|
}
|
|
54
55
|
__decorate([
|
|
55
|
-
(
|
|
56
|
+
MessagePattern('user.create'),
|
|
56
57
|
__metadata("design:type", Function),
|
|
57
58
|
__metadata("design:paramtypes", [Object]),
|
|
58
59
|
__metadata("design:returntype", Object)
|
|
@@ -60,14 +61,14 @@ describe('TypedMessagePattern', () => {
|
|
|
60
61
|
const metadata = Reflect.getMetadata(constants_1.PATTERN_METADATA, TestHandler.prototype.handle);
|
|
61
62
|
expect(metadata).toEqual(['user.create']);
|
|
62
63
|
});
|
|
63
|
-
it('enforces
|
|
64
|
+
it('enforces method signature for query patterns', () => {
|
|
64
65
|
class TestHandler {
|
|
65
66
|
handle(_payload) {
|
|
66
67
|
return { name: 'Alice' };
|
|
67
68
|
}
|
|
68
69
|
}
|
|
69
70
|
__decorate([
|
|
70
|
-
(
|
|
71
|
+
MessagePattern('user.get'),
|
|
71
72
|
__metadata("design:type", Function),
|
|
72
73
|
__metadata("design:paramtypes", [Object]),
|
|
73
74
|
__metadata("design:returntype", Object)
|
|
@@ -75,14 +76,14 @@ describe('TypedMessagePattern', () => {
|
|
|
75
76
|
const metadata = Reflect.getMetadata(constants_1.PATTERN_METADATA, TestHandler.prototype.handle);
|
|
76
77
|
expect(metadata).toEqual(['user.get']);
|
|
77
78
|
});
|
|
78
|
-
it('enforces async method signature
|
|
79
|
+
it('enforces async method signature', () => {
|
|
79
80
|
class TestHandler {
|
|
80
81
|
async handle(_payload) {
|
|
81
82
|
return { id: '1' };
|
|
82
83
|
}
|
|
83
84
|
}
|
|
84
85
|
__decorate([
|
|
85
|
-
(
|
|
86
|
+
MessagePattern('user.create'),
|
|
86
87
|
__metadata("design:type", Function),
|
|
87
88
|
__metadata("design:paramtypes", [Object]),
|
|
88
89
|
__metadata("design:returntype", Promise)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-message-pattern.spec.js","sourceRoot":"","sources":["../../../src/handlers/__tests__/typed-message-pattern.spec.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4BAA0B;AAC1B,+DAA6F;AAC7F,wFAAyE;AAUzE,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,WAAW;YAEf,MAAM,CAAC,QAA0B;gBAC/B,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC;YACrB,CAAC;SACF;QAHC;YADC,
|
|
1
|
+
{"version":3,"file":"typed-message-pattern.spec.js","sourceRoot":"","sources":["../../../src/handlers/__tests__/typed-message-pattern.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import type { ContractRegistry, EventPatterns, PayloadOf } from '../contracts';
|
|
2
2
|
type EventMethodDecorator<TRegistry extends ContractRegistry, P extends string & keyof TRegistry> = (target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<(data: PayloadOf<TRegistry[P]>) => void> | TypedPropertyDescriptor<(data: PayloadOf<TRegistry[P]>) => Promise<void>>) => void;
|
|
3
|
-
export declare function TypedEventPattern<TRegistry extends ContractRegistry
|
|
3
|
+
export declare function TypedEventPattern<TRegistry extends ContractRegistry>(): <P extends EventPatterns<TRegistry>>(pattern: P) => EventMethodDecorator<TRegistry, P>;
|
|
4
4
|
export {};
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TypedEventPattern = TypedEventPattern;
|
|
4
4
|
const microservices_1 = require("@nestjs/microservices");
|
|
5
|
-
function TypedEventPattern(
|
|
6
|
-
return (
|
|
5
|
+
function TypedEventPattern() {
|
|
6
|
+
return (pattern) => {
|
|
7
|
+
return (0, microservices_1.EventPattern)(pattern);
|
|
8
|
+
};
|
|
7
9
|
}
|
|
8
10
|
//# sourceMappingURL=typed-event-pattern.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-event-pattern.decorator.js","sourceRoot":"","sources":["../../src/handlers/typed-event-pattern.decorator.ts"],"names":[],"mappings":";;AAgBA,
|
|
1
|
+
{"version":3,"file":"typed-event-pattern.decorator.js","sourceRoot":"","sources":["../../src/handlers/typed-event-pattern.decorator.ts"],"names":[],"mappings":";;AAgBA,8CAKC;AArBD,yDAAqD;AAgBrD,SAAgB,iBAAiB;IAC/B,OAAO,CAAqC,OAAU,EAAsC,EAAE;QAE5F,OAAO,IAAA,4BAAY,EAAC,OAAiB,CAAQ,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Observable } from 'rxjs';
|
|
2
2
|
import type { ContractRegistry, CommandPatterns, QueryPatterns, PayloadOf, ResponseOf } from '../contracts';
|
|
3
3
|
type MessageMethodDecorator<TRegistry extends ContractRegistry, P extends string & keyof TRegistry> = (target: object, propertyKey: string | symbol, descriptor: TypedPropertyDescriptor<(data: PayloadOf<TRegistry[P]>) => ResponseOf<TRegistry[P]>> | TypedPropertyDescriptor<(data: PayloadOf<TRegistry[P]>) => Promise<ResponseOf<TRegistry[P]>>> | TypedPropertyDescriptor<(data: PayloadOf<TRegistry[P]>) => Observable<ResponseOf<TRegistry[P]>>>) => void;
|
|
4
|
-
export declare function TypedMessagePattern<TRegistry extends ContractRegistry
|
|
4
|
+
export declare function TypedMessagePattern<TRegistry extends ContractRegistry>(): <P extends CommandPatterns<TRegistry> | QueryPatterns<TRegistry>>(pattern: P) => MessageMethodDecorator<TRegistry, P>;
|
|
5
5
|
export {};
|
|
@@ -2,7 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TypedMessagePattern = TypedMessagePattern;
|
|
4
4
|
const microservices_1 = require("@nestjs/microservices");
|
|
5
|
-
function TypedMessagePattern(
|
|
6
|
-
return (
|
|
5
|
+
function TypedMessagePattern() {
|
|
6
|
+
return (pattern) => {
|
|
7
|
+
return (0, microservices_1.MessagePattern)(pattern);
|
|
8
|
+
};
|
|
7
9
|
}
|
|
8
10
|
//# sourceMappingURL=typed-message-pattern.decorator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typed-message-pattern.decorator.js","sourceRoot":"","sources":["../../src/handlers/typed-message-pattern.decorator.ts"],"names":[],"mappings":";;AA0BA,
|
|
1
|
+
{"version":3,"file":"typed-message-pattern.decorator.js","sourceRoot":"","sources":["../../src/handlers/typed-message-pattern.decorator.ts"],"names":[],"mappings":";;AA0BA,kDAOC;AAjCD,yDAAuD;AA0BvD,SAAgB,mBAAmB;IACjC,OAAO,CACL,OAAU,EAC4B,EAAE;QAExC,OAAO,IAAA,8BAAc,EAAC,OAAiB,CAAQ,CAAC;IAClD,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { TnestModule } from './tnest.module';
|
|
2
2
|
export { TNEST_OPTIONS, getClientToken } from './constants';
|
|
3
|
-
export type { Command, Event, Query, AnyContract, ContractRegistry, ValidateRegistry, PatternOf, PayloadOf, ResponseOf, CommandsOf, EventsOf, QueriesOf, CommandPatterns, EventPatterns, QueryPatterns, SendablePatterns, } from './contracts';
|
|
3
|
+
export type { Command, Event, Query, AnyContract, ContractRegistry, ValidateRegistry, PatternOf, PayloadOf, ResponseOf, CommandsOf, EventsOf, QueriesOf, CommandPatterns, EventPatterns, QueryPatterns, SendablePatterns, HttpResponse, } from './contracts';
|
|
4
4
|
export { command, event, query, defineRegistry } from './contracts';
|
|
5
5
|
export { TypedClient } from './client';
|
|
6
6
|
export { TypedClientFactory } from './client';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAGpB,yCAA4D;AAAnD,0GAAA,aAAa,OAAA;AAAE,2GAAA,cAAc,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAGpB,yCAA4D;AAAnD,0GAAA,aAAa,OAAA;AAAE,2GAAA,cAAc,OAAA;AAsBtC,yCAAoE;AAA3D,oGAAA,OAAO,OAAA;AAAE,kGAAA,KAAK,OAAA;AAAE,kGAAA,KAAK,OAAA;AAAE,2GAAA,cAAc,OAAA;AAG9C,mCAAuC;AAA9B,qGAAA,WAAW,OAAA;AACpB,mCAA8C;AAArC,4GAAA,kBAAkB,OAAA;AAG3B,uCAAiD;AAAxC,+GAAA,mBAAmB,OAAA;AAC5B,uCAA+C;AAAtC,6GAAA,iBAAiB,OAAA;AAY1B,2CAAgD;AAAvC,8GAAA,gBAAgB,OAAA;AACzB,2CAAkD;AAAzC,gHAAA,kBAAkB,OAAA;AAI3B,iDAIyB;AAHvB,yHAAA,wBAAwB,OAAA;AACxB,mHAAA,kBAAkB,OAAA;AAClB,qHAAA,oBAAoB,OAAA;AAKtB,qCAA4C;AAAnC,0GAAA,eAAe,OAAA;AACxB,qCAA+C;AAAtC,6GAAA,kBAAkB,OAAA"}
|