@crossdelta/platform-sdk 0.17.0 → 0.17.2
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 +1 -1
- package/bin/docs/generators/nest.md +1 -1
- package/bin/docs/generators/service.md +19 -15
- package/bin/templates/workspace/infra/package.json.hbs +1 -1
- package/bin/templates/workspace/packages/contracts/README.md.hbs +5 -5
- package/bin/templates/workspace/packages/contracts/package.json.hbs +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -411,7 +411,7 @@ export const OrdersCreatedContract = createContract({
|
|
|
411
411
|
**Handlers** import contracts and delegate to use cases:
|
|
412
412
|
|
|
413
413
|
```typescript
|
|
414
|
-
// services/notifications/src/events/
|
|
414
|
+
// services/notifications/src/events/order-created.handler.ts
|
|
415
415
|
import { handleEvent } from '@crossdelta/cloudevents'
|
|
416
416
|
import { OrdersCreatedContract } from '@my-platform/contracts'
|
|
417
417
|
import { sendOrderNotification } from '../use-cases/send-notification.use-case'
|
|
@@ -236,7 +236,7 @@ export const getService = <T>(serviceClass: Type<T>): T => {
|
|
|
236
236
|
|
|
237
237
|
---
|
|
238
238
|
|
|
239
|
-
## Event Handler (src/events/
|
|
239
|
+
## Event Handler (src/events/order-created.handler.ts)
|
|
240
240
|
|
|
241
241
|
**Handlers must be thin** - just log and delegate to a service:
|
|
242
242
|
|
|
@@ -96,7 +96,7 @@ cd my-platform
|
|
|
96
96
|
**What AI generates:**
|
|
97
97
|
1. **Contract** (`packages/contracts/src/events/orders/created.ts`) - With proper Zod schema in domain-grouped structure
|
|
98
98
|
2. **Service** (`services/order-processing/`) - Scaffolded via `pf new hono-micro`
|
|
99
|
-
3. **Event Handler** (`services/order-processing/src/events/
|
|
99
|
+
3. **Event Handler** (`services/order-processing/src/events/order-created.handler.ts`)
|
|
100
100
|
4. **Use-Cases** (`services/order-processing/src/use-cases/`)
|
|
101
101
|
5. **Tests** (`services/order-processing/src/use-cases/*.test.ts`)
|
|
102
102
|
|
|
@@ -110,7 +110,7 @@ pf event add order.created --service services/order-processing
|
|
|
110
110
|
```
|
|
111
111
|
|
|
112
112
|
**What `pf event add` does:**
|
|
113
|
-
- Creates `packages/contracts/src/events/orders
|
|
113
|
+
- Creates `packages/contracts/src/events/orders/created.mock.json` (test mock)
|
|
114
114
|
- Adds export to `packages/contracts/src/index.ts`
|
|
115
115
|
- Skips contract creation if already exists (AI's schema is preserved!)
|
|
116
116
|
|
|
@@ -133,6 +133,7 @@ pf new hono-micro services/order-processing
|
|
|
133
133
|
**Step 3: Register event and create handler**
|
|
134
134
|
```bash
|
|
135
135
|
pf event add order.created --service services/order-processing
|
|
136
|
+
# Creates: src/events/order-created.handler.ts (singular!)
|
|
136
137
|
```
|
|
137
138
|
|
|
138
139
|
**Step 4: Implement use-cases**
|
|
@@ -151,7 +152,7 @@ mkdir -p packages/contracts/src/events/orders
|
|
|
151
152
|
pf new hono-micro services/order-processing
|
|
152
153
|
|
|
153
154
|
# 3. Create handler manually
|
|
154
|
-
# Edit services/order-processing/src/events/
|
|
155
|
+
# Edit services/order-processing/src/events/order-created.handler.ts
|
|
155
156
|
|
|
156
157
|
# 4. Implement use-cases
|
|
157
158
|
# Edit services/order-processing/src/use-cases/
|
|
@@ -298,8 +299,8 @@ Export named 'OrderCreatedContract' not found in module 'packages/contracts/src/
|
|
|
298
299
|
```
|
|
299
300
|
✅ CORRECT:
|
|
300
301
|
services/my-service/src/events/
|
|
301
|
-
├──
|
|
302
|
-
└──
|
|
302
|
+
├── order-created.handler.ts
|
|
303
|
+
└── customer-updated.handler.ts
|
|
303
304
|
|
|
304
305
|
❌ WRONG:
|
|
305
306
|
services/my-service/src/events/handlers/ # NEVER create!
|
|
@@ -361,7 +362,7 @@ export const OrdersCreatedContract = createContract({
|
|
|
361
362
|
export * from './events/orders/created'
|
|
362
363
|
```
|
|
363
364
|
|
|
364
|
-
#### `src/events/
|
|
365
|
+
#### `src/events/order-created.handler.ts`
|
|
365
366
|
```ts
|
|
366
367
|
import { handleEvent } from '@crossdelta/cloudevents'
|
|
367
368
|
import { OrdersCreatedContract, type OrderCreatedData } from '{workspaceScope}/contracts'
|
|
@@ -452,6 +453,7 @@ export const OrdersCreatedContract = createContract({
|
|
|
452
453
|
| **Event Type** | **Singular** | `customer.created` | A single fact |
|
|
453
454
|
| **Schema** | **Singular** | `CustomerCreatedSchema` | One event object |
|
|
454
455
|
| **Type** | **Singular** | `CustomerCreatedData` | One event object |
|
|
456
|
+
| **Handler File** | **SINGULAR** | `customer-created.handler.ts` | Matches event type in kebab-case |
|
|
455
457
|
| **Contract** | **PLURAL** | `CustomersCreatedContract` | Category of events |
|
|
456
458
|
| **Event Folder** | **PLURAL** | `customers/` | Domain (collection) |
|
|
457
459
|
| **Stream** | **PLURAL** | `CUSTOMERS` | Collection of events |
|
|
@@ -459,13 +461,13 @@ export const OrdersCreatedContract = createContract({
|
|
|
459
461
|
|
|
460
462
|
**The final rule:**
|
|
461
463
|
```
|
|
464
|
+
Event Type / Handler → singular (customer.created → customer-created.handler.ts)
|
|
462
465
|
Schema / Data → singular (one event instance)
|
|
463
|
-
Event Type → singular (one fact)
|
|
464
466
|
Contract → plural (category of events)
|
|
465
467
|
Stream / Domain → plural (collection)
|
|
466
468
|
```
|
|
467
469
|
|
|
468
|
-
**Key principle:**
|
|
470
|
+
**Key principle:** Event handlers match event types (both singular). Contracts represent event collections (plural).
|
|
469
471
|
|
|
470
472
|
### File Structure Example
|
|
471
473
|
|
|
@@ -487,14 +489,15 @@ packages/contracts/src/events/
|
|
|
487
489
|
|
|
488
490
|
### Contract Examples
|
|
489
491
|
|
|
490
|
-
| Event Type | Schema | Type | Contract | Folder | Stream |
|
|
491
|
-
|
|
492
|
-
| `customer.created` | `CustomerCreatedSchema` | `CustomerCreatedData` | `CustomersCreatedContract` | `customers/` | `CUSTOMERS` |
|
|
493
|
-
| `order.created` | `OrderCreatedSchema` | `OrderCreatedData` | `OrdersCreatedContract` | `orders/` | `ORDERS` |
|
|
494
|
-
| `domain.created` | `DomainCreatedSchema` | `DomainCreatedData` | `DomainsCreatedContract` | `domains/` | `DOMAINS` |
|
|
492
|
+
| Event Type | Schema | Type | Handler | Contract | Folder | Stream |
|
|
493
|
+
|------------|--------|------|---------|----------|--------|--------|
|
|
494
|
+
| `customer.created` | `CustomerCreatedSchema` | `CustomerCreatedData` | `customer-created.handler.ts` | `CustomersCreatedContract` | `customers/` | `CUSTOMERS` |
|
|
495
|
+
| `order.created` | `OrderCreatedSchema` | `OrderCreatedData` | `order-created.handler.ts` | `OrdersCreatedContract` | `orders/` | `ORDERS` |
|
|
496
|
+
| `domain.created` | `DomainCreatedSchema` | `DomainCreatedData` | `domain-created.handler.ts` | `DomainsCreatedContract` | `domains/` | `DOMAINS` |
|
|
495
497
|
|
|
496
498
|
**Naming Patterns:**
|
|
497
499
|
- Schema/Type: `{SingularDomain}{Action}Schema/Data` - describes one object
|
|
500
|
+
- Handler: `{singular-domain}-{action}.handler.ts` - matches event type in kebab-case
|
|
498
501
|
- Contract: `{PluralDomain}{Action}Contract` - matches folder and stream names
|
|
499
502
|
|
|
500
503
|
```typescript
|
|
@@ -601,13 +604,14 @@ Combines REST endpoints + NATS consumer.
|
|
|
601
604
|
```
|
|
602
605
|
services/my-service/src/
|
|
603
606
|
├── index.ts
|
|
604
|
-
├── events/
|
|
607
|
+
├── events/order-created.handler.ts
|
|
605
608
|
└── use-cases/
|
|
606
609
|
├── process-order.use-case.ts
|
|
607
610
|
└── process-order.test.ts
|
|
608
611
|
|
|
609
612
|
packages/contracts/src/events/
|
|
610
|
-
└── orders
|
|
613
|
+
└── orders/
|
|
614
|
+
└── created.ts
|
|
611
615
|
```
|
|
612
616
|
|
|
613
617
|
**Note:** For NestJS structure, see `nest.md` - NestJS uses Services instead of use-cases.
|
|
@@ -96,8 +96,8 @@ pf event add order.created --service services/notifications
|
|
|
96
96
|
```
|
|
97
97
|
|
|
98
98
|
This creates:
|
|
99
|
-
- `packages/contracts/src/events/orders
|
|
100
|
-
- `packages/contracts/src/events/orders
|
|
99
|
+
- `packages/contracts/src/events/orders/created.ts` (contract)
|
|
100
|
+
- `packages/contracts/src/events/orders/created.mock.json` (mock)
|
|
101
101
|
- Updates `packages/contracts/src/index.ts` (exports)
|
|
102
102
|
|
|
103
103
|
### Manual Contract Creation
|
|
@@ -161,6 +161,6 @@ pf event publish order.created --data '{"orderId":"test-123"}'
|
|
|
161
161
|
|
|
162
162
|
**Naming conventions:**
|
|
163
163
|
- Contracts: `OrdersCreatedContract` (plural namespace)
|
|
164
|
-
- Types: `OrderCreatedData`
|
|
165
|
-
- Files: `orders
|
|
166
|
-
- Event types: `order.created` (
|
|
164
|
+
- Types: `OrderCreatedData` (singular)
|
|
165
|
+
- Files: `orders/created.ts` (plural folder, event name)
|
|
166
|
+
- Event types: `order.created` (singular namespace, dot notation)
|