@ismael1361/router 1.1.1 → 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 +126 -1
  2. package/dist/HandleError.esm.js.map +1 -1
  3. package/dist/HandleError.js +128 -1
  4. package/dist/HandleError.js.map +1 -1
  5. package/dist/Layer.esm.js +250 -1
  6. package/dist/Layer.esm.js.map +1 -1
  7. package/dist/Layer.js +252 -1
  8. package/dist/Layer.js.map +1 -1
  9. package/dist/Middlewares.esm.js +187 -1
  10. package/dist/Middlewares.esm.js.map +1 -1
  11. package/dist/Middlewares.js +194 -1
  12. package/dist/Middlewares.js.map +1 -1
  13. package/dist/handler.esm.js +170 -1
  14. package/dist/handler.esm.js.map +1 -1
  15. package/dist/handler.js +173 -1
  16. package/dist/handler.js.map +1 -1
  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 +151 -1
  22. package/dist/middleware.esm.js.map +1 -1
  23. package/dist/middleware.js +154 -1
  24. package/dist/middleware.js.map +1 -1
  25. package/dist/node_modules/tslib/tslib.es6.esm.js +45 -1
  26. package/dist/node_modules/tslib/tslib.es6.esm.js.map +1 -1
  27. package/dist/node_modules/tslib/tslib.es6.js +48 -1
  28. package/dist/node_modules/tslib/tslib.es6.js.map +1 -1
  29. package/dist/redocUi/index.esm.js +74 -1
  30. package/dist/redocUi/index.esm.js.map +1 -1
  31. package/dist/redocUi/index.js +76 -1
  32. package/dist/redocUi/index.js.map +1 -1
  33. package/dist/router.esm.js +434 -1
  34. package/dist/router.esm.js.map +1 -1
  35. package/dist/router.js +436 -1
  36. package/dist/router.js.map +1 -1
  37. package/dist/swagger-markdown/index.esm.js +128 -1
  38. package/dist/swagger-markdown/index.esm.js.map +1 -1
  39. package/dist/swagger-markdown/index.js +134 -1
  40. package/dist/swagger-markdown/index.js.map +1 -1
  41. package/dist/swagger-markdown/lib/anchor.esm.js +6 -1
  42. package/dist/swagger-markdown/lib/anchor.esm.js.map +1 -1
  43. package/dist/swagger-markdown/lib/anchor.js +8 -1
  44. package/dist/swagger-markdown/lib/anchor.js.map +1 -1
  45. package/dist/swagger-markdown/lib/inArray.esm.js +20 -1
  46. package/dist/swagger-markdown/lib/inArray.esm.js.map +1 -1
  47. package/dist/swagger-markdown/lib/inArray.js +22 -1
  48. package/dist/swagger-markdown/lib/inArray.js.map +1 -1
  49. package/dist/swagger-markdown/models/schema.esm.js +64 -1
  50. package/dist/swagger-markdown/models/schema.esm.js.map +1 -1
  51. package/dist/swagger-markdown/models/schema.js +66 -1
  52. package/dist/swagger-markdown/models/schema.js.map +1 -1
  53. package/dist/swagger-markdown/transformers/contact.esm.js +23 -1
  54. package/dist/swagger-markdown/transformers/contact.esm.js.map +1 -1
  55. package/dist/swagger-markdown/transformers/contact.js +25 -1
  56. package/dist/swagger-markdown/transformers/contact.js.map +1 -1
  57. package/dist/swagger-markdown/transformers/dataTypes.esm.js +59 -1
  58. package/dist/swagger-markdown/transformers/dataTypes.esm.js.map +1 -1
  59. package/dist/swagger-markdown/transformers/dataTypes.js +61 -1
  60. package/dist/swagger-markdown/transformers/dataTypes.js.map +1 -1
  61. package/dist/swagger-markdown/transformers/definitions.esm.js +75 -1
  62. package/dist/swagger-markdown/transformers/definitions.esm.js.map +1 -1
  63. package/dist/swagger-markdown/transformers/definitions.js +80 -1
  64. package/dist/swagger-markdown/transformers/definitions.js.map +1 -1
  65. package/dist/swagger-markdown/transformers/externalDocs.esm.js +13 -1
  66. package/dist/swagger-markdown/transformers/externalDocs.esm.js.map +1 -1
  67. package/dist/swagger-markdown/transformers/externalDocs.js +15 -1
  68. package/dist/swagger-markdown/transformers/externalDocs.js.map +1 -1
  69. package/dist/swagger-markdown/transformers/info.esm.js +36 -1
  70. package/dist/swagger-markdown/transformers/info.esm.js.map +1 -1
  71. package/dist/swagger-markdown/transformers/info.js +38 -1
  72. package/dist/swagger-markdown/transformers/info.js.map +1 -1
  73. package/dist/swagger-markdown/transformers/license.esm.js +20 -1
  74. package/dist/swagger-markdown/transformers/license.esm.js.map +1 -1
  75. package/dist/swagger-markdown/transformers/license.js +22 -1
  76. package/dist/swagger-markdown/transformers/license.js.map +1 -1
  77. package/dist/swagger-markdown/transformers/path.esm.js +71 -1
  78. package/dist/swagger-markdown/transformers/path.esm.js.map +1 -1
  79. package/dist/swagger-markdown/transformers/path.js +76 -1
  80. package/dist/swagger-markdown/transformers/path.js.map +1 -1
  81. package/dist/swagger-markdown/transformers/pathParameters.esm.js +62 -1
  82. package/dist/swagger-markdown/transformers/pathParameters.esm.js.map +1 -1
  83. package/dist/swagger-markdown/transformers/pathParameters.js +64 -1
  84. package/dist/swagger-markdown/transformers/pathParameters.js.map +1 -1
  85. package/dist/swagger-markdown/transformers/pathResponses.esm.js +45 -1
  86. package/dist/swagger-markdown/transformers/pathResponses.esm.js.map +1 -1
  87. package/dist/swagger-markdown/transformers/pathResponses.js +47 -1
  88. package/dist/swagger-markdown/transformers/pathResponses.js.map +1 -1
  89. package/dist/swagger-markdown/transformers/security.esm.js +41 -1
  90. package/dist/swagger-markdown/transformers/security.esm.js.map +1 -1
  91. package/dist/swagger-markdown/transformers/security.js +43 -1
  92. package/dist/swagger-markdown/transformers/security.js.map +1 -1
  93. package/dist/swagger-markdown/transformers/securityDefinitions.esm.js +51 -1
  94. package/dist/swagger-markdown/transformers/securityDefinitions.esm.js.map +1 -1
  95. package/dist/swagger-markdown/transformers/securityDefinitions.js +57 -1
  96. package/dist/swagger-markdown/transformers/securityDefinitions.js.map +1 -1
  97. package/dist/utils.esm.js +244 -1
  98. package/dist/utils.esm.js.map +1 -1
  99. package/dist/utils.js +256 -1
  100. package/dist/utils.js.map +1 -1
  101. package/package.json +2 -2
