inviton-backduck 1.0.0
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/LICENSE +21 -0
- package/README.md +302 -0
- package/dist/apidoc/api-doc-generator.d.ts +58 -0
- package/dist/apidoc/api-doc-generator.d.ts.map +1 -0
- package/dist/apidoc/api-doc-generator.js +201 -0
- package/dist/apidoc/api-doc-generator.js.map +1 -0
- package/dist/apidoc/config.d.ts +153 -0
- package/dist/apidoc/config.d.ts.map +1 -0
- package/dist/apidoc/config.js +254 -0
- package/dist/apidoc/config.js.map +1 -0
- package/dist/apidoc/controller-parser.d.ts +208 -0
- package/dist/apidoc/controller-parser.d.ts.map +1 -0
- package/dist/apidoc/controller-parser.js +686 -0
- package/dist/apidoc/controller-parser.js.map +1 -0
- package/dist/apidoc/html-generator.d.ts +290 -0
- package/dist/apidoc/html-generator.d.ts.map +1 -0
- package/dist/apidoc/html-generator.js +2295 -0
- package/dist/apidoc/html-generator.js.map +1 -0
- package/dist/apidoc/index.d.ts +20 -0
- package/dist/apidoc/index.d.ts.map +1 -0
- package/dist/apidoc/index.js +16 -0
- package/dist/apidoc/index.js.map +1 -0
- package/dist/apidoc/openapi-builder.d.ts +169 -0
- package/dist/apidoc/openapi-builder.d.ts.map +1 -0
- package/dist/apidoc/openapi-builder.js +634 -0
- package/dist/apidoc/openapi-builder.js.map +1 -0
- package/dist/apidoc/parameterGeneratorRegistry.d.ts +20 -0
- package/dist/apidoc/parameterGeneratorRegistry.d.ts.map +1 -0
- package/dist/apidoc/parameterGeneratorRegistry.js +6 -0
- package/dist/apidoc/parameterGeneratorRegistry.js.map +1 -0
- package/dist/apidoc/test-type-resolver.d.ts +2 -0
- package/dist/apidoc/test-type-resolver.d.ts.map +1 -0
- package/dist/apidoc/test-type-resolver.js +6 -0
- package/dist/apidoc/test-type-resolver.js.map +1 -0
- package/dist/apidoc/type-resolver.d.ts +266 -0
- package/dist/apidoc/type-resolver.d.ts.map +1 -0
- package/dist/apidoc/type-resolver.js +1226 -0
- package/dist/apidoc/type-resolver.js.map +1 -0
- package/dist/apidoc/verify-type-resolution.d.ts +3 -0
- package/dist/apidoc/verify-type-resolution.d.ts.map +1 -0
- package/dist/apidoc/verify-type-resolution.js +29 -0
- package/dist/apidoc/verify-type-resolution.js.map +1 -0
- package/dist/bun/bunRouter.d.ts +70 -0
- package/dist/bun/bunRouter.d.ts.map +1 -0
- package/dist/bun/bunRouter.js +324 -0
- package/dist/bun/bunRouter.js.map +1 -0
- package/dist/bun/bunServer.d.ts +72 -0
- package/dist/bun/bunServer.d.ts.map +1 -0
- package/dist/bun/bunServer.js +218 -0
- package/dist/bun/bunServer.js.map +1 -0
- package/dist/bun/bunStaticFiles.d.ts +76 -0
- package/dist/bun/bunStaticFiles.d.ts.map +1 -0
- package/dist/bun/bunStaticFiles.js +251 -0
- package/dist/bun/bunStaticFiles.js.map +1 -0
- package/dist/bun/index.d.ts +7 -0
- package/dist/bun/index.d.ts.map +1 -0
- package/dist/bun/index.js +7 -0
- package/dist/bun/index.js.map +1 -0
- package/dist/data-contracts.d.ts +132 -0
- package/dist/data-contracts.d.ts.map +1 -0
- package/dist/data-contracts.js +2 -0
- package/dist/data-contracts.js.map +1 -0
- package/dist/decorators.d.ts +75 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +101 -0
- package/dist/decorators.js.map +1 -0
- package/dist/express/expressFrontendRouter.d.ts +17 -0
- package/dist/express/expressFrontendRouter.d.ts.map +1 -0
- package/dist/express/expressFrontendRouter.js +33 -0
- package/dist/express/expressFrontendRouter.js.map +1 -0
- package/dist/express/expressRouter.d.ts +25 -0
- package/dist/express/expressRouter.d.ts.map +1 -0
- package/dist/express/expressRouter.js +150 -0
- package/dist/express/expressRouter.js.map +1 -0
- package/dist/express/index.d.ts +6 -0
- package/dist/express/index.d.ts.map +1 -0
- package/dist/express/index.js +6 -0
- package/dist/express/index.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +52 -0
- package/dist/index.js.map +1 -0
- package/dist/router.d.ts +162 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +350 -0
- package/dist/router.js.map +1 -0
- package/dist/runtime-detect.d.ts +20 -0
- package/dist/runtime-detect.d.ts.map +1 -0
- package/dist/runtime-detect.js +20 -0
- package/dist/runtime-detect.js.map +1 -0
- package/dist/server.d.ts +126 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +181 -0
- package/dist/server.js.map +1 -0
- package/dist/utils.d.ts +83 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +157 -0
- package/dist/utils.js.map +1 -0
- package/package.json +65 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @server-runtime - Runtime-agnostic utilities for building web servers
|
|
3
|
+
*
|
|
4
|
+
* This package provides a unified API for building web servers that can run on
|
|
5
|
+
* both Node.js (with Express) and Bun natively. Write your server code once,
|
|
6
|
+
* and it will automatically adapt to the runtime environment.
|
|
7
|
+
*
|
|
8
|
+
* Key Features:
|
|
9
|
+
* - Universal Router: Define routes once, run anywhere
|
|
10
|
+
* - Controller-based routing with automatic REST mapping
|
|
11
|
+
* - Runtime detection and automatic adaptation
|
|
12
|
+
* - Type-safe request/response handling
|
|
13
|
+
* - Middleware support with chaining
|
|
14
|
+
* - Static file serving with compression
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { createRouter, createServer, Route, ControllerBase } from '@server-runtime';
|
|
19
|
+
*
|
|
20
|
+
* // Define a controller
|
|
21
|
+
* @Route('/products')
|
|
22
|
+
* class ProductController extends ControllerBase {
|
|
23
|
+
* async getAll() { return products; }
|
|
24
|
+
* async get(args: { id: number }) { return product; }
|
|
25
|
+
* async post(args: CreateProductArgs) { return created; }
|
|
26
|
+
* }
|
|
27
|
+
*
|
|
28
|
+
* // Create router and register controllers
|
|
29
|
+
* const router = createRouter();
|
|
30
|
+
* router.registerController(ProductController);
|
|
31
|
+
*
|
|
32
|
+
* // Create and start server
|
|
33
|
+
* const server = createServer({
|
|
34
|
+
* port: 3000,
|
|
35
|
+
* apiRouters: { '/api': router }
|
|
36
|
+
* });
|
|
37
|
+
* await server.start();
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
// API Documentation - Generate OpenAPI and HTML documentation from TypeScript controllers
|
|
41
|
+
export * from './apidoc';
|
|
42
|
+
// Decorators - Controller and route configuration
|
|
43
|
+
export { ControllerGetMiddlewares, Middleware as MiddlewareDecorator, ParseRequestArgs, RequestSize, Route, } from './decorators';
|
|
44
|
+
// Router - Route definition and controller registration
|
|
45
|
+
export { ControllerBase, createRouter, WebRouter as UniversalRouter, WebRouter, } from './router';
|
|
46
|
+
// Runtime detection - Detect current runtime environment
|
|
47
|
+
export { IS_BUN, RUNTIME } from './runtime-detect';
|
|
48
|
+
// Server - Server creation and configuration
|
|
49
|
+
export { createServer, UniversalServer, } from './server';
|
|
50
|
+
// Utils - Request parsing and helper utilities
|
|
51
|
+
export { RuntimeUtils } from './utils';
|
|
52
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAEH,0FAA0F;AAC1F,cAAc,UAAU,CAAC;AAYzB,kDAAkD;AAClD,OAAO,EACN,wBAAwB,EACxB,UAAU,IAAI,mBAAmB,EACjC,gBAAgB,EAChB,WAAW,EACX,KAAK,GACL,MAAM,cAAc,CAAC;AAEtB,wDAAwD;AACxD,OAAO,EACN,cAAc,EACd,YAAY,EAGZ,SAAS,IAAI,eAAe,EAC5B,SAAS,GACT,MAAM,UAAU,CAAC;AAElB,yDAAyD;AACzD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEnD,6CAA6C;AAC7C,OAAO,EAEN,YAAY,EAGZ,eAAe,GAEf,MAAM,UAAU,CAAC;AAElB,+CAA+C;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/router.d.ts
ADDED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Router - Runtime-agnostic router that builds to Express or Bun natively
|
|
3
|
+
*/
|
|
4
|
+
import type { Router as ExpressRouter } from 'express';
|
|
5
|
+
import type { BunRouter } from './bun';
|
|
6
|
+
import type { MiddlewareDefinition, RouteHandler, WebRequest, WebResponse } from './data-contracts';
|
|
7
|
+
/**
|
|
8
|
+
* HTTP methods supported by the router
|
|
9
|
+
*/
|
|
10
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
|
|
11
|
+
/**
|
|
12
|
+
* Controller interface for automatic route binding
|
|
13
|
+
* Controllers implement standard REST methods that are automatically mapped to routes
|
|
14
|
+
*/
|
|
15
|
+
export interface IController {
|
|
16
|
+
/** Base route path for the controller */
|
|
17
|
+
$route?: string;
|
|
18
|
+
/** Authentication function that runs before route handlers */
|
|
19
|
+
$auth?: (req: WebRequest, res: WebResponse) => Promise<boolean>;
|
|
20
|
+
/** Request body size limit (Express only) */
|
|
21
|
+
$requestSize?: string;
|
|
22
|
+
/** Middleware functions to run before route handlers */
|
|
23
|
+
$middlewares?: MiddlewareDefinition[];
|
|
24
|
+
/** GET handler for listing resources (mapped to GET /) */
|
|
25
|
+
getAll?: <TRequest, TResponse>(args: TRequest, req?: WebRequest, res?: WebResponse) => Promise<TResponse>;
|
|
26
|
+
/** GET handler for fetching single resource (mapped to GET /:id) */
|
|
27
|
+
get?: <TRequest, TResponse>(args: TRequest, req?: WebRequest, res?: WebResponse) => Promise<TResponse>;
|
|
28
|
+
/** POST handler for creating resources (mapped to POST /) */
|
|
29
|
+
post?: <TRequest, TResponse>(args: TRequest, req?: WebRequest, res?: WebResponse) => Promise<TResponse>;
|
|
30
|
+
/** PATCH handler for partial updates (mapped to PATCH /:id) */
|
|
31
|
+
patch?: <TRequest, TResponse>(args: TRequest, req?: WebRequest, res?: WebResponse) => Promise<TResponse>;
|
|
32
|
+
/** PUT handler for full updates (mapped to PUT /:id) */
|
|
33
|
+
put?: <TRequest, TResponse>(args: TRequest, req?: WebRequest, res?: WebResponse) => Promise<TResponse>;
|
|
34
|
+
/** DELETE handler for removing resources (mapped to DELETE /:id) */
|
|
35
|
+
delete?: <TRequest, TResponse>(args: TRequest, req?: WebRequest, res?: WebResponse) => Promise<TResponse>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Base class for controllers that provides automatic route binding
|
|
39
|
+
*/
|
|
40
|
+
export declare class ControllerBase implements IController {
|
|
41
|
+
}
|
|
42
|
+
export type { BunNativeRoutes, BunRouteDefinition } from './bun';
|
|
43
|
+
export { BunRouter } from './bun';
|
|
44
|
+
/**
|
|
45
|
+
* Universal Router - define routes once, build for Express or Bun
|
|
46
|
+
* Provides a runtime-agnostic API for defining HTTP routes and middleware
|
|
47
|
+
*/
|
|
48
|
+
export declare class WebRouter {
|
|
49
|
+
private routes;
|
|
50
|
+
private subRouters;
|
|
51
|
+
private globalMiddlewares;
|
|
52
|
+
/**
|
|
53
|
+
* Add global middleware or mount a sub-router
|
|
54
|
+
* @param middleware - Middleware function to apply to all routes
|
|
55
|
+
* @param path - Path prefix for mounting a sub-router
|
|
56
|
+
* @param router - Sub-router to mount at the given path
|
|
57
|
+
* @returns This router instance for chaining
|
|
58
|
+
*/
|
|
59
|
+
use(middleware: MiddlewareDefinition): this;
|
|
60
|
+
use(path: string, router: WebRouter): this;
|
|
61
|
+
/**
|
|
62
|
+
* Register a GET route
|
|
63
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
64
|
+
* @param handlers - Middleware and route handler functions
|
|
65
|
+
* @returns This router instance for chaining
|
|
66
|
+
*/
|
|
67
|
+
get(path: string, ...handlers: (RouteHandler | MiddlewareDefinition)[]): this;
|
|
68
|
+
/**
|
|
69
|
+
* Register a POST route
|
|
70
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
71
|
+
* @param handlers - Middleware and route handler functions
|
|
72
|
+
* @returns This router instance for chaining
|
|
73
|
+
*/
|
|
74
|
+
post(path: string, ...handlers: (RouteHandler | MiddlewareDefinition)[]): this;
|
|
75
|
+
/**
|
|
76
|
+
* Register a PUT route
|
|
77
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
78
|
+
* @param handlers - Middleware and route handler functions
|
|
79
|
+
* @returns This router instance for chaining
|
|
80
|
+
*/
|
|
81
|
+
put(path: string, ...handlers: (RouteHandler | MiddlewareDefinition)[]): this;
|
|
82
|
+
/**
|
|
83
|
+
* Register a PATCH route
|
|
84
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
85
|
+
* @param handlers - Middleware and route handler functions
|
|
86
|
+
* @returns This router instance for chaining
|
|
87
|
+
*/
|
|
88
|
+
patch(path: string, ...handlers: (RouteHandler | MiddlewareDefinition)[]): this;
|
|
89
|
+
/**
|
|
90
|
+
* Register a DELETE route
|
|
91
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
92
|
+
* @param handlers - Middleware and route handler functions
|
|
93
|
+
* @returns This router instance for chaining
|
|
94
|
+
*/
|
|
95
|
+
delete(path: string, ...handlers: (RouteHandler | MiddlewareDefinition)[]): this;
|
|
96
|
+
/**
|
|
97
|
+
* Register a GET route with a regex pattern
|
|
98
|
+
* Useful for complex pattern matching (e.g., SPA routes with locale prefixes)
|
|
99
|
+
* @param pattern - Regular expression for matching the URL path
|
|
100
|
+
* @param paramNames - Names for captured groups in the regex
|
|
101
|
+
* @param handlers - Middleware and route handler functions
|
|
102
|
+
* @returns This router instance for chaining
|
|
103
|
+
* @example
|
|
104
|
+
* ```typescript
|
|
105
|
+
* router.getRegex(/^\/(en|sk|cs)\/products$/, ['locale'], (req, res) => {
|
|
106
|
+
* const locale = req.params.locale; // 'en', 'sk', or 'cs'
|
|
107
|
+
* });
|
|
108
|
+
* ```
|
|
109
|
+
*/
|
|
110
|
+
getRegex(pattern: RegExp, paramNames: string[], ...handlers: (RouteHandler | MiddlewareDefinition)[]): this;
|
|
111
|
+
private addRegexRoute;
|
|
112
|
+
/**
|
|
113
|
+
* Register a controller class with automatic route binding
|
|
114
|
+
* Maps controller methods (get, post, etc.) to HTTP routes automatically
|
|
115
|
+
* @param ControllerClass - Controller class to register
|
|
116
|
+
* @returns This router instance for chaining
|
|
117
|
+
* @example
|
|
118
|
+
* ```typescript
|
|
119
|
+
* @Route('/products')
|
|
120
|
+
* class ProductController extends ControllerBase {
|
|
121
|
+
* async getAll() { return products; } // GET /products
|
|
122
|
+
* async get(args: { id: number }) { return product; } // GET /products/:id
|
|
123
|
+
* async post(args: CreateProductArgs) { return created; } // POST /products
|
|
124
|
+
* }
|
|
125
|
+
*
|
|
126
|
+
* router.registerController(ProductController);
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
129
|
+
registerController<TController extends ControllerBase>(ControllerClass: new () => TController): this;
|
|
130
|
+
private bindControllerMethod;
|
|
131
|
+
private addRoute;
|
|
132
|
+
/**
|
|
133
|
+
* Build router for current runtime (Express or Bun)
|
|
134
|
+
* Automatically detects runtime and builds appropriate router implementation
|
|
135
|
+
* @returns Promise that resolves to Express Router or Bun Router
|
|
136
|
+
*/
|
|
137
|
+
build(): Promise<ExpressRouter | BunRouter>;
|
|
138
|
+
/**
|
|
139
|
+
* Build router for Express runtime
|
|
140
|
+
* @returns Promise that resolves to Express Router
|
|
141
|
+
*/
|
|
142
|
+
buildExpress(): Promise<ExpressRouter>;
|
|
143
|
+
/**
|
|
144
|
+
* Build router for Bun runtime
|
|
145
|
+
* @param basePath - Optional base path prefix for all routes
|
|
146
|
+
* @returns Promise that resolves to Bun Router
|
|
147
|
+
*/
|
|
148
|
+
buildBun(basePath?: string): Promise<BunRouter>;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Create a new WebRouter instance
|
|
152
|
+
* Factory function for creating runtime-agnostic routers
|
|
153
|
+
* @returns New WebRouter instance
|
|
154
|
+
* @example
|
|
155
|
+
* ```typescript
|
|
156
|
+
* const router = createRouter();
|
|
157
|
+
* router.get('/health', (req, res) => res.json({ status: 'ok' }));
|
|
158
|
+
* router.registerController(UserController);
|
|
159
|
+
* ```
|
|
160
|
+
*/
|
|
161
|
+
export declare const createRouter: () => WebRouter;
|
|
162
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|
package/dist/router.js
ADDED
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal Router - Runtime-agnostic router that builds to Express or Bun natively
|
|
3
|
+
*/
|
|
4
|
+
import { IS_BUN } from './runtime-detect';
|
|
5
|
+
/**
|
|
6
|
+
* Base class for controllers that provides automatic route binding
|
|
7
|
+
*/
|
|
8
|
+
export class ControllerBase {
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse query string args with type coercion
|
|
12
|
+
*/
|
|
13
|
+
const parseQueryArgs = (query) => {
|
|
14
|
+
const typedQuery = {};
|
|
15
|
+
for (const [key, rawValue,] of Object.entries(query)) {
|
|
16
|
+
if (typeof rawValue !== 'string') {
|
|
17
|
+
typedQuery[key] = rawValue;
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (rawValue.length > 100) {
|
|
21
|
+
typedQuery[key] = rawValue;
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
if (rawValue === 'true') {
|
|
25
|
+
typedQuery[key] = true;
|
|
26
|
+
}
|
|
27
|
+
else if (rawValue === 'false') {
|
|
28
|
+
typedQuery[key] = false;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
const num = Number(rawValue);
|
|
32
|
+
if (!Number.isNaN(num)) {
|
|
33
|
+
typedQuery[key] = num;
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
typedQuery[key] = rawValue;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return typedQuery;
|
|
41
|
+
};
|
|
42
|
+
export { BunRouter } from './bun';
|
|
43
|
+
/**
|
|
44
|
+
* Convert path pattern to regex
|
|
45
|
+
*/
|
|
46
|
+
const pathToRegex = (path) => {
|
|
47
|
+
const paramNames = [];
|
|
48
|
+
const regexStr = path
|
|
49
|
+
.replace(/[.+^${}()|[\]\\]/g, '\\$&')
|
|
50
|
+
.replace(/:(\w+)(\?)?/g, (_, name, optional) => {
|
|
51
|
+
paramNames.push(name);
|
|
52
|
+
return optional ? '([^/]*)?' : '([^/]+)';
|
|
53
|
+
})
|
|
54
|
+
.replace(/\*/g, '(.*)');
|
|
55
|
+
return {
|
|
56
|
+
regex: new RegExp(`^${regexStr}$`),
|
|
57
|
+
paramNames,
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
/**
|
|
61
|
+
* Universal Router - define routes once, build for Express or Bun
|
|
62
|
+
* Provides a runtime-agnostic API for defining HTTP routes and middleware
|
|
63
|
+
*/
|
|
64
|
+
export class WebRouter {
|
|
65
|
+
routes = [];
|
|
66
|
+
subRouters = [];
|
|
67
|
+
globalMiddlewares = [];
|
|
68
|
+
use(pathOrMiddleware, router) {
|
|
69
|
+
if (typeof pathOrMiddleware === 'function') {
|
|
70
|
+
this.globalMiddlewares.push(pathOrMiddleware);
|
|
71
|
+
}
|
|
72
|
+
else if (router) {
|
|
73
|
+
this.subRouters.push({ path: pathOrMiddleware, router });
|
|
74
|
+
}
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Register a GET route
|
|
79
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
80
|
+
* @param handlers - Middleware and route handler functions
|
|
81
|
+
* @returns This router instance for chaining
|
|
82
|
+
*/
|
|
83
|
+
get(path, ...handlers) {
|
|
84
|
+
return this.addRoute('GET', path, handlers);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Register a POST route
|
|
88
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
89
|
+
* @param handlers - Middleware and route handler functions
|
|
90
|
+
* @returns This router instance for chaining
|
|
91
|
+
*/
|
|
92
|
+
post(path, ...handlers) {
|
|
93
|
+
return this.addRoute('POST', path, handlers);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Register a PUT route
|
|
97
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
98
|
+
* @param handlers - Middleware and route handler functions
|
|
99
|
+
* @returns This router instance for chaining
|
|
100
|
+
*/
|
|
101
|
+
put(path, ...handlers) {
|
|
102
|
+
return this.addRoute('PUT', path, handlers);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Register a PATCH route
|
|
106
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
107
|
+
* @param handlers - Middleware and route handler functions
|
|
108
|
+
* @returns This router instance for chaining
|
|
109
|
+
*/
|
|
110
|
+
patch(path, ...handlers) {
|
|
111
|
+
return this.addRoute('PATCH', path, handlers);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Register a DELETE route
|
|
115
|
+
* @param path - URL path (supports :param and * wildcards)
|
|
116
|
+
* @param handlers - Middleware and route handler functions
|
|
117
|
+
* @returns This router instance for chaining
|
|
118
|
+
*/
|
|
119
|
+
delete(path, ...handlers) {
|
|
120
|
+
return this.addRoute('DELETE', path, handlers);
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Register a GET route with a regex pattern
|
|
124
|
+
* Useful for complex pattern matching (e.g., SPA routes with locale prefixes)
|
|
125
|
+
* @param pattern - Regular expression for matching the URL path
|
|
126
|
+
* @param paramNames - Names for captured groups in the regex
|
|
127
|
+
* @param handlers - Middleware and route handler functions
|
|
128
|
+
* @returns This router instance for chaining
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* router.getRegex(/^\/(en|sk|cs)\/products$/, ['locale'], (req, res) => {
|
|
132
|
+
* const locale = req.params.locale; // 'en', 'sk', or 'cs'
|
|
133
|
+
* });
|
|
134
|
+
* ```
|
|
135
|
+
*/
|
|
136
|
+
getRegex(pattern, paramNames, ...handlers) {
|
|
137
|
+
return this.addRegexRoute('GET', pattern, paramNames, handlers);
|
|
138
|
+
}
|
|
139
|
+
addRegexRoute(method, regex, paramNames, handlers) {
|
|
140
|
+
// Use a special path format for regex routes
|
|
141
|
+
const path = `__regex__${this.routes.length}`;
|
|
142
|
+
this.routes.push({ method, path, regex, paramNames, handlers });
|
|
143
|
+
return this;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Register a controller class with automatic route binding
|
|
147
|
+
* Maps controller methods (get, post, etc.) to HTTP routes automatically
|
|
148
|
+
* @param ControllerClass - Controller class to register
|
|
149
|
+
* @returns This router instance for chaining
|
|
150
|
+
* @example
|
|
151
|
+
* ```typescript
|
|
152
|
+
* @Route('/products')
|
|
153
|
+
* class ProductController extends ControllerBase {
|
|
154
|
+
* async getAll() { return products; } // GET /products
|
|
155
|
+
* async get(args: { id: number }) { return product; } // GET /products/:id
|
|
156
|
+
* async post(args: CreateProductArgs) { return created; } // POST /products
|
|
157
|
+
* }
|
|
158
|
+
*
|
|
159
|
+
* router.registerController(ProductController);
|
|
160
|
+
* ```
|
|
161
|
+
*/
|
|
162
|
+
registerController(ControllerClass) {
|
|
163
|
+
const controller = new ControllerClass();
|
|
164
|
+
let route = controller.$route || controller.constructor?.$route;
|
|
165
|
+
if (!route) {
|
|
166
|
+
route = ControllerClass.name.replace('Controller', '');
|
|
167
|
+
route = route.substring(0, 1).toLowerCase() + route.substring(1);
|
|
168
|
+
}
|
|
169
|
+
if (!route.startsWith('/')) {
|
|
170
|
+
route = `/${route}`;
|
|
171
|
+
}
|
|
172
|
+
this.bindControllerMethod('getAll', controller, route);
|
|
173
|
+
this.bindControllerMethod('get', controller, route);
|
|
174
|
+
this.bindControllerMethod('post', controller, route);
|
|
175
|
+
this.bindControllerMethod('patch', controller, route);
|
|
176
|
+
this.bindControllerMethod('put', controller, route);
|
|
177
|
+
this.bindControllerMethod('delete', controller, route);
|
|
178
|
+
return this;
|
|
179
|
+
}
|
|
180
|
+
bindControllerMethod(method, controller, route) {
|
|
181
|
+
if (!controller[method]) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
// Get method-specific or controller-level auth
|
|
185
|
+
const auth = controller[`$auth-${method}`]
|
|
186
|
+
|| (controller.constructor || {})[`$auth-${method}`]
|
|
187
|
+
|| controller.$auth
|
|
188
|
+
|| controller.constructor?.$auth;
|
|
189
|
+
// Get method-specific or default parse args
|
|
190
|
+
const customParseArgs = controller[`$parse-${method}`]
|
|
191
|
+
|| (controller.constructor || {})[`$parse-${method}`];
|
|
192
|
+
// Get request size limit
|
|
193
|
+
const requestSize = controller.$requestSize
|
|
194
|
+
|| controller.constructor?.$requestSize;
|
|
195
|
+
// Get controller middlewares (clone to avoid mutation)
|
|
196
|
+
const controllerMiddlewares = [
|
|
197
|
+
...(controller.$middlewares
|
|
198
|
+
|| controller.constructor?.$middlewares
|
|
199
|
+
|| []),
|
|
200
|
+
];
|
|
201
|
+
const isBodyMethod = method !== 'delete' && method !== 'get' && method !== 'getAll';
|
|
202
|
+
const hasGetAndGetAll = controller.get != null && controller.getAll != null;
|
|
203
|
+
// Build middleware chain (same order as RouteBinder)
|
|
204
|
+
const middlewares = [];
|
|
205
|
+
// 1. Auth middleware first (unshift in original = first in array)
|
|
206
|
+
if (auth) {
|
|
207
|
+
middlewares.push(async (req, res, next) => {
|
|
208
|
+
const authResult = await auth(req, res);
|
|
209
|
+
if (!authResult) {
|
|
210
|
+
res.status(401).send('Unauthorized access');
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
next();
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
// 2. Controller middlewares
|
|
217
|
+
middlewares.push(...controllerMiddlewares);
|
|
218
|
+
// Main handler
|
|
219
|
+
const mainHandler = async (req, res, next) => {
|
|
220
|
+
try {
|
|
221
|
+
// Parse args
|
|
222
|
+
let args;
|
|
223
|
+
if (customParseArgs) {
|
|
224
|
+
args = customParseArgs(req);
|
|
225
|
+
}
|
|
226
|
+
else if (isBodyMethod) {
|
|
227
|
+
args = req.body;
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
args = parseQueryArgs(req.query);
|
|
231
|
+
}
|
|
232
|
+
// Handle get vs getAll routing
|
|
233
|
+
let actualMethod = method;
|
|
234
|
+
if ((method === 'get' || method === 'getAll') && hasGetAndGetAll) {
|
|
235
|
+
actualMethod = args.id > 0 ? 'get' : 'getAll';
|
|
236
|
+
}
|
|
237
|
+
const result = await controller[actualMethod].call(controller, args, req, res, next);
|
|
238
|
+
res.json(result);
|
|
239
|
+
}
|
|
240
|
+
catch (error) {
|
|
241
|
+
// Only handle HTTP errors (httpCode > 299), rethrow others
|
|
242
|
+
if (error?.httpCode > 299) {
|
|
243
|
+
const httpCode = error.httpCode ?? 500;
|
|
244
|
+
const message = error.message ?? 'Unexpected error';
|
|
245
|
+
const response = { success: false, message };
|
|
246
|
+
// Include interception data (WorkflowInterceptionException)
|
|
247
|
+
if (error.interception) {
|
|
248
|
+
response.interception = {
|
|
249
|
+
type: error.interception?.type,
|
|
250
|
+
data: error.interception?.data,
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
res.status(httpCode).json(response);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
// Rethrow non-HTTP errors
|
|
257
|
+
throw error;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
const httpMethod = method === 'getAll' ? 'GET' : method.toUpperCase();
|
|
261
|
+
// Store route with middlewares + main handler
|
|
262
|
+
// requestSize is used by Express router for body parsing
|
|
263
|
+
this.routes.push({
|
|
264
|
+
method: httpMethod,
|
|
265
|
+
path: route,
|
|
266
|
+
handlers: [
|
|
267
|
+
...middlewares,
|
|
268
|
+
mainHandler,
|
|
269
|
+
],
|
|
270
|
+
requestSize: isBodyMethod ? requestSize : undefined,
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
addRoute(method, path, handlers) {
|
|
274
|
+
this.routes.push({ method, path, handlers });
|
|
275
|
+
return this;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Build router for current runtime (Express or Bun)
|
|
279
|
+
* Automatically detects runtime and builds appropriate router implementation
|
|
280
|
+
* @returns Promise that resolves to Express Router or Bun Router
|
|
281
|
+
*/
|
|
282
|
+
build() {
|
|
283
|
+
if (IS_BUN) {
|
|
284
|
+
return this.buildBun('');
|
|
285
|
+
}
|
|
286
|
+
return this.buildExpress();
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Build router for Express runtime
|
|
290
|
+
* @returns Promise that resolves to Express Router
|
|
291
|
+
*/
|
|
292
|
+
async buildExpress() {
|
|
293
|
+
const { buildExpressRouter } = await import('./express');
|
|
294
|
+
return buildExpressRouter(this.routes, this.subRouters.map(sr => ({ path: sr.path, buildExpress: () => sr.router.buildExpress() })));
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Build router for Bun runtime
|
|
298
|
+
* @param basePath - Optional base path prefix for all routes
|
|
299
|
+
* @returns Promise that resolves to Bun Router
|
|
300
|
+
*/
|
|
301
|
+
async buildBun(basePath = '') {
|
|
302
|
+
const { BunRouter: BunRouterImpl } = await import('./bun');
|
|
303
|
+
const bunRoutes = [];
|
|
304
|
+
// Collect sub-router routes
|
|
305
|
+
for (const { path, router: subRouter } of this.subRouters) {
|
|
306
|
+
const subBunRouter = await subRouter.buildBun(basePath + path);
|
|
307
|
+
bunRoutes.push(...subBunRouter.routes);
|
|
308
|
+
}
|
|
309
|
+
// Collect own routes
|
|
310
|
+
for (const route of this.routes) {
|
|
311
|
+
// Handle regex routes (path starts with __regex__)
|
|
312
|
+
if (route.path.startsWith('__regex__')) {
|
|
313
|
+
bunRoutes.push({
|
|
314
|
+
method: route.method,
|
|
315
|
+
path: route.path,
|
|
316
|
+
regex: route.regex,
|
|
317
|
+
paramNames: route.paramNames || [],
|
|
318
|
+
handlers: route.handlers,
|
|
319
|
+
globalMiddlewares: this.globalMiddlewares,
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
const fullPath = basePath + route.path;
|
|
324
|
+
const { regex, paramNames } = pathToRegex(fullPath);
|
|
325
|
+
bunRoutes.push({
|
|
326
|
+
method: route.method,
|
|
327
|
+
path: fullPath,
|
|
328
|
+
regex,
|
|
329
|
+
paramNames,
|
|
330
|
+
handlers: route.handlers,
|
|
331
|
+
globalMiddlewares: this.globalMiddlewares,
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return new BunRouterImpl(bunRoutes);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Create a new WebRouter instance
|
|
340
|
+
* Factory function for creating runtime-agnostic routers
|
|
341
|
+
* @returns New WebRouter instance
|
|
342
|
+
* @example
|
|
343
|
+
* ```typescript
|
|
344
|
+
* const router = createRouter();
|
|
345
|
+
* router.get('/health', (req, res) => res.json({ status: 'ok' }));
|
|
346
|
+
* router.registerController(UserController);
|
|
347
|
+
* ```
|
|
348
|
+
*/
|
|
349
|
+
export const createRouter = () => new WebRouter();
|
|
350
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime detection utilities for Bun/Node.js dual runtime support
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if the current runtime is Bun
|
|
6
|
+
*/
|
|
7
|
+
export declare const isBunRuntime: () => boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Get the current runtime name
|
|
10
|
+
*/
|
|
11
|
+
export declare const getRuntime: () => "bun" | "node";
|
|
12
|
+
/**
|
|
13
|
+
* Cached runtime detection result (computed once at module load)
|
|
14
|
+
*/
|
|
15
|
+
export declare const RUNTIME: "bun" | "node";
|
|
16
|
+
/**
|
|
17
|
+
* Cached Bun runtime check (computed once at module load)
|
|
18
|
+
*/
|
|
19
|
+
export declare const IS_BUN: boolean;
|
|
20
|
+
//# sourceMappingURL=runtime-detect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-detect.d.ts","sourceRoot":"","sources":["../src/runtime-detect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY,QAAO,OAAyD,CAAC;AAE1F;;GAEG;AACH,eAAO,MAAM,UAAU,QAAO,KAAK,GAAG,MAAyC,CAAC;AAEhF;;GAEG;AACH,eAAO,MAAM,OAAO,gBAAe,CAAC;AAEpC;;GAEG;AACH,eAAO,MAAM,MAAM,SAAiB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime detection utilities for Bun/Node.js dual runtime support
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if the current runtime is Bun
|
|
6
|
+
*/
|
|
7
|
+
export const isBunRuntime = () => typeof globalThis.Bun !== 'undefined';
|
|
8
|
+
/**
|
|
9
|
+
* Get the current runtime name
|
|
10
|
+
*/
|
|
11
|
+
export const getRuntime = () => isBunRuntime() ? 'bun' : 'node';
|
|
12
|
+
/**
|
|
13
|
+
* Cached runtime detection result (computed once at module load)
|
|
14
|
+
*/
|
|
15
|
+
export const RUNTIME = getRuntime();
|
|
16
|
+
/**
|
|
17
|
+
* Cached Bun runtime check (computed once at module load)
|
|
18
|
+
*/
|
|
19
|
+
export const IS_BUN = isBunRuntime();
|
|
20
|
+
//# sourceMappingURL=runtime-detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-detect.js","sourceRoot":"","sources":["../src/runtime-detect.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAY,EAAE,CAAC,OAAQ,UAAkB,CAAC,GAAG,KAAK,WAAW,CAAC;AAE1F;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,GAAmB,EAAE,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;AAEhF;;GAEG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,EAAE,CAAC;AAEpC;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC"}
|