@spfn/core 0.1.0-alpha.88 → 0.2.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 (71) hide show
  1. package/README.md +1046 -384
  2. package/dist/boss-D-fGtVgM.d.ts +187 -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 +167 -17
  7. package/dist/codegen/index.js +76 -1419
  8. package/dist/codegen/index.js.map +1 -1
  9. package/dist/config/index.d.ts +1191 -0
  10. package/dist/config/index.js +264 -0
  11. package/dist/config/index.js.map +1 -0
  12. package/dist/db/index.d.ts +728 -59
  13. package/dist/db/index.js +1028 -1225
  14. package/dist/db/index.js.map +1 -1
  15. package/dist/env/index.d.ts +579 -308
  16. package/dist/env/index.js +438 -930
  17. package/dist/env/index.js.map +1 -1
  18. package/dist/errors/index.d.ts +417 -29
  19. package/dist/errors/index.js +359 -98
  20. package/dist/errors/index.js.map +1 -1
  21. package/dist/event/index.d.ts +108 -0
  22. package/dist/event/index.js +122 -0
  23. package/dist/event/index.js.map +1 -0
  24. package/dist/job/index.d.ts +172 -0
  25. package/dist/job/index.js +361 -0
  26. package/dist/job/index.js.map +1 -0
  27. package/dist/logger/index.d.ts +20 -79
  28. package/dist/logger/index.js +82 -387
  29. package/dist/logger/index.js.map +1 -1
  30. package/dist/middleware/index.d.ts +2 -11
  31. package/dist/middleware/index.js +49 -703
  32. package/dist/middleware/index.js.map +1 -1
  33. package/dist/nextjs/index.d.ts +120 -0
  34. package/dist/nextjs/index.js +416 -0
  35. package/dist/nextjs/index.js.map +1 -0
  36. package/dist/{client/nextjs/index.d.ts → nextjs/server.d.ts} +288 -262
  37. package/dist/nextjs/server.js +568 -0
  38. package/dist/nextjs/server.js.map +1 -0
  39. package/dist/route/index.d.ts +686 -25
  40. package/dist/route/index.js +440 -1287
  41. package/dist/route/index.js.map +1 -1
  42. package/dist/route/types.d.ts +38 -0
  43. package/dist/route/types.js +3 -0
  44. package/dist/route/types.js.map +1 -0
  45. package/dist/server/index.d.ts +201 -67
  46. package/dist/server/index.js +921 -3182
  47. package/dist/server/index.js.map +1 -1
  48. package/dist/types-BGl4QL1w.d.ts +77 -0
  49. package/dist/types-DRG2XMTR.d.ts +157 -0
  50. package/package.json +52 -47
  51. package/dist/auto-loader-JFaZ9gON.d.ts +0 -80
  52. package/dist/client/index.d.ts +0 -358
  53. package/dist/client/index.js +0 -357
  54. package/dist/client/index.js.map +0 -1
  55. package/dist/client/nextjs/index.js +0 -371
  56. package/dist/client/nextjs/index.js.map +0 -1
  57. package/dist/codegen/generators/index.d.ts +0 -19
  58. package/dist/codegen/generators/index.js +0 -1404
  59. package/dist/codegen/generators/index.js.map +0 -1
  60. package/dist/database-errors-BNNmLTJE.d.ts +0 -86
  61. package/dist/events/index.d.ts +0 -183
  62. package/dist/events/index.js +0 -77
  63. package/dist/events/index.js.map +0 -1
  64. package/dist/index-DHiAqhKv.d.ts +0 -101
  65. package/dist/index.d.ts +0 -8
  66. package/dist/index.js +0 -3674
  67. package/dist/index.js.map +0 -1
  68. package/dist/types/index.d.ts +0 -121
  69. package/dist/types/index.js +0 -38
  70. package/dist/types/index.js.map +0 -1
  71. package/dist/types-BXibIEyj.d.ts +0 -60
@@ -1,62 +1,17 @@
1
1
  import { MiddlewareHandler, Hono } from 'hono';
2
2
  import { cors } from 'hono/cors';
3
3
  import { serve } from '@hono/node-server';
4
+ import { NamedMiddleware, Router } from '@spfn/core/route';
5
+ import { J as JobRouter, B as BossConfig } from '../boss-D-fGtVgM.js';
6
+ import '@sinclair/typebox';
7
+ import 'pg-boss';
8
+
9
+ declare function loadEnvFiles(): void;
4
10
 
5
11
  /**
6
12
  * CORS configuration options - inferred from hono/cors
7
13
  */
8
14
  type CorsConfig = Parameters<typeof cors>[0];