@@ -1,2 +1,195 @@
1
- "use strict";var e=require("./node_modules/tslib/tslib.es6.js"),t=require("stream"),r=require("./HandleError.js"),n=require("body-parser");exports.cors=(e="*")=>(t,r,n)=>{const o=t.headers.origin;if(r.setHeader("Access-Control-Allow-Origin","*"===e?"*":o||"*"),r.setHeader("Access-Control-Allow-Methods","GET,PUT,POST,DELETE,OPTIONS"),r.setHeader("Access-Control-Allow-Headers","Content-Type, Authorization, Content-Length, Accept, Origin, X-Requested-With"),r.setHeader("Access-Control-Allow-Credentials","true"),r.setHeader("Access-Control-Expose-Headers","Content-Length, Content-Range"),"OPTIONS"===t.method)return r.status(200).end();n()},exports.files=(...n)=>(o,s,i)=>e.__awaiter(void 0,void 0,void 0,function*(){n=n.map(e=>e.trim().toLowerCase());const e=yield new Promise((e,t)=>{const r=[];o.on("data",e=>r.push(Buffer.from(e))),o.on("end",()=>e(Buffer.concat(r))),o.on("error",t)});if(!o.headers["content-type"]||!o.headers["content-type"].startsWith("multipart/form-data"))throw new r.HandleError("Invalid content type","BAD_REQUEST",400);const s=o.headers["content-type"].split("boundary=")[1],a=e.toString("binary").split(`--${s}`),l=[];for(const e of a)if(e.includes('filename="')){const[r,...o]=e.split("\r\n\r\n"),s=o.join("\r\n\r\n").trim(),i=Buffer.from(s,"binary"),a=r.match(/name="([^"]+)"/),d=r.match(/filename="([^"]+)"/),c=r.match(/Content-Type: ([^\r\n]+)/);if(a&&d&&c){const e=a[1],r=d[1],o=c[1].trim().toLowerCase();if(n.length>0&&!n.includes(o))continue;l.push({fieldname:e,originalname:r,encoding:"",mimetype:o,size:s.length,stream:new t.Readable,destination:"",filename:r,path:"",buffer:i.slice(0,-2)})}}if(!l.length)throw new r.HandleError("No files were uploaded","BAD_REQUEST",400);o.file=l[0],o.files=l,i()}),exports.json=e=>n.json(e),exports.raw=e=>n.raw(e),exports.text=e=>n.text(e),exports.urlencoded=e=>n.urlencoded(e);
1
+ 'use strict';
2
+
3
+ var tslib_es6 = require('./node_modules/tslib/tslib.es6.js');
4
+ var stream = require('stream');
5
+ var HandleError = require('./HandleError.js');
6
+ var BodyParser = require('body-parser');
7
+
8
+ /**
9
+ * Retorna um middleware que analisa corpos de requisição JSON.
10
+ * Este middleware é um wrapper em torno do `body-parser.json()`.
11
+ *
12
+ * @param {OptionsJson} [options] - Opções de configuração para o `body-parser`.
13
+ * @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
14
+ *
15
+ * @example
16
+ * import { create, Middlewares } from '@ismael1361/router';
17
+ *
18
+ * const app = create();
19
+ *
20
+ * // Aplica o middleware para analisar JSON em todas as rotas
21
+ * app.middleware(Middlewares.json());
22
+ *
23
+ * app.post('/data').handler((req, res) => {
24
+ * // req.body agora contém o objeto JSON enviado
25
+ * res.json({ received: req.body });
26
+ * });
27
+ */
28
+ const json = (options) => {
29
+ return BodyParser.json(options);
30
+ };
31
+ /**
32
+ * Retorna um middleware que analisa corpos de requisição como um Buffer.
33
+ * Este middleware é um wrapper em torno do `body-parser.raw()`.
34
+ *
35
+ * @param {Options} [options] - Opções de configuração para o `body-parser`.
36
+ * @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
37
+ *
38
+ * @example
39
+ * import { create, Middlewares } from '@ismael1361/router';
40
+ *
41
+ * const app = create();
42
+ *
43
+ * // Analisa corpos do tipo 'application/octet-stream' como Buffer
44
+ * app.middleware(Middlewares.raw({ type: 'application/octet-stream', limit: '10mb' }));
45
+ *
46
+ * app.post('/upload-raw').handler((req, res) => {
47
+ * // req.body é um Buffer com os dados brutos
48
+ * console.log('Buffer recebido:', req.body.length, 'bytes');
49
+ * res.send('Raw data received');
50
+ * });
51
+ */
52
+ const raw = (options) => {
53
+ return BodyParser.raw(options);
54
+ };
55
+ /**
56
+ * Retorna um middleware que analisa corpos de requisição como texto.
57
+ * Este middleware é um wrapper em torno do `body-parser.text()`.
58
+ *
59
+ * @param {OptionsText} [options] - Opções de configuração para o `body-parser`.
60
+ * @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
61
+ *
62
+ * @example
63
+ * import { create, Middlewares } from '@ismael1361/router';
64
+ *
65
+ * const app = create();
66
+ *
67
+ * // Analisa corpos do tipo 'text/plain' como string
68
+ * app.middleware(Middlewares.text({ type: 'text/plain' }));
69
+ *
70
+ * app.post('/log').handler((req, res) => {
71
+ * // req.body é uma string com o conteúdo do corpo
72
+ * console.log('Log recebido:', req.body);
73
+ * res.send('Log received');
74
+ * });
75
+ */
76
+ const text = (options) => {
77
+ return BodyParser.text(options);
78
+ };
79
+ /**
80
+ * Retorna um middleware que analisa corpos de requisição com o formato `application/x-www-form-urlencoded`.
81
+ * Este middleware é um wrapper em torno do `body-parser.urlencoded()`.
82
+ *
83
+ * @param {OptionsUrlencoded} [options] - Opções de configuração para o `body-parser`.
84
+ * @returns {MiddlewareFC<Request, Response>} Uma função de middleware do Express.
85
+ *
86
+ * @example
87
+ * import { create, Middlewares } from '@ismael1361/router';
88
+ *
89
+ * const app = create();
90
+ *
91
+ * // Aplica o middleware para analisar dados de formulário
92
+ * app.middleware(Middlewares.urlencoded({ extended: true }));
93
+ *
94
+ * app.post('/submit-form').handler((req, res) => {
95
+ * // req.body contém os dados do formulário
96
+ * res.json({ form_data: req.body });
97
+ * });
98
+ */
99
+ const urlencoded = (options) => {
100
+ return BodyParser.urlencoded(options);
101
+ };
102
+ const cors = (allowOrigin = "*") => {
103
+ return (req, res, next) => {
104
+ // Configuração mais robusta de CORS
105
+ const origin = req.headers.origin;
106
+ // Definir headers CORS
107
+ res.setHeader("Access-Control-Allow-Origin", allowOrigin === "*" ? "*" : origin || "*");
108
+ res.setHeader("Access-Control-Allow-Methods", "GET,PUT,POST,DELETE,OPTIONS");
109
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Content-Length, Accept, Origin, X-Requested-With");
110
+ res.setHeader("Access-Control-Allow-Credentials", "true");
111
+ res.setHeader("Access-Control-Expose-Headers", "Content-Length, Content-Range");
112
+ // Responder a requisições OPTIONS
113
+ if (req.method === "OPTIONS") {
114
+ return res.status(200).end();
115
+ }
116
+ next();
117
+ };
118
+ };
119
+ /**
120
+ * Middleware para analisar arquivos de uma solicitação.
121
+ * Os arquivos com suas informações são armazenados no objeto `req.files`, sua tipagem: `FileInfo[]`.
122
+ * Ao usar esse middleware, é necessário que o corpo da requisição seja um objeto `FormData`.
123
+ * Se caso o middleware não encontrar nenhum arquivo, ele irá lançar um erro.
124
+ *
125
+ * @example
126
+ * ```ts
127
+ * Router.middleware(Middleware.files()).handler(async (req, res) => {
128
+ * });
129
+ *
130
+ * Router.middleware(Middleware.files(Middleware.files('image/jpeg', 'image/png', 'application/pdf')).handler(async (req, res) => {
131
+ * });
132
+ * ```
133
+ */
134
+ const files = (...allowedMimes) => {
135
+ return (req, res, next) => tslib_es6.__awaiter(void 0, void 0, void 0, function* () {
136
+ allowedMimes = allowedMimes.map((mime) => mime.trim().toLowerCase());
137
+ const rawBody = yield new Promise((resolve, reject) => {
138
+ const chunks = [];
139
+ req.on("data", (chunk) => chunks.push(Buffer.from(chunk)));
140
+ req.on("end", () => resolve(Buffer.concat(chunks)));
141
+ req.on("error", reject);
142
+ });
143
+ if (!req.headers["content-type"] || !req.headers["content-type"].startsWith("multipart/form-data")) {
144
+ throw new HandleError.HandleError("Invalid content type", "BAD_REQUEST", 400);
145
+ }
146
+ const boundary = req.headers["content-type"].split("boundary=")[1];
147
+ const parts = rawBody.toString("binary").split(`--${boundary}`);
148
+ const files = [];
149
+ for (const part of parts) {
150
+ if (part.includes('filename="')) {
151
+ const [header, ...body] = part.split("\r\n\r\n");
152
+ const content = body.join("\r\n\r\n").trim();
153
+ const buffer = Buffer.from(content, "binary");
154
+ // Extrair nome do campo e nome do arquivo
155
+ const fieldnameMatch = header.match(/name="([^"]+)"/);
156
+ const filenameMatch = header.match(/filename="([^"]+)"/);
157
+ const mimetypeMatch = header.match(/Content-Type: ([^\r\n]+)/);
158
+ if (fieldnameMatch && filenameMatch && mimetypeMatch) {
159
+ const fieldname = fieldnameMatch[1];
160
+ const filename = filenameMatch[1];
161
+ const contentType = mimetypeMatch[1].trim().toLowerCase();
162
+ if (allowedMimes.length > 0 && !allowedMimes.includes(contentType)) {
163
+ continue;
164
+ }
165
+ files.push({
166
+ fieldname: fieldname,
167
+ originalname: filename,
168
+ encoding: "",
169
+ mimetype: contentType,
170
+ size: content.length,
171
+ stream: new stream.Readable(),
172
+ destination: "",
173
+ filename: filename,
174
+ path: "",
175
+ buffer: buffer.slice(0, -2),
176
+ });
177
+ }
178
+ }
179
+ }
180
+ if (!files.length) {
181
+ throw new HandleError.HandleError("No files were uploaded", "BAD_REQUEST", 400);
182
+ }
183
+ req.file = files[0];
184
+ req.files = files;
185
+ next();
186
+ });
187
+ };
188
+
189
+ exports.cors = cors;
190
+ exports.files = files;
191
+ exports.json = json;
192
+ exports.raw = raw;
193
+ exports.text = text;
194
+ exports.urlencoded = urlencoded;
2
195
  //# sourceMappingURL=Middlewares.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Middlewares.js","sources":["../src/Middlewares.ts"],"sourcesContent":[null],"names":["allowOrigin","req","res","next","origin","headers","setHeader","method","status","end","allowedMimes","__awaiter","map","mime","trim","toLowerCase","rawBody","Promise","resolve","reject","chunks","on","chunk","push","Buffer","from","concat","startsWith","HandleError","boundary","split","parts","toString","files","part","includes","header","body","content","join","buffer","fieldnameMatch","match","filenameMatch","mimetypeMatch","fieldname","filename","contentType","length","originalname","encoding","mimetype","size","stream","Readable","destination","path","slice","file","options","BodyParser","json","raw","text","urlencoded"],"mappings":"wJAuGoB,CAACA,EAAsB,MACnC,CAACC,EAAKC,EAAKC,KAEjB,MAAMC,EAASH,EAAII,QAAQD,OAU3B,GAPAF,EAAII,UAAU,8BAA+C,MAAhBN,EAAsB,IAAMI,GAAU,KACnFF,EAAII,UAAU,+BAAgC,+BAC9CJ,EAAII,UAAU,+BAAgC,iFAC9CJ,EAAII,UAAU,mCAAoC,QAClDJ,EAAII,UAAU,gCAAiC,iCAG5B,YAAfL,EAAIM,OACP,OAAOL,EAAIM,OAAO,KAAKC,MAGxBN,mBAmBmB,IAAIO,IACjB,CAAOT,EAAKC,EAAKC,IAAQQ,EAAAA,eAAA,OAAA,OAAA,EAAA,YAC/BD,EAAeA,EAAaE,IAAKC,GAASA,EAAKC,OAAOC,eAEtD,MAAMC,QAAgB,IAAIC,QAAgB,CAACC,EAASC,KACnD,MAAMC,EAAmB,GACzBnB,EAAIoB,GAAG,OAASC,GAAUF,EAAOG,KAAKC,OAAOC,KAAKH,KAClDrB,EAAIoB,GAAG,MAAO,IAAMH,EAAQM,OAAOE,OAAON,KAC1CnB,EAAIoB,GAAG,QAASF,KAGjB,IAAKlB,EAAII,QAAQ,kBAAoBJ,EAAII,QAAQ,gBAAgBsB,WAAW,uBAC3E,MAAM,IAAIC,EAAAA,YAAY,uBAAwB,cAAe,KAG9D,MAAMC,EAAW5B,EAAII,QAAQ,gBAAgByB,MAAM,aAAa,GAC1DC,EAAQf,EAAQgB,SAAS,UAAUF,MAAM,KAAKD,KAC9CI,EAAoB,GAE1B,IAAK,MAAMC,KAAQH,EAClB,GAAIG,EAAKC,SAAS,cAAe,CAChC,MAAOC,KAAWC,GAAQH,EAAKJ,MAAM,YAC/BQ,EAAUD,EAAKE,KAAK,YAAYzB,OAChC0B,EAAShB,OAAOC,KAAKa,EAAS,UAG9BG,EAAiBL,EAAOM,MAAM,kBAC9BC,EAAgBP,EAAOM,MAAM,sBAC7BE,EAAgBR,EAAOM,MAAM,4BAEnC,GAAID,GAAkBE,GAAiBC,EAAe,CACrD,MAAMC,EAAYJ,EAAe,GAC3BK,EAAWH,EAAc,GACzBI,EAAcH,EAAc,GAAG9B,OAAOC,cAC5C,GAAIL,EAAasC,OAAS,IAAMtC,EAAayB,SAASY,GACrD,SAEDd,EAAMV,KAAK,CACVsB,UAAWA,EACXI,aAAcH,EACdI,SAAU,GACVC,SAAUJ,EACVK,KAAMd,EAAQU,OACdK,OAAQ,IAAIC,EAAAA,SACZC,YAAa,GACbT,SAAUA,EACVU,KAAM,GACNhB,OAAQA,EAAOiB,MAAM,GAAI,IAE1B,CACD,CAGF,IAAKxB,EAAMe,OACV,MAAM,IAAIpB,EAAAA,YAAY,yBAA0B,cAAe,KAGhE3B,EAAIyD,KAAOzB,EAAM,GACjBhC,EAAIgC,MAAQA,EAEZ9B,GACD,gBA/KoBwD,GACbC,EAAWC,KAAKF,eAwBJA,GACZC,EAAWE,IAAIH,gBAwBFA,GACbC,EAAWG,KAAKJ,sBAuBGA,GACnBC,EAAWI,WAAWL"}
