@ismael1361/router 1.0.1 → 1.0.6

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.
@@ -0,0 +1,21 @@
1
+ import type swaggerJSDoc from "swagger-jsdoc";
2
+ import type { ExtractScopesBySecuritySchemes, Reference, ComponentSecurity, SecuritySchemesTypes, ComponentSchema } from "./type";
3
+ import type { MiddlewareFCDoc } from "../type";
4
+ export declare class Doc {
5
+ operation: swaggerJSDoc.Operation;
6
+ components: swaggerJSDoc.Components;
7
+ constructor(operation?: swaggerJSDoc.Operation, components?: swaggerJSDoc.Components);
8
+ get doc(): MiddlewareFCDoc;
9
+ summary(summary: string): this;
10
+ description(description: string): this;
11
+ tags<T extends string>(...tags: T[]): this;
12
+ operationId(operationId: string): this;
13
+ parameter(options: swaggerJSDoc.Parameter | swaggerJSDoc.Reference): this;
14
+ requestBody(): void;
15
+ security<S extends string | ComponentSecurity<any, any>, E extends ExtractScopesBySecuritySchemes<S>>(security: S, ...scopes: E[]): this;
16
+ static ref<R extends string | ComponentSecurity<any, any> | ComponentSchema<any, any>>(ref: R): Reference<R>;
17
+ static component: {
18
+ securityScheme<N extends string, O extends SecuritySchemesTypes>(name: N, options: O): ComponentSecurity<N, O>;
19
+ };
20
+ }
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Doc/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,eAAe,CAAC;AAC9C,OAAO,KAAK,EAAE,8BAA8B,EAAE,SAAS,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,eAAe,EAAsC,MAAM,QAAQ,CAAC;AACtK,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,SAAS,CAAC;AA2CzD,qBAAa,GAAG;IACI,SAAS,EAAE,YAAY,CAAC,SAAS;IAAc,UAAU,EAAE,YAAY,CAAC,UAAU;gBAAlF,SAAS,GAAE,YAAY,CAAC,SAAc,EAAS,UAAU,GAAE,YAAY,CAAC,UAAsB;IAEjH,IAAI,GAAG,IAAI,eAAe,CAKzB;IAED,OAAO,CAAC,OAAO,EAAE,MAAM;IAKvB,WAAW,CAAC,WAAW,EAAE,MAAM;IAK/B,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,EAAE;IAKnC,WAAW,CAAC,WAAW,EAAE,MAAM;IAK/B,SAAS,CAAC,OAAO,EAAE,YAAY,CAAC,SAAS,GAAG,YAAY,CAAC,SAAS;IAKlE,WAAW;IAEX,QAAQ,CAAC,CAAC,SAAS,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,SAAS,8BAA8B,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,EAAE;IAiBjI,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAoB5G,MAAM,CAAC,SAAS;uBACA,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,oBAAoB,QAAQ,CAAC,WAAW,CAAC,GAAG,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC;MAO7G;CACF"}
@@ -0,0 +1,66 @@
1
+ import type swaggerJSDoc from "swagger-jsdoc";
2
+ import { Prettify } from "../type";
3
+ export type SecuritySchemes_apiKey = {
4
+ type: "apiKey";
5
+ name: string;
6
+ in: "query" | "header" | "cookie";
7
+ description?: string;
8
+ };
9
+ export type SecuritySchemes_http = {
10
+ type: "http";
11
+ scheme: "basic" | "bearer" | "digest" | "ntlm";
12
+ bearerFormat?: "JWT" | "SAML" | "WS-Security";
13
+ description?: string;
14
+ };
15
+ export type SecuritySchemes_oauth2 = {
16
+ type: "oauth2";
17
+ flows: swaggerJSDoc.OAuthFlows;
18
+ description?: string;
19
+ };
20
+ export type SecuritySchemes_openIdConnect = {
21
+ type: "openIdConnect";
22
+ openIdConnectUrl: string;
23
+ description?: string;
24
+ };
25
+ export type SecuritySchemes_mutualTLS = {
26
+ type: "mutualTLS";
27
+ description?: string;
28
+ };
29
+ export type SecuritySchemesTypes = SecuritySchemes_apiKey | SecuritySchemes_http | SecuritySchemes_oauth2 | SecuritySchemes_openIdConnect | SecuritySchemes_mutualTLS | swaggerJSDoc.SecurityScheme;
30
+ export type ExtractScopesBySecuritySchemes<S> = S extends swaggerJSDoc.SecurityScheme & {
31
+ flows?: infer F;
32
+ } ? F extends Record<string, infer Flow> ? Flow extends swaggerJSDoc.OAuthFlow ? keyof NonNullable<Flow["scopes"]> : never : never : S extends ComponentSecurity<any, infer I> ? ExtractScopesBySecuritySchemes<I> : never;
33
+ export type ComponentSecurity<N extends string, O extends SecuritySchemesTypes> = {
34
+ securitySchemes: {
35
+ [k in N]: Prettify<O>;
36
+ };
37
+ };
38
+ export type ComponentSchema<N extends string, S extends swaggerJSDoc.Schema> = {
39
+ schemas: {
40
+ [k in N]: Prettify<S>;
41
+ };
42
+ };
43
+ export type Reference<R> = R extends string ? R extends `#/components/${infer I}` ? {
44
+ $ref: `#/components/${I}`;
45
+ } : {
46
+ $ref: `#/components/${R}`;
47
+ } : R extends ComponentSecurity<infer N, any> ? `#/components/securitySchemes/${N}` : R extends ComponentSchema<infer N, any> ? `#/components/schemas/${N}` : never;
48
+ export interface ModelValueNumber extends swaggerJSDoc.Schema {
49
+ type?: "number" | "integer";
50
+ format?: "float" | "double" | "int32" | "int64";
51
+ minimum?: number;
52
+ maximum?: number;
53
+ exclusiveMinimum?: boolean;
54
+ exclusiveMaximum?: boolean;
55
+ description?: string;
56
+ nullable?: boolean;
57
+ }
58
+ export interface ModelValueString extends swaggerJSDoc.Schema {
59
+ format?: "date" | "date-time" | "password" | "byte" | "binary" | "email" | "uuid" | "uri" | "hostname" | "ipv4" | "ipv6";
60
+ minLength?: number;
61
+ maxLength?: number;
62
+ description?: string;
63
+ pattern?: RegExp | string;
64
+ nullable?: boolean;
65
+ }
66
+ //# sourceMappingURL=type.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../src/Doc/type.ts"],"names":[],"mappings":"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"}
@@ -62,13 +62,55 @@ declare const codes: {
62
62
  readonly 510: "Not Extended";
63
63
  readonly 511: "Network Authentication Required";
64
64
  };
