@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.
Files changed (97) hide show
  1. package/README.md +298 -466
  2. package/dist/boss-DI1r4kTS.d.ts +244 -0
  3. package/dist/cache/index.d.ts +13 -33
  4. package/dist/cache/index.js +14 -703
  5. package/dist/cache/index.js.map +1 -1
  6. package/dist/codegen/index.d.ts +214 -17
  7. package/dist/codegen/index.js +231 -1420
  8. package/dist/codegen/index.js.map +1 -1
  9. package/dist/config/index.d.ts +1227 -0
  10. package/dist/config/index.js +273 -0
  11. package/dist/config/index.js.map +1 -0
  12. package/dist/db/index.d.ts +741 -59
  13. package/dist/db/index.js +1063 -1226
  14. package/dist/db/index.js.map +1 -1
  15. package/dist/env/index.d.ts +658 -308
  16. package/dist/env/index.js +503 -928
  17. package/dist/env/index.js.map +1 -1
  18. package/dist/env/loader.d.ts +87 -0
  19. package/dist/env/loader.js +70 -0
  20. package/dist/env/loader.js.map +1 -0
  21. package/dist/errors/index.d.ts +417 -29
  22. package/dist/errors/index.js +359 -98
  23. package/dist/errors/index.js.map +1 -1
  24. package/dist/event/index.d.ts +41 -0
  25. package/dist/event/index.js +131 -0
  26. package/dist/event/index.js.map +1 -0
  27. package/dist/event/sse/client.d.ts +82 -0
  28. package/dist/event/sse/client.js +115 -0
  29. package/dist/event/sse/client.js.map +1 -0
  30. package/dist/event/sse/index.d.ts +40 -0
  31. package/dist/event/sse/index.js +92 -0
  32. package/dist/event/sse/index.js.map +1 -0
  33. package/dist/job/index.d.ts +218 -0
  34. package/dist/job/index.js +410 -0
  35. package/dist/job/index.js.map +1 -0
  36. package/dist/logger/index.d.ts +20 -79
  37. package/dist/logger/index.js +82 -387
  38. package/dist/logger/index.js.map +1 -1
  39. package/dist/middleware/index.d.ts +102 -20
  40. package/dist/middleware/index.js +51 -705
  41. package/dist/middleware/index.js.map +1 -1
  42. package/dist/nextjs/index.d.ts +120 -0
  43. package/dist/nextjs/index.js +448 -0
  44. package/dist/nextjs/index.js.map +1 -0
  45. package/dist/{client/nextjs/index.d.ts → nextjs/server.d.ts} +335 -262
  46. package/dist/nextjs/server.js +637 -0
  47. package/dist/nextjs/server.js.map +1 -0
  48. package/dist/route/index.d.ts +879 -25
  49. package/dist/route/index.js +697 -1271
  50. package/dist/route/index.js.map +1 -1
  51. package/dist/route/types.d.ts +9 -0
  52. package/dist/route/types.js +3 -0
  53. package/dist/route/types.js.map +1 -0
  54. package/dist/router-Di7ENoah.d.ts +151 -0
  55. package/dist/server/index.d.ts +345 -64
  56. package/dist/server/index.js +1174 -3233
  57. package/dist/server/index.js.map +1 -1
  58. package/dist/types-B-e_f2dQ.d.ts +121 -0
  59. package/dist/types-BGl4QL1w.d.ts +77 -0
  60. package/dist/types-BOPTApC2.d.ts +245 -0
  61. package/docs/cache.md +133 -0
  62. package/docs/codegen.md +74 -0
  63. package/docs/database.md +346 -0
  64. package/docs/entity.md +539 -0
  65. package/docs/env.md +477 -0
  66. package/docs/errors.md +319 -0
  67. package/docs/event.md +116 -0
  68. package/docs/file-upload.md +717 -0
  69. package/docs/job.md +131 -0
  70. package/docs/logger.md +108 -0
  71. package/docs/middleware.md +337 -0
  72. package/docs/nextjs.md +241 -0
  73. package/docs/repository.md +496 -0
  74. package/docs/route.md +497 -0
  75. package/docs/server.md +307 -0
  76. package/package.json +68 -48
  77. package/dist/auto-loader-JFaZ9gON.d.ts +0 -80
  78. package/dist/client/index.d.ts +0 -358
  79. package/dist/client/index.js +0 -357
  80. package/dist/client/index.js.map +0 -1
  81. package/dist/client/nextjs/index.js +0 -371
  82. package/dist/client/nextjs/index.js.map +0 -1
  83. package/dist/codegen/generators/index.d.ts +0 -19
  84. package/dist/codegen/generators/index.js +0 -1404
  85. package/dist/codegen/generators/index.js.map +0 -1
  86. package/dist/database-errors-BNNmLTJE.d.ts +0 -86
  87. package/dist/events/index.d.ts +0 -183
  88. package/dist/events/index.js +0 -77
  89. package/dist/events/index.js.map +0 -1
  90. package/dist/index-DHiAqhKv.d.ts +0 -101
  91. package/dist/index.d.ts +0 -8
  92. package/dist/index.js +0 -3674
  93. package/dist/index.js.map +0 -1
  94. package/dist/types/index.d.ts +0 -121
  95. package/dist/types/index.js +0 -38
  96. package/dist/types/index.js.map +0 -1
  97. 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.1.0-alpha.88",
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
- "./client/nextjs": {
20
- "types": "./dist/client/nextjs/index.d.ts",
21
- "import": "./dist/client/nextjs/index.js",
22
- "require": "./dist/client/nextjs/index.js"
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
- "./events": {
75
- "types": "./dist/events/index.d.ts",
76
- "import": "./dist/events/index.js",
77
- "require": "./dist/events/index.js"
77
+ "./config": {
78
+ "types": "./dist/config/index.d.ts",
79
+ "import": "./dist/config/index.js",
80
+ "require": "./dist/config/index.js"
78
81
  },
79
- "./generators": {
80
- "types": "./dist/codegen/generators/index.d.ts",
81
- "import": "./dist/codegen/generators/index.js",
82
- "require": "./dist/codegen/generators/index.js"
82
+ "./job": {
83
+ "types": "./dist/job/index.d.ts",
84
+ "import": "./dist/job/index.js",
85
+ "require": "./dist/job/index.js"
83
86
  },
84
- "./codegen/generators": {
85
- "types": "./dist/codegen/generators/index.d.ts",
86
- "import": "./dist/codegen/generators/index.js",
87
- "require": "./dist/codegen/generators/index.js"
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.44.7",
147
+ "drizzle-orm": "^0.45.0",
135
148
  "drizzle-typebox": "^0.1.0",
136
- "hono": "^4.9.0",
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
- "next": "^16.0.1",
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.1"
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": "alpha"
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:unit": "vitest --config vitest.unit.config.ts",
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 };