1
+ {"version":3,"file":"Middlewares.js","sources":["../src/Middlewares.ts"],"sourcesContent":[null],"names":["__awaiter","HandleError","Readable"],"mappings":"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"}
@@ -1,2 +1,171 @@
1
- import{__rest as e}from"./node_modules/tslib/tslib.es6.esm.js";import{joinDocs as s,createDynamicMiddleware as t,joinObject as r}from"./utils.esm.js";import{RequestMiddleware as i}from"./middleware.esm.js";import{Router as d}from"./router.esm.js";import{uuidv4 as o}from"@ismael1361/utils";class h extends i{constructor(e,s,t,r){super(void 0,e),this.router=e,this.type=s,this.path=t,this.doc=r,this.middlewares=[]}middleware(e,r){return e instanceof i?e.router.layers.filter(({type:e,handle:s})=>"middleware"===e&&!!s).map(({handle:e})=>e).forEach(e=>this.middlewares.push(...e)):this.middlewares.push(t(e)),r&&(this.doc=s(this.doc||{},r)),this}handler(i,d){i instanceof a?i.router.layers.filter(({type:e,handle:s})=>"middleware"===e&&!!s).map(({handle:e})=>e).forEach(e=>this.middlewares.push(...e)):this.middlewares.push(t(i));const o=this.router.layers[this.type](this.path,this.middlewares,s(this.doc||{},d||{}));return{type:this.type,path:this.path,middlewares:this.middlewares,handler:this.middlewares.length>0?this.middlewares[this.middlewares.length-1]:void 0,doc(t,i={}){const{components:d={}}=t,h=e(t,["components"]);return o.doc=s(o.doc,Object.assign(Object.assign({},h),{components:r(d,i)})),this}}}}class a{constructor(e,r=new d,i){this.router=r,this.doc=i,e&&(e instanceof a?e.router.layers.forEach(e=>{this.router.layers.push(e)}):(e.id=e.id||o("-"),e.doc=s((null==e?void 0:e.doc)||{},i||{}),this.router.middleware(t(e))))}execute(e,s,t){return this.router.executeMiddlewares(e,s,t)}}export{a as Handler,h as RequestHandler};
1
+ import { __rest } from './node_modules/tslib/tslib.es6.esm.js';
2
+ import { joinDocs, createDynamicMiddleware, joinObject } from './utils.esm.js';
3
+ import { RequestMiddleware } from './middleware.esm.js';
4
+ import { Router } from './router.esm.js';
5
+ import { uuidv4 } from '@ismael1361/utils';
6
+
7
+ /**
8
+ * Representa um construtor de rotas encadeável.
9
+ *
10
+ * Esta classe não deve ser instanciada diretamente. Em vez disso, uma instância é retornada
11
+ * quando você chama um método de rota como `.get()`, `.post()`, etc., em uma instância de `Router`.
12
+ *
13
+ * Ela permite encadear middlewares específicos para a rota e, finalmente, definir o manipulador
14
+ * da rota e sua documentação.
15
+ *
16
+ * @example
17
+ * const router = create();
18
+ *
19
+ * // A chamada a `router.post()` retorna uma instância de RequestHandler.
20
+ * router.post('/users')
21
+ * // .middleware() aplica um middleware apenas a esta rota.
22
+ * .middleware(validationMiddleware)
23
+ * // .handler() define o controlador final da rota.
24
+ * .handler((req, res) => {
25
+ * res.status(201).json({ id: 1, ...req.body });
26
+ * })
27
+ * // .doc() anexa a documentação OpenAPI ao endpoint finalizado.
28
+ * .doc({
29
+ * summary: 'Cria um novo usuário',
30
+ * tags: ['Users'],
31
+ * body: { description: 'Dados do usuário' }
32
+ * });
33
+ */
34
+ class RequestHandler extends RequestMiddleware {
35
+ /** @internal */
36
+ constructor(router, type, path, doc) {
37
+ super(undefined, router);
38
+ this.router = router;
39
+ this.type = type;
40
+ this.path = path;
41
+ this.doc = doc;
42
+ this.middlewares = [];
43
+ }
44
+ /**
45
+ * Anexa um middleware que será executado especificamente para esta rota.
46
+ * Múltiplos middlewares podem ser encadeados.
47
+ *
48
+ * @template Req - Tipo de Request estendido pelo middleware.
49
+ * @template Res - Tipo de Response estendido pelo middleware.
50
+ * @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função de middleware a ser aplicada.
51
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este middleware.
52
+ * @returns {RequestHandler<Rq & Req, Rs & Res>} A mesma instância de `RequestHandler` para permitir encadeamento.
53
+ */
54
+ middleware(callback, doc) {
55
+ if (callback instanceof RequestMiddleware) {
56
+ callback.router.layers
57
+ .filter(({ type, handle }) => type === "middleware" && !!handle)
58
+ .map(({ handle }) => handle)
59
+ .forEach((handle) => this.middlewares.push(...handle));
60
+ }
61
+ else {
62
+ this.middlewares.push(createDynamicMiddleware(callback));
63
+ }
64
+ if (doc) {
65
+ this.doc = joinDocs(this.doc || {}, doc);
66
+ }
67
+ return this;
68
+ }
69
+ /**
70
+ * Define a função de manipulador (controller) final para a rota.
71
+ * Esta chamada finaliza a cadeia de middlewares e registra a rota no roteador.
72
+ *
73
+ * @template Req - Tipo de Request estendido pelo manipulador.
74
+ * @template Res - Tipo de Response estendido pelo manipulador.
75
+ * @param {HandlerCallback<Rq & Req, Rs & Res>} callback - A função que processará a requisição.
76
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este manipulador.
77
+ * @returns {RouterProps} Um objeto que contém as propriedades da rota e um método `.doc()` para adicionar a documentação final.
78
+ */
79
+ handler(callback, doc) {
80
+ if (callback instanceof Handler) {
81
+ callback.router.layers
82
+ .filter(({ type, handle }) => type === "middleware" && !!handle)
83
+ .map(({ handle }) => handle)
84
+ .forEach((handle) => this.middlewares.push(...handle));
85
+ }
86
+ else {
87
+ this.middlewares.push(createDynamicMiddleware(callback));
88
+ }
89
+ const route = this.router.layers[this.type](this.path, this.middlewares, joinDocs(this.doc || {}, doc || {}));
90
+ return {
91
+ type: this.type,
92
+ path: this.path,
93
+ middlewares: this.middlewares,
94
+ handler: this.middlewares.length > 0 ? this.middlewares[this.middlewares.length - 1] : undefined,
95
+ doc(operation, components = {}) {
96
+ const { components: comp = {} } = operation, op = __rest(operation, ["components"]);
97
+ route.doc = joinDocs(route.doc, Object.assign(Object.assign({}, op), { components: joinObject(comp, components) }));
98
+ return this;
99
+ },
100
+ };
101
+ }
102
+ }
103
+ /**
104
+ * Cria um componente de manipulador (handler) reutilizável.
105
+ *
106
+ * Esta classe encapsula uma função de manipulador, permitindo que ela seja combinada
107
+ * com outros middlewares e reutilizada em diferentes rotas.
108
+ *
109
+ * @example
110
+ * // handler.ts
111
+ * export const getUserProfile = handler<{ user: { id: string } }>((req, res) => {
112
+ * res.json({ user: req.user });
113
+ * });
114
+ *
115
+ * // routes.ts
116
+ * router.get('/profile')
117
+ * .middleware(authMiddleware) // Adiciona `req.user`
118
+ * .handler(getUserProfile); // Reutiliza o handler
119
+ */
120
+ class Handler {
121
+ /** @internal */
122
+ constructor(callback, router = new Router(), doc) {
123
+ this.router = router;
124
+ this.doc = doc;
125
+ if (callback) {
126
+ if (callback instanceof Handler) {
127
+ callback.router.layers.forEach((l) => {
128
+ this.router.layers.push(l);
129
+ });
130
+ }
131
+ else {
132
+ callback.id = callback.id || uuidv4("-");
133
+ callback.doc = joinDocs((callback === null || callback === void 0 ? void 0 : callback.doc) || {}, doc || {});
134
+ this.router.middleware(createDynamicMiddleware(callback));
135
+ }
136
+ }
137
+ }
138
+ /**
139
+ * Executa a cadeia de middlewares e o manipulador final encapsulados por esta instância de `Handler`.
140
+ * Este método é útil para testes unitários ou para invocar programaticamente a lógica do handler
141
+ * fora do ciclo de requisição/resposta padrão do Express.
142
+ *
143
+ * @param {Rq} request - O objeto de requisição (ou um mock dele).
144
+ * @param {Rs} response - O objeto de resposta (ou um mock dele).
145
+ * @param {NextFunction} next - A função `next` a ser chamada ao final da cadeia.
146
+ * @returns {Promise<void>} Uma promessa que resolve quando a execução da cadeia é concluída.
147
+ *
148
+ * @example
149
+ * import { handler, Request, Response, NextFunction } from '@ismael1361/router';
150
+ *
151
+ * // 1. Crie um handler reutilizável
152
+ * const myHandler = handler<{ user: { id: string } }>((req, res) => {
153
+ * res.json({ userId: req.user.id });
154
+ * });
155
+ *
156
+ * // 2. Crie mocks para os objetos de requisição e resposta (ex: com Jest)
157
+ * const mockRequest = { user: { id: '123' } } as Request & { user: { id: string } };
158
+ * const mockResponse = { json: (data) => console.log(data) } as Response;
159
+ * const mockNext = () => {};
160
+ *
161
+ * // 3. Execute o handler programaticamente
162
+ * await myHandler.execute(mockRequest, mockResponse, mockNext);
163
+ * // Output: { userId: '123' }
164
+ */
165
+ execute(request, response, next) {
166
+ return this.router.executeMiddlewares(request, response, next);
167
+ }
168
+ }
169
+
170
+ export { Handler, RequestHandler };
2
171
  //# sourceMappingURL=handler.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler.esm.js","sources":["../src/handler.ts"],"sourcesContent":[null],"names":["RequestHandler","RequestMiddleware","constructor","router","type","path","doc","super","undefined","this","middlewares","middleware","callback","layers","filter","handle","map","forEach","push","createDynamicMiddleware","joinDocs","handler","Handler","route","length","operation","components","comp","op","__rest","Object","assign","joinObject","Router","l","id","uuidv4","execute","request","response","next","executeMiddlewares"],"mappings":"kSAkCM,MAAOA,UAAqFC,EAIjG,WAAAC,CAA4BC,EAAgCC,EAAqCC,EAAqBC,GACrHC,WAAMC,EAAWL,GADUM,KAAMN,OAANA,EAAgCM,KAAIL,KAAJA,EAAqCK,KAAIJ,KAAJA,EAAqBI,KAAGH,IAAHA,EAH7GG,KAAWC,YAA6B,EAKhD,CAYD,UAAAC,CAA2EC,EAAkDN,GAY5H,OAXIM,aAAoBX,EACvBW,EAAST,OAAOU,OACdC,OAAO,EAAGV,OAAMW,YAAsB,eAATX,KAA2BW,GACxDC,IAAI,EAAGD,YAAaA,GACpBE,QAASF,GAAWN,KAAKC,YAAYQ,QAAQH,IAE/CN,KAAKC,YAAYQ,KAAKC,EAAwBP,IAE3CN,IACHG,KAAKH,IAAMc,EAASX,KAAKH,KAAO,CAAA,EAAIA,IAE9BG,IACP,CAYD,OAAAY,CAAwET,EAA+CN,GAClHM,aAAoBU,EACvBV,EAAST,OAAOU,OACdC,OAAO,EAAGV,OAAMW,YAAsB,eAATX,KAA2BW,GACxDC,IAAI,EAAGD,YAAaA,GACpBE,QAASF,GAAWN,KAAKC,YAAYQ,QAAQH,IAE/CN,KAAKC,YAAYQ,KAAKC,EAAwBP,IAG/C,MAAMW,EAAQd,KAAKN,OAAOU,OAAOJ,KAAKL,MAAMK,KAAKJ,KAAMI,KAAKC,YAAaU,EAASX,KAAKH,KAAO,CAAA,EAAIA,GAAO,CAAE,IAE3G,MAAO,CACNF,KAAMK,KAAKL,KACXC,KAAMI,KAAKJ,KACXK,YAAaD,KAAKC,YAClBW,QAASZ,KAAKC,YAAYc,OAAS,EAAIf,KAAKC,YAAYD,KAAKC,YAAYc,OAAS,QAAKhB,EACvF,GAAAF,CAAImB,EAAqDC,EAAsC,IAC9F,MAAQA,WAAYC,EAAO,CAAA,GAAcF,EAAPG,EAAOC,EAAAJ,EAAnC,CAAA,eAGN,OADAF,EAAMjB,IAAMc,EAASG,EAAMjB,IAAUwB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAH,IAAIF,WAAYM,EAAWL,EAAMD,MAC/DjB,IACP,EAEF,QAoBWa,EAEZ,WAAApB,CAAYU,EAAwDT,EAAiB,IAAI8B,EAAiB3B,GAAtCG,KAAMN,OAANA,EAAsCM,KAAGH,IAAHA,EACrGM,IACCA,aAAoBU,EACvBV,EAAST,OAAOU,OAAOI,QAASiB,IAC/BzB,KAAKN,OAAOU,OAAOK,KAAKgB,MAGzBtB,EAASuB,GAAKvB,EAASuB,IAAMC,EAAO,KACpCxB,EAASN,IAAMc,GAASR,aAAQ,EAARA,EAAUN,MAAO,CAAA,EAAIA,GAAO,CAAA,GACpDG,KAAKN,OAAOQ,WAAWQ,EAAwBP,KAGjD,CA6BD,OAAAyB,CAAQC,EAAaC,EAAcC,GAClC,OAAO/B,KAAKN,OAAOsC,mBAAmBH,EAASC,EAAUC,EACzD"}
