@spfn/core 0.1.0-alpha.88 → 0.2.0-beta.10
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 +298 -466
- package/dist/boss-DI1r4kTS.d.ts +244 -0
- package/dist/cache/index.d.ts +13 -33
- package/dist/cache/index.js +14 -703
- package/dist/cache/index.js.map +1 -1
- package/dist/codegen/index.d.ts +214 -17
- package/dist/codegen/index.js +231 -1420
- package/dist/codegen/index.js.map +1 -1
- package/dist/config/index.d.ts +1227 -0
- package/dist/config/index.js +273 -0
- package/dist/config/index.js.map +1 -0
- package/dist/db/index.d.ts +741 -59
- package/dist/db/index.js +1063 -1226
- package/dist/db/index.js.map +1 -1
- package/dist/env/index.d.ts +658 -308
- package/dist/env/index.js +503 -928
- package/dist/env/index.js.map +1 -1
- package/dist/env/loader.d.ts +87 -0
- package/dist/env/loader.js +70 -0
- package/dist/env/loader.js.map +1 -0
- package/dist/errors/index.d.ts +417 -29
- package/dist/errors/index.js +359 -98
- package/dist/errors/index.js.map +1 -1
- package/dist/event/index.d.ts +41 -0
- package/dist/event/index.js +131 -0
- package/dist/event/index.js.map +1 -0
- package/dist/event/sse/client.d.ts +82 -0
- package/dist/event/sse/client.js +115 -0
- package/dist/event/sse/client.js.map +1 -0
- package/dist/event/sse/index.d.ts +40 -0
- package/dist/event/sse/index.js +92 -0
- package/dist/event/sse/index.js.map +1 -0
- package/dist/job/index.d.ts +218 -0
- package/dist/job/index.js +410 -0
- package/dist/job/index.js.map +1 -0
- package/dist/logger/index.d.ts +20 -79
- package/dist/logger/index.js +82 -387
- package/dist/logger/index.js.map +1 -1
- package/dist/middleware/index.d.ts +102 -20
- package/dist/middleware/index.js +51 -705
- package/dist/middleware/index.js.map +1 -1
- package/dist/nextjs/index.d.ts +120 -0
- package/dist/nextjs/index.js +448 -0
- package/dist/nextjs/index.js.map +1 -0
- package/dist/{client/nextjs/index.d.ts → nextjs/server.d.ts} +335 -262
- package/dist/nextjs/server.js +637 -0
- package/dist/nextjs/server.js.map +1 -0
- package/dist/route/index.d.ts +879 -25
- package/dist/route/index.js +697 -1271
- package/dist/route/index.js.map +1 -1
- package/dist/route/types.d.ts +9 -0
- package/dist/route/types.js +3 -0
- package/dist/route/types.js.map +1 -0
- package/dist/router-Di7ENoah.d.ts +151 -0
- package/dist/server/index.d.ts +345 -64
- package/dist/server/index.js +1174 -3233
- package/dist/server/index.js.map +1 -1
- package/dist/types-B-e_f2dQ.d.ts +121 -0
- package/dist/types-BGl4QL1w.d.ts +77 -0
- package/dist/types-BOPTApC2.d.ts +245 -0
- package/docs/cache.md +133 -0
- package/docs/codegen.md +74 -0
- package/docs/database.md +346 -0
- package/docs/entity.md +539 -0
- package/docs/env.md +477 -0
- package/docs/errors.md +319 -0
- package/docs/event.md +116 -0
- package/docs/file-upload.md +717 -0
- package/docs/job.md +131 -0
- package/docs/logger.md +108 -0
- package/docs/middleware.md +337 -0
- package/docs/nextjs.md +241 -0
- package/docs/repository.md +496 -0
- package/docs/route.md +497 -0
- package/docs/server.md +307 -0
- package/package.json +68 -48
- package/dist/auto-loader-JFaZ9gON.d.ts +0 -80
- package/dist/client/index.d.ts +0 -358
- package/dist/client/index.js +0 -357
- package/dist/client/index.js.map +0 -1
- package/dist/client/nextjs/index.js +0 -371
- package/dist/client/nextjs/index.js.map +0 -1
- package/dist/codegen/generators/index.d.ts +0 -19
- package/dist/codegen/generators/index.js +0 -1404
- package/dist/codegen/generators/index.js.map +0 -1
- package/dist/database-errors-BNNmLTJE.d.ts +0 -86
- package/dist/events/index.d.ts +0 -183
- package/dist/events/index.js +0 -77
- package/dist/events/index.js.map +0 -1
- package/dist/index-DHiAqhKv.d.ts +0 -101
- package/dist/index.d.ts +0 -8
- package/dist/index.js +0 -3674
- package/dist/index.js.map +0 -1
- package/dist/types/index.d.ts +0 -121
- package/dist/types/index.js +0 -38
- package/dist/types/index.js.map +0 -1
- package/dist/types-BXibIEyj.d.ts +0 -60
package/docs/server.md
ADDED
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
# Server
|
|
2
|
+
|
|
3
|
+
HTTP server configuration with three-level progressive customization.
|
|
4
|
+
|
|
5
|
+
## Quick Start
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
// src/server/index.ts
|
|
9
|
+
import { startServer } from '@spfn/core/server';
|
|
10
|
+
|
|
11
|
+
await startServer();
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Configuration Levels
|
|
17
|
+
|
|
18
|
+
### Level 1: Zero Config
|
|
19
|
+
|
|
20
|
+
No configuration needed. Uses sensible defaults:
|
|
21
|
+
|
|
22
|
+
```typescript
|
|
23
|
+
import { startServer } from '@spfn/core/server';
|
|
24
|
+
|
|
25
|
+
await startServer();
|
|
26
|
+
// Port: 4000 (or process.env.PORT)
|
|
27
|
+
// Host: localhost (or process.env.HOST)
|
|
28
|
+
// Middleware: Logger + CORS + ErrorHandler
|
|
29
|
+
// Infrastructure: Auto-init from env vars
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
### Level 2: Partial Customization
|
|
33
|
+
|
|
34
|
+
Create `src/server/server.config.ts`:
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { defineServerConfig, defineRouter } from '@spfn/core/server';
|
|
38
|
+
import * as userRoutes from './routes/users';
|
|
39
|
+
import * as postRoutes from './routes/posts';
|
|
40
|
+
import { authMiddleware, rateLimiter } from './middlewares';
|
|
41
|
+
|
|
42
|
+
const appRouter = defineRouter({
|
|
43
|
+
...userRoutes,
|
|
44
|
+
...postRoutes
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
export default defineServerConfig()
|
|
48
|
+
.port(8790)
|
|
49
|
+
.host('0.0.0.0')
|
|
50
|
+
.routes(appRouter)
|
|
51
|
+
.middlewares([authMiddleware, rateLimiter])
|
|
52
|
+
.build();
|
|
53
|
+
|
|
54
|
+
export type AppRouter = typeof appRouter;
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Level 3: Full Control
|
|
58
|
+
|
|
59
|
+
Create `src/server/app.ts` for custom Hono setup:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
import { Hono } from 'hono';
|
|
63
|
+
import { timing } from 'hono/timing';
|
|
64
|
+
import { compress } from 'hono/compress';
|
|
65
|
+
import type { AppFactory } from '@spfn/core/server';
|
|
66
|
+
|
|
67
|
+
export default (async () => {
|
|
68
|
+
const app = new Hono();
|
|
69
|
+
|
|
70
|
+
// Custom middleware
|
|
71
|
+
app.use('*', timing());
|
|
72
|
+
app.use('*', compress());
|
|
73
|
+
|
|
74
|
+
// Custom routes
|
|
75
|
+
app.get('/custom', (c) => c.json({ custom: true }));
|
|
76
|
+
|
|
77
|
+
return app;
|
|
78
|
+
}) satisfies AppFactory;
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Then in `server.config.ts`:
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
export default defineServerConfig()
|
|
85
|
+
.routes(appRouter) // Routes registered to your custom app
|
|
86
|
+
.build();
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## Configuration Builder
|
|
92
|
+
|
|
93
|
+
### Basic Options
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
defineServerConfig()
|
|
97
|
+
.port(8790) // Server port
|
|
98
|
+
.host('0.0.0.0') // Server host
|
|
99
|
+
.routes(appRouter) // Router
|
|
100
|
+
.middlewares([...]) // Global middlewares
|
|
101
|
+
.build();
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Infrastructure Options
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
defineServerConfig()
|
|
108
|
+
.database(true) // Enable database (default: auto from env)
|
|
109
|
+
.redis(true) // Enable Redis (default: auto from env)
|
|
110
|
+
.build();
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### CORS Options
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
defineServerConfig()
|
|
117
|
+
.cors({
|
|
118
|
+
origin: ['https://example.com'],
|
|
119
|
+
methods: ['GET', 'POST', 'PUT', 'DELETE'],
|
|
120
|
+
credentials: true
|
|
121
|
+
})
|
|
122
|
+
.build();
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
### Lifecycle Hooks
|
|
126
|
+
|
|
127
|
+
```typescript
|
|
128
|
+
defineServerConfig()
|
|
129
|
+
.beforeStart(async () => {
|
|
130
|
+
// Before server starts
|
|
131
|
+
console.log('Initializing...');
|
|
132
|
+
})
|
|
133
|
+
.afterStart(async (server) => {
|
|
134
|
+
// After server is running
|
|
135
|
+
console.log(`Server running on port ${server.port}`);
|
|
136
|
+
})
|
|
137
|
+
.beforeShutdown(async () => {
|
|
138
|
+
// Before graceful shutdown
|
|
139
|
+
console.log('Shutting down...');
|
|
140
|
+
})
|
|
141
|
+
.build();
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## Router
|
|
147
|
+
|
|
148
|
+
### Define Router
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
import { defineRouter } from '@spfn/core/route';
|
|
152
|
+
|
|
153
|
+
export const appRouter = defineRouter({
|
|
154
|
+
getUser,
|
|
155
|
+
createUser,
|
|
156
|
+
updateUser,
|
|
157
|
+
deleteUser
|
|
158
|
+
});
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
### Nested Routers
|
|
162
|
+
|
|
163
|
+
```typescript
|
|
164
|
+
export const appRouter = defineRouter({
|
|
165
|
+
users: defineRouter({
|
|
166
|
+
get: getUser,
|
|
167
|
+
create: createUser,
|
|
168
|
+
list: getUsers
|
|
169
|
+
}),
|
|
170
|
+
posts: defineRouter({
|
|
171
|
+
get: getPost,
|
|
172
|
+
create: createPost
|
|
173
|
+
})
|
|
174
|
+
});
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Type Export
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
// server.config.ts
|
|
181
|
+
export type AppRouter = typeof appRouter;
|
|
182
|
+
|
|
183
|
+
// Use in Next.js client
|
|
184
|
+
import type { AppRouter } from '@/server/server.config';
|
|
185
|
+
import { createApi } from '@spfn/core/nextjs';
|
|
186
|
+
|
|
187
|
+
const api = createApi<AppRouter>();
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Graceful Shutdown
|
|
193
|
+
|
|
194
|
+
Automatic graceful shutdown handling:
|
|
195
|
+
|
|
196
|
+
1. Stop accepting new connections
|
|
197
|
+
2. Wait for in-flight requests
|
|
198
|
+
3. Close database connections
|
|
199
|
+
4. Close Redis connections
|
|
200
|
+
5. Exit process
|
|
201
|
+
|
|
202
|
+
**Signals handled:** `SIGTERM`, `SIGINT`
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Health Check
|
|
207
|
+
|
|
208
|
+
Built-in health endpoint at `/health`:
|
|
209
|
+
|
|
210
|
+
```bash
|
|
211
|
+
curl http://localhost:8790/health
|
|
212
|
+
# { "status": "ok", "timestamp": "2024-..." }
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Environment Variables
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
# Server
|
|
221
|
+
PORT=8790
|
|
222
|
+
HOST=localhost
|
|
223
|
+
NODE_ENV=development
|
|
224
|
+
|
|
225
|
+
# Database
|
|
226
|
+
DATABASE_URL=postgresql://localhost:5432/mydb
|
|
227
|
+
DATABASE_WRITE_URL=postgresql://primary:5432/mydb
|
|
228
|
+
DATABASE_READ_URL=postgresql://replica:5432/mydb
|
|
229
|
+
|
|
230
|
+
# Redis
|
|
231
|
+
REDIS_URL=redis://localhost:6379
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## File Structure
|
|
237
|
+
|
|
238
|
+
```
|
|
239
|
+
src/server/
|
|
240
|
+
├── server.config.ts # Configuration (Level 2)
|
|
241
|
+
├── app.ts # Custom Hono app (Level 3, optional)
|
|
242
|
+
├── index.ts # Entry point
|
|
243
|
+
├── entities/ # Database schema
|
|
244
|
+
├── repositories/ # Data access
|
|
245
|
+
├── routes/ # API routes
|
|
246
|
+
└── middlewares/ # Custom middleware
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Startup Banner
|
|
252
|
+
|
|
253
|
+
On startup, server displays:
|
|
254
|
+
|
|
255
|
+
```
|
|
256
|
+
╭──────────────────────────────────────╮
|
|
257
|
+
│ │
|
|
258
|
+
│ SPFN Server v1.0.0 │
|
|
259
|
+
│ │
|
|
260
|
+
│ http://localhost:8790 │
|
|
261
|
+
│ │
|
|
262
|
+
│ Press Ctrl+C to stop │
|
|
263
|
+
│ │
|
|
264
|
+
╰──────────────────────────────────────╯
|
|
265
|
+
|
|
266
|
+
✓ Database connected
|
|
267
|
+
✓ Redis connected
|
|
268
|
+
✓ 12 routes registered
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
---
|
|
272
|
+
|
|
273
|
+
## Best Practices
|
|
274
|
+
|
|
275
|
+
### Do
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
// 1. Export router type for client usage
|
|
279
|
+
export type AppRouter = typeof appRouter;
|
|
280
|
+
|
|
281
|
+
// 2. Use lifecycle hooks for initialization
|
|
282
|
+
.beforeStart(async () => {
|
|
283
|
+
await warmupCache();
|
|
284
|
+
})
|
|
285
|
+
|
|
286
|
+
// 3. Register global middlewares
|
|
287
|
+
.middlewares([authMiddleware, rateLimiter])
|
|
288
|
+
|
|
289
|
+
// 4. Use Level 2 for most projects
|
|
290
|
+
defineServerConfig()
|
|
291
|
+
.port(8790)
|
|
292
|
+
.routes(appRouter)
|
|
293
|
+
.build();
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
### Don't
|
|
297
|
+
|
|
298
|
+
```typescript
|
|
299
|
+
// 1. Don't hardcode port in production
|
|
300
|
+
.port(8790) // Use process.env.PORT instead
|
|
301
|
+
|
|
302
|
+
// 2. Don't skip database auto-init unless needed
|
|
303
|
+
.database(false) // Usually let it auto-detect
|
|
304
|
+
|
|
305
|
+
// 3. Don't use Level 3 unless necessary
|
|
306
|
+
// Level 2 covers most use cases
|
|
307
|
+
```
|
package/package.json
CHANGED
|
@@ -1,31 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spfn/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-beta.10",
|
|
4
4
|
"description": "SPFN Framework Core - File-based routing, transactions, repository pattern",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "./dist/index.js",
|
|
7
|
-
"types": "./dist/index.d.ts",
|
|
8
6
|
"exports": {
|
|
9
|
-
".": {
|
|
10
|
-
"types": "./dist/index.d.ts",
|
|
11
|
-
"import": "./dist/index.js",
|
|
12
|
-
"require": "./dist/index.js"
|
|
13
|
-
},
|
|
14
7
|
"./client": {
|
|
15
8
|
"types": "./dist/client/index.d.ts",
|
|
16
9
|
"import": "./dist/client/index.js",
|
|
17
10
|
"require": "./dist/client/index.js"
|
|
18
11
|
},
|
|
19
|
-
"./
|
|
20
|
-
"types": "./dist/
|
|
21
|
-
"import": "./dist/
|
|
22
|
-
"require": "./dist/
|
|
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"
|
|
23
21
|
},
|
|
24
22
|
"./route": {
|
|
25
23
|
"types": "./dist/route/index.d.ts",
|
|
26
24
|
"import": "./dist/route/index.js",
|
|
27
25
|
"require": "./dist/route/index.js"
|
|
28
26
|
},
|
|
27
|
+
"./route/types": {
|
|
28
|
+
"types": "./dist/route/types.d.ts",
|
|
29
|
+
"import": "./dist/route/types.js",
|
|
30
|
+
"require": "./dist/route/types.js"
|
|
31
|
+
},
|
|
29
32
|
"./db": {
|
|
30
33
|
"types": "./dist/db/index.d.ts",
|
|
31
34
|
"import": "./dist/db/index.js",
|
|
@@ -46,11 +49,6 @@
|
|
|
46
49
|
"import": "./dist/middleware/index.js",
|
|
47
50
|
"require": "./dist/middleware/index.js"
|
|
48
51
|
},
|
|
49
|
-
"./types": {
|
|
50
|
-
"types": "./dist/types/index.d.ts",
|
|
51
|
-
"import": "./dist/types/index.js",
|
|
52
|
-
"require": "./dist/types/index.js"
|
|
53
|
-
},
|
|
54
52
|
"./cache": {
|
|
55
53
|
"types": "./dist/cache/index.d.ts",
|
|
56
54
|
"import": "./dist/cache/index.js",
|
|
@@ -66,25 +64,40 @@
|
|
|
66
64
|
"import": "./dist/env/index.js",
|
|
67
65
|
"require": "./dist/env/index.js"
|
|
68
66
|
},
|
|
67
|
+
"./env/loader": {
|
|
68
|
+
"types": "./dist/env/loader.d.ts",
|
|
69
|
+
"import": "./dist/env/loader.js",
|
|
70
|
+
"require": "./dist/env/loader.js"
|
|
71
|
+
},
|
|
69
72
|
"./logger": {
|
|
70
73
|
"types": "./dist/logger/index.d.ts",
|
|
71
74
|
"import": "./dist/logger/index.js",
|
|
72
75
|
"require": "./dist/logger/index.js"
|
|
73
76
|
},
|
|
74
|
-
"./
|
|
75
|
-
"types": "./dist/
|
|
76
|
-
"import": "./dist/
|
|
77
|
-
"require": "./dist/
|
|
77
|
+
"./config": {
|
|
78
|
+
"types": "./dist/config/index.d.ts",
|
|
79
|
+
"import": "./dist/config/index.js",
|
|
80
|
+
"require": "./dist/config/index.js"
|
|
78
81
|
},
|
|
79
|
-
"./
|
|
80
|
-
"types": "./dist/
|
|
81
|
-
"import": "./dist/
|
|
82
|
-
"require": "./dist/
|
|
82
|
+
"./job": {
|
|
83
|
+
"types": "./dist/job/index.d.ts",
|
|
84
|
+
"import": "./dist/job/index.js",
|
|
85
|
+
"require": "./dist/job/index.js"
|
|
83
86
|
},
|
|
84
|
-
"./
|
|
85
|
-
"types": "./dist/
|
|
86
|
-
"import": "./dist/
|
|
87
|
-
"require": "./dist/
|
|
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"
|
|
88
101
|
}
|
|
89
102
|
},
|
|
90
103
|
"keywords": [
|
|
@@ -131,11 +144,12 @@
|
|
|
131
144
|
"chalk": "^5.6.2",
|
|
132
145
|
"chokidar": "^4.0.3",
|
|
133
146
|
"dotenv": "^17.2.3",
|
|
134
|
-
"drizzle-orm": "^0.
|
|
147
|
+
"drizzle-orm": "^0.45.0",
|
|
135
148
|
"drizzle-typebox": "^0.1.0",
|
|
136
|
-
"hono": "^4.
|
|
149
|
+
"hono": "^4.10.6",
|
|
137
150
|
"jiti": "^2.6.1",
|
|
138
151
|
"micromatch": "^4.0.8",
|
|
152
|
+
"pg-boss": "^11.1.2",
|
|
139
153
|
"postgres": "^3.4.0",
|
|
140
154
|
"typescript": "^5.3.3",
|
|
141
155
|
"zod": "^4.1.11"
|
|
@@ -148,12 +162,18 @@
|
|
|
148
162
|
"@types/node": "^20.11.0",
|
|
149
163
|
"@vitest/coverage-v8": "^4.0.6",
|
|
150
164
|
"drizzle-kit": "^0.31.6",
|
|
151
|
-
"
|
|
165
|
+
"madge": "^8.0.0",
|
|
166
|
+
"next": "^16.0.0",
|
|
152
167
|
"tsup": "^8.5.0",
|
|
153
168
|
"vitest": "^4.0.6"
|
|
154
169
|
},
|
|
155
170
|
"peerDependencies": {
|
|
156
|
-
"next": "^16.0.
|
|
171
|
+
"next": "^15.0.0 || ^16.0.0"
|
|
172
|
+
},
|
|
173
|
+
"peerDependenciesMeta": {
|
|
174
|
+
"next": {
|
|
175
|
+
"optional": true
|
|
176
|
+
}
|
|
157
177
|
},
|
|
158
178
|
"files": [
|
|
159
179
|
"dist",
|
|
@@ -163,28 +183,28 @@
|
|
|
163
183
|
],
|
|
164
184
|
"publishConfig": {
|
|
165
185
|
"access": "public",
|
|
166
|
-
"tag": "
|
|
186
|
+
"tag": "beta"
|
|
167
187
|
},
|
|
168
188
|
"scripts": {
|
|
169
|
-
"build": "tsup",
|
|
189
|
+
"build": "pnpm check:circular && tsup",
|
|
170
190
|
"dev": "tsup",
|
|
171
|
-
"test": "vitest",
|
|
172
|
-
"test:
|
|
173
|
-
"test:integration": "vitest --config vitest.integration.config.ts",
|
|
191
|
+
"test": "vitest run",
|
|
192
|
+
"test:watch": "vitest",
|
|
174
193
|
"test:coverage": "vitest run --config vitest.unit.config.ts --coverage",
|
|
175
|
-
"test:logger": "vitest src/logger",
|
|
176
|
-
"test:errors": "vitest src/errors",
|
|
177
|
-
"test:codegen": "vitest src/codegen",
|
|
178
|
-
"test:route": "vitest src/route",
|
|
179
|
-
"test:client": "vitest src/client",
|
|
180
|
-
"test:middleware": "vitest src/middleware",
|
|
181
|
-
"test:env": "vitest src/env",
|
|
182
|
-
"test:cache": "vitest src/cache --config vitest.integration.config.ts",
|
|
183
|
-
"test:db": "vitest src/db --config vitest.integration.config.ts",
|
|
184
|
-
"test:server": "vitest src/server --config vitest.integration.config.ts",
|
|
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",
|
|
185
204
|
"docker:test:up": "docker compose -f docker-compose.test.yml up -d",
|
|
186
205
|
"docker:test:down": "docker compose -f docker-compose.test.yml down",
|
|
187
206
|
"docker:test:logs": "docker compose -f docker-compose.test.yml logs -f",
|
|
207
|
+
"check:circular": "madge --circular --extensions ts src/",
|
|
188
208
|
"type-check": "tsc --noEmit"
|
|
189
209
|
}
|
|
190
210
|
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { MiddlewareHandler, Hono } from 'hono';
|
|
2
|
-
|
|
3
|
-
declare module 'hono' {
|
|
4
|
-
interface ContextVariableMap {
|
|
5
|
-
_skipMiddlewares?: string[];
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
/**
|
|
9
|
-
* AutoRouteLoader: Simplified File-based Routing System
|
|
10
|
-
*
|
|
11
|
-
* Features:
|
|
12
|
-
* - Auto-discovery: Scans routes directory and auto-registers
|
|
13
|
-
* - Dynamic routes: [id] → :id, [...slug] → *
|
|
14
|
-
* - Statistics: Route registration stats for dashboard
|
|
15
|
-
* - Grouping: Natural grouping by directory structure
|
|
16
|
-
*/
|
|
17
|
-
type RouteInfo = {
|
|
18
|
-
path: string;
|
|
19
|
-
file: string;
|
|
20
|
-
meta?: {
|
|
21
|
-
description?: string;
|
|
22
|
-
tags?: string[];
|
|
23
|
-
auth?: boolean;
|
|
24
|
-
[key: string]: unknown;
|
|
25
|
-
};
|
|
26
|
-
priority: number;
|
|
27
|
-
};
|
|
28
|
-
type RouteStats = {
|
|
29
|
-
total: number;
|
|
30
|
-
byPriority: {
|
|
31
|
-
static: number;
|
|
32
|
-
dynamic: number;
|
|
33
|
-
catchAll: number;
|
|
34
|
-
};
|
|
35
|
-
byTag: Record<string, number>;
|
|
36
|
-
routes: RouteInfo[];
|
|
37
|
-
};
|
|
38
|
-
declare class AutoRouteLoader {
|
|
39
|
-
private routesDir;
|
|
40
|
-
private routes;
|
|
41
|
-
private readonly debug;
|
|
42
|
-
private readonly middlewares;
|
|
43
|
-
constructor(routesDir: string, debug?: boolean, middlewares?: Array<{
|
|
44
|
-
name: string;
|
|
45
|
-
handler: MiddlewareHandler;
|
|
46
|
-
}>);
|
|
47
|
-
load(app: Hono): Promise<RouteStats>;
|
|
48
|
-
/**
|
|
49
|
-
* Load routes from an external directory (e.g., from SPFN function packages)
|
|
50
|
-
* Reads package.json spfn.prefix and mounts routes under that prefix
|
|
51
|
-
*
|
|
52
|
-
* @param app - Hono app instance
|
|
53
|
-
* @param routesDir - Directory containing route handlers
|
|
54
|
-
* @param packageName - Name of the package (for logging)
|
|
55
|
-
* @param prefix - Optional prefix to mount routes under (from package.json spfn.prefix)
|
|
56
|
-
* @returns Route statistics
|
|
57
|
-
*/
|
|
58
|
-
loadExternalRoutes(app: Hono, routesDir: string, packageName: string, prefix?: string): Promise<RouteStats>;
|
|
59
|
-
getStats(): RouteStats;
|
|
60
|
-
private scanFiles;
|
|
61
|
-
private isValidRouteFile;
|
|
62
|
-
private loadRoute;
|
|
63
|
-
private extractContractPaths;
|
|
64
|
-
private calculateContractPriority;
|
|
65
|
-
private validateModule;
|
|
66
|
-
private registerContractBasedMiddlewares;
|
|
67
|
-
private categorizeAndLogError;
|
|
68
|
-
private logStats;
|
|
69
|
-
}
|
|
70
|
-
declare function loadRoutes(app: Hono, options?: {
|
|
71
|
-
routesDir?: string;
|
|
72
|
-
debug?: boolean;
|
|
73
|
-
middlewares?: Array<{
|
|
74
|
-
name: string;
|
|
75
|
-
handler: MiddlewareHandler;
|
|
76
|
-
}>;
|
|
77
|
-
includeFunctionRoutes?: boolean;
|
|
78
|
-
}): Promise<RouteStats>;
|
|
79
|
-
|
|
80
|
-
export { AutoRouteLoader as A, type RouteInfo as R, type RouteStats as a, loadRoutes as l };
|