@crossdelta/platform-sdk 0.17.1 → 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 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/orders-created.handler.ts
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/orders-created.handler.ts)
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/orders-created.handler.ts`)
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-created.mock.json` (test mock)
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/orders-created.handler.ts
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
- ├── orders-created.handler.ts
302
- └── customers-updated.handler.ts
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/orders-created.handler.ts`
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:** Contracts represent event collections, Schemas represent event instances.
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/orders-created.handler.ts
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-created.ts
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.
@@ -7,7 +7,7 @@
7
7
  "pulumi": "pulumi"
8
8
  },
9
9
  "dependencies": {
10
- "@crossdelta/cloudevents": "^0.6.0",
10
+ "@crossdelta/cloudevents": "^0.6.1",
11
11
  "@crossdelta/infrastructure": "^0.5.3",
12
12
  "{{scope}}/contracts": "workspace:*",
13
13
  "@pulumi/digitalocean": "^4.55.0",
@@ -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-created.ts` (contract)
100
- - `packages/contracts/src/events/orders-created.mock.json` (mock)
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-created.ts`
166
- - Event types: `order.created` (plural namespace, dot notation)
164
+ - Types: `OrderCreatedData` (singular)
165
+ - Files: `orders/created.ts` (plural folder, event name)
166
+ - Event types: `order.created` (singular namespace, dot notation)
@@ -11,7 +11,7 @@
11
11
  }
12
12
  },
13
13
  "dependencies": {
14
- "@crossdelta/cloudevents": "^0.6.0",
14
+ "@crossdelta/cloudevents": "^0.6.1",
15
15
  "@crossdelta/infrastructure": "^0.5.3",
16
16
  "zod": "^4.0.0"
17
17
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crossdelta/platform-sdk",
3
- "version": "0.17.1",
3
+ "version": "0.17.2",
4
4
  "description": "Platform toolkit for event-driven microservices — keeping code and infrastructure in lockstep.",
5
5
  "keywords": [
6
6
  "cli",