1
+ {"version":3,"file":"handler.esm.js","sources":["../src/handler.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
package/dist/handler.js CHANGED
@@ -1,2 +1,174 @@
1
- "use strict";var e=require("./node_modules/tslib/tslib.es6.js"),s=require("./utils.js"),t=require("./middleware.js"),r=require("./router.js"),i=require("@ismael1361/utils");class d extends t.RequestMiddleware{constructor(e,s,t,r){super(void 0,e),this.router=e,this.type=s,this.path=t,this.doc=r,this.middlewares=[]}middleware(e,r){return e instanceof t.RequestMiddleware?e.router.layers.filter(({type:e,handle:s})=>"middleware"===e&&!!s).map(({handle:e})=>e).forEach(e=>this.middlewares.push(...e)):this.middlewares.push(s.createDynamicMiddleware(e)),r&&(this.doc=s.joinDocs(this.doc||{},r)),this}handler(t,r){t instanceof a?t.router.layers.filter(({type:e,handle:s})=>"middleware"===e&&!!s).map(({handle:e})=>e).forEach(e=>this.middlewares.push(...e)):this.middlewares.push(s.createDynamicMiddleware(t));const i=this.router.layers[this.type](this.path,this.middlewares,s.joinDocs(this.doc||{},r||{}));return{type:this.type,path:this.path,middlewares:this.middlewares,handler:this.middlewares.length>0?this.middlewares[this.middlewares.length-1]:void 0,doc(t,r={}){const{components:d={}}=t,a=e.__rest(t,["components"]);return i.doc=s.joinDocs(i.doc,Object.assign(Object.assign({},a),{components:s.joinObject(d,r)})),this}}}}class a{constructor(e,t=new r.Router,d){this.router=t,this.doc=d,e&&(e instanceof a?e.router.layers.forEach(e=>{this.router.layers.push(e)}):(e.id=e.id||i.uuidv4("-"),e.doc=s.joinDocs((null==e?void 0:e.doc)||{},d||{}),this.router.middleware(s.createDynamicMiddleware(e))))}execute(e,s,t){return this.router.executeMiddlewares(e,s,t)}}exports.Handler=a,exports.RequestHandler=d;
1
+ 'use strict';
2
+
3
+ var tslib_es6 = require('./node_modules/tslib/tslib.es6.js');
4
+ var utils$1 = require('./utils.js');
5
+ var middleware = require('./middleware.js');
6
+ var router = require('./router.js');
7
+ var utils = require('@ismael1361/utils');
8
+
9
+ /**
10
+ * Representa um construtor de rotas encadeável.
11
+ *
12
+ * Esta classe não deve ser instanciada diretamente. Em vez disso, uma instância é retornada
13
+ * quando você chama um método de rota como `.get()`, `.post()`, etc., em uma instância de `Router`.
14
+ *
15
+ * Ela permite encadear middlewares específicos para a rota e, finalmente, definir o manipulador
16
+ * da rota e sua documentação.
17
+ *
18
+ * @example
19
+ * const router = create();
20
+ *
21
+ * // A chamada a `router.post()` retorna uma instância de RequestHandler.
22
+ * router.post('/users')
23
+ * // .middleware() aplica um middleware apenas a esta rota.
24
+ * .middleware(validationMiddleware)
25
+ * // .handler() define o controlador final da rota.
26
+ * .handler((req, res) => {
27
+ * res.status(201).json({ id: 1, ...req.body });
28
+ * })
29
+ * // .doc() anexa a documentação OpenAPI ao endpoint finalizado.
30
+ * .doc({
31
+ * summary: 'Cria um novo usuário',
32
+ * tags: ['Users'],
33
+ * body: { description: 'Dados do usuário' }
34
+ * });
35
+ */
36
+ class RequestHandler extends middleware.RequestMiddleware {
37
+ /** @internal */
38
+ constructor(router, type, path, doc) {
39
+ super(undefined, router);
40
+ this.router = router;
41
+ this.type = type;
42
+ this.path = path;
43
+ this.doc = doc;
44
+ this.middlewares = [];
45
+ }
46
+ /**
47
+ * Anexa um middleware que será executado especificamente para esta rota.
48
+ * Múltiplos middlewares podem ser encadeados.
49
+ *
50
+ * @template Req - Tipo de Request estendido pelo middleware.
51
+ * @template Res - Tipo de Response estendido pelo middleware.
52
+ * @param {MiddlewareCallback<Rq & Req, Rs & Res>} callback - A função de middleware a ser aplicada.
53
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este middleware.
54
+ * @returns {RequestHandler<Rq & Req, Rs & Res>} A mesma instância de `RequestHandler` para permitir encadeamento.
55
+ */
56
+ middleware(callback, doc) {
57
+ if (callback instanceof middleware.RequestMiddleware) {
58
+ callback.router.layers
59
+ .filter(({ type, handle }) => type === "middleware" && !!handle)
60
+ .map(({ handle }) => handle)
61
+ .forEach((handle) => this.middlewares.push(...handle));
62
+ }
63
+ else {
64
+ this.middlewares.push(utils$1.createDynamicMiddleware(callback));
65
+ }
66
+ if (doc) {
67
+ this.doc = utils$1.joinDocs(this.doc || {}, doc);
68
+ }
69
+ return this;
70
+ }
71
+ /**
72
+ * Define a função de manipulador (controller) final para a rota.
73
+ * Esta chamada finaliza a cadeia de middlewares e registra a rota no roteador.
74
+ *
75
+ * @template Req - Tipo de Request estendido pelo manipulador.
76
+ * @template Res - Tipo de Response estendido pelo manipulador.
77
+ * @param {HandlerCallback<Rq & Req, Rs & Res>} callback - A função que processará a requisição.
78
+ * @param {MiddlewareFCDoc} [doc] - Documentação OpenAPI opcional para este manipulador.
79
+ * @returns {RouterProps} Um objeto que contém as propriedades da rota e um método `.doc()` para adicionar a documentação final.
80
+ */
81
+ handler(callback, doc) {
82
+ if (callback instanceof Handler) {
83
+ callback.router.layers
84
+ .filter(({ type, handle }) => type === "middleware" && !!handle)
85
+ .map(({ handle }) => handle)
86
+ .forEach((handle) => this.middlewares.push(...handle));
87
+ }
88
+ else {
89
+ this.middlewares.push(utils$1.createDynamicMiddleware(callback));
90
+ }
91
+ const route = this.router.layers[this.type](this.path, this.middlewares, utils$1.joinDocs(this.doc || {}, doc || {}));
92
+ return {
93
+ type: this.type,
94
+ path: this.path,
95
+ middlewares: this.middlewares,
96
+ handler: this.middlewares.length > 0 ? this.middlewares[this.middlewares.length - 1] : undefined,
97
+ doc(operation, components = {}) {
98
+ const { components: comp = {} } = operation, op = tslib_es6.__rest(operation, ["components"]);
99
+ route.doc = utils$1.joinDocs(route.doc, Object.assign(Object.assign({}, op), { components: utils$1.joinObject(comp, components) }));
100
+ return this;
101
+ },
102
+ };
103
+ }
104
+ }
105
+ /**
106
+ * Cria um componente de manipulador (handler) reutilizável.
107
+ *
108
+ * Esta classe encapsula uma função de manipulador, permitindo que ela seja combinada
109
+ * com outros middlewares e reutilizada em diferentes rotas.
110
+ *
111
+ * @example
112
+ * // handler.ts
113
+ * export const getUserProfile = handler<{ user: { id: string } }>((req, res) => {
114
+ * res.json({ user: req.user });
115
+ * });
116
+ *
117
+ * // routes.ts
118
+ * router.get('/profile')
119
+ * .middleware(authMiddleware) // Adiciona `req.user`
120
+ * .handler(getUserProfile); // Reutiliza o handler
121
+ */
122
+ class Handler {
123
+ /** @internal */
124
+ constructor(callback, router$1 = new router.Router(), doc) {
125
+ this.router = router$1;
126
+ this.doc = doc;
127
+ if (callback) {
128
+ if (callback instanceof Handler) {
129
+ callback.router.layers.forEach((l) => {
130
+ this.router.layers.push(l);
131
+ });
132
+ }
133
+ else {
134
+ callback.id = callback.id || utils.uuidv4("-");
135
+ callback.doc = utils$1.joinDocs((callback === null || callback === void 0 ? void 0 : callback.doc) || {}, doc || {});
136
+ this.router.middleware(utils$1.createDynamicMiddleware(callback));
137
+ }
138
+ }
139
+ }
140
+ /**
141
+ * Executa a cadeia de middlewares e o manipulador final encapsulados por esta instância de `Handler`.
142
+ * Este método é útil para testes unitários ou para invocar programaticamente a lógica do handler
143
+ * fora do ciclo de requisição/resposta padrão do Express.
144
+ *
145
+ * @param {Rq} request - O objeto de requisição (ou um mock dele).
146
+ * @param {Rs} response - O objeto de resposta (ou um mock dele).
147
+ * @param {NextFunction} next - A função `next` a ser chamada ao final da cadeia.
148
+ * @returns {Promise<void>} Uma promessa que resolve quando a execução da cadeia é concluída.
149
+ *
150
+ * @example
151
+ * import { handler, Request, Response, NextFunction } from '@ismael1361/router';
152
+ *
153
+ * // 1. Crie um handler reutilizável
154
+ * const myHandler = handler<{ user: { id: string } }>((req, res) => {
155
+ * res.json({ userId: req.user.id });
156
+ * });
157
+ *
158
+ * // 2. Crie mocks para os objetos de requisição e resposta (ex: com Jest)
159
+ * const mockRequest = { user: { id: '123' } } as Request & { user: { id: string } };
160
+ * const mockResponse = { json: (data) => console.log(data) } as Response;
161
+ * const mockNext = () => {};
162
+ *
163
+ * // 3. Execute o handler programaticamente
164
+ * await myHandler.execute(mockRequest, mockResponse, mockNext);
165
+ * // Output: { userId: '123' }
166
+ */
167
+ execute(request, response, next) {
168
+ return this.router.executeMiddlewares(request, response, next);
169
+ }
170
+ }
171
+
172
+ exports.Handler = Handler;
173
+ exports.RequestHandler = RequestHandler;
2
174
  //# sourceMappingURL=handler.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sources":["../src/handler.ts"],"sourcesContent":[null],"names":["RequestHandler","RequestMiddleware","constructor","router","type","path","doc","super","undefined","this","middlewares","middleware","callback","layers","filter","handle","map","forEach","push","createDynamicMiddleware","joinDocs","handler","Handler","route","length","operation","components","comp","op","__rest","Object","assign","joinObject","Router","l","id","uuidv4","execute","request","response","next","executeMiddlewares"],"mappings":"6KAkCM,MAAOA,UAAqFC,EAAAA,kBAIjG,WAAAC,CAA4BC,EAAgCC,EAAqCC,EAAqBC,GACrHC,WAAMC,EAAWL,GADUM,KAAMN,OAANA,EAAgCM,KAAIL,KAAJA,EAAqCK,KAAIJ,KAAJA,EAAqBI,KAAGH,IAAHA,EAH7GG,KAAWC,YAA6B,EAKhD,CAYD,UAAAC,CAA2EC,EAAkDN,GAY5H,OAXIM,aAAoBX,EAAAA,kBACvBW,EAAST,OAAOU,OACdC,OAAO,EAAGV,OAAMW,YAAsB,eAATX,KAA2BW,GACxDC,IAAI,EAAGD,YAAaA,GACpBE,QAASF,GAAWN,KAAKC,YAAYQ,QAAQH,IAE/CN,KAAKC,YAAYQ,KAAKC,EAAAA,wBAAwBP,IAE3CN,IACHG,KAAKH,IAAMc,WAASX,KAAKH,KAAO,CAAA,EAAIA,IAE9BG,IACP,CAYD,OAAAY,CAAwET,EAA+CN,GAClHM,aAAoBU,EACvBV,EAAST,OAAOU,OACdC,OAAO,EAAGV,OAAMW,YAAsB,eAATX,KAA2BW,GACxDC,IAAI,EAAGD,YAAaA,GACpBE,QAASF,GAAWN,KAAKC,YAAYQ,QAAQH,IAE/CN,KAAKC,YAAYQ,KAAKC,EAAAA,wBAAwBP,IAG/C,MAAMW,EAAQd,KAAKN,OAAOU,OAAOJ,KAAKL,MAAMK,KAAKJ,KAAMI,KAAKC,YAAaU,EAAQA,SAACX,KAAKH,KAAO,CAAA,EAAIA,GAAO,CAAE,IAE3G,MAAO,CACNF,KAAMK,KAAKL,KACXC,KAAMI,KAAKJ,KACXK,YAAaD,KAAKC,YAClBW,QAASZ,KAAKC,YAAYc,OAAS,EAAIf,KAAKC,YAAYD,KAAKC,YAAYc,OAAS,QAAKhB,EACvF,GAAAF,CAAImB,EAAqDC,EAAsC,IAC9F,MAAQA,WAAYC,EAAO,CAAA,GAAcF,EAAPG,EAAOC,SAAAJ,EAAnC,CAAA,eAGN,OADAF,EAAMjB,IAAMc,WAASG,EAAMjB,IAAUwB,OAAAC,OAAAD,OAAAC,OAAA,CAAA,EAAAH,IAAIF,WAAYM,EAAAA,WAAWL,EAAMD,MAC/DjB,IACP,EAEF,QAoBWa,EAEZ,WAAApB,CAAYU,EAAwDT,EAAiB,IAAI8B,EAAMA,OAAW3B,GAAtCG,KAAMN,OAANA,EAAsCM,KAAGH,IAAHA,EACrGM,IACCA,aAAoBU,EACvBV,EAAST,OAAOU,OAAOI,QAASiB,IAC/BzB,KAAKN,OAAOU,OAAOK,KAAKgB,MAGzBtB,EAASuB,GAAKvB,EAASuB,IAAMC,EAAMA,OAAC,KACpCxB,EAASN,IAAMc,EAAQA,UAACR,aAAQ,EAARA,EAAUN,MAAO,CAAA,EAAIA,GAAO,CAAA,GACpDG,KAAKN,OAAOQ,WAAWQ,EAAAA,wBAAwBP,KAGjD,CA6BD,OAAAyB,CAAQC,EAAaC,EAAcC,GAClC,OAAO/B,KAAKN,OAAOsC,mBAAmBH,EAASC,EAAUC,EACzD"}
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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"}