@ismael1361/router 1.1.1 → 1.1.3
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/dist/HandleError.esm.js +126 -1
- package/dist/HandleError.esm.js.map +1 -1
- package/dist/HandleError.js +128 -1
- package/dist/HandleError.js.map +1 -1
- package/dist/Layer.esm.js +250 -1
- package/dist/Layer.esm.js.map +1 -1
- package/dist/Layer.js +252 -1
- package/dist/Layer.js.map +1 -1
- package/dist/Middlewares.esm.js +187 -1
- package/dist/Middlewares.esm.js.map +1 -1
- package/dist/Middlewares.js +194 -1
- package/dist/Middlewares.js.map +1 -1
- package/dist/handler.esm.js +170 -1
- package/dist/handler.esm.js.map +1 -1
- package/dist/handler.js +173 -1
- package/dist/handler.js.map +1 -1
- package/dist/index.esm.js +141 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +152 -1
- package/dist/index.js.map +1 -1
- package/dist/middleware.esm.js +151 -1
- package/dist/middleware.esm.js.map +1 -1
- package/dist/middleware.js +154 -1
- package/dist/middleware.js.map +1 -1
- package/dist/node_modules/tslib/tslib.es6.esm.js +45 -1
- package/dist/node_modules/tslib/tslib.es6.esm.js.map +1 -1
- package/dist/node_modules/tslib/tslib.es6.js +48 -1
- package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
- package/dist/redocUi/index.esm.js +74 -1
- package/dist/redocUi/index.esm.js.map +1 -1
- package/dist/redocUi/index.js +76 -1
- package/dist/redocUi/index.js.map +1 -1
- package/dist/router.esm.js +436 -1
- package/dist/router.esm.js.map +1 -1
- package/dist/router.js +438 -1
- package/dist/router.js.map +1 -1
- package/dist/swagger-markdown/index.esm.js +128 -1
- package/dist/swagger-markdown/index.esm.js.map +1 -1
- package/dist/swagger-markdown/index.js +134 -1
- package/dist/swagger-markdown/index.js.map +1 -1
- package/dist/swagger-markdown/lib/anchor.esm.js +6 -1
- package/dist/swagger-markdown/lib/anchor.esm.js.map +1 -1
- package/dist/swagger-markdown/lib/anchor.js +8 -1
- package/dist/swagger-markdown/lib/anchor.js.map +1 -1
- package/dist/swagger-markdown/lib/inArray.esm.js +20 -1
- package/dist/swagger-markdown/lib/inArray.esm.js.map +1 -1
- package/dist/swagger-markdown/lib/inArray.js +22 -1
- package/dist/swagger-markdown/lib/inArray.js.map +1 -1
- package/dist/swagger-markdown/models/schema.esm.js +64 -1
- package/dist/swagger-markdown/models/schema.esm.js.map +1 -1
- package/dist/swagger-markdown/models/schema.js +66 -1
- package/dist/swagger-markdown/models/schema.js.map +1 -1
- package/dist/swagger-markdown/transformers/contact.esm.js +23 -1
- package/dist/swagger-markdown/transformers/contact.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/contact.js +25 -1
- package/dist/swagger-markdown/transformers/contact.js.map +1 -1
- package/dist/swagger-markdown/transformers/dataTypes.esm.js +59 -1
- package/dist/swagger-markdown/transformers/dataTypes.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/dataTypes.js +61 -1
- package/dist/swagger-markdown/transformers/dataTypes.js.map +1 -1
- package/dist/swagger-markdown/transformers/definitions.esm.js +75 -1
- package/dist/swagger-markdown/transformers/definitions.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/definitions.js +80 -1
- package/dist/swagger-markdown/transformers/definitions.js.map +1 -1
- package/dist/swagger-markdown/transformers/externalDocs.esm.js +13 -1
- package/dist/swagger-markdown/transformers/externalDocs.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/externalDocs.js +15 -1
- package/dist/swagger-markdown/transformers/externalDocs.js.map +1 -1
- package/dist/swagger-markdown/transformers/info.esm.js +36 -1
- package/dist/swagger-markdown/transformers/info.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/info.js +38 -1
- package/dist/swagger-markdown/transformers/info.js.map +1 -1
- package/dist/swagger-markdown/transformers/license.esm.js +20 -1
- package/dist/swagger-markdown/transformers/license.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/license.js +22 -1
- package/dist/swagger-markdown/transformers/license.js.map +1 -1
- package/dist/swagger-markdown/transformers/path.esm.js +71 -1
- package/dist/swagger-markdown/transformers/path.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/path.js +76 -1
- package/dist/swagger-markdown/transformers/path.js.map +1 -1
- package/dist/swagger-markdown/transformers/pathParameters.esm.js +62 -1
- package/dist/swagger-markdown/transformers/pathParameters.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/pathParameters.js +64 -1
- package/dist/swagger-markdown/transformers/pathParameters.js.map +1 -1
- package/dist/swagger-markdown/transformers/pathResponses.esm.js +45 -1
- package/dist/swagger-markdown/transformers/pathResponses.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/pathResponses.js +47 -1
- package/dist/swagger-markdown/transformers/pathResponses.js.map +1 -1
- package/dist/swagger-markdown/transformers/security.esm.js +41 -1
- package/dist/swagger-markdown/transformers/security.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/security.js +43 -1
- package/dist/swagger-markdown/transformers/security.js.map +1 -1
- package/dist/swagger-markdown/transformers/securityDefinitions.esm.js +51 -1
- package/dist/swagger-markdown/transformers/securityDefinitions.esm.js.map +1 -1
- package/dist/swagger-markdown/transformers/securityDefinitions.js +57 -1
- package/dist/swagger-markdown/transformers/securityDefinitions.js.map +1 -1
- package/dist/utils.esm.js +244 -1
- package/dist/utils.esm.js.map +1 -1
- package/dist/utils.js +256 -1
- package/dist/utils.js.map +1 -1
- package/package.json +2 -2
package/dist/Middlewares.js
CHANGED
|
@@ -1,2 +1,195 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tslib_es6 = require('./node_modules/tslib/tslib.es6.js');
|
|
4
|
+
var stream = require('stream');
|
|
5
|
+
var HandleError = require('./HandleError.js');
|
|
6
|
+
var BodyParser = require('body-parser');
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Retorna um middleware que analisa corpos de requisição JSON.
|
|
10
|
+
* Este middleware é um wrapper em torno do `body-parser.json()`.
|
|
11
|
+
*
|
|
12
|
+
* @param {OptionsJson} [options] - Opções de configuração para o `body-parser`.
|
|
13
|
+
* @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* import { create, Middlewares } from '@ismael1361/router';
|
|
17
|
+
*
|
|
18
|
+
* const app = create();
|
|
19
|
+
*
|
|
20
|
+
* // Aplica o middleware para analisar JSON em todas as rotas
|
|
21
|
+
* app.middleware(Middlewares.json());
|
|
22
|
+
*
|
|
23
|
+
* app.post('/data').handler((req, res) => {
|
|
24
|
+
* // req.body agora contém o objeto JSON enviado
|
|
25
|
+
* res.json({ received: req.body });
|
|
26
|
+
* });
|
|
27
|
+
*/
|
|
28
|
+
const json = (options) => {
|
|
29
|
+
return BodyParser.json(options);
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Retorna um middleware que analisa corpos de requisição como um Buffer.
|
|
33
|
+
* Este middleware é um wrapper em torno do `body-parser.raw()`.
|
|
34
|
+
*
|
|
35
|
+
* @param {Options} [options] - Opções de configuração para o `body-parser`.
|
|
36
|
+
* @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* import { create, Middlewares } from '@ismael1361/router';
|
|
40
|
+
*
|
|
41
|
+
* const app = create();
|
|
42
|
+
*
|
|
43
|
+
* // Analisa corpos do tipo 'application/octet-stream' como Buffer
|
|
44
|
+
* app.middleware(Middlewares.raw({ type: 'application/octet-stream', limit: '10mb' }));
|
|
45
|
+
*
|
|
46
|
+
* app.post('/upload-raw').handler((req, res) => {
|
|
47
|
+
* // req.body é um Buffer com os dados brutos
|
|
48
|
+
* console.log('Buffer recebido:', req.body.length, 'bytes');
|
|
49
|
+
* res.send('Raw data received');
|
|
50
|
+
* });
|
|
51
|
+
*/
|
|
52
|
+
const raw = (options) => {
|
|
53
|
+
return BodyParser.raw(options);
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Retorna um middleware que analisa corpos de requisição como texto.
|
|
57
|
+
* Este middleware é um wrapper em torno do `body-parser.text()`.
|
|
58
|
+
*
|
|
59
|
+
* @param {OptionsText} [options] - Opções de configuração para o `body-parser`.
|
|
60
|
+
* @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* import { create, Middlewares } from '@ismael1361/router';
|
|
64
|
+
*
|
|
65
|
+
* const app = create();
|
|
66
|
+
*
|
|
67
|
+
* // Analisa corpos do tipo 'text/plain' como string
|
|
68
|
+
* app.middleware(Middlewares.text({ type: 'text/plain' }));
|
|
69
|
+
*
|
|
70
|
+
* app.post('/log').handler((req, res) => {
|
|
71
|
+
* // req.body é uma string com o conteúdo do corpo
|
|
72
|
+
* console.log('Log recebido:', req.body);
|
|
73
|
+
* res.send('Log received');
|
|
74
|
+
* });
|
|
75
|
+
*/
|
|
76
|
+
const text = (options) => {
|
|
77
|
+
return BodyParser.text(options);
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Retorna um middleware que analisa corpos de requisição com o formato `application/x-www-form-urlencoded`.
|
|
81
|
+
* Este middleware é um wrapper em torno do `body-parser.urlencoded()`.
|
|
82
|
+
*
|
|
83
|
+
* @param {OptionsUrlencoded} [options] - Opções de configuração para o `body-parser`.
|
|
84
|
+
* @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* import { create, Middlewares } from '@ismael1361/router';
|
|
88
|
+
*
|
|
89
|
+
* const app = create();
|
|
90
|
+
*
|
|
91
|
+
* // Aplica o middleware para analisar dados de formulário
|
|
92
|
+
* app.middleware(Middlewares.urlencoded({ extended: true }));
|
|
93
|
+
*
|
|
94
|
+
* app.post('/submit-form').handler((req, res) => {
|
|
95
|
+
* // req.body contém os dados do formulário
|
|
96
|
+
* res.json({ form_data: req.body });
|
|
97
|
+
* });
|
|
98
|
+
*/
|
|
99
|
+
const urlencoded = (options) => {
|
|
100
|
+
return BodyParser.urlencoded(options);
|
|
101
|
+
};
|
|
102
|
+
const cors = (allowOrigin = "*") => {
|
|
103
|
+
return (req, res, next) => {
|
|
104
|
+
// Configuração mais robusta de CORS
|
|
105
|
+
const origin = req.headers.origin;
|
|
106
|
+
// Definir headers CORS
|
|
107
|
+
res.setHeader("Access-Control-Allow-Origin", allowOrigin === "*" ? "*" : origin || "*");
|
|
108
|
+
res.setHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
|
|
109
|
+
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Content-Length, Accept, Origin, X-Requested-With");
|
|
110
|
+
res.setHeader("Access-Control-Allow-Credentials", "true");
|
|
111
|
+
res.setHeader("Access-Control-Expose-Headers", "Content-Length, Content-Range");
|
|
112
|
+
// Responder a requisições OPTIONS
|
|
113
|
+
if (req.method === "OPTIONS") {
|
|
114
|
+
return res.status(200).end();
|
|
115
|
+
}
|
|
116
|
+
next();
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Middleware para analisar arquivos de uma solicitação.
|
|
121
|
+
* Os arquivos com suas informações são armazenados no objeto `req.files`, sua tipagem: `FileInfo[]`.
|
|
122
|
+
* Ao usar esse middleware, é necessário que o corpo da requisição seja um objeto `FormData`.
|
|
123
|
+
* Se caso o middleware não encontrar nenhum arquivo, ele irá lançar um erro.
|
|
124
|
+
*
|
|
125
|
+
* @example
|
|
126
|
+
* ```ts
|
|
127
|
+
* Router.middleware(Middleware.files()).handler(async (req, res) => {
|
|
128
|
+
* });
|
|
129
|
+
*
|
|
130
|
+
* Router.middleware(Middleware.files(Middleware.files('image/jpeg', 'image/png', 'application/pdf')).handler(async (req, res) => {
|
|
131
|
+
* });
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
const files = (...allowedMimes) => {
|
|
135
|
+
return (req, res, next) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
|
|
136
|
+
allowedMimes = allowedMimes.map((mime) => mime.trim().toLowerCase());
|
|
137
|
+
const rawBody = yield new Promise((resolve, reject) => {
|
|
138
|
+
const chunks = [];
|
|
139
|
+
req.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
|
|
140
|
+
req.on("end", () => resolve(Buffer.concat(chunks)));
|
|
141
|
+
req.on("error", reject);
|
|
142
|
+
});
|
|
143
|
+
if (!req.headers["content-type"] || !req.headers["content-type"].startsWith("multipart/form-data")) {
|
|
144
|
+
throw new HandleError.HandleError("Invalid content type", "BAD_REQUEST", 400);
|
|
145
|
+
}
|
|
146
|
+
const boundary = req.headers["content-type"].split("boundary=")[1];
|
|
147
|
+
const parts = rawBody.toString("binary").split(`--${boundary}`);
|
|
148
|
+
const files = [];
|
|
149
|
+
for (const part of parts) {
|
|
150
|
+
if (part.includes('filename="')) {
|
|
151
|
+
const [header, ...body] = part.split("\r\n\r\n");
|
|
152
|
+
const content = body.join("\r\n\r\n").trim();
|
|
153
|
+
const buffer = Buffer.from(content, "binary");
|
|
154
|
+
// Extrair nome do campo e nome do arquivo
|
|
155
|
+
const fieldnameMatch = header.match(/name="([^"]+)"/);
|
|
156
|
+
const filenameMatch = header.match(/filename="([^"]+)"/);
|
|
157
|
+
const mimetypeMatch = header.match(/Content-Type: ([^\r\n]+)/);
|
|
158
|
+
if (fieldnameMatch && filenameMatch && mimetypeMatch) {
|
|
159
|
+
const fieldname = fieldnameMatch[1];
|
|
160
|
+
const filename = filenameMatch[1];
|
|
161
|
+
const contentType = mimetypeMatch[1].trim().toLowerCase();
|
|
162
|
+
if (allowedMimes.length > 0 && !allowedMimes.includes(contentType)) {
|
|
163
|
+
continue;
|
|
164
|
+
}
|
|
165
|
+
files.push({
|
|
166
|
+
fieldname: fieldname,
|
|
167
|
+
originalname: filename,
|
|
168
|
+
encoding: "",
|
|
169
|
+
mimetype: contentType,
|
|
170
|
+
size: content.length,
|
|
171
|
+
stream: new stream.Readable(),
|
|
172
|
+
destination: "",
|
|
173
|
+
filename: filename,
|
|
174
|
+
path: "",
|
|
175
|
+
buffer: buffer.slice(0, -2),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
if (!files.length) {
|
|
181
|
+
throw new HandleError.HandleError("No files were uploaded", "BAD_REQUEST", 400);
|
|
182
|
+
}
|
|
183
|
+
req.file = files[0];
|
|
184
|
+
req.files = files;
|
|
185
|
+
next();
|
|
186
|
+
});
|
|
187
|
+
};
|
|
188
|
+
|
|
189
|
+
exports.cors = cors;
|
|
190
|
+
exports.files = files;
|
|
191
|
+
exports.json = json;
|
|
192
|
+
exports.raw = raw;
|
|
193
|
+
exports.text = text;
|
|
194
|
+
exports.urlencoded = urlencoded;
|
|
2
195
|
//# sourceMappingURL=Middlewares.js.map
|
package/dist/Middlewares.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Middlewares.js","sources":["../src/Middlewares.ts"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"Middlewares.js","sources":["../src/Middlewares.ts"],"sourcesContent":[null],"names":["__awaiter","HandleError","Readable"],"mappings":"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"}
|
package/dist/handler.esm.js
CHANGED
|
@@ -1,2 +1,171 @@
|
|
|
1
|
-
import{__rest
|
|
1
|
+
import { __rest } from './node_modules/tslib/tslib.es6.esm.js';
|
|
2
|
+
import { joinDocs, createDynamicMiddleware, joinObject } from './utils.esm.js';
|
|
3
|
+
import { RequestMiddleware } from './middleware.esm.js';
|
|
4
|
+
import { Router } from './router.esm.js';
|
|
5
|
+
import { uuidv4 } from '@ismael1361/utils';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Representa um construtor de rotas encadeável.
|
|
9
|
+
*
|
|
10
|
+
* Esta classe não deve ser instanciada diretamente. Em vez disso, uma instância é retornada
|
|
11
|
+
* quando você chama um método de rota como `.get()`, `.post()`, etc., em uma instância de `Router`.
|
|
12
|
+
*
|
|
13
|
+
* Ela permite encadear middlewares específicos para a rota e, finalmente, definir o manipulador
|
|
14
|
+
* da rota e sua documentação.
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* const router = create();
|
|
18
|
+
*
|
|
19
|
+
* // A chamada a `router.post()` retorna uma instância de RequestHandler.
|
|
20
|
+
* router.post('/users')
|
|
21
|
+
* // .middleware() aplica um middleware apenas a esta rota.
|
|
22
|
+
* .middleware(validationMiddleware)
|
|
23
|
+
* // .handler() define o controlador final da rota.
|
|
24
|
+
* .handler((req, res) => {
|
|
25
|
+
* res.status(201).json({ id: 1, ...req.body });
|
|
26
|
+
* })
|
|
27
|
+
* // .doc() anexa a documentação OpenAPI ao endpoint finalizado.
|
|
28
|
+
* .doc({
|
|
29
|
+
* summary: 'Cria um novo usuário',
|
|
30
|
+
* tags: ['Users'],
|
|
31
|
+
* body: { description: 'Dados do usuário' }
|
|
32
|
+
* });
|
|
33
|
+
*/
|
|
34
|
+
class RequestHandler extends RequestMiddleware {
|
|
35
|
+
/** @internal */
|
|
36
|
+
constructor(router, type, path, doc) {
|
|
37
|
+
super(undefined, router);
|
|
38
|
+
this.router = router;
|
|
39
|
+
this.type = type;
|
|
40
|
+
this.path = path;
|
|
41
|
+
this.doc = doc;
|
|
42
|
+
this.middlewares = [];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Anexa um middleware que será executado especificamente para esta rota.
|
|
46
|
+
* Múltiplos middlewares podem ser encadeados.
|
|
47
|
+
*
|
|
48
|
+
* @template Req - Tipo de Request estendido pelo middleware.
|
|
49
|
+
* @template Res - Tipo de Response estendido pelo middleware.
|
|
50
|
+
* @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função de middleware a ser aplicada.
|
|
51
|
+
* @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este middleware.
|
|
52
|
+
* @returns {RequestHandler<Rq & Req, Rs & Res>} A mesma instância de `RequestHandler` para permitir encadeamento.
|
|
53
|
+
*/
|
|
54
|
+
middleware(callback, doc) {
|
|
55
|
+
if (callback instanceof RequestMiddleware) {
|
|
56
|
+
callback.router.layers
|
|
57
|
+
.filter(({ type, handle }) => type === "middleware" && !!handle)
|
|
58
|
+
.map(({ handle }) => handle)
|
|
59
|
+
.forEach((handle) => this.middlewares.push(...handle));
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
this.middlewares.push(createDynamicMiddleware(callback));
|
|
63
|
+
}
|
|
64
|
+
if (doc) {
|
|
65
|
+
this.doc = joinDocs(this.doc || {}, doc);
|
|
66
|
+
}
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Define a função de manipulador (controller) final para a rota.
|
|
71
|
+
* Esta chamada finaliza a cadeia de middlewares e registra a rota no roteador.
|
|
72
|
+
*
|
|
73
|
+
* @template Req - Tipo de Request estendido pelo manipulador.
|
|
74
|
+
* @template Res - Tipo de Response estendido pelo manipulador.
|
|
75
|
+
* @param {HandlerCallback<Rq & Req, Rs & Res>} callback - A função que processará a requisição.
|
|
76
|
+
* @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este manipulador.
|
|
77
|
+
* @returns {RouterProps} Um objeto que contém as propriedades da rota e um método `.doc()` para adicionar a documentação final.
|
|
78
|
+
*/
|
|
79
|
+
handler(callback, doc) {
|
|
80
|
+
if (callback instanceof Handler) {
|
|
81
|
+
callback.router.layers
|
|
82
|
+
.filter(({ type, handle }) => type === "middleware" && !!handle)
|
|
83
|
+
.map(({ handle }) => handle)
|
|
84
|
+
.forEach((handle) => this.middlewares.push(...handle));
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
this.middlewares.push(createDynamicMiddleware(callback));
|
|
88
|
+
}
|
|
89
|
+
const route = this.router.layers[this.type](this.path, this.middlewares, joinDocs(this.doc || {}, doc || {}));
|
|
90
|
+
return {
|
|
91
|
+
type: this.type,
|
|
92
|
+
path: this.path,
|
|
93
|
+
middlewares: this.middlewares,
|
|
94
|
+
handler: this.middlewares.length > 0 ? this.middlewares[this.middlewares.length - 1] : undefined,
|
|
95
|
+
doc(operation, components = {}) {
|
|
96
|
+
const { components: comp = {} } = operation, op = __rest(operation, ["components"]);
|
|
97
|
+
route.doc = joinDocs(route.doc, Object.assign(Object.assign({}, op), { components: joinObject(comp, components) }));
|
|
98
|
+
return this;
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Cria um componente de manipulador (handler) reutilizável.
|
|
105
|
+
*
|
|
106
|
+
* Esta classe encapsula uma função de manipulador, permitindo que ela seja combinada
|
|
107
|
+
* com outros middlewares e reutilizada em diferentes rotas.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* // handler.ts
|
|
111
|
+
* export const getUserProfile = handler<{ user: { id: string } }>((req, res) => {
|
|
112
|
+
* res.json({ user: req.user });
|
|
113
|
+
* });
|
|
114
|
+
*
|
|
115
|
+
* // routes.ts
|
|
116
|
+
* router.get('/profile')
|
|
117
|
+
* .middleware(authMiddleware) // Adiciona `req.user`
|
|
118
|
+
* .handler(getUserProfile); // Reutiliza o handler
|
|
119
|
+
*/
|
|
120
|
+
class Handler {
|
|
121
|
+
/** @internal */
|
|
122
|
+
constructor(callback, router = new Router(), doc) {
|
|
123
|
+
this.router = router;
|
|
124
|
+
this.doc = doc;
|
|
125
|
+
if (callback) {
|
|
126
|
+
if (callback instanceof Handler) {
|
|
127
|
+
callback.router.layers.forEach((l) => {
|
|
128
|
+
this.router.layers.push(l);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
callback.id = callback.id || uuidv4("-");
|
|
133
|
+
callback.doc = joinDocs((callback === null || callback === void 0 ? void 0 : callback.doc) || {}, doc || {});
|
|
134
|
+
this.router.middleware(createDynamicMiddleware(callback));
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Executa a cadeia de middlewares e o manipulador final encapsulados por esta instância de `Handler`.
|
|
140
|
+
* Este método é útil para testes unitários ou para invocar programaticamente a lógica do handler
|
|
141
|
+
* fora do ciclo de requisição/resposta padrão do Express.
|
|
142
|
+
*
|
|
143
|
+
* @param {Rq} request - O objeto de requisição (ou um mock dele).
|
|
144
|
+
* @param {Rs} response - O objeto de resposta (ou um mock dele).
|
|
145
|
+
* @param {NextFunction} next - A função `next` a ser chamada ao final da cadeia.
|
|
146
|
+
* @returns {Promise<void>} Uma promessa que resolve quando a execução da cadeia é concluída.
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* import { handler, Request, Response, NextFunction } from '@ismael1361/router';
|
|
150
|
+
*
|
|
151
|
+
* // 1. Crie um handler reutilizável
|
|
152
|
+
* const myHandler = handler<{ user: { id: string } }>((req, res) => {
|
|
153
|
+
* res.json({ userId: req.user.id });
|
|
154
|
+
* });
|
|
155
|
+
*
|
|
156
|
+
* // 2. Crie mocks para os objetos de requisição e resposta (ex: com Jest)
|
|
157
|
+
* const mockRequest = { user: { id: '123' } } as Request & { user: { id: string } };
|
|
158
|
+
* const mockResponse = { json: (data) => console.log(data) } as Response;
|
|
159
|
+
* const mockNext = () => {};
|
|
160
|
+
*
|
|
161
|
+
* // 3. Execute o handler programaticamente
|
|
162
|
+
* await myHandler.execute(mockRequest, mockResponse, mockNext);
|
|
163
|
+
* // Output: { userId: '123' }
|
|
164
|
+
*/
|
|
165
|
+
execute(request, response, next) {
|
|
166
|
+
return this.router.executeMiddlewares(request, response, next);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export { Handler, RequestHandler };
|
|
2
171
|
//# sourceMappingURL=handler.esm.js.map
|
package/dist/handler.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.esm.js","sources":["../src/handler.ts"],"sourcesContent":[null],"names":[
|
|
1
|
+
{"version":3,"file":"handler.esm.js","sources":["../src/handler.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
package/dist/handler.js
CHANGED
|
@@ -1,2 +1,174 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tslib_es6 = require('./node_modules/tslib/tslib.es6.js');
|
|
4
|
+
var utils$1 = require('./utils.js');
|
|
5
|
+
var middleware = require('./middleware.js');
|
|
6
|
+
var router = require('./router.js');
|
|
7
|
+
var utils = require('@ismael1361/utils');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Representa um construtor de rotas encadeável.
|
|
11
|
+
*
|
|
12
|
+
* Esta classe não deve ser instanciada diretamente. Em vez disso, uma instância é retornada
|
|
13
|
+
* quando você chama um método de rota como `.get()`, `.post()`, etc., em uma instância de `Router`.
|
|
14
|
+
*
|
|
15
|
+
* Ela permite encadear middlewares específicos para a rota e, finalmente, definir o manipulador
|
|
16
|
+
* da rota e sua documentação.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* const router = create();
|
|
20
|
+
*
|
|
21
|
+
* // A chamada a `router.post()` retorna uma instância de RequestHandler.
|
|
22
|
+
* router.post('/users')
|
|
23
|
+
* // .middleware() aplica um middleware apenas a esta rota.
|
|
24
|
+
* .middleware(validationMiddleware)
|
|
25
|
+
* // .handler() define o controlador final da rota.
|
|
26
|
+
* .handler((req, res) => {
|
|
27
|
+
* res.status(201).json({ id: 1, ...req.body });
|
|
28
|
+
* })
|
|
29
|
+
* // .doc() anexa a documentação OpenAPI ao endpoint finalizado.
|
|
30
|
+
* .doc({
|
|
31
|
+
* summary: 'Cria um novo usuário',
|
|
32
|
+
* tags: ['Users'],
|
|
33
|
+
* body: { description: 'Dados do usuário' }
|
|
34
|
+
* });
|
|
35
|
+
*/
|
|
36
|
+
class RequestHandler extends middleware.RequestMiddleware {
|
|
37
|
+
/** @internal */
|
|
38
|
+
constructor(router, type, path, doc) {
|
|
39
|
+
super(undefined, router);
|
|
40
|
+
this.router = router;
|
|
41
|
+
this.type = type;
|
|
42
|
+
this.path = path;
|
|
43
|
+
this.doc = doc;
|
|
44
|
+
this.middlewares = [];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Anexa um middleware que será executado especificamente para esta rota.
|
|
48
|
+
* Múltiplos middlewares podem ser encadeados.
|
|
49
|
+
*
|
|
50
|
+
* @template Req - Tipo de Request estendido pelo middleware.
|
|
51
|
+
* @template Res - Tipo de Response estendido pelo middleware.
|
|
52
|
+
* @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função de middleware a ser aplicada.
|
|
53
|
+
* @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este middleware.
|
|
54
|
+
* @returns {RequestHandler<Rq & Req, Rs & Res>} A mesma instância de `RequestHandler` para permitir encadeamento.
|
|
55
|
+
*/
|
|
56
|
+
middleware(callback, doc) {
|
|
57
|
+
if (callback instanceof middleware.RequestMiddleware) {
|
|
58
|
+
callback.router.layers
|
|
59
|
+
.filter(({ type, handle }) => type === "middleware" && !!handle)
|
|
60
|
+
.map(({ handle }) => handle)
|
|
61
|
+
.forEach((handle) => this.middlewares.push(...handle));
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
this.middlewares.push(utils$1.createDynamicMiddleware(callback));
|
|
65
|
+
}
|
|
66
|
+
if (doc) {
|
|
67
|
+
this.doc = utils$1.joinDocs(this.doc || {}, doc);
|
|
68
|
+
}
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Define a função de manipulador (controller) final para a rota.
|
|
73
|
+
* Esta chamada finaliza a cadeia de middlewares e registra a rota no roteador.
|
|
74
|
+
*
|
|
75
|
+
* @template Req - Tipo de Request estendido pelo manipulador.
|
|
76
|
+
* @template Res - Tipo de Response estendido pelo manipulador.
|
|
77
|
+
* @param {HandlerCallback<Rq & Req, Rs & Res>} callback - A função que processará a requisição.
|
|
78
|
+
* @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este manipulador.
|
|
79
|
+
* @returns {RouterProps} Um objeto que contém as propriedades da rota e um método `.doc()` para adicionar a documentação final.
|
|
80
|
+
*/
|
|
81
|
+
handler(callback, doc) {
|
|
82
|
+
if (callback instanceof Handler) {
|
|
83
|
+
callback.router.layers
|
|
84
|
+
.filter(({ type, handle }) => type === "middleware" && !!handle)
|
|
85
|
+
.map(({ handle }) => handle)
|
|
86
|
+
.forEach((handle) => this.middlewares.push(...handle));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
this.middlewares.push(utils$1.createDynamicMiddleware(callback));
|
|
90
|
+
}
|
|
91
|
+
const route = this.router.layers[this.type](this.path, this.middlewares, utils$1.joinDocs(this.doc || {}, doc || {}));
|
|
92
|
+
return {
|
|
93
|
+
type: this.type,
|
|
94
|
+
path: this.path,
|
|
95
|
+
middlewares: this.middlewares,
|
|
96
|
+
handler: this.middlewares.length > 0 ? this.middlewares[this.middlewares.length - 1] : undefined,
|
|
97
|
+
doc(operation, components = {}) {
|
|
98
|
+
const { components: comp = {} } = operation, op = tslib_es6.__rest(operation, ["components"]);
|
|
99
|
+
route.doc = utils$1.joinDocs(route.doc, Object.assign(Object.assign({}, op), { components: utils$1.joinObject(comp, components) }));
|
|
100
|
+
return this;
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Cria um componente de manipulador (handler) reutilizável.
|
|
107
|
+
*
|
|
108
|
+
* Esta classe encapsula uma função de manipulador, permitindo que ela seja combinada
|
|
109
|
+
* com outros middlewares e reutilizada em diferentes rotas.
|
|
110
|
+
*
|
|
111
|
+
* @example
|
|
112
|
+
* // handler.ts
|
|
113
|
+
* export const getUserProfile = handler<{ user: { id: string } }>((req, res) => {
|
|
114
|
+
* res.json({ user: req.user });
|
|
115
|
+
* });
|
|
116
|
+
*
|
|
117
|
+
* // routes.ts
|
|
118
|
+
* router.get('/profile')
|
|
119
|
+
* .middleware(authMiddleware) // Adiciona `req.user`
|
|
120
|
+
* .handler(getUserProfile); // Reutiliza o handler
|
|
121
|
+
*/
|
|
122
|
+
class Handler {
|
|
123
|
+
/** @internal */
|
|
124
|
+
constructor(callback, router$1 = new router.Router(), doc) {
|
|
125
|
+
this.router = router$1;
|
|
126
|
+
this.doc = doc;
|
|
127
|
+
if (callback) {
|
|
128
|
+
if (callback instanceof Handler) {
|
|
129
|
+
callback.router.layers.forEach((l) => {
|
|
130
|
+
this.router.layers.push(l);
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
callback.id = callback.id || utils.uuidv4("-");
|
|
135
|
+
callback.doc = utils$1.joinDocs((callback === null || callback === void 0 ? void 0 : callback.doc) || {}, doc || {});
|
|
136
|
+
this.router.middleware(utils$1.createDynamicMiddleware(callback));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Executa a cadeia de middlewares e o manipulador final encapsulados por esta instância de `Handler`.
|
|
142
|
+
* Este método é útil para testes unitários ou para invocar programaticamente a lógica do handler
|
|
143
|
+
* fora do ciclo de requisição/resposta padrão do Express.
|
|
144
|
+
*
|
|
145
|
+
* @param {Rq} request - O objeto de requisição (ou um mock dele).
|
|
146
|
+
* @param {Rs} response - O objeto de resposta (ou um mock dele).
|
|
147
|
+
* @param {NextFunction} next - A função `next` a ser chamada ao final da cadeia.
|
|
148
|
+
* @returns {Promise<void>} Uma promessa que resolve quando a execução da cadeia é concluída.
|
|
149
|
+
*
|
|
150
|
+
* @example
|
|
151
|
+
* import { handler, Request, Response, NextFunction } from '@ismael1361/router';
|
|
152
|
+
*
|
|
153
|
+
* // 1. Crie um handler reutilizável
|
|
154
|
+
* const myHandler = handler<{ user: { id: string } }>((req, res) => {
|
|
155
|
+
* res.json({ userId: req.user.id });
|
|
156
|
+
* });
|
|
157
|
+
*
|
|
158
|
+
* // 2. Crie mocks para os objetos de requisição e resposta (ex: com Jest)
|
|
159
|
+
* const mockRequest = { user: { id: '123' } } as Request & { user: { id: string } };
|
|
160
|
+
* const mockResponse = { json: (data) => console.log(data) } as Response;
|
|
161
|
+
* const mockNext = () => {};
|
|
162
|
+
*
|
|
163
|
+
* // 3. Execute o handler programaticamente
|
|
164
|
+
* await myHandler.execute(mockRequest, mockResponse, mockNext);
|
|
165
|
+
* // Output: { userId: '123' }
|
|
166
|
+
*/
|
|
167
|
+
execute(request, response, next) {
|
|
168
|
+
return this.router.executeMiddlewares(request, response, next);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
exports.Handler = Handler;
|
|
173
|
+
exports.RequestHandler = RequestHandler;
|
|
2
174
|
//# sourceMappingURL=handler.js.map
|
package/dist/handler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sources":["../src/handler.ts"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"handler.js","sources":["../src/handler.ts"],"sourcesContent":[null],"names":["RequestMiddleware","createDynamicMiddleware","joinDocs","__rest","joinObject","router","Router","uuidv4"],"mappings":"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"}
|