veloce-ts 0.2.2 → 0.2.4

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 (67) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cjs/src/index.js +11 -11
  3. package/dist/cjs/src/index.js.map +7 -7
  4. package/dist/cjs/src/testing/index.js +4 -4
  5. package/dist/cjs/src/testing/index.js.map +3 -3
  6. package/dist/cjs/src/websocket/index.js +15 -2
  7. package/dist/cjs/src/websocket/index.js.map +7 -4
  8. package/dist/esm/chunk-2100y16g.js +5 -0
  9. package/dist/esm/chunk-2100y16g.js.map +10 -0
  10. package/dist/esm/{chunk-9f0s1qbb.js → chunk-5q75d71c.js} +2 -2
  11. package/dist/esm/{chunk-9f0s1qbb.js.map → chunk-5q75d71c.js.map} +1 -1
  12. package/dist/esm/{chunk-09p9prja.js → chunk-8dpc6an2.js} +1 -1
  13. package/dist/esm/{chunk-r8ssy5cv.js → chunk-9v7atckx.js} +2 -2
  14. package/dist/esm/{chunk-r8ssy5cv.js.map → chunk-9v7atckx.js.map} +1 -1
  15. package/dist/esm/{chunk-dpjkne9h.js → chunk-bvstdn0t.js} +1 -1
  16. package/dist/esm/{chunk-dfhwaw13.js → chunk-ctwpr5gr.js} +1 -1
  17. package/dist/esm/{chunk-q0w1t07v.js → chunk-dfay135z.js} +3 -3
  18. package/dist/esm/{chunk-q0w1t07v.js.map → chunk-dfay135z.js.map} +1 -1
  19. package/dist/esm/{chunk-3vd5qsws.js → chunk-dtw2tbsd.js} +2 -2
  20. package/dist/esm/{chunk-3vd5qsws.js.map → chunk-dtw2tbsd.js.map} +1 -1
  21. package/dist/esm/{chunk-qg4ngg5j.js → chunk-k66rn4fj.js} +3 -3
  22. package/dist/esm/{chunk-qg4ngg5j.js.map → chunk-k66rn4fj.js.map} +1 -1
  23. package/dist/esm/{chunk-vzhqg5mb.js → chunk-mky5qqg0.js} +3 -3
  24. package/dist/esm/{chunk-vzhqg5mb.js.map → chunk-mky5qqg0.js.map} +1 -1
  25. package/dist/esm/{chunk-vkkzgaf7.js → chunk-mznkhz9c.js} +2 -2
  26. package/dist/esm/{chunk-vkkzgaf7.js.map → chunk-mznkhz9c.js.map} +1 -1
  27. package/dist/esm/{chunk-3nhrrhv9.js → chunk-s5z0wb7e.js} +3 -3
  28. package/dist/esm/{chunk-3nhrrhv9.js.map → chunk-s5z0wb7e.js.map} +1 -1
  29. package/dist/esm/{chunk-gy9nsvnk.js → chunk-vh4sxcpe.js} +3 -3
  30. package/dist/esm/{chunk-gy9nsvnk.js.map → chunk-vh4sxcpe.js.map} +1 -1
  31. package/dist/esm/{chunk-4s66h6qw.js → chunk-xa333k40.js} +1 -1
  32. package/dist/esm/{chunk-f64j5zbr.js → chunk-y262e56g.js} +2 -2
  33. package/dist/esm/{chunk-f64j5zbr.js.map → chunk-y262e56g.js.map} +1 -1
  34. package/dist/esm/{chunk-sv2c5krg.js → chunk-yq3gf9ts.js} +3 -3
  35. package/dist/esm/{chunk-sv2c5krg.js.map → chunk-yq3gf9ts.js.map} +1 -1
  36. package/dist/esm/src/cli/index.js +3 -3
  37. package/dist/esm/src/cli/index.js.map +1 -1
  38. package/dist/esm/src/docs/index.js +3 -3
  39. package/dist/esm/src/docs/index.js.map +1 -1
  40. package/dist/esm/src/errors/index.js +2 -2
  41. package/dist/esm/src/errors/index.js.map +1 -1
  42. package/dist/esm/src/graphql/index.js +2 -2
  43. package/dist/esm/src/graphql/index.js.map +1 -1
  44. package/dist/esm/src/index.js +3 -3
  45. package/dist/esm/src/index.js.map +4 -5
  46. package/dist/esm/src/middleware/index.js +2 -2
  47. package/dist/esm/src/middleware/index.js.map +1 -1
  48. package/dist/esm/src/plugins/index.js +3 -3
  49. package/dist/esm/src/plugins/index.js.map +1 -1
  50. package/dist/esm/src/testing/index.js +2 -2
  51. package/dist/esm/src/testing/index.js.map +4 -5
  52. package/dist/esm/src/types/index.js +2 -2
  53. package/dist/esm/src/types/index.js.map +1 -1
  54. package/dist/esm/src/validation/index.js +2 -2
  55. package/dist/esm/src/validation/index.js.map +1 -1
  56. package/dist/esm/src/websocket/index.js +2 -2
  57. package/dist/esm/src/websocket/index.js.map +4 -3
  58. package/dist/types/core/router-compiler.d.ts.map +1 -1
  59. package/dist/types/decorators/params.d.ts +8 -2
  60. package/dist/types/decorators/params.d.ts.map +1 -1
  61. package/dist/types/websocket/index.d.ts +1 -0
  62. package/dist/types/websocket/index.d.ts.map +1 -1
  63. package/package.json +1 -1
  64. /package/dist/esm/{chunk-09p9prja.js.map → chunk-8dpc6an2.js.map} +0 -0
  65. /package/dist/esm/{chunk-dpjkne9h.js.map → chunk-bvstdn0t.js.map} +0 -0
  66. /package/dist/esm/{chunk-dfhwaw13.js.map → chunk-ctwpr5gr.js.map} +0 -0
  67. /package/dist/esm/{chunk-4s66h6qw.js.map → chunk-xa333k40.js.map} +0 -0
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{G as e,H as r,I as o}from"../../chunk-3vd5qsws.js";import"../../chunk-f64j5zbr.js";export{r as createRateLimitMiddleware,e as createCorsMiddleware,o as createCompressionMiddleware};
2
+ import{K as e,L as r,M as o}from"../../chunk-dtw2tbsd.js";import"../../chunk-y262e56g.js";export{r as createRateLimitMiddleware,e as createCorsMiddleware,o as createCompressionMiddleware};
3
3
 
4
- //# debugId=E2654447602DC5C464756E2164756E21
4
+ //# debugId=79511347B92A29D464756E2164756E21
@@ -4,6 +4,6 @@
4
4
  "sourcesContent": [
5
5
  ],
6
6
  "mappings": "",
7
- "debugId": "E2654447602DC5C464756E2164756E21",
7
+ "debugId": "79511347B92A29D464756E2164756E21",
8
8
  "names": []
9
9
  }
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{d as m}from"../../chunk-vkkzgaf7.js";import{M as u}from"../docs/index.js";import{da as b}from"../../chunk-q0w1t07v.js";import"../../chunk-qg4ngg5j.js";import"../../chunk-vzhqg5mb.js";import"../../chunk-sv2c5krg.js";import"../../chunk-r8ssy5cv.js";import"../../chunk-9f0s1qbb.js";import"../../chunk-f64j5zbr.js";class x{name="openapi";version="1.0.0";options;constructor(l){this.options={title:l?.title||"Veloce-TS API",version:l?.version||"1.0.0",description:l?.description||"API built with Veloce-TS",path:l?.path||"/openapi.json",docsPath:l?.docsPath||"/docs",docs:l?.docs!==!1}}async install(l){let r=l.getConfig();if(r.title)this.options.title=r.title;if(r.version)this.options.version=r.version;if(r.description)this.options.description=r.description;l.get(this.options.path,{handler:async()=>{return this.generateSpec(l)},docs:{summary:"Get OpenAPI specification",description:"Returns the OpenAPI 3.0 specification for this API",tags:["Documentation"]}})}generateSpec(l){let r=l.getMetadata();return new u(r,this.options).generate()}renderSwaggerUI(){return`<!DOCTYPE html>
2
+ import{h as m}from"../../chunk-mznkhz9c.js";import{Q as u}from"../docs/index.js";import{ha as b}from"../../chunk-dfay135z.js";import"../../chunk-k66rn4fj.js";import"../../chunk-mky5qqg0.js";import"../../chunk-yq3gf9ts.js";import"../../chunk-9v7atckx.js";import"../../chunk-5q75d71c.js";import"../../chunk-y262e56g.js";class x{name="openapi";version="1.0.0";options;constructor(l){this.options={title:l?.title||"Veloce-TS API",version:l?.version||"1.0.0",description:l?.description||"API built with Veloce-TS",path:l?.path||"/openapi.json",docsPath:l?.docsPath||"/docs",docs:l?.docs!==!1}}async install(l){let r=l.getConfig();if(r.title)this.options.title=r.title;if(r.version)this.options.version=r.version;if(r.description)this.options.description=r.description;l.get(this.options.path,{handler:async()=>{return this.generateSpec(l)},docs:{summary:"Get OpenAPI specification",description:"Returns the OpenAPI 3.0 specification for this API",tags:["Documentation"]}})}generateSpec(l){let r=l.getMetadata();return new u(r,this.options).generate()}renderSwaggerUI(){return`<!DOCTYPE html>
3
3
  <html lang="en">
4
4
  <head>
5
5
  <meta charset="UTF-8">
@@ -35,6 +35,6 @@ import{d as m}from"../../chunk-vkkzgaf7.js";import{M as u}from"../docs/index.js"
35
35
  };
36
36
  </script>
37
37
  </body>
38
- </html>`}}export{m as WebSocketPlugin,x as OpenAPIPlugin,b as GraphQLPlugin};export{x as a};
38
+ </html>`}}export{m as WebSocketPlugin,x as OpenAPIPlugin,b as GraphQLPlugin};export{x as e};
39
39
 
40
- //# debugId=132C6AF0F9CAF8E764756E2164756E21
40
+ //# debugId=9AA88DE5893AD9DC64756E2164756E21
@@ -5,6 +5,6 @@
5
5
  "// OpenAPI Plugin - Generates OpenAPI 3.0 specification and serves Swagger UI\r\nimport type { Plugin } from '../core/plugin';\r\nimport type { VeloceTS } from '../core/application';\r\nimport type { OpenAPIOptions } from '../types';\r\nimport { OpenAPIGenerator } from '../docs';\r\n\r\n/**\r\n * OpenAPIPlugin generates OpenAPI 3.0 specification from route metadata\r\n * and serves Swagger UI for interactive API documentation\r\n */\r\nexport class OpenAPIPlugin implements Plugin {\r\n name = 'openapi';\r\n version = '1.0.0';\r\n\r\n private options: Required<OpenAPIOptions>;\r\n\r\n constructor(options?: OpenAPIOptions) {\r\n this.options = {\r\n title: options?.title || 'Veloce-TS API',\r\n version: options?.version || '1.0.0',\r\n description: options?.description || 'API built with Veloce-TS',\r\n path: options?.path || '/openapi.json',\r\n docsPath: options?.docsPath || '/docs',\r\n docs: options?.docs !== false\r\n };\r\n }\r\n\r\n async install(app: VeloceTS): Promise<void> {\r\n // Get app config to merge with plugin options\r\n const appConfig = app.getConfig();\r\n if (appConfig.title) this.options.title = appConfig.title;\r\n if (appConfig.version) this.options.version = appConfig.version;\r\n if (appConfig.description) this.options.description = appConfig.description;\r\n\r\n // Register OpenAPI spec endpoint\r\n app.get(this.options.path, {\r\n handler: async () => {\r\n const spec = this.generateSpec(app);\r\n return spec;\r\n },\r\n docs: {\r\n summary: 'Get OpenAPI specification',\r\n description: 'Returns the OpenAPI 3.0 specification for this API',\r\n tags: ['Documentation']\r\n }\r\n });\r\n\r\n // Note: Swagger UI HTML is served via static files (public/docs.html)\r\n // This is more reliable than serving HTML from the plugin\r\n // The OpenAPI JSON spec is available at the configured path\r\n }\r\n\r\n /**\r\n * Generate OpenAPI 3.0 specification from application metadata\r\n */\r\n private generateSpec(app: VeloceTS) {\r\n const metadata = app.getMetadata();\r\n const generator = new OpenAPIGenerator(metadata, this.options);\r\n return generator.generate();\r\n }\r\n\r\n /**\r\n * Render Swagger UI HTML\r\n */\r\n private renderSwaggerUI(): string {\r\n return `<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n <meta charset=\"UTF-8\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n <title>${this.options.title} - API Documentation</title>\r\n <link rel=\"stylesheet\" href=\"https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui.css\" />\r\n <style>\r\n body {\r\n margin: 0;\r\n padding: 0;\r\n }\r\n </style>\r\n</head>\r\n<body>\r\n <div id=\"swagger-ui\"></div>\r\n <script src=\"https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-bundle.js\" crossorigin></script>\r\n <script src=\"https://unpkg.com/swagger-ui-dist@5.9.0/swagger-ui-standalone-preset.js\" crossorigin></script>\r\n <script>\r\n window.onload = function() {\r\n window.ui = SwaggerUIBundle({\r\n url: '${this.options.path}',\r\n dom_id: '#swagger-ui',\r\n deepLinking: true,\r\n presets: [\r\n SwaggerUIBundle.presets.apis,\r\n SwaggerUIStandalonePreset\r\n ],\r\n plugins: [\r\n SwaggerUIBundle.plugins.DownloadUrl\r\n ],\r\n layout: \"StandaloneLayout\"\r\n });\r\n };\r\n </script>\r\n</body>\r\n</html>`;\r\n }\r\n}\r\n"
6
6
  ],
7
7
  "mappings": ";qVAUO,HAAM,DAAgC,DAC3C,GAAO,QACP,MAAU,MAEF,MAER,WAAW,CAAC,EAA0B,CACpC,KAAK,QAAU,CACb,MAAO,GAAS,OAAS,gBACzB,QAAS,GAAS,SAAW,QAC7B,YAAa,GAAS,aAAe,2BACrC,KAAM,GAAS,MAAQ,gBACvB,SAAU,GAAS,UAAY,QAC/B,KAAM,GAAS,OAAS,EAC1B,OAGI,QAAO,CAAC,EAA8B,CAE1C,IAAM,EAAY,EAAI,UAAU,EAChC,GAAI,EAAU,MAAO,KAAK,QAAQ,MAAQ,EAAU,MACpD,GAAI,EAAU,QAAS,KAAK,QAAQ,QAAU,EAAU,QACxD,GAAI,EAAU,YAAa,KAAK,QAAQ,YAAc,EAAU,YAGhE,EAAI,IAAI,KAAK,QAAQ,KAAM,CACzB,QAAS,SAAY,CAEnB,OADa,KAAK,aAAa,CAAG,GAGpC,KAAM,CACJ,QAAS,4BACT,YAAa,qDACb,KAAM,CAAC,eAAe,CACxB,CACF,CAAC,EAUK,YAAY,CAAC,EAAe,CAClC,IAAM,EAAW,EAAI,YAAY,EAEjC,OADkB,IAAI,EAAiB,EAAU,KAAK,OAAO,EAC5C,SAAS,EAMpB,eAAe,EAAW,CAChC,MAAO;AAAA;AAAA;AAAA;AAAA;AAAA,WAKA,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAgBR,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,SAiB7B",
8
- "debugId": "132C6AF0F9CAF8E764756E2164756E21",
8
+ "debugId": "9AA88DE5893AD9DC64756E2164756E21",
9
9
  "names": []
10
10
  }
@@ -1,4 +1,4 @@
1
1
  // @bun
