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/server.d.ts
ADDED
|
@@ -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":"AAAA;;;GAGG;AAKH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AA4DnD;;GAEG;AACH,MAAM,OAAO,eAAe;IACnB,OAAO,CAAyB;IAChC,QAAQ,GAA0B,IAAI,CAAC;IAE/C,YAAY,OAA+B;QAC1C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACxB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACV,IAAI,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;QACxB,CAAC;QAED,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,IAAI;QACT,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACtB,CAAC;IACF,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY;QACzB,MAAM,CACL,EAAE,OAAO,EAAE,OAAO,EAAE,EACpB,EAAE,OAAO,EAAE,YAAY,EAAE,EACzB,EAAE,OAAO,EAAE,IAAI,EAAE,EACjB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACrB,MAAM,CAAC,SAAS,CAAC;YACjB,MAAM,CAAC,eAAe,CAAC;YACvB,MAAM,CAAC,MAAM,CAAC;SACd,CAAC,CAAC;QAEH,MAAM,GAAG,GAAY,OAAO,EAAE,CAAC;QAC/B,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;QAE5B,OAAO;QACP,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;gBACZ,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;gBAChC,WAAW,EAAE,IAAI;gBACjB,OAAO,EAAE;oBACR,KAAK;oBACL,MAAM;oBACN,KAAK;oBACL,QAAQ;iBACR;gBACD,cAAc,EAAE;oBACf,cAAc;oBACd,eAAe;oBACf,kBAAkB;oBAClB,QAAQ;oBACR,eAAe;iBACf;aACD,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gBAAgB;QAChB,GAAG,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC,CAAC;QAExB,4BAA4B;QAC5B,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAClC,KAAK,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;gBACjE,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAC3B,CAAC;QACF,CAAC;QAED,8DAA8D;QAC9D,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YACjD,GAAG,CAAC,GAAG,CAAC,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,wBAAwB;QACxB,mEAAmE;QACnE,KAAK,MAAM,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC;gBAChD,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;oBAClC,CAAC;oBACD,GAAG,CAAC,SAAS;iBACb,CAAC;gBACH,CAAC,CAAC;oBACA,YAAY,CAAC,OAAO;oBACpB,GAAG,YAAY,CAAC,OAAO,SAAS;iBAChC,CAAC;YAEJ,MAAM,aAAa,GAAyD,EAAE,CAAC;YAE/E,iCAAiC;YACjC,IAAI,YAAY,CAAC,YAAY,EAAE,CAAC;gBAC/B,aAAa,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE,EAAE;oBAClC,GAAG,CAAC,SAAS,CAAC,eAAe,EAAE,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC3D,CAAC,CAAC;YACH,CAAC;YAED,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC;QACpE,CAAC;QAED,aAAa;QACb,KAAK,MAAM,CACV,QAAQ,EACR,MAAM,EACN,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9C,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,MAAM,CAAC,YAAY,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,kBAAkB;QAClB,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,CAAC,QAAQ,GAAG;YACf,OAAO,EAAE,SAAS;YAClB,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACjD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC,CAAC;SACF,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjC,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ;QACrB,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QAE5C,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC;YACxC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YACvB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC/B,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YAClC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;gBAChD,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACpB,CAAC,CAAC;YACH,eAAe,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YACrC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,WAAW;YACrC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC;YAC5C,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;SAC7B,CAAC,CAAC;QAEH,IAAI,CAAC,QAAQ,GAAG;YACf,OAAO,EAAE,KAAK;YACd,IAAI,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE;SAC5B,CAAC;QAEF,OAAO,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAED;;;OAGG;IACH,MAAM,KAAK,OAAO;QACjB,OAAO,OAAO,CAAC;IAChB,CAAC;IAED;;;OAGG;IACH,MAAM,KAAK,KAAK;QACf,OAAO,MAAM,CAAC;IACf,CAAC;CACD;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAA+B,EAAmB,EAAE,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC"}
|
package/dist/utils.d.ts
ADDED
|
@@ -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
|
+
}
|