@abejarano/ts-express-server 2.0.0 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -12
- package/dist/BootstrapStandardServer.d.ts +4 -7
- package/dist/BootstrapStandardServer.js +3 -27
- package/dist/adapters/BunAdapter.js +2 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/modules/CorsModule.d.ts +1 -0
- package/dist/modules/CorsModule.js +10 -6
- package/dist/modules/FileUploadModule.d.ts +1 -1
- package/dist/modules/index.d.ts +0 -1
- package/dist/modules/index.js +0 -1
- package/package.json +14 -21
- package/dist/createRouter.d.ts +0 -2
- package/dist/createRouter.js +0 -8
- package/dist/modules/RoutesModule.d.ts +0 -17
- package/dist/modules/RoutesModule.js +0 -39
package/README.md
CHANGED
|
@@ -1,24 +1,22 @@
|
|
|
1
1
|
# TypeScript Server Framework (Bun)
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Un framework TypeScript moderno y modular para construir APIs en Bun con una arquitectura limpia, extensible y enfocada en productividad. Separa responsabilidades en modulos, servicios y controladores con decoradores, incluye middlewares esenciales listos para usar y mantiene una experiencia tipada end-to-end.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
7
|
-
- 🏗️ **
|
|
8
|
-
- 🚀 **
|
|
9
|
-
- 📦 **
|
|
10
|
-
- 🔄 **
|
|
11
|
-
- ⚡ **
|
|
12
|
-
- 🛡️ **Type
|
|
13
|
-
- 🔧 **Configurable**:
|
|
14
|
-
- 🎨 **
|
|
7
|
+
- 🏗️ **Arquitectura modular**: arma el servidor con modulos reutilizables y reemplazables
|
|
8
|
+
- 🚀 **Servicios de fondo**: inicia procesos y workers junto al servidor
|
|
9
|
+
- 📦 **Modulos incluidos**: CORS, seguridad, rate limit, uploads y contexto de request
|
|
10
|
+
- 🔄 **Apagado limpio**: shutdown ordenado y seguro para modulos/servicios
|
|
11
|
+
- ⚡ **Prioridades**: control total del orden de inicializacion
|
|
12
|
+
- 🛡️ **Type safety real**: tipado fuerte en request, response y decoradores
|
|
13
|
+
- 🔧 **Configurable**: cambia o desactiva piezas sin romper el core
|
|
14
|
+
- 🎨 **Decoradores**: controladores claros, declarativos y faciles de testear
|
|
15
15
|
|
|
16
16
|
## Installation
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
|
|
20
|
-
# or
|
|
21
|
-
yarn add @abejarano/ts-express-server
|
|
19
|
+
bun add @abejarano/ts-express-server
|
|
22
20
|
```
|
|
23
21
|
|
|
24
22
|
## Documentation
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { BootstrapServer } from "./BootstrapServer";
|
|
2
|
-
import { ControllersModule
|
|
2
|
+
import { ControllersModule } from "./modules";
|
|
3
3
|
import { BaseServerModule, BaseServerService, ServerAdapter } from "./abstract";
|
|
4
4
|
export interface BootstrapStandardServerOptions {
|
|
5
5
|
adapter?: ServerAdapter;
|
|
@@ -13,9 +13,6 @@ export interface BootstrapStandardServerOptions {
|
|
|
13
13
|
};
|
|
14
14
|
services?: BaseServerService[];
|
|
15
15
|
}
|
|
16
|
-
export declare function BootstrapStandardServer(port: number, module:
|
|
17
|
-
export declare function BootstrapStandardServer(port: number, module:
|
|
18
|
-
export declare function BootstrapStandardServer(port: number, module:
|
|
19
|
-
export declare function BootstrapStandardServer(port: number, routes: RoutesModule, controllersModule: ControllersModule, services?: BaseServerService[]): BootstrapServer;
|
|
20
|
-
export declare function BootstrapStandardServer(port: number, routes: RoutesModule, controllersModule: ControllersModule, services: BaseServerService[], options: BootstrapStandardServerOptions): BootstrapServer;
|
|
21
|
-
export declare function BootstrapStandardServer(port: number, routes: RoutesModule, controllersModule: ControllersModule, options: BootstrapStandardServerOptions): BootstrapServer;
|
|
16
|
+
export declare function BootstrapStandardServer(port: number, module: ControllersModule, services?: BaseServerService[]): BootstrapServer;
|
|
17
|
+
export declare function BootstrapStandardServer(port: number, module: ControllersModule, services: BaseServerService[], options: BootstrapStandardServerOptions): BootstrapServer;
|
|
18
|
+
export declare function BootstrapStandardServer(port: number, module: ControllersModule, options: BootstrapStandardServerOptions): BootstrapServer;
|
|
@@ -3,27 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.BootstrapStandardServer = BootstrapStandardServer;
|
|
4
4
|
const BootstrapServer_1 = require("./BootstrapServer");
|
|
5
5
|
const modules_1 = require("./modules");
|
|
6
|
-
function BootstrapStandardServer(port, arg2, arg3, arg4
|
|
7
|
-
let routesModule;
|
|
6
|
+
function BootstrapStandardServer(port, arg2, arg3, arg4) {
|
|
8
7
|
let controllersModule;
|
|
9
8
|
let services;
|
|
10
9
|
let options;
|
|
11
|
-
|
|
12
|
-
if (controllersModule && controllersModule !== module) {
|
|
13
|
-
throw new Error("ControllersModule provided multiple times. Pass a single instance only.");
|
|
14
|
-
}
|
|
15
|
-
controllersModule = module;
|
|
16
|
-
};
|
|
17
|
-
if (arg2 instanceof modules_1.RoutesModule) {
|
|
18
|
-
routesModule = arg2;
|
|
19
|
-
}
|
|
20
|
-
else if (arg2 instanceof modules_1.ControllersModule) {
|
|
21
|
-
setControllersModule(arg2);
|
|
22
|
-
routesModule = new modules_1.RoutesModule();
|
|
23
|
-
}
|
|
24
|
-
else {
|
|
25
|
-
throw new Error("Invalid second argument. Must be RoutesModule or ControllersModule");
|
|
26
|
-
}
|
|
10
|
+
controllersModule = arg2;
|
|
27
11
|
const addServices = (value) => {
|
|
28
12
|
if (!value?.length) {
|
|
29
13
|
return;
|
|
@@ -34,10 +18,6 @@ function BootstrapStandardServer(port, arg2, arg3, arg4, arg5) {
|
|
|
34
18
|
if (!value) {
|
|
35
19
|
return;
|
|
36
20
|
}
|
|
37
|
-
if (value instanceof modules_1.ControllersModule) {
|
|
38
|
-
setControllersModule(value);
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
21
|
if (Array.isArray(value)) {
|
|
42
22
|
addServices(value);
|
|
43
23
|
return;
|
|
@@ -46,9 +26,8 @@ function BootstrapStandardServer(port, arg2, arg3, arg4, arg5) {
|
|
|
46
26
|
};
|
|
47
27
|
processOptionalArg(arg3);
|
|
48
28
|
processOptionalArg(arg4);
|
|
49
|
-
processOptionalArg(arg5);
|
|
50
29
|
addServices(options?.services);
|
|
51
|
-
const modulesToRegister = [
|
|
30
|
+
const modulesToRegister = [controllersModule];
|
|
52
31
|
const preset = options?.modules;
|
|
53
32
|
const registerModule = (factory, override) => {
|
|
54
33
|
if (override === false) {
|
|
@@ -67,9 +46,6 @@ function BootstrapStandardServer(port, arg2, arg3, arg4, arg5) {
|
|
|
67
46
|
const server = new BootstrapServer_1.BootstrapServer(port, {
|
|
68
47
|
adapter: options?.adapter,
|
|
69
48
|
}).addModules(modulesToRegister);
|
|
70
|
-
if (controllersModule) {
|
|
71
|
-
server.addModule(controllersModule);
|
|
72
|
-
}
|
|
73
49
|
if (services) {
|
|
74
50
|
server.addServices(services);
|
|
75
51
|
}
|
|
@@ -138,7 +138,8 @@ class BunResponse {
|
|
|
138
138
|
? filename
|
|
139
139
|
: path_1.default.basename(safePath);
|
|
140
140
|
this.headers.set("content-disposition", `attachment; filename="${sanitizeFilename(resolvedName)}"`);
|
|
141
|
-
|
|
141
|
+
const fileBuffer = (0, fs_1.readFileSync)(safePath);
|
|
142
|
+
this.rawResponse = new Response(fileBuffer);
|
|
142
143
|
this.ended = true;
|
|
143
144
|
this.resolveEnd?.();
|
|
144
145
|
callback?.();
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,6 @@ export type { BootstrapServerOptions } from "./BootstrapServer";
|
|
|
4
4
|
export { BootstrapStandardServer } from "./BootstrapStandardServer";
|
|
5
5
|
export type { BootstrapStandardServerOptions } from "./BootstrapStandardServer";
|
|
6
6
|
export * from "./adapters";
|
|
7
|
-
export * from "./createRouter";
|
|
8
7
|
export * from "./modules";
|
|
9
8
|
export * from "./abstract";
|
|
10
9
|
export * from "./decorators";
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,6 @@ Object.defineProperty(exports, "BootstrapServer", { enumerable: true, get: funct
|
|
|
21
21
|
var BootstrapStandardServer_1 = require("./BootstrapStandardServer");
|
|
22
22
|
Object.defineProperty(exports, "BootstrapStandardServer", { enumerable: true, get: function () { return BootstrapStandardServer_1.BootstrapStandardServer; } });
|
|
23
23
|
__exportStar(require("./adapters"), exports);
|
|
24
|
-
__exportStar(require("./createRouter"), exports);
|
|
25
24
|
__exportStar(require("./modules"), exports);
|
|
26
25
|
__exportStar(require("./abstract"), exports);
|
|
27
26
|
__exportStar(require("./decorators"), exports);
|
|
@@ -5,6 +5,7 @@ export declare class CorsModule extends BaseServerModule {
|
|
|
5
5
|
name: string;
|
|
6
6
|
priority: number;
|
|
7
7
|
private corsOptions;
|
|
8
|
+
private static defaultCorsOptions;
|
|
8
9
|
constructor(corsOptions?: CorsOptions);
|
|
9
10
|
getModuleName(): string;
|
|
10
11
|
init(app: ServerApp, context?: ServerContext): void;
|
|
@@ -7,12 +7,9 @@ class CorsModule extends abstract_1.BaseServerModule {
|
|
|
7
7
|
super();
|
|
8
8
|
this.name = "Cors";
|
|
9
9
|
this.priority = -90;
|
|
10
|
-
this.corsOptions =
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
methods: ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE", "OPTIONS"],
|
|
14
|
-
preflightContinue: false,
|
|
15
|
-
optionsSuccessStatus: 204,
|
|
10
|
+
this.corsOptions = {
|
|
11
|
+
...CorsModule.defaultCorsOptions,
|
|
12
|
+
...(corsOptions || {}),
|
|
16
13
|
};
|
|
17
14
|
}
|
|
18
15
|
getModuleName() {
|
|
@@ -23,6 +20,13 @@ class CorsModule extends abstract_1.BaseServerModule {
|
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
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
|
+
};
|
|
26
30
|
const createCorsMiddleware = (options) => {
|
|
27
31
|
return (req, res, next) => {
|
|
28
32
|
const originHeader = String(req.headers?.origin || "");
|
|
@@ -8,7 +8,7 @@ export type FileUploadOptions = {
|
|
|
8
8
|
maxFieldBytes?: number;
|
|
9
9
|
maxFieldsBytes?: number;
|
|
10
10
|
allowedMimeTypes?: string[];
|
|
11
|
-
allowedFileSignatures?: Array<"png" | "jpg" | "jpeg" | "pdf">;
|
|
11
|
+
allowedFileSignatures?: Array<"png" | "jpg" | "jpeg" | "pdf" | "csv">;
|
|
12
12
|
validateFile?: (file: BunMultipartFile) => boolean | Promise<boolean>;
|
|
13
13
|
};
|
|
14
14
|
export declare class FileUploadModule extends BaseServerModule {
|
package/dist/modules/index.d.ts
CHANGED
package/dist/modules/index.js
CHANGED
|
@@ -19,5 +19,4 @@ __exportStar(require("./ControllersModule"), exports);
|
|
|
19
19
|
__exportStar(require("./FileUploadModule"), exports);
|
|
20
20
|
__exportStar(require("./RateLimitModule"), exports);
|
|
21
21
|
__exportStar(require("./RequestContextModule"), exports);
|
|
22
|
-
__exportStar(require("./RoutesModule"), exports);
|
|
23
22
|
__exportStar(require("./SecurityModule"), exports);
|
package/package.json
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abejarano/ts-express-server",
|
|
3
3
|
"author": "angel bejarano / angel.bejarano@jaspesoft.com",
|
|
4
|
-
"version": "2.0.
|
|
4
|
+
"version": "2.0.2",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"files": [
|
|
8
8
|
"dist"
|
|
9
9
|
],
|
|
10
10
|
"scripts": {
|
|
11
|
-
"build": "tsc -p tsconfig.json",
|
|
12
|
-
"clean": "
|
|
13
|
-
"prepare": "
|
|
14
|
-
"prebuild": "
|
|
15
|
-
"format": "prettier --write .",
|
|
16
|
-
"format:check": "prettier --check .",
|
|
17
|
-
"typecheck": "tsc --noEmit",
|
|
18
|
-
"prepack": "
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"test": "jest",
|
|
23
|
-
"test:watch": "jest --watch",
|
|
24
|
-
"test:coverage": "jest --coverage"
|
|
11
|
+
"build": "bun run tsc -p tsconfig.json",
|
|
12
|
+
"clean": "rm -rf dist",
|
|
13
|
+
"prepare": "bun run build",
|
|
14
|
+
"prebuild": "bun run clean",
|
|
15
|
+
"format": "bun run prettier --write .",
|
|
16
|
+
"format:check": "bun run prettier --check .",
|
|
17
|
+
"typecheck": "bun run tsc --noEmit",
|
|
18
|
+
"prepack": "bun run build",
|
|
19
|
+
"test": "bun test",
|
|
20
|
+
"test:watch": "bun test --watch",
|
|
21
|
+
"test:coverage": "bun test --coverage"
|
|
25
22
|
},
|
|
26
23
|
"keywords": [
|
|
27
24
|
"server",
|
|
@@ -39,17 +36,13 @@
|
|
|
39
36
|
"@semantic-release/changelog": "^6.0.3",
|
|
40
37
|
"@semantic-release/git": "^10.0.1",
|
|
41
38
|
"@types/cors": "^2.8.19",
|
|
42
|
-
"
|
|
43
|
-
"@types/node": "^25.0.3",
|
|
44
|
-
"jest": "^30.2.0",
|
|
39
|
+
"bun-types": "^1.3.5",
|
|
45
40
|
"prettier": "^3.6.2",
|
|
46
|
-
"rimraf": "^6.0.1",
|
|
47
41
|
"semantic-release": "^25.0.2",
|
|
48
|
-
"ts-jest": "^29.4.5",
|
|
49
42
|
"typescript": "^5.9.3"
|
|
50
43
|
},
|
|
51
44
|
"engines": {
|
|
52
|
-
"
|
|
45
|
+
"bun": ">=1.3.5"
|
|
53
46
|
},
|
|
54
47
|
"repository": {
|
|
55
48
|
"type": "git",
|
package/dist/createRouter.d.ts
DELETED
package/dist/createRouter.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createRouter = void 0;
|
|
4
|
-
const adapters_1 = require("./adapters");
|
|
5
|
-
const createRouter = () => {
|
|
6
|
-
return new adapters_1.BunAdapter().createRouter();
|
|
7
|
-
};
|
|
8
|
-
exports.createRouter = createRouter;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { BaseServerModule } from "../abstract";
|
|
2
|
-
import { ServerApp, ServerContext, ServerHandler, ServerRouter } from "../abstract";
|
|
3
|
-
export interface RouteConfig {
|
|
4
|
-
path: string;
|
|
5
|
-
router: ServerRouter;
|
|
6
|
-
middleware?: ServerHandler[] | ServerHandler;
|
|
7
|
-
}
|
|
8
|
-
export declare class RoutesModule extends BaseServerModule {
|
|
9
|
-
name: string;
|
|
10
|
-
priority: number;
|
|
11
|
-
private routes;
|
|
12
|
-
constructor(routes?: RouteConfig[]);
|
|
13
|
-
getModuleName(): string;
|
|
14
|
-
addRoute(route: RouteConfig): void;
|
|
15
|
-
addRoutes(routes: RouteConfig[]): void;
|
|
16
|
-
init(app: ServerApp, context?: ServerContext): void;
|
|
17
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RoutesModule = void 0;
|
|
4
|
-
const abstract_1 = require("../abstract");
|
|
5
|
-
class RoutesModule extends abstract_1.BaseServerModule {
|
|
6
|
-
constructor(routes = []) {
|
|
7
|
-
super();
|
|
8
|
-
this.name = "Routes";
|
|
9
|
-
this.priority = 10; // Executed after basic middlewares
|
|
10
|
-
this.routes = routes;
|
|
11
|
-
}
|
|
12
|
-
getModuleName() {
|
|
13
|
-
return this.name;
|
|
14
|
-
}
|
|
15
|
-
addRoute(route) {
|
|
16
|
-
this.routes.push({
|
|
17
|
-
...route,
|
|
18
|
-
});
|
|
19
|
-
}
|
|
20
|
-
addRoutes(routes) {
|
|
21
|
-
this.routes.push(...routes);
|
|
22
|
-
}
|
|
23
|
-
init(app, context) {
|
|
24
|
-
this.routes.forEach(({ path, router, middleware }) => {
|
|
25
|
-
const middlewareList = Array.isArray(middleware)
|
|
26
|
-
? middleware
|
|
27
|
-
: middleware
|
|
28
|
-
? [middleware]
|
|
29
|
-
: [];
|
|
30
|
-
if (middlewareList.length > 0) {
|
|
31
|
-
app.use(path, ...middlewareList, router);
|
|
32
|
-
}
|
|
33
|
-
else {
|
|
34
|
-
app.use(path, router);
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
exports.RoutesModule = RoutesModule;
|