2
- import{G as Pn,H as $n,I as Sn}from"../../chunk-3vd5qsws.js";import{J as bn}from"../../chunk-gy9nsvnk.js";import{ea as Rn}from"../../chunk-qg4ngg5j.js";import{fa as un}from"../../chunk-vzhqg5mb.js";import"../../chunk-sv2c5krg.js";import"../../chunk-r8ssy5cv.js";import"../../chunk-9f0s1qbb.js";import{pa as as,qa as Xs,sa as fn,ta as Ds}from"../../chunk-f64j5zbr.js";var Gs={};fn(Gs,{HonoAdapter:()=>hn});class hn{hono;name="hono";runtime;constructor(s){this.hono=s;this.runtime=En()}listen(s,n){switch(this.runtime){case"bun":return this.listenBun(s,n);case"deno":return this.listenDeno(s,n);case"node":return this.listenNode(s,n);case"workerd":throw Error("Cloudflare Workers do not support listen(). Deploy using wrangler or export the handler with getHandler().");default:throw Error(`Unsupported runtime: ${this.runtime}. FastAPI-TS supports Bun, Node.js, Deno, and Cloudflare Workers.`)}}getHandler(){return this.hono.fetch}getRuntime(){return this.runtime}listenBun(s,n){let i=Bun.serve({port:s,fetch:this.hono.fetch});if(n)n();return i}listenDeno(s,n){let i=new AbortController;return Deno.serve({port:s,signal:i.signal,onListen:n},this.hono.fetch),{port:s,close:()=>i.abort()}}listenNode(s,n){try{let{serve:i}=(()=>{throw new Error("Cannot require module "+"@hono/node-server");})();return i({fetch:this.hono.fetch,port:s},n)}catch(i){throw Error("Node.js adapter requires @hono/node-server package. Install it with: npm install @hono/node-server")}}}var En=()=>{if(typeof Bun<"u")return"bun";if(typeof Deno<"u")return"deno";if(typeof navigator<"u"&&navigator.userAgent==="Cloudflare-Workers")return"workerd";if(typeof process<"u"&&process.versions&&process.versions.node)return"node";return"unknown"};var wn={};fn(wn,{ExpressAdapter:()=>cn});class cn{app;name="express";express;constructor(s){this.app=s;try{let n=(()=>{throw new Error("Cannot require module "+"express");})();this.express=n(),this.setupBridge()}catch(n){throw Error("Express adapter requires express package. Install it with: npm install express")}}setupBridge(){let s=this.app.getHono();this.express.use(async(n,i)=>{try{let f=this.createWebRequest(n),h=await s.fetch(f);await this.sendExpressResponse(i,h)}catch(f){i.status(500).json({error:"Internal Server Error",message:f instanceof Error?f.message:"Unknown error"})}})}createWebRequest(s){let n=s.protocol||"http",i=s.get("host")||"localhost",f=`${n}://${i}${s.originalUrl||s.url}`,h=new Headers;for(let[u,w]of Object.entries(s.headers))if(typeof w==="string")h.set(u,w);else if(Array.isArray(w))w.forEach((b)=>h.append(u,b));let c={method:s.method,headers:h};if(s.method!=="GET"&&s.method!=="HEAD"){if(s.body)c.body=JSON.stringify(s.body),h.set("content-type","application/json")}return new Request(f,c)}async sendExpressResponse(s,n){if(s.status(n.status),n.headers.forEach((i,f)=>{s.setHeader(f,i)}),n.body){let i=n.headers.get("content-type")||"";if(i.includes("application/json")){let f=await n.json();s.json(f)}else if(i.includes("text/")){let f=await n.text();s.send(f)}else{let f=await n.arrayBuffer();s.send(Buffer.from(f))}}else s.end()}listen(s,n){return this.express.listen(s,n)}getHandler(){return this.express}getExpressApp(){return this.express}}class I{hono;constructor(s){this.hono=s.getHono()}async get(s,n){return this.request("GET",s,n)}async post(s,n){return this.request("POST",s,n)}async put(s,n){return this.request("PUT",s,n)}async delete(s,n){return this.request("DELETE",s,n)}async patch(s,n){return this.request("PATCH",s,n)}async request(s,n,i){let f=this.buildUrl(n,i?.query),h={method:s,headers:this.buildHeaders(i)};if(i?.body!==void 0)h.body=i.body;else if(i?.json!==void 0)h.body=JSON.stringify(i.json);let c=await this.hono.request(f,h),u=await c.text(),w;try{w=JSON.parse(u)}catch{w=u}return{status:c.status,headers:c.headers,body:w,text:u,json:async()=>JSON.parse(u),ok:c.ok}}buildUrl(s,n){if(!n||Object.keys(n).length===0)return s;let i=new URLSearchParams(n).toString();return`${s}?${i}`}buildHeaders(s){let n={...s?.headers};if(s?.json!==void 0&&!n["Content-Type"])n["Content-Type"]="application/json";return n}}var g=(s,n,i)=>{return(f,h)=>{let c=-1;return u(0);async function u(w){if(w<=c)throw Error("next() called multiple times");c=w;let b,P=!1,$;if(s[w])$=s[w][0][0],f.req.routeIndex=w;else $=w===s.length&&h||void 0;if($)try{b=await $(f,()=>u(w+1))}catch(S){if(S instanceof Error&&n)f.error=S,b=await n(S,f),P=!0;else throw S}else if(f.finalized===!1&&i)b=await i(f);if(b&&(f.finalized===!1||P))f.res=b;return f}}};var Zs=Symbol();var Js=async(s,n=Object.create(null))=>{let{all:i=!1,dot:f=!1}=n,c=(s instanceof k?s.raw.headers:s.headers).get("Content-Type");if(c?.startsWith("multipart/form-data")||c?.startsWith("application/x-www-form-urlencoded"))return zn(s,{all:i,dot:f});return{}};async function zn(s,n){let i=await s.formData();if(i)return Ln(i,n);return{}}function Ln(s,n){let i=Object.create(null);if(s.forEach((f,h)=>{if(!(n.all||h.endsWith("[]")))i[h]=f;else Un(i,h,f)}),n.dot)Object.entries(i).forEach(([f,h])=>{if(f.includes("."))Fn(i,f,h),delete i[f]});return i}var Un=(s,n,i)=>{if(s[n]!==void 0)if(Array.isArray(s[n]))s[n].push(i);else s[n]=[s[n],i];else if(!n.endsWith("[]"))s[n]=i;else s[n]=[i]},Fn=(s,n,i)=>{let f=s,h=n.split(".");h.forEach((c,u)=>{if(u===h.length-1)f[c]=i;else{if(!f[c]||typeof f[c]!=="object"||Array.isArray(f[c])||f[c]instanceof File)f[c]=Object.create(null);f=f[c]}})};var y=(s)=>{let n=s.split("/");if(n[0]==="")n.shift();return n},Rs=(s)=>{let{groups:n,path:i}=Nn(s),f=y(i);return Dn(f,n)},Nn=(s)=>{let n=[];return s=s.replace(/\{[^}]+\}/g,(i,f)=>{let h=`@${f}`;return n.push([h,i]),h}),{groups:n,path:s}},Dn=(s,n)=>{for(let i=n.length-1;i>=0;i--){let[f]=n[i];for(let h=s.length-1;h>=0;h--)if(s[h].includes(f)){s[h]=s[h].replace(f,n[i][1]);break}}return s},Y={},Is=(s,n)=>{if(s==="*")return"*";let i=s.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(i){let f=`${s}#${n}`;if(!Y[f])if(i[2])Y[f]=n&&n[0]!==":"&&n[0]!=="*"?[f,i[1],new RegExp(`^${i[2]}(?=/${n})`)]:[s,i[1],new RegExp(`^${i[2]}$`)];else Y[f]=[s,i[1],!0];return Y[f]}return null},W=(s,n)=>{try{return n(s)}catch{return s.replace(/(?:%[0-9A-Fa-f]{2})+/g,(i)=>{try{return n(i)}catch{return i}})}},Qn=(s)=>W(s,decodeURI),r=(s)=>{let n=s.url,i=n.indexOf("/",n.indexOf(":")+4),f=i;for(;f<n.length;f++){let h=n.charCodeAt(f);if(h===37){let c=n.indexOf("?",f),u=n.slice(i,c===-1?void 0:c);return Qn(u.includes("%25")?u.replace(/%25/g,"%2525"):u)}else if(h===63)break}return n.slice(i,f)};var ks=(s)=>{let n=r(s);return n.length>1&&n.at(-1)==="/"?n.slice(0,-1):n},N=(s,n,...i)=>{if(i.length)n=N(n,...i);return`${s?.[0]==="/"?"":"/"}${s}${n==="/"?"":`${s?.at(-1)==="/"?"":"/"}${n?.[0]==="/"?n.slice(1):n}`}`},q=(s)=>{if(s.charCodeAt(s.length-1)!==63||!s.includes(":"))return null;let n=s.split("/"),i=[],f="";return n.forEach((h)=>{if(h!==""&&!/\:/.test(h))f+="/"+h;else if(/\:/.test(h))if(/\?/.test(h)){if(i.length===0&&f==="")i.push("/");else i.push(f);let c=h.replace("?","");f+="/"+c,i.push(f)}else f+="/"+h}),i.filter((h,c,u)=>u.indexOf(h)===c)},K=(s)=>{if(!/[%+]/.test(s))return s;if(s.indexOf("+")!==-1)s=s.replace(/\+/g," ");return s.indexOf("%")!==-1?W(s,B):s},Ys=(s,n,i)=>{let f;if(!i&&n&&!/[%+]/.test(n)){let u=s.indexOf(`?${n}`,8);if(u===-1)u=s.indexOf(`&${n}`,8);while(u!==-1){let w=s.charCodeAt(u+n.length+1);if(w===61){let b=u+n.length+2,P=s.indexOf("&",b);return K(s.slice(b,P===-1?void 0:P))}else if(w==38||isNaN(w))return"";u=s.indexOf(`&${n}`,u+1)}if(f=/[%+]/.test(s),!f)return}let h={};f??=/[%+]/.test(s);let c=s.indexOf("?",8);while(c!==-1){let u=s.indexOf("&",c+1),w=s.indexOf("=",c);if(w>u&&u!==-1)w=-1;let b=s.slice(c+1,w===-1?u===-1?void 0:u:w);if(f)b=K(b);if(c=u,b==="")continue;let P;if(w===-1)P="";else if(P=s.slice(w+1,u===-1?void 0:u),f)P=K(P);if(i){if(!(h[b]&&Array.isArray(h[b])))h[b]=[];h[b].push(P)}else h[b]??=P}return n?h[n]:h},qs=Ys,Es=(s,n)=>{return Ys(s,n,!0)},B=decodeURIComponent;var Ts=(s)=>W(s,B),k=class{raw;#n;#s;routeIndex=0;path;bodyCache={};constructor(s,n="/",i=[[]]){this.raw=s,this.path=n,this.#s=i,this.#n={}}param(s){return s?this.#i(s):this.#c()}#i(s){let n=this.#s[0][this.routeIndex][1][s],i=this.#h(n);return i&&/\%/.test(i)?Ts(i):i}#c(){let s={},n=Object.keys(this.#s[0][this.routeIndex][1]);for(let i of n){let f=this.#h(this.#s[0][this.routeIndex][1][i]);if(f!==void 0)s[i]=/\%/.test(f)?Ts(f):f}return s}#h(s){return this.#s[1]?this.#s[1][s]:s}query(s){return qs(this.url,s)}queries(s){return Es(this.url,s)}header(s){if(s)return this.raw.headers.get(s)??void 0;let n={};return this.raw.headers.forEach((i,f)=>{n[f]=i}),n}async parseBody(s){return this.bodyCache.parsedBody??=await Js(this,s)}#f=(s)=>{let{bodyCache:n,raw:i}=this,f=n[s];if(f)return f;let h=Object.keys(n)[0];if(h)return n[h].then((c)=>{if(h==="json")c=JSON.stringify(c);return new Response(c)[s]()});return n[s]=i[s]()};json(){return this.#f("text").then((s)=>JSON.parse(s))}text(){return this.#f("text")}arrayBuffer(){return this.#f("arrayBuffer")}blob(){return this.#f("blob")}formData(){return this.#f("formData")}addValidatedData(s,n){this.#n[s]=n}valid(s){return this.#n[s]}get url(){return this.raw.url}get method(){return this.raw.method}get[Zs](){return this.#s}get matchedRoutes(){return this.#s[0].map(([[,s]])=>s)}get routePath(){return this.#s[0].map(([[,s]])=>s)[this.routeIndex].path}};var vs={Stringify:1,BeforeStream:2,Stream:3},Wn=(s,n)=>{let i=new String(s);return i.isEscaped=!0,i.callbacks=n,i};var t=async(s,n,i,f,h)=>{if(typeof s==="object"&&!(s instanceof String)){if(!(s instanceof Promise))s=s.toString();if(s instanceof Promise)s=await s}let c=s.callbacks;if(!c?.length)return Promise.resolve(s);if(h)h[0]+=s;else h=[s];let u=Promise.all(c.map((w)=>w({phase:n,buffer:h,context:f}))).then((w)=>Promise.all(w.filter(Boolean).map((b)=>t(b,n,!1,f,h))).then(()=>h[0]));if(i)return Wn(await u,c);else return u};var _n="text/plain; charset=UTF-8",d=(s,n)=>{return{"Content-Type":s,...n}},As=class{#n;#s;env={};#i;finalized=!1;error;#c;#h;#f;#$;#b;#P;#u;#S;#C;constructor(s,n){if(this.#n=s,n)this.#h=n.executionCtx,this.env=n.env,this.#P=n.notFoundHandler,this.#C=n.path,this.#S=n.matchResult}get req(){return this.#s??=new k(this.#n,this.#C,this.#S),this.#s}get event(){if(this.#h&&"respondWith"in this.#h)return this.#h;else throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#h)return this.#h;else throw Error("This context has no ExecutionContext")}get res(){return this.#f||=new Response(null,{headers:this.#u??=new Headers})}set res(s){if(this.#f&&s){s=new Response(s.body,s);for(let[n,i]of this.#f.headers.entries()){if(n==="content-type")continue;if(n==="set-cookie"){let f=this.#f.headers.getSetCookie();s.headers.delete("set-cookie");for(let h of f)s.headers.append("set-cookie",h)}else s.headers.set(n,i)}}this.#f=s,this.finalized=!0}render=(...s)=>{return this.#b??=(n)=>this.html(n),this.#b(...s)};setLayout=(s)=>this.#$=s;getLayout=()=>this.#$;setRenderer=(s)=>{this.#b=s};header=(s,n,i)=>{if(this.finalized)this.#f=new Response(this.#f.body,this.#f);let f=this.#f?this.#f.headers:this.#u??=new Headers;if(n===void 0)f.delete(s);else if(i?.append)f.append(s,n);else f.set(s,n)};status=(s)=>{this.#c=s};set=(s,n)=>{this.#i??=new Map,this.#i.set(s,n)};get=(s)=>{return this.#i?this.#i.get(s):void 0};get var(){if(!this.#i)return{};return Object.fromEntries(this.#i)}#w(s,n,i){let f=this.#f?new Headers(this.#f.headers):this.#u??new Headers;if(typeof n==="object"&&"headers"in n){let c=n.headers instanceof Headers?n.headers:new Headers(n.headers);for(let[u,w]of c)if(u.toLowerCase()==="set-cookie")f.append(u,w);else f.set(u,w)}if(i)for(let[c,u]of Object.entries(i))if(typeof u==="string")f.set(c,u);else{f.delete(c);for(let w of u)f.append(c,w)}let h=typeof n==="number"?n:n?.status??this.#c;return new Response(s,{status:h,headers:f})}newResponse=(...s)=>this.#w(...s);body=(s,n,i)=>this.#w(s,n,i);text=(s,n,i)=>{return!this.#u&&!this.#c&&!n&&!i&&!this.finalized?new Response(s):this.#w(s,n,d(_n,i))};json=(s,n,i)=>{return this.#w(JSON.stringify(s),n,d("application/json",i))};html=(s,n,i)=>{let f=(h)=>this.#w(h,n,d("text/html; charset=UTF-8",i));return typeof s==="object"?t(s,vs.Stringify,!1,{}).then(f):f(s)};redirect=(s,n)=>{let i=String(s);return this.header("Location",!/[^\x00-\xFF]/.test(i)?i:encodeURI(i)),this.newResponse(null,n??302)};notFound=()=>{return this.#P??=()=>new Response,this.#P(this)}};var C="ALL",os="all",Ms=["get","post","put","delete","options","patch"],E="Can not add a route since the matcher is already built.",T=class extends Error{};var gs="__COMPOSED_HANDLER";var Gn=(s)=>{return s.text("404 Not Found",404)},Ks=(s,n)=>{if("getResponse"in s){let i=s.getResponse();return n.newResponse(i.body,i)}return console.error(s),n.text("Internal Server Error",500)},m=class{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#n="/";routes=[];constructor(s={}){[...Ms,os].forEach((h)=>{this[h]=(c,...u)=>{if(typeof c==="string")this.#n=c;else this.#c(h,this.#n,c);return u.forEach((w)=>{this.#c(h,this.#n,w)}),this}}),this.on=(h,c,...u)=>{for(let w of[c].flat()){this.#n=w;for(let b of[h].flat())u.map((P)=>{this.#c(b.toUpperCase(),this.#n,P)})}return this},this.use=(h,...c)=>{if(typeof h==="string")this.#n=h;else this.#n="*",c.unshift(h);return c.forEach((u)=>{this.#c(C,this.#n,u)}),this};let{strict:i,...f}=s;Object.assign(this,f),this.getPath=i??!0?s.getPath??r:ks}#s(){let s=new m({router:this.router,getPath:this.getPath});return s.errorHandler=this.errorHandler,s.#i=this.#i,s.routes=this.routes,s}#i=Gn;errorHandler=Ks;route(s,n){let i=this.basePath(s);return n.routes.map((f)=>{let h;if(n.errorHandler===Ks)h=f.handler;else h=async(c,u)=>(await g([],n.errorHandler)(c,()=>f.handler(c,u))).res,h[gs]=f.handler;i.#c(f.method,f.path,h)}),this}basePath(s){let n=this.#s();return n._basePath=N(this._basePath,s),n}onError=(s)=>{return this.errorHandler=s,this};notFound=(s)=>{return this.#i=s,this};mount(s,n,i){let f,h;if(i)if(typeof i==="function")h=i;else if(h=i.optionHandler,i.replaceRequest===!1)f=(w)=>w;else f=i.replaceRequest;let c=h?(w)=>{let b=h(w);return Array.isArray(b)?b:[b]}:(w)=>{let b=void 0;try{b=w.executionCtx}catch{}return[w.env,b]};f||=(()=>{let w=N(this._basePath,s),b=w==="/"?0:w.length;return(P)=>{let $=new URL(P.url);return $.pathname=$.pathname.slice(b)||"/",new Request($,P)}})();let u=async(w,b)=>{let P=await n(f(w.req.raw),...c(w));if(P)return P;await b()};return this.#c(C,N(s,"*"),u),this}#c(s,n,i){s=s.toUpperCase(),n=N(this._basePath,n);let f={basePath:this._basePath,path:n,method:s,handler:i};this.router.add(s,n,[i,f]),this.routes.push(f)}#h(s,n){if(s instanceof Error)return this.errorHandler(s,n);throw s}#f(s,n,i,f){if(f==="HEAD")return(async()=>new Response(null,await this.#f(s,n,i,"GET")))();let h=this.getPath(s,{env:i}),c=this.router.match(f,h),u=new As(s,{path:h,matchResult:c,env:i,executionCtx:n,notFoundHandler:this.#i});if(c[0].length===1){let b;try{b=c[0][0][0][0](u,async()=>{u.res=await this.#i(u)})}catch(P){return this.#h(P,u)}return b instanceof Promise?b.then((P)=>P||(u.finalized?u.res:this.#i(u))).catch((P)=>this.#h(P,u)):b??this.#i(u)}let w=g(c[0],this.errorHandler,this.#i);return(async()=>{try{let b=await w(u);if(!b.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return b.res}catch(b){return this.#h(b,u)}})()}fetch=(s,...n)=>{return this.#f(s,n[1],n[0],s.method)};request=(s,n,i,f)=>{if(s instanceof Request)return this.fetch(n?new Request(s,n):s,i,f);return s=s.toString(),this.fetch(new Request(/^https?:\/\//.test(s)?s:`http://localhost${N("/",s)}`,n),i,f)};fire=()=>{addEventListener("fetch",(s)=>{s.respondWith(this.#f(s.request,s,void 0,s.request.method))})}};var v="[^/]+",V=".*",Z="(?:|/.*)",D=Symbol(),Xn=new Set(".\\+*[^]$()");function Bn(s,n){if(s.length===1)return n.length===1?s<n?-1:1:-1;if(n.length===1)return 1;if(s===V||s===Z)return 1;else if(n===V||n===Z)return-1;if(s===v)return 1;else if(n===v)return-1;return s.length===n.length?s<n?-1:1:n.length-s.length}var A=class{#n;#s;#i=Object.create(null);insert(s,n,i,f,h){if(s.length===0){if(this.#n!==void 0)throw D;if(h)return;this.#n=n;return}let[c,...u]=s,w=c==="*"?u.length===0?["","",V]:["","",v]:c==="/*"?["","",Z]:c.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),b;if(w){let P=w[1],$=w[2]||v;if(P&&w[2]){if($===".*")throw D;if($=$.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test($))throw D}if(b=this.#i[$],!b){if(Object.keys(this.#i).some((S)=>S!==V&&S!==Z))throw D;if(h)return;if(b=this.#i[$]=new A,P!=="")b.#s=f.varIndex++}if(!h&&P!=="")i.push([P,b.#s])}else if(b=this.#i[c],!b){if(Object.keys(this.#i).some((P)=>P.length>1&&P!==V&&P!==Z))throw D;if(h)return;b=this.#i[c]=new A}b.insert(u,n,i,f,h)}buildRegExpStr(){let n=Object.keys(this.#i).sort(Bn).map((i)=>{let f=this.#i[i];return(typeof f.#s==="number"?`(${i})@${f.#s}`:Xn.has(i)?`\\${i}`:i)+f.buildRegExpStr()});if(typeof this.#n==="number")n.unshift(`#${this.#n}`);if(n.length===0)return"";if(n.length===1)return n[0];return"(?:"+n.join("|")+")"}};var ys=class{#n={varIndex:0};#s=new A;insert(s,n,i){let f=[],h=[];for(let u=0;;){let w=!1;if(s=s.replace(/\{[^}]+\}/g,(b)=>{let P=`@\\${u}`;return h[u]=[P,b],u++,w=!0,P}),!w)break}let c=s.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let u=h.length-1;u>=0;u--){let[w]=h[u];for(let b=c.length-1;b>=0;b--)if(c[b].indexOf(w)!==-1){c[b]=c[b].replace(w,h[u][1]);break}}return this.#s.insert(c,n,f,this.#n,i),f}buildRegExp(){let s=this.#s.buildRegExpStr();if(s==="")return[/^$/,[],[]];let n=0,i=[],f=[];return s=s.replace(/#(\d+)|@(\d+)|\.\*\$/g,(h,c,u)=>{if(c!==void 0)return i[++n]=Number(c),"$()";if(u!==void 0)return f[Number(u)]=++n,"";return""}),[new RegExp(`^${s}`),i,f]}};var rs=[],Vn=[/^$/,[],Object.create(null)],ts=Object.create(null);function ds(s){return ts[s]??=new RegExp(s==="*"?"":`^${s.replace(/\/\*$|([.\\+*[^\]$()])/g,(n,i)=>i?`\\${i}`:"(?:|/.*)")}$`)}function Zn(){ts=Object.create(null)}function Jn(s){let n=new ys,i=[];if(s.length===0)return Vn;let f=s.map((P)=>[!/\*|\/:/.test(P[0]),...P]).sort(([P,$],[S,j])=>P?1:S?-1:$.length-j.length),h=Object.create(null);for(let P=0,$=-1,S=f.length;P<S;P++){let[j,l,H]=f[P];if(j)h[l]=[H.map(([x])=>[x,Object.create(null)]),rs];else $++;let O;try{O=n.insert(l,$,j)}catch(x){throw x===D?new T(l):x}if(j)continue;i[$]=H.map(([x,Q])=>{let G=Object.create(null);Q-=1;for(;Q>=0;Q--){let[z,M]=O[Q];G[z]=M}return[x,G]})}let[c,u,w]=n.buildRegExp();for(let P=0,$=i.length;P<$;P++)for(let S=0,j=i[P].length;S<j;S++){let l=i[P][S]?.[1];if(!l)continue;let H=Object.keys(l);for(let O=0,x=H.length;O<x;O++)l[H[O]]=w[l[H[O]]]}let b=[];for(let P in u)b[P]=i[u[P]];return[c,b,h]}function _(s,n){if(!s)return;for(let i of Object.keys(s).sort((f,h)=>h.length-f.length))if(ds(i).test(n))return[...s[i]];return}var e=class{name="RegExpRouter";#n;#s;constructor(){this.#n={[C]:Object.create(null)},this.#s={[C]:Object.create(null)}}add(s,n,i){let f=this.#n,h=this.#s;if(!f||!h)throw Error(E);if(!f[s])[f,h].forEach((w)=>{w[s]=Object.create(null),Object.keys(w[C]).forEach((b)=>{w[s][b]=[...w[C][b]]})});if(n==="/*")n="*";let c=(n.match(/\/:/g)||[]).length;if(/\*$/.test(n)){let w=ds(n);if(s===C)Object.keys(f).forEach((b)=>{f[b][n]||=_(f[b],n)||_(f[C],n)||[]});else f[s][n]||=_(f[s],n)||_(f[C],n)||[];Object.keys(f).forEach((b)=>{if(s===C||s===b)Object.keys(f[b]).forEach((P)=>{w.test(P)&&f[b][P].push([i,c])})}),Object.keys(h).forEach((b)=>{if(s===C||s===b)Object.keys(h[b]).forEach((P)=>w.test(P)&&h[b][P].push([i,c]))});return}let u=q(n)||[n];for(let w=0,b=u.length;w<b;w++){let P=u[w];Object.keys(h).forEach(($)=>{if(s===C||s===$)h[$][P]||=[..._(f[$],P)||_(f[C],P)||[]],h[$][P].push([i,c-b+w+1])})}}match(s,n){Zn();let i=this.#i();return this.match=(f,h)=>{let c=i[f]||i[C],u=c[2][h];if(u)return u;let w=h.match(c[0]);if(!w)return[[],rs];let b=w.indexOf("",1);return[c[1][b],w]},this.match(s,n)}#i(){let s=Object.create(null);return Object.keys(this.#s).concat(Object.keys(this.#n)).forEach((n)=>{s[n]||=this.#c(n)}),this.#n=this.#s=void 0,s}#c(s){let n=[],i=s===C;if([this.#n,this.#s].forEach((f)=>{let h=f[s]?Object.keys(f[s]).map((c)=>[c,f[s][c]]):[];if(h.length!==0)i||=!0,n.push(...h);else if(s!==C)n.push(...Object.keys(f[C]).map((c)=>[c,f[C][c]]))}),!i)return null;else return Jn(n)}};var p=class{name="SmartRouter";#n=[];#s=[];constructor(s){this.#n=s.routers}add(s,n,i){if(!this.#s)throw Error(E);this.#s.push([s,n,i])}match(s,n){if(!this.#s)throw Error("Fatal error");let i=this.#n,f=this.#s,h=i.length,c=0,u;for(;c<h;c++){let w=i[c];try{for(let b=0,P=f.length;b<P;b++)w.add(...f[b]);u=w.match(s,n)}catch(b){if(b instanceof T)continue;throw b}this.match=w.match.bind(w),this.#n=[w],this.#s=void 0;break}if(c===h)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,u}get activeRouter(){if(this.#s||this.#n.length!==1)throw Error("No active router has been determined yet.");return this.#n[0]}};var J=Object.create(null),a=class{#n;#s;#i;#c=0;#h=J;constructor(s,n,i){if(this.#s=i||Object.create(null),this.#n=[],s&&n){let f=Object.create(null);f[s]={handler:n,possibleKeys:[],score:0},this.#n=[f]}this.#i=[]}insert(s,n,i){this.#c=++this.#c;let f=this,h=Rs(n),c=[];for(let u=0,w=h.length;u<w;u++){let b=h[u],P=h[u+1],$=Is(b,P),S=Array.isArray($)?$[0]:b;if(S in f.#s){if(f=f.#s[S],$)c.push($[1]);continue}if(f.#s[S]=new a,$)f.#i.push($),c.push($[1]);f=f.#s[S]}return f.#n.push({[s]:{handler:i,possibleKeys:c.filter((u,w,b)=>b.indexOf(u)===w),score:this.#c}}),f}#f(s,n,i,f){let h=[];for(let c=0,u=s.#n.length;c<u;c++){let w=s.#n[c],b=w[n]||w[C],P={};if(b!==void 0){if(b.params=Object.create(null),h.push(b),i!==J||f&&f!==J)for(let $=0,S=b.possibleKeys.length;$<S;$++){let j=b.possibleKeys[$],l=P[b.score];b.params[j]=f?.[j]&&!l?f[j]:i[j]??f?.[j],P[b.score]=!0}}}return h}search(s,n){let i=[];this.#h=J;let h=[this],c=y(n),u=[];for(let w=0,b=c.length;w<b;w++){let P=c[w],$=w===b-1,S=[];for(let j=0,l=h.length;j<l;j++){let H=h[j],O=H.#s[P];if(O)if(O.#h=H.#h,$){if(O.#s["*"])i.push(...this.#f(O.#s["*"],s,H.#h));i.push(...this.#f(O,s,H.#h))}else S.push(O);for(let x=0,Q=H.#i.length;x<Q;x++){let G=H.#i[x],z=H.#h===J?{}:{...H.#h};if(G==="*"){let U=H.#s["*"];if(U)i.push(...this.#f(U,s,H.#h)),U.#h=z,S.push(U);continue}let[M,Vs,X]=G;if(!P&&!(X instanceof RegExp))continue;let L=H.#s[M],ln=c.slice(w).join("/");if(X instanceof RegExp){let U=X.exec(ln);if(U){if(z[Vs]=U[0],i.push(...this.#f(L,s,H.#h,z)),Object.keys(L.#s).length){L.#h=z;let xn=U[0].match(/\//)?.length??0;(u[xn]||=[]).push(L)}continue}}if(X===!0||X.test(P))if(z[Vs]=P,$){if(i.push(...this.#f(L,s,z,H.#h)),L.#s["*"])i.push(...this.#f(L.#s["*"],s,z,H.#h))}else L.#h=z,S.push(L)}}h=S.concat(u.shift()??[])}if(i.length>1)i.sort((w,b)=>{return w.score-b.score});return[i.map(({handler:w,params:b})=>[w,b])]}};var ss=class{name="TrieRouter";#n;constructor(){this.#n=new a}add(s,n,i){let f=q(n);if(f){for(let h=0,c=f.length;h<c;h++)this.#n.insert(s,f[h],i);return}this.#n.insert(s,n,i)}match(s,n){return this.#n.search(s,n)}};var ns=class extends m{constructor(s={}){super(s);this.router=s.router??new p({routers:[new e,new ss]})}};var ei=as(Rn(),1),is=Symbol("route:metadata"),fs=Symbol("controller:metadata"),ms=Symbol("parameter:metadata"),es=Symbol("dependency:metadata"),hs=Symbol("websocket:metadata"),ps=Symbol("websocket:handler:metadata"),cs=Symbol("graphql:resolver"),R=Symbol("graphql:field"),ws=Symbol("auth:metadata"),us=Symbol("oauth:metadata"),bs=Symbol("roles:metadata"),Ps=Symbol("permissions:metadata"),$s=Symbol("minimum-role:metadata"),Ss=Symbol("resource-permission:metadata"),Cs=Symbol("session:metadata"),Hs=Symbol("csrf:metadata");class F{routes=new Map;controllers=new Map;routesByController=new Map;websockets=new Map;graphqlResolvers=new Map;graphqlFields=new Map;registerRoute(s){let n=this.getRouteKey(s.target,s.propertyKey);if(this.routes.set(n,s),!this.routesByController.has(s.target))this.routesByController.set(s.target,[]);this.routesByController.get(s.target).push(s)}registerController(s,n){this.controllers.set(s,n)}getRoutes(){return Array.from(this.routes.values())}getRoute(s,n){let i=this.getRouteKey(s,n);return this.routes.get(i)}getRoutesByController(s){return this.routesByController.get(s)||[]}getController(s){return this.controllers.get(s)}getControllers(){return new Map(this.controllers)}registerWebSocket(s){this.websockets.set(s.target,s)}getWebSockets(){return Array.from(this.websockets.values())}getWebSocket(s){return this.websockets.get(s)}registerGraphQLResolver(s){this.graphqlResolvers.set(s.target,s)}registerGraphQLField(s){let n=this.getRouteKey(s.target,s.propertyKey);this.graphqlFields.set(n,s)}getGraphQLResolvers(){return Array.from(this.graphqlResolvers.values())}getGraphQLResolver(s){return this.graphqlResolvers.get(s)}getGraphQLFields(){return Array.from(this.graphqlFields.values())}getGraphQLFieldsByResolver(s){return Array.from(this.graphqlFields.values()).filter((n)=>n.target===s)}clear(){this.routes.clear(),this.controllers.clear(),this.routesByController.clear(),this.websockets.clear(),this.graphqlResolvers.clear(),this.graphqlFields.clear()}getRouteKey(s,n){return`${s.name}:${n}`}static defineRoute(s,n,i){let f=this.getRouteMetadata(s,n),h={...f,...i,target:s.constructor,propertyKey:n,middleware:[...f?.middleware||[],...i.middleware||[]],parameters:i.parameters||f?.parameters||[],dependencies:i.dependencies||f?.dependencies||[],responses:i.responses||f?.responses||[],auth:i.auth||f?.auth,oauth:i.oauth||f?.oauth,roles:i.roles||f?.roles,permissions:i.permissions||f?.permissions,minimumRole:i.minimumRole||f?.minimumRole,resourcePermission:i.resourcePermission||f?.resourcePermission,session:i.session||f?.session,csrf:i.csrf||f?.csrf};Reflect.defineMetadata(is,h,s,n)}static defineParameter(s,n,i,f){let h=this.getParameterMetadata(s,n)||[];h[i]=f,Reflect.defineMetadata(ms,h,s,n);let c=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...c,parameters:h})}static defineDependency(s,n,i,f){let h=this.getDependencyMetadata(s,n)||[];h[i]=f,Reflect.defineMetadata(es,h,s,n);let c=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...c,dependencies:h})}static defineController(s,n){Reflect.defineMetadata(fs,n,s)}static getRouteMetadata(s,n){return Reflect.getMetadata(is,s,n)}static getParameterMetadata(s,n){return Reflect.getMetadata(ms,s,n)}static getDependencyMetadata(s,n){return Reflect.getMetadata(es,s,n)}static getControllerMetadata(s){return Reflect.getMetadata(fs,s)}static hasControllerMetadata(s){return Reflect.hasMetadata(fs,s)}static hasRouteMetadata(s,n){return Reflect.hasMetadata(is,s,n)}static getRouteMethods(s){let n=s.prototype,i=[],f=Object.getOwnPropertyNames(n);for(let h of f){if(h==="constructor")continue;if(this.hasRouteMetadata(n,h))i.push(h)}return i}static defineWebSocket(s,n){let f={...this.getWebSocketMetadata(s),...n,target:s};Reflect.defineMetadata(hs,f,s)}static defineWebSocketHandler(s,n,i){let f=this.getWebSocketMetadata(s.constructor)||{};switch(i.type){case"connect":f.onConnect=n;break;case"message":f.onMessage=n,f.messageSchema=i.schema;break;case"disconnect":f.onDisconnect=n;break}this.defineWebSocket(s.constructor,f),Reflect.defineMetadata(ps,i,s,n)}static getWebSocketMetadata(s){return Reflect.getMetadata(hs,s)}static getWebSocketHandlerMetadata(s,n){return Reflect.getMetadata(ps,s,n)}static hasWebSocketMetadata(s){return Reflect.hasMetadata(hs,s)}static defineGraphQLResolver(s,n){Reflect.defineMetadata(cs,n,s)}static defineGraphQLField(s,n,i){Reflect.defineMetadata(R,i,s,n);let f=this.getGraphQLFieldsMetadata(s.constructor)||[];f.push(i),Reflect.defineMetadata(R,f,s.constructor)}static getGraphQLResolverMetadata(s){return Reflect.getMetadata(cs,s)}static getGraphQLFieldsMetadata(s){return Reflect.getMetadata(R,s)||[]}static getGraphQLFieldMetadata(s,n){return Reflect.getMetadata(R,s,n)}static hasGraphQLResolverMetadata(s){return Reflect.hasMetadata(cs,s)}static hasGraphQLFieldMetadata(s,n){return Reflect.hasMetadata(R,s,n)}static defineAuth(s,n,i){Reflect.defineMetadata(ws,i,s,n);let f=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...f,auth:i})}static getAuthMetadata(s,n){return Reflect.getMetadata(ws,s,n)}static hasAuthMetadata(s,n){return Reflect.hasMetadata(ws,s,n)}static defineOAuth(s,n,i){Reflect.defineMetadata(us,i,s,n);let f=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...f,oauth:i})}static getOAuthMetadata(s,n){return Reflect.getMetadata(us,s,n)}static hasOAuthMetadata(s,n){return Reflect.hasMetadata(us,s,n)}static defineRoles(s,n,i){Reflect.defineMetadata(bs,i,s,n);let f=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...f,roles:i})}static definePermissions(s,n,i){Reflect.defineMetadata(Ps,i,s,n);let f=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...f,permissions:i})}static defineMinimumRole(s,n,i){Reflect.defineMetadata($s,i,s,n);let f=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...f,minimumRole:i})}static getRolesMetadata(s,n){return Reflect.getMetadata(bs,s,n)}static getPermissionsMetadata(s,n){return Reflect.getMetadata(Ps,s,n)}static getMinimumRoleMetadata(s,n){return Reflect.getMetadata($s,s,n)}static hasRolesMetadata(s,n){return Reflect.hasMetadata(bs,s,n)}static hasPermissionsMetadata(s,n){return Reflect.hasMetadata(Ps,s,n)}static hasMinimumRoleMetadata(s,n){return Reflect.hasMetadata($s,s,n)}static defineResourcePermission(s,n,i){Reflect.defineMetadata(Ss,i,s,n);let f=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...f,resourcePermission:i})}static getResourcePermissionMetadata(s,n){return Reflect.getMetadata(Ss,s,n)}static hasResourcePermissionMetadata(s,n){return Reflect.hasMetadata(Ss,s,n)}static defineSession(s,n,i){Reflect.defineMetadata(Cs,i,s,n);let f=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...f,session:i})}static defineCSRF(s,n,i){Reflect.defineMetadata(Hs,i,s,n);let f=this.getRouteMetadata(s,n);this.defineRoute(s,n,{...f,csrf:i})}static getSessionMetadata(s,n){return Reflect.getMetadata(Cs,s,n)}static getCSRFMetadata(s,n){return Reflect.getMetadata(Hs,s,n)}static hasSessionMetadata(s,n){return Reflect.hasMetadata(Cs,s,n)}static hasCSRFMetadata(s,n){return Reflect.hasMetadata(Hs,s,n)}}class js{singletons=new Map;requestScoped=new WeakMap;providers=new Map;resolutionStack=new Set;providerNameCache=new WeakMap;stats={singletonHits:0,singletonMisses:0,requestHits:0,requestMisses:0,transientCreations:0};register(s,n){this.providers.set(s,n||{scope:"transient"})}async resolve(s,n){let i=this.providers.get(s)||{scope:n?.scope||"transient"},f=n?.scope||i.scope||"transient";if(f==="singleton"){if(this.singletons.has(s))return this.stats.singletonHits++,this.singletons.get(s);if(this.stats.singletonMisses++,this.resolutionStack.has(s))throw Error(`Circular dependency detected: ${this.buildCircularDependencyMessage(s)}`);this.resolutionStack.add(s);try{let h=await this.create(s,i,n?.context);return this.singletons.set(s,h),h}finally{this.resolutionStack.delete(s)}}if(f==="request"&&n?.context){let h=this.requestScoped.get(n.context);if(h?.has(s))return this.stats.requestHits++,h.get(s);if(this.stats.requestMisses++,!h)h=new Map,this.requestScoped.set(n.context,h);if(this.resolutionStack.has(s))throw Error(`Circular dependency detected: ${this.buildCircularDependencyMessage(s)}`);this.resolutionStack.add(s);try{let c=await this.create(s,i,n.context);return h.set(s,c),c}finally{this.resolutionStack.delete(s)}}if(this.stats.transientCreations++,this.resolutionStack.has(s))throw Error(`Circular dependency detected: ${this.buildCircularDependencyMessage(s)}`);this.resolutionStack.add(s);try{return await this.create(s,i,n?.context)}finally{this.resolutionStack.delete(s)}}buildCircularDependencyMessage(s){let n=Array.from(this.resolutionStack),i=this.getProviderName(s);return n.map((h)=>this.getProviderName(h)).join(" -> ")+" -> "+i}async create(s,n,i){if(n.factory)return n.factory();if(typeof s==="function")if(s.prototype&&s.prototype.constructor===s){let f=new s;return await this.resolveNestedDependencies(f,i),f}else{let f=s();return f instanceof Promise?await f:f}throw Error("Invalid provider type")}async resolveNestedDependencies(s,n){}getProviderName(s){let n=this.providerNameCache.get(s);if(n)return n;let i;if(typeof s==="function")if(s.name)i=s.name;else i=s.toString().substring(0,50);else i=String(s);return this.providerNameCache.set(s,i),i}clear(){this.singletons.clear(),this.providers.clear(),this.resolutionStack.clear(),this.providerNameCache=new WeakMap,this.resetStats()}clearRequestScope(s){this.requestScoped.delete(s)}getStats(){let s=this.stats.singletonHits+this.stats.singletonMisses,n=s>0?this.stats.singletonHits/s*100:0,i=this.stats.requestHits+this.stats.requestMisses,f=i>0?this.stats.requestHits/i*100:0;return{singletonHits:this.stats.singletonHits,singletonMisses:this.stats.singletonMisses,singletonHitRate:Math.round(n*100)/100,requestHits:this.stats.requestHits,requestMisses:this.stats.requestMisses,requestHitRate:Math.round(f*100)/100,transientCreations:this.stats.transientCreations}}resetStats(){this.stats={singletonHits:0,singletonMisses:0,requestHits:0,requestMisses:0,transientCreations:0}}}var In=/^[\w!#$%&'*.^`|~+-]+$/,kn=/^[ !#-:<-[\]-~]*$/,Os=(s,n)=>{if(n&&s.indexOf(n)===-1)return{};let i=s.trim().split(";"),f={};for(let h of i){h=h.trim();let c=h.indexOf("=");if(c===-1)continue;let u=h.substring(0,c).trim();if(n&&n!==u||!In.test(u))continue;let w=h.substring(c+1).trim();if(w.startsWith('"')&&w.endsWith('"'))w=w.slice(1,-1);if(kn.test(w)){if(f[u]=w.indexOf("%")!==-1?W(w,B):w,n)break}}return f};var Yn=(s,n,i={})=>{let f=`${s}=${n}`;if(s.startsWith("__Secure-")&&!i.secure)throw Error("__Secure- Cookie must have Secure attributes");if(s.startsWith("__Host-")){if(!i.secure)throw Error("__Host- Cookie must have Secure attributes");if(i.path!=="/")throw Error('__Host- Cookie must have Path attributes with "/"');if(i.domain)throw Error("__Host- Cookie must not have Domain attributes")}if(i&&typeof i.maxAge==="number"&&i.maxAge>=0){if(i.maxAge>34560000)throw Error("Cookies Max-Age SHOULD NOT be greater than 400 days (34560000 seconds) in duration.");f+=`; Max-Age=${i.maxAge|0}`}if(i.domain&&i.prefix!=="host")f+=`; Domain=${i.domain}`;if(i.path)f+=`; Path=${i.path}`;if(i.expires){if(i.expires.getTime()-Date.now()>34560000000)throw Error("Cookies Expires SHOULD NOT be greater than 400 days (34560000 seconds) in the future.");f+=`; Expires=${i.expires.toUTCString()}`}if(i.httpOnly)f+="; HttpOnly";if(i.secure)f+="; Secure";if(i.sameSite)f+=`; SameSite=${i.sameSite.charAt(0).toUpperCase()+i.sameSite.slice(1)}`;if(i.priority)f+=`; Priority=${i.priority.charAt(0).toUpperCase()+i.priority.slice(1)}`;if(i.partitioned){if(!i.secure)throw Error("Partitioned Cookie must have Secure attributes");f+="; Partitioned"}return f},o=(s,n,i)=>{return n=encodeURIComponent(n),Yn(s,n,i)};var sn=(s,n,i)=>{let f=s.req.raw.headers.get("Cookie");if(typeof n==="string"){if(!f)return;let c=n;if(i==="secure")c="__Secure-"+n;else if(i==="host")c="__Host-"+n;return Os(f,c)[c]}if(!f)return{};return Os(f)};var qn=(s,n,i)=>{let f;if(i?.prefix==="secure")f=o("__Secure-"+s,n,{path:"/",...i,secure:!0});else if(i?.prefix==="host")f=o("__Host-"+s,n,{...i,path:"/",secure:!0,domain:void 0});else f=o(s,n,{path:"/",...i});return f},wf=(s,n,i,f)=>{let h=qn(n,i,f);s.header("Set-Cookie",h,{append:!0})};class nn{static json(s,n=200,i){return new ls(s,n,i)}static html(s,n=200){return new xs(s,n)}static file(s,n){return new Ls(s,n)}static stream(s,n){return new Us(s,n)}static redirect(s,n=302){return new zs(s,n)}}class ls{data;status;headers;constructor(s,n=200,i={}){this.data=s;this.status=n;this.headers=i}toHonoResponse(s){return s.json(this.data,this.status,this.headers)}}class xs{content;status;constructor(s,n=200){this.content=s;this.status=n}toHonoResponse(s){return s.html(this.content,this.status)}}class zs{url;status;constructor(s,n=302){this.url=s;this.status=n}toHonoResponse(s){return s.redirect(this.url,this.status)}}class Ls{path;options;constructor(s,n){this.path=s;this.options=n}async toHonoResponse(s){try{let n=typeof Bun<"u"?Bun.file(this.path):await this.readFileNode(this.path),f={"Content-Type":this.options?.contentType||this.guessContentType(this.path)};if(this.options?.download||this.options?.filename){let h=this.options?.filename||this.path.split("/").pop()||"download",c=this.options?.download?"attachment":"inline";f["Content-Disposition"]=`${c}; filename="${h}"`}if(typeof Bun<"u"&&n instanceof Blob)return s.body(n,200,f);else return s.body(n,200,f)}catch(n){return s.json({error:"File not found",message:n instanceof Error?n.message:"Unknown error"},404)}}async readFileNode(s){throw Error("File reading in Node.js requires fs module - use Bun runtime or implement adapter")}guessContentType(s){let n=s.split(".").pop()?.toLowerCase();return{html:"text/html",css:"text/css",js:"application/javascript",json:"application/json",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml",pdf:"application/pdf",txt:"text/plain",xml:"application/xml"}[n||""]||"application/octet-stream"}}class Us{stream;options;constructor(s,n){this.stream=s;this.options=n}toHonoResponse(s){let n={"Content-Type":this.options?.contentType||"application/octet-stream",...this.options?.headers};return s.body(this.stream,200,n)}}class Fs{static serialize(s,n){if(n===null||n===void 0)return s.body(null,204);if(n instanceof nn)return n;if(n instanceof ls)return n.toHonoResponse(s);if(n instanceof xs)return n.toHonoResponse(s);if(n instanceof Ls)return n.toHonoResponse(s);if(n instanceof Us)return n.toHonoResponse(s);if(n instanceof zs)return n.toHonoResponse(s);if(n&&typeof n.toHonoResponse==="function")return n.toHonoResponse(s);return s.json(n)}}class Ns{static compile(s){let n=this.compilePathRegex(s.path),i=this.resolveParameterOrder(s.parameters),f=this.resolveDependencyOrder(s.dependencies),h=this.calculateMaxArgumentIndex(s.parameters,s.dependencies),c=this.computeParameterFlags(s.parameters);return{...s,pathRegex:n,parameterOrder:i,dependencyOrder:f,maxArgumentIndex:h,...c}}static compilePathRegex(s){let n=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return n=n.replace(/\\\{([^}]+)\\\}/g,"(?<$1>[^/]+)"),n=n.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,"(?<$1>[^/]+)"),n=`^${n}$`,new RegExp(n)}static resolveParameterOrder(s){if(!s||s.length===0)return[];return s.map((n)=>n.index).filter((n)=>n!==void 0).sort((n,i)=>n-i)}static resolveDependencyOrder(s){if(!s||s.length===0)return[];return s.map((n)=>n.index).filter((n)=>n!==void 0).sort((n,i)=>n-i)}static calculateMaxArgumentIndex(s,n){let i=-1;if(s&&s.length>0){let f=Math.max(...s.map((h)=>h.index));i=Math.max(i,f)}if(n&&n.length>0){let f=Math.max(...n.map((h)=>h.index));i=Math.max(i,f)}return i}static computeParameterFlags(s){if(!s||s.length===0)return{hasBody:!1,hasQuery:!1,hasParams:!1,hasHeaders:!1,hasCookies:!1,hasDependencies:!1};return{hasBody:s.some((n)=>n.type==="body"),hasQuery:s.some((n)=>n.type==="query"),hasParams:s.some((n)=>n.type==="param"),hasHeaders:s.some((n)=>n.type==="header"),hasCookies:s.some((n)=>n.type==="cookie"),hasDependencies:!1}}static compileAll(s){return s.map((n)=>this.compile(n))}}class Qs{app;metadata;container;validator;errorHandler;compiledRoutes=new Map;constructor(s,n,i,f,h){this.app=s;this.metadata=n;this.container=i;this.validator=f;this.errorHandler=h}compile(){let s=this.metadata.getRoutes(),n=Ns.compileAll(s);for(let i of n){let f=`${i.target.name}:${i.propertyKey}`;this.compiledRoutes.set(f,i);let h=this.createHandler(i),c=this.normalizePath(i.path),u=i.method.toLowerCase();if(i.middleware&&i.middleware.length>0)this.app[u](c,...i.middleware,h);else this.app[u](c,h)}}normalizePath(s){if(!s.startsWith("/"))s="/"+s;if(s=s.replace(/\{([^}]+)\}/g,":$1"),s.length>1&&s.endsWith("/"))s=s.slice(0,-1);return s}createHandler(s){return async(n)=>{try{n.set("routeMetadata",s);let i=await this.extractParameters(n,s.parameters),f=await this.resolveDependencies(n,s.dependencies),h=this.mergeArguments(i,f,s.parameters,s.maxArgumentIndex),c;if(s.handler)c=await s.handler(n,...h);else{let u=await this.container.resolve(s.target,{scope:"transient",context:n});if(typeof u[s.propertyKey]!=="function")throw Error(`Method ${s.propertyKey} not found on controller ${s.target.name}`);c=await u[s.propertyKey](...h)}return this.serializeResponse(n,c)}catch(i){return await this.handleError(n,i)}}}serializeResponse(s,n){return Fs.serialize(s,n)}getRouteMetadataForContext(s){return s.get("routeMetadata")||null}isAuthRequired(s){if(s.auth?.required)return!0;return s.parameters.some((n)=>n.type==="current-user")}async handleError(s,n){return await this.errorHandler.handle(n,s)}async extractParameters(s,n){let i=[];for(let f of n){if(!f)continue;let h;switch(f.type){case"body":try{h=await s.req.json()}catch(w){h=null}break;case"query":if(f.name)h=s.req.query(f.name);else h=s.req.query();break;case"param":if(f.name)h=s.req.param(f.name);else h=s.req.param();break;case"header":if(f.name)h=s.req.header(f.name);else{let w={};s.req.raw.headers.forEach((b,P)=>{w[P]=b}),h=w}break;case"cookie":if(f.name)h=sn(s,f.name);else{let w=s.req.header("cookie");if(w)h=Object.fromEntries(w.split(";").map((b)=>{let[P,...$]=b.trim().split("=");return[P,$.join("=")]}));else h={}}break;case"request":h=s.req;break;case"response":case"context":h=s;break;case"current-user":h=s.get("auth.user")||null;let c=this.getRouteMetadataForContext(s);if(c&&this.isAuthRequired(c)){if(!h){let w=s.get("auth.error")||"Authentication required",{AuthenticationException:b}=await import("../../chunk-3nhrrhv9.js");throw new b(w)}}break;case"token":h=s.get("auth.token")||null;break;case"oauth-user":h=s.get("oauth.user")||null;break;case"oauth-token":h=s.get("oauth.token")||null;break;case"current-session":h=s.get("session")||null;break;case"session-data":let u=s.get("session");if(u&&f.metadata?.key)h=u.data[f.metadata.key];else if(u)h=u.data;else h=null;break;case"csrf-token":h=s.get("csrf.token")||null;break;case"filtered-resource":h=s.get("filtered.resource")||null;break;case"filtered-attributes":h=s.get("filtered.attributes")||[];break;default:h=void 0}if(f.schema)try{h=await this.validator.validate(h,f.schema)}catch(c){throw c}i[f.index]=h}return i}mergeArguments(s,n,i,f){let c=i.filter((P)=>P!==void 0&&P.index!==void 0).map((P)=>P.index),u=c.length>0?Math.max(...c):-1,w=f!==void 0&&f>=0?f:Math.max(u,s.length-1,n.length-1,0);if(!Number.isFinite(w)||w<0)w=0;let b=Array(w+1);for(let P=0;P<=w;P++)if(s[P]!==void 0)b[P]=s[P];else if(n[P]!==void 0)b[P]=n[P];return b}async resolveDependencies(s,n){let i=[];for(let f of n){if(!f)continue;try{let h=await this.container.resolve(f.provider,{scope:f.scope,context:s});i[f.index]=h}catch(h){throw Error(`Failed to resolve dependency at index ${f.index}: ${h instanceof Error?h.message:"Unknown error"}`)}}return i}}class Ws{plugins=new Map;installed=new Set;register(s){if(this.plugins.has(s.name))throw Error(`Plugin "${s.name}" is already registered`);this.plugins.set(s.name,s)}async install(s){let n=this.resolveInstallOrder();for(let i of n)await this.plugins.get(i).install(s),this.installed.add(i)}isInstalled(s){return this.installed.has(s)}getPlugin(s){return this.plugins.get(s)}getPluginNames(){return Array.from(this.plugins.keys())}resolveInstallOrder(){let s=new Set,n=new Set,i=[],f=(h,c=[])=>{if(n.has(h)){let w=[...c,h].join(" -> ");throw Error(`Circular dependency detected in plugins: ${w}`)}if(s.has(h))return;n.add(h);let u=this.plugins.get(h);if(!u)throw Error(`Plugin "${h}" is not registered`);if(u.dependencies)for(let w of u.dependencies){if(!this.plugins.has(w))throw Error(`Plugin "${h}" depends on "${w}" which is not registered`);f(w,[...c,h])}n.delete(h),s.add(h),i.push(h)};for(let h of this.plugins.keys())f(h);return i}}class Bs{hono;metadata;container;validator;errorHandler;compiler;pluginManager;config;compiled=!1;globalMiddleware=[];groupPrefix="";constructor(s){if(this.config={adapter:"hono",title:"Veloce-TS API",version:"1.0.0",docs:!0,...s},this.hono=new ns,this.metadata=new F,this.container=new js,this.validator=new un,this.errorHandler=new bn,this.pluginManager=new Ws,this.compiler=new Qs(this.hono,this.metadata,this.container,this.validator,this.errorHandler),this.config.cors)if(this.config.cors===!0)this.useCors();else this.useCors(this.config.cors)}include(s){let n=F.getControllerMetadata(s);if(n)this.metadata.registerController(s,n);let i=F.getRouteMethods(s);for(let f of i){let h=F.getRouteMetadata(s.prototype,f),c=F.getParameterMetadata(s.prototype,f),u=F.getDependencyMetadata(s.prototype,f);if(h&&h.method&&h.path!==void 0){let w=n?.prefix||"",b=this.normalizePath(w,h.path);this.metadata.registerRoute({target:s,propertyKey:f,method:h.method,path:b,middleware:[...n?.middleware||[],...h.middleware||[]],parameters:c||h.parameters||[],dependencies:u||h.dependencies||[],responses:h.responses||[],docs:h.docs})}}}get(s,n){this.registerFunctionalRoute("GET",s,n)}post(s,n){this.registerFunctionalRoute("POST",s,n)}put(s,n){this.registerFunctionalRoute("PUT",s,n)}delete(s,n){this.registerFunctionalRoute("DELETE",s,n)}patch(s,n){this.registerFunctionalRoute("PATCH",s,n)}route(s){return new Hn(this,s)}group(s,n){let i=this.groupPrefix;this.groupPrefix=this.normalizePath(this.groupPrefix,s),n(),this.groupPrefix=i}registerFunctionalRoute(s,n,i){let f=this.normalizePath(this.groupPrefix,n),h={target:Cn,propertyKey:`${s.toLowerCase()}_${f}`,method:s,path:f,middleware:i.middleware||[],parameters:this.extractParametersFromSchema(i.schema),dependencies:[],responses:i.responses||[],docs:i.docs,handler:i.handler};this.metadata.registerRoute(h)}extractParametersFromSchema(s){let n=[],i=0;if(s?.body)n.push({index:i++,type:"body",schema:s.body,required:!0});if(s?.query)n.push({index:i++,type:"query",schema:s.query,required:!1});if(s?.params)n.push({index:i++,type:"param",schema:s.params,required:!0});if(s?.headers)n.push({index:i++,type:"header",schema:s.headers,required:!1});return n}use(s){this.globalMiddleware.push(s),this.hono.use("*",s)}useCors(s){let n=Pn(s);this.use(n)}useRateLimit(s){let n=$n(s);this.use(n)}useCompression(s){let n=Sn(s);this.use(n)}usePlugin(s){this.pluginManager.register(s)}getPluginManager(){return this.pluginManager}onError(s){this.errorHandler.setCustomHandler(s)}getErrorHandler(){return this.errorHandler}normalizePath(...s){let n=s.filter((i)=>i!=="").join("/").replace(/\/+/g,"/").replace(/\/$/,"");return n.startsWith("/")?n:`/${n}`}getHono(){return this.hono}getMetadata(){return this.metadata}getContainer(){return this.container}getCompiler(){return this.compiler}getConfig(){return this.config}isCompiled(){return this.compiled}markCompiled(){this.compiled=!0}async compile(){if(this.compiled){console.warn("Routes have already been compiled. Skipping compilation.");return}await this.pluginManager.install(this),this.compiler.compile(),this.compiled=!0}async listen(s,n){if(!this.compiled)await this.compile();return this.createAdapter().listen(s,n)}createAdapter(){let s=this.config.adapter||"hono";switch(s){case"hono":{let{HonoAdapter:n}=Xs(Gs);return new n(this.hono)}case"express":{let{ExpressAdapter:n}=Xs(wn);return new n(this)}case"native":{let{HonoAdapter:n}=Xs(Gs);return new n(this.hono)}default:throw Error(`Unknown adapter type: ${s}. Supported adapters: 'hono', 'express', 'native'`)}}}class Cn{}class Hn{app;path;constructor(s,n){this.app=s;this.path=n}get(s){return this.app.get(this.path,s),this}post(s){return this.app.post(this.path,s),this}put(s){return this.app.put(this.path,s),this}delete(s){return this.app.delete(this.path,s),this}patch(s){return this.app.patch(this.path,s),this}}function jn(s){let n={docs:!1,cors:!1,...s};return new Bs(n)}function Tn(s,n,i,f){let h=s.getContainer(),c=typeof i==="function"?i:()=>i;h.register(n,{scope:f?.scope||"singleton",factory:c})}function On(s){return new I(s)}async function vn(s,n){let i=jn(n);await s(i),await i.compile();let f=On(i);return{app:i,client:f}}function An(s){s.getContainer().clear()}export{vn as setupTestApp,Tn as mockDependency,On as createTestClient,jn as createTestApp,An as clearMocks,I as TestClient};export{F as j,js as k,sn as l,wf as m,nn as n,ls as o,xs as p,zs as q,Ls as r,Us as s,Fs as t,Ns as u,Qs as v,Ws as w,hn as x,cn as y,Bs as z,I as A,jn as B,Tn as C,On as D,vn as E,An as F};
2
+ import{J as H}from"../../chunk-2100y16g.js";import{K as kt,L as qt,M as vt}from"../../chunk-dtw2tbsd.js";import{N as Jt}from"../../chunk-vh4sxcpe.js";import"../../chunk-k66rn4fj.js";import{ja as Yt}from"../../chunk-mky5qqg0.js";import"../../chunk-yq3gf9ts.js";import{pa as Gt}from"../../chunk-9v7atckx.js";import"../../chunk-5q75d71c.js";import{ta as Cs,ua as bt,wa as Xt,xa as yt}from"../../chunk-y262e56g.js";var ot={};Xt(ot,{HonoAdapter:()=>Vt});class Vt{hono;name="hono";runtime;constructor(t){this.hono=t;this.runtime=Es()}listen(t,s){switch(this.runtime){case"bun":return this.listenBun(t,s);case"deno":return this.listenDeno(t,s);case"node":return this.listenNode(t,s);case"workerd":throw Error("Cloudflare Workers do not support listen(). Deploy using wrangler or export the handler with getHandler().");default:throw Error(`Unsupported runtime: ${this.runtime}. FastAPI-TS supports Bun, Node.js, Deno, and Cloudflare Workers.`)}}getHandler(){return this.hono.fetch}getRuntime(){return this.runtime}listenBun(t,s){let i=Bun.serve({port:t,fetch:this.hono.fetch});if(s)s();return i}listenDeno(t,s){let i=new AbortController;return Deno.serve({port:t,signal:i.signal,onListen:s},this.hono.fetch),{port:t,close:()=>i.abort()}}listenNode(t,s){try{let{serve:i}=(()=>{throw new Error("Cannot require module "+"@hono/node-server");})();return i({fetch:this.hono.fetch,port:t},s)}catch(i){throw Error("Node.js adapter requires @hono/node-server package. Install it with: npm install @hono/node-server")}}}var Es=()=>{if(typeof Bun<"u")return"bun";if(typeof Deno<"u")return"deno";if(typeof navigator<"u"&&navigator.userAgent==="Cloudflare-Workers")return"workerd";if(typeof process<"u"&&process.versions&&process.versions.node)return"node";return"unknown"};var Zt={};Xt(Zt,{ExpressAdapter:()=>It});class It{app;name="express";express;constructor(t){this.app=t;try{let s=(()=>{throw new Error("Cannot require module "+"express");})();this.express=s(),this.setupBridge()}catch(s){throw Error("Express adapter requires express package. Install it with: npm install express")}}setupBridge(){let t=this.app.getHono();this.express.use(async(s,i)=>{try{let n=this.createWebRequest(s),f=await t.fetch(n);await this.sendExpressResponse(i,f)}catch(n){i.status(500).json({error:"Internal Server Error",message:n instanceof Error?n.message:"Unknown error"})}})}createWebRequest(t){let s=t.protocol||"http",i=t.get("host")||"localhost",n=`${s}://${i}${t.originalUrl||t.url}`,f=new Headers;for(let[h,e]of Object.entries(t.headers))if(typeof e==="string")f.set(h,e);else if(Array.isArray(e))e.forEach((c)=>f.append(h,c));let r={method:t.method,headers:f};if(t.method!=="GET"&&t.method!=="HEAD"){if(t.body)r.body=JSON.stringify(t.body),f.set("content-type","application/json")}return new Request(n,r)}async sendExpressResponse(t,s){if(t.status(s.status),s.headers.forEach((i,n)=>{t.setHeader(n,i)}),s.body){let i=s.headers.get("content-type")||"";if(i.includes("application/json")){let n=await s.json();t.json(n)}else if(i.includes("text/")){let n=await s.text();t.send(n)}else{let n=await s.arrayBuffer();t.send(Buffer.from(n))}}else t.end()}listen(t,s){return this.express.listen(t,s)}getHandler(){return this.express}getExpressApp(){return this.express}}class T{hono;constructor(t){this.hono=t.getHono()}async get(t,s){return this.request("GET",t,s)}async post(t,s){return this.request("POST",t,s)}async put(t,s){return this.request("PUT",t,s)}async delete(t,s){return this.request("DELETE",t,s)}async patch(t,s){return this.request("PATCH",t,s)}async request(t,s,i){let n=this.buildUrl(s,i?.query),f={method:t,headers:this.buildHeaders(i)};if(i?.body!==void 0)f.body=i.body;else if(i?.json!==void 0)f.body=JSON.stringify(i.json);let r=await this.hono.request(n,f),h=await r.text(),e;try{e=JSON.parse(h)}catch{e=h}return{status:r.status,headers:r.headers,body:e,text:h,json:async()=>JSON.parse(h),ok:r.ok}}buildUrl(t,s){if(!s||Object.keys(s).length===0)return t;let i=new URLSearchParams(s).toString();return`${t}?${i}`}buildHeaders(t){let s={...t?.headers};if(t?.json!==void 0&&!s["Content-Type"])s["Content-Type"]="application/json";return s}}var Z=(t,s,i)=>{return(n,f)=>{let r=-1;return h(0);async function h(e){if(e<=r)throw Error("next() called multiple times");r=e;let c,w=!1,y;if(t[e])y=t[e][0][0],n.req.routeIndex=e;else y=e===t.length&&f||void 0;if(y)try{c=await y(n,()=>h(e+1))}catch(u){if(u instanceof Error&&s)n.error=u,c=await s(u,n),w=!0;else throw u}else if(n.finalized===!1&&i)c=await i(n);if(c&&(n.finalized===!1||w))n.res=c;return n}}};var Ot=Symbol();var $t=async(t,s=Object.create(null))=>{let{all:i=!1,dot:n=!1}=s,r=(t instanceof z?t.raw.headers:t.headers).get("Content-Type");if(r?.startsWith("multipart/form-data")||r?.startsWith("application/x-www-form-urlencoded"))return ss(t,{all:i,dot:n});return{}};async function ss(t,s){let i=await t.formData();if(i)return is(i,s);return{}}function is(t,s){let i=Object.create(null);if(t.forEach((n,f)=>{if(!(s.all||f.endsWith("[]")))i[f]=n;else ns(i,f,n)}),s.dot)Object.entries(i).forEach(([n,f])=>{if(n.includes("."))fs(i,n,f),delete i[n]});return i}var ns=(t,s,i)=>{if(t[s]!==void 0)if(Array.isArray(t[s]))t[s].push(i);else t[s]=[t[s],i];else if(!s.endsWith("[]"))t[s]=i;else t[s]=[i]},fs=(t,s,i)=>{let n=t,f=s.split(".");f.forEach((r,h)=>{if(h===f.length-1)n[r]=i;else{if(!n[r]||typeof n[r]!=="object"||Array.isArray(n[r])||n[r]instanceof File)n[r]=Object.create(null);n=n[r]}})};var J=(t)=>{let s=t.split("/");if(s[0]==="")s.shift();return s},Ct=(t)=>{let{groups:s,path:i}=rs(t),n=J(i);return es(n,s)},rs=(t)=>{let s=[];return t=t.replace(/\{[^}]+\}/g,(i,n)=>{let f=`@${n}`;return s.push([f,i]),f}),{groups:s,path:t}},es=(t,s)=>{for(let i=s.length-1;i>=0;i--){let[n]=s[i];for(let f=t.length-1;f>=0;f--)if(t[f].includes(n)){t[f]=t[f].replace(n,s[i][1]);break}}return t},W={},Et=(t,s)=>{if(t==="*")return"*";let i=t.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/);if(i){let n=`${t}#${s}`;if(!W[n])if(i[2])W[n]=s&&s[0]!==":"&&s[0]!=="*"?[n,i[1],new RegExp(`^${i[2]}(?=/${s})`)]:[t,i[1],new RegExp(`^${i[2]}$`)];else W[n]=[t,i[1],!0];return W[n]}return null},D=(t,s)=>{try{return s(t)}catch{return t.replace(/(?:%[0-9A-Fa-f]{2})+/g,(i)=>{try{return s(i)}catch{return i}})}},hs=(t)=>D(t,decodeURI),k=(t)=>{let s=t.url,i=s.indexOf("/",s.indexOf(":")+4),n=i;for(;n<s.length;n++){let f=s.charCodeAt(n);if(f===37){let r=s.indexOf("?",n),h=s.slice(i,r===-1?void 0:r);return hs(h.includes("%25")?h.replace(/%25/g,"%2525"):h)}else if(f===63)break}return s.slice(i,n)};var xt=(t)=>{let s=k(t);return s.length>1&&s.at(-1)==="/"?s.slice(0,-1):s},E=(t,s,...i)=>{if(i.length)s=E(s,...i);return`${t?.[0]==="/"?"":"/"}${t}${s==="/"?"":`${t?.at(-1)==="/"?"":"/"}${s?.[0]==="/"?s.slice(1):s}`}`},F=(t)=>{if(t.charCodeAt(t.length-1)!==63||!t.includes(":"))return null;let s=t.split("/"),i=[],n="";return s.forEach((f)=>{if(f!==""&&!/\:/.test(f))n+="/"+f;else if(/\:/.test(f))if(/\?/.test(f)){if(i.length===0&&n==="")i.push("/");else i.push(n);let r=f.replace("?","");n+="/"+r,i.push(n)}else n+="/"+f}),i.filter((f,r,h)=>h.indexOf(f)===r)},Y=(t)=>{if(!/[%+]/.test(t))return t;if(t.indexOf("+")!==-1)t=t.replace(/\+/g," ");return t.indexOf("%")!==-1?D(t,K):t},Ht=(t,s,i)=>{let n;if(!i&&s&&!/[%+]/.test(s)){let h=t.indexOf(`?${s}`,8);if(h===-1)h=t.indexOf(`&${s}`,8);while(h!==-1){let e=t.charCodeAt(h+s.length+1);if(e===61){let c=h+s.length+2,w=t.indexOf("&",c);return Y(t.slice(c,w===-1?void 0:w))}else if(e==38||isNaN(e))return"";h=t.indexOf(`&${s}`,h+1)}if(n=/[%+]/.test(t),!n)return}let f={};n??=/[%+]/.test(t);let r=t.indexOf("?",8);while(r!==-1){let h=t.indexOf("&",r+1),e=t.indexOf("=",r);if(e>h&&h!==-1)e=-1;let c=t.slice(r+1,e===-1?h===-1?void 0:h:e);if(n)c=Y(c);if(r=h,c==="")continue;let w;if(e===-1)w="";else if(w=t.slice(e+1,h===-1?void 0:h),n)w=Y(w);if(i){if(!(f[c]&&Array.isArray(f[c])))f[c]=[];f[c].push(w)}else f[c]??=w}return s?f[s]:f},jt=Ht,Dt=(t,s)=>{return Ht(t,s,!0)},K=decodeURIComponent;var lt=(t)=>D(t,K),z=class{raw;#s;#t;routeIndex=0;path;bodyCache={};constructor(t,s="/",i=[[]]){this.raw=t,this.path=s,this.#t=i,this.#s={}}param(t){return t?this.#i(t):this.#r()}#i(t){let s=this.#t[0][this.routeIndex][1][t],i=this.#f(s);return i&&/\%/.test(i)?lt(i):i}#r(){let t={},s=Object.keys(this.#t[0][this.routeIndex][1]);for(let i of s){let n=this.#f(this.#t[0][this.routeIndex][1][i]);if(n!==void 0)t[i]=/\%/.test(n)?lt(n):n}return t}#f(t){return this.#t[1]?this.#t[1][t]:t}query(t){return jt(this.url,t)}queries(t){return Dt(this.url,t)}header(t){if(t)return this.raw.headers.get(t)??void 0;let s={};return this.raw.headers.forEach((i,n)=>{s[n]=i}),s}async parseBody(t){return this.bodyCache.parsedBody??=await $t(this,t)}#n=(t)=>{let{bodyCache:s,raw:i}=this,n=s[t];if(n)return n;let f=Object.keys(s)[0];if(f)return s[f].then((r)=>{if(f==="json")r=JSON.stringify(r);return new Response(r)[t]()});return s[t]=i[t]()};json(){return this.#n("text").then((t)=>JSON.parse(t))}text(){return this.#n("text")}arrayBuffer(){return this.#n("arrayBuffer")}blob(){return this.#n("blob")}formData(){return this.#n("formData")}addValidatedData(t,s){this.#s[t]=s}valid(t){return this.#s[t]}get url(){return this.raw.url}get method(){return this.raw.method}get[Ot](){return this.#t}get matchedRoutes(){return this.#t[0].map(([[,t]])=>t)}get routePath(){return this.#t[0].map(([[,t]])=>t)[this.routeIndex].path}};var Nt={Stringify:1,BeforeStream:2,Stream:3},cs=(t,s)=>{let i=new String(t);return i.isEscaped=!0,i.callbacks=s,i};var q=async(t,s,i,n,f)=>{if(typeof t==="object"&&!(t instanceof String)){if(!(t instanceof Promise))t=t.toString();if(t instanceof Promise)t=await t}let r=t.callbacks;if(!r?.length)return Promise.resolve(t);if(f)f[0]+=t;else f=[t];let h=Promise.all(r.map((e)=>e({phase:s,buffer:f,context:n}))).then((e)=>Promise.all(e.filter(Boolean).map((c)=>q(c,s,!1,n,f))).then(()=>f[0]));if(i)return cs(await h,r);else return h};var ws="text/plain; charset=UTF-8",v=(t,s)=>{return{"Content-Type":t,...s}},Ut=class{#s;#t;env={};#i;finalized=!1;error;#r;#f;#n;#y;#c;#w;#h;#u;#g;constructor(t,s){if(this.#s=t,s)this.#f=s.executionCtx,this.env=s.env,this.#w=s.notFoundHandler,this.#g=s.path,this.#u=s.matchResult}get req(){return this.#t??=new z(this.#s,this.#g,this.#u),this.#t}get event(){if(this.#f&&"respondWith"in this.#f)return this.#f;else throw Error("This context has no FetchEvent")}get executionCtx(){if(this.#f)return this.#f;else throw Error("This context has no ExecutionContext")}get res(){return this.#n||=new Response(null,{headers:this.#h??=new Headers})}set res(t){if(this.#n&&t){t=new Response(t.body,t);for(let[s,i]of this.#n.headers.entries()){if(s==="content-type")continue;if(s==="set-cookie"){let n=this.#n.headers.getSetCookie();t.headers.delete("set-cookie");for(let f of n)t.headers.append("set-cookie",f)}else t.headers.set(s,i)}}this.#n=t,this.finalized=!0}render=(...t)=>{return this.#c??=(s)=>this.html(s),this.#c(...t)};setLayout=(t)=>this.#y=t;getLayout=()=>this.#y;setRenderer=(t)=>{this.#c=t};header=(t,s,i)=>{if(this.finalized)this.#n=new Response(this.#n.body,this.#n);let n=this.#n?this.#n.headers:this.#h??=new Headers;if(s===void 0)n.delete(t);else if(i?.append)n.append(t,s);else n.set(t,s)};status=(t)=>{this.#r=t};set=(t,s)=>{this.#i??=new Map,this.#i.set(t,s)};get=(t)=>{return this.#i?this.#i.get(t):void 0};get var(){if(!this.#i)return{};return Object.fromEntries(this.#i)}#e(t,s,i){let n=this.#n?new Headers(this.#n.headers):this.#h??new Headers;if(typeof s==="object"&&"headers"in s){let r=s.headers instanceof Headers?s.headers:new Headers(s.headers);for(let[h,e]of r)if(h.toLowerCase()==="set-cookie")n.append(h,e);else n.set(h,e)}if(i)for(let[r,h]of Object.entries(i))if(typeof h==="string")n.set(r,h);else{n.delete(r);for(let e of h)n.append(r,e)}let f=typeof s==="number"?s:s?.status??this.#r;return new Response(t,{status:f,headers:n})}newResponse=(...t)=>this.#e(...t);body=(t,s,i)=>this.#e(t,s,i);text=(t,s,i)=>{return!this.#h&&!this.#r&&!s&&!i&&!this.finalized?new Response(t):this.#e(t,s,v(ws,i))};json=(t,s,i)=>{return this.#e(JSON.stringify(t),s,v("application/json",i))};html=(t,s,i)=>{let n=(f)=>this.#e(f,s,v("text/html; charset=UTF-8",i));return typeof t==="object"?q(t,Nt.Stringify,!1,{}).then(n):n(t)};redirect=(t,s)=>{let i=String(t);return this.header("Location",!/[^\x00-\xFF]/.test(i)?i:encodeURI(i)),this.newResponse(null,s??302)};notFound=()=>{return this.#w??=()=>new Response,this.#w(this)}};var g="ALL",Kt="all",At=["get","post","put","delete","options","patch"],Q="Can not add a route since the matcher is already built.",B=class extends Error{};var Lt="__COMPOSED_HANDLER";var ys=(t)=>{return t.text("404 Not Found",404)},Rt=(t,s)=>{if("getResponse"in t){let i=t.getResponse();return s.newResponse(i.body,i)}return console.error(t),s.text("Internal Server Error",500)},M=class{get;post;put;delete;options;patch;all;on;use;router;getPath;_basePath="/";#s="/";routes=[];constructor(t={}){[...At,Kt].forEach((f)=>{this[f]=(r,...h)=>{if(typeof r==="string")this.#s=r;else this.#r(f,this.#s,r);return h.forEach((e)=>{this.#r(f,this.#s,e)}),this}}),this.on=(f,r,...h)=>{for(let e of[r].flat()){this.#s=e;for(let c of[f].flat())h.map((w)=>{this.#r(c.toUpperCase(),this.#s,w)})}return this},this.use=(f,...r)=>{if(typeof f==="string")this.#s=f;else this.#s="*",r.unshift(f);return r.forEach((h)=>{this.#r(g,this.#s,h)}),this};let{strict:i,...n}=t;Object.assign(this,n),this.getPath=i??!0?t.getPath??k:xt}#t(){let t=new M({router:this.router,getPath:this.getPath});return t.errorHandler=this.errorHandler,t.#i=this.#i,t.routes=this.routes,t}#i=ys;errorHandler=Rt;route(t,s){let i=this.basePath(t);return s.routes.map((n)=>{let f;if(s.errorHandler===Rt)f=n.handler;else f=async(r,h)=>(await Z([],s.errorHandler)(r,()=>n.handler(r,h))).res,f[Lt]=n.handler;i.#r(n.method,n.path,f)}),this}basePath(t){let s=this.#t();return s._basePath=E(this._basePath,t),s}onError=(t)=>{return this.errorHandler=t,this};notFound=(t)=>{return this.#i=t,this};mount(t,s,i){let n,f;if(i)if(typeof i==="function")f=i;else if(f=i.optionHandler,i.replaceRequest===!1)n=(e)=>e;else n=i.replaceRequest;let r=f?(e)=>{let c=f(e);return Array.isArray(c)?c:[c]}:(e)=>{let c=void 0;try{c=e.executionCtx}catch{}return[e.env,c]};n||=(()=>{let e=E(this._basePath,t),c=e==="/"?0:e.length;return(w)=>{let y=new URL(w.url);return y.pathname=y.pathname.slice(c)||"/",new Request(y,w)}})();let h=async(e,c)=>{let w=await s(n(e.req.raw),...r(e));if(w)return w;await c()};return this.#r(g,E(t,"*"),h),this}#r(t,s,i){t=t.toUpperCase(),s=E(this._basePath,s);let n={basePath:this._basePath,path:s,method:t,handler:i};this.router.add(t,s,[i,n]),this.routes.push(n)}#f(t,s){if(t instanceof Error)return this.errorHandler(t,s);throw t}#n(t,s,i,n){if(n==="HEAD")return(async()=>new Response(null,await this.#n(t,s,i,"GET")))();let f=this.getPath(t,{env:i}),r=this.router.match(n,f),h=new Ut(t,{path:f,matchResult:r,env:i,executionCtx:s,notFoundHandler:this.#i});if(r[0].length===1){let c;try{c=r[0][0][0][0](h,async()=>{h.res=await this.#i(h)})}catch(w){return this.#f(w,h)}return c instanceof Promise?c.then((w)=>w||(h.finalized?h.res:this.#i(h))).catch((w)=>this.#f(w,h)):c??this.#i(h)}let e=Z(r[0],this.errorHandler,this.#i);return(async()=>{try{let c=await e(h);if(!c.finalized)throw Error("Context is not finalized. Did you forget to return a Response object or `await next()`?");return c.res}catch(c){return this.#f(c,h)}})()}fetch=(t,...s)=>{return this.#n(t,s[1],s[0],t.method)};request=(t,s,i,n)=>{if(t instanceof Request)return this.fetch(s?new Request(t,s):t,i,n);return t=t.toString(),this.fetch(new Request(/^https?:\/\//.test(t)?t:`http://localhost${E("/",t)}`,s),i,n)};fire=()=>{addEventListener("fetch",(t)=>{t.respondWith(this.#n(t.request,t,void 0,t.request.method))})}};var G="[^/]+",A=".*",L="(?:|/.*)",x=Symbol(),us=new Set(".\\+*[^]$()");function gs(t,s){if(t.length===1)return s.length===1?t<s?-1:1:-1;if(s.length===1)return 1;if(t===A||t===L)return 1;else if(s===A||s===L)return-1;if(t===G)return 1;else if(s===G)return-1;return t.length===s.length?t<s?-1:1:s.length-t.length}var X=class{#s;#t;#i=Object.create(null);insert(t,s,i,n,f){if(t.length===0){if(this.#s!==void 0)throw x;if(f)return;this.#s=s;return}let[r,...h]=t,e=r==="*"?h.length===0?["","",A]:["","",G]:r==="/*"?["","",L]:r.match(/^\:([^\{\}]+)(?:\{(.+)\})?$/),c;if(e){let w=e[1],y=e[2]||G;if(w&&e[2]){if(y===".*")throw x;if(y=y.replace(/^\((?!\?:)(?=[^)]+\)$)/,"(?:"),/\((?!\?:)/.test(y))throw x}if(c=this.#i[y],!c){if(Object.keys(this.#i).some((u)=>u!==A&&u!==L))throw x;if(f)return;if(c=this.#i[y]=new X,w!=="")c.#t=n.varIndex++}if(!f&&w!=="")i.push([w,c.#t])}else if(c=this.#i[r],!c){if(Object.keys(this.#i).some((w)=>w.length>1&&w!==A&&w!==L))throw x;if(f)return;c=this.#i[r]=new X}c.insert(h,s,i,n,f)}buildRegExpStr(){let s=Object.keys(this.#i).sort(gs).map((i)=>{let n=this.#i[i];return(typeof n.#t==="number"?`(${i})@${n.#t}`:us.has(i)?`\\${i}`:i)+n.buildRegExpStr()});if(typeof this.#s==="number")s.unshift(`#${this.#s}`);if(s.length===0)return"";if(s.length===1)return s[0];return"(?:"+s.join("|")+")"}};var Tt=class{#s={varIndex:0};#t=new X;insert(t,s,i){let n=[],f=[];for(let h=0;;){let e=!1;if(t=t.replace(/\{[^}]+\}/g,(c)=>{let w=`@\\${h}`;return f[h]=[w,c],h++,e=!0,w}),!e)break}let r=t.match(/(?::[^\/]+)|(?:\/\*$)|./g)||[];for(let h=f.length-1;h>=0;h--){let[e]=f[h];for(let c=r.length-1;c>=0;c--)if(r[c].indexOf(e)!==-1){r[c]=r[c].replace(e,f[h][1]);break}}return this.#t.insert(r,s,n,this.#s,i),n}buildRegExp(){let t=this.#t.buildRegExpStr();if(t==="")return[/^$/,[],[]];let s=0,i=[],n=[];return t=t.replace(/#(\d+)|@(\d+)|\.\*\$/g,(f,r,h)=>{if(r!==void 0)return i[++s]=Number(r),"$()";if(h!==void 0)return n[Number(h)]=++s,"";return""}),[new RegExp(`^${t}`),i,n]}};var zt=[],Ps=[/^$/,[],Object.create(null)],Wt=Object.create(null);function Ft(t){return Wt[t]??=new RegExp(t==="*"?"":`^${t.replace(/\/\*$|([.\\+*[^\]$()])/g,(s,i)=>i?`\\${i}`:"(?:|/.*)")}$`)}function os(){Wt=Object.create(null)}function bs(t){let s=new Tt,i=[];if(t.length===0)return Ps;let n=t.map((w)=>[!/\*|\/:/.test(w[0]),...w]).sort(([w,y],[u,o])=>w?1:u?-1:y.length-o.length),f=Object.create(null);for(let w=0,y=-1,u=n.length;w<u;w++){let[o,S,P]=n[w];if(o)f[S]=[P.map(([_])=>[_,Object.create(null)]),zt];else y++;let b;try{b=s.insert(S,y,o)}catch(_){throw _===x?new B(S):_}if(o)continue;i[y]=P.map(([_,j])=>{let N=Object.create(null);j-=1;for(;j>=0;j--){let[O,I]=b[j];N[O]=I}return[_,N]})}let[r,h,e]=s.buildRegExp();for(let w=0,y=i.length;w<y;w++)for(let u=0,o=i[w].length;u<o;u++){let S=i[w][u]?.[1];if(!S)continue;let P=Object.keys(S);for(let b=0,_=P.length;b<_;b++)S[P[b]]=e[S[P[b]]]}let c=[];for(let w in h)c[w]=i[h[w]];return[r,c,f]}function l(t,s){if(!t)return;for(let i of Object.keys(t).sort((n,f)=>f.length-n.length))if(Ft(i).test(s))return[...t[i]];return}var d=class{name="RegExpRouter";#s;#t;constructor(){this.#s={[g]:Object.create(null)},this.#t={[g]:Object.create(null)}}add(t,s,i){let n=this.#s,f=this.#t;if(!n||!f)throw Error(Q);if(!n[t])[n,f].forEach((e)=>{e[t]=Object.create(null),Object.keys(e[g]).forEach((c)=>{e[t][c]=[...e[g][c]]})});if(s==="/*")s="*";let r=(s.match(/\/:/g)||[]).length;if(/\*$/.test(s)){let e=Ft(s);if(t===g)Object.keys(n).forEach((c)=>{n[c][s]||=l(n[c],s)||l(n[g],s)||[]});else n[t][s]||=l(n[t],s)||l(n[g],s)||[];Object.keys(n).forEach((c)=>{if(t===g||t===c)Object.keys(n[c]).forEach((w)=>{e.test(w)&&n[c][w].push([i,r])})}),Object.keys(f).forEach((c)=>{if(t===g||t===c)Object.keys(f[c]).forEach((w)=>e.test(w)&&f[c][w].push([i,r]))});return}let h=F(s)||[s];for(let e=0,c=h.length;e<c;e++){let w=h[e];Object.keys(f).forEach((y)=>{if(t===g||t===y)f[y][w]||=[...l(n[y],w)||l(n[g],w)||[]],f[y][w].push([i,r-c+e+1])})}}match(t,s){os();let i=this.#i();return this.match=(n,f)=>{let r=i[n]||i[g],h=r[2][f];if(h)return h;let e=f.match(r[0]);if(!e)return[[],zt];let c=e.indexOf("",1);return[r[1][c],e]},this.match(t,s)}#i(){let t=Object.create(null);return Object.keys(this.#t).concat(Object.keys(this.#s)).forEach((s)=>{t[s]||=this.#r(s)}),this.#s=this.#t=void 0,t}#r(t){let s=[],i=t===g;if([this.#s,this.#t].forEach((n)=>{let f=n[t]?Object.keys(n[t]).map((r)=>[r,n[t][r]]):[];if(f.length!==0)i||=!0,s.push(...f);else if(t!==g)s.push(...Object.keys(n[g]).map((r)=>[r,n[g][r]]))}),!i)return null;else return bs(s)}};var m=class{name="SmartRouter";#s=[];#t=[];constructor(t){this.#s=t.routers}add(t,s,i){if(!this.#t)throw Error(Q);this.#t.push([t,s,i])}match(t,s){if(!this.#t)throw Error("Fatal error");let i=this.#s,n=this.#t,f=i.length,r=0,h;for(;r<f;r++){let e=i[r];try{for(let c=0,w=n.length;c<w;c++)e.add(...n[c]);h=e.match(t,s)}catch(c){if(c instanceof B)continue;throw c}this.match=e.match.bind(e),this.#s=[e],this.#t=void 0;break}if(r===f)throw Error("Fatal error");return this.name=`SmartRouter + ${this.activeRouter.name}`,h}get activeRouter(){if(this.#t||this.#s.length!==1)throw Error("No active router has been determined yet.");return this.#s[0]}};var R=Object.create(null),a=class{#s;#t;#i;#r=0;#f=R;constructor(t,s,i){if(this.#t=i||Object.create(null),this.#s=[],t&&s){let n=Object.create(null);n[t]={handler:s,possibleKeys:[],score:0},this.#s=[n]}this.#i=[]}insert(t,s,i){this.#r=++this.#r;let n=this,f=Ct(s),r=[];for(let h=0,e=f.length;h<e;h++){let c=f[h],w=f[h+1],y=Et(c,w),u=Array.isArray(y)?y[0]:c;if(u in n.#t){if(n=n.#t[u],y)r.push(y[1]);continue}if(n.#t[u]=new a,y)n.#i.push(y),r.push(y[1]);n=n.#t[u]}return n.#s.push({[t]:{handler:i,possibleKeys:r.filter((h,e,c)=>c.indexOf(h)===e),score:this.#r}}),n}#n(t,s,i,n){let f=[];for(let r=0,h=t.#s.length;r<h;r++){let e=t.#s[r],c=e[s]||e[g],w={};if(c!==void 0){if(c.params=Object.create(null),f.push(c),i!==R||n&&n!==R)for(let y=0,u=c.possibleKeys.length;y<u;y++){let o=c.possibleKeys[y],S=w[c.score];c.params[o]=n?.[o]&&!S?n[o]:i[o]??n?.[o],w[c.score]=!0}}}return f}search(t,s){let i=[];this.#f=R;let f=[this],r=J(s),h=[];for(let e=0,c=r.length;e<c;e++){let w=r[e],y=e===c-1,u=[];for(let o=0,S=f.length;o<S;o++){let P=f[o],b=P.#t[w];if(b)if(b.#f=P.#f,y){if(b.#t["*"])i.push(...this.#n(b.#t["*"],t,P.#f));i.push(...this.#n(b,t,P.#f))}else u.push(b);for(let _=0,j=P.#i.length;_<j;_++){let N=P.#i[_],O=P.#f===R?{}:{...P.#f};if(N==="*"){let C=P.#t["*"];if(C)i.push(...this.#n(C,t,P.#f)),C.#f=O,u.push(C);continue}let[I,_t,U]=N;if(!w&&!(U instanceof RegExp))continue;let $=P.#t[I],pt=r.slice(e).join("/");if(U instanceof RegExp){let C=U.exec(pt);if(C){if(O[_t]=C[0],i.push(...this.#n($,t,P.#f,O)),Object.keys($.#t).length){$.#f=O;let ts=C[0].match(/\//)?.length??0;(h[ts]||=[]).push($)}continue}}if(U===!0||U.test(w))if(O[_t]=w,y){if(i.push(...this.#n($,t,O,P.#f)),$.#t["*"])i.push(...this.#n($.#t["*"],t,O,P.#f))}else $.#f=O,u.push($)}}f=u.concat(h.shift()??[])}if(i.length>1)i.sort((e,c)=>{return e.score-c.score});return[i.map(({handler:e,params:c})=>[e,c])]}};var p=class{name="TrieRouter";#s;constructor(){this.#s=new a}add(t,s,i){let n=F(s);if(n){for(let f=0,r=n.length;f<r;f++)this.#s.insert(t,n[f],i);return}this.#s.insert(t,s,i)}match(t,s){return this.#s.search(t,s)}};var tt=class extends M{constructor(t={}){super(t);this.router=t.router??new m({routers:[new d,new p]})}};class st{singletons=new Map;requestScoped=new WeakMap;providers=new Map;resolutionStack=new Set;providerNameCache=new WeakMap;stats={singletonHits:0,singletonMisses:0,requestHits:0,requestMisses:0,transientCreations:0};register(t,s){this.providers.set(t,s||{scope:"transient"})}async resolve(t,s){let i=this.providers.get(t)||{scope:s?.scope||"transient"},n=s?.scope||i.scope||"transient";if(n==="singleton"){if(this.singletons.has(t))return this.stats.singletonHits++,this.singletons.get(t);if(this.stats.singletonMisses++,this.resolutionStack.has(t))throw Error(`Circular dependency detected: ${this.buildCircularDependencyMessage(t)}`);this.resolutionStack.add(t);try{let f=await this.create(t,i,s?.context);return this.singletons.set(t,f),f}finally{this.resolutionStack.delete(t)}}if(n==="request"&&s?.context){let f=this.requestScoped.get(s.context);if(f?.has(t))return this.stats.requestHits++,f.get(t);if(this.stats.requestMisses++,!f)f=new Map,this.requestScoped.set(s.context,f);if(this.resolutionStack.has(t))throw Error(`Circular dependency detected: ${this.buildCircularDependencyMessage(t)}`);this.resolutionStack.add(t);try{let r=await this.create(t,i,s.context);return f.set(t,r),r}finally{this.resolutionStack.delete(t)}}if(this.stats.transientCreations++,this.resolutionStack.has(t))throw Error(`Circular dependency detected: ${this.buildCircularDependencyMessage(t)}`);this.resolutionStack.add(t);try{return await this.create(t,i,s?.context)}finally{this.resolutionStack.delete(t)}}buildCircularDependencyMessage(t){let s=Array.from(this.resolutionStack),i=this.getProviderName(t);return s.map((f)=>this.getProviderName(f)).join(" -> ")+" -> "+i}async create(t,s,i){if(s.factory)return s.factory();if(typeof t==="function")if(t.prototype&&t.prototype.constructor===t){let n=new t;return await this.resolveNestedDependencies(n,i),n}else{let n=t();return n instanceof Promise?await n:n}throw Error("Invalid provider type")}async resolveNestedDependencies(t,s){}getProviderName(t){let s=this.providerNameCache.get(t);if(s)return s;let i;if(typeof t==="function")if(t.name)i=t.name;else i=t.toString().substring(0,50);else i=String(t);return this.providerNameCache.set(t,i),i}clear(){this.singletons.clear(),this.providers.clear(),this.resolutionStack.clear(),this.providerNameCache=new WeakMap,this.resetStats()}clearRequestScope(t){this.requestScoped.delete(t)}getStats(){let t=this.stats.singletonHits+this.stats.singletonMisses,s=t>0?this.stats.singletonHits/t*100:0,i=this.stats.requestHits+this.stats.requestMisses,n=i>0?this.stats.requestHits/i*100:0;return{singletonHits:this.stats.singletonHits,singletonMisses:this.stats.singletonMisses,singletonHitRate:Math.round(s*100)/100,requestHits:this.stats.requestHits,requestMisses:this.stats.requestMisses,requestHitRate:Math.round(n*100)/100,transientCreations:this.stats.transientCreations}}resetStats(){this.stats={singletonHits:0,singletonMisses:0,requestHits:0,requestMisses:0,transientCreations:0}}}var Ss=/^[\w!#$%&'*.^`|~+-]+$/,_s=/^[ !#-:<-[\]-~]*$/,it=(t,s)=>{if(s&&t.indexOf(s)===-1)return{};let i=t.trim().split(";"),n={};for(let f of i){f=f.trim();let r=f.indexOf("=");if(r===-1)continue;let h=f.substring(0,r).trim();if(s&&s!==h||!Ss.test(h))continue;let e=f.substring(r+1).trim();if(e.startsWith('"')&&e.endsWith('"'))e=e.slice(1,-1);if(_s.test(e)){if(n[h]=e.indexOf("%")!==-1?D(e,K):e,s)break}}return n};var Os=(t,s,i={})=>{let n=`${t}=${s}`;if(t.startsWith("__Secure-")&&!i.secure)throw Error("__Secure- Cookie must have Secure attributes");if(t.startsWith("__Host-")){if(!i.secure)throw Error("__Host- Cookie must have Secure attributes");if(i.path!=="/")throw Error('__Host- Cookie must have Path attributes with "/"');if(i.domain)throw Error("__Host- Cookie must not have Domain attributes")}if(i&&typeof i.maxAge==="number"&&i.maxAge>=0){if(i.maxAge>34560000)throw Error("Cookies Max-Age SHOULD NOT be greater than 400 days (34560000 seconds) in duration.");n+=`; Max-Age=${i.maxAge|0}`}if(i.domain&&i.prefix!=="host")n+=`; Domain=${i.domain}`;if(i.path)n+=`; Path=${i.path}`;if(i.expires){if(i.expires.getTime()-Date.now()>34560000000)throw Error("Cookies Expires SHOULD NOT be greater than 400 days (34560000 seconds) in the future.");n+=`; Expires=${i.expires.toUTCString()}`}if(i.httpOnly)n+="; HttpOnly";if(i.secure)n+="; Secure";if(i.sameSite)n+=`; SameSite=${i.sameSite.charAt(0).toUpperCase()+i.sameSite.slice(1)}`;if(i.priority)n+=`; Priority=${i.priority.charAt(0).toUpperCase()+i.priority.slice(1)}`;if(i.partitioned){if(!i.secure)throw Error("Partitioned Cookie must have Secure attributes");n+="; Partitioned"}return n},V=(t,s,i)=>{return s=encodeURIComponent(s),Os(t,s,i)};var Qt=(t,s,i)=>{let n=t.req.raw.headers.get("Cookie");if(typeof s==="string"){if(!n)return;let r=s;if(i==="secure")r="__Secure-"+s;else if(i==="host")r="__Host-"+s;return it(n,r)[r]}if(!n)return{};return it(n)};var $s=(t,s,i)=>{let n;if(i?.prefix==="secure")n=V("__Secure-"+t,s,{path:"/",...i,secure:!0});else if(i?.prefix==="host")n=V("__Host-"+t,s,{...i,path:"/",secure:!0,domain:void 0});else n=V(t,s,{path:"/",...i});return n},Xi=(t,s,i,n)=>{let f=$s(s,i,n);t.header("Set-Cookie",f,{append:!0})};class Bt{static json(t,s=200,i){return new nt(t,s,i)}static html(t,s=200){return new ft(t,s)}static file(t,s){return new et(t,s)}static stream(t,s){return new ht(t,s)}static redirect(t,s=302){return new rt(t,s)}}class nt{data;status;headers;constructor(t,s=200,i={}){this.data=t;this.status=s;this.headers=i}toHonoResponse(t){return t.json(this.data,this.status,this.headers)}}class ft{content;status;constructor(t,s=200){this.content=t;this.status=s}toHonoResponse(t){return t.html(this.content,this.status)}}class rt{url;status;constructor(t,s=302){this.url=t;this.status=s}toHonoResponse(t){return t.redirect(this.url,this.status)}}class et{path;options;constructor(t,s){this.path=t;this.options=s}async toHonoResponse(t){try{let s=typeof Bun<"u"?Bun.file(this.path):await this.readFileNode(this.path),n={"Content-Type":this.options?.contentType||this.guessContentType(this.path)};if(this.options?.download||this.options?.filename){let f=this.options?.filename||this.path.split("/").pop()||"download",r=this.options?.download?"attachment":"inline";n["Content-Disposition"]=`${r}; filename="${f}"`}if(typeof Bun<"u"&&s instanceof Blob)return t.body(s,200,n);else return t.body(s,200,n)}catch(s){return t.json({error:"File not found",message:s instanceof Error?s.message:"Unknown error"},404)}}async readFileNode(t){throw Error("File reading in Node.js requires fs module - use Bun runtime or implement adapter")}guessContentType(t){let s=t.split(".").pop()?.toLowerCase();return{html:"text/html",css:"text/css",js:"application/javascript",json:"application/json",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",svg:"image/svg+xml",pdf:"application/pdf",txt:"text/plain",xml:"application/xml"}[s||""]||"application/octet-stream"}}class ht{stream;options;constructor(t,s){this.stream=t;this.options=s}toHonoResponse(t){let s={"Content-Type":this.options?.contentType||"application/octet-stream",...this.options?.headers};return t.body(this.stream,200,s)}}class ct{static serialize(t,s){if(s===null||s===void 0)return t.body(null,204);if(s instanceof Bt)return s;if(s instanceof nt)return s.toHonoResponse(t);if(s instanceof ft)return s.toHonoResponse(t);if(s instanceof et)return s.toHonoResponse(t);if(s instanceof ht)return s.toHonoResponse(t);if(s instanceof rt)return s.toHonoResponse(t);if(s&&typeof s.toHonoResponse==="function")return s.toHonoResponse(t);return t.json(s)}}class wt{static compile(t){let s=this.compilePathRegex(t.path),i=this.resolveParameterOrder(t.parameters),n=this.resolveDependencyOrder(t.dependencies),f=this.calculateMaxArgumentIndex(t.parameters,t.dependencies),r=this.computeParameterFlags(t.parameters);return{...t,pathRegex:s,parameterOrder:i,dependencyOrder:n,maxArgumentIndex:f,...r}}static compilePathRegex(t){let s=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return s=s.replace(/\\\{([^}]+)\\\}/g,"(?<$1>[^/]+)"),s=s.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g,"(?<$1>[^/]+)"),s=`^${s}$`,new RegExp(s)}static resolveParameterOrder(t){if(!t||t.length===0)return[];return t.map((s)=>s.index).filter((s)=>s!==void 0).sort((s,i)=>s-i)}static resolveDependencyOrder(t){if(!t||t.length===0)return[];return t.map((s)=>s.index).filter((s)=>s!==void 0).sort((s,i)=>s-i)}static calculateMaxArgumentIndex(t,s){let i=-1;if(t&&t.length>0){let n=Math.max(...t.map((f)=>f.index));i=Math.max(i,n)}if(s&&s.length>0){let n=Math.max(...s.map((f)=>f.index));i=Math.max(i,n)}return i}static computeParameterFlags(t){if(!t||t.length===0)return{hasBody:!1,hasQuery:!1,hasParams:!1,hasHeaders:!1,hasCookies:!1,hasDependencies:!1};return{hasBody:t.some((s)=>s.type==="body"),hasQuery:t.some((s)=>s.type==="query"),hasParams:t.some((s)=>s.type==="param"),hasHeaders:t.some((s)=>s.type==="header"),hasCookies:t.some((s)=>s.type==="cookie"),hasDependencies:!1}}static compileAll(t){return t.map((s)=>this.compile(s))}}class ut{app;metadata;container;validator;errorHandler;compiledRoutes=new Map;constructor(t,s,i,n,f){this.app=t;this.metadata=s;this.container=i;this.validator=n;this.errorHandler=f}compile(){let t=this.metadata.getRoutes(),s=wt.compileAll(t);for(let i of s){let n=`${i.target.name}:${i.propertyKey}`;this.compiledRoutes.set(n,i);let f=this.createHandler(i),r=this.normalizePath(i.path),h=i.method.toLowerCase();if(i.middleware&&i.middleware.length>0)this.app[h](r,...i.middleware,f);else this.app[h](r,f)}}normalizePath(t){if(!t.startsWith("/"))t="/"+t;if(t=t.replace(/\{([^}]+)\}/g,":$1"),t.length>1&&t.endsWith("/"))t=t.slice(0,-1);return t}createHandler(t){return async(s)=>{try{s.set("routeMetadata",t);let i=await this.extractParameters(s,t.parameters),n=await this.resolveDependencies(s,t.dependencies),f=this.mergeArguments(i,n,t.parameters,t.maxArgumentIndex),r;if(t.handler)r=await t.handler(s,...f);else{let h=await this.container.resolve(t.target,{scope:"transient",context:s});if(typeof h[t.propertyKey]!=="function")throw Error(`Method ${t.propertyKey} not found on controller ${t.target.name}`);r=await h[t.propertyKey](...f)}return this.serializeResponse(s,r)}catch(i){return await this.handleError(s,i)}}}serializeResponse(t,s){return ct.serialize(t,s)}getRouteMetadataForContext(t){return t.get("routeMetadata")||null}isAuthRequired(t){if(t.auth?.required)return!0;return t.parameters.some((s)=>s.type==="current-user")}async handleError(t,s){return await this.errorHandler.handle(s,t)}async extractParameters(t,s){let i=[];for(let n of s){if(!n)continue;let f;switch(n.type){case"body":try{f=await t.req.json()}catch(e){f=null}break;case"query":if(n.name)f=t.req.query(n.name);else f=t.req.query();if(n.schema&&f!==void 0)try{f=n.schema.parse(f)}catch(e){throw new Gt(`Invalid query parameter: ${e}`)}break;case"param":if(n.name)f=t.req.param(n.name);else f=t.req.param();break;case"header":if(n.name)f=t.req.header(n.name);else{let e={};t.req.raw.headers.forEach((c,w)=>{e[w]=c}),f=e}break;case"cookie":if(n.name)f=Qt(t,n.name);else{let e=t.req.header("cookie");if(e)f=Object.fromEntries(e.split(";").map((c)=>{let[w,...y]=c.trim().split("=");return[w,y.join("=")]}));else f={}}break;case"request":f=t.req;break;case"response":case"context":f=t;break;case"current-user":f=t.get("auth.user")||null;let r=this.getRouteMetadataForContext(t);if(r&&this.isAuthRequired(r)){if(!f){let e=t.get("auth.error")||"Authentication required",{AuthenticationException:c}=await import("../../chunk-s5z0wb7e.js");throw new c(e)}}break;case"token":f=t.get("auth.token")||null;break;case"oauth-user":f=t.get("oauth.user")||null;break;case"oauth-token":f=t.get("oauth.token")||null;break;case"current-session":f=t.get("session")||null;break;case"session-data":let h=t.get("session");if(h&&n.metadata?.key)f=h.data[n.metadata.key];else if(h)f=h.data;else f=null;break;case"csrf-token":f=t.get("csrf.token")||null;break;case"filtered-resource":f=t.get("filtered.resource")||null;break;case"filtered-attributes":f=t.get("filtered.attributes")||[];break;default:f=void 0}if(n.schema)try{f=await this.validator.validate(f,n.schema)}catch(r){throw r}i[n.index]=f}return i}mergeArguments(t,s,i,n){let r=i.filter((w)=>w!==void 0&&w.index!==void 0).map((w)=>w.index),h=r.length>0?Math.max(...r):-1,e=n!==void 0&&n>=0?n:Math.max(h,t.length-1,s.length-1,0);if(!Number.isFinite(e)||e<0)e=0;let c=Array(e+1);for(let w=0;w<=e;w++)if(t[w]!==void 0)c[w]=t[w];else if(s[w]!==void 0)c[w]=s[w];return c}async resolveDependencies(t,s){let i=[];for(let n of s){if(!n)continue;try{let f=await this.container.resolve(n.provider,{scope:n.scope,context:t});i[n.index]=f}catch(f){throw Error(`Failed to resolve dependency at index ${n.index}: ${f instanceof Error?f.message:"Unknown error"}`)}}return i}}class gt{plugins=new Map;installed=new Set;register(t){if(this.plugins.has(t.name))throw Error(`Plugin "${t.name}" is already registered`);this.plugins.set(t.name,t)}async install(t){let s=this.resolveInstallOrder();for(let i of s)await this.plugins.get(i).install(t),this.installed.add(i)}isInstalled(t){return this.installed.has(t)}getPlugin(t){return this.plugins.get(t)}getPluginNames(){return Array.from(this.plugins.keys())}resolveInstallOrder(){let t=new Set,s=new Set,i=[],n=(f,r=[])=>{if(s.has(f)){let e=[...r,f].join(" -> ");throw Error(`Circular dependency detected in plugins: ${e}`)}if(t.has(f))return;s.add(f);let h=this.plugins.get(f);if(!h)throw Error(`Plugin "${f}" is not registered`);if(h.dependencies)for(let e of h.dependencies){if(!this.plugins.has(e))throw Error(`Plugin "${f}" depends on "${e}" which is not registered`);n(e,[...r,f])}s.delete(f),t.add(f),i.push(f)};for(let f of this.plugins.keys())n(f);return i}}class St{hono;metadata;container;validator;errorHandler;compiler;pluginManager;config;compiled=!1;globalMiddleware=[];groupPrefix="";constructor(t){if(this.config={adapter:"hono",title:"Veloce-TS API",version:"1.0.0",docs:!0,...t},this.hono=new tt,this.metadata=new H,this.container=new st,this.validator=new Yt,this.errorHandler=new Jt,this.pluginManager=new gt,this.compiler=new ut(this.hono,this.metadata,this.container,this.validator,this.errorHandler),this.config.cors)if(this.config.cors===!0)this.useCors();else this.useCors(this.config.cors)}include(t){let s=H.getControllerMetadata(t);if(s)this.metadata.registerController(t,s);let i=H.getRouteMethods(t);for(let n of i){let f=H.getRouteMetadata(t.prototype,n),r=H.getParameterMetadata(t.prototype,n),h=H.getDependencyMetadata(t.prototype,n);if(f&&f.method&&f.path!==void 0){let e=s?.prefix||"",c=this.normalizePath(e,f.path);this.metadata.registerRoute({target:t,propertyKey:n,method:f.method,path:c,middleware:[...s?.middleware||[],...f.middleware||[]],parameters:r||f.parameters||[],dependencies:h||f.dependencies||[],responses:f.responses||[],docs:f.docs})}}}get(t,s){this.registerFunctionalRoute("GET",t,s)}post(t,s){this.registerFunctionalRoute("POST",t,s)}put(t,s){this.registerFunctionalRoute("PUT",t,s)}delete(t,s){this.registerFunctionalRoute("DELETE",t,s)}patch(t,s){this.registerFunctionalRoute("PATCH",t,s)}route(t){return new dt(this,t)}group(t,s){let i=this.groupPrefix;this.groupPrefix=this.normalizePath(this.groupPrefix,t),s(),this.groupPrefix=i}registerFunctionalRoute(t,s,i){let n=this.normalizePath(this.groupPrefix,s),f={target:Mt,propertyKey:`${t.toLowerCase()}_${n}`,method:t,path:n,middleware:i.middleware||[],parameters:this.extractParametersFromSchema(i.schema),dependencies:[],responses:i.responses||[],docs:i.docs,handler:i.handler};this.metadata.registerRoute(f)}extractParametersFromSchema(t){let s=[],i=0;if(t?.body)s.push({index:i++,type:"body",schema:t.body,required:!0});if(t?.query)s.push({index:i++,type:"query",schema:t.query,required:!1});if(t?.params)s.push({index:i++,type:"param",schema:t.params,required:!0});if(t?.headers)s.push({index:i++,type:"header",schema:t.headers,required:!1});return s}use(t){this.globalMiddleware.push(t),this.hono.use("*",t)}useCors(t){let s=kt(t);this.use(s)}useRateLimit(t){let s=qt(t);this.use(s)}useCompression(t){let s=vt(t);this.use(s)}usePlugin(t){this.pluginManager.register(t)}getPluginManager(){return this.pluginManager}onError(t){this.errorHandler.setCustomHandler(t)}getErrorHandler(){return this.errorHandler}normalizePath(...t){let s=t.filter((i)=>i!=="").join("/").replace(/\/+/g,"/").replace(/\/$/,"");return s.startsWith("/")?s:`/${s}`}getHono(){return this.hono}getMetadata(){return this.metadata}getContainer(){return this.container}getCompiler(){return this.compiler}getConfig(){return this.config}isCompiled(){return this.compiled}markCompiled(){this.compiled=!0}async compile(){if(this.compiled){console.warn("Routes have already been compiled. Skipping compilation.");return}await this.pluginManager.install(this),this.compiler.compile(),this.compiled=!0}async listen(t,s){if(!this.compiled)await this.compile();return this.createAdapter().listen(t,s)}createAdapter(){let t=this.config.adapter||"hono";switch(t){case"hono":{let{HonoAdapter:s}=bt(ot);return new s(this.hono)}case"express":{let{ExpressAdapter:s}=bt(Zt);return new s(this)}case"native":{let{HonoAdapter:s}=bt(ot);return new s(this.hono)}default:throw Error(`Unknown adapter type: ${t}. Supported adapters: 'hono', 'express', 'native'`)}}}class Mt{}class dt{app;path;constructor(t,s){this.app=t;this.path=s}get(t){return this.app.get(this.path,t),this}post(t){return this.app.post(this.path,t),this}put(t){return this.app.put(this.path,t),this}delete(t){return this.app.delete(this.path,t),this}patch(t){return this.app.patch(this.path,t),this}}function mt(t){let s={docs:!1,cors:!1,...t};return new St(s)}function xs(t,s,i,n){let f=t.getContainer(),r=typeof i==="function"?i:()=>i;f.register(s,{scope:n?.scope||"singleton",factory:r})}function at(t){return new T(t)}async function Hs(t,s){let i=mt(s);await t(i),await i.compile();let n=at(i);return{app:i,client:n}}function js(t){t.getContainer().clear()}export{Hs as setupTestApp,xs as mockDependency,at as createTestClient,mt as createTestApp,js as clearMocks,T as TestClient};export{st as n,Qt as o,Xi as p,Bt as q,nt as r,ft as s,rt as t,et as u,ht as v,ct as w,wt as x,ut as y,gt as z,Vt as A,It as B,St as C,T as D,mt as E,xs as F,at as G,Hs as H,js as I};
3
3
 
4
- //# debugId=B1D8D8574E5BCA1664756E2164756E21
4
+ //# debugId=941DAE281363925164756E2164756E21