65
+ /**
66
+ * Uma classe de erro personalizada projetada para lidar com erros operacionais em uma aplicação,
67
+ * especialmente em um contexto de API HTTP. Permite encapsular uma mensagem de erro, um nome,
68
+ * um código de status HTTP e um nível de log.
69
+ *
70
+ * @example
71
+ * // Exemplo 1: Erro com mensagem e código de status.
72
+ * try {
73
+ * throw new HandleError("Recurso não encontrado.", "NOT_FOUND", 404);
74
+ * } catch (e) {
75
+ * if (e instanceof HandleError) {
76
+ * // Em um handler de API, você poderia usar e.code para definir o status da resposta.
77
+ * // res.status(e.code).json({ message: e.message, name: e.name });
78
+ * console.log(e.message); // "Recurso não encontrado."
79
+ * console.log(e.name); // "NOT_FOUND"
80
+ * console.log(e.code); // 404
81
+ * console.log(e.status); // { code: 404, message: 'Not Found' }
82
+ * }
83
+ * }
84
+ *
85
+ * // Exemplo 2: Erro de validação com nível de log 'WARN'.
86
+ * const validationError = new HandleError(
87
+ * "O campo 'email' é inválido.",
88
+ * "VALIDATION_ERROR",
89
+ * 400, // Bad Request
90
+ * "WARN"
91
+ * );
92
+ *
93
+ * // Exemplo 3: Erro genérico, usando os valores padrão.
94
+ * const genericError = new HandleError("Algo deu errado.");
95
+ * console.log(genericError.name); // "DEFAULT"
96
+ * console.log(genericError.code); // 200 (comportamento padrão quando 'cause' não é número)
97
+ * console.log(genericError.level); // "ERROR"
98
+ */
65
99
  export declare class HandleError extends Error {
66
100
  readonly message: string;
67
101
  readonly name: string;
68
102
  readonly cause?: (keyof typeof codes | HandleError | Error | string | object) | undefined;
69
103
  readonly level: "ERROR" | "WARN" | "INFO" | "NONE";
104
+ /**
105
+ * @param {string} message A mensagem de erro principal, legível para humanos.
106
+ * @param {string} [name="DEFAULT"] Um nome/código para categorizar o erro (ex: "VALIDATION_ERROR").
107
+ * @param {keyof typeof codes | HandleError | Error | string | object} [cause] A causa raiz do erro. Se for um número, será tratado como um código de status HTTP.
108
+ * @param {"ERROR" | "WARN" | "INFO" | "NONE"} [level="ERROR"] O nível de severidade do erro, usado para controle de logs.
109
+ */
70
110
  constructor(message: string, name?: string, cause?: (keyof typeof codes | HandleError | Error | string | object) | undefined, level?: "ERROR" | "WARN" | "INFO" | "NONE");
111
+ /** Retorna o código de status HTTP associado ao erro. Extraído da propriedade `cause` se for um número, caso contrário, o padrão é 200. */
71
112
  get code(): 100 | 101 | 102 | 103 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 226 | 300 | 301 | 302 | 303 | 304 | 305 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511;
113
+ /** Retorna um objeto contendo o código de status e a mensagem HTTP correspondente. */
72
114
  get status(): {
73
115
  code: 100 | 101 | 102 | 103 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 226 | 300 | 301 | 302 | 303 | 304 | 305 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511;
74
116
  message: "Continue" | "Switching Protocols" | "Processing" | "Early Hints" | "OK" | "Created" | "Accepted" | "Non-Authoritative Information" | "No Content" | "Reset Content" | "Partial Content" | "Multi-Status" | "Already Reported" | "IM Used" | "Multiple Choices" | "Moved Permanently" | "Found" | "See Other" | "Not Modified" | "Use Proxy" | "Temporary Redirect" | "Permanent Redirect" | "Bad Request" | "Unauthorized" | "Payment Required" | "Forbidden" | "Not Found" | "Method Not Allowed" | "Not Acceptable" | "Proxy Authentication Required" | "Request Timeout" | "Conflict" | "Gone" | "Length Required" | "Precondition Failed" | "Payload Too Large" | "URI Too Long" | "Unsupported Media Type" | "Range Not Satisfiable" | "Expectation Failed" | "I'm a Teapot" | "Misdirected Request" | "Unprocessable Entity" | "Locked" | "Failed Dependency" | "Too Early" | "Upgrade Required" | "Precondition Required" | "Too Many Requests" | "Request Header Fields Too Large" | "Unavailable For Legal Reasons" | "Internal Server Error" | "Not Implemented" | "Bad Gateway" | "Service Unavailable" | "Gateway Timeout" | "HTTP Version Not Supported" | "Variant Also Negotiates" | "Insufficient Storage" | "Loop Detected" | "Not Extended" | "Network Authentication Required";
@@ -1 +1 @@
1
- {"version":3,"file":"HandleError.d.ts","sourceRoot":"","sources":["../src/HandleError.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DD,CAAC;AAEX,qBAAa,WAAY,SAAQ,KAAK;IAEpC,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,KAAK,CAAC,GAAE,MAAM,OAAO,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM;IAC3E,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM;gBAHzC,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAkB,EACxB,KAAK,CAAC,GAAE,MAAM,OAAO,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,aAAA,EAClE,KAAK,GAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAgB;IAK7D,IAAI,IAAI,sXAEP;IAED,IAAI,MAAM;;;MAKT;CACD"}
1
+ {"version":3,"file":"HandleError.d.ts","sourceRoot":"","sources":["../src/HandleError.ts"],"names":[],"mappings":"AAAA,QAAA,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+DD,CAAC;AAEX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,qBAAa,WAAY,SAAQ,KAAK;IAQpC,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,KAAK,CAAC,GAAE,MAAM,OAAO,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM;IAC3E,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM;IAVnD;;;;;OAKG;gBAEO,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,MAAkB,EACxB,KAAK,CAAC,GAAE,MAAM,OAAO,KAAK,GAAG,WAAW,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,aAAA,EAClE,KAAK,GAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAgB;IAK7D,2IAA2I;IAC3I,IAAI,IAAI,sXAEP;IAED,sFAAsF;IACtF,IAAI,MAAM;;;MAKT;CACD"}
@@ -0,0 +1,131 @@
1
+ import { HandlerFC, ILayer, IRoute, MiddlewareFC, MiddlewareFCDoc, NextFunction, RouterMethods, Request, Response } from "./type";
2
+ import { EventEmitter } from "@ismael1361/utils";
3
+ /**
4
+ * @internal
5
+ * Representa uma camada interna do roteador, funcionando como uma coleção estruturada
6
+ * de definições de rotas e middlewares.
7
+ *
8
+ * Esta classe é o núcleo do sistema de roteamento, permitindo a construção de uma árvore
9
+ * de rotas aninhadas, onde middlewares de camadas superiores são aplicados às camadas inferiores.
10
+ * Ela não deve ser usada diretamente pelo consumidor da biblioteca.
11
+ */
12
+ export declare class Layer extends Array<ILayer> {
13
+ path: string;
14
+ doc: MiddlewareFCDoc;
15
+ private __event__;
16
+ /** @internal O índice da última camada adicionada. */
17
+ index: number;
18
+ /**
19
+ * @internal
20
+ * @param {string} [path=""] O prefixo de caminho para esta camada.
21
+ * @param {MiddlewareFCDoc} [doc={}] A documentação base para esta camada.
22
+ */
23
+ constructor(path?: string, doc?: MiddlewareFCDoc);
24
+ /**
25
+ * Adiciona um ouvinte para eventos internos da camada.
26
+ * @param {"add"} event O nome do evento. Atualmente, apenas 'add' é suportado.
27
+ * @param {(route: IRoute) => void} listener A função a ser chamada quando o evento é emitido.
28
+ */
29
+ addListener(event: "add", listener: (route: IRoute) => void): import("@ismael1361/utils").EventHandler;
30
+ /**
31
+ * Remove um ouvinte de eventos.
32
+ * @param {"add"} event O nome do evento.
33
+ * @param {(route: IRoute) => void} listener A função ouvinte a ser removida.
34
+ */
35
+ removeListener(event: "add", listener: (route: IRoute) => void): EventEmitter<{
36
+ add: [route: IRoute];
37
+ }>;
38
+ /**
39
+ * @internal
40
+ * Adiciona uma nova definição (camada) à pilha. Este é o método base usado por `get`, `post`, `middleware`, etc.
41
+ * Retorna um objeto semelhante a `this` com um getter/setter para a documentação da camada recém-adicionada.
42
+ */
43
+ pushPath(type: "layer" | "middleware", method: RouterMethods, path: string, handle: Array<HandlerFC | MiddlewareFC> | Layer, doc?: MiddlewareFCDoc): this;
44
+ /**
45
+ * Cria uma nova sub-camada (sub-roteador) aninhada dentro da camada atual.
46
+ * Permite agrupar rotas sob um prefixo de caminho comum.
47
+ *
48
+ * @returns {Layer} A nova instância de `Layer` que representa o sub-roteador.
49
+ */
50
+ route(path: string, route: Layer, doc?: MiddlewareFCDoc): Layer;
51
+ route(path: string, doc?: MiddlewareFCDoc): Layer;
52
+ route(route: Layer, doc?: MiddlewareFCDoc): Layer;
53
+ route(doc?: MiddlewareFCDoc): Layer;
54
+ /**
55
+ * @internal
56
+ * Fábrica estática para criar uma nova instância de `Layer`.
57
+ */
58
+ static route(path?: string, doc?: MiddlewareFCDoc): Layer;
59
+ /**
60
+ * Anexa uma instância de `Layer` (um roteador) existente a esta camada.
61
+ * É um método de conveniência para compor roteadores.
62
+ *
63
+ * @returns {this} A própria instância da camada para encadeamento.
64
+ */
65
+ by(route: Layer, doc?: MiddlewareFCDoc): this;
66
+ /** @internal */
67
+ by(path: string, route: Layer, doc?: MiddlewareFCDoc): this;
68
+ /**
69
+ * @internal
70
+ * Retorna uma representação da pilha de camadas para fins de depuração.
71
+ */
72
+ get stack(): ILayer[];
73
+ executeMiddlewares(request: Request, response: Response, next: NextFunction): Promise<any>;
74
+ /**
75
+ * Processa e achata a árvore de camadas em uma lista linear de rotas finais (`IRoute`).
76
+ * Este getter é fundamental, pois resolve os middlewares aninhados, aplica-os às rotas filhas
77
+ * e consolida os caminhos e a documentação.
78
+ */
79
+ get routes(): IRoute[];
80
+ /**
81
+ * @internal
82
+ * Adiciona um middleware a esta camada.
83
+ */
84
+ middleware(handle: Array<MiddlewareFC>, doc?: MiddlewareFCDoc): this;
85
+ /**
86
+ * @internal
87
+ * Adiciona uma rota do tipo GET.
88
+ */
89
+ get(path: string, handle: Array<HandlerFC | MiddlewareFC>, doc?: MiddlewareFCDoc): this;
90
+ /**
91
+ * @internal
92
+ * Adiciona uma rota do tipo POST.
93
+ */
94
+ post(path: string, handle: Array<HandlerFC | MiddlewareFC>, doc?: MiddlewareFCDoc): this;
95
+ /**
96
+ * @internal
97
+ * Adiciona uma rota do tipo PUT.
98
+ */
99
+ put(path: string, handle: Array<HandlerFC | MiddlewareFC>, doc?: MiddlewareFCDoc): this;
100
+ /**
101
+ * @internal
102
+ * Adiciona uma rota do tipo DELETE.
103
+ */
104
+ delete(path: string, handle: Array<HandlerFC | MiddlewareFC>, doc?: MiddlewareFCDoc): this;
105
+ /**
106
+ * @internal
107
+ * Adiciona uma rota do tipo PATCH.
108
+ */
109
+ patch(path: string, handle: Array<HandlerFC | MiddlewareFC>, doc?: MiddlewareFCDoc): this;
110
+ /**
111
+ * @internal
112
+ * Adiciona uma rota do tipo OPTIONS.
113
+ */
114
+ options(path: string, handle: Array<HandlerFC | MiddlewareFC>, doc?: MiddlewareFCDoc): this;
115
+ /**
116
+ * @internal
117
+ * Adiciona uma rota do tipo HEAD.
118
+ */
119
+ head(path: string, handle: Array<HandlerFC | MiddlewareFC>, doc?: MiddlewareFCDoc): this;
120
+ /**
121
+ * @internal
122
+ * Adiciona uma rota que corresponde a todos os métodos HTTP.
123
+ */
124
+ all(path: string, handle: Array<HandlerFC | MiddlewareFC>, doc?: MiddlewareFCDoc): this;
125
+ /**
126
+ * @internal
127
+ * Adiciona um middleware a um caminho específico.
128
+ */
129
+ use(path: string, handle: Array<HandlerFC | MiddlewareFC>, doc?: MiddlewareFCDoc): this;
130
+ }
131
+ //# sourceMappingURL=Layer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layer.d.ts","sourceRoot":"","sources":["../src/Layer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { MiddlewareFC, Request, Response } from "./type";
2
+ import { OptionsJson, Options, OptionsText, OptionsUrlencoded } from "body-parser";
3
+ /**
4
+ * Retorna um middleware que analisa corpos de requisição JSON.
5
+ * Este middleware é um wrapper em torno do `body-parser.json()`.
6
+ *
7
+ * @param {OptionsJson} [options] - Opções de configuração para o `body-parser`.
8
+ * @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
9
+ *
10
+ * @example
11
+ * import { create, Middlewares } from '@ismael1361/router';
12
+ *
13
+ * const app = create();
14
+ *
15
+ * // Aplica o middleware para analisar JSON em todas as rotas
16
+ * app.middleware(Middlewares.json());
17
+ *
18
+ * app.post('/data').handler((req, res) => {
19
+ * // req.body agora contém o objeto JSON enviado
20
+ * res.json({ received: req.body });
21
+ * });
22
+ */
23
+ export declare const json: (options?: OptionsJson | undefined) => MiddlewareFC<Request, Response>;
24
+ /**
25
+ * Retorna um middleware que analisa corpos de requisição como um Buffer.
26
+ * Este middleware é um wrapper em torno do `body-parser.raw()`.
27
+ *
28
+ * @param {Options} [options] - Opções de configuração para o `body-parser`.
29
+ * @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
30
+ *
31
+ * @example
32
+ * import { create, Middlewares } from '@ismael1361/router';
33
+ *
34
+ * const app = create();
35
+ *
36
+ * // Analisa corpos do tipo 'application/octet-stream' como Buffer
37
+ * app.middleware(Middlewares.raw({ type: 'application/octet-stream', limit: '10mb' }));
38
+ *
39
+ * app.post('/upload-raw').handler((req, res) => {
40
+ * // req.body é um Buffer com os dados brutos
41
+ * console.log('Buffer recebido:', req.body.length, 'bytes');
42
+ * res.send('Raw data received');
43
+ * });
44
+ */
45
+ export declare const raw: (options?: Options) => MiddlewareFC<Request, Response>;
46
+ /**
47
+ * Retorna um middleware que analisa corpos de requisição como texto.
48
+ * Este middleware é um wrapper em torno do `body-parser.text()`.
49
+ *
50
+ * @param {OptionsText} [options] - Opções de configuração para o `body-parser`.
51
+ * @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
52
+ *
53
+ * @example
54
+ * import { create, Middlewares } from '@ismael1361/router';
55
+ *
56
+ * const app = create();
57
+ *
58
+ * // Analisa corpos do tipo 'text/plain' como string
59
+ * app.middleware(Middlewares.text({ type: 'text/plain' }));
60
+ *
61
+ * app.post('/log').handler((req, res) => {
62
+ * // req.body é uma string com o conteúdo do corpo
63
+ * console.log('Log recebido:', req.body);
64
+ * res.send('Log received');
65
+ * });
66
+ */
67
+ export declare const text: (options?: OptionsText) => MiddlewareFC<Request, Response>;
68
+ /**
69
+ * Retorna um middleware que analisa corpos de requisição com o formato `application/x-www-form-urlencoded`.
70
+ * Este middleware é um wrapper em torno do `body-parser.urlencoded()`.
71
+ *
72
+ * @param {OptionsUrlencoded} [options] - Opções de configuração para o `body-parser`.
73
+ * @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
74
+ *
75
+ * @example
76
+ * import { create, Middlewares } from '@ismael1361/router';
77
+ *
78
+ * const app = create();
79
+ *
80
+ * // Aplica o middleware para analisar dados de formulário
81
+ * app.middleware(Middlewares.urlencoded({ extended: true }));
82
+ *
83
+ * app.post('/submit-form').handler((req, res) => {
84
+ * // req.body contém os dados do formulário
85
+ * res.json({ form_data: req.body });
86
+ * });
87
+ */
88
+ export declare const urlencoded: (options?: OptionsUrlencoded) => MiddlewareFC<Request, Response>;
89
+ //# sourceMappingURL=Middlewares.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Middlewares.d.ts","sourceRoot":"","sources":["../src/Middlewares.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAmB,EAAE,WAAW,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE/F;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,IAAI,GAAI,UAAU,WAAW,GAAG,SAAS,KAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAEtF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,GAAG,GAAI,UAAU,OAAO,KAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAErE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,IAAI,GAAI,UAAU,WAAW,KAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAE1E,CAAC;AAEF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,UAAU,GAAI,UAAU,iBAAiB,KAAG,YAAY,CAAC,OAAO,EAAE,QAAQ,CAEtF,CAAC"}
package/dist/handler.d.ts CHANGED
@@ -1,114 +1,113 @@
1
- import type { Request, Response, ExpressRouter, MiddlewareFC, RouterMethods, HandlerFC } from "./type";
1
+ import type { Request, Response, RouterProps, MiddlewareFC, RouterMethods, MiddlewareFCDoc, HandlerCallback, MiddlewareCallback, NextFunction } from "./type";
2
2
  import { RequestMiddleware } from "./middleware";
3
- import { RouterProps } from "./router";
3
+ import { Router } from "./router";
4
4
  /**
5
- * Encapsula um handler de rota final junto com uma cadeia de middlewares pré-configurados.
5
+ * Representa um construtor de rotas encadeável.
6
6
  *
7
- * Esta classe é útil para criar "controllers" ou "actions" reutilizáveis, onde a lógica do handler
8
- * depende de um conjunto específico de middlewares que devem ser executados antes dele.
9
- * Em vez de adicionar manualmente os mesmos middlewares a várias rotas, você pode agrupá-los
10
- * com o handler em uma única unidade.
7
+ * Esta classe não deve ser instanciada diretamente. Em vez disso, uma instância é retornada
8
+ * quando você chama um método de rota como `.get()`, `.post()`, etc., em uma instância de `Router`.
11
9
  *
12
- * @template Rq - O tipo de requisição (Request) esperado pelo handler final.
13
- * @template Rs - O tipo de resposta (Response) esperado pelo handler final.
10
+ * Ela permite encadear middlewares específicos para a rota e, finalmente, definir o manipulador
11
+ * da rota e sua documentação.
14
12
  *
15
13
  * @example
16
- * // 1. Definir um middleware que busca um usuário e o anexa à requisição.
17
- * interface UserRequest extends Request {
18
- * user: { id: number; name: string; };
19
- * }
20
- * const findUserByIdMiddleware: MiddlewareFC<UserRequest> = (req, res, next) => {
21
- * // Lógica para buscar o usuário pelo ID nos parâmetros da rota
22
- * const userId = parseInt(req.params.id, 10);
23
- * if (userId === 1) {
24
- * req.user = { id: 1, name: "John Doe" };
25
- * next();
26
- * } else {
27
- * res.status(404).send("User not found");
28
- * }
29
- * };
14
+ * const router = create();
30
15
  *
31
- * // 2. Definir o handler final que usa os dados do middleware.
32
- * const getUserProfileHandler: HandlerFC<UserRequest> = (req, res) => {
33
- * // `req.user` está disponível e tipado graças ao middleware.
34
- * res.json(req.user);
35
- * };
36
- *
37
- * // 3. Criar uma instância de `PreparedHandler` que agrupa o middleware e o handler.
38
- * const getUserProfileController = new PreparedHandler(
39
- * getUserProfileHandler,
40
- * [findUserByIdMiddleware]
41
- * );
42
- *
43
- * // 4. Usar o controller pré-preparado em uma definição de rota.
44
- * // O `router` automaticamente aplicará `findUserByIdMiddleware` antes de `getUserProfileHandler`.
45
- * router.get("/users/:id").handler(getUserProfileController);
46
- */
47
- export declare class PreparedHandler<Rq extends Request = Request, Rs extends Response = Response> extends RequestMiddleware<Rq, Rs> {
48
- readonly callback: HandlerFC<Rq, Rs>;
49
- constructor(callback: HandlerFC<Rq, Rs>, middlewares?: MiddlewareFC<any, any>[]);
50
- }
51
- /**
52
- * Construtor de rotas que permite o encadeamento de middlewares antes do handler final.
53
- * Esta classe é a parte central da API fluente para definir rotas (ex: `router.get(...).middleware(...).handler(...)`).
54
- * Ela herda da classe `RequestMiddleware` para acumular middlewares e seus tipos associados.
55
- *
56
- * @template Rq - O tipo de requisição (Request) acumulado a partir dos middlewares anteriores.
57
- * @template Rs - O tipo de resposta (Response) acumulado a partir dos middlewares anteriores.
58
- *
59
- * @example
60
- * // Exemplo de como a classe Handler é usada internamente pelo RouterContext.
61
- *
62
- * // 1. RequestMiddleware de autenticação que adiciona `userId` à requisição.
63
- * interface AuthRequest extends Request { userId: number; }
64
- * const authMiddleware: MiddlewareFC<AuthRequest> = (req, res, next) => {
65
- * req.userId = 123; // Simula a autenticação
66
- * next();
67
- * };
68
- *
69
- * // 2. Criação da rota usando a API fluente.
70
- * // router.get() retorna uma instância de Handler.
71
- * router
72
- * .get("/users/me")
73
- * // .middleware() retorna uma nova instância de Handler com o middleware adicionado.
74
- * .middleware(authMiddleware)
75
- * // .handler() finaliza a cadeia, registrando a rota e o handler no Express.
16
+ * // A chamada a `router.post()` retorna uma instância de RequestHandler.
17
+ * router.post('/users')
18
+ * // .middleware() aplica um middleware apenas a esta rota.
19
+ * .middleware(validationMiddleware)
20
+ * // .handler() define o controlador final da rota.
76
21
  * .handler((req, res) => {
77
- * // Graças à tipagem encadeada, `req.userId` está disponível e é do tipo `number`.
78
- * const userId = req.userId;
79
- * res.json({ id: userId, name: "Usuário Logado" });
22
+ * res.status(201).json({ id: 1, ...req.body });
23
+ * })
24
+ * // .doc() anexa a documentação OpenAPI ao endpoint finalizado.
25
+ * .doc({
26
+ * summary: 'Cria um novo usuário',
27
+ * tags: ['Users'],
28
+ * body: { description: 'Dados do usuário' }
80
29
  * });
81
30
  */
82
31
  export declare class RequestHandler<Rq extends Request = Request, Rs extends Response = Response> extends RequestMiddleware<Rq, Rs> {
83
- readonly router: ExpressRouter;
32
+ readonly router: Router;
84
33
  readonly type: RouterMethods;
85
34
  readonly path: string;
86
- readonly hierarchicalMiddleware: MiddlewareFC<any, any>[];
35
+ doc?: MiddlewareFCDoc | undefined;
36
+ readonly middlewares: MiddlewareFC<any, any>[];
37
+ /** @internal */
38
+ constructor(router: Router, type: RouterMethods, path: string, doc?: MiddlewareFCDoc | undefined);
87
39
  /**
88
- * @param {ExpressRouter} router - A instância do roteador Express onde a rota será registrada.
89
- * @param {RouterMethods} type - O método HTTP da rota (get, post, etc.).
90
- * @param {string} path - O padrão de caminho da rota.
91
- * @param {MiddlewareFC<any, any>[]} [middlewares=[]] - Uma lista inicial de middlewares.
40
+ * Anexa um middleware que será executado especificamente para esta rota.
41
+ * Múltiplos middlewares podem ser encadeados.
42
+ *
43
+ * @template Req - Tipo de Request estendido pelo middleware.
44
+ * @template Res - Tipo de Response estendido pelo middleware.
45
+ * @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função de middleware a ser aplicada.
46
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este middleware.
47
+ * @returns {RequestHandler<Rq & Req, Rs & Res>} A mesma instância de `RequestHandler` para permitir encadeamento.
92
48
  */
93
- constructor(router: ExpressRouter, type: RouterMethods, path: string, middlewares?: MiddlewareFC<any, any>[], hierarchicalMiddleware?: MiddlewareFC<any, any>[]);
49
+ middleware<Req extends Request = Request, Res extends Response = Response>(callback: MiddlewareCallback<Rq & Req, Rs & Res>, doc?: MiddlewareFCDoc): RequestHandler<Rq & Req, Rs & Res>;
94
50
  /**
95
- * Adiciona um middleware à cadeia de execução da rota atual.
96
- * @template Req - O tipo que o novo middleware adiciona à requisição.
97
- * @template Res - O tipo que o novo middleware adiciona à resposta.
98
- * @param {MiddlewareFC<Rq & Req, Rs & Res>} callback - A função de middleware a ser adicionada.
99
- * @returns {RequestHandler<Rq & Req, Rs & Res>} Uma nova instância de `RequestHandler` para permitir mais encadeamento.
51
+ * Define a função de manipulador (controller) final para a rota.
52
+ * Esta chamada finaliza a cadeia de middlewares e registra a rota no roteador.
53
+ *
54
+ * @template Req - Tipo de Request estendido pelo manipulador.
55
+ * @template Res - Tipo de Response estendido pelo manipulador.
56
+ * @param {HandlerCallback<Rq & Req, Rs & Res>} callback - A função que processará a requisição.
57
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este manipulador.
58
+ * @returns {RouterProps} Um objeto que contém as propriedades da rota e um método `.doc()` para adicionar a documentação final.
100
59
  */
101
- middleware<Req extends Request = Request, Res extends Response = Response>(callback: MiddlewareFC<Rq & Req, Rs & Res>): RequestHandler<Rq & Req, Rs & Res>;
60
+ handler<Req extends Request = Request, Res extends Response = Response>(callback: HandlerCallback<Rq & Req, Rs & Res>, doc?: MiddlewareFCDoc): RouterProps;
61
+ }
62
+ /**
63
+ * Cria um componente de manipulador (handler) reutilizável.
64
+ *
65
+ * Esta classe encapsula uma função de manipulador, permitindo que ela seja combinada
66
+ * com outros middlewares e reutilizada em diferentes rotas.
67
+ *
68
+ * @example
69
+ * // handler.ts
70
+ * export const getUserProfile = handler<{ user: { id: string } }>((req, res) => {
71
+ * res.json({ user: req.user });
72
+ * });
73
+ *
74
+ * // routes.ts
75
+ * router.get('/profile')
76
+ * .middleware(authMiddleware) // Adiciona `req.user`
77
+ * .handler(getUserProfile); // Reutiliza o handler
78
+ */
79
+ export declare class Handler<Rq extends Request = Request, Rs extends Response = Response> {
80
+ readonly router: Router;
81
+ doc?: MiddlewareFCDoc | undefined;
82
+ /** @internal */
83
+ constructor(callback: HandlerCallback<Rq, Rs> | undefined, router?: Router, doc?: MiddlewareFCDoc | undefined);
102
84
  /**
103
- * Define o handler final para a rota, completando a cadeia de configuração.
104
- * Este método registra a rota no roteador Express, aplicando todos os middlewares
105
- * que foram encadeados anteriormente.
85
+ * Executa a cadeia de middlewares e o manipulador final encapsulados por esta instância de `Handler`.
86
+ * Este método é útil para testes unitários ou para invocar programaticamente a lógica do handler
87
+ * fora do ciclo de requisição/resposta padrão do Express.
88
+ *
89
+ * @param {Rq} request - O objeto de requisição (ou um mock dele).
90
+ * @param {Rs} response - O objeto de resposta (ou um mock dele).
91
+ * @param {NextFunction} next - A função `next` a ser chamada ao final da cadeia.
92
+ * @returns {Promise<void>} Uma promessa que resolve quando a execução da cadeia é concluída.
93
+ *
94
+ * @example
95
+ * import { handler, Request, Response, NextFunction } from '@ismael1361/router';
96
+ *
97
+ * // 1. Crie um handler reutilizável
98
+ * const myHandler = handler<{ user: { id: string } }>((req, res) => {
99
+ * res.json({ userId: req.user.id });
100
+ * });
101
+ *
102
+ * // 2. Crie mocks para os objetos de requisição e resposta (ex: com Jest)
103
+ * const mockRequest = { user: { id: '123' } } as Request & { user: { id: string } };
104
+ * const mockResponse = { json: (data) => console.log(data) } as Response;
105
+ * const mockNext = () => {};
106
106
  *
107
- * @template Req - Tipos de requisição adicionais inferidos a partir do handler.
108
- * @template Res - Tipos de resposta adicionais inferidos a partir do handler.
109
- * @param {HandlerFC<Rq & Req, Rs & Res> | PreparedHandler<Rq & Req, Rs & Res>} callback - A função que processará a requisição. Pode ser uma função de handler (`HandlerFC`) ou uma instância de `PreparedHandler` que já encapsula um handler e seus próprios middlewares.
110
- * @returns {RouterProps} Uma instância que permite adicionar metadados, como documentação Swagger, à rota.
107
+ * // 3. Execute o handler programaticamente
108
+ * await myHandler.execute(mockRequest, mockResponse, mockNext);
109
+ * // Output: { userId: '123' }
111
110
  */
112
- handler<Req extends Request = Request, Res extends Response = Response>(callback: HandlerFC<Rq & Req, Rs & Res>): RouterProps;
111
+ execute(request: Rq, response: Rs, next: NextFunction): Promise<any>;
113
112
  }
114
113
  //# sourceMappingURL=handler.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEvG,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,qBAAa,eAAe,CAAC,EAAE,SAAS,OAAO,GAAG,OAAO,EAAE,EAAE,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC;aAC/F,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;gBAA3B,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,GAAE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAO;CAGnG;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,cAAc,CAAC,EAAE,SAAS,OAAO,GAAG,OAAO,EAAE,EAAE,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC;aAQzG,MAAM,EAAE,aAAa;aACrB,IAAI,EAAE,aAAa;aACnB,IAAI,EAAE,MAAM;aAEZ,sBAAsB,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE;IAXjE;;;;;OAKG;gBAEc,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,aAAa,EACnB,IAAI,EAAE,MAAM,EAC5B,WAAW,GAAE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAO,EAC1B,sBAAsB,GAAE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAO;IAKtE;;;;;;OAMG;IACH,UAAU,CAAC,GAAG,SAAS,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,QAAQ,GAAG,QAAQ,EAAE,QAAQ,EAAE,YAAY,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,cAAc,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC;IAI1J;;;;;;;;;OASG;IACH,OAAO,CAAC,GAAG,SAAS,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,QAAQ,GAAG,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,GAAG,WAAW;CAW7H"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAa,eAAe,EAAE,eAAe,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEzK,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAIlC;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,cAAc,CAAC,EAAE,SAAS,OAAO,GAAG,OAAO,EAAE,EAAE,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,iBAAiB,CAAC,EAAE,EAAE,EAAE,CAAC;aAI9F,MAAM,EAAE,MAAM;aAAkB,IAAI,EAAE,aAAa;aAAkB,IAAI,EAAE,MAAM;IAAS,GAAG,CAAC,EAAE,eAAe;IAH3I,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAM;IAEpD,gBAAgB;gBACY,MAAM,EAAE,MAAM,EAAkB,IAAI,EAAE,aAAa,EAAkB,IAAI,EAAE,MAAM,EAAS,GAAG,CAAC,EAAE,eAAe,YAAA;IAI3I;;;;;;;;;OASG;IACH,UAAU,CAAC,GAAG,SAAS,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,QAAQ,GAAG,QAAQ,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,cAAc,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC;IAevL;;;;;;;;;OASG;IACH,OAAO,CAAC,GAAG,SAAS,OAAO,GAAG,OAAO,EAAE,GAAG,SAAS,QAAQ,GAAG,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAC,EAAE,GAAG,GAAG,EAAE,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,eAAe,GAAG,WAAW;CAyB1J;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,OAAO,CAAC,EAAE,SAAS,OAAO,GAAG,OAAO,EAAE,EAAE,SAAS,QAAQ,GAAG,QAAQ;IAErB,QAAQ,CAAC,MAAM,EAAE,MAAM;IAAwB,GAAG,CAAC,EAAE,eAAe;IAD/H,gBAAgB;gBACJ,QAAQ,EAAE,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,SAAS,EAAW,MAAM,GAAE,MAAqB,EAAS,GAAG,CAAC,EAAE,eAAe,YAAA;IAc/H;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,IAAI,EAAE,YAAY;CAGrD"}