bun-platform-kit 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 (54) hide show
  1. package/README.md +82 -0
  2. package/dist/BunKitServer.d.ts +31 -0
  3. package/dist/BunKitServer.js +173 -0
  4. package/dist/BunKitStandardServer.d.ts +18 -0
  5. package/dist/BunKitStandardServer.js +53 -0
  6. package/dist/abstract/ServerModule.d.ts +7 -0
  7. package/dist/abstract/ServerModule.js +12 -0
  8. package/dist/abstract/ServerService.d.ts +6 -0
  9. package/dist/abstract/ServerService.js +9 -0
  10. package/dist/abstract/ServerTypes.d.ts +78 -0
  11. package/dist/abstract/ServerTypes.js +7 -0
  12. package/dist/abstract/index.d.ts +3 -0
  13. package/dist/abstract/index.js +19 -0
  14. package/dist/adapters/BunAdapter.d.ts +12 -0
  15. package/dist/adapters/BunAdapter.js +1165 -0
  16. package/dist/adapters/index.d.ts +1 -0
  17. package/dist/adapters/index.js +17 -0
  18. package/dist/controllers/ReportFinanceController.d.ts +0 -0
  19. package/dist/controllers/ReportFinanceController.js +1 -0
  20. package/dist/decorators/Controller.d.ts +2 -0
  21. package/dist/decorators/Controller.js +13 -0
  22. package/dist/decorators/DecoratorGuards.d.ts +1 -0
  23. package/dist/decorators/DecoratorGuards.js +14 -0
  24. package/dist/decorators/Handlers.d.ts +18 -0
  25. package/dist/decorators/Handlers.js +35 -0
  26. package/dist/decorators/MetadataKeys.d.ts +6 -0
  27. package/dist/decorators/MetadataKeys.js +10 -0
  28. package/dist/decorators/Parameters.d.ts +24 -0
  29. package/dist/decorators/Parameters.js +41 -0
  30. package/dist/decorators/Use.d.ts +3 -0
  31. package/dist/decorators/Use.js +26 -0
  32. package/dist/decorators/index.d.ts +5 -0
  33. package/dist/decorators/index.js +21 -0
  34. package/dist/index.d.ts +10 -0
  35. package/dist/index.js +27 -0
  36. package/dist/modules/ControllersModule.d.ts +11 -0
  37. package/dist/modules/ControllersModule.js +138 -0
  38. package/dist/modules/CorsModule.d.ts +12 -0
  39. package/dist/modules/CorsModule.js +89 -0
  40. package/dist/modules/FileUploadModule.d.ts +21 -0
  41. package/dist/modules/FileUploadModule.js +20 -0
  42. package/dist/modules/RateLimitModule.d.ts +18 -0
  43. package/dist/modules/RateLimitModule.js +61 -0
  44. package/dist/modules/RequestContextModule.d.ts +18 -0
  45. package/dist/modules/RequestContextModule.js +52 -0
  46. package/dist/modules/SecurityModule.d.ts +11 -0
  47. package/dist/modules/SecurityModule.js +65 -0
  48. package/dist/modules/index.d.ts +6 -0
  49. package/dist/modules/index.js +22 -0
  50. package/dist/testing/createDecoratedTestApp.d.ts +19 -0
  51. package/dist/testing/createDecoratedTestApp.js +49 -0
  52. package/dist/testing/index.d.ts +1 -0
  53. package/dist/testing/index.js +17 -0
  54. package/package.json +57 -0
