@spfn/core 0.2.0-beta.9 → 0.3.0-beta.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.
Files changed (95) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +467 -305
  3. package/dist/authz/index.d.ts +34 -0
  4. package/dist/authz/index.js +810 -0
  5. package/dist/authz/index.js.map +1 -0
  6. package/dist/{boss-DI1r4kTS.d.ts → boss-D16fO2oG.d.ts} +41 -1
  7. package/dist/cache/index.js +42 -30
  8. package/dist/cache/index.js.map +1 -1
  9. package/dist/codegen/index.d.ts +121 -13
  10. package/dist/codegen/index.js +212 -15
  11. package/dist/codegen/index.js.map +1 -1
  12. package/dist/config/index.d.ts +615 -6
  13. package/dist/config/index.js +124 -5
  14. package/dist/config/index.js.map +1 -1
  15. package/dist/contract/index.d.ts +220 -0
  16. package/dist/contract/index.js +558 -0
  17. package/dist/contract/index.js.map +1 -0
  18. package/dist/db/index.d.ts +528 -85
  19. package/dist/db/index.js +831 -122
  20. package/dist/db/index.js.map +1 -1
  21. package/dist/define-middleware-DfDP39Nq.d.ts +167 -0
  22. package/dist/env/index.d.ts +26 -2
  23. package/dist/env/index.js +15 -5
  24. package/dist/env/index.js.map +1 -1
  25. package/dist/env/loader.d.ts +26 -19
  26. package/dist/env/loader.js +32 -25
  27. package/dist/env/loader.js.map +1 -1
  28. package/dist/errors/index.d.ts +10 -0
  29. package/dist/errors/index.js +418 -5
  30. package/dist/errors/index.js.map +1 -1
  31. package/dist/event/index.d.ts +33 -3
  32. package/dist/event/index.js +24 -3
  33. package/dist/event/index.js.map +1 -1
  34. package/dist/event/sse/client.d.ts +42 -3
  35. package/dist/event/sse/client.js +128 -45
  36. package/dist/event/sse/client.js.map +1 -1
  37. package/dist/event/sse/index.d.ts +12 -5
  38. package/dist/event/sse/index.js +280 -32
  39. package/dist/event/sse/index.js.map +1 -1
  40. package/dist/event/ws/client.d.ts +59 -0
  41. package/dist/event/ws/client.js +273 -0
  42. package/dist/event/ws/client.js.map +1 -0
  43. package/dist/event/ws/index.d.ts +94 -0
  44. package/dist/event/ws/index.js +272 -0
  45. package/dist/event/ws/index.js.map +1 -0
  46. package/dist/job/index.d.ts +2 -2
  47. package/dist/job/index.js +155 -42
  48. package/dist/job/index.js.map +1 -1
  49. package/dist/logger/index.d.ts +5 -0
  50. package/dist/logger/index.js +14 -0
  51. package/dist/logger/index.js.map +1 -1
  52. package/dist/middleware/index.d.ts +347 -9
  53. package/dist/middleware/index.js +1462 -15
  54. package/dist/middleware/index.js.map +1 -1
  55. package/dist/nextjs/index.d.ts +2 -2
  56. package/dist/nextjs/index.js +42 -28
  57. package/dist/nextjs/index.js.map +1 -1
  58. package/dist/nextjs/server.d.ts +35 -51
  59. package/dist/nextjs/server.js +126 -60
  60. package/dist/nextjs/server.js.map +1 -1
  61. package/dist/ops/index.d.ts +152 -0
  62. package/dist/ops/index.js +500 -0
  63. package/dist/ops/index.js.map +1 -0
  64. package/dist/route/index.d.ts +8 -694
  65. package/dist/route/index.js +111 -22
  66. package/dist/route/index.js.map +1 -1
  67. package/dist/router-Qbssr11H.d.ts +676 -0
  68. package/dist/security/index.d.ts +83 -0
  69. package/dist/security/index.js +173 -0
  70. package/dist/security/index.js.map +1 -0
  71. package/dist/server/index.d.ts +491 -22
  72. package/dist/server/index.js +1887 -308
  73. package/dist/server/index.js.map +1 -1
  74. package/dist/token-manager-BT5EnUAR.d.ts +278 -0
  75. package/dist/types-2AbaW4Ie.d.ts +205 -0
  76. package/dist/{types-BOPTApC2.d.ts → types-9oszaJqp.d.ts} +7 -2
  77. package/dist/types-D1c57Ko-.d.ts +115 -0
  78. package/dist/types-ZQODsBft.d.ts +282 -0
  79. package/package.json +244 -208
  80. package/dist/router-Di7ENoah.d.ts +0 -151
  81. package/dist/types-B-e_f2dQ.d.ts +0 -121
  82. package/docs/cache.md +0 -133
  83. package/docs/codegen.md +0 -74
  84. package/docs/database.md +0 -346
  85. package/docs/entity.md +0 -539
  86. package/docs/env.md +0 -477
  87. package/docs/errors.md +0 -319
  88. package/docs/event.md +0 -116
  89. package/docs/job.md +0 -131
  90. package/docs/logger.md +0 -108
  91. package/docs/middleware.md +0 -337
  92. package/docs/nextjs.md +0 -241
  93. package/docs/repository.md +0 -496
  94. package/docs/route.md +0 -497
  95. package/docs/server.md +0 -307
