@ismael1361/router 1.1.0 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/HandleError.esm.js +127 -0
  2. package/dist/HandleError.esm.js.map +1 -0
  3. package/dist/HandleError.js +129 -0
  4. package/dist/HandleError.js.map +1 -0
  5. package/dist/Layer.esm.js +251 -0
  6. package/dist/Layer.esm.js.map +1 -0
  7. package/dist/Layer.js +253 -0
  8. package/dist/Layer.js.map +1 -0
  9. package/dist/Middlewares.esm.js +188 -0
  10. package/dist/Middlewares.esm.js.map +1 -0
  11. package/dist/Middlewares.js +195 -0
  12. package/dist/Middlewares.js.map +1 -0
  13. package/dist/handler.esm.js +171 -0
  14. package/dist/handler.esm.js.map +1 -0
  15. package/dist/handler.js +174 -0
  16. package/dist/handler.js.map +1 -0
  17. package/dist/index.esm.js +141 -1
  18. package/dist/index.esm.js.map +1 -1
  19. package/dist/index.js +152 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/middleware.esm.js +152 -0
  22. package/dist/middleware.esm.js.map +1 -0
  23. package/dist/middleware.js +155 -0
  24. package/dist/middleware.js.map +1 -0
  25. package/dist/node_modules/tslib/tslib.es6.esm.js +46 -0
  26. package/dist/node_modules/tslib/tslib.es6.esm.js.map +1 -0
  27. package/dist/node_modules/tslib/tslib.es6.js +49 -0
  28. package/dist/node_modules/tslib/tslib.es6.js.map +1 -0
  29. package/dist/redocUi/index.esm.js +75 -0
  30. package/dist/redocUi/index.esm.js.map +1 -0
  31. package/dist/redocUi/index.js +77 -0
  32. package/dist/redocUi/index.js.map +1 -0
  33. package/dist/router.esm.js +435 -0
  34. package/dist/router.esm.js.map +1 -0
  35. package/dist/router.js +437 -0
  36. package/dist/router.js.map +1 -0
  37. package/dist/swagger-markdown/index.esm.js +129 -0
  38. package/dist/swagger-markdown/index.esm.js.map +1 -0
  39. package/dist/swagger-markdown/index.js +135 -0
  40. package/dist/swagger-markdown/index.js.map +1 -0
  41. package/dist/swagger-markdown/lib/anchor.esm.js +7 -0
  42. package/dist/swagger-markdown/lib/anchor.esm.js.map +1 -0
  43. package/dist/swagger-markdown/lib/anchor.js +9 -0
  44. package/dist/swagger-markdown/lib/anchor.js.map +1 -0
  45. package/dist/swagger-markdown/lib/inArray.esm.js +21 -0
  46. package/dist/swagger-markdown/lib/inArray.esm.js.map +1 -0
  47. package/dist/swagger-markdown/lib/inArray.js +23 -0
  48. package/dist/swagger-markdown/lib/inArray.js.map +1 -0
  49. package/dist/swagger-markdown/models/schema.esm.js +65 -0
  50. package/dist/swagger-markdown/models/schema.esm.js.map +1 -0
  51. package/dist/swagger-markdown/models/schema.js +67 -0
  52. package/dist/swagger-markdown/models/schema.js.map +1 -0
  53. package/dist/swagger-markdown/transformers/contact.esm.js +24 -0
  54. package/dist/swagger-markdown/transformers/contact.esm.js.map +1 -0
  55. package/dist/swagger-markdown/transformers/contact.js +26 -0
  56. package/dist/swagger-markdown/transformers/contact.js.map +1 -0
  57. package/dist/swagger-markdown/transformers/dataTypes.esm.js +60 -0
  58. package/dist/swagger-markdown/transformers/dataTypes.esm.js.map +1 -0
  59. package/dist/swagger-markdown/transformers/dataTypes.js +62 -0
  60. package/dist/swagger-markdown/transformers/dataTypes.js.map +1 -0
  61. package/dist/swagger-markdown/transformers/definitions.esm.js +76 -0
  62. package/dist/swagger-markdown/transformers/definitions.esm.js.map +1 -0
  63. package/dist/swagger-markdown/transformers/definitions.js +81 -0
  64. package/dist/swagger-markdown/transformers/definitions.js.map +1 -0
  65. package/dist/swagger-markdown/transformers/externalDocs.esm.js +14 -0
  66. package/dist/swagger-markdown/transformers/externalDocs.esm.js.map +1 -0
  67. package/dist/swagger-markdown/transformers/externalDocs.js +16 -0
  68. package/dist/swagger-markdown/transformers/externalDocs.js.map +1 -0
  69. package/dist/swagger-markdown/transformers/info.esm.js +37 -0
  70. package/dist/swagger-markdown/transformers/info.esm.js.map +1 -0
  71. package/dist/swagger-markdown/transformers/info.js +39 -0
  72. package/dist/swagger-markdown/transformers/info.js.map +1 -0
  73. package/dist/swagger-markdown/transformers/license.esm.js +21 -0
  74. package/dist/swagger-markdown/transformers/license.esm.js.map +1 -0
  75. package/dist/swagger-markdown/transformers/license.js +23 -0
  76. package/dist/swagger-markdown/transformers/license.js.map +1 -0
  77. package/dist/swagger-markdown/transformers/path.esm.js +72 -0
  78. package/dist/swagger-markdown/transformers/path.esm.js.map +1 -0
  79. package/dist/swagger-markdown/transformers/path.js +77 -0
  80. package/dist/swagger-markdown/transformers/path.js.map +1 -0
  81. package/dist/swagger-markdown/transformers/pathParameters.esm.js +63 -0
  82. package/dist/swagger-markdown/transformers/pathParameters.esm.js.map +1 -0
  83. package/dist/swagger-markdown/transformers/pathParameters.js +65 -0
  84. package/dist/swagger-markdown/transformers/pathParameters.js.map +1 -0
  85. package/dist/swagger-markdown/transformers/pathResponses.esm.js +46 -0
  86. package/dist/swagger-markdown/transformers/pathResponses.esm.js.map +1 -0
  87. package/dist/swagger-markdown/transformers/pathResponses.js +48 -0
  88. package/dist/swagger-markdown/transformers/pathResponses.js.map +1 -0
  89. package/dist/swagger-markdown/transformers/security.esm.js +42 -0
  90. package/dist/swagger-markdown/transformers/security.esm.js.map +1 -0
  91. package/dist/swagger-markdown/transformers/security.js +44 -0
  92. package/dist/swagger-markdown/transformers/security.js.map +1 -0
  93. package/dist/swagger-markdown/transformers/securityDefinitions.esm.js +52 -0
  94. package/dist/swagger-markdown/transformers/securityDefinitions.esm.js.map +1 -0
  95. package/dist/swagger-markdown/transformers/securityDefinitions.js +58 -0
  96. package/dist/swagger-markdown/transformers/securityDefinitions.js.map +1 -0
  97. package/dist/utils.esm.js +245 -0
  98. package/dist/utils.esm.js.map +1 -0
  99. package/dist/utils.js +257 -0
  100. package/dist/utils.js.map +1 -0
  101. package/package.json +2 -2
