@ismael1361/router 1.0.1 → 1.0.5

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/router.d.ts CHANGED
@@ -1,236 +1,179 @@
1
1
  import type swaggerJSDoc from "swagger-jsdoc";
2
- import { ExpressRouter, HandlerFC, MiddlewareFC, RouterMethods, Request, Response } from "./type";
3
- import { RequestHandler, PreparedHandler } from "./handler";
2
+ import type { MiddlewareCallback, MiddlewareFCDoc, Request, Response, SwaggerOptions } from "./type";
3
+ import { Handler, RequestHandler } from "./handler";
4
+ import { Layer } from "./Layer";
5
+ import * as http from "http";
6
+ import { Express } from "express";
4
7
  /**
5
- * A classe `Router` é um wrapper em torno do roteador do Express, oferecendo uma API fluente
6
- * e encadeável para a definição de rotas. Ela aprimora a experiência de desenvolvimento com
7
- * segurança de tipos e geração de documentação OpenAPI/Swagger integrada.
8
+ * A classe principal do roteador, que encapsula e aprimora o roteador do Express.
9
+ * Fornece uma API fluente e fortemente tipada para definir rotas, aplicar middlewares
10
+ * e gerar documentação OpenAPI (Swagger/ReDoc) de forma integrada.
8
11
  *
9
- * @template Rq - O tipo base para o objeto de requisição (request) em todas as rotas deste roteador.
10
- * @template Rs - O tipo base para o objeto de resposta (response) em todas as rotas.
12
+ * @template Rq - O tipo base de `Request` para este roteador.
13
+ * @template Rs - O tipo base de `Response` para este roteador.
11
14
  *
12
15
  * @example
13
- * import express, { Request, Response } from "express";
14
- * import { Router } from "./router"; // Ajuste o caminho do import conforme sua estrutura.
15
- * import swaggerUi from "swagger-ui-express";
16
+ * import { create, Middlewares } from '@ismael1361/router';
16
17
  *
17
- * // 1. Crie uma nova instância do Router.
18
- * const userRouter = new Router();
18
+ * const app = create();
19
+ * app.middleware(Middlewares.json());
19
20
  *
20
- * // 2. Defina uma rota com um manipulador e documentação.
21
- * userRouter
22
- * .get("/:id")
23
- * .handler((req: Request<{ id: string }>, res: Response) => {
24
- * const { id } = req.params;
25
- * res.json({ id: Number(id), name: "John Doe" });
26
- * })
27
- * .doc({
28
- * summary: "Obter um usuário pelo ID",
29
- * tags: ["Usuários"],
30
- * parameters: [
31
- * {
32
- * name: "id",
33
- * in: "path",
34
- * required: true,
35
- * description: "O ID do usuário",
36
- * schema: { type: "integer" },
37
- * },
38
- * ],
39
- * responses: {
40
- * "200": {
41
- * description: "Detalhes do usuário.",
42
- * content: {
43
- * "application/json": {
44
- * schema: {
45
- * type: "object",
46
- * properties: {
47
- * id: { type: "integer" },
48
- * name: { type: "string" },
49
- * },
50
- * },
51
- * },
52
- * },
53
- * },
54
- * "404": {
55
- * description: "Usuário não encontrado",
56
- * }
57
- * },
21
+ * app.get('/health', { summary: 'Verifica a saúde da API' })
22
+ * .handler((req, res) => {
23
+ * res.status(200).send('OK');
58
24
  * });
59
25
  *
60
- * // 3. Crie um aplicativo Express e use o roteador.
61
- * const app = express();
62
- * app.use(express.json());
63
- *
64
- * // A propriedade `.router` contém a instância do roteador Express, pronta para ser usada.
65
- * app.use("/users", userRouter.router);
66
- *
67
- * // 4. (Opcional) Gere e sirva a documentação Swagger.
68
- * const swaggerOptions = userRouter.getSwagger({
69
- * openapi: "3.0.0",
70
- * info: {
71
- * title: "API de Usuários",
72
- * version: "1.0.0",
73
- * },
74
- * });
75
- * app.use("/api-docs", swaggerUi.serve, swaggerUi.setup(swaggerOptions));
76
- *
77
26
  * app.listen(3000, () => {
78
- * console.log("Servidor rodando em http://localhost:3000");
79
- * console.log("Documentação da API em http://localhost:3000/api-docs");
27
+ * console.log('Servidor rodando na porta 3000');
80
28
  * });
81
29
  */