9
- /**
10
- * SPFN Plugin Interface
11
- *
12
- * Allows packages to automatically hook into server lifecycle
13
- * Plugins are auto-discovered from @spfn/* packages in node_modules
14
- *
15
- * @example
16
- * ```typescript
17
- * // packages/auth/src/plugin.ts
18
- * export const spfnPlugin: ServerPlugin = {
19
- * name: '@spfn/auth',
20
- * afterInfrastructure: async () => {
21
- * await initializeAuth();
22
- * },
23
- * beforeRoutes: async (app) => {
24
- * app.route('/_auth', authRoutes);
25
- * }
26
- * };
27
- * ```
28
- */
29
- interface ServerPlugin {
30
- /**
31
- * Plugin name (should match package name)
32
- */
33
- name: string;
34
- /**
35
- * Hook: Run after infrastructure (DB/Redis) initialization
36
- * Use for: migrations, seeding, RBAC setup
37
- */
38
- afterInfrastructure?: () => Promise<void>;
39
- /**
40
- * Hook: Run before routes are loaded
41
- * Use for: mounting plugin routes, adding middleware
42
- */
43
- beforeRoutes?: (app: Hono) => Promise<void>;
44
- /**
45
- * Hook: Run after all routes are loaded
46
- * Use for: final setup, fallback handlers
47
- */
48
- afterRoutes?: (app: Hono) => Promise<void>;
49
- /**
50
- * Hook: Run after server starts successfully
51
- * Use for: notifications, health checks
52
- */
53
- afterStart?: (instance: ServerInstance) => Promise<void>;
54
- /**
55
- * Hook: Run before graceful shutdown
56
- * Use for: cleanup plugin resources
57
- */
58
- beforeShutdown?: () => Promise<void>;
59
- }
60
15
  /**
61
16
  * Server Configuration Options
62
17
  *
@@ -99,28 +54,70 @@ interface ServerConfig {
99
54
  use?: MiddlewareHandler[];
100
55
  /**
101
56
  * Global middlewares with names for route-level skip control
102
- * Each middleware can be skipped per route using meta.skipMiddlewares
57
+ * Use defineMiddleware() for type-safe middleware definitions
103
58
  *
104
59
  * @example
105
60
  * ```typescript
106
- * import { authMiddleware } from '@spfn/auth';
61
+ * import { defineMiddleware } from '@spfn/core/server';
62
+ *
63
+ * const authMiddleware = defineMiddleware('auth', async (c, next) => {
64
+ * // auth logic
65
+ * await next();
66
+ * });
107
67
  *
108
- * export default {
109
- * middlewares: [
110
- * { name: 'auth', handler: authMiddleware() },
111
- * { name: 'rateLimit', handler: rateLimitMiddleware() },
112
- * ]
113
- * } satisfies ServerConfig;
68
+ * export default defineServerConfig()
69
+ * .middlewares([authMiddleware, rateLimitMiddleware])
70
+ * .build();
114
71
  * ```
115
72
  */
116
- middlewares?: Array<{
117
- name: string;
118
- handler: MiddlewareHandler;
119
- }>;
73
+ middlewares?: readonly NamedMiddleware[];
120
74
  /**
121
- * Routes directory path (default: src/server/routes)
75
+ * define-route based router
76
+ * Routes defined with route.get()...handler() style
77
+ * Will be automatically registered before file-based routes
78
+ *
79
+ * @example
80
+ * ```typescript
81
+ * import { defineRouter, route } from '@spfn/core/route';
82
+ *
83
+ * const appRouter = defineRouter({
84
+ * getUser: route.get('/users/:id')...
85
+ * createUser: route.post('/users')...
86
+ * });
87
+ *
88
+ * export default defineServerConfig()
89
+ * .routes(appRouter)
90
+ * .build();
91
+ * ```
92
+ */
93
+ routes?: Router<any>;
94
+ /**
95
+ * Background jobs router
96
+ * Jobs defined with job()...handler() style
97
+ * Uses pg-boss for PostgreSQL-based job queue
98
+ *
99
+ * @example
100
+ * ```typescript
101
+ * import { job, defineJobRouter } from '@spfn/core/job';
102
+ *
103
+ * const sendEmail = job('send-email')
104
+ * .input(Type.Object({ to: Type.String() }))
105
+ * .handler(async (input) => { ... });
106
+ *
107
+ * const jobRouter = defineJobRouter({ sendEmail });
108
+ *
109
+ * export default defineServerConfig()
110
+ * .routes(appRouter)
111
+ * .jobs(jobRouter)
112
+ * .build();
113
+ * ```
122
114
  */
123
- routesPath?: string;
115
+ jobs?: JobRouter<any>;
116
+ /**
117
+ * pg-boss configuration options
118
+ * Only used if jobs router is provided
119
+ */
120
+ jobsConfig?: Omit<BossConfig, 'connectionString'>;
124
121
  /**
125
122
  * Enable debug mode (default: NODE_ENV === 'development')
126
123
  */