@@ -0,0 +1,171 @@
1
+ import { __rest } from './node_modules/tslib/tslib.es6.esm.js';
2
+ import { joinDocs, createDynamicMiddleware, joinObject } from './utils.esm.js';
3
+ import { RequestMiddleware } from './middleware.esm.js';
4
+ import { Router } from './router.esm.js';
5
+ import { uuidv4 } from '@ismael1361/utils';
6
+
7
+ /**
8
+ * Representa um construtor de rotas encadeável.
9
+ *
10
+ * Esta classe não deve ser instanciada diretamente. Em vez disso, uma instância é retornada
11
+ * quando você chama um método de rota como `.get()`, `.post()`, etc., em uma instância de `Router`.
12
+ *
13
+ * Ela permite encadear middlewares específicos para a rota e, finalmente, definir o manipulador
14
+ * da rota e sua documentação.
15
+ *
16
+ * @example
17
+ * const router = create();
18
+ *
19
+ * // A chamada a `router.post()` retorna uma instância de RequestHandler.
20
+ * router.post('/users')
21
+ * // .middleware() aplica um middleware apenas a esta rota.
22
+ * .middleware(validationMiddleware)
23
+ * // .handler() define o controlador final da rota.
24
+ * .handler((req, res) => {
25
+ * res.status(201).json({ id: 1, ...req.body });
26
+ * })
27
+ * // .doc() anexa a documentação OpenAPI ao endpoint finalizado.
28
+ * .doc({
29
+ * summary: 'Cria um novo usuário',
30
+ * tags: ['Users'],
31
+ * body: { description: 'Dados do usuário' }
32
+ * });
33
+ */
34
+ class RequestHandler extends RequestMiddleware {
35
+ /** @internal */
36
+ constructor(router, type, path, doc) {
37
+ super(undefined, router);
38
+ this.router = router;
39
+ this.type = type;
40
+ this.path = path;
41
+ this.doc = doc;
42
+ this.middlewares = [];
43
+ }
44
+ /**
45
+ * Anexa um middleware que será executado especificamente para esta rota.
46
+ * Múltiplos middlewares podem ser encadeados.
47
+ *
48
+ * @template Req - Tipo de Request estendido pelo middleware.
49
+ * @template Res - Tipo de Response estendido pelo middleware.
50
+ * @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função de middleware a ser aplicada.
51
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este middleware.
52
+ * @returns {RequestHandler<Rq & Req, Rs & Res>} A mesma instância de `RequestHandler` para permitir encadeamento.
53
+ */
54
+ middleware(callback, doc) {
55
+ if (callback instanceof RequestMiddleware) {
56
+ callback.router.layers
57
+ .filter(({ type, handle }) => type === "middleware" && !!handle)
58
+ .map(({ handle }) => handle)
59
+ .forEach((handle) => this.middlewares.push(...handle));
60
+ }
61
+ else {
62
+ this.middlewares.push(createDynamicMiddleware(callback));
63
+ }
64
+ if (doc) {
65
+ this.doc = joinDocs(this.doc || {}, doc);
66
+ }
67
+ return this;
68
+ }
69
+ /**
70
+ * Define a função de manipulador (controller) final para a rota.
71
+ * Esta chamada finaliza a cadeia de middlewares e registra a rota no roteador.
72
+ *
73
+ * @template Req - Tipo de Request estendido pelo manipulador.
74
+ * @template Res - Tipo de Response estendido pelo manipulador.
75
+ * @param {HandlerCallback<Rq & Req, Rs & Res>} callback - A função que processará a requisição.
76
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este manipulador.
77
+ * @returns {RouterProps} Um objeto que contém as propriedades da rota e um método `.doc()` para adicionar a documentação final.
78
+ */
79
+ handler(callback, doc) {
80
+ if (callback instanceof Handler) {
81
+ callback.router.layers
82
+ .filter(({ type, handle }) => type === "middleware" && !!handle)
83
+ .map(({ handle }) => handle)
84
+ .forEach((handle) => this.middlewares.push(...handle));
85
+ }
86
+ else {
87
+ this.middlewares.push(createDynamicMiddleware(callback));
88
+ }
89
+ const route = this.router.layers[this.type](this.path, this.middlewares, joinDocs(this.doc || {}, doc || {}));
90
+ return {
91
+ type: this.type,
92
+ path: this.path,
93
+ middlewares: this.middlewares,
94
+ handler: this.middlewares.length > 0 ? this.middlewares[this.middlewares.length - 1] : undefined,
95
+ doc(operation, components = {}) {
96
+ const { components: comp = {} } = operation, op = __rest(operation, ["components"]);
97
+ route.doc = joinDocs(route.doc, Object.assign(Object.assign({}, op), { components: joinObject(comp, components) }));
98
+ return this;
99
+ },
100
+ };
101
+ }
102
+ }
103
+ /**
104
+ * Cria um componente de manipulador (handler) reutilizável.
105
+ *
106
+ * Esta classe encapsula uma função de manipulador, permitindo que ela seja combinada
107
+ * com outros middlewares e reutilizada em diferentes rotas.
108
+ *
109
+ * @example
110
+ * // handler.ts
111
+ * export const getUserProfile = handler<{ user: { id: string } }>((req, res) => {
112
+ * res.json({ user: req.user });
113
+ * });
114
+ *
115
+ * // routes.ts
116
+ * router.get('/profile')
117
+ * .middleware(authMiddleware) // Adiciona `req.user`
118
+ * .handler(getUserProfile); // Reutiliza o handler
119
+ */
120
+ class Handler {
121
+ /** @internal */
122
+ constructor(callback, router = new Router(), doc) {
123
+ this.router = router;
124
+ this.doc = doc;
125
+ if (callback) {
126
+ if (callback instanceof Handler) {
127
+ callback.router.layers.forEach((l) => {
128
+ this.router.layers.push(l);
129
+ });
130
+ }
131
+ else {
132
+ callback.id = callback.id || uuidv4("-");
133
+ callback.doc = joinDocs((callback === null || callback === void 0 ? void 0 : callback.doc) || {}, doc || {});
134
+ this.router.middleware(createDynamicMiddleware(callback));
135
+ }
136
+ }
137
+ }
138
+ /**
139
+ * Executa a cadeia de middlewares e o manipulador final encapsulados por esta instância de `Handler`.
140
+ * Este método é útil para testes unitários ou para invocar programaticamente a lógica do handler
141
+ * fora do ciclo de requisição/resposta padrão do Express.
142
+ *
143
+ * @param {Rq} request - O objeto de requisição (ou um mock dele).
144
+ * @param {Rs} response - O objeto de resposta (ou um mock dele).
145
+ * @param {NextFunction} next - A função `next` a ser chamada ao final da cadeia.
146
+ * @returns {Promise<void>} Uma promessa que resolve quando a execução da cadeia é concluída.
147
+ *
148
+ * @example
149
+ * import { handler, Request, Response, NextFunction } from '@ismael1361/router';
150
+ *
151
+ * // 1. Crie um handler reutilizável
152
+ * const myHandler = handler<{ user: { id: string } }>((req, res) => {
153
+ * res.json({ userId: req.user.id });
154
+ * });
155
+ *
156
+ * // 2. Crie mocks para os objetos de requisição e resposta (ex: com Jest)
157
+ * const mockRequest = { user: { id: '123' } } as Request & { user: { id: string } };
158
+ * const mockResponse = { json: (data) => console.log(data) } as Response;
159
+ * const mockNext = () => {};
160
+ *
161
+ * // 3. Execute o handler programaticamente
162
+ * await myHandler.execute(mockRequest, mockResponse, mockNext);
163
+ * // Output: { userId: '123' }
164
+ */
165
+ execute(request, response, next) {
166
+ return this.router.executeMiddlewares(request, response, next);
167
+ }
168
+ }
169
+
170
+ export { Handler, RequestHandler };
171
+ //# sourceMappingURL=handler.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.esm.js","sources":["../src/handler.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,174 @@
1
+ 'use strict';
2
+
3
+ var tslib_es6 = require('./node_modules/tslib/tslib.es6.js');
4
+ var utils$1 = require('./utils.js');
5
+ var middleware = require('./middleware.js');
6
+ var router = require('./router.js');
7
+ var utils = require('@ismael1361/utils');
8
+
9
+ /**
10
+ * Representa um construtor de rotas encadeável.
11
+ *
12
+ * Esta classe não deve ser instanciada diretamente. Em vez disso, uma instância é retornada
13
+ * quando você chama um método de rota como `.get()`, `.post()`, etc., em uma instância de `Router`.
14
+ *
15
+ * Ela permite encadear middlewares específicos para a rota e, finalmente, definir o manipulador
16
+ * da rota e sua documentação.
17
+ *
18
+ * @example
19
+ * const router = create();
20
+ *
21
+ * // A chamada a `router.post()` retorna uma instância de RequestHandler.
22
+ * router.post('/users')
23
+ * // .middleware() aplica um middleware apenas a esta rota.
24
+ * .middleware(validationMiddleware)
25
+ * // .handler() define o controlador final da rota.
26
+ * .handler((req, res) => {
27
+ * res.status(201).json({ id: 1, ...req.body });
28
+ * })
29
+ * // .doc() anexa a documentação OpenAPI ao endpoint finalizado.
30
+ * .doc({
31
+ * summary: 'Cria um novo usuário',
32
+ * tags: ['Users'],
33
+ * body: { description: 'Dados do usuário' }
34
+ * });
35
+ */
36
+ class RequestHandler extends middleware.RequestMiddleware {
37
+ /** @internal */
38
+ constructor(router, type, path, doc) {
39
+ super(undefined, router);
40
+ this.router = router;
41
+ this.type = type;
42
+ this.path = path;
43
+ this.doc = doc;
44
+ this.middlewares = [];
45
+ }
46
+ /**
47
+ * Anexa um middleware que será executado especificamente para esta rota.
48
+ * Múltiplos middlewares podem ser encadeados.
49
+ *
50
+ * @template Req - Tipo de Request estendido pelo middleware.
51
+ * @template Res - Tipo de Response estendido pelo middleware.
52
+ * @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função de middleware a ser aplicada.
53
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este middleware.
54
+ * @returns {RequestHandler<Rq & Req, Rs & Res>} A mesma instância de `RequestHandler` para permitir encadeamento.
55
+ */
56
+ middleware(callback, doc) {
57
+ if (callback instanceof middleware.RequestMiddleware) {
58
+ callback.router.layers
59
+ .filter(({ type, handle }) => type === "middleware" && !!handle)
60
+ .map(({ handle }) => handle)
61
+ .forEach((handle) => this.middlewares.push(...handle));
62
+ }
63
+ else {
64
+ this.middlewares.push(utils$1.createDynamicMiddleware(callback));
65
+ }
66
+ if (doc) {
67
+ this.doc = utils$1.joinDocs(this.doc || {}, doc);
68
+ }
69
+ return this;
70
+ }
71
+ /**
72
+ * Define a função de manipulador (controller) final para a rota.
73
+ * Esta chamada finaliza a cadeia de middlewares e registra a rota no roteador.
74
+ *
75
+ * @template Req - Tipo de Request estendido pelo manipulador.
76
+ * @template Res - Tipo de Response estendido pelo manipulador.
77
+ * @param {HandlerCallback<Rq & Req, Rs & Res>} callback - A função que processará a requisição.
78
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este manipulador.
79
+ * @returns {RouterProps} Um objeto que contém as propriedades da rota e um método `.doc()` para adicionar a documentação final.
80
+ */
81
+ handler(callback, doc) {
82
+ if (callback instanceof Handler) {
83
+ callback.router.layers
84
+ .filter(({ type, handle }) => type === "middleware" && !!handle)
85
+ .map(({ handle }) => handle)
86
+ .forEach((handle) => this.middlewares.push(...handle));
87
+ }
88
+ else {
89
+ this.middlewares.push(utils$1.createDynamicMiddleware(callback));
90
+ }
91
+ const route = this.router.layers[this.type](this.path, this.middlewares, utils$1.joinDocs(this.doc || {}, doc || {}));
92
+ return {
93
+ type: this.type,
94
+ path: this.path,
95
+ middlewares: this.middlewares,
96
+ handler: this.middlewares.length > 0 ? this.middlewares[this.middlewares.length - 1] : undefined,
97
+ doc(operation, components = {}) {
98
+ const { components: comp = {} } = operation, op = tslib_es6.__rest(operation, ["components"]);
99
+ route.doc = utils$1.joinDocs(route.doc, Object.assign(Object.assign({}, op), { components: utils$1.joinObject(comp, components) }));
100
+ return this;
101
+ },
102
+ };
103
+ }
104
+ }
105
+ /**
106
+ * Cria um componente de manipulador (handler) reutilizável.
107
+ *
108
+ * Esta classe encapsula uma função de manipulador, permitindo que ela seja combinada
109
+ * com outros middlewares e reutilizada em diferentes rotas.
110
+ *
111
+ * @example
112
+ * // handler.ts
113
+ * export const getUserProfile = handler<{ user: { id: string } }>((req, res) => {
114
+ * res.json({ user: req.user });
115
+ * });
116
+ *
117
+ * // routes.ts
118
+ * router.get('/profile')
119
+ * .middleware(authMiddleware) // Adiciona `req.user`
120
+ * .handler(getUserProfile); // Reutiliza o handler
121
+ */
122
+ class Handler {
123
+ /** @internal */
124
+ constructor(callback, router$1 = new router.Router(), doc) {
125
+ this.router = router$1;
126
+ this.doc = doc;
127
+ if (callback) {
128
+ if (callback instanceof Handler) {
129
+ callback.router.layers.forEach((l) => {
130
+ this.router.layers.push(l);
131
+ });
132
+ }
133
+ else {
134
+ callback.id = callback.id || utils.uuidv4("-");
135
+ callback.doc = utils$1.joinDocs((callback === null || callback === void 0 ? void 0 : callback.doc) || {}, doc || {});
136
+ this.router.middleware(utils$1.createDynamicMiddleware(callback));
137
+ }
138
+ }
139
+ }
140
+ /**
141
+ * Executa a cadeia de middlewares e o manipulador final encapsulados por esta instância de `Handler`.
142
+ * Este método é útil para testes unitários ou para invocar programaticamente a lógica do handler
143
+ * fora do ciclo de requisição/resposta padrão do Express.
144
+ *
145
+ * @param {Rq} request - O objeto de requisição (ou um mock dele).
146
+ * @param {Rs} response - O objeto de resposta (ou um mock dele).
147
+ * @param {NextFunction} next - A função `next` a ser chamada ao final da cadeia.
148
+ * @returns {Promise<void>} Uma promessa que resolve quando a execução da cadeia é concluída.
149
+ *
150
+ * @example
151
+ * import { handler, Request, Response, NextFunction } from '@ismael1361/router';
152
+ *
153
+ * // 1. Crie um handler reutilizável
154
+ * const myHandler = handler<{ user: { id: string } }>((req, res) => {
155
+ * res.json({ userId: req.user.id });
156
+ * });
157
+ *
158
+ * // 2. Crie mocks para os objetos de requisição e resposta (ex: com Jest)
159
+ * const mockRequest = { user: { id: '123' } } as Request & { user: { id: string } };
160
+ * const mockResponse = { json: (data) => console.log(data) } as Response;
161
+ * const mockNext = () => {};
162
+ *
163
+ * // 3. Execute o handler programaticamente
164
+ * await myHandler.execute(mockRequest, mockResponse, mockNext);
165
+ * // Output: { userId: '123' }
166
+ */
167
+ execute(request, response, next) {
168
+ return this.router.executeMiddlewares(request, response, next);
169
+ }
170
+ }
171
+
172
+ exports.Handler = Handler;
173
+ exports.RequestHandler = RequestHandler;
174
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sources":["../src/handler.ts"],"sourcesContent":[null],"names":["RequestMiddleware","createDynamicMiddleware","joinDocs","__rest","joinObject","router","Router","uuidv4"],"mappings":"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"}
package/dist/index.esm.js CHANGED
@@ -1,2 +1,142 @@
1
- import e from"swagger-jsdoc";import t from"fs";import{deepEqual as n,uuidv4 as r,EventEmitter as s}from"@ismael1361/utils";import i from"path";import o from"express";import a from"swagger-ui-express";import p from"openapi-snippet";import{Readable as h}from"stream";import u from"body-parser";function c(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(r=Object.getOwnPropertySymbols(e);s<r.length;s++)t.indexOf(r[s])<0&&Object.prototype.propertyIsEnumerable.call(e,r[s])&&(n[r[s]]=e[r[s]])}return n}function l(e,t,n,r){return new(n||(n=Promise))(function(s,i){function o(e){try{p(r.next(e))}catch(e){i(e)}}function a(e){try{p(r.throw(e))}catch(e){i(e)}}function p(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(o,a)}p((r=r.apply(e,t||[])).next())})}"function"==typeof SuppressedError&&SuppressedError;const d={100:"Continue",101:"Switching Protocols",102:"Processing",103:"Early Hints",200:"OK",201:"Created",202:"Accepted",203:"Non-Authoritative Information",204:"No Content",205:"Reset Content",206:"Partial Content",207:"Multi-Status",208:"Already Reported",226:"IM Used",300:"Multiple Choices",301:"Moved Permanently",302:"Found",303:"See Other",304:"Not Modified",305:"Use Proxy",307:"Temporary Redirect",308:"Permanent Redirect",400:"Bad Request",401:"Unauthorized",402:"Payment Required",403:"Forbidden",404:"Not Found",405:"Method Not Allowed",406:"Not Acceptable",407:"Proxy Authentication Required",408:"Request Timeout",409:"Conflict",410:"Gone",411:"Length Required",412:"Precondition Failed",413:"Payload Too Large",414:"URI Too Long",415:"Unsupported Media Type",416:"Range Not Satisfiable",417:"Expectation Failed",418:"I'm a Teapot",421:"Misdirected Request",422:"Unprocessable Entity",423:"Locked",424:"Failed Dependency",425:"Too Early",426:"Upgrade Required",428:"Precondition Required",429:"Too Many Requests",431:"Request Header Fields Too Large",451:"Unavailable For Legal Reasons",500:"Internal Server Error",501:"Not Implemented",502:"Bad Gateway",503:"Service Unavailable",504:"Gateway Timeout",505:"HTTP Version Not Supported",506:"Variant Also Negotiates",507:"Insufficient Storage",508:"Loop Detected",510:"Not Extended",511:"Network Authentication Required"};class m extends Error{constructor(e,t="DEFAULT",n,r="ERROR"){super(e),this.message=e,this.name=t,this.cause=n,this.level=r}get code(){return"number"==typeof this.cause?this.cause:200}get status(){return{code:this.code,message:d[this.code]}}}const f=e=>"object"==typeof e&&null!==e&&e.constructor!==Object,y=(e,...t)=>{if(!Array.isArray(e)&&f(e))return e;const r={};return[e,...t].filter(e=>!(!Array.isArray(0)&&f(0))&&Object.keys(e).length>0).forEach(e=>{var t,s;for(let i in e)void 0!==e[i]&&(null===e[i]||!Array.isArray(e[i])&&f(e[i])?r[i]=e[i]:Array.isArray(e[i])?r[i]=[...null!==(t=r[i])&&void 0!==t?t:[],...e[i]].filter((e,t,r)=>t===r.findIndex(t=>n(t,e))):"object"!=typeof e[i]?r[i]=e[i]:r[i]=y(null!==(s=r[i])&&void 0!==s?s:{},e[i]))}),r},g=(...e)=>["",...e.map(e=>e.replace(/(^\/+)|(\/+$)/gi,"")).filter(e=>""!==e.trim())].join("/"),w=(...e)=>e.map(e=>e.doc).filter(e=>void 0!==e).filter(e=>Object.keys(e).length>0),b=(...e)=>e.filter(e=>Object.keys(e).length>0).reduce((e,t)=>y(e,t),{});function _(e){if(e.doc=(null==e?void 0:e.doc)||{},"name"in e&&"router"===e.name)return e;const n=(n,r,s)=>{try{const e=(n.headers["x-forwarded-for"]||"").replace(/:\d+$/,"");n.clientIp=e||n.connection.remoteAddress}catch(e){}if(n.__executedMiddlewares__ instanceof Set||(n.__executedMiddlewares__=new Set),r.headersSent)return;const o=n.__executedMiddlewares__,a="string"==typeof e.id?e.id:e;o.has(a)?s():(n.executeOnce=(e=!0)=>{e?o.add(a):o.delete(a)},function(e){return"function"!=typeof e||"stack"in e?e:(n,r,s)=>l(this,void 0,void 0,function*(){if(!r.headersSent)try{yield new Promise(e=>setTimeout(e,0));const t=e(n,r,s);t instanceof Promise&&(yield t)}catch(e){const n=e instanceof m&&"number"==typeof e.cause?e.code:400,s=e instanceof m||e instanceof Error?e.message:"Bad ExpressRequest",o=e instanceof m||e instanceof Error?e.name:"Error",a=e instanceof m&&"string"==typeof e.level?e.level:"ERROR";if(r.status(n).json({message:s,name:o,code:n}),["ERROR","WARN","INFO"].includes(a)){const n=e.stack||e;"ERROR"===a&&console.error(e),"WARN"===a&&console.warn(e),t.appendFileSync(i.join(process.cwd(),"stacks.log"),`time=${(new Date).toISOString()} level=${a} message=${JSON.stringify(n)}\n`)}}})}(e)(n,r,s))};return n.id=e.id||void 0,n.doc=e.doc||{},n}const v=e=>({origin:"*"===e||""!==e&&e.split(/,\s*/),methods:"GET,PUT,POST,DELETE,OPTIONS",allowedHeaders:"Content-Type, Authorization, Content-Length, Accept, Origin, X-Requested-With"}),O=(e,t)=>{const n=v(e);return{"Access-Control-Allow-Origin":"boolean"==typeof n.origin?n.origin?null!=t?t:"*":"":n.origin instanceof Array?n.origin.join(","):n.origin,"Access-Control-Allow-Methods":n.methods,"Access-Control-Allow-Headers":n.allowedHeaders,"Access-Control-Expose-Headers":"Content-Length, Content-Range"}};class ${constructor(e,t=new M,n){this.router=t,this.doc=n,e&&(e instanceof $?e.router.layers.forEach(e=>{this.router.layers.push(e)}):(e.id=e.id||r("-"),this.doc=e.doc=b((null==e?void 0:e.doc)||{},n||{}),this.router.middleware(_(e))))}middleware(e,t){return new $(e,this.router,t)}execute(e,t,n){return this.router.executeMiddlewares(e,t,n)}}class j extends ${middleware(e,t){return new j(e,this.router,t)}handler(e,t){return new S(e,this.router,t)}execute(e,t,n){return super.execute(e,t,n)}}class k extends ${constructor(e,t,n,r){super(void 0,e),this.router=e,this.type=t,this.path=n,this.doc=r,this.middlewares=[]}middleware(e,t){return e instanceof $?e.router.layers.filter(({type:e,handle:t})=>"middleware"===e&&!!t).map(({handle:e})=>e).forEach(e=>this.middlewares.push(...e)):this.middlewares.push(_(e)),t&&(this.doc=b(this.doc||{},t)),this}handler(e,t){e instanceof S?e.router.layers.filter(({type:e,handle:t})=>"middleware"===e&&!!t).map(({handle:e})=>e).forEach(e=>this.middlewares.push(...e)):this.middlewares.push(_(e));const n=this.router.layers[this.type](this.path,this.middlewares,b(this.doc||{},t||{}));return{type:this.type,path:this.path,middlewares:this.middlewares,handler:this.middlewares.length>0?this.middlewares[this.middlewares.length-1]:void 0,doc(e,t={}){const{components:r={}}=e,s=c(e,["components"]);return n.doc=b(n.doc,Object.assign(Object.assign({},s),{components:y(r,t)})),this}}}}class S{constructor(e,t=new M,n){this.router=t,this.doc=n,e&&(e instanceof S?e.router.layers.forEach(e=>{this.router.layers.push(e)}):(e.id=e.id||r("-"),e.doc=b((null==e?void 0:e.doc)||{},n||{}),this.router.middleware(_(e))))}execute(e,t,n){return this.router.executeMiddlewares(e,t,n)}}class x extends Array{constructor(e="",t={}){super(),this.path=e,this.doc=t,this.__event__=new s,this.index=-1}addListener(e,t){return this.__event__.on(e,t)}removeListener(e,t){return this.__event__.off(e,t)}pushPath(e,t,n,r,s={}){const i=this.length;this.push({path:n,method:t,type:e,handle:r instanceof x?void 0:r,doc:b(this.doc,...r instanceof x?[r.doc]:w(...r),s),route:r instanceof x?r:void 0});const o=this.routes.find(e=>e.index===i);return o&&this.__event__.emit("add",o),Object.assign(Object.assign({},this),{index:i,get doc(){var e;return(null===(e=this[i])||void 0===e?void 0:e.doc)||{}},set doc(e){this[i].doc=e}})}route(...e){const t="string"==typeof e[0]?e[0]:"",n=e[1]instanceof x?e[2]:e[0]instanceof x||"string"==typeof e[0]?e[1]:e[0],r=new x(g(this.path,t),n);if(e[0]instanceof x||e[1]instanceof x){const t=e[0]instanceof x?e[0]:e[1];return this.push({path:"",method:"use",type:"route",route:r}),r.push({path:"",method:"use",type:"route",route:t}),t}return this.push({path:t,method:"use",type:"route",route:r}),r}static route(e,t){return new x(e,t)}by(e,t,n){const r="string"==typeof e?e:e.path,s="string"==typeof e?t:e,i="string"==typeof e?n:t;return this.route(r,s,i),this}get stack(){return Array.from(this).map(e=>{var{route:t}=e,n=c(e,["route"]);return Object.assign(Object.assign({},n),{get route(){return null==t?void 0:t.stack}})})}executeMiddlewares(e,t,n){return l(this,void 0,void 0,function*(){const r=[];let s;this.filter(({type:e})=>"middleware"===e).forEach(({handle:e})=>{r.push(...e||[])});for(let i=0;i<r.length&&!t.headersSent;i++){const o=r[i];s=yield Promise.race([o(e,t,i>=r.length-1?n:()=>{})])}return s})}get routes(){const e=[],t=[],n=[];let r=-1;for(const s of this)switch(r++,s.type){case"middleware":{const e=s.handle||[];t.push(...e),n.push(...w(...e),s.doc||{});break}case"route":s.route.routes.forEach(i=>{const o=[...t,...s.handle||[],...i.handle];e.push({index:r,path:g(s.path||"",i.path),method:i.method,handle:o,doc:b(...n,...w(...o),s.doc||{},i.doc||{})})});break;default:{const i=[...t,...s.handle||[]];e.push({index:r,path:s.path||"",method:s.method,handle:i,doc:b(...n,...w(...i),s.doc||{})});break}}return e}middleware(e,t={}){return this.pushPath("middleware","use",this.path,e,b(this.doc,t))}get(e,t,n={}){return this.pushPath("layer","get",g(this.path,e),t,b(this.doc,n))}post(e,t,n={}){return this.pushPath("layer","post",g(this.path,e),t,b(this.doc,n))}put(e,t,n={}){return this.pushPath("layer","put",g(this.path,e),t,b(this.doc,n))}delete(e,t,n={}){return this.pushPath("layer","delete",g(this.path,e),t,b(this.doc,n))}patch(e,t,n={}){return this.pushPath("layer","patch",g(this.path,e),t,b(this.doc,n))}options(e,t,n={}){return this.pushPath("layer","options",g(this.path,e),t,b(this.doc,n))}head(e,t,n={}){return this.pushPath("layer","head",g(this.path,e),t,b(this.doc,n))}all(e,t,n={}){return this.pushPath("layer","all",g(this.path,e),t,b(this.doc,n))}use(e,t,n={}){return this.pushPath("layer","use",g(this.path,e),t,b(this.doc,n))}}const P=e=>(n,r)=>l(void 0,void 0,void 0,function*(){if(n.url.endsWith("openapisnippet.min.js")){const e=t.readFileSync(i.resolve(__dirname,"../../resources/openapisnippet.min.js"),"utf-8");return r.setHeader("Content-Type","application/javascript"),void r.send(Buffer.from(e,"utf8"))}const s=`<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <title></title>\n <style>\n body {\n margin:0;\n }\n </style>\n </head>\n <body>\n <div id="redoc-container"></div>\n <script src="${n.originalUrl.replace(/(\/+)$/gi,"")}/openapisnippet.min.js"><\/script>\n <script src="https://cdn.jsdelivr.net/npm/redoc@2.4.0/bundles/redoc.standalone.js"><\/script>\n <script>\n const schema = ${JSON.stringify(e.definition)};\n\n if(schema.info && schema.info.title && typeof schema.info.title === "string"){\n document.title = schema.info.title;\n }\n\n const targets = {\n "shell_curl": "Shell", \n "shell_httpie": "Shell",\n "node_request": "JavaScript", \n "python_python3": "Python", \n "php_curl": "PHP",\n "php_http1": "PHP", \n "php_http2": "PHP"\n };\n \n for(var path in schema.paths){\n for(var method in schema.paths[path]){\n var generatedCode = OpenAPISnippets.getEndpointSnippets(schema, path, method, Object.keys(targets));\n schema.paths[path][method]["x-codeSamples"] = [];\n for(var snippetIdx in generatedCode.snippets){\n var snippet = generatedCode.snippets[snippetIdx];\n schema.paths[path][method]["x-codeSamples"][snippetIdx] = { "lang": targets[snippet.id], "label": snippet.title, "source": snippet.content };\n }\n }\n }\n\n Redoc.init(\n schema,\n {\n scrollYOffset: 'nav',\n hideDownloadButton: true,\n schemaExpansionLevel: 3,\n showObjectSchemaExamples: true\n },\n document.getElementById('redoc-container')\n );\n <\/script>\n </body>\n</html>`;r.setHeader("Content-Type","text/html"),r.send(Buffer.from(s,"utf8"))});const R={basic:"Basic",apiKey:"API Key",oauth2:"OAuth 2.0"},E={description:"Description",name:"Name",in:"In",flow:"Flow",authorizationUrl:"Authorization URL",tokenUrl:"Token URL"};var A=(e,t)=>{if(null==t)return!1;if(t.length)for(let n=0;n<t.length;n++)if(e===t[n])return!0;return!1};class T{constructor(e=null){null!==e&&("type"in e&&(this.type=e.type),"format"in e&&(this.format=e.format),"$ref"in e&&(this.ref=e.$ref),"items"in e&&(this.items=e.items),"allOf"in e&&(this.allOf=e.allOf))}set type(e){this.__type__=e}get type(){return this.__type__}set allOf(e){this.__allOf__=null==e?void 0:e.map(e=>new T(e))}get allOf(){return this.__allOf__}set format(e){this.__format__=e}get format(){return this.__format__}set items(e){this.__items__=e?new T(e):void 0}get items(){return this.__items__}set reference(e){this.__ref__=e}get reference(){return this.__ref__}set ref(e){this.__ref__=e}get ref(){return this.__ref__}}const C={integer:{int32:"integer",int64:"long"},number:{float:"float",double:"double"},string:{byte:"byte",binary:"binary",date:"date","date-time":"dateTime",password:"password"}},N=e=>{var t;if(e.allOf)return e.allOf.map(e=>N(e)).filter(e=>""!==e).join(" & ");if(e.ref){const n=null===(t=e.ref.match(/\/([^/]*)$/i))||void 0===t?void 0:t[1];if(n){return`[${n}](#${n.replace(/\s+/g,"-").replace(/^-*/gi,"").replace(/-*$/gi,"")})`}}if(e.type&&e.type in C)return e.format?e.format in C[e.type]?C[e.type][e.format]:`${e.type} (${e.format})`:e.type;if(e.format)return`${e.type} (${e.format})`;if("array"===e.type&&e.items){return`[ ${N(e.items)} ]`}return e.type?e.type:""};const I=["get","post","put","patch","delete","options"];var U=(e,t,n)=>{const r=[];let s;return e&&t&&(r.push("\n---\n"),r.push(`### ${e} {#${e}}\n`),t.summary&&r.push(`#### Summary:\n\n${t.summary}\n`),t.parameters&&(s=t.parameters),Object.keys(t).map(i=>{if(A(i,I)){const o=[];o.push(`#### ${i.toUpperCase()} {#${e}-${i}}`);const a=t[i];if(o.push(`##### Path:\n\n**${e}**\n`),a.summary&&o.push(`##### Summary:\n\n${a.summary}\n`),a.description&&o.push(`##### Description:\n\n${a.description}\n`),(a.parameters||s)&&o.push(`${((e=[],t=[],n={})=>{const r=[];return[...t,...e].map(e=>{if(e){let t;if(e.$ref){const r=e.$ref.replace(/^#\/parameters\//,"");r in n&&(t=n[r])}if("object"==typeof e&&(t=e),!t)return;const s=[];s.push(t.name||""),s.push(t.in||""),t.description?s.push(t.description.replace(/[\r\n]/g," ")):s.push(""),s.push(t.required?"Yes":"No");let i=null;"schema"in t?i=new T(t.schema):(i=new T,i.type="type"in t?t.type:null,i.format="format"in t?t.format:null,i.ref="$ref"in t?t.$ref:null,i.items="items"in t?t.items:null),s.push(N(i)),r.push(`|${s.map(e=>` ${e} `).join("|")}|`)}}),r.length>0&&(r.unshift("| ---- | ---------- | ----------- | -------- | ---- |"),r.unshift("| Name | Located in | Description | Required | Schema |"),r.unshift("##### Parameters\n")),r.length?r.filter(e=>"string"==typeof e).join("\n"):null})(a.parameters||[],s,n)}\n`),a.responses&&o.push(`${(e=>{const t=[],n=Object.keys(e).reduce((t,n)=>t||"schema"in e[n],!1);return Object.keys(e).forEach(r=>{const s=[];if(s.push(r),"description"in e[r]){const t=e[r].description.replace(/[\r\n]/g," ");s.push(t)}else s.push("");if("schema"in e[r]){const t=new T(e[r].schema);s.push(N(t))}else n&&s.push("");t.push(`|${s.filter(e=>"string"==typeof e).map(e=>` ${e} `).join("|")}|`)}),t.unshift("| ---- | ----------- |"+(n?" ------ |":"")),t.unshift("| Code | Description |"+(n?" Schema |":"")),t.unshift("##### Responses\n"),t.filter(e=>"string"==typeof e).join("\n")})(a.responses)}\n`),a.security&&o.push(`${(e=>{const t=[];let n=0;if(!e)return null;if(e.map(e=>{Object.keys(e).map(t=>{n=e[t].length>n?e[t].length:n})}),n++,n<2&&(n=2),e.map(e=>{Object.keys(e).map(r=>{const s=[r].concat(e[r]);for(;s.length<n;)s.push("");let i=s.reduce((e,t)=>`${e} ${t||""} |`,"|");i=i.replace(/\s{2,}/g," "),t.push(i)})}),t.length){let e=Array(n).fill(" --- ");for(t.unshift(`|${e.join("|")}|`),e=[],e.push(" Security Schema "),e.push(" Scopes ");e.length<n;)e.push(" ");return t.unshift(`|${e.join("|")}|`),t.unshift("##### Security\n"),t.filter(e=>"string"==typeof e).join("\n")}return null})(a.security)}\n`),"x-codeSamples"in a){o.push("\n---\n");for(const{lang:e,label:t,source:n}of a["x-codeSamples"])o.push(`##### ${t||e}:\n`),o.push(`\`\`\`${e.toLowerCase()}`),o.push(...n.split("\n")),o.push("```\n")}r.push(...o.filter(e=>"string"==typeof e).map(e=>`> ${e.split("\n").join("\n> ")}`)),r.push("\n")}})),r.length?r.filter(e=>"string"==typeof e).join("\n"):null};const H=(e,t)=>{let n=[],r=[];return n.push(""),n.push(`#### ${e}`),n.push(""),t.description&&(n.push(t.description),n.push("")),n.push("| Name | Type | Description | Required |"),n.push("| ---- | ---- | ----------- | -------- |"),r="properties"in t?((e,t)=>{const n="required"in t?t.required:[],r=[];return Object.keys(t.properties).map(e=>{const s=t.properties[e],i=N(new T(s)),o=("description"in s?s.description:"").replace(/[\r\n]/g," "),a=A(e,n)?"Yes":"No";r.push(`| ${e} | ${i} | ${o} | ${a} |`)}),r.filter(e=>""!==(e||"").trim())})(0,t):((e,t)=>{const n=[],r="type"in t?t.type:"",s=("description"in t?t.description:"").replace(/[\r\n]/g," ");return n.push(`| ${e} | ${r} | ${s} | |`),n.filter(e=>""!==(e||"").trim())})(e,t),n=n.concat(r),n.length?n.filter(e=>""!==(e||"").trim()).join("\n"):null};const L=t=>{const n=e(t),r=[];if(n.info&&r.push((e=>{const t=[];return null!==e&&"object"==typeof e&&(e.title&&t.push(`# ${e.title}`),e.description&&t.push(`${e.description}\n`),e.version&&t.push(`## Version: ${e.version}\n`),e.termsOfService&&t.push(`### Terms of service\n${e.termsOfService}\n`),e.contact&&t.push((e=>{const t=[];return"name"in e&&t.push(`${e.name} `),"url"in e&&t.push(`${e.url} `),"email"in e&&t.push(`${e.email} `),t.length>0&&(t.unshift("**Contact information:** "),t.push("")),t.length>0?t.filter(e=>"string"==typeof e).join("\n"):null})(e.contact)),e.license&&t.push((e=>{const t=[];return("url"in e||"name"in e)&&(t.push("**License:** "),"url"in e&&"name"in e?t.push(`[${e.name}](${e.url})`):t.push(e.name||e.url||null),t.push("\n")),t.length>0?t.filter(e=>"string"==typeof e).join(""):null})(e.license))),t.length?t.filter(e=>"string"==typeof e).join("\n"):null})(n.info)),n.externalDocs&&r.push((e=>{const t=[];return"description"in e&&"url"in e?t.push(`[${e.description}](${e.url})`):"url"in e&&t.push(`[Find more info here](${e.url})`),t.length?t.filter(e=>"string"==typeof e).join("\n"):null})(n.externalDocs)),n.securityDefinitions&&r.push((e=>{const t=[];return Object.keys(e).map(n=>{t.push(`**${n}** \n`),t.push(`|${e[n].type}|*${R[e[n].type]}*|`),t.push("|---|---|"),Object.keys(e[n]).map(r=>{if("scopes"===r)t.push("|**Scopes**||"),Object.keys(e[n][r]).map(s=>{t.push(`|${s}|${e[n][r][s].replace(/[\r\n]/g," ")}|`)});else if("type"!==r&&e[n][r].replace){let s=E[r];if(void 0===s){if(!r.match(/^x-/i))return;s=r}t.push(`|${s}|${e[n][r].replace(/[\r\n]/g," ")}|`)}}),t.push("")}),t.length>0&&t.unshift("### Security"),t.length?t.filter(e=>"string"==typeof e).join("\n"):null})(n.securityDefinitions)),n.paths){r.push("## Summary\n");for(const e in n.paths){n.paths[e].summary?r.push(`* [${n.paths[e].summary}](#${e})`):r.push(`* [${e}](#${e})`);for(const t in n.paths[e])A(t,I)&&(n.paths[e][t].summary?r.push(` * [${t.toUpperCase()} - ${n.paths[e][t].summary}](#${e}-${t})`):r.push(` * [${t.toUpperCase()}](#${e}-${t})`))}Object.keys(n.paths).forEach(e=>r.push(U(e,n.paths[e],{})))}return n.definitions&&(r.push("\n---\n\n"),r.push((e=>{const t=[];return Object.keys(e).map(n=>t.push(H(n,e[n]))),t.length>0?(t.unshift("### Models\n"),t.filter(e=>"string"==typeof e).join("\n")):null})(n.definitions))),r.length?r.filter(e=>"string"==typeof e).join("\n"):""};var D=L,F=e=>(n,r)=>l(void 0,void 0,void 0,function*(){const n=`<!DOCTYPE html>\n<html lang="en">\n <head>\n <meta charset="UTF-8">\n <title></title>\n <script type="importmap">\n {\n "imports": {\n "remark": "https://esm.sh/remark?bundle",\n "remark-parse": "https://esm.sh/remark-parse?bundle",\n "remark-directive": "https://esm.sh/remark-directive?bundle",\n "remark-frontmatter": "https://esm.sh/remark-frontmatter?bundle",\n "remark-gfm": "https://esm.sh/remark-gfm?bundle",\n "remark-math": "https://esm.sh/remark-math?bundle",\n "remark-rehype": "https://esm.sh/remark-rehype?bundle",\n "rehype-format": "https://esm.sh/rehype-format?bundle",\n "rehype-raw": "https://esm.sh/rehype-raw?bundle",\n "rehype-sanitize": "https://esm.sh/rehype-sanitize?bundle",\n "rehype-stringify": "https://esm.sh/rehype-stringify?bundle",\n "remark-heading-id": "https://esm.sh/remark-heading-id?bundle",\n "rehype-pretty-code": "https://esm.sh/rehype-pretty-code?bundle"\n }\n }\n <\/script>\n <style>${t.readFileSync(i.join(__dirname,"../../resources/markdown-style.css"),"utf8")}</style>\n </head>\n <body>\n <div class="markdown-body" id="content"></div>\n <script type="module">\n import { remark } from 'remark';\n import remarkParse from 'remark-parse';\n import remarkDirective from "remark-directive";\n import remarkFrontmatter from 'remark-frontmatter';\n import remarkGfm from "remark-gfm";\n import remarkMath from "remark-math";\n import remarkRehype from 'remark-rehype';\n import rehypeFormat from "rehype-format";\n import rehypeRaw from "rehype-raw";\n import rehypeSanitize from "rehype-sanitize";\n import rehypeStringify from 'rehype-stringify';\n import remarkHeadingId from "remark-heading-id";\n import rehypePrettyCode from 'rehype-pretty-code';\n\n remark()\n .use(remarkHeadingId, { defaults: true, prefix: '' })\n .use(remarkParse)\n .use(remarkDirective)\n .use(remarkFrontmatter)\n .use(remarkGfm)\n .use(remarkMath)\n .use(remarkRehype, {allowDangerousHtml: true})\n .use(rehypePrettyCode, {\n theme: 'github-dark', // Temas: 'github-light', 'vesper', etc.\n keepBackground: false,\n })\n .use(rehypeRaw)\n .use(rehypeFormat)\n .use(rehypeStringify)\n .process(\`${L(e).replaceAll("`","\\`")}\`)\n .then((result) => {\n document.getElementById("content").innerHTML = result.toString();\n });\n <\/script>\n </body>\n</html>`;r.setHeader("Content-Type","text/html"),r.send(Buffer.from(n,"utf8"))});class M{constructor(e="",t=new x){this.routePath=e,this.layers=t,this.app=o(),this.express_router=o.Router(),this.layers.path=e}doc(e,t={}){this.layers.doc=Object.assign(Object.assign({},e),{components:t})}middleware(e,t){return e instanceof $?e.router.layers.filter(({type:e,handle:t})=>"middleware"===e&&!!t).map(({handle:e})=>e).forEach(e=>this.layers.middleware(e,t)):this.layers.middleware([e].map(_),t),this}executeMiddlewares(e,t,n){return this.layers.executeMiddlewares(e,t,n)}handler(e,t){return new S(e,void 0,t)}get(e,t){return new k(this,"get",e,t)}post(e,t){return new k(this,"post",e,t)}put(e,t){return new k(this,"put",e,t)}delete(e,t){return new k(this,"delete",e,t)}patch(e,t){return new k(this,"patch",e,t)}options(e,t){return new k(this,"options",e,t)}head(e,t){return new k(this,"head",e,t)}all(e,t){return new k(this,"all",e,t)}use(e="",t){return new k(this,"use",e,t)}get routes(){return((e,t="")=>{try{let n=e.routes.map(e=>{const{path:n,method:r,doc:s}=e,i=g(t,n);return{path:i,methods:[r],type:"ROUTE",swagger:{paths:{[i]:{[r]:(null==s?void 0:s.operation)||{}}},components:(null==s?void 0:s.components)||{}}}});return n}catch(e){}return[]})(this.layers)}getSwagger(e,t={}){const n=Object.assign(Object.assign({path:"/doc"},e||{}),{defaultResponses:t});let r={paths:(null==n?void 0:n.paths)||{},components:(null==n?void 0:n.components)||{}};this.layers.routes.forEach(({method:e,path:t,doc:s})=>{if(s){const{components:i}=s,o=c(s,["components"]);o.responses=y(n.defaultResponses||{},o.responses||{}),r=y(r,{paths:{[t]:{[e]:o}},components:i||{}})}});const s=Object.assign(Object.assign({},((e,...t)=>Object.fromEntries(Object.entries(e).filter(([e])=>!t.includes(e))))(n,"path","defaultResponses")),r),i={shell_curl:"Shell",shell_httpie:"Shell",node_request:"JavaScript",python_python3:"Python"};for(const e in s.paths)for(const t in s.paths[e]){const n=p.getEndpointSnippets(Object.assign({servers:[{url:"http://[hostname]"}]},s),e,t,Object.keys(i));s.paths[e][t]["x-codeSamples"]=[];for(const r in n.snippets){const o=n.snippets[r];s.paths[e][t]["x-codeSamples"][r]={lang:i[o.id],label:o.title,source:o.content}}}return{definition:s,apis:[]}}defineSwagger(t){const n=Object.assign(Object.assign({},t),{path:t.path||"/doc",defaultResponses:t.defaultResponses||{}}),r=n.path||"/doc",s=()=>{const t=this.getSwagger(n,n.defaultResponses);let r="",s={};try{s=e(t),r=D(t)}catch(e){}return{options:t,definition:s,markdown:r}};this.express_router.use(g(r,"/.md"),(e,t)=>{t.setHeader("Content-Type","text/markdown"),t.send(s().markdown)}),this.express_router.use(g(r,"/markdown"),(...e)=>{F(s().options).apply(this.app,e)}),this.express_router.get(g(r,"/swagger/definition.json"),(e,t)=>{t.json(s().definition)}),this.express_router.use(g(r,"/swagger"),a.serve,(...e)=>{a.setup(s().definition).apply(this.app,e)}),this.express_router.use(g(r,"/redoc"),(...e)=>{P(s().options).apply(this.app,e)})}route(e=""){return new M("",this.layers.route(e))}by(e){return e instanceof M&&(this.layers.by(e.layers),this.express_router.use(e.routePath,e.express_router)),this}engine(e,t){return this.app.engine(e,t),this}enabled(e){return this.app.enabled(e)}disabled(e){return this.app.disabled(e)}enable(e){return this.app.enable(e),this}disable(e){return this.app.disable(e),this}listen(...e){const t=o.Router();return this.app.use((e,n,r)=>{t.stack=[],this.layers.routes.forEach(({method:e,path:n,handle:r})=>{t[e](n,...r)}),r()},t),this.app.use(this.routePath,this.express_router),this.app.get("/.well-known/appspecific/com.chrome.devtools.json",(e,t)=>{const n=i.resolve(__dirname),s=r("-");t.json({workspace:{root:n,uuid:s}})}),this.app.use(_((e,t,n)=>{throw new m(`Not Found by ${e.method} ${e.url}`,"NOT_FOUND",404)})),this.app.listen(...e)}}var q=Object.freeze({__proto__:null,cors:(e="*")=>(t,n,r)=>{const s=t.headers.origin;if(n.setHeader("Access-Control-Allow-Origin","*"===e?"*":s||"*"),n.setHeader("Access-Control-Allow-Methods","GET,PUT,POST,DELETE,OPTIONS"),n.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization, Content-Length, Accept, Origin, X-Requested-With"),n.setHeader("Access-Control-Allow-Credentials","true"),n.setHeader("Access-Control-Expose-Headers","Content-Length, Content-Range"),"OPTIONS"===t.method)return n.status(200).end();r()},files:(...e)=>(t,n,r)=>l(void 0,void 0,void 0,function*(){e=e.map(e=>e.trim().toLowerCase());const n=yield new Promise((e,n)=>{const r=[];t.on("data",e=>r.push(Buffer.from(e))),t.on("end",()=>e(Buffer.concat(r))),t.on("error",n)});if(!t.headers["content-type"]||!t.headers["content-type"].startsWith("multipart/form-data"))throw new m("Invalid content type","BAD_REQUEST",400);const s=t.headers["content-type"].split("boundary=")[1],i=n.toString("binary").split(`--${s}`),o=[];for(const t of i)if(t.includes('filename="')){const[n,...r]=t.split("\r\n\r\n"),s=r.join("\r\n\r\n").trim(),i=Buffer.from(s,"binary"),a=n.match(/name="([^"]+)"/),p=n.match(/filename="([^"]+)"/),u=n.match(/Content-Type: ([^\r\n]+)/);if(a&&p&&u){const t=a[1],n=p[1],r=u[1].trim().toLowerCase();if(e.length>0&&!e.includes(r))continue;o.push({fieldname:t,originalname:n,encoding:"",mimetype:r,size:s.length,stream:new h,destination:"",filename:n,path:"",buffer:i.slice(0,-2)})}}if(!o.length)throw new m("No files were uploaded","BAD_REQUEST",400);t.file=o[0],t.files=o,r()}),json:e=>u.json(e),raw:e=>u.raw(e),text:e=>u.text(e),urlencoded:e=>u.urlencoded(e)});function B(){return new M}function z(e,t){return new j(e,void 0,t)}function G(e,t){return new S(e,void 0,t)}function W(e){return new M(e)}function Y(e,t={}){const{components:n={}}=e,r=c(e,["components"]);return Object.assign(Object.assign({},r),{components:y(n,t)})}var J={create:B,route:W,middleware:z,handler:G,doc:Y};export{m as HandleError,q as Middlewares,B as create,J as default,Y as doc,O as getCorsHeaders,v as getCorsOptions,G as handler,z as middleware,W as route};
1
+ import { __rest } from './node_modules/tslib/tslib.es6.esm.js';
2
+ import { Router } from './router.esm.js';
3
+ import { Middleware } from './middleware.esm.js';
4
+ import { Handler } from './handler.esm.js';
5
+ import { joinObject } from './utils.esm.js';
6
+ export { getCorsHeaders, getCorsOptions } from './utils.esm.js';
7
+ export { HandleError } from './HandleError.esm.js';
8
+ import * as Middlewares from './Middlewares.esm.js';
9
+ export { Middlewares };
10
+
11
+ /**
12
+ * Inicializa uma nova instância do Router. Este é o ponto de partida para construir sua aplicação.
13
+ *
14
+ * @template Req - Tipo de Request base para o roteador.
15
+ * @template Res - Tipo de Response base para o roteador.
16
+ * @returns {Router<Req, Res>} Uma nova instância do Router.
17
+ *
18
+ * @example
19
+ * import { create } from '@ismael1361/router';
20
+ *
21
+ * const router = create();
22
+ *
23
+ * router.get('/ping', { summary: 'Verifica a saúde da API' })
24
+ * .handler((req, res) => {
25
+ * res.send('pong');
26
+ * });
27
+ *
28
+ * router.listen(3000, () => {
29
+ * console.log('Servidor rodando na porta 3000');
30
+ * });
31
+ */
32
+ function create() {
33
+ return new Router();
34
+ }
35
+ /**
36
+ * Cria um componente de middleware reutilizável e encadeável.
37
+ * Permite encapsular lógicas (como autenticação, logging) e sua documentação OpenAPI associada.
38
+ *
39
+ * @template Req - Tipo de Request que o middleware espera ou adiciona.
40
+ * @template Res - Tipo de Response que o middleware pode modificar.
41
+ * @param {MiddlewareCallback<Req, Res>} callback - A função de middleware.
42
+ * @param {MiddlewareFCDoc} [doc] - A documentação OpenAPI para este middleware.
43
+ * @returns {Middleware<Req, Res>} Uma instância de Middleware que pode ser usada em rotas.
44
+ *
45
+ * @example
46
+ * import { middleware } from '@ismael1361/router';
47
+ *
48
+ * // Middleware que adiciona um usuário à requisição
49
+ * const authMiddleware = middleware<{ user: { id: string } }>((req, res, next) => {
50
+ * req.user = { id: 'user-123' };
51
+ * next();
52
+ * }, {
53
+ * security: [{ bearerAuth: [] }], // Documenta o requisito de segurança
54
+ * responses: { '401': { description: 'Não autorizado' } }
55
+ * });
56
+ *
57
+ * // Em uma rota:
58
+ * // router.get('/profile').middleware(authMiddleware).handler(...)
59
+ */
60
+ function middleware(callback, doc) {
61
+ return new Middleware(callback, undefined, doc);
62
+ }
63
+ /**
64
+ * Cria um componente de manipulador (handler/controller) reutilizável.
65
+ * Útil para definir a lógica final de uma rota em um local separado e importá-la onde for necessário.
66
+ *
67
+ * @template Req - Tipo de Request que o handler espera.
68
+ * @template Res - Tipo de Response que o handler pode modificar.
69
+ * @param {HandlerCallback<Req, Res>} callback - A função do manipulador.
70
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI para este handler.
71
+ * @returns {Handler<Req, Res>} Uma instância de Handler.
72
+ *
73
+ * @example
74
+ * import { handler } from '@ismael1361/router';
75
+ *
76
+ * const getUserProfile = handler<{ user: { id: string } }>((req, res) => {
77
+ * res.json({ profile: req.user });
78
+ * });
79
+ *
80
+ * // Em uma rota:
81
+ * // router.get('/profile').middleware(authMiddleware).handler(getUserProfile);
82
+ */
83
+ function handler(callback, doc) {
84
+ return new Handler(callback, undefined, doc);
85
+ }
86
+ /**
87
+ * Cria uma nova instância do Router com um caminho de prefixo.
88
+ * Ideal para agrupar rotas relacionadas sob um namespace comum (ex: '/api/v1').
89
+ *
90
+ * @template Req - Tipo de Request base para o roteador.
91
+ * @template Res - Tipo de Response base para o roteador.
92
+ * @param {string} path - O caminho do prefixo para todas as rotas definidas neste roteador.
93
+ * @returns {Router<Req, Res>} Uma nova instância do Router com o prefixo definido.
94
+ *
95
+ * @example
96
+ * import { route, create } from '@ismael1361/router';
97
+ *
98
+ * const mainRouter = create();
99
+ * const usersRouter = route('/users'); // Todas as rotas aqui começarão com /users
100
+ *
101
+ * usersRouter.get('/:id').handler((req, res) => { ... }); // Acessível em GET /users/:id
102
+ *
103
+ * mainRouter.by(usersRouter); // Anexa o grupo de rotas ao roteador principal
104
+ */
105
+ function route(path) {
106
+ return new Router(path);
107
+ }
108
+ /**
109
+ * Um helper para criar um objeto de documentação OpenAPI de forma limpa.
110
+ * Ele separa a operação principal dos componentes e os mescla em um único objeto.
111
+ *
112
+ * @param {MiddlewareFCDoc | swaggerJSDoc.Operation} operation - O objeto de operação OpenAPI (summary, tags, responses, etc.).
113
+ * @param {swaggerJSDoc.Components} [components={}] - Componentes OpenAPI (schemas, securitySchemes, etc.).
114
+ * @returns {MiddlewareFCDoc} Um objeto de documentação formatado.
115
+ *
116
+ * @example
117
+ * import { doc } from '@ismael1361/router';
118
+ *
119
+ * const userDoc = doc({
120
+ * summary: 'Cria um usuário',
121
+ * tags: ['Users'],
122
+ * requestBody: { $ref: '#/components/requestBodies/UserBody' }
123
+ * }, {
124
+ * requestBodies: { UserBody: { content: { 'application/json': { schema: { type: 'object' } } } } }
125
+ * });
126
+ *
127
+ * // router.post('/users', userDoc).handler(...)
128
+ */
129
+ function doc(operation, components = {}) {
130
+ const { components: comp = {} } = operation, op = __rest(operation, ["components"]);
131
+ return Object.assign(Object.assign({}, op), { components: joinObject(comp, components) });
132
+ }
133
+ var index = {
134
+ create,
135
+ route,
136
+ middleware,
137
+ handler,
138
+ doc,
139
+ };
140
+
141
+ export { create, index as default, doc, handler, middleware, route };
2
142
  //# sourceMappingURL=index.esm.js.map