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.
Files changed (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +302 -0
  3. package/dist/apidoc/api-doc-generator.d.ts +58 -0
  4. package/dist/apidoc/api-doc-generator.d.ts.map +1 -0
  5. package/dist/apidoc/api-doc-generator.js +201 -0
  6. package/dist/apidoc/api-doc-generator.js.map +1 -0
  7. package/dist/apidoc/config.d.ts +153 -0
  8. package/dist/apidoc/config.d.ts.map +1 -0
  9. package/dist/apidoc/config.js +254 -0
  10. package/dist/apidoc/config.js.map +1 -0
  11. package/dist/apidoc/controller-parser.d.ts +208 -0
  12. package/dist/apidoc/controller-parser.d.ts.map +1 -0
  13. package/dist/apidoc/controller-parser.js +686 -0
  14. package/dist/apidoc/controller-parser.js.map +1 -0
  15. package/dist/apidoc/html-generator.d.ts +290 -0
  16. package/dist/apidoc/html-generator.d.ts.map +1 -0
  17. package/dist/apidoc/html-generator.js +2295 -0
  18. package/dist/apidoc/html-generator.js.map +1 -0
  19. package/dist/apidoc/index.d.ts +20 -0
  20. package/dist/apidoc/index.d.ts.map +1 -0
  21. package/dist/apidoc/index.js +16 -0
  22. package/dist/apidoc/index.js.map +1 -0
  23. package/dist/apidoc/openapi-builder.d.ts +169 -0
  24. package/dist/apidoc/openapi-builder.d.ts.map +1 -0
  25. package/dist/apidoc/openapi-builder.js +634 -0
  26. package/dist/apidoc/openapi-builder.js.map +1 -0
  27. package/dist/apidoc/parameterGeneratorRegistry.d.ts +20 -0
  28. package/dist/apidoc/parameterGeneratorRegistry.d.ts.map +1 -0
  29. package/dist/apidoc/parameterGeneratorRegistry.js +6 -0
  30. package/dist/apidoc/parameterGeneratorRegistry.js.map +1 -0
  31. package/dist/apidoc/test-type-resolver.d.ts +2 -0
  32. package/dist/apidoc/test-type-resolver.d.ts.map +1 -0
  33. package/dist/apidoc/test-type-resolver.js +6 -0
  34. package/dist/apidoc/test-type-resolver.js.map +1 -0
  35. package/dist/apidoc/type-resolver.d.ts +266 -0
  36. package/dist/apidoc/type-resolver.d.ts.map +1 -0
  37. package/dist/apidoc/type-resolver.js +1226 -0
  38. package/dist/apidoc/type-resolver.js.map +1 -0
  39. package/dist/apidoc/verify-type-resolution.d.ts +3 -0
  40. package/dist/apidoc/verify-type-resolution.d.ts.map +1 -0
  41. package/dist/apidoc/verify-type-resolution.js +29 -0
  42. package/dist/apidoc/verify-type-resolution.js.map +1 -0
  43. package/dist/bun/bunRouter.d.ts +70 -0
  44. package/dist/bun/bunRouter.d.ts.map +1 -0
  45. package/dist/bun/bunRouter.js +324 -0
  46. package/dist/bun/bunRouter.js.map +1 -0
  47. package/dist/bun/bunServer.d.ts +72 -0
  48. package/dist/bun/bunServer.d.ts.map +1 -0
  49. package/dist/bun/bunServer.js +218 -0
  50. package/dist/bun/bunServer.js.map +1 -0
  51. package/dist/bun/bunStaticFiles.d.ts +76 -0
  52. package/dist/bun/bunStaticFiles.d.ts.map +1 -0
  53. package/dist/bun/bunStaticFiles.js +251 -0
  54. package/dist/bun/bunStaticFiles.js.map +1 -0
  55. package/dist/bun/index.d.ts +7 -0
  56. package/dist/bun/index.d.ts.map +1 -0
  57. package/dist/bun/index.js +7 -0
  58. package/dist/bun/index.js.map +1 -0
  59. package/dist/data-contracts.d.ts +132 -0
  60. package/dist/data-contracts.d.ts.map +1 -0
  61. package/dist/data-contracts.js +2 -0
  62. package/dist/data-contracts.js.map +1 -0
  63. package/dist/decorators.d.ts +75 -0
  64. package/dist/decorators.d.ts.map +1 -0
  65. package/dist/decorators.js +101 -0
  66. package/dist/decorators.js.map +1 -0
  67. package/dist/express/expressFrontendRouter.d.ts +17 -0
  68. package/dist/express/expressFrontendRouter.d.ts.map +1 -0
  69. package/dist/express/expressFrontendRouter.js +33 -0
  70. package/dist/express/expressFrontendRouter.js.map +1 -0
  71. package/dist/express/expressRouter.d.ts +25 -0
  72. package/dist/express/expressRouter.d.ts.map +1 -0
  73. package/dist/express/expressRouter.js +150 -0
  74. package/dist/express/expressRouter.js.map +1 -0
  75. package/dist/express/index.d.ts +6 -0
  76. package/dist/express/index.d.ts.map +1 -0
  77. package/dist/express/index.js +6 -0
  78. package/dist/express/index.js.map +1 -0
  79. package/dist/index.d.ts +47 -0
  80. package/dist/index.d.ts.map +1 -0
  81. package/dist/index.js +52 -0
  82. package/dist/index.js.map +1 -0
  83. package/dist/router.d.ts +162 -0
  84. package/dist/router.d.ts.map +1 -0
  85. package/dist/router.js +350 -0
  86. package/dist/router.js.map +1 -0
  87. package/dist/runtime-detect.d.ts +20 -0
  88. package/dist/runtime-detect.d.ts.map +1 -0
  89. package/dist/runtime-detect.js +20 -0
  90. package/dist/runtime-detect.js.map +1 -0
  91. package/dist/server.d.ts +126 -0
  92. package/dist/server.d.ts.map +1 -0
  93. package/dist/server.js +181 -0
  94. package/dist/server.js.map +1 -0
  95. package/dist/utils.d.ts +83 -0
  96. package/dist/utils.d.ts.map +1 -0
  97. package/dist/utils.js +157 -0
  98. package/dist/utils.js.map +1 -0
  99. package/package.json +65 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Universal Server - Runtime-agnostic server configuration
3
+ * Define server once, run on Express or Bun
4
+ */
5
+ import type { Router as ExpressRouter } from 'express';
6
+ import type { BunRouter } from './bun';
7
+ import type { WebRouter } from './router';
8
+ /**
9
+ * Type representing one or more URL paths
10
+ * Used for static file serving where multiple paths can point to the same directory
11
+ */
12
+ type PathOrPaths = string | string[];
13
+ export interface StaticFileConfig {
14
+ /** URL path(s) to serve files from */
15
+ urlPath: PathOrPaths;
16
+ /** File system path to serve files from */
17
+ fsPath: string;
18
+ /** Enable compression (Bun only) */
19
+ compress?: boolean;
20
+ /** Cache-Control header value (e.g., 'public, max-age=31536000') */
21
+ cacheControl?: string;
22
+ }
23
+ /**
24
+ * Interface for routers that can build for both Express and Bun
25
+ * Used for SSR, frontend routers, and other non-API routes
26
+ */
27
+ export interface BuildableRouter {
28
+ buildExpress: () => Promise<ExpressRouter>;
29
+ buildBun: (basePath?: string) => Promise<BunRouter>;
30
+ }
31
+ export interface UniversalServerOptions {
32
+ /** Server port */
33
+ port: number;
34
+ /** Server hostname */
35
+ hostname?: string;
36
+ /** API routes with base paths (use Bun native routes when possible) */
37
+ apiRouters: Record<string, WebRouter>;
38
+ /** Static file configurations */
39
+ staticFiles?: StaticFileConfig[];
40
+ /**
41
+ * Additional routers for fallback handling (SSR, frontend SPAs, etc.)
42
+ * These are processed in order in the fetch fallback handler.
43
+ * Use for routes that need regex matching or conditional handling.
44
+ */
45
+ routers?: BuildableRouter[];
46
+ /** CORS origins for development */
47
+ corsOrigins?: string[];
48
+ /** Middleware to apply to specific paths (Express only) */
49
+ pathMiddlewares?: Array<{
50
+ path: string;
51
+ middleware: any;
52
+ }>;
53
+ /** Called when server starts */
54
+ onStart?: (runtime: string) => void;
55
+ /** Called on server error */
56
+ onError?: (error: Error) => void;
57
+ }
58
+ export interface ServerInstance {
59
+ /** Stop the server */
60
+ stop: () => void | Promise<void>;
61
+ /** Runtime name */
62
+ runtime: string;
63
+ }
64
+ /**
65
+ * Universal Server - builds and runs server for current runtime
66
+ */
67
+ export declare class UniversalServer {
68
+ private options;
69
+ private instance;
70
+ constructor(options: UniversalServerOptions);
71
+ /**
72
+ * Start the server for current runtime
73
+ * Automatically detects runtime (Bun or Node.js/Express) and starts appropriate server
74
+ * @returns Promise that resolves to ServerInstance with stop() method
75
+ */
76
+ start(): Promise<ServerInstance>;
77
+ /**
78
+ * Stop the server
79
+ * Gracefully shuts down the running server instance
80
+ */
81
+ stop(): Promise<void>;
82
+ /**
83
+ * Start Express server
84
+ */
85
+ private startExpress;
86
+ /**
87
+ * Start Bun server
88
+ */
89
+ private startBun;
90
+ /**
91
+ * Get current runtime name
92
+ * @returns 'bun' or 'node'
93
+ */
94
+ static get runtime(): string;
95
+ /**
96
+ * Check if running on Bun
97
+ * @returns True if running on Bun runtime, false if Node.js
98
+ */
99
+ static get isBun(): boolean;
100
+ }
101
+ /**
102
+ * Create a new UniversalServer instance
103
+ * Factory function for creating runtime-agnostic servers
104
+ * @param options - Server configuration options
105
+ * @returns New UniversalServer instance
106
+ * @example
107
+ * ```typescript
108
+ * const server = createServer({
109
+ * port: 3000,
110
+ * apiRouters: {
111
+ * '/api': apiRouter,
112
+ * '/admin': adminRouter
113
+ * },
114
+ * staticFiles: [{
115
+ * urlPath: '/static',
116
+ * fsPath: './public'
117
+ * }],
118
+ * onStart: (runtime) => console.log(`Server started on ${runtime}`)
119
+ * });
120
+ *
121
+ * await server.start();
122
+ * ```
123
+ */
124
+ export declare const createServer: (options: UniversalServerOptions) => UniversalServer;
125
+ export {};
126
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAW,MAAM,IAAI,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAG1C;;;GAGG;AACH,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,EAAE,CAAC;AAErC,MAAM,WAAW,gBAAgB;IAChC,sCAAsC;IACtC,OAAO,EAAE,WAAW,CAAC;IACrB,2CAA2C;IAC3C,MAAM,EAAE,MAAM,CAAC;IACf,oCAAoC;IACpC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,oEAAoE;IACpE,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,YAAY,EAAE,MAAM,OAAO,CAAC,aAAa,CAAC,CAAC;IAC3C,QAAQ,EAAE,CAAC,QAAQ,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,sBAAsB;IACtC,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uEAAuE;IACvE,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtC,iCAAiC;IACjC,WAAW,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,mCAAmC;IACnC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,2DAA2D;IAC3D,eAAe,CAAC,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,GAAG,CAAA;KAAE,CAAC,CAAC;IAC3D,gCAAgC;IAChC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,6BAA6B;IAC7B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC9B,sBAAsB;IACtB,IAAI,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,mBAAmB;IACnB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,qBAAa,eAAe;IAC3B,OAAO,CAAC,OAAO,CAAyB;IACxC,OAAO,CAAC,QAAQ,CAA+B;gBAEnC,OAAO,EAAE,sBAAsB;IAI3C;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,cAAc,CAAC;IAQtC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAO3B;;OAEG;YACW,YAAY;IAoG1B;;OAEG;YACW,QAAQ;IA0BtB;;;OAGG;IACH,MAAM,KAAK,OAAO,IAAI,MAAM,CAE3B;IAED;;;OAGG;IACH,MAAM,KAAK,KAAK,IAAI,OAAO,CAE1B;CACD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,YAAY,GAAI,SAAS,sBAAsB,KAAG,eAA+C,CAAC"}
package/dist/server.js ADDED
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Universal Server - Runtime-agnostic server configuration
3
+ * Define server once, run on Express or Bun
4
+ */
5
+ import { IS_BUN, RUNTIME } from './runtime-detect';
6
+ /**
7
+ * Universal Server - builds and runs server for current runtime
8
+ */
9
+ export class UniversalServer {
10
+ options;
11
+ instance = null;
12
+ constructor(options) {
13
+ this.options = options;
14
+ }
15
+ /**
16
+ * Start the server for current runtime
17
+ * Automatically detects runtime (Bun or Node.js/Express) and starts appropriate server
18
+ * @returns Promise that resolves to ServerInstance with stop() method
19
+ */
20
+ async start() {
21
+ if (IS_BUN) {
22
+ return this.startBun();
23
+ }
24
+ return this.startExpress();
25
+ }
26
+ /**
27
+ * Stop the server
28
+ * Gracefully shuts down the running server instance
29
+ */
30
+ async stop() {
31
+ if (this.instance) {
32
+ await this.instance.stop();
33
+ this.instance = null;
34
+ }
35
+ }
36
+ /**
37
+ * Start Express server
38
+ */
39
+ async startExpress() {
40
+ const [{ default: express }, { default: cookieParser }, { default: cors },] = await Promise.all([
41
+ import('express'),
42
+ import('cookie-parser'),
43
+ import('cors'),
44
+ ]);
45
+ const app = express();
46
+ app.disable('x-powered-by');
47
+ // CORS
48
+ if (this.options.corsOrigins && this.options.corsOrigins.length > 0) {
49
+ app.use(cors({
50
+ origin: this.options.corsOrigins,
51
+ credentials: true,
52
+ methods: [
53
+ 'GET',
54
+ 'POST',
55
+ 'PUT',
56
+ 'DELETE',
57
+ ],
58
+ allowedHeaders: [
59
+ 'Content-Type',
60
+ 'Authorization',
61
+ 'X-Requested-With',
62
+ 'Accept',
63
+ 'Cache-Control',
64
+ ],
65
+ }));
66
+ }
67
+ // Cookie parser
68
+ app.use(cookieParser());
69
+ // Path-specific middlewares
70
+ if (this.options.pathMiddlewares) {
71
+ for (const { path, middleware } of this.options.pathMiddlewares) {
72
+ app.use(path, middleware);
73
+ }
74
+ }
75
+ // Fallback routers (SSR, frontend SPAs, etc.) - order matters
76
+ for (const router of this.options.routers || []) {
77
+ app.use(await router.buildExpress());
78
+ }
79
+ // Static files (assets)
80
+ // Using *splat for Express 5+ compatibility with path-to-regexp v8
81
+ for (const staticConfig of this.options.staticFiles || []) {
82
+ const paths = Array.isArray(staticConfig.urlPath)
83
+ ? staticConfig.urlPath.flatMap(p => [
84
+ p,
85
+ `${p}/*splat`,
86
+ ])
87
+ : [
88
+ staticConfig.urlPath,
89
+ `${staticConfig.urlPath}/*splat`,
90
+ ];
91
+ const staticOptions = {};
92
+ // Set cache control if specified
93
+ if (staticConfig.cacheControl) {
94
+ staticOptions.setHeaders = (res) => {
95
+ res.setHeader('Cache-Control', staticConfig.cacheControl);
96
+ };
97
+ }
98
+ app.use(paths, express.static(staticConfig.fsPath, staticOptions));
99
+ }
100
+ // API routes
101
+ for (const [basePath, router,] of Object.entries(this.options.apiRouters)) {
102
+ app.use(basePath, await router.buildExpress());
103
+ }
104
+ // Start listening
105
+ const server = app.listen(this.options.port);
106
+ this.instance = {
107
+ runtime: 'Express',
108
+ stop: () => new Promise((resolve, reject) => {
109
+ server.close(err => (err ? reject(err) : resolve()));
110
+ }),
111
+ };
112
+ if (this.options.onStart) {
113
+ this.options.onStart('Express');
114
+ }
115
+ return this.instance;
116
+ }
117
+ /**
118
+ * Start Bun server
119
+ */
120
+ async startBun() {
121
+ const { BunServer } = await import('./bun');
122
+ const bunServer = await BunServer.create({
123
+ port: this.options.port,
124
+ hostname: this.options.hostname,
125
+ apiRoutes: this.options.apiRouters,
126
+ staticFiles: this.options.staticFiles?.map(s => ({
127
+ urlPath: s.urlPath,
128
+ fsPath: s.fsPath,
129
+ compress: s.compress,
130
+ })),
131
+ fallbackRouters: this.options.routers,
132
+ corsOrigins: this.options.corsOrigins,
133
+ onStart: () => this.options.onStart?.('Bun'),
134
+ onError: this.options.onError,
135
+ });
136
+ this.instance = {
137
+ runtime: 'Bun',
138
+ stop: () => bunServer.stop(),
139
+ };
140
+ return this.instance;
141
+ }
142
+ /**
143
+ * Get current runtime name
144
+ * @returns 'bun' or 'node'
145
+ */
146
+ static get runtime() {
147
+ return RUNTIME;
148
+ }
149
+ /**
150
+ * Check if running on Bun
151
+ * @returns True if running on Bun runtime, false if Node.js
152
+ */
153
+ static get isBun() {
154
+ return IS_BUN;
155
+ }
156
+ }
157
+ /**
158
+ * Create a new UniversalServer instance
159
+ * Factory function for creating runtime-agnostic servers
160
+ * @param options - Server configuration options
161
+ * @returns New UniversalServer instance
162
+ * @example
163
+ * ```typescript
164
+ * const server = createServer({
165
+ * port: 3000,
166
+ * apiRouters: {
167
+ * '/api': apiRouter,
168
+ * '/admin': adminRouter
169
+ * },
170
+ * staticFiles: [{
171
+ * urlPath: '/static',
172
+ * fsPath: './public'
173
+ * }],
174
+ * onStart: (runtime) => console.log(`Server started on ${runtime}`)
175
+ * });
176
+ *
177
+ * await server.start();
178
+ * ```
179
+ */
180
+ export const createServer = (options) => new UniversalServer(options);
181
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Runtime utilities for request parsing and handling
3
+ */
4
+ import type { WebRequest, WebResponse } from './data-contracts';
5
+ /**
6
+ * Runtime utilities for working with WebRequest/WebResponse
7
+ */
8
+ export declare class RuntimeUtils {
9
+ /**
10
+ * Parse a query parameter as a number
11
+ * @param req - HTTP request object
12
+ * @param key - Query parameter name
13
+ * @returns Parsed number or null if invalid
14
+ */
15
+ static parseQueryNumber(req: WebRequest, key: string): number | null;
16
+ /**
17
+ * Parse a comma-separated query parameter as an array of numbers
18
+ * @param req - HTTP request object
19
+ * @param key - Query parameter name
20
+ * @returns Array of numbers or null if invalid/empty
21
+ */
22
+ static parseQueryNumberArray(req: WebRequest, key: string): number[] | null;
23
+ /**
24
+ * Parse a comma-separated query parameter as an array of strings
25
+ * @param req - HTTP request object
26
+ * @param key - Query parameter name
27
+ * @returns Array of strings or null if invalid/empty
28
+ */
29
+ static parseQueryStringArray(req: WebRequest, key: string): string[] | null;
30
+ /**
31
+ * Parse a query parameter as a boolean
32
+ * Accepts '1' or 'true' as truthy values
33
+ * @param req - HTTP request object
34
+ * @param key - Query parameter name
35
+ * @returns True if parameter is '1' or 'true', false otherwise
36
+ */
37
+ static parseQueryBoolean(req: WebRequest, key: string): boolean;
38
+ /**
39
+ * Parse a query parameter as a string
40
+ * @param req - HTTP request object
41
+ * @param key - Query parameter name
42
+ * @returns Query parameter value as string
43
+ */
44
+ static parseQueryString(req: WebRequest, key: string): string;
45
+ /**
46
+ * Parse a query parameter as JSON
47
+ * @param req - HTTP request object
48
+ * @param key - Query parameter name
49
+ * @returns Parsed JSON object or null if empty/invalid
50
+ */
51
+ static parseQueryJSON(req: WebRequest, key: string): any;
52
+ /**
53
+ * Parse a query parameter as an ISO date string
54
+ * @param req - HTTP request object
55
+ * @param key - Query parameter name
56
+ * @returns ISO date string or null if empty
57
+ */
58
+ static parseQueryDate(req: WebRequest, key: string): string | null;
59
+ /**
60
+ * Parse a query parameter as an array
61
+ * Handles both single values and array values
62
+ * @param req - HTTP request object
63
+ * @param key - Query parameter name
64
+ * @returns Array of values (empty array if parameter is missing)
65
+ */
66
+ static parseQueryArray(req: WebRequest, key: string): any[];
67
+ /**
68
+ * Debug utility to dump request details to console
69
+ * @param req - HTTP request object
70
+ * @param res - Optional HTTP response object
71
+ * @param writeResponse - Whether to send a 200 OK response
72
+ * @param isError - Whether this is an error request dump
73
+ */
74
+ static dumpRequest(req: WebRequest, res?: WebResponse, writeResponse?: boolean, isError?: boolean): void;
75
+ /**
76
+ * Get the client IP address from request
77
+ * Checks x-forwarded-for header first (for proxy/load balancer support)
78
+ * @param req - HTTP request object
79
+ * @returns Client IP address
80
+ */
81
+ static getIpAddress(req: WebRequest): string;
82
+ }
83
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;GAEG;AACH,qBAAa,YAAY;IACxB;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAapE;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAY3E;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAY3E;;;;;;OAMG;IACH,MAAM,CAAC,iBAAiB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO;IAO/D;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;IAI7D;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG;IASxD;;;;;OAKG;IACH,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAKlE;;;;;;OAMG;IACH,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE;IAS3D;;;;;;OAMG;IACH,MAAM,CAAC,WAAW,CACjB,GAAG,EAAE,UAAU,EACf,GAAG,CAAC,EAAE,WAAW,EACjB,aAAa,CAAC,EAAE,OAAO,EACvB,OAAO,CAAC,EAAE,OAAO,GACf,IAAI;IAmBP;;;;;OAKG;IACH,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM;CAG5C"}
package/dist/utils.js ADDED
@@ -0,0 +1,157 @@
1
+ /**
2
+ * Runtime utilities for request parsing and handling
3
+ */
4
+ /**
5
+ * Runtime utilities for working with WebRequest/WebResponse
6
+ */
7
+ export class RuntimeUtils {
8
+ /**
9
+ * Parse a query parameter as a number
10
+ * @param req - HTTP request object
11
+ * @param key - Query parameter name
12
+ * @returns Parsed number or null if invalid
13
+ */
14
+ static parseQueryNumber(req, key) {
15
+ try {
16
+ const retVal = Number(req.query[key]);
17
+ if (isNaN(retVal)) {
18
+ return null;
19
+ }
20
+ return retVal;
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ /**
27
+ * Parse a comma-separated query parameter as an array of numbers
28
+ * @param req - HTTP request object
29
+ * @param key - Query parameter name
30
+ * @returns Array of numbers or null if invalid/empty
31
+ */
32
+ static parseQueryNumberArray(req, key) {
33
+ try {
34
+ if (!(req.query[key]?.length > 0)) {
35
+ return null;
36
+ }
37
+ return req.query[key].split(',').map(p => Number(p));
38
+ }
39
+ catch {
40
+ return null;
41
+ }
42
+ }
43
+ /**
44
+ * Parse a comma-separated query parameter as an array of strings
45
+ * @param req - HTTP request object
46
+ * @param key - Query parameter name
47
+ * @returns Array of strings or null if invalid/empty
48
+ */
49
+ static parseQueryStringArray(req, key) {
50
+ try {
51
+ if (!(req.query[key]?.length > 0)) {
52
+ return null;
53
+ }
54
+ return req.query[key].split(',');
55
+ }
56
+ catch {
57
+ return null;
58
+ }
59
+ }
60
+ /**
61
+ * Parse a query parameter as a boolean
62
+ * Accepts '1' or 'true' as truthy values
63
+ * @param req - HTTP request object
64
+ * @param key - Query parameter name
65
+ * @returns True if parameter is '1' or 'true', false otherwise
66
+ */
67
+ static parseQueryBoolean(req, key) {
68
+ return [
69
+ '1',
70
+ 'true',
71
+ ].includes(req.query[key]);
72
+ }
73
+ /**
74
+ * Parse a query parameter as a string
75
+ * @param req - HTTP request object
76
+ * @param key - Query parameter name
77
+ * @returns Query parameter value as string
78
+ */
79
+ static parseQueryString(req, key) {
80
+ return req.query[key];
81
+ }
82
+ /**
83
+ * Parse a query parameter as JSON
84
+ * @param req - HTTP request object
85
+ * @param key - Query parameter name
86
+ * @returns Parsed JSON object or null if empty/invalid
87
+ */
88
+ static parseQueryJSON(req, key) {
89
+ const val = req.query[key];
90
+ if (val == null || val.length == 0) {
91
+ return null;
92
+ }
93
+ else {
94
+ return JSON.parse(val);
95
+ }
96
+ }
97
+ /**
98
+ * Parse a query parameter as an ISO date string
99
+ * @param req - HTTP request object
100
+ * @param key - Query parameter name
101
+ * @returns ISO date string or null if empty
102
+ */
103
+ static parseQueryDate(req, key) {
104
+ const val = req.query[key];
105
+ return val && val.length > 0 ? val : null;
106
+ }
107
+ /**
108
+ * Parse a query parameter as an array
109
+ * Handles both single values and array values
110
+ * @param req - HTTP request object
111
+ * @param key - Query parameter name
112
+ * @returns Array of values (empty array if parameter is missing)
113
+ */
114
+ static parseQueryArray(req, key) {
115
+ const val = req.query[key];
116
+ if (val == null || val.length == 0) {
117
+ return [];
118
+ }
119
+ else {
120
+ return Array.isArray(val) ? val : [val];
121
+ }
122
+ }
123
+ /**
124
+ * Debug utility to dump request details to console
125
+ * @param req - HTTP request object
126
+ * @param res - Optional HTTP response object
127
+ * @param writeResponse - Whether to send a 200 OK response
128
+ * @param isError - Whether this is an error request dump
129
+ */
130
+ static dumpRequest(req, res, writeResponse, isError) {
131
+ if (isError) {
132
+ console.log('\n *** ERROR Request dump *** \n');
133
+ }
134
+ else {
135
+ console.log('\n *** Request dump *** \n');
136
+ }
137
+ console.log(`URL: ${req.url}`);
138
+ console.log(`Method: ${req.method}`);
139
+ console.log(`Headers: ${JSON.stringify(req.headers)}`);
140
+ console.log(`Params: ${JSON.stringify(req.params)}`);
141
+ console.log(`Query: ${JSON.stringify(req.query)}`);
142
+ console.log(`Body: ${JSON.stringify(req.body)}`);
143
+ if (res && writeResponse) {
144
+ res.status(200).json({});
145
+ }
146
+ }
147
+ /**
148
+ * Get the client IP address from request
149
+ * Checks x-forwarded-for header first (for proxy/load balancer support)
150
+ * @param req - HTTP request object
151
+ * @returns Client IP address
152
+ */
153
+ static getIpAddress(req) {
154
+ return req.headers.get('x-forwarded-for') || req.ip || '';
155
+ }
156
+ }
157
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "inviton-backduck",
3
+ "version": "1.0.0",
4
+ "description": "Runtime-agnostic utilities for building web servers with Express and Bun support",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "type": "module",
8
+ "scripts": {
9
+ "build": "tsc",
10
+ "clean": "rm -rf dist",
11
+ "prebuild": "npm run clean",
12
+ "prepublishOnly": "npm run build",
13
+ "type-check": "tsc --noEmit"
14
+ },
15
+ "keywords": [
16
+ "express",
17
+ "bun",
18
+ "runtime",
19
+ "router",
20
+ "server",
21
+ "api",
22
+ "documentation",
23
+ "openapi",
24
+ "swagger"
25
+ ],
26
+ "author": "Inviton",
27
+ "license": "MIT",
28
+ "peerDependencies": {
29
+ "express": "^5.x",
30
+ "bun-types": "*"
31
+ },
32
+ "peerDependenciesMeta": {
33
+ "express": {
34
+ "optional": true
35
+ },
36
+ "bun-types": {
37
+ "optional": true
38
+ }
39
+ },
40
+ "dependencies": {
41
+ "cookie-parser": "^1.4.7",
42
+ "cors": "^2.8.5",
43
+ "mime-types": "^2.1.35",
44
+ "openapi-types": "^12.1.3",
45
+ "ts-morph": "^26.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/bun": "^1.2.5",
49
+ "@types/cookie-parser": "^1.4.7",
50
+ "@types/cors": "^2.8.17",
51
+ "@types/express": "^5.0.0",
52
+ "@types/mime-types": "^2.1.4",
53
+ "@types/node": "^22.10.5",
54
+ "bun-types": "^1.1.38",
55
+ "typescript": "^5.7.3"
56
+ },
57
+ "files": [
58
+ "dist",
59
+ "README.md",
60
+ "LICENSE"
61
+ ],
62
+ "publishConfig": {
63
+ "access": "public"
64
+ }
65
+ }