@@ -456,7 +453,7 @@ declare module 'hono' {
456
453
  * 2. server.config.ts -> Partial customization
457
454
  * 3. app.ts -> Full control (no auto config)
458
455
  */
459
- declare function createServer(config?: ServerConfig, plugins?: ServerPlugin[]): Promise<Hono>;
456
+ declare function createServer(config?: ServerConfig): Promise<Hono>;
460
457
 
461
458
  /**
462
459
  * Start SPFN Server
@@ -475,4 +472,141 @@ declare function createServer(config?: ServerConfig, plugins?: ServerPlugin[]):
475
472
  */
476
473
  declare function startServer(config?: ServerConfig): Promise<ServerInstance>;
477
474
 
478
- export { type AppFactory, type ServerConfig, type ServerInstance, type ServerPlugin, createServer, startServer };
475
+ /**
476
+ * Server Config Builder
477
+ *
478
+ * Provides a fluent API for building server configuration
479
+ */
480
+
481
+ declare class ServerConfigBuilder {
482
+ private config;
483
+ private lifecycles;
484
+ /**
485
+ * Set server port
486
+ */
487
+ port(port: number): this;
488
+ /**
489
+ * Set server hostname
490
+ */
491
+ host(host: string): this;
492
+ /**
493
+ * Set CORS configuration
494
+ */
495
+ cors(cors: ServerConfig['cors']): this;
496
+ /**
497
+ * Configure built-in middleware
498
+ */
499
+ middleware(middleware: ServerConfig['middleware']): this;
500
+ /**
501
+ * Add custom middleware
502
+ */
503
+ use(handlers: MiddlewareHandler[]): this;
504
+ /**
505
+ * Add named middlewares for route-level skip control
506
+ */
507
+ middlewares(middlewares: ServerConfig['middlewares']): this;
508
+ /**
509
+ * Register define-route based router
510
+ *
511
+ * Automatically applies:
512
+ * - Global middlewares from router._globalMiddlewares (via .use())
513
+ * - Package routers from router._packageRouters (via .packages())
514
+ *
515
+ * @example
516
+ * ```typescript
517
+ * const appRouter = defineRouter({
518
+ * getUser: route.get('/users/:id')...
519
+ * })
520
+ * .packages([authRouter, cmsAppRouter])
521
+ * .use([authMiddleware]);
522
+ *
523
+ * export default defineServerConfig()
524
+ * .routes(appRouter) // middlewares auto-applied
525
+ * .build();
526
+ * ```
527
+ */
528
+ routes(router: Router<any>): this;
529
+ /**
530
+ * Register background jobs router
531
+ *
532
+ * @example
533
+ * ```typescript
534
+ * import { job, defineJobRouter } from '@spfn/core/job';
535
+ *
536
+ * const sendEmail = job('send-email')
537
+ * .input(Type.Object({ to: Type.String() }))
538
+ * .handler(async (input) => { ... });
539
+ *
540
+ * const jobRouter = defineJobRouter({ sendEmail });
541
+ *
542
+ * export default defineServerConfig()
543
+ * .routes(appRouter)
544
+ * .jobs(jobRouter)
545
+ * .build();
546
+ * ```
547
+ */
548
+ jobs(router: JobRouter<any>, config?: Omit<BossConfig, 'connectionString'>): this;
549
+ /**
550
+ * Enable/disable debug mode
551
+ */
552
+ debug(enabled: boolean): this;
553
+ /**
554
+ * Configure database settings
555
+ */
556
+ database(database: ServerConfig['database']): this;
557
+ /**
558
+ * Configure server timeout settings
559
+ */
560
+ timeout(timeout: ServerConfig['timeout']): this;
561
+ /**
562
+ * Configure graceful shutdown settings
563
+ */
564
+ shutdown(shutdown: ServerConfig['shutdown']): this;
565
+ /**
566
+ * Configure health check endpoint
567
+ */
568
+ healthCheck(healthCheck: ServerConfig['healthCheck']): this;
569
+ /**
570
+ * Configure infrastructure initialization
571
+ */
572
+ infrastructure(infrastructure: ServerConfig['infrastructure']): this;
573
+ /**
574
+ * Configure lifecycle hooks
575
+ * Can be called multiple times - hooks will be executed in registration order
576
+ */
577
+ lifecycle(lifecycle: ServerConfig['lifecycle']): this;
578
+ /**
579
+ * Build and return the final configuration
580
+ */
581
+ build(): ServerConfig;
582
+ private mergeLifecycles;
583
+ }
584
+ /**
585
+ * Create a new server configuration builder
586
+ *
587
+ * @example
588
+ * ```typescript
589
+ * // server.config.ts
590
+ * import { defineServerConfig, route, defineRouter } from '@spfn/core/server';
591
+ * import { Type } from '@sinclair/typebox';
592
+ *
593
+ * const appRouter = defineRouter({
594
+ * getUser: route.get('/users/:id')
595
+ * .input(Type.Object({ id: Type.String() }))
596
+ * .handler(async (c) => {
597
+ * const { id } = await c.data();
598
+ * return c.success({ id, name: 'John' });
599
+ * }),
600
+ * });
601
+ *
602
+ * export default defineServerConfig()
603
+ * .port(3000)
604
+ * .routes(appRouter)
605
+ * .middleware({ logger: true, cors: true })
606
+ * .debug(true)
607
+ * .build();
608
+ * ```
609
+ */
610
+ declare function defineServerConfig(): ServerConfigBuilder;
611
+
612
+ export { type AppFactory, type ServerConfig, type ServerInstance, createServer, defineServerConfig, loadEnvFiles, startServer };