82
30
  export declare class Router<Rq extends Request = Request, Rs extends Response = Response> {
83
- readonly middlewares: MiddlewareFC<any, any>[];
84
- readonly router: ExpressRouter;
85
- readonly rootPath: string;
86
- readonly previousRouter?: Router | undefined;
87
- constructor(middlewares?: MiddlewareFC<any, any>[], router?: ExpressRouter, rootPath?: string, previousRouter?: Router | undefined);
31
+ readonly routePath: string;
32
+ readonly layers: Layer;
33
+ /** A instância subjacente do Express. */
34
+ app: Express;
35
+ private express_router;
88
36
  /**
89
- * Adiciona um middleware que será aplicado a todas as rotas definidas subsequentemente
90
- * nesta cadeia de roteamento.
91
- *
92
- * Este método é imutável: ele retorna uma **nova instância** do `Router` com o middleware
93
- * adicionado, permitindo o encadeamento seguro e a composição de diferentes conjuntos de middlewares.
94
- * A tipagem dos objetos `Request` e `Response` é aprimorada para refletir as modificações
95
- * feitas pelo middleware.
96
- *
97
- * @template Req - O tipo de `Request` que o middleware adiciona ou modifica.
98
- * @template Res - O tipo de `Response` que o middleware adiciona ou modifica.
37
+ * @internal
38
+ * @param {string} [routePath=""] - O prefixo de caminho para este roteador.
39
+ * @param {Layer} [layers=new Layer()] - A camada interna para gerenciar rotas e middlewares.
40
+ */
41
+ constructor(routePath?: string, layers?: Layer);
42
+ /**
43
+ * Anexa documentação OpenAPI a um grupo de rotas (um roteador).
44
+ * Útil para definir informações comuns, como tags, para um conjunto de rotas.
99
45
  *
100
- * @param {MiddlewareFC<Rq & Req, Rs & Res>} callback - A função de middleware a ser adicionada.
101
- * Esta função pode modificar os objetos `req` e `res`, e suas tipagens serão propagadas
102
- * para os manipuladores de rota subsequentes.
46
+ * @param {swaggerJSDoc.Operation} operation - O objeto de operação OpenAPI.
47
+ * @param {swaggerJSDoc.Components} [components={}] - Componentes OpenAPI.
48
+ */
49
+ doc(operation: swaggerJSDoc.Operation, components?: swaggerJSDoc.Components): void;
50
+ /**
51
+ * Aplica um middleware a todas as rotas subsequentes definidas neste roteador.
103
52
  *
104
- * @returns {Router<Rq & Req, Rs & Res>} Uma nova instância do `Router` com o middleware
105
- * e os tipos de requisição/resposta atualizados.
53
+ * @template Req - Tipo de `Request` estendido pelo middleware.
54
+ * @template Res - Tipo de `Response` estendido pelo middleware.
55
+ * @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função ou componente de middleware.
56
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este middleware.
57
+ * @returns {Router<Rq & Req, Rs & Res>} A instância do roteador com os tipos atualizados.
58
+ */
59
+ middleware<Req extends Request = Request, Res extends Response = Response>(callback: MiddlewareCallback<Rq & Req, Rs & Res>, doc?: MiddlewareFCDoc): Router<Rq & Req, Rs & Res>;
60
+ /**
61
+ * Cria um componente de manipulador (handler) reutilizável.
62
+ * Este método é um atalho para a função `handler` exportada, permitindo criar
63
+ * um manipulador completo e reutilizável que pode encapsular uma ou mais funções de middleware
64
+ * e um manipulador final.
106
65
  *
107
66
  * @example
108
- * import { Router } from "./router";
109
- * import { Request, Response, NextFunction } from "express";
110
- *
111
- * // Middleware de autenticação que adiciona 'user' ao objeto de requisição.
112
- * interface AuthenticatedRequest {
113
- * user: { id: number; name: string };
114
- * }
115
- *
116
- * const authMiddleware = (req: Request, res: Response, next: NextFunction) => {
117
- * // Em um cenário real, você validaria um token aqui.
118
- * (req as Request & AuthenticatedRequest).user = { id: 1, name: "Admin" };
119
- * next();
120
- * };
121
- *
122
- * const baseRouter = new Router();
123
- * const authenticatedRouter = baseRouter.middleware<AuthenticatedRequest>(authMiddleware);
124
- *
125
- * authenticatedRouter.get("/profile").handler((req, res) => {
126
- * // `req.user` está disponível e corretamente tipado.
127
- * res.json({ message: `Bem-vindo, ${req.user.name}!` });
128
- * });
67
+ * // Crie um manipulador reutilizável que primeiro executa um middleware e depois a lógica principal.
68
+ * const processDataHandler = app.handler(
69
+ * middleware(dataValidationMiddleware)
70
+ * .handler((req, res) => {
71
+ * // A lógica principal do handler aqui.
72
+ * res.json({ processedData: req.validatedData });
73
+ * })
74
+ * );
75
+ *
76
+ * // Use o manipulador reutilizável em uma rota.
77
+ * app.post('/process', { summary: 'Processar dados' })
78
+ * .handler(processDataHandler);
79
+ *
80
+ * @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função ou componente de middleware/handler.
81
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este manipulador.
82
+ * @returns {Handler<Rq & Req, Rs & Res>} Uma instância de `Handler` que pode ser usada em rotas.
129
83
  */
130
- middleware<Req extends Request = Request, Res extends Response = Response>(callback: MiddlewareFC<Rq & Req, Rs & Res>): Router<Rq & Req, Rs & Res>;
84
+ handler<Req extends Request = Request, Res extends Response = Response>(callback: MiddlewareCallback<Rq & Req, Rs & Res>, doc?: MiddlewareFCDoc): Handler<Rq & Req, Rs & Res>;
131
85
  /**
132
- * Encapsula uma função de handler final e todos os middlewares encadeados anteriormente
133
- * em uma única instância reutilizável de `PreparedHandler`.
134
- *
135
- * Este método é o ponto final para a criação de "controllers" ou "actions" modulares.
136
- * Ele pega a lógica do handler e a combina com os middlewares definidos na cadeia do roteador
137
- * (`.middleware(...)`), produzindo um objeto que pode ser passado para o método `.handler()`
138
- * de uma definição de rota (por exemplo, `router.get(...).handler(controller)`).
139
- *
140
- * @template Req - Tipos de requisição adicionais inferidos a partir do handler.
141
- * @template Res - Tipos de resposta adicionais inferidos a partir do handler.
142
- * @param {HandlerFC<Rq & Req, Rs & Res>} callback - A função de handler final ou uma instância de `PreparedHandler` já existente. Se um `PreparedHandler` for fornecido, seus middlewares serão combinados com os middlewares da cadeia atual.
143
- * @returns {PreparedHandler<Rq & Req, Rs & Res>} Uma nova instância de `PreparedHandler` que encapsula o handler e a cadeia completa de middlewares.
86
+ * Inicia a definição de uma rota para o método HTTP GET.
144
87
  *
145
88
  * @example
146
- * // 1. Defina middlewares para autenticação e autorização.
147
- * interface AuthRequest extends Request { user: { id: number; role: string }; }
148
- * const authMiddleware: MiddlewareFC<AuthRequest> = (req, res, next) => {
149
- * req.user = { id: 1, role: 'admin' }; // Simula a autenticação
150
- * next();
151
- * };
152
- *
153
- * const adminOnlyMiddleware: MiddlewareFC<AuthRequest> = (req, res, next) => {
154
- * if (req.user.role !== 'admin') return res.status(403).send('Forbidden');
155
- * next();
156
- * };
157
- *
158
- * // 2. Defina o handler final que depende dos middlewares.
159
- * const getDashboard: HandlerFC<AuthRequest> = (req, res) => {
160
- * res.send(`Welcome, admin user ${req.user.id}`);
161
- * };
162
- *
163
- * // 3. Crie um "construtor" de controller encadeando os middlewares.
164
- * const controllerBuilder = new Router().middleware(authMiddleware).middleware(adminOnlyMiddleware);
165
- *
166
- * // 4. Use o método `.handler()` para criar o controller reutilizável.
167
- * const getDashboardController = controllerBuilder.handler(getDashboard);
89
+ * router.get('/users/:id', { summary: 'Obter um usuário' })
90
+ * .handler((req, res) => {
91
+ * // req.params.id está disponível
92
+ * res.json({ id: req.params.id, name: 'John Doe' });
93
+ * });
168
94
  *
169
- * // 5. Agora, `getDashboardController` pode ser usado em qualquer rota.
170
- * const mainRouter = new Router();
171
- * mainRouter.get('/admin/dashboard').handler(getDashboardController);
172
- * // A rota acima aplicará automaticamente `authMiddleware` e `adminOnlyMiddleware`
173
- * // antes de executar `getDashboard`.
174
- */
175
- handler<Req extends Request = Request, Res extends Response = Response>(callback: HandlerFC<Rq & Req, Rs & Res>): PreparedHandler<Rq & Req, Rs & Res>;
176
- /**
177
- * Cria um manipulador de rota para requisições GET.
178
- * @param {string} path O caminho da rota.
95
+ * @param {string} path - O caminho da rota (ex: '/users', '/users/:id').
96
+ * @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
179
97
  * @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
180
98
  */
181
- get(path: string): RequestHandler<Rq, Rs>;
99
+ get(path: string, doc?: MiddlewareFCDoc): RequestHandler<Rq, Rs>;
182
100
  /**
183
- * Cria um manipulador de rota para requisições POST.
184
- * @param {string} path O caminho da rota.
101
+ * Inicia a definição de uma rota para o método HTTP POST.
102
+ *
103
+ * @example
104
+ * router.post('/users', { summary: 'Criar um usuário' })
105
+ * .handler((req, res) => {
106
+ * const newUser = req.body;
107
+ * res.status(201).json({ id: 'new-id', ...newUser });
108
+ * });
109
+ *
110
+ * @param {string} path - O caminho da rota.
111
+ * @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
185
112
  * @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
186
113
  */
187
- post(path: string): RequestHandler<Rq, Rs>;
114
+ post(path: string, doc?: MiddlewareFCDoc): RequestHandler<Rq, Rs>;
188
115
  /**
189
- * Cria um manipulador de rota para requisições PUT.
190
- * @param {string} path O caminho da rota.
116
+ * Inicia a definição de uma rota para o método HTTP PUT.
117
+ * @param {string} path - O caminho da rota.
118
+ * @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
191
119
  * @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
192
120
  */
193
- put(path: string): RequestHandler<Rq, Rs>;
121
+ put(path: string, doc?: MiddlewareFCDoc): RequestHandler<Rq, Rs>;
194
122
  /**
195
- * Cria um manipulador de rota para requisições DELETE.
196
- * @param {string} path O caminho da rota.
123
+ * Inicia a definição de uma rota para o método HTTP DELETE.
124
+ * @param {string} path - O caminho da rota.
125
+ * @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
197
126
  * @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
198
127
  */
199
- delete(path: string): RequestHandler<Rq, Rs>;
128
+ delete(path: string, doc?: MiddlewareFCDoc): RequestHandler<Rq, Rs>;
200
129
  /**
201
- * Cria um manipulador de rota para requisições PATCH.
202
- * @param {string} path O caminho da rota.
130
+ * Inicia a definição de uma rota para o método HTTP PATCH.
131
+ * @param {string} path - O caminho da rota.
132
+ * @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
203
133
  * @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
204
134
  */
205
- patch(path: string): RequestHandler<Rq, Rs>;
135
+ patch(path: string, doc?: MiddlewareFCDoc): RequestHandler<Rq, Rs>;
206
136
  /**
207
- * Cria um manipulador de rota para requisições OPTIONS.
208
- * @param {string} path O caminho da rota.
137
+ * Inicia a definição de uma rota para o método HTTP OPTIONS.
138
+ * @param {string} path - O caminho da rota.
139
+ * @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
209
140
  * @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
210
141
  */
211
- options(path: string): RequestHandler<Rq, Rs>;
142
+ options(path: string, doc?: MiddlewareFCDoc): RequestHandler<Rq, Rs>;
212
143
  /**
213
- * Cria um manipulador de rota para requisições HEAD.
214
- * @param {string} path O caminho da rota.
144
+ * Inicia a definição de uma rota para o método HTTP HEAD.
145
+ * @param {string} path - O caminho da rota.
146
+ * @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
215
147
  * @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
216
148
  */
217
- head(path: string): RequestHandler<Rq, Rs>;
149
+ head(path: string, doc?: MiddlewareFCDoc): RequestHandler<Rq, Rs>;
218
150
  /**
219
- * Aplica um middleware a um caminho específico. Corresponde a todos os métodos HTTP.
220
- * @param {string} path O caminho da rota.
151
+ * Inicia a definição de uma rota que corresponde a todos os métodos HTTP.
152
+ * @param {string} path - O caminho da rota.
153
+ * @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
221
154
  * @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
222
155
  */
223
- all(path: string): RequestHandler<Rq, Rs>;
156
+ all(path: string, doc?: MiddlewareFCDoc): RequestHandler<Rq, Rs>;
224
157
  /**
225
- * Aplica um middleware a um caminho específico. Corresponde a todos os métodos HTTP.
226
- * @param {string} path O caminho da rota.
158
+ * Aplica um middleware a um caminho específico, correspondendo a todos os métodos HTTP.
159
+ *
160
+ * @example
161
+ * // Aplica um middleware de log para todas as rotas sob /api
162
+ * router.use('/api', { tags: ['Logging'] })
163
+ * .handler((req, res, next) => {
164
+ * console.log('API call:', req.method, req.path);
165
+ * next();
166
+ * });
167
+ *
168
+ * @param {string} path - O caminho da rota.
169
+ * @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
227
170
  * @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
228
171
  */
229
- use(path: string): RequestHandler<Rq, Rs>;
172
+ use(path?: string, doc?: MiddlewareFCDoc): RequestHandler<Rq, Rs>;
230
173
  /**
231
- * Obtém uma lista de todas as rotas e middlewares registrados nesta instância do roteador.
232
- * Útil para introspecção e depuração.
233
- * @returns {Array<{path: string, methods: string[], type: 'ROUTE' | 'MIDDLEWARE', swagger?: object}>}
174
+ * Retorna uma lista achatada de todas as rotas finais registradas,
175
+ * com middlewares e caminhos resolvidos. Útil para depuração.
176
+ * @returns {Array<object>} Uma lista de objetos de rota.
234
177
  */
235
178
  get routes(): {
236
179
  path: string;
@@ -239,180 +182,86 @@ export declare class Router<Rq extends Request = Request, Rs extends Response =
239
182
  swagger?: Pick<swaggerJSDoc.OAS3Definition, "paths" | "components">;
240
183
  }[];
241
184
  /**
242
- * Agrega toda a documentação de rota (definida via `.doc()`) e de middlewares
243
- * para gerar uma especificação completa do OpenAPI v3.
244
- *
245
- * Este método percorre todas as rotas registradas, coleta suas definições de OpenAPI
246
- * e as mescla em um único objeto de especificação, que pode ser usado diretamente
247
- * com ferramentas como `swagger-ui-express`.
248
- *
249
- * @param {swaggerJSDoc.OAS3Definition} [options] - Um objeto de definição base do OpenAPI.
250
- * Use-o para fornecer informações globais como `info`, `servers`, `security`, etc.
251
- * A documentação gerada (`paths`, `components`) será mesclada a este objeto.
252
- *
253
- * @param {swaggerJSDoc.Responses} [defaultResponses={}] - Um objeto contendo respostas padrão
254
- * (por exemplo, `400`, `401`, `500`) que serão adicionadas a **todas** as rotas.
255
- * Se uma rota definir uma resposta com o mesmo código de status, a definição da rota
256
- * terá precedência.
257
- *
258
- * @returns {swaggerJSDoc.Options} Um objeto de opções completo, pronto para ser usado
259
- * pelo `swagger-jsdoc` ou `swagger-ui-express`.
260
- *
261
- * @example
262
- * import express from "express";
263
- * import swaggerUi from "swagger-ui-express";
264
- * import { Router } from "./router";
265
- *
266
- * const apiRouter = new Router();
267
- *
268
- * apiRouter.get("/health")
269
- * .handler((req, res) => res.send("OK"))
270
- * .doc({
271
- * summary: "Verifica a saúde da API",
272
- * tags: ["Status"],
273
- * responses: { "200": { description: "API está operacional" } }
274
- * });
275
- *
276
- * // Definições base para o Swagger
277
- * const swaggerDefinition = {
278
- * openapi: "3.0.0",
279
- * info: { title: "Minha API", version: "1.0.0" },
280
- * servers: [{ url: "http://localhost:3000" }],
281
- * };
282
- *
283
- * // Respostas padrão para todas as rotas
284
- * const defaultResponses = {
285
- * "400": { description: "Requisição inválida" },
286
- * "500": { description: "Erro interno do servidor" },
287
- * };
288
- *
289
- * // Gera as opções do Swagger
290
- * const swaggerOptions = apiRouter.getSwagger(swaggerDefinition, defaultResponses);
291
- *
292
- * // Integra com o Express
293
- * const app = express();
294
- * app.use('/api', apiRouter.router);
295
- * app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerOptions));
296
- *
297
- * app.listen(3000);
185
+ * Gera a especificação OpenAPI completa com base na documentação definida.
186
+ * @param {swaggerJSDoc.OAS3Definition} [options] - Opções de base para a definição OpenAPI.
187
+ * @param {swaggerJSDoc.Responses} [defaultResponses={}] - Respostas padrão a serem mescladas em todas as rotas.
188
+ * @returns {swaggerJSDoc.Options} O objeto de opções pronto para ser usado por `swagger-jsdoc`.
298
189
  */
299
190
  getSwagger(options?: swaggerJSDoc.OAS3Definition, defaultResponses?: swaggerJSDoc.Responses): swaggerJSDoc.Options;
300
191
  /**
301
- * Cria e retorna um novo sub-roteador que é montado em um prefixo de caminho específico.
302
- *
303
- * Este método é ideal para organizar rotas relacionadas em módulos. Todas as rotas
304
- * definidas no roteador retornado serão prefixadas com o `path` fornecido.
305
- * A nova instância do roteador herda os middlewares do roteador pai.
306
- *
307
- * @param {string} path - O prefixo do caminho para o sub-roteador.
308
- * @returns {Router<Rq, Rs>} Uma nova instância de `Router` para definir rotas dentro do caminho especificado.
192
+ * Define as opções globais de documentação OpenAPI para este roteador.
309
193
  *
310
194
  * @example
311
- * import { Router } from "./router";
312
- * import express from "express";
313
- *
314
- * const app = express();
315
- * const mainRouter = new Router();
316
- *
317
- * // Cria um sub-roteador para a seção de administração.
318
- * const adminRouter = mainRouter.route("/admin");
319
- *
320
- * // Adiciona uma rota ao sub-roteador. O caminho final será "/admin/dashboard".
321
- * adminRouter.get("/dashboard").handler((req, res) => {
322
- * res.send("Bem-vindo ao painel de administração!");
195
+ * app.defineSwagger({
196
+ * openapi: '3.0.0',
197
+ * info: { title: 'Minha API', version: '1.0.0' },
198
+ * path: '/api-docs', // Caminho base para as UIs de documentação
199
+ * defaultResponses: {
200
+ * 500: { description: 'Erro Interno do Servidor' }
201
+ * }
323
202
  * });
324
203
  *
325
- * // Usa o roteador principal no aplicativo Express.
326
- * app.use(mainRouter.router);
204
+ * @param {SwaggerOptions} options - As opções de configuração.
327
205
  */
328
- route(path: string): Router<Rq, Rs>;
206
+ defineSwagger(options: SwaggerOptions): void;
329
207
  /**
330
- * Monta um sub-roteador no caminho base da instância atual do roteador.
331
- *
332
- * Este método permite compor a aplicação anexando um roteador pré-configurado
333
- * (seja uma instância de `Router` ou `express.Router`) como um middleware.
334
- * Todas as rotas definidas no roteador fornecido serão acessíveis a partir do
335
- * ponto de montagem do roteador atual.
336
- *
337
- * @param {Router | ExpressRouter} router - A instância do roteador a ser montada.
338
- * @returns {this} A instância atual do `Router`, permitindo encadeamento de métodos.
208
+ * Cria um sub-roteador aninhado sob um prefixo de caminho.
339
209
  *
340
210
  * @example
341
- * // ---- user.routes.ts ----
342
- * import { Router } from './router';
211
+ * const adminRouter = router.route('/admin');
212
+ * adminRouter.get('/dashboard', ...); // Rota final: /admin/dashboard
343
213
  *
344
- * const userRouter = new Router();
345
- * userRouter.get('/', (req, res) => res.send('Lista de usuários'));
346
- * userRouter.get('/:id', (req, res) => res.send(`Detalhes do usuário ${req.params.id}`));
347
- *
348
- * export default userRouter;
349
- *
350
- * // ---- app.ts ----
351
- * import express from 'express';
352
- * import { Router } from './router';
353
- * import userRouter from './user.routes';
214
+ * @param {string} path - O prefixo do caminho para o sub-roteador.
215
+ * @returns {Router<Rq, Rs>} Uma nova instância de `Router` para o sub-roteador.
216
+ */
217
+ route(path?: string): Router<Rq, Rs>;
218
+ /**
219
+ * Anexa um roteador existente (sub-roteador) a este roteador.
354
220
  *
355
- * const app = express();
356
- * const apiRouter = new Router();
221
+ * @example
222
+ * const usersRouter = route('/users');
223
+ * // ... define rotas em usersRouter ...
357
224
  *
358
- * // Monta o userRouter no apiRouter.
359
- * apiRouter.by(userRouter);
225
+ * const app = create();
226
+ * app.by(usersRouter); // Anexa o roteador de usuários ao principal
360
227
  *
361
- * // Usa o roteador principal na aplicação sob o prefixo '/api'.
362
- * // As rotas de userRouter agora são acessíveis em '/api/' e '/api/:id'.
363
- * app.use('/api', apiRouter.router);
364
- */
365
- by(router: Router | ExpressRouter): this;
366
- }
367
- /**
368
- * Representa as propriedades de uma rota finalizada, permitindo a adição de metadados, como a documentação Swagger.
369
- * Esta classe é retornada pelo método `.handler()` e seu principal objetivo é fornecer o método `.doc()`
370
- * para anexar a documentação OpenAPI a um endpoint.
371
- *
372
- * @example
373
- * // ... continuação do exemplo do RouterContext
374
- * router.get("/users/:id")
375
- * .handler((req, res) => {
376
- * res.json({ id: req.params.id, name: "Exemplo" });
377
- * })
378
- * // O método .doc() é chamado na instância de RouterProps retornada por .handler()
379
- * .doc({
380
- * summary: "Obtém um usuário pelo ID",
381
- * description: "Retorna os detalhes de um usuário específico.",
382
- * tags: ["Users"],
383
- * parameters: [{
384
- * name: "id",
385
- * in: "path",
386
- * required: true,
387
- * schema: { type: "integer" }
388
- * }],
389
- * responses: {
390
- * "200": {
391
- * description: "Usuário encontrado."
392
- * }
393
- * }
394
- * });
395
- */
396
- export declare class RouterProps {
397
- readonly type: RouterMethods;
398
- readonly middlewares: MiddlewareFC<any, any>[];
399
- readonly handler: Function;
400
- readonly hierarchicalMiddleware: MiddlewareFC<any, any>[];
401
- /**
402
- * @param {RouterMethods} type O método HTTP da rota.
403
- * @param {MiddlewareFC<any, any>[]} middlewares A lista de middlewares aplicados à rota.
404
- * @param {Function} handler A função de handler final da rota.
228
+ * @param {Router} router - A instância do roteador a ser anexada.
229
+ * @returns {this} A instância atual do roteador para encadeamento.
405
230
  */
406
- constructor(type: RouterMethods, middlewares: MiddlewareFC<any, any>[] | undefined, handler: Function, hierarchicalMiddleware?: MiddlewareFC<any, any>[]);
231
+ by(router: Router): this;
232
+ /** Delega para o método `app.engine()` do Express. */
233
+ engine(ext: string, fn: (path: string, options: object, callback: (e: any, rendered?: string) => void) => void): this;
234
+ enabled(setting: string): boolean;
235
+ /** Delega para o método `app.disabled()` do Express. */
236
+ disabled(setting: string): boolean;
237
+ /** Delega para o método `app.enable()` do Express. */
238
+ enable(setting: string): this;
239
+ /** Delega para o método `app.disable()` do Express. */
240
+ disable(setting: string): this;
407
241
  /**
408
- * Anexa a documentação Swagger/OpenAPI a uma rota.
409
- * Esta função mescla a documentação fornecida com qualquer documentação
410
- * definida nos middlewares (`middleware.doc`) que foram aplicados à rota.
242
+ * Inicia o servidor HTTP.
243
+ * Este método deve ser chamado por último, após todas as rotas e middlewares terem sido definidos.
244
+ * Ele compila todas as camadas de rotas, configura os endpoints de documentação (se definidos)
245
+ * e inicia o servidor Express para ouvir as requisições.
246
+ *
247
+ * @example
248
+ * app.listen(3000, () => {
249
+ * console.log('Servidor rodando em http://localhost:3000');
250
+ * console.log('Documentação Swagger em http://localhost:3000/api-docs/swagger');
251
+ * console.log('Documentação ReDoc em http://localhost:3000/api-docs/redoc');
252
+ * });
411
253
  *
412
- * @param {swaggerJSDoc.Operation} operation O objeto de operação do OpenAPI que descreve o endpoint.
413
- * @param {swaggerJSDoc.Components} [components={}] Definições de componentes reutilizáveis (schemas, securitySchemes, etc.).
414
- * @returns {this} Retorna a própria instância de `RouterProps` para permitir encadeamento futuro (se houver).
254
+ * @param {number} port - A porta em que o servidor irá ouvir.
255
+ * @param {string} [hostname] - O nome do host.
256
+ * @param {number} [backlog] - O número máximo de conexões pendentes.
257
+ * @param {Function} [callback] - Uma função a ser chamada quando o servidor estiver ouvindo.
258
+ * @returns {http.Server} A instância do servidor HTTP subjacente.
415
259
  */
416
- doc(operation: swaggerJSDoc.Operation, components?: swaggerJSDoc.Components): this;
260
+ listen(port: number, hostname: string, backlog: number, callback?: (error?: Error) => void): http.Server;
261
+ listen(port: number, hostname: string, callback?: (error?: Error) => void): http.Server;
262
+ listen(port: number, callback?: (error?: Error) => void): http.Server;
263
+ listen(callback?: (error?: Error) => void): http.Server;
264
+ listen(path: string, callback?: (error?: Error) => void): http.Server;
265
+ listen(handle: any, listeningListener?: (error?: Error) => void): http.Server;
417
266
  }
418
267
  //# sourceMappingURL=router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../src/router.ts"],"names":[],"mappings":"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"}