package/package.json CHANGED
@@ -1,210 +1,246 @@
1
1
  {
2
- "name": "@spfn/core",
3
- "version": "0.2.0-beta.9",
4
- "description": "SPFN Framework Core - File-based routing, transactions, repository pattern",
5
- "type": "module",
6
- "exports": {
7
- "./client": {
8
- "types": "./dist/client/index.d.ts",
9
- "import": "./dist/client/index.js",
10
- "require": "./dist/client/index.js"
11
- },
12
- "./nextjs": {
13
- "types": "./dist/nextjs/index.d.ts",
14
- "import": "./dist/nextjs/index.js",
15
- "require": "./dist/nextjs/index.js"
16
- },
17
- "./nextjs/server": {
18
- "types": "./dist/nextjs/server.d.ts",
19
- "import": "./dist/nextjs/server.js",
20
- "require": "./dist/nextjs/server.js"
21
- },
22
- "./route": {
23
- "types": "./dist/route/index.d.ts",
24
- "import": "./dist/route/index.js",
25
- "require": "./dist/route/index.js"
26
- },
27
- "./route/types": {
28
- "types": "./dist/route/types.d.ts",
29
- "import": "./dist/route/types.js",
30
- "require": "./dist/route/types.js"
31
- },
32
- "./db": {
33
- "types": "./dist/db/index.d.ts",
34
- "import": "./dist/db/index.js",
35
- "require": "./dist/db/index.js"
36
- },
37
- "./server": {
38
- "types": "./dist/server/index.d.ts",
39
- "import": "./dist/server/index.js",
40
- "require": "./dist/server/index.js"
41
- },
42
- "./errors": {
43
- "types": "./dist/errors/index.d.ts",
44
- "import": "./dist/errors/index.js",
45
- "require": "./dist/errors/index.js"
46
- },
47
- "./middleware": {
48
- "types": "./dist/middleware/index.d.ts",
49
- "import": "./dist/middleware/index.js",
50
- "require": "./dist/middleware/index.js"
51
- },
52
- "./cache": {
53
- "types": "./dist/cache/index.d.ts",
54
- "import": "./dist/cache/index.js",
55
- "require": "./dist/cache/index.js"
56
- },
57
- "./codegen": {
58
- "types": "./dist/codegen/index.d.ts",
59
- "import": "./dist/codegen/index.js",
60
- "require": "./dist/codegen/index.js"
61
- },
62
- "./env": {
63
- "types": "./dist/env/index.d.ts",
64
- "import": "./dist/env/index.js",
65
- "require": "./dist/env/index.js"
66
- },
67
- "./env/loader": {
68
- "types": "./dist/env/loader.d.ts",
69
- "import": "./dist/env/loader.js",
70
- "require": "./dist/env/loader.js"
71
- },
72
- "./logger": {
73
- "types": "./dist/logger/index.d.ts",
74
- "import": "./dist/logger/index.js",
75
- "require": "./dist/logger/index.js"
76
- },
77
- "./config": {
78
- "types": "./dist/config/index.d.ts",
79
- "import": "./dist/config/index.js",
80
- "require": "./dist/config/index.js"
81
- },
82
- "./job": {
83
- "types": "./dist/job/index.d.ts",
84
- "import": "./dist/job/index.js",
85
- "require": "./dist/job/index.js"
86
- },
87
- "./event": {
88
- "types": "./dist/event/index.d.ts",
89
- "import": "./dist/event/index.js",
90
- "require": "./dist/event/index.js"
91
- },
92
- "./event/sse": {
93
- "types": "./dist/event/sse/index.d.ts",
94
- "import": "./dist/event/sse/index.js",
95
- "require": "./dist/event/sse/index.js"
96
- },
97
- "./event/sse/client": {
98
- "types": "./dist/event/sse/client.d.ts",
99
- "import": "./dist/event/sse/client.js",
100
- "require": "./dist/event/sse/client.js"
101
- }
102
- },
103
- "keywords": [
104
- "spfn",
105
- "nextjs",
106
- "backend",
107
- "framework",
108
- "typescript",
109
- "type-safe",
110
- "api",
111
- "rest-api",
112
- "crud",
113
- "database",
114
- "orm",
115
- "drizzle-orm",
116
- "postgres",
117
- "redis",
118
- "hono",
119
- "fullstack",
120
- "server",
121
- "scalable",
122
- "auto-generated",
123
- "file-based-routing",
124
- "transaction",
125
- "repository-pattern"
126
- ],
127
- "author": "Ray Im <rayim@inflike.com>",
128
- "license": "MIT",
129
- "repository": {
130
- "type": "git",
131
- "url": "https://github.com/spfn/spfn.git",
132
- "directory": "packages/core"
133
- },
134
- "bugs": {
135
- "url": "https://github.com/spfn/spfn/issues"
136
- },
137
- "homepage": "https://github.com/spfn/spfn/tree/main/packages/core#readme",
138
- "engines": {
139
- "node": ">=18.18.0"
140
- },
141
- "dependencies": {
142
- "@hono/node-server": "^1.0.0",
143
- "@sinclair/typebox": "^0.34.0",
144
- "chalk": "^5.6.2",
145
- "chokidar": "^4.0.3",
146
- "dotenv": "^17.2.3",
147
- "drizzle-orm": "^0.45.0",
148
- "drizzle-typebox": "^0.1.0",
149
- "hono": "^4.10.6",
150
- "jiti": "^2.6.1",
151
- "micromatch": "^4.0.8",
152
- "pg-boss": "^11.1.2",
153
- "postgres": "^3.4.0",
154
- "typescript": "^5.3.3",
155
- "zod": "^4.1.11"
156
- },
157
- "optionalDependencies": {
158
- "ioredis": "^5.4.1"
159
- },
160
- "devDependencies": {
161
- "@types/micromatch": "^4.0.9",
162
- "@types/node": "^20.11.0",
163
- "@vitest/coverage-v8": "^4.0.6",
164
- "drizzle-kit": "^0.31.6",
165
- "madge": "^8.0.0",
166
- "next": "^16.0.0",
167
- "tsup": "^8.5.0",
168
- "vitest": "^4.0.6"
169
- },
170
- "peerDependencies": {
171
- "next": "^15.0.0 || ^16.0.0"
172
- },
173
- "peerDependenciesMeta": {
174
- "next": {
175
- "optional": true
2
+ "name": "@spfn/core",
3
+ "version": "0.3.0-beta.2",
4
+ "description": "Full-stack TypeScript backend for Next.js: file-based typed routes, Drizzle entities and repositories, PostgreSQL transactions and a generated end-to-end client, in one fixed vertical slice per feature",
5
+ "type": "module",
6
+ "exports": {
7
+ "./client": {
8
+ "types": "./dist/client/index.d.ts",
9
+ "import": "./dist/client/index.js",
10
+ "require": "./dist/client/index.js"
11
+ },
12
+ "./nextjs": {
13
+ "types": "./dist/nextjs/index.d.ts",
14
+ "import": "./dist/nextjs/index.js",
15
+ "require": "./dist/nextjs/index.js"
16
+ },
17
+ "./nextjs/server": {
18
+ "types": "./dist/nextjs/server.d.ts",
19
+ "import": "./dist/nextjs/server.js",
20
+ "require": "./dist/nextjs/server.js"
21
+ },
22
+ "./route": {
23
+ "types": "./dist/route/index.d.ts",
24
+ "import": "./dist/route/index.js",
25
+ "require": "./dist/route/index.js"
26
+ },
27
+ "./route/types": {
28
+ "types": "./dist/route/types.d.ts",
29
+ "import": "./dist/route/types.js",
30
+ "require": "./dist/route/types.js"
31
+ },
32
+ "./db": {
33
+ "types": "./dist/db/index.d.ts",
34
+ "import": "./dist/db/index.js",
35
+ "require": "./dist/db/index.js"
36
+ },
37
+ "./server": {
38
+ "types": "./dist/server/index.d.ts",
39
+ "import": "./dist/server/index.js",
40
+ "require": "./dist/server/index.js"
41
+ },
42
+ "./errors": {
43
+ "types": "./dist/errors/index.d.ts",
44
+ "import": "./dist/errors/index.js",
45
+ "require": "./dist/errors/index.js"
46
+ },
47
+ "./middleware": {
48
+ "types": "./dist/middleware/index.d.ts",
49
+ "import": "./dist/middleware/index.js",
50
+ "require": "./dist/middleware/index.js"
51
+ },
52
+ "./security": {
53
+ "types": "./dist/security/index.d.ts",
54
+ "import": "./dist/security/index.js",
55
+ "require": "./dist/security/index.js"
56
+ },
57
+ "./authz": {
58
+ "types": "./dist/authz/index.d.ts",
59
+ "import": "./dist/authz/index.js",
60
+ "require": "./dist/authz/index.js"
61
+ },
62
+ "./cache": {
63
+ "types": "./dist/cache/index.d.ts",
64
+ "import": "./dist/cache/index.js",
65
+ "require": "./dist/cache/index.js"
66
+ },
67
+ "./codegen": {
68
+ "types": "./dist/codegen/index.d.ts",
69
+ "import": "./dist/codegen/index.js",
70
+ "require": "./dist/codegen/index.js"
71
+ },
72
+ "./contract": {
73
+ "types": "./dist/contract/index.d.ts",
74
+ "import": "./dist/contract/index.js",
75
+ "require": "./dist/contract/index.js"
76
+ },
77
+ "./ops": {
78
+ "types": "./dist/ops/index.d.ts",
79
+ "import": "./dist/ops/index.js",
80
+ "require": "./dist/ops/index.js"
81
+ },
82
+ "./env": {
83
+ "types": "./dist/env/index.d.ts",
84
+ "import": "./dist/env/index.js",
85
+ "require": "./dist/env/index.js"
86
+ },
87
+ "./env/loader": {
88
+ "types": "./dist/env/loader.d.ts",
89
+ "import": "./dist/env/loader.js",
90
+ "require": "./dist/env/loader.js"
91
+ },
92
+ "./logger": {
93
+ "types": "./dist/logger/index.d.ts",
94
+ "import": "./dist/logger/index.js",
95
+ "require": "./dist/logger/index.js"
96
+ },
97
+ "./config": {
98
+ "types": "./dist/config/index.d.ts",
99
+ "import": "./dist/config/index.js",
100
+ "require": "./dist/config/index.js"
101
+ },
102
+ "./job": {
103
+ "types": "./dist/job/index.d.ts",
104
+ "import": "./dist/job/index.js",
105
+ "require": "./dist/job/index.js"
106
+ },
107
+ "./event": {
108
+ "types": "./dist/event/index.d.ts",
109
+ "import": "./dist/event/index.js",
110
+ "require": "./dist/event/index.js"
111
+ },
112
+ "./event/sse": {
113
+ "types": "./dist/event/sse/index.d.ts",
114
+ "import": "./dist/event/sse/index.js",
115
+ "require": "./dist/event/sse/index.js"
116
+ },
117
+ "./event/sse/client": {
118
+ "types": "./dist/event/sse/client.d.ts",
119
+ "import": "./dist/event/sse/client.js",
120
+ "require": "./dist/event/sse/client.js"
121
+ },
122
+ "./event/ws": {
123
+ "types": "./dist/event/ws/index.d.ts",
124
+ "import": "./dist/event/ws/index.js",
125
+ "require": "./dist/event/ws/index.js"
126
+ },
127
+ "./event/ws/client": {
128
+ "types": "./dist/event/ws/client.d.ts",
129
+ "import": "./dist/event/ws/client.js",
130
+ "require": "./dist/event/ws/client.js"
131
+ }
132
+ },
133
+ "scripts": {
134
+ "build": "pnpm check:circular && tsup",
135
+ "prepack": "node -e \"require('fs').copyFileSync('../../LICENSE','LICENSE')\"",
136
+ "dev": "tsup",
137
+ "test": "vitest run",
138
+ "test:watch": "vitest",
139
+ "test:coverage": "vitest run --coverage",
140
+ "test:logger": "vitest run src/logger",
141
+ "test:errors": "vitest run src/errors",
142
+ "test:codegen": "vitest run src/codegen",
143
+ "test:route": "vitest run src/route",
144
+ "test:client": "vitest run src/client",
145
+ "test:middleware": "vitest run src/middleware",
146
+ "test:env": "vitest run src/env",
147
+ "test:cache": "vitest run src/cache --config vitest.integration.config.ts",
148
+ "test:db": "vitest run src/db --config vitest.integration.config.ts",
149
+ "test:server": "vitest run src/server --config vitest.integration.config.ts",
150
+ "check:circular": "madge --circular --extensions ts src/",
151
+ "type-check": "tsc --noEmit",
152
+ "publish:alpha": "node ../../scripts/publish-package.mjs alpha",
153
+ "publish:beta": "node ../../scripts/publish-package.mjs beta",
154
+ "publish:latest": "node ../../scripts/publish-package.mjs latest"
155
+ },
156
+ "keywords": [
157
+ "spfn",
158
+ "nextjs",
159
+ "backend",
160
+ "framework",
161
+ "typescript",
162
+ "type-safe",
163
+ "api",
164
+ "rest-api",
165
+ "crud",
166
+ "database",
167
+ "orm",
168
+ "drizzle-orm",
169
+ "postgres",
170
+ "redis",
171
+ "hono",
172
+ "fullstack",
173
+ "full-stack-framework",
174
+ "ai-coding-agent",
175
+ "claude-code",
176
+ "file-based-routing",
177
+ "transaction",
178
+ "repository-pattern"
179
+ ],
180
+ "author": "Ray Im <rayim@fxy.global>",
181
+ "license": "MIT",
182
+ "repository": {
183
+ "type": "git",
184
+ "url": "git+https://github.com/fxylabs/spfn.git",
185
+ "directory": "packages/core"
186
+ },
187
+ "bugs": {
188
+ "url": "https://github.com/fxylabs/spfn/issues"
189
+ },
190
+ "homepage": "https://github.com/fxylabs/spfn/tree/main/packages/core#readme",
191
+ "engines": {
192
+ "node": ">=20.0.0"
193
+ },
194
+ "dependencies": {
195
+ "@hono/node-server": "^2.0.5",
196
+ "@sinclair/typebox": "^0.34.0",
197
+ "chalk": "^5.6.2",
198
+ "chokidar": "^4.0.3",
199
+ "dotenv": "^17.2.3",
200
+ "drizzle-typebox": "^0.3.3",
201
+ "hono": "^4.12.34",
202
+ "jiti": "^2.6.1",
203
+ "micromatch": "^4.0.8",
204
+ "pg-boss": "^11.1.2",
205
+ "postgres": "^3.4.0",
206
+ "typescript": "^5.3.3",
207
+ "undici": "^7.29.0",
208
+ "zod": "^4.4.3"
209
+ },
210
+ "optionalDependencies": {
211
+ "ioredis": "^5.4.1",
212
+ "ws": "^8.21.0"
213
+ },
214
+ "devDependencies": {
215
+ "@electric-sql/pglite": "0.5.4",
216
+ "@types/micromatch": "^4.0.9",
217
+ "@types/node": "^20.11.0",
218
+ "@types/ws": "^8.18.1",
219
+ "@vitest/coverage-v8": "^4.0.6",
220
+ "drizzle-kit": "1.0.0-rc.4",
221
+ "drizzle-orm": "1.0.0-rc.4",
222
+ "madge": "^8.0.0",
223
+ "next": "^16.2.11",
224
+ "tsup": "^8.5.0",
225
+ "vitest": "^4.0.6"
226
+ },
227
+ "peerDependencies": {
228
+ "drizzle-orm": ">=1.0.0-rc.4 <2",
229
+ "next": "^16.2.11"
230
+ },
231
+ "peerDependenciesMeta": {
232
+ "next": {
233
+ "optional": true
234
+ }
235
+ },
236
+ "files": [
237
+ "dist",
238
+ "docs",
239
+ "README.md",
240
+ "LICENSE"
241
+ ],
242
+ "publishConfig": {
243
+ "access": "public",
244
+ "tag": "beta"
176
245
  }
177
- },
178
- "files": [
179
- "dist",
180
- "docs",
181
- "README.md",
182
- "LICENSE"
183
- ],
184
- "publishConfig": {
185
- "access": "public",
186
- "tag": "beta"
187
- },
188
- "scripts": {
189
- "build": "pnpm check:circular && tsup",
190
- "dev": "tsup",
191
- "test": "vitest run",
192
- "test:watch": "vitest",
193
- "test:coverage": "vitest run --config vitest.unit.config.ts --coverage",
194
- "test:logger": "vitest run src/logger",
195
- "test:errors": "vitest run src/errors",
196
- "test:codegen": "vitest run src/codegen",
197
- "test:route": "vitest run src/route",
198
- "test:client": "vitest run src/client",
199
- "test:middleware": "vitest run src/middleware",
200
- "test:env": "vitest run src/env",
201
- "test:cache": "vitest run src/cache --config vitest.integration.config.ts",
202
- "test:db": "vitest run src/db --config vitest.integration.config.ts",
203
- "test:server": "vitest run src/server --config vitest.integration.config.ts",
204
- "docker:test:up": "docker compose -f docker-compose.test.yml up -d",
205
- "docker:test:down": "docker compose -f docker-compose.test.yml down",
206
- "docker:test:logs": "docker compose -f docker-compose.test.yml logs -f",
207
- "check:circular": "madge --circular --extensions ts src/",
208
- "type-check": "tsc --noEmit"
209
- }
210
- }
246
+ }
@@ -1,151 +0,0 @@
1
- import { TSchema } from '@sinclair/typebox';
2
-
3
- /**
4
- * Event System Types
5
- */
6
-
7
- /**
8
- * Pub/Sub capable cache interface for multi-instance events
9
- */
10
- interface PubSubCache {
11
- /**
12
- * Publish a message to a channel
13
- */
14
- publish(channel: string, message: unknown): Promise<void>;
15
- /**
16
- * Subscribe to a channel
17
- */
18
- subscribe(channel: string, handler: (message: unknown) => void | Promise<void>): Promise<void>;
19
- }
20
- /**
21
- * Event handler function type
22
- */
23
- type EventHandler<TPayload> = (payload: TPayload) => void | Promise<void>;
24
- /**
25
- * Job queue sender function type (used by job module)
26
- */
27
- type JobQueueSender = (queueName: string, payload: unknown) => Promise<void>;
28
- /**
29
- * Event definition interface
30
- */
31
- interface EventDef<TPayload = void> {
32
- /**
33
- * Unique event name
34
- */
35
- readonly name: string;
36
- /**
37
- * TypeBox payload schema (optional)
38
- */
39
- readonly schema?: TSchema;
40
- /**
41
- * Subscribe to this event (in-memory handler)
42
- */
43
- subscribe: (handler: EventHandler<TPayload>) => () => void;
44
- /**
45
- * Unsubscribe all handlers
46
- */
47
- unsubscribeAll: () => void;
48
- /**
49
- * Emit the event (triggers all subscribers and queued jobs)
50
- */
51
- emit: TPayload extends void ? () => Promise<void> : (payload: TPayload) => Promise<void>;
52
- /**
53
- * Enable cache-based pub/sub for multi-instance support
54
- * Must await before emitting events to ensure subscription is ready
55
- */
56
- useCache: (cache: PubSubCache) => Promise<EventDef<TPayload>>;
57
- /**
58
- * Internal: Register a job queue to receive this event
59
- * Called by job registration system
60
- */
61
- _registerJobQueue: (queueName: string, sender: JobQueueSender) => void;
62
- /**
63
- * Type inference helper
64
- */
65
- _payload: TPayload;
66
- }
67
- /**
68
- * Infer payload type from EventDef
69
- */
70
- type InferEventPayload$1<TEvent> = TEvent extends EventDef<infer TPayload> ? TPayload : never;
71
-
72
- /**
73
- * Event Router
74
- *
75
- * Type-safe event router for SSE subscription
76
- *
77
- * @example
78
- * ```typescript
79
- * import { defineEvent, defineEventRouter } from '@spfn/core/event';
80
- * import { Type } from '@sinclair/typebox';
81
- *
82
- * const userCreated = defineEvent('user.created', Type.Object({
83
- * userId: Type.String(),
84
- * }));
85
- *
86
- * const orderPlaced = defineEvent('order.placed', Type.Object({
87
- * orderId: Type.String(),
88
- * amount: Type.Number(),
89
- * }));
90
- *
91
- * export const eventRouter = defineEventRouter({
92
- * userCreated,
93
- * orderPlaced,
94
- * });
95
- *
96
- * export type EventRouter = typeof eventRouter;
97
- * ```
98
- */
99
-
100
- /**
101
- * Event Router Definition
102
- */
103
- interface EventRouterDef<TEvents extends Record<string, EventDef<any>>> {
104
- /**
105
- * Event definitions
106
- */
107
- readonly events: TEvents;
108
- /**
109
- * Event names as array
110
- */
111
- readonly eventNames: (keyof TEvents)[];
112
- /**
113
- * Type inference helper - payload types by event name
114
- */
115
- readonly _types: {
116
- [K in keyof TEvents]: TEvents[K]['_payload'];
117
- };
118
- }
119
- /**
120
- * Infer event names from EventRouter
121
- */
122
- type InferEventNames<T> = T extends EventRouterDef<infer E> ? keyof E & string : never;
123
- /**
124
- * Infer payload type for specific event
125
- */
126
- type InferEventPayload<T extends EventRouterDef<any>, K extends InferEventNames<T>> = T['_types'][K];
127
- /**
128
- * Infer all event payloads map
129
- */
130
- type InferEventPayloads<T extends EventRouterDef<any>> = T['_types'];
131
- /**
132
- * Define an event router for SSE subscription
133
- *
134
- * @example
135
- * ```typescript
136
- * export const eventRouter = defineEventRouter({
137
- * userCreated,
138
- * orderPlaced,
139
- * });
140
- *
141
- * // Type inference
142
- * type Names = InferEventNames<typeof eventRouter>;
143
- * // 'userCreated' | 'orderPlaced'
144
- *
145
- * type Payload = InferEventPayload<typeof eventRouter, 'userCreated'>;
146
- * // { userId: string }
147
- * ```
148
- */
149
- declare function defineEventRouter<TEvents extends Record<string, EventDef<any>>>(events: TEvents): EventRouterDef<TEvents>;
150
-
151
- export { type EventRouterDef as E, type InferEventNames as I, type JobQueueSender as J, type PubSubCache as P, type EventDef as a, type InferEventPayload as b, type InferEventPayloads as c, defineEventRouter as d, type EventHandler as e, type InferEventPayload$1 as f };