@@ -0,0 +1 @@
1
+ export * from "./BunAdapter";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./BunAdapter"), exports);
File without changes
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,2 @@
1
+ import "reflect-metadata";
2
+ export declare function Controller(basePath: string): (...args: any[]) => void;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Controller = Controller;
4
+ const MetadataKeys_1 = require("./MetadataKeys");
5
+ const DecoratorGuards_1 = require("./DecoratorGuards");
6
+ require("reflect-metadata");
7
+ function Controller(basePath) {
8
+ return function (...args) {
9
+ (0, DecoratorGuards_1.assertLegacyDecorator)(args, "@Controller");
10
+ const target = args[0];
11
+ Reflect.defineMetadata(MetadataKeys_1.MetadataKeys.BASE_PATH, basePath, target);
12
+ };
13
+ }
@@ -0,0 +1 @@
1
+ export declare function assertLegacyDecorator(args: any[], decoratorName: string): void;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.assertLegacyDecorator = assertLegacyDecorator;
4
+ function assertLegacyDecorator(args, decoratorName) {
5
+ const context = args[1];
6
+ if (args.length === 2 &&
7
+ context &&
8
+ typeof context === "object" &&
9
+ "kind" in context) {
10
+ throw new Error(`[bun-platform-kit] ${decoratorName} is not compatible with ` +
11
+ `standard TypeScript decorators. Enable "experimentalDecorators": true ` +
12
+ `in your tsconfig and ensure your files are included by that config.`);
13
+ }
14
+ }
@@ -0,0 +1,18 @@
1
+ import "reflect-metadata";
2
+ export declare enum Methods {
3
+ GET = "get",
4
+ POST = "post",
5
+ PUT = "put",
6
+ DELETE = "delete",
7
+ PATCH = "patch"
8
+ }
9
+ export interface IRouter {
10
+ method: Methods;
11
+ path: string;
12
+ handlerName: string | symbol;
13
+ }
14
+ export declare const Get: (path: string) => (...args: any[]) => void;
15
+ export declare const Post: (path: string) => (...args: any[]) => void;
16
+ export declare const Put: (path: string) => (...args: any[]) => void;
17
+ export declare const Delete: (path: string) => (...args: any[]) => void;
18
+ export declare const Patch: (path: string) => (...args: any[]) => void;
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Patch = exports.Delete = exports.Put = exports.Post = exports.Get = exports.Methods = void 0;
4
+ const MetadataKeys_1 = require("./MetadataKeys");
5
+ const DecoratorGuards_1 = require("./DecoratorGuards");
6
+ require("reflect-metadata");
7
+ var Methods;
8
+ (function (Methods) {
9
+ Methods["GET"] = "get";
10
+ Methods["POST"] = "post";
11
+ Methods["PUT"] = "put";
12
+ Methods["DELETE"] = "delete";
13
+ Methods["PATCH"] = "patch";
14
+ })(Methods || (exports.Methods = Methods = {}));
15
+ function methodDecorator(method) {
16
+ return function (path) {
17
+ return function (...args) {
18
+ (0, DecoratorGuards_1.assertLegacyDecorator)(args, `@${method.toUpperCase()}`);
19
+ const target = args[0];
20
+ const key = args[1];
21
+ const routers = Reflect.getMetadata(MetadataKeys_1.MetadataKeys.ROUTERS, target) || [];
22
+ routers.push({
23
+ method,
24
+ path,
25
+ handlerName: key,
26
+ });
27
+ Reflect.defineMetadata(MetadataKeys_1.MetadataKeys.ROUTERS, routers, target);
28
+ };
29
+ };
30
+ }
31
+ exports.Get = methodDecorator(Methods.GET);
32
+ exports.Post = methodDecorator(Methods.POST);
33
+ exports.Put = methodDecorator(Methods.PUT);
34
+ exports.Delete = methodDecorator(Methods.DELETE);
35
+ exports.Patch = methodDecorator(Methods.PATCH);
@@ -0,0 +1,6 @@
1
+ export declare enum MetadataKeys {
2
+ BASE_PATH = "base_path",
3
+ ROUTERS = "routers",
4
+ MIDDLEWARE = "middleware",
5
+ PARAMETERS = "parameters"
6
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MetadataKeys = void 0;
4
+ var MetadataKeys;
5
+ (function (MetadataKeys) {
6
+ MetadataKeys["BASE_PATH"] = "base_path";
7
+ MetadataKeys["ROUTERS"] = "routers";
8
+ MetadataKeys["MIDDLEWARE"] = "middleware";
9
+ MetadataKeys["PARAMETERS"] = "parameters";
10
+ })(MetadataKeys || (exports.MetadataKeys = MetadataKeys = {}));
@@ -0,0 +1,24 @@
1
+ import "reflect-metadata";
2
+ export declare enum ParameterType {
3
+ BODY = "body",
4
+ QUERY = "query",
5
+ PARAM = "param",
6
+ HEADERS = "headers",
7
+ REQUEST = "request",
8
+ RESPONSE = "response",
9
+ NEXT = "next",
10
+ FILE = "file"
11
+ }
12
+ export interface ParameterMetadata {
13
+ index: number;
14
+ type: ParameterType;
15
+ data?: string;
16
+ }
17
+ export declare const Body: (data?: string) => ParameterDecorator;
18
+ export declare const Query: (data?: string) => ParameterDecorator;
19
+ export declare const Param: (data?: string) => ParameterDecorator;
20
+ export declare const Headers: (data?: string) => ParameterDecorator;
21
+ export declare const Req: (data?: string) => ParameterDecorator;
22
+ export declare const Res: (data?: string) => ParameterDecorator;
23
+ export declare const Next: (data?: string) => ParameterDecorator;
24
+ export declare const UploadedFile: (data?: string) => ParameterDecorator;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UploadedFile = exports.Next = exports.Res = exports.Req = exports.Headers = exports.Param = exports.Query = exports.Body = exports.ParameterType = void 0;
4
+ require("reflect-metadata");
5
+ const MetadataKeys_1 = require("./MetadataKeys");
6
+ var ParameterType;
7
+ (function (ParameterType) {
8
+ ParameterType["BODY"] = "body";
9
+ ParameterType["QUERY"] = "query";
10
+ ParameterType["PARAM"] = "param";
11
+ ParameterType["HEADERS"] = "headers";
12
+ ParameterType["REQUEST"] = "request";
13
+ ParameterType["RESPONSE"] = "response";
14
+ ParameterType["NEXT"] = "next";
15
+ ParameterType["FILE"] = "file";
16
+ })(ParameterType || (exports.ParameterType = ParameterType = {}));
17
+ // Helper to register parameter metadata for a method
18
+ function addParameterMetadata(target, propertyKey, metadata) {
19
+ const existingParameters = Reflect.getMetadata(MetadataKeys_1.MetadataKeys.PARAMETERS, target, propertyKey) || [];
20
+ Reflect.defineMetadata(MetadataKeys_1.MetadataKeys.PARAMETERS, [...existingParameters, metadata].sort((a, b) => a.index - b.index), target, propertyKey);
21
+ }
22
+ function createParameterDecorator(type) {
23
+ return (data) => (target, propertyKey, parameterIndex) => {
24
+ if (propertyKey === undefined) {
25
+ throw new Error("Parameter decorators can only be used on methods");
26
+ }
27
+ addParameterMetadata(target, propertyKey, {
28
+ index: parameterIndex,
29
+ type,
30
+ data,
31
+ });
32
+ };
33
+ }
34
+ exports.Body = createParameterDecorator(ParameterType.BODY);
35
+ exports.Query = createParameterDecorator(ParameterType.QUERY);
36
+ exports.Param = createParameterDecorator(ParameterType.PARAM);
37
+ exports.Headers = createParameterDecorator(ParameterType.HEADERS);
38
+ exports.Req = createParameterDecorator(ParameterType.REQUEST);
39
+ exports.Res = createParameterDecorator(ParameterType.RESPONSE);
40
+ exports.Next = createParameterDecorator(ParameterType.NEXT);
41
+ exports.UploadedFile = createParameterDecorator(ParameterType.FILE);
@@ -0,0 +1,3 @@
1
+ import { ServerHandler } from "../abstract";
2
+ import "reflect-metadata";
3
+ export declare function Use(middleware: ServerHandler | ServerHandler[]): (...args: any[]) => void;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Use = Use;
4
+ const MetadataKeys_1 = require("./MetadataKeys");
5
+ const DecoratorGuards_1 = require("./DecoratorGuards");
6
+ require("reflect-metadata");
7
+ function Use(middleware) {
8
+ return function (...args) {
9
+ (0, DecoratorGuards_1.assertLegacyDecorator)(args, "@Use");
10
+ const target = args[0];
11
+ const key = args[1];
12
+ const newMiddlewares = Array.isArray(middleware)
13
+ ? middleware
14
+ : [middleware];
15
+ if (key) {
16
+ // Method decorator
17
+ const middlewares = Reflect.getMetadata(MetadataKeys_1.MetadataKeys.MIDDLEWARE, target, key) || [];
18
+ Reflect.defineMetadata(MetadataKeys_1.MetadataKeys.MIDDLEWARE, [...middlewares, ...newMiddlewares], target, key);
19
+ }
20
+ else {
21
+ // Class decorator
22
+ const middlewares = Reflect.getMetadata(MetadataKeys_1.MetadataKeys.MIDDLEWARE, target) || [];
23
+ Reflect.defineMetadata(MetadataKeys_1.MetadataKeys.MIDDLEWARE, [...middlewares, ...newMiddlewares], target);
24
+ }
25
+ };
26
+ }
@@ -0,0 +1,5 @@
1
+ export * from "./Controller";
2
+ export * from "./Handlers";
3
+ export * from "./MetadataKeys";
4
+ export * from "./Use";
5
+ export * from "./Parameters";
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Controller"), exports);
18
+ __exportStar(require("./Handlers"), exports);
19
+ __exportStar(require("./MetadataKeys"), exports);
20
+ __exportStar(require("./Use"), exports);
21
+ __exportStar(require("./Parameters"), exports);
@@ -0,0 +1,10 @@
1
+ import "reflect-metadata";
2
+ export { BunKitServer } from "./BunKitServer";
3
+ export type { BunKitServerOptions } from "./BunKitServer";
4
+ export { BunKitStandardServer } from "./BunKitStandardServer";
5
+ export type { BunKitStandardServerOptions } from "./BunKitStandardServer";
6
+ export * from "./adapters";
7
+ export * from "./modules";
8
+ export * from "./abstract";
9
+ export * from "./decorators";
10
+ export * from "./testing";
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.BunKitStandardServer = exports.BunKitServer = void 0;
18
+ require("reflect-metadata");
19
+ var BunKitServer_1 = require("./BunKitServer");
20
+ Object.defineProperty(exports, "BunKitServer", { enumerable: true, get: function () { return BunKitServer_1.BunKitServer; } });
21
+ var BunKitStandardServer_1 = require("./BunKitStandardServer");
22
+ Object.defineProperty(exports, "BunKitStandardServer", { enumerable: true, get: function () { return BunKitStandardServer_1.BunKitStandardServer; } });
23
+ __exportStar(require("./adapters"), exports);
24
+ __exportStar(require("./modules"), exports);
25
+ __exportStar(require("./abstract"), exports);
26
+ __exportStar(require("./decorators"), exports);
27
+ __exportStar(require("./testing"), exports);
@@ -0,0 +1,11 @@
1
+ import { BaseServerModule } from "../abstract";
2
+ import { ServerApp, ServerContext } from "../abstract";
3
+ import "reflect-metadata";
4
+ export declare class ControllersModule extends BaseServerModule {
5
+ private controllers;
6
+ name: string;
7
+ priority: number;
8
+ constructor(controllers: Function[]);
9
+ getModuleName(): string;
10
+ init(app: ServerApp, context?: ServerContext): void;
11
+ }
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ControllersModule = void 0;
4
+ const abstract_1 = require("../abstract");
5
+ const adapters_1 = require("../adapters");
6
+ const MetadataKeys_1 = require("../decorators/MetadataKeys");
7
+ const Parameters_1 = require("../decorators/Parameters");
8
+ require("reflect-metadata");
9
+ class ControllersModule extends abstract_1.BaseServerModule {
10
+ constructor(controllers) {
11
+ super();
12
+ this.controllers = controllers;
13
+ this.name = "Controllers";
14
+ this.priority = 10;
15
+ }
16
+ getModuleName() {
17
+ return this.name;
18
+ }
19
+ init(app, context) {
20
+ this.controllers.forEach((ControllerClass) => {
21
+ const basePath = Reflect.getMetadata(MetadataKeys_1.MetadataKeys.BASE_PATH, ControllerClass);
22
+ const classMiddlewares = Reflect.getMetadata(MetadataKeys_1.MetadataKeys.MIDDLEWARE, ControllerClass) || [];
23
+ const routers = Reflect.getMetadata(MetadataKeys_1.MetadataKeys.ROUTERS, ControllerClass.prototype) || [];
24
+ if (!basePath) {
25
+ return;
26
+ }
27
+ const adapter = context?.adapter ?? new adapters_1.BunAdapter();
28
+ const router = adapter.createRouter();
29
+ // Create a single controller instance per controller class (singleton pattern)
30
+ const controllerInstance = new ControllerClass();
31
+ // Apply class-level middlewares
32
+ if (classMiddlewares.length > 0) {
33
+ router.use(classMiddlewares);
34
+ }
35
+ routers.forEach(({ method, path, handlerName }) => {
36
+ const routeHandler = ControllerClass.prototype[handlerName];
37
+ const routeMiddlewares = Reflect.getMetadata(MetadataKeys_1.MetadataKeys.MIDDLEWARE, ControllerClass.prototype, handlerName) || [];
38
+ const parameterMetadata = Reflect.getMetadata(MetadataKeys_1.MetadataKeys.PARAMETERS, ControllerClass.prototype, handlerName) || [];
39
+ const routerMethod = router[method]?.bind(router);
40
+ routerMethod(path, ...routeMiddlewares, async (req, res, next) => {
41
+ if (parameterMetadata.length === 0) {
42
+ try {
43
+ const result = routeHandler.call(controllerInstance, req, res, next);
44
+ if (result instanceof Promise) {
45
+ await result;
46
+ }
47
+ return result;
48
+ }
49
+ catch (error) {
50
+ return next(error);
51
+ }
52
+ }
53
+ const maxIndex = Math.max(routeHandler.length - 1, ...parameterMetadata.map((param) => param.index));
54
+ const args = new Array(Math.max(0, maxIndex + 1));
55
+ parameterMetadata.forEach((param) => {
56
+ switch (param.type) {
57
+ case Parameters_1.ParameterType.BODY:
58
+ if (param.data) {
59
+ const body = req.body;
60
+ args[param.index] = body ? body[param.data] : undefined;
61
+ }
62
+ else {
63
+ args[param.index] = req.body;
64
+ }
65
+ break;
66
+ case Parameters_1.ParameterType.PARAM:
67
+ args[param.index] = param.data
68
+ ? req.params?.[param.data]
69
+ : req.params;
70
+ break;
71
+ case Parameters_1.ParameterType.QUERY:
72
+ args[param.index] =
73
+ param.data && req.query ? req.query[param.data] : req.query;
74
+ break;
75
+ case Parameters_1.ParameterType.HEADERS:
76
+ if (param.data) {
77
+ const headerKey = param.data.toLowerCase();
78
+ args[param.index] = req.headers?.[headerKey];
79
+ }
80
+ else {
81
+ args[param.index] = req.headers;
82
+ }
83
+ break;
84
+ case Parameters_1.ParameterType.FILE: {
85
+ const files = req.files;
86
+ if (!files) {
87
+ args[param.index] = undefined;
88
+ break;
89
+ }
90
+ if (param.data) {
91
+ args[param.index] = files[param.data];
92
+ }
93
+ else {
94
+ args[param.index] = files;
95
+ }
96
+ break;
97
+ }
98
+ case Parameters_1.ParameterType.REQUEST:
99
+ args[param.index] = req;
100
+ break;
101
+ case Parameters_1.ParameterType.RESPONSE:
102
+ args[param.index] = res;
103
+ break;
104
+ case Parameters_1.ParameterType.NEXT:
105
+ args[param.index] = next;
106
+ break;
107
+ default:
108
+ args[param.index] = undefined;
109
+ break;
110
+ }
111
+ });
112
+ // Fallbacks for common handler arguments when not explicitly decorated
113
+ if (args[0] === undefined) {
114
+ args[0] = req;
115
+ }
116
+ if (args[1] === undefined) {
117
+ args[1] = res;
118
+ }
119
+ if (args[2] === undefined) {
120
+ args[2] = next;
121
+ }
122
+ try {
123
+ const result = routeHandler.apply(controllerInstance, args);
124
+ if (result instanceof Promise) {
125
+ await result;
126
+ }
127
+ return result;
128
+ }
129
+ catch (error) {
130
+ return next(error);
131
+ }
132
+ });
133
+ });
134
+ app.use(basePath, router);
135
+ });
136
+ }
137
+ }
138
+ exports.ControllersModule = ControllersModule;
@@ -0,0 +1,12 @@
1
+ import { BaseServerModule } from "../abstract";
2
+ import { ServerApp, ServerContext } from "../abstract";
3
+ import type { CorsOptions } from "cors";
4
+ export declare class CorsModule extends BaseServerModule {
5
+ name: string;
6
+ priority: number;
7
+ private corsOptions;
8
+ private static defaultCorsOptions;
9
+ constructor(corsOptions?: CorsOptions);
10
+ getModuleName(): string;
11
+ init(app: ServerApp, context?: ServerContext): void;
12
+ }
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CorsModule = void 0;
4
+ const abstract_1 = require("../abstract");
5
+ class CorsModule extends abstract_1.BaseServerModule {
6
+ constructor(corsOptions) {
7
+ super();
8
+ this.name = "Cors";
9
+ this.priority = -90;
10
+ this.corsOptions = {
11
+ ...CorsModule.defaultCorsOptions,
12
+ ...(corsOptions || {}),
13
+ };
14
+ }
15
+ getModuleName() {
16
+ return this.name;
17
+ }
18
+ init(app, context) {
19
+ app.use(createCorsMiddleware(this.corsOptions));
20
+ }
21
+ }
22
+ exports.CorsModule = CorsModule;
23
+ CorsModule.defaultCorsOptions = {
24
+ origin: "*",
25
+ allowedHeaders: ["content-type"],
26
+ methods: ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE", "OPTIONS"],
27
+ preflightContinue: false,
28
+ optionsSuccessStatus: 204,
29
+ };
30
+ const createCorsMiddleware = (options) => {
31
+ return (req, res, next) => {
32
+ const originHeader = String(req.headers?.origin || "");
33
+ const allowOrigin = resolveOrigin(options.origin, originHeader);
34
+ if (allowOrigin) {
35
+ res.set("access-control-allow-origin", allowOrigin);
36
+ }
37
+ if (options.credentials) {
38
+ res.set("access-control-allow-credentials", "true");
39
+ }
40
+ if (options.methods) {
41
+ res.set("access-control-allow-methods", Array.isArray(options.methods)
42
+ ? options.methods.join(",")
43
+ : options.methods);
44
+ }
45
+ if (options.allowedHeaders) {
46
+ res.set("access-control-allow-headers", Array.isArray(options.allowedHeaders)
47
+ ? options.allowedHeaders.join(",")
48
+ : options.allowedHeaders);
49
+ }
50
+ if (options.maxAge !== undefined) {
51
+ res.set("access-control-max-age", String(options.maxAge));
52
+ }
53
+ if (req.method === "OPTIONS") {
54
+ res.status(204).end();
55
+ return;
56
+ }
57
+ next();
58
+ };
59
+ };
60
+ const resolveOrigin = (originOption, requestOrigin) => {
61
+ if (!originOption || originOption === "*") {
62
+ return "*";
63
+ }
64
+ if (originOption === true) {
65
+ return requestOrigin || "*";
66
+ }
67
+ if (typeof originOption === "string") {
68
+ return originOption;
69
+ }
70
+ if (Array.isArray(originOption)) {
71
+ return originOption.includes(requestOrigin) ? requestOrigin : undefined;
72
+ }
73
+ if (typeof originOption === "function") {
74
+ let resolved;
75
+ originOption(requestOrigin, (err, value) => {
76
+ if (err) {
77
+ return;
78
+ }
79
+ if (value === true) {
80
+ resolved = requestOrigin || "*";
81
+ }
82
+ else if (typeof value === "string") {
83
+ resolved = value;
84
+ }
85
+ });
86
+ return resolved;
87
+ }
88
+ return undefined;
89
+ };
@@ -0,0 +1,21 @@
1
+ import { BaseServerModule } from "../abstract";
2
+ import { BunMultipartFile, ServerApp, ServerContext } from "../abstract";
3
+ export type FileUploadOptions = {
4
+ maxBodyBytes?: number;
5
+ maxFileBytes?: number;
6
+ maxFiles?: number;
7
+ maxFields?: number;
8
+ maxFieldBytes?: number;
9
+ maxFieldsBytes?: number;
10
+ allowedMimeTypes?: string[];
11
+ allowedFileSignatures?: Array<"png" | "jpg" | "jpeg" | "pdf" | "csv">;
12
+ validateFile?: (file: BunMultipartFile) => boolean | Promise<boolean>;
13
+ };
14
+ export declare class FileUploadModule extends BaseServerModule {
15
+ name: string;
16
+ priority: number;
17
+ private fileUploadOptions;
18
+ constructor(fileUploadOptions?: FileUploadOptions);
19
+ getModuleName(): string;
20
+ init(app: ServerApp, context?: ServerContext): void;
21
+ }
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FileUploadModule = void 0;
4
+ const abstract_1 = require("../abstract");
5
+ class FileUploadModule extends abstract_1.BaseServerModule {
6
+ constructor(fileUploadOptions) {
7
+ super();
8
+ this.name = "FileUpload";
9
+ this.priority = -60;
10
+ this.fileUploadOptions = fileUploadOptions ?? {};
11
+ }
12
+ getModuleName() {
13
+ return this.name;
14
+ }
15
+ init(app, context) {
16
+ app.set?.("fileUploadEnabled", true);
17
+ app.set?.("multipart", this.fileUploadOptions);
18
+ }
19
+ }
20
+ exports.FileUploadModule = FileUploadModule;
@@ -0,0 +1,18 @@
1
+ import { BaseServerModule } from "../abstract";
2
+ import { ServerApp, ServerContext } from "../abstract";
3
+ export type RateLimitOptions = {
4
+ windowMs?: number;
5
+ limit?: number;
6
+ max?: number;
7
+ standardHeaders?: boolean;
8
+ legacyHeaders?: boolean;
9
+ message?: string | Record<string, unknown>;
10
+ };
11
+ export declare class RateLimitModule extends BaseServerModule {
12
+ name: string;
13
+ priority: number;
14
+ private limiterOptions;
15
+ constructor(limiterOptions?: Partial<RateLimitOptions>);
16
+ getModuleName(): string;
17
+ init(app: ServerApp, context?: ServerContext): void;
18
+ }