@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/router.js
CHANGED
|
@@ -1,2 +1,439 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var tslib_es6 = require('./node_modules/tslib/tslib.es6.js');
|
|
4
|
+
var swaggerJSDoc = require('swagger-jsdoc');
|
|
5
|
+
var handler = require('./handler.js');
|
|
6
|
+
var utils = require('./utils.js');
|
|
7
|
+
var Layer = require('./Layer.js');
|
|
8
|
+
var express = require('express');
|
|
9
|
+
var swaggerUi = require('swagger-ui-express');
|
|
10
|
+
var index$1 = require('./redocUi/index.js');
|
|
11
|
+
var middleware = require('./middleware.js');
|
|
12
|
+
var HandleError = require('./HandleError.js');
|
|
13
|
+
var index = require('./swagger-markdown/index.js');
|
|
14
|
+
var path = require('path');
|
|
15
|
+
var utils$1 = require('@ismael1361/utils');
|
|
16
|
+
var OpenAPISnippet = require('openapi-snippet');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* A classe principal do roteador, que encapsula e aprimora o roteador do Express.
|
|
20
|
+
* Fornece uma API fluente e fortemente tipada para definir rotas, aplicar middlewares
|
|
21
|
+
* e gerar documentação OpenAPI (Swagger/ReDoc) de forma integrada.
|
|
22
|
+
*
|
|
23
|
+
* @template Rq - O tipo base de `Request` para este roteador.
|
|
24
|
+
* @template Rs - O tipo base de `Response` para este roteador.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* import { create, Middlewares } from '@ismael1361/router';
|
|
28
|
+
*
|
|
29
|
+
* const app = create();
|
|
30
|
+
* app.middleware(Middlewares.json());
|
|
31
|
+
*
|
|
32
|
+
* app.get('/health', { summary: 'Verifica a saúde da API' })
|
|
33
|
+
* .handler((req, res) => {
|
|
34
|
+
* res.status(200).send('OK');
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* app.listen(3000, () => {
|
|
38
|
+
* console.log('Servidor rodando na porta 3000');
|
|
39
|
+
* });
|
|
40
|
+
*/
|
|
41
|
+
class Router {
|
|
42
|
+
/**
|
|
43
|
+
* @internal
|
|
44
|
+
* @param {string} [routePath=""] - O prefixo de caminho para este roteador.
|
|
45
|
+
* @param {Layer} [layers=new Layer()] - A camada interna para gerenciar rotas e middlewares.
|
|
46
|
+
*/
|
|
47
|
+
constructor(routePath = "", layers = new Layer.Layer()) {
|
|
48
|
+
this.routePath = routePath;
|
|
49
|
+
this.layers = layers;
|
|
50
|
+
/** A instância subjacente do Express. */
|
|
51
|
+
this.app = express();
|
|
52
|
+
this.express_router = express.Router();
|
|
53
|
+
this.layers.path = routePath;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Anexa documentação OpenAPI a um grupo de rotas (um roteador).
|
|
57
|
+
* Útil para definir informações comuns, como tags, para um conjunto de rotas.
|
|
58
|
+
*
|
|
59
|
+
* @param {swaggerJSDoc.Operation} operation - O objeto de operação OpenAPI.
|
|
60
|
+
* @param {swaggerJSDoc.Components} [components={}] - Componentes OpenAPI.
|
|
61
|
+
*/
|
|
62
|
+
doc(operation, components = {}) {
|
|
63
|
+
this.layers.doc = Object.assign(Object.assign({}, operation), { components });
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Aplica um middleware a todas as rotas subsequentes definidas neste roteador.
|
|
67
|
+
*
|
|
68
|
+
* @template Req - Tipo de `Request` estendido pelo middleware.
|
|
69
|
+
* @template Res - Tipo de `Response` estendido pelo middleware.
|
|
70
|
+
* @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função ou componente de middleware.
|
|
71
|
+
* @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este middleware.
|
|
72
|
+
* @returns {Router<Rq & Req, Rs & Res>} A instância do roteador com os tipos atualizados.
|
|
73
|
+
*/
|
|
74
|
+
middleware(callback, doc) {
|
|
75
|
+
if (callback instanceof middleware.RequestMiddleware) {
|
|
76
|
+
callback.router.layers
|
|
77
|
+
.filter(({ type, handle }) => type === "middleware" && !!handle)
|
|
78
|
+
.map(({ handle }) => handle)
|
|
79
|
+
.forEach((handle) => this.layers.middleware(handle, doc));
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
this.layers.middleware([callback].map(utils.createDynamicMiddleware), doc);
|
|
83
|
+
}
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Executa a cadeia de middlewares globais aplicados diretamente a esta instância do roteador.
|
|
88
|
+
* Este método é útil principalmente para testes, permitindo invocar a lógica dos middlewares
|
|
89
|
+
* do roteador de forma isolada, sem a necessidade de um servidor HTTP completo.
|
|
90
|
+
*
|
|
91
|
+
* @param {Rq} request - O objeto de requisição (ou um mock para testes).
|
|
92
|
+
* @param {Rs} response - O objeto de resposta (ou um mock para testes).
|
|
93
|
+
* @param {NextFunction} next - A função `next` a ser chamada ao final da cadeia de middlewares.
|
|
94
|
+
* @returns {Promise<void>} Uma promessa que resolve quando a execução da cadeia é concluída.
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* import { create, Request, Response, NextFunction } from '@ismael1361/router';
|
|
98
|
+
*
|
|
99
|
+
* // 1. Crie um roteador e adicione middlewares globais a ele
|
|
100
|
+
* const app = create();
|
|
101
|
+
* app.middleware<{ traceId: string }>((req, res, next) => {
|
|
102
|
+
* req.traceId = 'xyz-123';
|
|
103
|
+
* next();
|
|
104
|
+
* });
|
|
105
|
+
*
|
|
106
|
+
* // 2. Crie mocks para os objetos de requisição, resposta e next
|
|
107
|
+
* const mockRequest = {} as Request & { traceId: string };
|
|
108
|
+
*
|
|
109
|
+
* // 3. Execute a cadeia de middlewares do roteador
|
|
110
|
+
* await app.executeMiddlewares(mockRequest, {} as Response, () => {});
|
|
111
|
+
* console.log(mockRequest.traceId); // Output: 'xyz-123'
|
|
112
|
+
*/
|
|
113
|
+
executeMiddlewares(request, response, next) {
|
|
114
|
+
return this.layers.executeMiddlewares(request, response, next);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Cria um componente de manipulador (handler) reutilizável.
|
|
118
|
+
* Este método é um atalho para a função `handler` exportada, permitindo criar
|
|
119
|
+
* um manipulador completo e reutilizável que pode encapsular uma ou mais funções de middleware
|
|
120
|
+
* e um manipulador final.
|
|
121
|
+
*
|
|
122
|
+
* @example
|
|
123
|
+
* // Crie um manipulador reutilizável que primeiro executa um middleware e depois a lógica principal.
|
|
124
|
+
* const processDataHandler = app.handler(
|
|
125
|
+
* middleware(dataValidationMiddleware)
|
|
126
|
+
* .handler((req, res) => {
|
|
127
|
+
* // A lógica principal do handler aqui.
|
|
128
|
+
* res.json({ processedData: req.validatedData });
|
|
129
|
+
* })
|
|
130
|
+
* );
|
|
131
|
+
*
|
|
132
|
+
* // Use o manipulador reutilizável em uma rota.
|
|
133
|
+
* app.post('/process', { summary: 'Processar dados' })
|
|
134
|
+
* .handler(processDataHandler);
|
|
135
|
+
*
|
|
136
|
+
* @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função ou componente de middleware/handler.
|
|
137
|
+
* @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este manipulador.
|
|
138
|
+
* @returns {Handler<Rq & Req, Rs & Res>} Uma instância de `Handler` que pode ser usada em rotas.
|
|
139
|
+
*/
|
|
140
|
+
handler(callback, doc) {
|
|
141
|
+
return new handler.Handler(callback, undefined, doc);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Inicia a definição de uma rota para o método HTTP GET.
|
|
145
|
+
*
|
|
146
|
+
* @example
|
|
147
|
+
* router.get('/users/:id', { summary: 'Obter um usuário' })
|
|
148
|
+
* .handler((req, res) => {
|
|
149
|
+
* // req.params.id está disponível
|
|
150
|
+
* res.json({ id: req.params.id, name: 'John Doe' });
|
|
151
|
+
* });
|
|
152
|
+
*
|
|
153
|
+
* @param {string} path - O caminho da rota (ex: '/users', '/users/:id').
|
|
154
|
+
* @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
|
|
155
|
+
* @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
|
|
156
|
+
*/
|
|
157
|
+
get(path, doc) {
|
|
158
|
+
return new handler.RequestHandler(this, "get", path, doc);
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Inicia a definição de uma rota para o método HTTP POST.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* router.post('/users', { summary: 'Criar um usuário' })
|
|
165
|
+
* .handler((req, res) => {
|
|
166
|
+
* const newUser = req.body;
|
|
167
|
+
* res.status(201).json({ id: 'new-id', ...newUser });
|
|
168
|
+
* });
|
|
169
|
+
*
|
|
170
|
+
* @param {string} path - O caminho da rota.
|
|
171
|
+
* @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
|
|
172
|
+
* @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
|
|
173
|
+
*/
|
|
174
|
+
post(path, doc) {
|
|
175
|
+
return new handler.RequestHandler(this, "post", path, doc);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Inicia a definição de uma rota para o método HTTP PUT.
|
|
179
|
+
* @param {string} path - O caminho da rota.
|
|
180
|
+
* @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
|
|
181
|
+
* @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
|
|
182
|
+
*/
|
|
183
|
+
put(path, doc) {
|
|
184
|
+
return new handler.RequestHandler(this, "put", path, doc);
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Inicia a definição de uma rota para o método HTTP DELETE.
|
|
188
|
+
* @param {string} path - O caminho da rota.
|
|
189
|
+
* @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
|
|
190
|
+
* @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
|
|
191
|
+
*/
|
|
192
|
+
delete(path, doc) {
|
|
193
|
+
return new handler.RequestHandler(this, "delete", path, doc);
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Inicia a definição de uma rota para o método HTTP PATCH.
|
|
197
|
+
* @param {string} path - O caminho da rota.
|
|
198
|
+
* @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
|
|
199
|
+
* @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
|
|
200
|
+
*/
|
|
201
|
+
patch(path, doc) {
|
|
202
|
+
return new handler.RequestHandler(this, "patch", path, doc);
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Inicia a definição de uma rota para o método HTTP OPTIONS.
|
|
206
|
+
* @param {string} path - O caminho da rota.
|
|
207
|
+
* @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
|
|
208
|
+
* @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
|
|
209
|
+
*/
|
|
210
|
+
options(path, doc) {
|
|
211
|
+
return new handler.RequestHandler(this, "options", path, doc);
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Inicia a definição de uma rota para o método HTTP HEAD.
|
|
215
|
+
* @param {string} path - O caminho da rota.
|
|
216
|
+
* @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
|
|
217
|
+
* @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
|
|
218
|
+
*/
|
|
219
|
+
head(path, doc) {
|
|
220
|
+
return new handler.RequestHandler(this, "head", path, doc);
|
|
221
|
+
}
|
|
222
|
+
/**
|
|
223
|
+
* Inicia a definição de uma rota que corresponde a todos os métodos HTTP.
|
|
224
|
+
* @param {string} path - O caminho da rota.
|
|
225
|
+
* @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
|
|
226
|
+
* @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
|
|
227
|
+
*/
|
|
228
|
+
all(path, doc) {
|
|
229
|
+
return new handler.RequestHandler(this, "all", path, doc);
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Aplica um middleware a um caminho específico, correspondendo a todos os métodos HTTP.
|
|
233
|
+
*
|
|
234
|
+
* @example
|
|
235
|
+
* // Aplica um middleware de log para todas as rotas sob /api
|
|
236
|
+
* router.use('/api', { tags: ['Logging'] })
|
|
237
|
+
* .handler((req, res, next) => {
|
|
238
|
+
* console.log('API call:', req.method, req.path);
|
|
239
|
+
* next();
|
|
240
|
+
* });
|
|
241
|
+
*
|
|
242
|
+
* @param {string} path - O caminho da rota.
|
|
243
|
+
* @param {MiddlewareFCDoc} doc - (Opcional) Documentação OpenAPI para o manipulador de rota.
|
|
244
|
+
* @returns {RequestHandler<Rq, Rs>} Uma instância de `RequestHandler` para encadear middlewares e o manipulador final.
|
|
245
|
+
*/
|
|
246
|
+
use(path = "", doc) {
|
|
247
|
+
return new handler.RequestHandler(this, "use", path, doc);
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Retorna uma lista achatada de todas as rotas finais registradas,
|
|
251
|
+
* com middlewares e caminhos resolvidos. Útil para depuração.
|
|
252
|
+
* @returns {Array<object>} Uma lista de objetos de rota.
|
|
253
|
+
*/
|
|
254
|
+
get routes() {
|
|
255
|
+
return utils.getRoutes(this.layers);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Gera a especificação OpenAPI completa com base na documentação definida.
|
|
259
|
+
* @param {swaggerJSDoc.OAS3Definition} [options] - Opções de base para a definição OpenAPI.
|
|
260
|
+
* @param {swaggerJSDoc.Responses} [defaultResponses={}] - Respostas padrão a serem mescladas em todas as rotas.
|
|
261
|
+
* @returns {swaggerJSDoc.Options} O objeto de opções pronto para ser usado por `swagger-jsdoc`.
|
|
262
|
+
*/
|
|
263
|
+
getSwagger(options, defaultResponses = {}) {
|
|
264
|
+
const swaggerOptions = Object.assign(Object.assign({ path: "/doc" }, (options || {})), { defaultResponses });
|
|
265
|
+
let doc = { paths: (swaggerOptions === null || swaggerOptions === void 0 ? void 0 : swaggerOptions.paths) || {}, components: (swaggerOptions === null || swaggerOptions === void 0 ? void 0 : swaggerOptions.components) || {} };
|
|
266
|
+
this.layers.routes.forEach(({ method, path, doc: routeDoc }) => {
|
|
267
|
+
if (routeDoc) {
|
|
268
|
+
const { components } = routeDoc, operation = tslib_es6.__rest(routeDoc, ["components"]);
|
|
269
|
+
operation.responses = utils.joinObject(swaggerOptions.defaultResponses || {}, operation.responses || {});
|
|
270
|
+
doc = utils.joinObject(doc, {
|
|
271
|
+
paths: { [path]: { [method]: operation } },
|
|
272
|
+
components: components || {},
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
});
|
|
276
|
+
const definition = Object.assign(Object.assign({}, utils.omit(swaggerOptions, "path", "defaultResponses")), doc);
|
|
277
|
+
const targets = {
|
|
278
|
+
shell_curl: "Shell",
|
|
279
|
+
shell_httpie: "Shell",
|
|
280
|
+
node_request: "JavaScript",
|
|
281
|
+
python_python3: "Python",
|
|
282
|
+
// php_curl: "PHP",
|
|
283
|
+
// php_http1: "PHP",
|
|
284
|
+
// php_http2: "PHP",
|
|
285
|
+
};
|
|
286
|
+
for (const path in definition.paths) {
|
|
287
|
+
for (const method in definition.paths[path]) {
|
|
288
|
+
const generatedCode = OpenAPISnippet.getEndpointSnippets(Object.assign({ servers: [
|
|
289
|
+
{
|
|
290
|
+
url: "http://[hostname]",
|
|
291
|
+
},
|
|
292
|
+
] }, definition), path, method, Object.keys(targets));
|
|
293
|
+
definition.paths[path][method]["x-codeSamples"] = [];
|
|
294
|
+
for (const snippetIdx in generatedCode.snippets) {
|
|
295
|
+
const snippet = generatedCode.snippets[snippetIdx];
|
|
296
|
+
definition.paths[path][method]["x-codeSamples"][snippetIdx] = { lang: targets[snippet.id], label: snippet.title, source: snippet.content };
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return {
|
|
301
|
+
definition,
|
|
302
|
+
apis: [],
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Define as opções globais de documentação OpenAPI para este roteador.
|
|
307
|
+
*
|
|
308
|
+
* @example
|
|
309
|
+
* app.defineSwagger({
|
|
310
|
+
* openapi: '3.0.0',
|
|
311
|
+
* info: { title: 'Minha API', version: '1.0.0' },
|
|
312
|
+
* path: '/api-docs', // Caminho base para as UIs de documentação
|
|
313
|
+
* defaultResponses: {
|
|
314
|
+
* 500: { description: 'Erro Interno do Servidor' }
|
|
315
|
+
* }
|
|
316
|
+
* });
|
|
317
|
+
*
|
|
318
|
+
* @param {SwaggerOptions} options - As opções de configuração.
|
|
319
|
+
*/
|
|
320
|
+
defineSwagger(options) {
|
|
321
|
+
const swaggerOptions = Object.assign(Object.assign({}, options), { path: options.path || "/doc", defaultResponses: options.defaultResponses || {} });
|
|
322
|
+
const path = swaggerOptions.path || "/doc";
|
|
323
|
+
const swaggerSpec = (...args) => {
|
|
324
|
+
const options = this.getSwagger(swaggerOptions, swaggerOptions.defaultResponses);
|
|
325
|
+
let markdown = "", definition = {};
|
|
326
|
+
try {
|
|
327
|
+
if (args.includes("definition"))
|
|
328
|
+
definition = swaggerJSDoc(options);
|
|
329
|
+
if (args.includes("markdown"))
|
|
330
|
+
markdown = index.default.convert(options);
|
|
331
|
+
}
|
|
332
|
+
catch (_a) { }
|
|
333
|
+
return {
|
|
334
|
+
options,
|
|
335
|
+
definition,
|
|
336
|
+
markdown,
|
|
337
|
+
};
|
|
338
|
+
};
|
|
339
|
+
this.express_router.use(utils.joinPath(path, "/.md"), (res, req) => {
|
|
340
|
+
req.setHeader("Content-Type", "text/markdown");
|
|
341
|
+
req.send(swaggerSpec("markdown").markdown);
|
|
342
|
+
});
|
|
343
|
+
this.express_router.use(utils.joinPath(path, "/markdown"), (...args) => {
|
|
344
|
+
index.default.setup(swaggerSpec().options).apply(this.app, args);
|
|
345
|
+
});
|
|
346
|
+
this.express_router.get(utils.joinPath(path, "/swagger/definition.json"), (req, res) => {
|
|
347
|
+
res.json(swaggerSpec("definition").definition);
|
|
348
|
+
});
|
|
349
|
+
this.express_router.use(utils.joinPath(path, "/swagger"), swaggerUi.serve, (...args) => {
|
|
350
|
+
swaggerUi.setup(swaggerSpec("definition").definition).apply(this.app, args);
|
|
351
|
+
});
|
|
352
|
+
this.express_router.use(utils.joinPath(path, "/redoc"), (...args) => {
|
|
353
|
+
index$1.setup(swaggerSpec().options).apply(this.app, args);
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Cria um sub-roteador aninhado sob um prefixo de caminho.
|
|
358
|
+
*
|
|
359
|
+
* @example
|
|
360
|
+
* const adminRouter = router.route('/admin');
|
|
361
|
+
* adminRouter.get('/dashboard', ...); // Rota final: /admin/dashboard
|
|
362
|
+
*
|
|
363
|
+
* @param {string} path - O prefixo do caminho para o sub-roteador.
|
|
364
|
+
* @returns {Router<Rq, Rs>} Uma nova instância de `Router` para o sub-roteador.
|
|
365
|
+
*/
|
|
366
|
+
route(path = "") {
|
|
367
|
+
return new Router("", this.layers.route(path));
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Anexa um roteador existente (sub-roteador) a este roteador.
|
|
371
|
+
*
|
|
372
|
+
* @example
|
|
373
|
+
* const usersRouter = route('/users');
|
|
374
|
+
* // ... define rotas em usersRouter ...
|
|
375
|
+
*
|
|
376
|
+
* const app = create();
|
|
377
|
+
* app.by(usersRouter); // Anexa o roteador de usuários ao principal
|
|
378
|
+
*
|
|
379
|
+
* @param {Router} router - A instância do roteador a ser anexada.
|
|
380
|
+
* @returns {this} A instância atual do roteador para encadeamento.
|
|
381
|
+
*/
|
|
382
|
+
by(router) {
|
|
383
|
+
if (router instanceof Router) {
|
|
384
|
+
this.layers.by(router.layers);
|
|
385
|
+
this.express_router.use(router.routePath, router.express_router);
|
|
386
|
+
}
|
|
387
|
+
return this;
|
|
388
|
+
}
|
|
389
|
+
/** Delega para o método `app.engine()` do Express. */
|
|
390
|
+
engine(ext, fn) {
|
|
391
|
+
this.app.engine(ext, fn);
|
|
392
|
+
return this;
|
|
393
|
+
}
|
|
394
|
+
enabled(setting) {
|
|
395
|
+
return this.app.enabled(setting);
|
|
396
|
+
}
|
|
397
|
+
/** Delega para o método `app.disabled()` do Express. */
|
|
398
|
+
disabled(setting) {
|
|
399
|
+
return this.app.disabled(setting);
|
|
400
|
+
}
|
|
401
|
+
/** Delega para o método `app.enable()` do Express. */
|
|
402
|
+
enable(setting) {
|
|
403
|
+
this.app.enable(setting);
|
|
404
|
+
return this;
|
|
405
|
+
}
|
|
406
|
+
/** Delega para o método `app.disable()` do Express. */
|
|
407
|
+
disable(setting) {
|
|
408
|
+
this.app.disable(setting);
|
|
409
|
+
return this;
|
|
410
|
+
}
|
|
411
|
+
listen(...args) {
|
|
412
|
+
const router = express.Router();
|
|
413
|
+
this.app.use((req, res, next) => {
|
|
414
|
+
router.stack = [];
|
|
415
|
+
this.layers.routes.forEach(({ method, path, handle }) => {
|
|
416
|
+
router[method](path, ...handle);
|
|
417
|
+
});
|
|
418
|
+
next();
|
|
419
|
+
}, router);
|
|
420
|
+
this.app.use(this.routePath, this.express_router);
|
|
421
|
+
this.app.get("/.well-known/appspecific/com.chrome.devtools.json", (req, res) => {
|
|
422
|
+
const projectRoot = path.resolve(__dirname);
|
|
423
|
+
const workspaceUuid = utils$1.uuidv4("-"); // Gera um UUID v4
|
|
424
|
+
res.json({
|
|
425
|
+
workspace: {
|
|
426
|
+
root: projectRoot,
|
|
427
|
+
uuid: workspaceUuid,
|
|
428
|
+
},
|
|
429
|
+
});
|
|
430
|
+
});
|
|
431
|
+
this.app.use(utils.createDynamicMiddleware((req, res, next) => {
|
|
432
|
+
throw new HandleError.HandleError(`Not Found by ${req.method} ${req.url}`, "NOT_FOUND", 404);
|
|
433
|
+
}));
|
|
434
|
+
return this.app.listen(...args);
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
exports.Router = Router;
|
|
2
439
|
//# sourceMappingURL=router.js.map
|
package/dist/router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"router.js","sources":["../src/router.ts"],"sourcesContent":[null],"names":["
|
|
1
|
+
{"version":3,"file":"router.js","sources":["../src/router.ts"],"sourcesContent":[null],"names":["Layer","RequestMiddleware","createDynamicMiddleware","Handler","RequestHandler","getRoutes","__rest","joinObject","omit","swaggerMarkdown","joinPath","redocUi.setup","uuidv4","HandleError"],"mappings":";;;;;;;;;;;;;;;;;AAgBA;;;;;;;;;;;;;;;;;;;;;;AAsBG;MACU,MAAM,CAAA;AAKlB;;;;AAIG;AACH,IAAA,WAAA,CAAqB,YAAoB,EAAE,EAAW,MAAgB,GAAA,IAAIA,WAAK,EAAE,EAAA;QAA5D,IAAS,CAAA,SAAA,GAAT,SAAS,CAAa;QAAW,IAAM,CAAA,MAAA,GAAN,MAAM,CAAqB;;QAR1E,IAAG,CAAA,GAAA,GAAY,OAAO,EAAE,CAAC;AACvB,QAAA,IAAA,CAAA,cAAc,GAAkB,OAAO,CAAC,MAAM,EAAE,CAAC;AAQzD,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,SAAS,CAAC;KAC7B;AAED;;;;;;AAMG;AACH,IAAA,GAAG,CAAC,SAAiC,EAAE,UAAA,GAAsC,EAAE,EAAA;QAC9E,IAAI,CAAC,MAAM,CAAC,GAAG,mCAAQ,SAAS,CAAA,EAAA,EAAE,UAAU,EAAA,CAAE,CAAC;KAC/C;AAED;;;;;;;;AAQG;IACH,UAAU,CAAiE,QAAgD,EAAE,GAAqB,EAAA;AACjJ,QAAA,IAAI,QAAQ,YAAYC,4BAAiB,EAAE;YAC1C,QAAQ,CAAC,MAAM,CAAC,MAAM;AACpB,iBAAA,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,YAAY,IAAI,CAAC,CAAC,MAAM,CAAC;iBAC/D,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,KAAK,MAAO,CAAC;AAC5B,iBAAA,OAAO,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;SAC3D;aAAM;AACN,YAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAACC,6BAAuB,CAAC,EAAE,GAAG,CAAC,CAAC;SACrE;AACD,QAAA,OAAO,IAAI,CAAC;KACZ;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BG;AACH,IAAA,kBAAkB,CAAC,OAAW,EAAE,QAAY,EAAE,IAAkB,EAAA;AAC/D,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;KAC/D;AAED;;;;;;;;;;;;;;;;;;;;;;;AAuBG;IACH,OAAO,CAAiE,QAAgD,EAAE,GAAqB,EAAA;QAC9I,OAAO,IAAIC,eAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;KAC7C;AAED;;;;;;;;;;;;;AAaG;IACH,GAAG,CAAC,IAAY,EAAE,GAAqB,EAAA;QACtC,OAAO,IAAIC,sBAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KAClD;AAED;;;;;;;;;;;;;AAaG;IACH,IAAI,CAAC,IAAY,EAAE,GAAqB,EAAA;QACvC,OAAO,IAAIA,sBAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KACnD;AAED;;;;;AAKG;IACH,GAAG,CAAC,IAAY,EAAE,GAAqB,EAAA;QACtC,OAAO,IAAIA,sBAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KAClD;AAED;;;;;AAKG;IACH,MAAM,CAAC,IAAY,EAAE,GAAqB,EAAA;QACzC,OAAO,IAAIA,sBAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KACrD;AAED;;;;;AAKG;IACH,KAAK,CAAC,IAAY,EAAE,GAAqB,EAAA;QACxC,OAAO,IAAIA,sBAAc,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KACpD;AAED;;;;;AAKG;IACH,OAAO,CAAC,IAAY,EAAE,GAAqB,EAAA;QAC1C,OAAO,IAAIA,sBAAc,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KACtD;AAED;;;;;AAKG;IACH,IAAI,CAAC,IAAY,EAAE,GAAqB,EAAA;QACvC,OAAO,IAAIA,sBAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KACnD;AAED;;;;;AAKG;IACH,GAAG,CAAC,IAAY,EAAE,GAAqB,EAAA;QACtC,OAAO,IAAIA,sBAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KAClD;AAED;;;;;;;;;;;;;;AAcG;AACH,IAAA,GAAG,CAAC,IAAA,GAAe,EAAE,EAAE,GAAqB,EAAA;QAC3C,OAAO,IAAIA,sBAAc,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;KAClD;AAED;;;;AAIG;AACH,IAAA,IAAI,MAAM,GAAA;AACT,QAAA,OAAOC,eAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAC9B;AAED;;;;;AAKG;AACH,IAAA,UAAU,CAAC,OAAqC,EAAE,gBAAA,GAA2C,EAAE,EAAA;AAC9F,QAAA,MAAM,cAAc,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAK,IAAI,EAAE,MAAM,EAAK,GAAC,OAAO,IAAI,EAAE,EAAG,EAAA,EAAA,gBAAgB,GAAE,CAAC;AAE9E,QAAA,IAAI,GAAG,GAA8D,EAAE,KAAK,EAAE,CAAA,cAAc,KAAA,IAAA,IAAd,cAAc,KAAA,KAAA,CAAA,GAAA,KAAA,CAAA,GAAd,cAAc,CAAE,KAAK,KAAI,EAAE,EAAE,UAAU,EAAE,CAAA,cAAc,KAAd,IAAA,IAAA,cAAc,KAAd,KAAA,CAAA,GAAA,KAAA,CAAA,GAAA,cAAc,CAAE,UAAU,KAAI,EAAE,EAAE,CAAC;AAE1J,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAI;YAC9D,IAAI,QAAQ,EAAE;gBACb,MAAM,EAAE,UAAU,EAAA,GAAmB,QAAQ,EAAtB,SAAS,GAAAC,gBAAA,CAAK,QAAQ,EAAvC,CAA4B,YAAA,CAAA,CAAW,CAAC;AAE9C,gBAAA,SAAS,CAAC,SAAS,GAAGC,gBAAU,CAAyB,cAAc,CAAC,gBAAgB,IAAI,EAAE,EAAE,SAAS,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;AAE3H,gBAAA,GAAG,GAAGA,gBAAU,CAAC,GAAG,EAAE;AACrB,oBAAA,KAAK,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,GAAG,SAAS,EAAE,EAAE;oBAC1C,UAAU,EAAE,UAAU,IAAI,EAAE;AAC5B,iBAAA,CAAC,CAAC;aACH;AACF,SAAC,CAAC,CAAC;AAEH,QAAA,MAAM,UAAU,GAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,MAAA,CAAA,EAAA,EACZC,UAAI,CAAC,cAAc,EAAE,MAAM,EAAE,kBAAkB,CAAC,CAChD,EAAA,GAAG,CACN,CAAC;AAEF,QAAA,MAAM,OAAO,GAA2B;AACvC,YAAA,UAAU,EAAE,OAAO;AACnB,YAAA,YAAY,EAAE,OAAO;AACrB,YAAA,YAAY,EAAE,YAAY;AAC1B,YAAA,cAAc,EAAE,QAAQ;;;;SAIxB,CAAC;AAEF,QAAA,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE;YACpC,KAAK,MAAM,MAAM,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;AAC5C,gBAAA,MAAM,aAAa,GAAG,cAAc,CAAC,mBAAmB,CAAA,MAAA,CAAA,MAAA,CAAA,EAEtD,OAAO,EAAE;AACR,wBAAA;AACC,4BAAA,GAAG,EAAE,mBAAmB;AACxB,yBAAA;AACD,qBAAA,EAAA,EACE,UAAU,CAAA,EAEd,IAAI,EACJ,MAAM,EACN,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CACpB,CAAC;AACF,gBAAA,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC;AAErD,gBAAA,KAAK,MAAM,UAAU,IAAI,aAAa,CAAC,QAAQ,EAAE;oBAChD,MAAM,OAAO,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;AACnD,oBAAA,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC;iBAC3I;aACD;SACD;QAED,OAAO;YACN,UAAU;AACV,YAAA,IAAI,EAAE,EAAE;SACD,CAAC;KACT;AAED;;;;;;;;;;;;;;AAcG;AACH,IAAA,aAAa,CAAC,OAAuB,EAAA;QACpC,MAAM,cAAc,mCAAQ,OAAO,CAAA,EAAA,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE,GAAE,CAAC;AAEtH,QAAA,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,IAAI,MAAM,CAAC;AAE3C,QAAA,MAAM,WAAW,GAAG,CAAC,GAAG,IAAc,KAAI;AACzC,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,cAAc,CAAC,gBAAgB,CAAC,CAAC;AACjF,YAAA,IAAI,QAAQ,GAAW,EAAE,EACxB,UAAU,GAAmC,EAAS,CAAC;AAExD,YAAA,IAAI;AACH,gBAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;AAAE,oBAAA,UAAU,GAAG,YAAY,CAAC,OAAO,CAAQ,CAAC;AAC3E,gBAAA,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;AAAE,oBAAA,QAAQ,GAAGC,aAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aAC3E;YAAC,OAAM,EAAA,EAAA,GAAE;YAEV,OAAO;gBACN,OAAO;gBACP,UAAU;gBACV,QAAQ;aACR,CAAC;AACH,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAACC,cAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAI;AAC5D,YAAA,GAAG,CAAC,SAAS,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;YAC/C,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC5C,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAACA,cAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,GAAG,IAAS,KAAI;AACrE,YAAAD,aAAe,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AACpE,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAACC,cAAQ,CAAC,IAAI,EAAE,0BAA0B,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAI;YAChF,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC;AAChD,SAAC,CAAC,CAAC;QAEH,IAAI,CAAC,cAAc,CAAC,GAAG,CAACA,cAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,KAAK,EAAE,CAAC,GAAG,IAAS,KAAI;AACrF,YAAA,SAAS,CAAC,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC7E,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAACA,cAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC,GAAG,IAAS,KAAI;AAClE,YAAAC,aAAa,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC5D,SAAC,CAAC,CAAC;KACH;AAED;;;;;;;;;AASG;IACH,KAAK,CAAC,OAAe,EAAE,EAAA;AACtB,QAAA,OAAO,IAAI,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;KAC/C;AAED;;;;;;;;;;;;AAYG;AACH,IAAA,EAAE,CAAC,MAAc,EAAA;AAChB,QAAA,IAAI,MAAM,YAAY,MAAM,EAAE;YAC7B,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC9B,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;SACjE;AACD,QAAA,OAAO,IAAI,CAAC;KACZ;;IAGD,MAAM,CAAC,GAAW,EAAE,EAA0F,EAAA;QAC7G,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;AACzB,QAAA,OAAO,IAAI,CAAC;KACZ;AAED,IAAA,OAAO,CAAC,OAAe,EAAA;QACtB,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;KACjC;;AAGD,IAAA,QAAQ,CAAC,OAAe,EAAA;QACvB,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;KAClC;;AAGD,IAAA,MAAM,CAAC,OAAe,EAAA;AACrB,QAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,QAAA,OAAO,IAAI,CAAC;KACZ;;AAGD,IAAA,OAAO,CAAC,OAAe,EAAA;AACtB,QAAA,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAC1B,QAAA,OAAO,IAAI,CAAC;KACZ;IA2BD,MAAM,CAAC,GAAG,IAAW,EAAA;AACpB,QAAA,MAAM,MAAM,GAAkB,OAAO,CAAC,MAAM,EAAE,CAAC;AAE/C,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AAC/B,YAAA,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;AAClB,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAI;gBACvD,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,CAAC;AACjC,aAAC,CAAC,CAAC;AACH,YAAA,IAAI,EAAE,CAAC;SACP,EAAE,MAAM,CAAC,CAAC;AAEX,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;AAElD,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,mDAAmD,EAAE,CAAC,GAAG,EAAE,GAAG,KAAI;YAC9E,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAGC,cAAM,CAAC,GAAG,CAAC,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC;AACR,gBAAA,SAAS,EAAE;AACV,oBAAA,IAAI,EAAE,WAAW;AACjB,oBAAA,IAAI,EAAE,aAAa;AACnB,iBAAA;AACD,aAAA,CAAC,CAAC;AACJ,SAAC,CAAC,CAAC;AAEH,QAAA,IAAI,CAAC,GAAG,CAAC,GAAG,CACXV,6BAAuB,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,KAAI;AAC1C,YAAA,MAAM,IAAIW,uBAAW,CAAC,CAAgB,aAAA,EAAA,GAAG,CAAC,MAAM,CAAA,CAAA,EAAI,GAAG,CAAC,GAAG,CAAE,CAAA,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;SACjF,CAAQ,CACT,CAAC;QAEF,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC;KAChC;AACD;;;;"}
|