blaizejs 0.7.0 → 0.8.0

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 (25) hide show
  1. package/dist/{chunk-MZG6O7BX.js → chunk-CU6DW3O3.js} +2 -2
  2. package/dist/{chunk-CM6LIHRF.js → chunk-MITKFOF6.js} +3 -3
  3. package/dist/{chunk-HQRQVJL6.js → chunk-MTQFFU7R.js} +3 -3
  4. package/dist/{chunk-J5FJFX2G.js → chunk-QI76VJZJ.js} +3 -3
  5. package/dist/{chunk-FLI2OVQ5.js → chunk-XSO4EY47.js} +3 -3
  6. package/dist/index.cjs +17 -16
  7. package/dist/index.cjs.map +1 -1
  8. package/dist/index.d.cts +45 -11
  9. package/dist/index.d.ts +45 -11
  10. package/dist/index.js +17 -16
  11. package/dist/index.js.map +1 -1
  12. package/dist/{internal-server-error-RRNSAEYK.js → internal-server-error-HHP6KU77.js} +3 -3
  13. package/dist/{payload-too-large-error-SQMCGPZ7.js → payload-too-large-error-PYFKUBOM.js} +3 -3
  14. package/dist/{unsupported-media-type-error-6T47SVVY.js → unsupported-media-type-error-5B5SHATA.js} +3 -3
  15. package/dist/{validation-error-DRCBJ7IF.js → validation-error-RO5FS3GN.js} +3 -3
  16. package/package.json +1 -1
  17. /package/dist/{chunk-MZG6O7BX.js.map → chunk-CU6DW3O3.js.map} +0 -0
  18. /package/dist/{chunk-CM6LIHRF.js.map → chunk-MITKFOF6.js.map} +0 -0
  19. /package/dist/{chunk-HQRQVJL6.js.map → chunk-MTQFFU7R.js.map} +0 -0
  20. /package/dist/{chunk-J5FJFX2G.js.map → chunk-QI76VJZJ.js.map} +0 -0
  21. /package/dist/{chunk-FLI2OVQ5.js.map → chunk-XSO4EY47.js.map} +0 -0
  22. /package/dist/{internal-server-error-RRNSAEYK.js.map → internal-server-error-HHP6KU77.js.map} +0 -0
  23. /package/dist/{payload-too-large-error-SQMCGPZ7.js.map → payload-too-large-error-PYFKUBOM.js.map} +0 -0
  24. /package/dist/{unsupported-media-type-error-6T47SVVY.js.map → unsupported-media-type-error-5B5SHATA.js.map} +0 -0
  25. /package/dist/{validation-error-DRCBJ7IF.js.map → validation-error-RO5FS3GN.js.map} +0 -0
package/dist/index.js CHANGED
@@ -1,33 +1,34 @@
1
1
 
2
2
  /**
3
- * blaizejs v0.7.0
3
+ * blaizejs v0.8.0
4
4
  * A blazing-fast, TypeScript-first Node.js framework with HTTP/2 support, file-based routing, powerful middleware system, and end-to-end type safety for building modern APIs.
5
5
  *
6
6
  * Copyright (c) 2025 BlaizeJS Contributors
7
7
  * @license MIT
8
8
  */
9
9
 
10
- import{a as M}from"./chunk-CM6LIHRF.js";import{a as I}from"./chunk-FLI2OVQ5.js";import{a as le}from"./chunk-HQRQVJL6.js";import{a as G}from"./chunk-J5FJFX2G.js";import{a as O,b as ti,c as T,d as pt,e as H,f as S,g as ft,h as ce}from"./chunk-MZG6O7BX.js";import{inspect as Er}from"node:util";function Ce(e){return e instanceof Error}function Pe(e){return{message:e.message,name:e.name,stack:e.stack}}function ue(e){let t={};for(let[r,o]of Object.entries(e))if(Ce(o))t[r]=Pe(o);else if(Array.isArray(o))t[r]=o.map(n=>Ce(n)?Pe(n):n);else if(o instanceof Date)t[r]=o;else if(o&&typeof o=="object"){let n={};for(let[i,s]of Object.entries(o))Ce(s)?n[i]=Pe(s):n[i]=s;t[r]=n}else t[r]=o;return t}function mt(){let e=new WeakSet;return(t,r)=>{if(typeof r=="object"&&r!==null){if(e.has(r))return"[Circular]";e.add(r)}return r}}var Rr={debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m"},Cr="\x1B[0m",Pr="\x1B[1m",D=class{write(t,r,o){let n=ue(o),a=`${`${Rr[t]}${Pr}[${t.toUpperCase()}]${Cr}`} ${r}`,l=Object.keys(n).length>0?`
10
+ import{a as M}from"./chunk-MITKFOF6.js";import{a as H}from"./chunk-XSO4EY47.js";import{a as le}from"./chunk-MTQFFU7R.js";import{a as G}from"./chunk-QI76VJZJ.js";import{a as k,b as oi,c as b,d as pt,e as I,f as S,g as ft,h as ce}from"./chunk-CU6DW3O3.js";var mt={name:"blaizejs",version:"0.8.0",description:"A blazing-fast, TypeScript-first Node.js framework with HTTP/2 support, file-based routing, powerful middleware system, and end-to-end type safety for building modern APIs.",author:"J.Lea-Jones <jason@careymarcel.com>",repository:{type:"git",url:"https://github.com/jleajones/blaize.git"},homepage:"https://github.com/jleajones/blaize/tree/main/packages/blaize-core#readme",bugs:{url:"https://github.com/jleajones/blaize/issues"},publishConfig:{access:"public"},type:"module",main:"./dist/index.js",types:"./dist/index.d.ts",exports:{".":{types:"./dist/index.d.ts",import:"./dist/index.js",require:"./dist/index.cjs"}},files:["dist"],scripts:{dev:"NODE_ENV=development tsx --watch src/examples/basic.ts",build:"NODE_ENV=production tsup --minify","build:watch":"NODE_ENV=production tsup --watch","type-check":"tsc --noEmit",test:"vitest run --typecheck","test:watch":"vitest","test:coverage":"vitest run --coverage",lint:"eslint .",clean:"rimraf dist"},dependencies:{zod:"^3.24.4"},devDependencies:{"@blaizejs/eslint-config":"workspace:*","@blaizejs/testing-utils":"workspace:*","@blaizejs/tsconfig":"workspace:*","@blaizejs/tsup-config":"workspace:*","@blaizejs/vitest-config":"workspace:*","@types/node":"^22.15.17","@types/selfsigned":"^2.1.0","@vitest/coverage-v8":"^3.1.3",chokidar:"^4.0.3",selfsigned:"^2.4.1",tsx:"^4.19.4",typescript:"^5.8.3","vite-tsconfig-paths":"^5.1.4",vitest:"^3.1.3"},keywords:["nodejs","framework","typescript","http","http2","server","file-based-routing","middleware","plugins","type-safe"],license:"MIT"};import{inspect as Rr}from"node:util";function Re(e){return e instanceof Error}function Pe(e){return{message:e.message,name:e.name,stack:e.stack}}function ue(e){let t={};for(let[r,o]of Object.entries(e))if(Re(o))t[r]=Pe(o);else if(Array.isArray(o))t[r]=o.map(n=>Re(n)?Pe(n):n);else if(o instanceof Date)t[r]=o;else if(o&&typeof o=="object"){let n={};for(let[i,s]of Object.entries(o))Re(s)?n[i]=Pe(s):n[i]=s;t[r]=n}else t[r]=o;return t}function gt(){let e=new WeakSet;return(t,r)=>{if(typeof r=="object"&&r!==null){if(e.has(r))return"[Circular]";e.add(r)}return r}}var Pr={debug:"\x1B[36m",info:"\x1B[32m",warn:"\x1B[33m",error:"\x1B[31m"},Mr="\x1B[0m",zr="\x1B[1m",D=class{write(t,r,o){let n=ue(o),a=`${`${Pr[t]}${zr}[${t.toUpperCase()}]${Mr}`} ${r}`,l=Object.keys(n).length>0?`
11
11
 
12
- ${Er(n,{colors:!0,depth:3,compact:!1,breakLength:80})}`:"";switch(t){case"error":console.error(a+l);break;case"warn":console.warn(a+l);break;case"debug":case"info":default:console.log(a+l);break}}};var j=class{write(t,r,o){let n=ue(o),i={level:t,message:r,...n},s=JSON.stringify(i,mt());console.log(s)}async flush(){return Promise.resolve()}};var gt={debug:0,info:1,warn:2,error:3},Z=class e{config;inheritedMeta;minLevelPriority;constructor(t,r){this.config=t,this.inheritedMeta=Object.freeze(r?{...r}:{}),this.minLevelPriority=gt[t.level]}debug(t,r){this.log("debug",t,r)}info(t,r){this.log("info",t,r)}warn(t,r){this.log("warn",t,r)}error(t,r){this.log("error",t,r)}child(t){let r={...this.inheritedMeta,...t};return new e(this.config,r)}async flush(){await this.config.transport.flush?.()}log(t,r,o){if(!this.shouldLog(t))return;let n={...this.inheritedMeta,...o||{}},i=n;this.config.includeTimestamp&&(i={timestamp:new Date().toISOString(),...n});let s=this.redact(i);this.config.transport.write(t,r,s)}shouldLog(t){return gt[t]>=this.minLevelPriority}redact(t){if(this.config.redactKeys.length===0)return t;let r=new Set(this.config.redactKeys.map(n=>n.toLowerCase())),o={};for(let[n,i]of Object.entries(t))r.has(n.toLowerCase())?o[n]="[REDACTED]":o[n]=i;return o}};function Mr(){return process.env.NODE_ENV!=="production"?new D:new j}function _(e){let t=process.env.NODE_ENV!=="production",r={level:e?.level??(t?"debug":"info"),transport:e?.transport??Mr(),redactKeys:e?.redactKeys??[],includeTimestamp:e?.includeTimestamp??!0};return new Z(r)}var de=class{write(t,r,o){}async flush(){return Promise.resolve()}};var E=_({level:process.env.NODE_ENV==="development"?"debug":"info",transport:new D,includeTimestamp:!0,redactKeys:[]}),zr=E;function pe(e){let t=_(e);zr=t,Object.assign(E,t)}function ht(e,t,r,o){if(!e||e.skip&&e.skip(t))return Promise.resolve(r());try{let n=e.execute(t,r,o);return n instanceof Promise?n:Promise.resolve(n)}catch(n){return Promise.reject(n)}}function W(e){return e.length===0?async(t,r,o)=>{await Promise.resolve(r())}:async function(t,r,o){let n=new Set,i=async s=>{if(s>=e.length)return Promise.resolve(r());let a=e[s],c=()=>{if(n.has(s))throw new Error("next() called multiple times");return n.add(s),i(s+1)},l=o.child({middleware:a?.name||"anonymous"});return ht(a,t,c,l)};return i(0)}}var J=class extends T{constructor(t,r=void 0,o=void 0){super("FORBIDDEN",t,403,o??S(),r)}};function P(e){if(typeof e=="function")return{name:"anonymous",execute:e,debug:!1};let{name:t="anonymous",handler:r,skip:o,debug:n=!1}=e;return{name:t,execute:r,debug:n,...o!==void 0&&{skip:o}}}function Me(e){return P({name:"state-middleware",handler:e})}function ze(e){return P({name:"service-middleware",handler:e})}var Lr={origin:!0,methods:["GET","HEAD","PUT","PATCH","POST","DELETE"],credentials:!1,optionsSuccessStatus:204},Or={origin:!1,methods:["GET","HEAD"],credentials:!1,optionsSuccessStatus:204};function yt(e){return e===void 0&&(e=process.env.NODE_ENV!=="production"),e?{...Lr}:{...Or}}function Fr(e=6e4,t=1e3){let r=new Map,o={ttl:e,maxSize:t},n=(h,w,x)=>`${h}:${w}:${x||"anonymous"}`,i=()=>{if(r.size===0)return;let h=null,w=1/0;for(let[x,u]of r.entries())u.lastAccessed<w&&(w=u.lastAccessed,h=x);h&&r.delete(h)};return{get:(h,w,x)=>{let u=n(h,w,x),d=r.get(u);if(!d)return null;let g=Date.now();return g>d.expiresAt?(r.delete(u),null):(d.lastAccessed=g,d.allowed)},set:(h,w,x,u)=>{let d=n(h,x,u),g=Date.now();if(r.has(d)){r.set(d,{allowed:w,expiresAt:g+o.ttl,lastAccessed:g});return}r.size>=o.maxSize&&i(),r.set(d,{allowed:w,expiresAt:g+o.ttl,lastAccessed:g})},clear:()=>{r.clear()},cleanExpired:()=>{let h=Date.now(),w=0;for(let[x,u]of r.entries())h>u.expiresAt&&(r.delete(x),w++);return w},getStats:()=>({size:r.size,maxSize:o.maxSize,ttl:o.ttl})}}var St=Fr();function kr(e){return typeof e=="boolean"||typeof e=="function"?!1:Array.isArray(e)?e.every(t=>typeof t=="string"||t instanceof RegExp):typeof e=="string"||e instanceof RegExp}function _r(e){return typeof e=="string"?`str:${e}`:e instanceof RegExp?`regex:${e.source}:${e.flags}`:Array.isArray(e)?`array:[${e.map(t=>typeof t=="string"?`str:${t}`:t instanceof RegExp?`regex:${t.source}:${t.flags}`:"unknown").join(",")}]`:"unknown"}async function Ar(e,t){return t==="*"?!0:e===t}async function Br(e,t){return t.test(e)}async function Dr(e,t,r,o=100){let n;try{let i=new Promise(a=>{n=setTimeout(()=>{a({timedOut:!0})},o)}),s=await Promise.race([Promise.resolve(t(e,r)).then(a=>({result:a})),i]);return n&&clearTimeout(n),"timedOut"in s?(console.warn(`CORS origin validation function timed out after ${o}ms for origin: ${e}`),!1):s.result}catch(i){return n&&clearTimeout(n),console.error("CORS origin validation function error:",i),!1}}async function wt(e,t,r){let o=t.map(i=>Le(e,i,r));return(await Promise.all(o)).some(i=>i===!0)}async function Le(e,t,r){return typeof t=="string"?Ar(e,t):t instanceof RegExp?Br(e,t):typeof t=="function"?Dr(e,t,r):(console.warn("Unknown CORS origin type:",typeof t),!1)}async function K(e,t,r){if(t===!0)return!0;if(t===!1)return!1;if(kr(t)){let n=r?.state?.user?.id||r?.state?.userId,i=_r(t),s=St.get(e,i,n);if(s!==null)return s;let a;return Array.isArray(t)?a=await wt(e,t,r):a=await Le(e,t,r),St.set(e,a,i,n),a}else return Array.isArray(t)?wt(e,t,r):Le(e,t,r)}function Nr(e){let t=e.request.header("origin")||e.request.header("Origin"),r=e.request.header("access-control-request-method")||e.request.header("Access-Control-Request-Method"),o=e.request.header("access-control-request-headers")||e.request.header("Access-Control-Request-Headers"),n=o?o.split(",").map(i=>i.trim().toLowerCase()):void 0;return{origin:t,requestedMethod:r,requestedHeaders:n}}function Oe(e){return e.toUpperCase()}function $r(e,t){return t?(typeof t=="string"?t.split(",").map(o=>o.trim()):t).map(o=>Oe(o)).includes(Oe(e)):["GET","HEAD","PUT","PATCH","POST","DELETE"].includes(Oe(e))}function Hr(e,t){if(!e||e.length===0||t===void 0)return!0;let r=typeof t=="string"?t.split(",").map(o=>o.trim().toLowerCase()):t.map(o=>o.toLowerCase());return e.every(o=>r.includes(o.toLowerCase()))}function Ir(e,t,r,o){o&&(t.origin===!0&&!t.credentials?e.response.header("Access-Control-Allow-Origin","*"):(e.response.header("Access-Control-Allow-Origin",r),e.response.header("Vary","Origin"))),t.credentials&&o&&e.response.header("Access-Control-Allow-Credentials","true");let n=t.methods||["GET","HEAD","PUT","PATCH","POST","DELETE"],i=typeof n=="string"?n:n.join(", ");if(e.response.header("Access-Control-Allow-Methods",i),t.allowedHeaders){let s=typeof t.allowedHeaders=="string"?t.allowedHeaders:t.allowedHeaders.join(", ");e.response.header("Access-Control-Allow-Headers",s)}else{let s=e.request.header("access-control-request-headers")||e.request.header("Access-Control-Request-Headers");s&&e.response.header("Access-Control-Allow-Headers",s)}t.maxAge!==void 0&&t.maxAge>=0&&e.response.header("Access-Control-Max-Age",String(t.maxAge))}async function vt(e,t){let r=Nr(e);if(!r.origin||!r.requestedMethod)throw e.response.status(403),new M("Invalid preflight request: missing required headers",{fields:[{field:r.origin?"Access-Control-Request-Method":"Origin",messages:["Required header is missing"]}],errorCount:1,section:"body"});let o=await K(r.origin,t.origin||!1,e);if(!o)throw e.response.status(403),new M("CORS origin not allowed",{fields:[{field:"Origin",messages:[`Origin '${r.origin}' is not allowed`],rejectedValue:r.origin}],errorCount:1,section:"body"});if(!$r(r.requestedMethod,t.methods))throw e.response.status(403),new M("CORS method not allowed",{fields:[{field:"Access-Control-Request-Method",messages:[`Method '${r.requestedMethod}' is not allowed`],rejectedValue:r.requestedMethod,expectedType:typeof t.methods=="string"?t.methods:t.methods?.join(", ")}],errorCount:1,section:"body"});if(!Hr(r.requestedHeaders,t.allowedHeaders)){let i=r.requestedHeaders?.filter(s=>{let a=t.allowedHeaders;return a?!(typeof a=="string"?a.split(",").map(l=>l.trim().toLowerCase()):a.map(l=>l.toLowerCase())).includes(s.toLowerCase()):!1});throw e.response.status(403),new M("CORS headers not allowed",{fields:[{field:"Access-Control-Request-Headers",messages:[`Headers not allowed: ${i?.join(", ")}`],rejectedValue:i}],errorCount:1,section:"body"})}Ir(e,t,r.origin,o);let n=t.optionsSuccessStatus||204;e.response.status(n),t.preflightContinue||e.response.text("")}function Fe(e){return e.request.method==="OPTIONS"&&!!(e.request.header("access-control-request-method")||e.request.header("Access-Control-Request-Method"))}import{z as b}from"zod";var qr=b.enum(["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS","CONNECT","TRACE"]),Ur=b.union([b.array(qr),b.string().transform(e=>e.split(",").map(t=>t.trim()))]).optional(),xt=b.union([b.array(b.string()),b.string().transform(e=>e.split(",").map(t=>t.trim()))]).optional(),jr=b.custom(e=>typeof e=="function"&&e.length<=2,{message:"Origin validator must be a function accepting (origin, ctx?) parameters"}),Tt=b.union([b.string(),b.instanceof(RegExp),jr]),Wr=b.union([b.boolean(),Tt,b.array(Tt)]),bt=b.object({origin:Wr.optional(),methods:Ur,allowedHeaders:xt,exposedHeaders:xt,credentials:b.boolean().optional(),maxAge:b.number().int().optional(),preflightContinue:b.boolean().optional(),optionsSuccessStatus:b.number().int().min(200).max(299).optional()}).strict(),Et=b.union([b.boolean(),bt]).optional();function Rt(e){try{return typeof e=="boolean"?e===!1?{origin:!1}:{origin:!0}:bt.parse(e)}catch(t){if(t instanceof b.ZodError){let r=Vr(t);throw new Error(`Invalid CORS options:
13
- ${r}`)}throw new Error(`Invalid CORS options: ${String(t)}`)}}function Vr(e){return e.errors.map(r=>` - ${r.path.join(".")||"root"}: ${r.message}`).join(`
14
- `)}function Qr(e){return Array.isArray(e)}function Ct(e){if(e.credentials===!0&&e.origin!==void 0){if(e.origin===!0||e.origin==="*")throw new Error("CORS security violation: Cannot use wildcard origin (*) with credentials. When credentials are enabled, you must specify explicit origins.");if(Qr(e.origin)&&e.origin.some(r=>r==="*"))throw new Error("CORS security violation: Cannot include wildcard origin (*) in array when credentials are enabled.")}}function Pt(e,t){return e===!0?{...t,origin:!0}:e===!1?{origin:!1}:e?{...t,...e,methods:e.methods??t.methods,allowedHeaders:e.allowedHeaders??t.allowedHeaders,exposedHeaders:e.exposedHeaders??t.exposedHeaders}:t}function Gr(e,t,r,o){if(!(!o||!r)&&(t.origin===!0&&!t.credentials?e.response.header("Access-Control-Allow-Origin","*"):(e.response.header("Access-Control-Allow-Origin",r),e.response.header("Vary","Origin")),t.credentials&&e.response.header("Access-Control-Allow-Credentials","true"),t.exposedHeaders)){let n=typeof t.exposedHeaders=="string"?t.exposedHeaders:t.exposedHeaders.join(", ");e.response.header("Access-Control-Expose-Headers",n)}}function fe(e){let t=process.env.NODE_ENV==="development",r=yt(t),o=Pt(e,r),n=Rt(o);return Ct(n),P({name:"cors",handler:async(i,s)=>{let a=i.request.header("origin")||i.request.header("Origin");if(Fe(i)){if(await vt(i,n),!n.preflightContinue)return}else{if(!a){await s();return}let c=await K(a,n.origin||!1,i);if(!c)throw i.response.status(403),new J("CORS validation failed",{reason:"origin_not_allowed",origin:a,allowedOrigins:n.origin});Gr(i,n,a,c)}await s()},debug:process.env.DEBUG?.includes("cors")})}var Zr=["accept","content-type","user-agent","x-correlation-id"],Jr=["authorization","cookie","x-api-key","proxy-authorization"];function Kr(e,t){let r={},o=new Set(t.map(i=>i.toLowerCase())),n=new Set(Jr.map(i=>i.toLowerCase()));for(let[i,s]of Object.entries(e)){let a=i.toLowerCase();o.has(a)&&(n.has(a)?r[i]="[REDACTED]":r[i]=s)}return r}function Mt(e){return P({name:"requestLogger",handler:async(t,r,o)=>{let n=Date.now(),i;"socket"in t.request.raw&&(i=t.request.raw.socket?.remoteAddress);let s={timestamp:new Date().toISOString()};if(i&&(s.ip=i),e?.includeHeaders){let c=e.headerWhitelist||Zr,l=t.request.headers(),p=Kr(l,c);Object.keys(p).length>0&&(s.headers=p)}if(e?.includeQuery){let c=t.request.query;c&&Object.keys(c).length>0&&(s.query=c)}o.info("Request started",s);let a;try{await r()}catch(c){a=c}finally{let c=Date.now()-n;if(a){let l={duration:c,timestamp:new Date().toISOString()};a instanceof T?l.error={type:a.type,title:a.title,status:a.status,message:a.message,details:a.details,...a.status>=500&&a.stack?{stack:a.stack}:{}}:a instanceof Error?l.error={message:a.message,name:a.name,stack:a.stack}:l.error=String(a),o.error("Request failed",l)}else{let l=t.response.statusCode||200;o.info("Request completed",{statusCode:l,duration:c,timestamp:new Date().toISOString()})}if(a)throw a}}})}function ke(e){if(!e.name||typeof e.name!="string")throw new Error("Plugin name must be a non-empty string");if(!e.version||typeof e.version!="string")throw new Error("Plugin version must be a non-empty string");if(typeof e.setup!="function")throw new Error("Plugin setup must be a function");return function(r){let o={...e.defaultConfig||{},...r||{}},n=_().child({plugin:e.name,version:e.version}),i=e.setup(o,n);if(i===null||typeof i!="object")throw new Error(`Plugin "${e.name}" setup() must return an object with lifecycle hooks`);return{name:e.name,version:e.version,register:i.register||(async()=>{n.debug("Plugin registered (no-op)")}),initialize:i.initialize,onServerStart:i.onServerStart,onServerStop:i.onServerStop,terminate:i.terminate}}}import{fileURLToPath as uo}from"node:url";var me={};function zt(e){me={...me,...e}}function Lt(){if(!me.routesDir)throw new Error("Routes directory not configured. Make sure server is properly initialized.");return me.routesDir}import*as Ot from"node:path";function ge(e,t){e.startsWith("file://")&&(e=e.replace("file://","")),t.startsWith("file://")&&(t=t.replace("file://",""));let r=e.replace(/\\/g,"/"),o=t.replace(/\\/g,"/"),n=o.endsWith("/")?o:`${o}/`,i=r;r.startsWith(n)?i=r.substring(n.length):r.startsWith(o)?(i=r.substring(o.length),i.startsWith("/")&&(i=i.substring(1))):i=Ot.relative(o,r).replace(/\\/g,"/"),i=i.replace(/\.[^.]+$/,"");let s=i.split("/").filter(Boolean),a=[],c=s.map(p=>{if(p.startsWith("[")&&p.endsWith("]")){let h=p.slice(1,-1);return a.push(h),`:${h}`}return p}),l=c.length>0?`/${c.join("/")}`:"/";return l.endsWith("/index")&&(l=l.slice(0,-6)||"/"),{filePath:e,routePath:l,params:a}}import{EventEmitter as oo}from"node:events";import{z}from"zod";var Yr=z.enum(["drop-oldest","drop-newest","close"]),Xr=z.object({low:z.number().int().positive().describe("Resume threshold in messages"),high:z.number().int().positive().describe("Trigger threshold in messages")}).refine(e=>e.low<e.high,{message:"Low watermark must be less than high watermark",path:["low"]}),eo=z.object({maxMessages:z.number().int().positive().max(1e5).describe("Maximum number of messages in buffer"),maxBytes:z.number().int().positive().max(100*1024*1024).optional().describe("Maximum buffer size in bytes"),messageTimeout:z.number().int().nonnegative().max(3e5).optional().describe("Message TTL in milliseconds")}),Ft=z.object({enabled:z.boolean().default(!0).describe("Enable backpressure management"),strategy:Yr.default("drop-oldest").describe("Strategy when buffer reaches high watermark"),watermarks:Xr.default({low:100,high:1e3}).describe("Buffer watermark thresholds"),limits:eo.default({maxMessages:1e4}).describe("Buffer size constraints"),metrics:z.object({enabled:z.boolean().default(!1),interval:z.number().int().positive().default(5e3)}).optional().describe("Metrics collection configuration")}).refine(e=>e.watermarks.high<=e.limits.maxMessages,{message:"High watermark cannot exceed maxMessages limit",path:["watermarks","high"]});var to={maxConnections:1e4,maxConnectionsPerClient:100,inactiveTimeout:18e5,cleanupInterval:6e4};function ro(e){let t={...to,...e},r=new Map,o=new Map,n=null,i={},s=f=>{!n&&t.cleanupInterval>0&&(n=setInterval(()=>{f()},t.cleanupInterval),n.unref&&n.unref())},a=()=>{n&&(clearInterval(n),n=null)},c=(f,m)=>{if(!f)return;let R=(o.get(f)||0)+m;R<=0?o.delete(f):o.set(f,R)},l=(f,m,v)=>{if(r.has(f))throw new Error(`Connection with ID ${f} already exists`);if(r.size>=t.maxConnections)throw new Error(`Maximum connection limit reached (${t.maxConnections})`);if(v?.clientIp&&(o.get(v.clientIp)||0)>=t.maxConnectionsPerClient)throw new Error(`Maximum connections per client reached (${t.maxConnectionsPerClient})`);let R=Date.now();r.set(f,{stream:m,connectedAt:R,lastActivity:R,clientIp:v?.clientIp,userAgent:v?.userAgent}),c(v?.clientIp,1),r.size===1&&s(i.cleanup),m.onClose(()=>{p(f)})},p=f=>{let m=r.get(f);m&&(r.delete(f),c(m.clientIp,-1),r.size===0&&a())},h=()=>r.size,w=()=>{let f=Date.now(),m=[];r.forEach((v,R)=>{let k=f-v.lastActivity>t.inactiveTimeout,br=!v.stream||v.stream.state==="closed"||!v.stream.isWritable;if((k||br)&&(m.push(R),v.stream&&typeof v.stream.close=="function"))try{v.stream.close()}catch{}}),m.forEach(v=>p(v))},x=f=>r.get(f)?.stream,u=f=>r.has(f),d=()=>Array.from(r.keys()),g=()=>{a(),r.forEach(f=>{if(f.stream&&typeof f.stream.close=="function")try{f.stream.close()}catch{}}),r.clear(),o.clear()};return i.add=l,i.remove=p,i.count=h,i.cleanup=w,i.get=x,i.has=u,i.getIds=d,i.shutdown=g,i}var _e=null;function he(e){return _e||(_e=ro(e)),_e}var Y=class extends T{constructor(t,r,o=void 0){super("SSE_BUFFER_OVERFLOW",t,503,o??S(),r)}};var ye=class extends T{constructor(t,r=void 0,o=void 0){super("SSE_STREAM_CLOSED",t,410,o??S(),r)}};var no={heartbeatInterval:3e4,maxEventSize:1024*1024,autoClose:!0,maxBufferSize:1e3,bufferStrategy:"drop-oldest"};function kt(e,t,r,o){let n=[];r&&n.push(`id: ${r}`),o!==void 0&&n.push(`retry: ${o}`),n.push(`event: ${e}`);let s=(t===null?"null":t===void 0?"undefined":typeof t=="string"?t:JSON.stringify(t)).split(`
15
- `);for(let a of s)n.push(`data: ${a}`);return n.push(""),n.join(`
12
+ ${Rr(n,{colors:!0,depth:3,compact:!1,breakLength:80})}`:"";switch(t){case"error":console.error(a+l);break;case"warn":console.warn(a+l);break;case"debug":case"info":default:console.log(a+l);break}}};var U=class{write(t,r,o){let n=ue(o),i={level:t,message:r,...n},s=JSON.stringify(i,gt());console.log(s)}async flush(){return Promise.resolve()}};var ht={debug:0,info:1,warn:2,error:3},Z=class e{config;inheritedMeta;minLevelPriority;constructor(t,r){this.config=t,this.inheritedMeta=Object.freeze(r?{...r}:{}),this.minLevelPriority=ht[t.level]}debug(t,r){this.log("debug",t,r)}info(t,r){this.log("info",t,r)}warn(t,r){this.log("warn",t,r)}error(t,r){this.log("error",t,r)}child(t){let r={...this.inheritedMeta,...t};return new e(this.config,r)}async flush(){await this.config.transport.flush?.()}log(t,r,o){if(!this.shouldLog(t))return;let n={...this.inheritedMeta,...o||{}},i=n;this.config.includeTimestamp&&(i={timestamp:new Date().toISOString(),...n});let s=this.redact(i);this.config.transport.write(t,r,s)}shouldLog(t){return ht[t]>=this.minLevelPriority}redact(t){if(this.config.redactKeys.length===0)return t;let r=new Set(this.config.redactKeys.map(n=>n.toLowerCase())),o={};for(let[n,i]of Object.entries(t))r.has(n.toLowerCase())?o[n]="[REDACTED]":o[n]=i;return o}};function Lr(){return process.env.NODE_ENV!=="production"?new D:new U}function F(e){let t=process.env.NODE_ENV!=="production",r={level:e?.level??(t?"debug":"info"),transport:e?.transport??Lr(),redactKeys:e?.redactKeys??[],includeTimestamp:e?.includeTimestamp??!0};return new Z(r)}var de=class{write(t,r,o){}async flush(){return Promise.resolve()}};var E=F({level:process.env.NODE_ENV==="development"?"debug":"info",transport:new D,includeTimestamp:!0,redactKeys:[]}),kr=E;function pe(e){let t=F(e);kr=t,Object.assign(E,t)}function yt(e,t,r,o){if(!e||e.skip&&e.skip(t))return Promise.resolve(r());try{let n=e.execute(t,r,o);return n instanceof Promise?n:Promise.resolve(n)}catch(n){return Promise.reject(n)}}function V(e){return e.length===0?async(t,r,o)=>{await Promise.resolve(r())}:async function(t,r,o){let n=new Set,i=async s=>{if(s>=e.length)return Promise.resolve(r());let a=e[s],c=()=>{if(n.has(s))throw new Error("next() called multiple times");return n.add(s),i(s+1)},l=o.child({middleware:a?.name||"anonymous"});return yt(a,t,c,l)};return i(0)}}var J=class extends b{constructor(t,r=void 0,o=void 0){super("FORBIDDEN",t,403,o??S(),r)}};function P(e){if(typeof e=="function")return{name:"anonymous",execute:e,debug:!1};let{name:t="anonymous",handler:r,skip:o,debug:n=!1}=e;return{name:t,execute:r,debug:n,...o!==void 0&&{skip:o}}}function Me(e){return P({name:"state-middleware",handler:e})}function ze(e){return P({name:"service-middleware",handler:e})}var Or={origin:!0,methods:["GET","HEAD","PUT","PATCH","POST","DELETE"],credentials:!1,optionsSuccessStatus:204},_r={origin:!1,methods:["GET","HEAD"],credentials:!1,optionsSuccessStatus:204};function St(e){return e===void 0&&(e=process.env.NODE_ENV!=="production"),e?{...Or}:{..._r}}function Fr(e=6e4,t=1e3){let r=new Map,o={ttl:e,maxSize:t},n=(h,w,x)=>`${h}:${w}:${x||"anonymous"}`,i=()=>{if(r.size===0)return;let h=null,w=1/0;for(let[x,d]of r.entries())d.lastAccessed<w&&(w=d.lastAccessed,h=x);h&&r.delete(h)};return{get:(h,w,x)=>{let d=n(h,w,x),p=r.get(d);if(!p)return null;let g=Date.now();return g>p.expiresAt?(r.delete(d),null):(p.lastAccessed=g,p.allowed)},set:(h,w,x,d)=>{let p=n(h,x,d),g=Date.now();if(r.has(p)){r.set(p,{allowed:w,expiresAt:g+o.ttl,lastAccessed:g});return}r.size>=o.maxSize&&i(),r.set(p,{allowed:w,expiresAt:g+o.ttl,lastAccessed:g})},clear:()=>{r.clear()},cleanExpired:()=>{let h=Date.now(),w=0;for(let[x,d]of r.entries())h>d.expiresAt&&(r.delete(x),w++);return w},getStats:()=>({size:r.size,maxSize:o.maxSize,ttl:o.ttl})}}var wt=Fr();function Ar(e){return typeof e=="boolean"||typeof e=="function"?!1:Array.isArray(e)?e.every(t=>typeof t=="string"||t instanceof RegExp):typeof e=="string"||e instanceof RegExp}function Br(e){return typeof e=="string"?`str:${e}`:e instanceof RegExp?`regex:${e.source}:${e.flags}`:Array.isArray(e)?`array:[${e.map(t=>typeof t=="string"?`str:${t}`:t instanceof RegExp?`regex:${t.source}:${t.flags}`:"unknown").join(",")}]`:"unknown"}async function Dr(e,t){return t==="*"?!0:e===t}async function Nr(e,t){return t.test(e)}async function $r(e,t,r,o=100){let n;try{let i=new Promise(a=>{n=setTimeout(()=>{a({timedOut:!0})},o)}),s=await Promise.race([Promise.resolve(t(e,r)).then(a=>({result:a})),i]);return n&&clearTimeout(n),"timedOut"in s?(console.warn(`CORS origin validation function timed out after ${o}ms for origin: ${e}`),!1):s.result}catch(i){return n&&clearTimeout(n),console.error("CORS origin validation function error:",i),!1}}async function vt(e,t,r){let o=t.map(i=>Le(e,i,r));return(await Promise.all(o)).some(i=>i===!0)}async function Le(e,t,r){return typeof t=="string"?Dr(e,t):t instanceof RegExp?Nr(e,t):typeof t=="function"?$r(e,t,r):(console.warn("Unknown CORS origin type:",typeof t),!1)}async function K(e,t,r){if(t===!0)return!0;if(t===!1)return!1;if(Ar(t)){let n=r?.state?.user?.id||r?.state?.userId,i=Br(t),s=wt.get(e,i,n);if(s!==null)return s;let a;return Array.isArray(t)?a=await vt(e,t,r):a=await Le(e,t,r),wt.set(e,a,i,n),a}else return Array.isArray(t)?vt(e,t,r):Le(e,t,r)}function Ir(e){let t=e.request.header("origin")||e.request.header("Origin"),r=e.request.header("access-control-request-method")||e.request.header("Access-Control-Request-Method"),o=e.request.header("access-control-request-headers")||e.request.header("Access-Control-Request-Headers"),n=o?o.split(",").map(i=>i.trim().toLowerCase()):void 0;return{origin:t,requestedMethod:r,requestedHeaders:n}}function ke(e){return e.toUpperCase()}function Hr(e,t){return t?(typeof t=="string"?t.split(",").map(o=>o.trim()):t).map(o=>ke(o)).includes(ke(e)):["GET","HEAD","PUT","PATCH","POST","DELETE"].includes(ke(e))}function qr(e,t){if(!e||e.length===0||t===void 0)return!0;let r=typeof t=="string"?t.split(",").map(o=>o.trim().toLowerCase()):t.map(o=>o.toLowerCase());return e.every(o=>r.includes(o.toLowerCase()))}function jr(e,t,r,o){o&&(t.origin===!0&&!t.credentials?e.response.header("Access-Control-Allow-Origin","*"):(e.response.header("Access-Control-Allow-Origin",r),e.response.header("Vary","Origin"))),t.credentials&&o&&e.response.header("Access-Control-Allow-Credentials","true");let n=t.methods||["GET","HEAD","PUT","PATCH","POST","DELETE"],i=typeof n=="string"?n:n.join(", ");if(e.response.header("Access-Control-Allow-Methods",i),t.allowedHeaders){let s=typeof t.allowedHeaders=="string"?t.allowedHeaders:t.allowedHeaders.join(", ");e.response.header("Access-Control-Allow-Headers",s)}else{let s=e.request.header("access-control-request-headers")||e.request.header("Access-Control-Request-Headers");s&&e.response.header("Access-Control-Allow-Headers",s)}t.maxAge!==void 0&&t.maxAge>=0&&e.response.header("Access-Control-Max-Age",String(t.maxAge))}async function xt(e,t){let r=Ir(e);if(!r.origin||!r.requestedMethod)throw e.response.status(403),new M("Invalid preflight request: missing required headers",{fields:[{field:r.origin?"Access-Control-Request-Method":"Origin",messages:["Required header is missing"]}],errorCount:1,section:"body"});let o=await K(r.origin,t.origin||!1,e);if(!o)throw e.response.status(403),new M("CORS origin not allowed",{fields:[{field:"Origin",messages:[`Origin '${r.origin}' is not allowed`],rejectedValue:r.origin}],errorCount:1,section:"body"});if(!Hr(r.requestedMethod,t.methods))throw e.response.status(403),new M("CORS method not allowed",{fields:[{field:"Access-Control-Request-Method",messages:[`Method '${r.requestedMethod}' is not allowed`],rejectedValue:r.requestedMethod,expectedType:typeof t.methods=="string"?t.methods:t.methods?.join(", ")}],errorCount:1,section:"body"});if(!qr(r.requestedHeaders,t.allowedHeaders)){let i=r.requestedHeaders?.filter(s=>{let a=t.allowedHeaders;return a?!(typeof a=="string"?a.split(",").map(l=>l.trim().toLowerCase()):a.map(l=>l.toLowerCase())).includes(s.toLowerCase()):!1});throw e.response.status(403),new M("CORS headers not allowed",{fields:[{field:"Access-Control-Request-Headers",messages:[`Headers not allowed: ${i?.join(", ")}`],rejectedValue:i}],errorCount:1,section:"body"})}jr(e,t,r.origin,o);let n=t.optionsSuccessStatus||204;e.response.status(n),t.preflightContinue||e.response.text("")}function Oe(e){return e.request.method==="OPTIONS"&&!!(e.request.header("access-control-request-method")||e.request.header("Access-Control-Request-Method"))}import{z as T}from"zod";var Ur=T.enum(["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS","CONNECT","TRACE"]),Vr=T.union([T.array(Ur),T.string().transform(e=>e.split(",").map(t=>t.trim()))]).optional(),bt=T.union([T.array(T.string()),T.string().transform(e=>e.split(",").map(t=>t.trim()))]).optional(),Wr=T.custom(e=>typeof e=="function"&&e.length<=2,{message:"Origin validator must be a function accepting (origin, ctx?) parameters"}),Tt=T.union([T.string(),T.instanceof(RegExp),Wr]),Qr=T.union([T.boolean(),Tt,T.array(Tt)]),Et=T.object({origin:Qr.optional(),methods:Vr,allowedHeaders:bt,exposedHeaders:bt,credentials:T.boolean().optional(),maxAge:T.number().int().optional(),preflightContinue:T.boolean().optional(),optionsSuccessStatus:T.number().int().min(200).max(299).optional()}).strict(),Ct=T.union([T.boolean(),Et]).optional();function Rt(e){try{return typeof e=="boolean"?e===!1?{origin:!1}:{origin:!0}:Et.parse(e)}catch(t){if(t instanceof T.ZodError){let r=Gr(t);throw new Error(`Invalid CORS options:
13
+ ${r}`)}throw new Error(`Invalid CORS options: ${String(t)}`)}}function Gr(e){return e.errors.map(r=>` - ${r.path.join(".")||"root"}: ${r.message}`).join(`
14
+ `)}function Zr(e){return Array.isArray(e)}function Pt(e){if(e.credentials===!0&&e.origin!==void 0){if(e.origin===!0||e.origin==="*")throw new Error("CORS security violation: Cannot use wildcard origin (*) with credentials. When credentials are enabled, you must specify explicit origins.");if(Zr(e.origin)&&e.origin.some(r=>r==="*"))throw new Error("CORS security violation: Cannot include wildcard origin (*) in array when credentials are enabled.")}}function Mt(e,t){return e===!0?{...t,origin:!0}:e===!1?{origin:!1}:e?{...t,...e,methods:e.methods??t.methods,allowedHeaders:e.allowedHeaders??t.allowedHeaders,exposedHeaders:e.exposedHeaders??t.exposedHeaders}:t}function Jr(e,t,r,o){if(!(!o||!r)&&(t.origin===!0&&!t.credentials?e.response.header("Access-Control-Allow-Origin","*"):(e.response.header("Access-Control-Allow-Origin",r),e.response.header("Vary","Origin")),t.credentials&&e.response.header("Access-Control-Allow-Credentials","true"),t.exposedHeaders)){let n=typeof t.exposedHeaders=="string"?t.exposedHeaders:t.exposedHeaders.join(", ");e.response.header("Access-Control-Expose-Headers",n)}}function fe(e){let t=process.env.NODE_ENV==="development",r=St(t),o=Mt(e,r),n=Rt(o);return Pt(n),P({name:"cors",handler:async(i,s)=>{let a=i.request.header("origin")||i.request.header("Origin");if(Oe(i)){if(await xt(i,n),!n.preflightContinue)return}else{if(!a){await s();return}let c=await K(a,n.origin||!1,i);if(!c)throw i.response.status(403),new J("CORS validation failed",{reason:"origin_not_allowed",origin:a,allowedOrigins:n.origin});Jr(i,n,a,c)}await s()},debug:process.env.DEBUG?.includes("cors")})}var Kr=["accept","content-type","user-agent","x-correlation-id"],Yr=["authorization","cookie","x-api-key","proxy-authorization"];function Xr(e,t){let r={},o=new Set(t.map(i=>i.toLowerCase())),n=new Set(Yr.map(i=>i.toLowerCase()));for(let[i,s]of Object.entries(e)){let a=i.toLowerCase();o.has(a)&&(n.has(a)?r[i]="[REDACTED]":r[i]=s)}return r}function zt(e){return P({name:"requestLogger",handler:async(t,r,o)=>{let n=Date.now(),i;"socket"in t.request.raw&&(i=t.request.raw.socket?.remoteAddress);let s={timestamp:new Date().toISOString()};if(i&&(s.ip=i),e?.includeHeaders){let c=e.headerWhitelist||Kr,l=t.request.headers(),u=Xr(l,c);Object.keys(u).length>0&&(s.headers=u)}if(e?.includeQuery){let c=t.request.query;c&&Object.keys(c).length>0&&(s.query=c)}o.info("Request started",s);let a;try{await r()}catch(c){a=c}finally{let c=Date.now()-n;if(a){let l={duration:c,timestamp:new Date().toISOString()};a instanceof b?l.error={type:a.type,title:a.title,status:a.status,message:a.message,details:a.details,...a.status>=500&&a.stack?{stack:a.stack}:{}}:a instanceof Error?l.error={message:a.message,name:a.name,stack:a.stack}:l.error=String(a),o.error("Request failed",l)}else{let l=t.response.statusCode||200;o.info("Request completed",{statusCode:l,duration:c,timestamp:new Date().toISOString()})}if(a)throw a}}})}function _e(e){if(!e.name||typeof e.name!="string")throw new Error("Plugin name must be a non-empty string");if(!e.version||typeof e.version!="string")throw new Error("Plugin version must be a non-empty string");if(typeof e.setup!="function")throw new Error("Plugin setup must be a function");return function(r){let o={...e.defaultConfig||{},...r||{}},n=F().child({plugin:e.name,version:e.version}),i=e.setup(o,n);if(i===null||typeof i!="object")throw new Error(`Plugin "${e.name}" setup() must return an object with lifecycle hooks`);return{name:e.name,version:e.version,register:i.register||(async()=>{n.debug("Plugin registered (no-op)")}),initialize:i.initialize,onServerStart:i.onServerStart,onServerStop:i.onServerStop,terminate:i.terminate}}}import{fileURLToPath as fo}from"node:url";var me={};function Lt(e){me={...me,...e}}function kt(){if(!me.routesDir)throw new Error("Routes directory not configured. Make sure server is properly initialized.");return me.routesDir}import*as Ot from"node:path";function ge(e,t){e.startsWith("file://")&&(e=e.replace("file://","")),t.startsWith("file://")&&(t=t.replace("file://",""));let r=e.replace(/\\/g,"/"),o=t.replace(/\\/g,"/"),n=o.endsWith("/")?o:`${o}/`,i=r;r.startsWith(n)?i=r.substring(n.length):r.startsWith(o)?(i=r.substring(o.length),i.startsWith("/")&&(i=i.substring(1))):i=Ot.relative(o,r).replace(/\\/g,"/"),i=i.replace(/\.[^.]+$/,"");let s=i.split("/").filter(Boolean),a=[],c=s.map(u=>{if(u.startsWith("[")&&u.endsWith("]")){let h=u.slice(1,-1);return a.push(h),`:${h}`}return u}),l=c.length>0?`/${c.join("/")}`:"/";return l.endsWith("/index")&&(l=l.slice(0,-6)||"/"),{filePath:e,routePath:l,params:a}}import{EventEmitter as io}from"node:events";import{z}from"zod";var eo=z.enum(["drop-oldest","drop-newest","close"]),to=z.object({low:z.number().int().positive().describe("Resume threshold in messages"),high:z.number().int().positive().describe("Trigger threshold in messages")}).refine(e=>e.low<e.high,{message:"Low watermark must be less than high watermark",path:["low"]}),ro=z.object({maxMessages:z.number().int().positive().max(1e5).describe("Maximum number of messages in buffer"),maxBytes:z.number().int().positive().max(100*1024*1024).optional().describe("Maximum buffer size in bytes"),messageTimeout:z.number().int().nonnegative().max(3e5).optional().describe("Message TTL in milliseconds")}),_t=z.object({enabled:z.boolean().default(!0).describe("Enable backpressure management"),strategy:eo.default("drop-oldest").describe("Strategy when buffer reaches high watermark"),watermarks:to.default({low:100,high:1e3}).describe("Buffer watermark thresholds"),limits:ro.default({maxMessages:1e4}).describe("Buffer size constraints"),metrics:z.object({enabled:z.boolean().default(!1),interval:z.number().int().positive().default(5e3)}).optional().describe("Metrics collection configuration")}).refine(e=>e.watermarks.high<=e.limits.maxMessages,{message:"High watermark cannot exceed maxMessages limit",path:["watermarks","high"]});var oo={maxConnections:1e4,maxConnectionsPerClient:100,inactiveTimeout:18e5,cleanupInterval:6e4};function no(e){let t={...oo,...e},r=new Map,o=new Map,n=null,i={},s=f=>{!n&&t.cleanupInterval>0&&(n=setInterval(()=>{f()},t.cleanupInterval),n.unref&&n.unref())},a=()=>{n&&(clearInterval(n),n=null)},c=(f,m)=>{if(!f)return;let C=(o.get(f)||0)+m;C<=0?o.delete(f):o.set(f,C)},l=(f,m,v)=>{if(r.has(f))throw new Error(`Connection with ID ${f} already exists`);if(r.size>=t.maxConnections)throw new Error(`Maximum connection limit reached (${t.maxConnections})`);if(v?.clientIp&&(o.get(v.clientIp)||0)>=t.maxConnectionsPerClient)throw new Error(`Maximum connections per client reached (${t.maxConnectionsPerClient})`);let C=Date.now();r.set(f,{stream:m,connectedAt:C,lastActivity:C,clientIp:v?.clientIp,userAgent:v?.userAgent}),c(v?.clientIp,1),r.size===1&&s(i.cleanup),m.onClose(()=>{u(f)})},u=f=>{let m=r.get(f);m&&(r.delete(f),c(m.clientIp,-1),r.size===0&&a())},h=()=>r.size,w=()=>{let f=Date.now(),m=[];r.forEach((v,C)=>{let _=f-v.lastActivity>t.inactiveTimeout,Er=!v.stream||v.stream.state==="closed"||!v.stream.isWritable;if((_||Er)&&(m.push(C),v.stream&&typeof v.stream.close=="function"))try{v.stream.close()}catch{}}),m.forEach(v=>u(v))},x=f=>r.get(f)?.stream,d=f=>r.has(f),p=()=>Array.from(r.keys()),g=()=>{a(),r.forEach(f=>{if(f.stream&&typeof f.stream.close=="function")try{f.stream.close()}catch{}}),r.clear(),o.clear()};return i.add=l,i.remove=u,i.count=h,i.cleanup=w,i.get=x,i.has=d,i.getIds=p,i.shutdown=g,i}var Fe=null;function he(e){return Fe||(Fe=no(e)),Fe}var Y=class extends b{constructor(t,r,o=void 0){super("SSE_BUFFER_OVERFLOW",t,503,o??S(),r)}};var ye=class extends b{constructor(t,r=void 0,o=void 0){super("SSE_STREAM_CLOSED",t,410,o??S(),r)}};var so={heartbeatInterval:3e4,maxEventSize:1024*1024,autoClose:!0,maxBufferSize:1e3,bufferStrategy:"drop-oldest"};function Ft(e,t,r,o){let n=[];r&&n.push(`id: ${r}`),o!==void 0&&n.push(`retry: ${o}`),n.push(`event: ${e}`);let s=(t===null?"null":t===void 0?"undefined":typeof t=="string"?t:JSON.stringify(t)).split(`
15
+ `);for(let u of s)n.push(`data: ${u}`);n.push("");let a=n.join(`
16
16
  `)+`
17
- `}function io(){let e=Date.now().toString(36),t=Math.random().toString(36).substr(2,9);return`${e}-${t}`}function so(e,t){let r=t===null?"null":t===void 0?"undefined":typeof t=="string"?t:JSON.stringify(t);return e.length+r.length+50}function ao(e,t,r,o){let n=0;switch(t){case"drop-oldest":{for(;e.length>=o&&e.length>0;)e.shift(),n++;e.push(r);break}case"drop-newest":{e.length>=o?n=1:e.push(r);break}case"close":break;default:for(;e.length>=o&&e.length>0;)e.shift(),n++;e.push(r)}return{buffer:e,dropped:n}}var Ae=class{id;_state="connecting";_buffer=[];_closeCallbacks=[];_errorCallbacks=[];_emitter=new oo;_metrics;_options;_response;_request;_writable=!0;_cleanupExecuted=!1;_eventCounter=0;_lastEventId=null;_heartbeatTimer;_backpressureConfig;_disconnectHandlers=null;constructor(t,r={}){if(this.id=`sse-${io()}`,this._options={...no,...r},this._response=t.response,this._request=t.request,r.backpressure){let n=Ft.safeParse(r.backpressure);n.success&&(this._backpressureConfig=n.data,this._options.maxBufferSize=n.data.limits.maxMessages,this._options.bufferStrategy=n.data.strategy)}let o=t.request.header("last-event-id");o&&(this._eventCounter=parseInt(o)||0,this._lastEventId=o),this._metrics={eventsSent:0,eventsDropped:0,bytesWritten:0,bufferHighWatermark:0,lastEventTime:Date.now()};try{let n=he(),i={clientIp:this._request.header("x-forwarded-for")||this._request.header("x-real-ip")||this._request.raw.socket?.remoteAddress,userAgent:this._request.header("user-agent")};n.add(this.id,this,i)}catch(n){throw this._state="closed",this._writable=!1,console.error("[SSE] Failed to register connection:",n),n}this._setupDisconnectHandling(),this._response.status(200).header("Content-Type","text/event-stream").header("Cache-Control","no-cache").header("X-Accel-Buffering","no"),(!this._request.raw.httpVersionMajor||this._request.raw.httpVersionMajor<2)&&this._response.header("Connection","keep-alive"),this._options.heartbeatInterval&&this._options.heartbeatInterval>0&&this._setupHeartbeat(this._options.heartbeatInterval),this._state="connected",this._writeRaw(`: SSE connection established
17
+ `,c=4096,l=Buffer.byteLength(a,"utf8");if(l<c){let u=c-l;a+=`: ${"\xB7".repeat(u)}
18
+ `}return a}function ao(){let e=Date.now().toString(36),t=Math.random().toString(36).substr(2,9);return`${e}-${t}`}function co(e,t){let r=t===null?"null":t===void 0?"undefined":typeof t=="string"?t:JSON.stringify(t);return e.length+r.length+50}function lo(e,t,r,o){let n=0;switch(t){case"drop-oldest":{for(;e.length>=o&&e.length>0;)e.shift(),n++;e.push(r);break}case"drop-newest":{e.length>=o?n=1:e.push(r);break}case"close":break;default:for(;e.length>=o&&e.length>0;)e.shift(),n++;e.push(r)}return{buffer:e,dropped:n}}var Ae=class{id;_state="connecting";_buffer=[];_closeCallbacks=[];_errorCallbacks=[];_emitter=new io;_metrics;_options;_response;_request;_writable=!0;_cleanupExecuted=!1;_eventCounter=0;_lastEventId=null;_heartbeatTimer;_backpressureConfig;_disconnectHandlers=null;constructor(t,r={}){if(this.id=`sse-${ao()}`,this._options={...so,...r},this._response=t.response,this._request=t.request,r.backpressure){let n=_t.safeParse(r.backpressure);n.success&&(this._backpressureConfig=n.data,this._options.maxBufferSize=n.data.limits.maxMessages,this._options.bufferStrategy=n.data.strategy)}let o=t.request.header("last-event-id");o&&(this._eventCounter=parseInt(o)||0,this._lastEventId=o),this._metrics={eventsSent:0,eventsDropped:0,bytesWritten:0,bufferHighWatermark:0,lastEventTime:Date.now()};try{let n=he(),i={clientIp:this._request.header("x-forwarded-for")||this._request.header("x-real-ip")||this._request.raw.socket?.remoteAddress,userAgent:this._request.header("user-agent")};n.add(this.id,this,i)}catch(n){throw this._state="closed",this._writable=!1,console.error("[SSE] Failed to register connection:",n),n}this._setupDisconnectHandling(),this._response.status(200).header("Content-Type","text/event-stream").header("Cache-Control","no-cache").header("X-Accel-Buffering","no"),(!this._request.raw.httpVersionMajor||this._request.raw.httpVersionMajor<2)&&this._response.header("Connection","keep-alive"),this._options.heartbeatInterval&&this._options.heartbeatInterval>0&&this._setupHeartbeat(this._options.heartbeatInterval),this._state="connected",this._writeRaw(`: SSE connection established
18
19
 
19
- `)}_registerConnection(){try{let t=he(),r={clientIp:this._request.header("x-forwarded-for")||this._request.header("x-real-ip")||this._request.raw.socket?.remoteAddress,userAgent:this._request.header("user-agent")};t.add(this.id,this,r)}catch(t){throw this._state="closed",this._writable=!1,t}}_setupHeartbeat(t){this._heartbeatTimer=global.setInterval(()=>{this.isWritable&&Date.now()-this._metrics.lastEventTime>t*.9&&this.ping(`heartbeat ${new Date().toISOString()}`)},t),this._heartbeatTimer.unref&&this._heartbeatTimer.unref()}_setupDisconnectHandling(){let t=this._request.raw,r=this._response.raw,o=()=>{this._options.autoClose&&this._state!=="closed"&&this.close()};this._disconnectHandlers={req:{close:o,error:o},res:{close:o,error:o}},t.on("close",this._disconnectHandlers.req.close),t.on("error",this._disconnectHandlers.req.error),r.on("close",this._disconnectHandlers.res.close),r.on("error",this._disconnectHandlers.res.error)}_writeRaw(t){if(!this._writable||this._state==="closed")return!1;try{let r=this._response.raw,o;if("write"in r&&typeof r.write=="function")o=r.write(t);else throw new Error("Response stream does not support write operation");return o&&(this._metrics.bytesWritten+=Buffer.byteLength(t)),o}catch(r){return this._writable=!1,this._handleError(r),!1}}async _flushBuffer(){for(;this._buffer.length>0&&this._writable;){let t=this._buffer.shift();if(!t)break;let r=kt(t.event,t.data,t.id);this._writeRaw(r)?(this._metrics.eventsSent++,this._metrics.lastEventTime=Date.now()):(this._buffer.unshift(t),await this._waitForDrain())}}_waitForDrain(){return new Promise(t=>{this._response.raw.once("drain",t)})}_handleError(t){this._errorCallbacks.forEach(r=>{try{r(t)}catch(o){console.error("Error in error callback:",o)}}),this._writable&&this.sendError(t)}_executeCleanup(){if(this._cleanupExecuted)return;if(this._cleanupExecuted=!0,this._heartbeatTimer&&(global.clearInterval(this._heartbeatTimer),this._heartbeatTimer=void 0),this._disconnectHandlers){let r=this._request.raw,o=this._response.raw;r.removeListener("close",this._disconnectHandlers.req.close),r.removeListener("error",this._disconnectHandlers.req.error),o.removeListener("close",this._disconnectHandlers.res.close),o.removeListener("error",this._disconnectHandlers.res.error),this._disconnectHandlers=null}try{he().remove(this.id)}catch(r){console.error("Registry cleanup error:",r)}let t=[...this._closeCallbacks];for(let r of t)try{let o=r();o&&typeof o.then=="function"&&o.catch(n=>{console.error("Error in async close callback:",n)})}catch(o){console.error("Error in close callback:",o)}this._closeCallbacks=[],this._errorCallbacks=[],this._buffer=[],this._emitter.removeAllListeners()}get state(){return this._state}get bufferSize(){return this._buffer.length}get isWritable(){return this._writable&&this._state==="connected"}send(t,r){if(!this.isWritable)throw new ye("Cannot send event to closed stream",{clientId:this.id,closedAt:new Date().toISOString(),closeReason:"server-close",canReconnect:!1});let o=String(++this._eventCounter);this._lastEventId=o;let n=S(),i=so(t,r),s=this._options.maxEventSize;if(i>s)throw new Y("Event size exceeds maximum allowed",{currentSize:i,maxSize:s,strategy:"close",clientId:this.id,eventsDropped:0,triggeringEvent:t});let a={id:o,event:t,data:r,size:i,timestamp:Date.now(),correlationId:n},c=this._backpressureConfig?this._backpressureConfig.watermarks.high:this._options.maxBufferSize;if(this._buffer.length>=c){if(this._options.bufferStrategy==="close"){let p=this._buffer.length;throw this.close(),new Y("Buffer overflow - stream closed",{currentSize:p,maxSize:c,strategy:"close",clientId:this.id})}let l=ao(this._buffer,this._options.bufferStrategy,a,c);this._buffer=l.buffer,this._metrics.eventsDropped+=l.dropped,l.dropped>0&&console.warn(`SSE stream ${this.id}: Dropped ${l.dropped} events due to buffer overflow`)}else this._buffer.push(a);this._metrics.bufferHighWatermark=Math.max(this._metrics.bufferHighWatermark,this._buffer.length),this._emitter.emit("event"),this._flushBuffer().catch(l=>{this._handleError(l)})}sendError(t){if(!this.isWritable)return;let r={message:t.message,name:t.name,correlationId:S(),timestamp:new Date().toISOString(),stack:process.env.NODE_ENV==="development"?t.stack:void 0};try{this.send("error",r)}catch(o){console.error("Failed to send error event:",o)}}close(){if(this._state!=="closed"){this._state="closed",this._writable=!1,this._emitter.emit("close");try{let t=kt("close",{reason:"stream-closed",reconnect:!1}),r=this._response.raw;"write"in r&&typeof r.write=="function"&&r.write(t)}catch{}try{let t=this._response.raw;!t.writableEnded&&typeof t.end=="function"&&t.end()}catch(t){console.error("Error ending response:",t)}this._executeCleanup()}}onClose(t){if(this._state==="closed")try{let r=t();r&&typeof r.then=="function"&&r.catch(o=>{console.error("Error in close callback:",o)})}catch(r){console.error("Error in close callback:",r)}else this._closeCallbacks.push(t)}ping(t){if(!this.isWritable)return;let r=t?`: ${t}
20
+ `)}_registerConnection(){try{let t=he(),r={clientIp:this._request.header("x-forwarded-for")||this._request.header("x-real-ip")||this._request.raw.socket?.remoteAddress,userAgent:this._request.header("user-agent")};t.add(this.id,this,r)}catch(t){throw this._state="closed",this._writable=!1,t}}_setupHeartbeat(t){this._heartbeatTimer=global.setInterval(()=>{this.isWritable&&Date.now()-this._metrics.lastEventTime>t*.9&&this.ping(`heartbeat ${new Date().toISOString()}`)},t),this._heartbeatTimer.unref&&this._heartbeatTimer.unref()}_setupDisconnectHandling(){let t=this._request.raw,r=this._response.raw,o=()=>{this._options.autoClose&&this._state!=="closed"&&this.close()};this._disconnectHandlers={req:{close:o,error:o},res:{close:o,error:o}},t.on("close",this._disconnectHandlers.req.close),t.on("error",this._disconnectHandlers.req.error),r.on("close",this._disconnectHandlers.res.close),r.on("error",this._disconnectHandlers.res.error)}_writeRaw(t){if(!this._writable||this._state==="closed")return!1;try{let r=this._response.raw,o;if("write"in r&&typeof r.write=="function")o=r.write(t);else throw new Error("Response stream does not support write operation");return o&&(this._metrics.bytesWritten+=Buffer.byteLength(t)),o}catch(r){return this._writable=!1,this._handleError(r),!1}}async _flushBuffer(){for(;this._buffer.length>0&&this._writable;){let t=this._buffer.shift();if(!t)break;let r=Ft(t.event,t.data,t.id);this._writeRaw(r)?(this._metrics.eventsSent++,this._metrics.lastEventTime=Date.now()):(this._buffer.unshift(t),await this._waitForDrain())}}_waitForDrain(){return new Promise(t=>{this._response.raw.once("drain",t)})}_handleError(t){this._errorCallbacks.forEach(r=>{try{r(t)}catch(o){console.error("Error in error callback:",o)}}),this._writable&&this.sendError(t)}_executeCleanup(){if(this._cleanupExecuted)return;if(this._cleanupExecuted=!0,this._heartbeatTimer&&(global.clearInterval(this._heartbeatTimer),this._heartbeatTimer=void 0),this._disconnectHandlers){let r=this._request.raw,o=this._response.raw;r.removeListener("close",this._disconnectHandlers.req.close),r.removeListener("error",this._disconnectHandlers.req.error),o.removeListener("close",this._disconnectHandlers.res.close),o.removeListener("error",this._disconnectHandlers.res.error),this._disconnectHandlers=null}try{he().remove(this.id)}catch(r){console.error("Registry cleanup error:",r)}let t=[...this._closeCallbacks];for(let r of t)try{let o=r();o&&typeof o.then=="function"&&o.catch(n=>{console.error("Error in async close callback:",n)})}catch(o){console.error("Error in close callback:",o)}this._closeCallbacks=[],this._errorCallbacks=[],this._buffer=[],this._emitter.removeAllListeners()}get state(){return this._state}get bufferSize(){return this._buffer.length}get isWritable(){return this._writable&&this._state==="connected"}send(t,r){if(!this.isWritable)throw new ye("Cannot send event to closed stream",{clientId:this.id,closedAt:new Date().toISOString(),closeReason:"server-close",canReconnect:!1});let o=String(++this._eventCounter);this._lastEventId=o;let n=S(),i=co(t,r),s=this._options.maxEventSize;if(i>s)throw new Y("Event size exceeds maximum allowed",{currentSize:i,maxSize:s,strategy:"close",clientId:this.id,eventsDropped:0,triggeringEvent:t});let a={id:o,event:t,data:r,size:i,timestamp:Date.now(),correlationId:n},c=this._backpressureConfig?this._backpressureConfig.watermarks.high:this._options.maxBufferSize;if(this._buffer.length>=c){if(this._options.bufferStrategy==="close"){let u=this._buffer.length;throw this.close(),new Y("Buffer overflow - stream closed",{currentSize:u,maxSize:c,strategy:"close",clientId:this.id})}let l=lo(this._buffer,this._options.bufferStrategy,a,c);this._buffer=l.buffer,this._metrics.eventsDropped+=l.dropped,l.dropped>0&&console.warn(`SSE stream ${this.id}: Dropped ${l.dropped} events due to buffer overflow`)}else this._buffer.push(a);this._metrics.bufferHighWatermark=Math.max(this._metrics.bufferHighWatermark,this._buffer.length),this._emitter.emit("event"),this._flushBuffer().catch(l=>{this._handleError(l)})}sendError(t){if(!this.isWritable)return;let r={message:t.message,name:t.name,correlationId:S(),timestamp:new Date().toISOString(),stack:process.env.NODE_ENV==="development"?t.stack:void 0};try{this.send("error",r)}catch(o){console.error("Failed to send error event:",o)}}close(){if(this._state!=="closed"){this._state="closed",this._writable=!1,this._emitter.emit("close");try{let t=Ft("close",{reason:"stream-closed",reconnect:!1}),r=this._response.raw;"write"in r&&typeof r.write=="function"&&r.write(t)}catch{}try{let t=this._response.raw;!t.writableEnded&&typeof t.end=="function"&&t.end()}catch(t){console.error("Error ending response:",t)}this._executeCleanup()}}onClose(t){if(this._state==="closed")try{let r=t();r&&typeof r.then=="function"&&r.catch(o=>{console.error("Error in close callback:",o)})}catch(r){console.error("Error in close callback:",r)}else this._closeCallbacks.push(t)}ping(t){if(!this.isWritable)return;let r=t?`: ${t}
20
21
 
21
22
  `:`: ping
22
23
 
23
24
  `;this._writeRaw(r)}setRetry(t){if(this.isWritable){if(t<0||!Number.isFinite(t))throw new Error("Retry interval must be a positive number");this._writeRaw(`retry: ${Math.floor(t)}
24
25
 
25
- `)}}flush(){this.isWritable&&this._flushBuffer().catch(t=>{this._handleError(t)})}getMetrics(){return{...this._metrics}}async*[Symbol.asyncIterator](){for(;this.isWritable;){for(;this._buffer.length>0;){let t=this._buffer.shift();t&&(yield t)}await new Promise(t=>{let r=()=>{(this._buffer.length>0||!this.isWritable)&&(this._emitter.off("event",r),this._emitter.off("close",r),t())};this._emitter.on("event",r),this._emitter.on("close",r)})}}};function _t(e,t){return new Ae(e,t)}var Se=class extends T{constructor(t,r,o){super("SSE_NOT_ACCEPTABLE",t,406,o||S(),r)}};function co(e){if(!e.handler||typeof e.handler!="function")throw new Error("SSE route handler must be a function");if(e.middleware&&!Array.isArray(e.middleware))throw new Error("Middleware for SSE route must be an array");if(e.schema){let{params:t,query:r,events:o}=e.schema;if(t&&(!t._def||typeof t.parse!="function"))throw new Error("Params schema for SSE must be a valid Zod schema");if(r&&(!r._def||typeof r.parse!="function"))throw new Error("Query schema for SSE must be a valid Zod schema");if(o){if(typeof o=="object"&&!o._def){for(let[n,i]of Object.entries(o))if(!i||typeof i!="object"||!i._def||typeof i.parse!="function")throw new Error(`Event schema for '${n}' must be a valid Zod schema`)}else if(!(o._def&&typeof o.parse=="function"))throw new Error("Events schema for SSE must be a valid Zod schema or event map")}}}function lo(e,t){let r=Object.create(e),o=e.send.bind(e);return r.send=function(n,i){let s=t[n];if(s)try{let a=s.parse(i);o(n,a)}catch(a){e.sendError(new Error(`Event '${n}' validation failed: ${a instanceof Error?a.message:String(a)}`))}else o(n,i)},r}var At=()=>e=>{co(e);let t=A();return{GET:{handler:async(o,n)=>{let i=o.request.header("accept");if(i&&!i.includes("text/event-stream")&&!i.includes("*/*"))throw new Se("This endpoint requires Server-Sent Events support",{acceptHeader:i,requiredHeader:"text/event-stream",endpoint:o.request.path});if(e.schema)try{e.schema.params&&(n=e.schema.params.parse(n)),e.schema.query&&(o.request.query=e.schema.query.parse(o.request.query))}catch(c){throw console.error("[SSE] Validation error:",c),c}let s=_t(o,e.options),a=e.schema?.events&&typeof e.schema.events=="object"&&!e.schema.events._def?lo(s,e.schema.events):s;o.request.raw.on("close",()=>a.close());try{await e.handler(a,o,n)}catch(c){throw console.error("[SSE] Handler error - THIS IS THE REAL ERROR:",c),console.error("[SSE] Stack trace:",c instanceof Error?c.stack:"No stack"),a.isWritable&&a.sendError(c instanceof Error?c:new Error(String(c))),a.close(),c}},schema:e.schema?.params||e.schema?.query?{params:e.schema?.params,query:e.schema?.query}:void 0,middleware:e.middleware,options:e.options},path:t}};function po(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(n,i)=>i;let r=new Error().stack[3];if(!r||typeof r.getFileName!="function")throw new Error("Unable to determine caller file frame");let o=r.getFileName();if(!o)throw new Error("Unable to determine caller file name");return o.startsWith("file://")?uo(o):o}finally{Error.prepareStackTrace=e}}function A(){let e=po(),t=Lt(),r=ge(e,t);return console.log(`\u{1F50E} Parsed route path: ${r.routePath} from file: ${e}`),r.routePath}var Be=()=>e=>{q("GET",e);let t=A();return{GET:e,path:t}},De=()=>e=>{q("POST",e);let t=A();return{POST:e,path:t}},Ne=()=>e=>{q("PUT",e);let t=A();return{PUT:e,path:t}},$e=()=>e=>{q("DELETE",e);let t=A();return{DELETE:e,path:t}},He=()=>e=>{q("PATCH",e);let t=A();return{PATCH:e,path:t}},Ie=()=>e=>{q("HEAD",e);let t=A();return{HEAD:e,path:t}},qe=()=>e=>{q("OPTIONS",e);let t=A();return{OPTIONS:e,path:t}};function q(e,t){if(!t.handler||typeof t.handler!="function")throw new Error(`Handler for method ${e} must be a function`);if(t.middleware&&!Array.isArray(t.middleware))throw new Error(`Middleware for method ${e} must be an array`);switch(t.schema&&fo(e,t.schema),e){case"GET":case"HEAD":case"DELETE":t.schema?.body&&console.warn(`Warning: ${e} requests typically don't have request bodies`);break}}function fo(e,t){let{params:r,query:o,body:n,response:i}=t;if(r&&(!r._def||typeof r.parse!="function"))throw new Error(`Params schema for ${e} must be a valid Zod schema`);if(o&&(!o._def||typeof o.parse!="function"))throw new Error(`Query schema for ${e} must be a valid Zod schema`);if(n&&(!n._def||typeof n.parse!="function"))throw new Error(`Body schema for ${e} must be a valid Zod schema`);if(i&&(!i._def||typeof i.parse!="function"))throw new Error(`Response schema for ${e} must be a valid Zod schema`)}function Bt(){return{get:Be(),post:De(),put:Ne(),delete:$e(),patch:He(),head:Ie(),options:qe(),sse:At()}}function V(e,t,r){let o=t.exec(e);if(!o)return{};let n={};for(let i=0;i<r.length;i++)n[r[i]]=o[i+1]||"";return n}function X(e){let t=[];if(e==="/")return{pattern:/^\/$/,paramNames:[]};let r=e.replace(/([.+*?^$(){}|\\])/g,"\\$1");return r=r.replace(/\/:([^/]+)/g,(n,i)=>(t.push(i),"/([^/]+)")).replace(/\/\[([^\]]+)\]/g,(n,i)=>(t.push(i),"/([^/]+)")),r=`${r}(?:/)?`,{pattern:new RegExp(`^${r}$`),paramNames:t}}function we(e){let t=[];for(let[r,o]of Object.entries(e))if(o!=null){let n=encodeURIComponent(r),i=encodeURIComponent(String(o));t.push(`${n}=${i}`)}return t.length>0?`?${t.join("&")}`:""}function Ue(e,t={},r={}){let o={},n={...r},i=[];e.replace(/\/:([^/]+)/g,(c,l)=>(i.push(l),"/"));for(let[c,l]of Object.entries(t))i.includes(c)?o[c]=l:n[c]=l;let s=e;for(let[c,l]of Object.entries(o))s=s.replace(`:${c}`,encodeURIComponent(String(l)));let a=we(n);return s+a}function ee(){let e=[];return{add(t,r,o){let{pattern:n,paramNames:i}=X(t),s={path:t,method:r,pattern:n,paramNames:i,routeOptions:o},a=e.findIndex(c=>i.length<c.paramNames.length);a===-1?e.push(s):e.splice(a,0,s)},remove(t){for(let r=e.length-1;r>=0;r--)e[r].path===t&&e.splice(r,1)},clear(){e.length=0},match(t,r){let o=t.split("?")[0];if(!o)return null;for(let i of e){if(i.method!==r)continue;if(i.pattern.exec(o)){let a=V(t,i.pattern,i.paramNames);return{route:i.routeOptions,params:a}}}return e.find(i=>i.method!==r&&i.pattern.test(t))?{route:null,params:{},methodNotAllowed:!0,allowedMethods:e.filter(i=>i.pattern.test(t)).map(i=>i.method)}:null},getRoutes(){return e.map(t=>({path:t.path,method:t.method}))},findRoutes(t){return e.filter(r=>r.pattern.test(t)).map(r=>({path:r.path,method:r.method,params:V(t,r.pattern,r.paramNames)}))}}}import{AsyncLocalStorage as Hn}from"node:async_hooks";import In from"node:events";import*as We from"node:fs";import*as rr from"node:http";import*as or from"node:http2";import*as B from"node:fs";import*as ve from"node:path";import*as Dt from"selfsigned";async function Nt(){let e=ve.join(process.cwd(),".blaizejs","certs"),t=ve.join(e,"dev.key"),r=ve.join(e,"dev.cert");if(B.existsSync(t)&&B.existsSync(r))return{keyFile:t,certFile:r};B.existsSync(e)||B.mkdirSync(e,{recursive:!0});let i=Dt.generate([{name:"commonName",value:"localhost"}],{days:365,algorithm:"sha256",keySize:2048,extensions:[{name:"basicConstraints",cA:!0},{name:"keyUsage",keyCertSign:!0,digitalSignature:!0,nonRepudiation:!0,keyEncipherment:!0,dataEncipherment:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:7,ip:"127.0.0.1"}]}]});return B.writeFileSync(t,Buffer.from(i.private,"utf-8")),B.writeFileSync(r,Buffer.from(i.cert,"utf-8")),console.log(`
26
+ `)}}flush(){this.isWritable&&this._flushBuffer().catch(t=>{this._handleError(t)})}getMetrics(){return{...this._metrics}}async*[Symbol.asyncIterator](){for(;this.isWritable;){for(;this._buffer.length>0;){let t=this._buffer.shift();t&&(yield t)}await new Promise(t=>{let r=()=>{(this._buffer.length>0||!this.isWritable)&&(this._emitter.off("event",r),this._emitter.off("close",r),t())};this._emitter.on("event",r),this._emitter.on("close",r)})}}};function At(e,t){return new Ae(e,t)}var Se=class extends b{constructor(t,r,o){super("SSE_NOT_ACCEPTABLE",t,406,o||S(),r)}};function uo(e){if(!e.handler||typeof e.handler!="function")throw new Error("SSE route handler must be a function");if(e.middleware&&!Array.isArray(e.middleware))throw new Error("Middleware for SSE route must be an array");if(e.schema){let{params:t,query:r,events:o}=e.schema;if(t&&(!t._def||typeof t.parse!="function"))throw new Error("Params schema for SSE must be a valid Zod schema");if(r&&(!r._def||typeof r.parse!="function"))throw new Error("Query schema for SSE must be a valid Zod schema");if(o){if(typeof o=="object"&&!o._def){for(let[n,i]of Object.entries(o))if(!i||typeof i!="object"||!i._def||typeof i.parse!="function")throw new Error(`Event schema for '${n}' must be a valid Zod schema`)}else if(!(o._def&&typeof o.parse=="function"))throw new Error("Events schema for SSE must be a valid Zod schema or event map")}}}function po(e,t){let r=Object.create(e),o=e.send.bind(e);return r.send=function(n,i){let s=t[n];if(s)try{let a=s.parse(i);o(n,a)}catch(a){e.sendError(new Error(`Event '${n}' validation failed: ${a instanceof Error?a.message:String(a)}`))}else o(n,i)},r}var Bt=()=>e=>{uo(e);let t=A();return{GET:{handler:async(o,n,i)=>{let s=o.request.header("accept");if(s&&!s.includes("text/event-stream")&&!s.includes("*/*"))throw new Se("This endpoint requires Server-Sent Events support",{acceptHeader:s,requiredHeader:"text/event-stream",endpoint:o.request.path});if(e.schema)try{e.schema.params&&(n=e.schema.params.parse(n)),e.schema.query&&(o.request.query=e.schema.query.parse(o.request.query))}catch(u){throw i.error("[SSE] Validation error:",{error:u}),u}let a=At(o,e.options),c=i.child({streamId:a.id,streamState:"connected",eventStream:!0}),l=e.schema?.events&&typeof e.schema.events=="object"&&!e.schema.events._def?po(a,e.schema.events):a;o.request.raw.on("close",()=>l.close());try{await e.handler(l,o,n,c)}catch(u){throw c.error("[SSE] Handler error - THIS IS THE REAL ERROR:",{error:u}),c.error("[SSE] Stack trace:",{stack:u instanceof Error?u.stack:"No stack"}),l.isWritable&&l.sendError(u instanceof Error?u:new Error(String(u))),l.close(),u}},schema:e.schema?.params||e.schema?.query?{params:e.schema?.params,query:e.schema?.query}:void 0,middleware:e.middleware,options:e.options},SSE:{schema:{params:e.schema?.params,query:e.schema?.query,events:e.schema?.events}},path:t}};function mo(){let e=Error.prepareStackTrace;try{Error.prepareStackTrace=(n,i)=>i;let r=new Error().stack[3];if(!r||typeof r.getFileName!="function")throw new Error("Unable to determine caller file frame");let o=r.getFileName();if(!o)throw new Error("Unable to determine caller file name");return o.startsWith("file://")?fo(o):o}finally{Error.prepareStackTrace=e}}function A(){let e=mo(),t=kt(),r=ge(e,t);return console.log(`\u{1F50E} Parsed route path: ${r.routePath} from file: ${e}`),r.routePath}var Be=()=>e=>{q("GET",e);let t=A();return{GET:e,path:t}},De=()=>e=>{q("POST",e);let t=A();return{POST:e,path:t}},Ne=()=>e=>{q("PUT",e);let t=A();return{PUT:e,path:t}},$e=()=>e=>{q("DELETE",e);let t=A();return{DELETE:e,path:t}},Ie=()=>e=>{q("PATCH",e);let t=A();return{PATCH:e,path:t}},He=()=>e=>{q("HEAD",e);let t=A();return{HEAD:e,path:t}},qe=()=>e=>{q("OPTIONS",e);let t=A();return{OPTIONS:e,path:t}};function q(e,t){if(!t.handler||typeof t.handler!="function")throw new Error(`Handler for method ${e} must be a function`);if(t.middleware&&!Array.isArray(t.middleware))throw new Error(`Middleware for method ${e} must be an array`);switch(t.schema&&go(e,t.schema),e){case"GET":case"HEAD":case"DELETE":t.schema?.body&&console.warn(`Warning: ${e} requests typically don't have request bodies`);break}}function go(e,t){let{params:r,query:o,body:n,response:i}=t;if(r&&(!r._def||typeof r.parse!="function"))throw new Error(`Params schema for ${e} must be a valid Zod schema`);if(o&&(!o._def||typeof o.parse!="function"))throw new Error(`Query schema for ${e} must be a valid Zod schema`);if(n&&(!n._def||typeof n.parse!="function"))throw new Error(`Body schema for ${e} must be a valid Zod schema`);if(i&&(!i._def||typeof i.parse!="function"))throw new Error(`Response schema for ${e} must be a valid Zod schema`)}function Dt(){return{get:Be(),post:De(),put:Ne(),delete:$e(),patch:Ie(),head:He(),options:qe(),sse:Bt()}}function W(e,t,r){let o=t.exec(e);if(!o)return{};let n={};for(let i=0;i<r.length;i++)n[r[i]]=o[i+1]||"";return n}function X(e){let t=[];if(e==="/")return{pattern:/^\/$/,paramNames:[]};let r=e.replace(/([.+*?^$(){}|\\])/g,"\\$1");return r=r.replace(/\/:([^/]+)/g,(n,i)=>(t.push(i),"/([^/]+)")).replace(/\/\[([^\]]+)\]/g,(n,i)=>(t.push(i),"/([^/]+)")),r=`${r}(?:/)?`,{pattern:new RegExp(`^${r}$`),paramNames:t}}function we(e){let t=[];for(let[r,o]of Object.entries(e))if(o!=null){let n=encodeURIComponent(r),i=encodeURIComponent(String(o));t.push(`${n}=${i}`)}return t.length>0?`?${t.join("&")}`:""}function je(e,t={},r={}){let o={},n={...r},i=[];e.replace(/\/:([^/]+)/g,(c,l)=>(i.push(l),"/"));for(let[c,l]of Object.entries(t))i.includes(c)?o[c]=l:n[c]=l;let s=e;for(let[c,l]of Object.entries(o))s=s.replace(`:${c}`,encodeURIComponent(String(l)));let a=we(n);return s+a}function ee(){let e=[];return{add(t,r,o){let{pattern:n,paramNames:i}=X(t),s={path:t,method:r,pattern:n,paramNames:i,routeOptions:o},a=e.findIndex(c=>i.length<c.paramNames.length);a===-1?e.push(s):e.splice(a,0,s)},remove(t){for(let r=e.length-1;r>=0;r--)e[r].path===t&&e.splice(r,1)},clear(){e.length=0},match(t,r){let o=t.split("?")[0];if(!o)return null;for(let i of e){if(i.method!==r)continue;if(i.pattern.exec(o)){let a=W(t,i.pattern,i.paramNames);return{route:i.routeOptions,params:a}}}return e.find(i=>i.method!==r&&i.pattern.test(t))?{route:null,params:{},methodNotAllowed:!0,allowedMethods:e.filter(i=>i.pattern.test(t)).map(i=>i.method)}:null},getRoutes(){return e.map(t=>({path:t.path,method:t.method}))},findRoutes(t){return e.filter(r=>r.pattern.test(t)).map(r=>({path:r.path,method:r.method,params:W(t,r.pattern,r.paramNames)}))}}}import{AsyncLocalStorage as qn}from"node:async_hooks";import jn from"node:events";import*as Ve from"node:fs";import*as or from"node:http";import*as nr from"node:http2";import*as B from"node:fs";import*as ve from"node:path";import*as Nt from"selfsigned";async function $t(){let e=ve.join(process.cwd(),".blaizejs","certs"),t=ve.join(e,"dev.key"),r=ve.join(e,"dev.cert");if(B.existsSync(t)&&B.existsSync(r))return{keyFile:t,certFile:r};B.existsSync(e)||B.mkdirSync(e,{recursive:!0});let i=Nt.generate([{name:"commonName",value:"localhost"}],{days:365,algorithm:"sha256",keySize:2048,extensions:[{name:"basicConstraints",cA:!0},{name:"keyUsage",keyCertSign:!0,digitalSignature:!0,nonRepudiation:!0,keyEncipherment:!0,dataEncipherment:!0},{name:"extKeyUsage",serverAuth:!0,clientAuth:!0},{name:"subjectAltName",altNames:[{type:2,value:"localhost"},{type:7,ip:"127.0.0.1"}]}]});return B.writeFileSync(t,Buffer.from(i.private,"utf-8")),B.writeFileSync(r,Buffer.from(i.cert,"utf-8")),console.log(`
26
27
  \u{1F512} Generated self-signed certificates for development at ${e}
27
- `),{keyFile:t,certFile:r}}var L=class extends Error{constructor(t="\u274C Response has already been sent"){super(t),this.name="ResponseSentError"}},te=class extends L{constructor(t="Cannot set header after response has been sent"){super(t)}},xe=class extends L{constructor(t="Cannot set content type after response has been sent"){super(t)}},Te=class extends L{constructor(t="Invalide URL"){super(t)}};import{AsyncLocalStorage as mo}from"node:async_hooks";var go=new mo;function $t(e,t){return go.run(e,t)}import*as Wt from"node:crypto";import{createWriteStream as vo}from"node:fs";import{tmpdir as xo}from"node:os";import{join as To}from"node:path";import{Readable as jt}from"node:stream";var ho=/boundary=([^;]+)/i,yo=/Content-Disposition:\s*form-data;\s*name="([^"]+)"(?:;[\s\r\n]*filename="([^"]*)")?/i,So=/Content-Type:\s*([^\r\n]+)/i,wo=/multipart\/form-data/i;function Ht(e){let t=e.match(ho);if(!t||!t[1])return null;let r=t[1].trim();return r.startsWith('"')&&r.endsWith('"')&&(r=r.slice(1,-1)),r||null}function It(e){let t=e.match(yo);return!t||!t[1]?null:{name:t[1],filename:t[2]!==void 0?t[2]:void 0}}function qt(e){let t=e.match(So);return t&&t[1]?.trim()?t[1].trim():"application/octet-stream"}function Ut(e){return wo.test(e)}var bo={maxFileSize:10*1024*1024,maxFiles:10,maxFieldSize:1*1024*1024,allowedMimeTypes:[],allowedExtensions:[],strategy:"stream",tempDir:xo(),computeHash:!1};function Eo(e,t={}){return{boundary:Buffer.from(`--${e}`),options:{...bo,...t},fields:new Map,files:new Map,buffer:Buffer.alloc(0),stage:"boundary",currentHeaders:"",currentField:null,currentFilename:void 0,currentMimetype:"application/octet-stream",currentContentLength:0,fileCount:0,fieldCount:0,currentBufferChunks:[],currentStream:null,currentTempPath:null,currentWriteStream:null,streamController:null,cleanupTasks:[],hasFoundValidBoundary:!1,hasProcessedAnyPart:!1,isFinished:!1}}async function Ro(e,t){let r=Buffer.concat([e.buffer,t]),o={...e,buffer:r};for(;o.buffer.length>0&&!o.isFinished;){let n=await Co(o);if(n===o)break;o=n}return o}async function Co(e){switch(e.stage){case"boundary":return Po(e);case"headers":return Mo(e);case"content":return zo(e);default:{let{InternalServerError:t}=await import("./internal-server-error-RRNSAEYK.js");throw new t("Invalid parser stage",{operation:e.stage})}}}function Po(e){let t=e.buffer.indexOf(e.boundary);if(t===-1)return e;let r=!0,o=e.buffer.subarray(t+e.boundary.length);return o.length>=2&&o.subarray(0,2).equals(Buffer.from("--"))?{...e,buffer:o,hasFoundValidBoundary:r,isFinished:!0,stage:"boundary"}:(o.length>=2&&o.subarray(0,2).equals(Buffer.from(`\r
28
- `))&&(o=o.subarray(2)),{...e,buffer:o,hasFoundValidBoundary:r,stage:"headers",currentHeaders:""})}async function Mo(e){let t=e.buffer.indexOf(`\r
28
+ `),{keyFile:t,certFile:r}}var L=class extends Error{constructor(t="\u274C Response has already been sent"){super(t),this.name="ResponseSentError"}},te=class extends L{constructor(t="Cannot set header after response has been sent"){super(t)}},xe=class extends L{constructor(t="Cannot set content type after response has been sent"){super(t)}},be=class extends L{constructor(t="Invalide URL"){super(t)}};import{AsyncLocalStorage as ho}from"node:async_hooks";var yo=new ho;function It(e,t){return yo.run(e,t)}import*as Wt from"node:crypto";import{createWriteStream as bo}from"node:fs";import{tmpdir as To}from"node:os";import{join as Eo}from"node:path";import{Readable as Vt}from"node:stream";var So=/boundary=([^;]+)/i,wo=/Content-Disposition:\s*form-data;\s*name="([^"]+)"(?:;[\s\r\n]*filename="([^"]*)")?/i,vo=/Content-Type:\s*([^\r\n]+)/i,xo=/multipart\/form-data/i;function Ht(e){let t=e.match(So);if(!t||!t[1])return null;let r=t[1].trim();return r.startsWith('"')&&r.endsWith('"')&&(r=r.slice(1,-1)),r||null}function qt(e){let t=e.match(wo);return!t||!t[1]?null:{name:t[1],filename:t[2]!==void 0?t[2]:void 0}}function jt(e){let t=e.match(vo);return t&&t[1]?.trim()?t[1].trim():"application/octet-stream"}function Ut(e){return xo.test(e)}var Co={maxFileSize:10*1024*1024,maxFiles:10,maxFieldSize:1*1024*1024,allowedMimeTypes:[],allowedExtensions:[],strategy:"stream",tempDir:To(),computeHash:!1};function Ro(e,t={}){return{boundary:Buffer.from(`--${e}`),options:{...Co,...t},fields:new Map,files:new Map,buffer:Buffer.alloc(0),stage:"boundary",currentHeaders:"",currentField:null,currentFilename:void 0,currentMimetype:"application/octet-stream",currentContentLength:0,fileCount:0,fieldCount:0,currentBufferChunks:[],currentStream:null,currentTempPath:null,currentWriteStream:null,streamController:null,cleanupTasks:[],hasFoundValidBoundary:!1,hasProcessedAnyPart:!1,isFinished:!1}}async function Po(e,t){let r=Buffer.concat([e.buffer,t]),o={...e,buffer:r};for(;o.buffer.length>0&&!o.isFinished;){let n=await Mo(o);if(n===o)break;o=n}return o}async function Mo(e){switch(e.stage){case"boundary":return zo(e);case"headers":return Lo(e);case"content":return ko(e);default:{let{InternalServerError:t}=await import("./internal-server-error-HHP6KU77.js");throw new t("Invalid parser stage",{operation:e.stage})}}}function zo(e){let t=e.buffer.indexOf(e.boundary);if(t===-1)return e;let r=!0,o=e.buffer.subarray(t+e.boundary.length);return o.length>=2&&o.subarray(0,2).equals(Buffer.from("--"))?{...e,buffer:o,hasFoundValidBoundary:r,isFinished:!0,stage:"boundary"}:(o.length>=2&&o.subarray(0,2).equals(Buffer.from(`\r
29
+ `))&&(o=o.subarray(2)),{...e,buffer:o,hasFoundValidBoundary:r,stage:"headers",currentHeaders:""})}async function Lo(e){let t=e.buffer.indexOf(`\r
29
30
  \r
30
- `);if(t===-1)return e;let r=e.buffer.subarray(0,t).toString("utf8"),o=e.buffer.subarray(t+4),n=It(r);if(!n){let{ValidationError:a}=await import("./validation-error-DRCBJ7IF.js");throw new a("Missing or invalid Content-Disposition header")}let i=qt(r),s=n.filename!==void 0;if(s&&e.fileCount>=e.options.maxFiles){let{PayloadTooLargeError:a}=await import("./payload-too-large-error-SQMCGPZ7.js");throw new a("Too many files in upload",{fileCount:e.fileCount+1,maxFiles:e.options.maxFiles,filename:n.filename})}if(s&&e.options.allowedMimeTypes.length>0&&!e.options.allowedMimeTypes.includes(i)){let{UnsupportedMediaTypeError:a}=await import("./unsupported-media-type-error-6T47SVVY.js");throw new a("File type not allowed",{receivedMimeType:i,allowedMimeTypes:e.options.allowedMimeTypes,filename:n.filename})}return{...e,buffer:o,stage:"content",currentHeaders:r,currentField:n.name,currentFilename:n.filename,currentMimetype:i,currentContentLength:0,fileCount:s?e.fileCount+1:e.fileCount,fieldCount:s?e.fieldCount:e.fieldCount+1,currentBufferChunks:[]}}async function zo(e){let t=e.buffer.indexOf(e.boundary),r,o=!1,n=e.buffer;if(t===-1){let s=Math.max(0,e.buffer.length-e.boundary.length);if(s===0)return e;r=e.buffer.subarray(0,s),n=e.buffer.subarray(s)}else{let s=Math.max(0,t-2);r=e.buffer.subarray(0,s),n=e.buffer.subarray(t),o=!0}let i={...e,buffer:n};return r.length>0&&(i=await Lo(i,r)),o&&(i=await ko(i),i={...i,stage:"boundary",hasProcessedAnyPart:!0}),i}async function Lo(e,t){let r=e.currentContentLength+t.length,o=e.currentFilename!==void 0?e.options.maxFileSize:e.options.maxFieldSize;if(r>o){let n=e.currentFilename!==void 0,{PayloadTooLargeError:i}=await import("./payload-too-large-error-SQMCGPZ7.js"),s=e.currentField?{contentType:n?"file":"field",currentSize:r,maxSize:o,field:e.currentField,filename:e.currentFilename}:{contentType:n?"file":"field",currentSize:r,maxSize:o,filename:e.currentFilename};throw new i(`${n?"File":"Field"} size exceeds limit`,s)}return e.currentFilename!==void 0?Oo(e,t,r):{...e,currentContentLength:r,currentBufferChunks:[...e.currentBufferChunks,t]}}async function Oo(e,t,r){switch(e.options.strategy){case"memory":return{...e,currentContentLength:r,currentBufferChunks:[...e.currentBufferChunks,t]};case"stream":return e.streamController&&e.streamController.enqueue(t),{...e,currentContentLength:r};case"temp":return e.currentWriteStream&&await No(e.currentWriteStream,t),{...e,currentContentLength:r};default:{let{ValidationError:o}=await import("./validation-error-DRCBJ7IF.js");throw new o("Invalid parsing strategy")}}}async function Fo(e){if(e.currentFilename===void 0)return e;switch(e.options.strategy){case"memory":return{...e,currentBufferChunks:[]};case"stream":{let t=null,r=new ReadableStream({start:o=>{t=o}});return{...e,currentStream:r,streamController:t}}case"temp":{let t=To(e.options.tempDir,`upload-${Wt.randomUUID()}`),r=vo(t),o=async()=>{try{let{unlink:n}=await import("node:fs/promises");await n(t)}catch(n){console.warn(`Failed to cleanup temp file: ${t}`,n)}};return{...e,currentTempPath:t,currentWriteStream:r,cleanupTasks:[...e.cleanupTasks,o]}}default:{let{ValidationError:t}=await import("./validation-error-DRCBJ7IF.js");throw new t("Invalid file processing strategy")}}}async function ko(e){return e.currentField?e.currentFilename!==void 0?_o(e):Ao(e):re(e)}async function _o(e){if(!e.currentField||e.currentFilename===void 0)return re(e);let t,r,o;switch(e.options.strategy){case"memory":r=Buffer.concat(e.currentBufferChunks),t=jt.from(r);break;case"stream":e.streamController&&e.streamController.close(),t=e.currentStream;break;case"temp":e.currentWriteStream&&await Qt(e.currentWriteStream),o=e.currentTempPath,t=jt.from(Buffer.alloc(0));break;default:{let{ValidationError:s}=await import("./validation-error-DRCBJ7IF.js");throw new s("Invalid file finalization strategy")}}let n={filename:e.currentFilename,fieldname:e.currentField,mimetype:e.currentMimetype,size:e.currentContentLength,stream:t,buffer:r,tempPath:o},i=Vt(e.files,e.currentField,n);return{...re(e),files:i}}function Ao(e){if(!e.currentField)return re(e);let t=Buffer.concat(e.currentBufferChunks).toString("utf8"),r=Vt(e.fields,e.currentField,t);return{...re(e),fields:r}}function re(e){return{...e,currentField:null,currentFilename:void 0,currentContentLength:0,currentBufferChunks:[],currentStream:null,streamController:null,currentTempPath:null,currentWriteStream:null}}function Vt(e,t,r){let o=new Map(e),n=o.get(t)||[];return o.set(t,[...n,r]),o}async function Bo(e){if(!e.hasFoundValidBoundary){let{ValidationError:o}=await import("./validation-error-DRCBJ7IF.js");throw new o("No valid multipart boundary found")}if(e.hasFoundValidBoundary&&!e.hasProcessedAnyPart){let{ValidationError:o}=await import("./validation-error-DRCBJ7IF.js");throw new o("Empty multipart request")}let t={};for(let[o,n]of e.fields.entries())t[o]=n.length===1?n[0]:n;let r={};for(let[o,n]of e.files.entries())r[o]=n.length===1?n[0]:n;return{fields:t,files:r}}async function Do(e){await Promise.allSettled(e.cleanupTasks.map(t=>t())),e.streamController&&e.streamController.close(),e.currentWriteStream&&await Qt(e.currentWriteStream)}async function No(e,t){return new Promise((r,o)=>{e.write(t,n=>{n?o(n):r()})})}async function Qt(e){return new Promise(t=>{e.end(()=>t())})}async function Gt(e,t={}){let r=e.headers["content-type"]||"",o=Ht(r);if(!o){let{UnsupportedMediaTypeError:i}=await import("./unsupported-media-type-error-6T47SVVY.js");throw new i("Missing boundary in multipart content-type",{receivedContentType:r,expectedFormat:"multipart/form-data; boundary=..."})}let n=Eo(o,t);n.currentFilename!==void 0&&(n=await Fo(n));try{for await(let i of e)n=await Ro(n,i);return Bo(n)}finally{await Do(n)}}var oe="Content-Type";function $o(e){let t=e.url||"/",r=e.headers.host||"localhost",n=`${e.socket&&e.socket.encrypted?"https":"http"}://${r}${t.startsWith("/")?"":"/"}${t}`;try{let i=new URL(n),s=i.pathname,a={};return i.searchParams.forEach((c,l)=>{a[l]!==void 0?Array.isArray(a[l])?a[l].push(c):a[l]=[a[l],c]:a[l]=c}),{path:s,url:i,query:a}}catch(i){throw console.warn(`Invalid URL: ${n}`,i),new Te(`Invalid URL: ${n}`)}}function Ho(e){return"stream"in e||"httpVersionMajor"in e&&e.httpVersionMajor===2}function Io(e){let t=e.socket&&e.socket.encrypted,r=e.headers["x-forwarded-proto"];return r?Array.isArray(r)?r[0]?.split(",")[0]?.trim()||"http":r.split(",")[0]?.trim()||"http":t?"https":"http"}async function Zt(e,t,r){let{path:o,url:n,query:i}=$o(e),s=e.method||"GET",a=Ho(e),c=Io(e),l={},p={...r.initialState||{}},h={...r.initialServices||{}},w={sent:!1},x={request:qo(e,{path:o,url:n,query:i,params:l,method:s,isHttp2:a,protocol:c}),response:{},state:p,services:h};return x.response=jo(t,w,x),r.parseBody&&await en(e,x,r),x}function qo(e,t){return{raw:e,...t,header:Jt(e),headers:Uo(e),body:void 0}}function Jt(e){return t=>{let r=e.headers[t.toLowerCase()];return Array.isArray(r)?r.join(", "):r||void 0}}function Uo(e){let t=Jt(e);return r=>r&&Array.isArray(r)&&r.length>0?r.reduce((o,n)=>(o[n]=t(n),o),{}):Object.entries(e.headers).reduce((o,[n,i])=>(o[n]=Array.isArray(i)?i.join(", "):i||void 0,o),{})}function ne(e,t){if(t.correlationId){let r=H(),o=String(t.correlationId);e.setHeader(r,o)}}function jo(e,t,r){return{raw:e,get statusCode(){return e.statusCode||200},get sent(){return t.sent},status:Wo(e,t,r),header:Vo(e,t,r),headers:Qo(e,t,r),type:Go(e,t,r),json:Zo(e,t,r.state),text:Jo(e,t,r.state),html:Ko(e,t,r.state),redirect:Yo(e,t,r.state),stream:Xo(e,t,r.state)}}function Wo(e,t,r){return function(n){if(t.sent)throw new L;return e.statusCode=n,r.response}}function Vo(e,t,r){return function(n,i){if(t.sent)throw new te;return e.setHeader(n,i),r.response}}function Qo(e,t,r){return function(n){if(t.sent)throw new te;for(let[i,s]of Object.entries(n))e.setHeader(i,s);return r.response}}function Go(e,t,r){return function(n){if(t.sent)throw new xe;return e.setHeader(oe,n),r.response}}function Zo(e,t,r){return function(n,i){if(t.sent)throw new L;i!==void 0&&(e.statusCode=i),ne(e,r),e.setHeader(oe,"application/json"),e.end(JSON.stringify(n)),t.sent=!0}}function Jo(e,t,r){return function(n,i){if(t.sent)throw new L;i!==void 0&&(e.statusCode=i),ne(e,r),e.setHeader(oe,"text/plain"),e.end(n),t.sent=!0}}function Ko(e,t,r){return function(n,i){if(t.sent)throw new L;i!==void 0&&(e.statusCode=i),ne(e,r),e.setHeader(oe,"text/html"),e.end(n),t.sent=!0}}function Yo(e,t,r){return function(n,i=302){if(t.sent)throw new L;ne(e,r),e.statusCode=i,e.setHeader("Location",n),e.end(),t.sent=!0}}function Xo(e,t,r){return function(n,i={}){if(t.sent)throw new L;if(i.status!==void 0&&(e.statusCode=i.status),ne(e,r),i.contentType&&e.setHeader(oe,i.contentType),i.headers)for(let[s,a]of Object.entries(i.headers))e.setHeader(s,a);n.pipe(e),n.on("end",()=>{t.sent=!0}),n.on("error",s=>{console.error("Stream error:",s),t.sent||(e.statusCode=500,e.end("Stream error"),t.sent=!0)})}}async function en(e,t,r){if(tn(e.method))return;let o=e.headers["content-type"]||"",n=parseInt(e.headers["content-length"]||"0",10);if(n===0)return;let i=r.bodyLimits;if(o.includes("application/json")){if(n>i.json)throw new I("JSON body exceeds size limit",{currentSize:n,maxSize:i.json,contentType:"application/json"},S());await rn(e,t)}else if(o.includes("application/x-www-form-urlencoded")){if(n>i.form)throw new I("Form body exceeds size limit",{currentSize:n,maxSize:i.form,contentType:"application/x-www-form-urlencoded"},S());await on(e,t)}else if(o.includes("text/")){if(n>i.text)throw new I("Text body exceeds size limit",{currentSize:n,maxSize:i.text,contentType:o},S());await sn(e,t)}else if(Ut(o))await an(e,t,i.multipart);else{if(n>i.raw)throw new I("Request body exceeds size limit",{currentSize:n,maxSize:i.raw,contentType:o||"unknown"},S());return}}function tn(e){return["GET","HEAD","OPTIONS"].includes(e||"GET")}async function rn(e,t){let r=await je(e);if(!r){console.warn("Empty body, skipping JSON parsing");return}if(r.trim()==="null"){console.warn('Body is the string "null"'),t.request.body=null;return}try{let o=JSON.parse(r);t.request.body=o}catch(o){throw new M("Invalid JSON in request body",{fields:[{field:"body",messages:["Request body contains malformed JSON",o instanceof Error?o.message:"JSON parse failed"]}],errorCount:1,section:"body"},S())}}async function on(e,t){let r=await je(e);if(r)try{t.request.body=nn(r)}catch(o){throw new M("Request body contains malformed form data",{fields:[{field:"body",messages:["Invalid URL-encoded form data",o instanceof Error?o.message:"Form parse failed"]}],errorCount:1,section:"body"},S())}}function nn(e){let t=new URLSearchParams(e),r={};return t.forEach((o,n)=>{r[n]!==void 0?Array.isArray(r[n])?r[n].push(o):r[n]=[r[n],o]:r[n]=o}),r}async function sn(e,t){let r=await je(e);r&&(t.request.body=r)}async function an(e,t,r){try{let o=r,n=await Gt(e,{strategy:"stream",maxFileSize:o.maxFileSize,maxFiles:o.maxFiles,maxFieldSize:o.maxFieldSize});t.request.multipart=n,t.request.files=n.files,t.request.body=n.fields}catch(o){throw o instanceof I||o instanceof le?o:new le("Failed to parse multipart/form-data",{receivedContentType:e.headers["content-type"],expectedFormat:"multipart/form-data; boundary=..."},S())}}async function je(e){return new Promise((t,r)=>{let o=[];e.on("data",n=>{o.push(Buffer.isBuffer(n)?n:Buffer.from(n))}),e.on("end",()=>{t(Buffer.concat(o).toString("utf8"))}),e.on("error",n=>{r(n)})})}var U=class extends T{constructor(t,r=void 0,o=void 0){super("NOT_FOUND",t,404,o??S(),r)}};function cn(e){return e instanceof T}function Kt(e){if(cn(e))return{type:e.type,title:e.title,status:e.status,correlationId:e.correlationId,timestamp:e.timestamp.toISOString(),details:e.details};let t=S(),r;e instanceof Error?r=e.message:e==null?r="Unknown error occurred":r=String(e);let o=new G("Internal Server Error",{originalMessage:r},t);return{type:o.type,title:o.title,status:o.status,correlationId:o.correlationId,timestamp:o.timestamp.toISOString(),details:o.details}}function Yt(e){let t=H(),r={[t]:e(t)};return ce(r)}function Xt(e,t){let r=H();e(r,t)}function er(e={}){let{debug:t=!1}=e;return P({name:"ErrorBoundary",debug:t,handler:async(r,o,n)=>{try{await o()}catch(i){if(r.response.sent){t&&n.error("Error occurred after response was sent:",{error:i});return}t&&n.error("Error boundary caught error:",{error:i});let s=Yt(r.request.header),a=Kt(i);a.correlationId=s,Xt(r.response.header,s),r.response.status(a.status).json(a)}}})}function tr(e){return async(t,r)=>{let o=ce(t.headers);try{await ft(o,async()=>{let n=await Zt(t,r,{parseBody:!0,initialState:{correlationId:o},bodyLimits:e.bodyLimits}),i=e._logger.child({correlationId:o,method:n.request.method,path:n.request.path}),a=[er()];"corsOptions"in e&&e.corsOptions!==!1&&a.push(fe(e.corsOptions)),a.push(...e.middleware);let c=W(a);await $t(n,async()=>{await c(n,async()=>{if(!n.response.sent&&(await e.router.handleRequest(n,i),!r.headersSent&&!n.response.sent))throw new U(`Route not found: ${n.request.method} ${n.request.path}`)},i)})})}catch(n){e._logger.error("Unhandled request error",{error:n,correlationId:o});let i=H();if(r.headersSent||r.stream?.headersSent){e._logger.error("Headers already sent, cannot send error response");return}"stream"in r&&typeof r.stream?.respond=="function"?(r.stream.respond({":status":500,"content-type":"application/json",[i.toLowerCase()]:o}),r.stream.end(JSON.stringify({error:"Internal Server Error",message:"An unexpected error occurred while processing the request",correlationId:o}))):(r.setHeader(i,o),r.writeHead(500,{"Content-Type":"application/json"}),r.end(JSON.stringify({error:"Internal Server Error",message:"An unexpected error occurred while processing the request",correlationId:o})))}}}async function ln(e){if(!e.enabled)return{};let{keyFile:t,certFile:r}=e,o=process.env.NODE_ENV==="development",n=!t||!r;if(n&&o)return await Nt();if(n)throw new Error("HTTP/2 requires SSL certificates. Provide keyFile and certFile in http2 options. In development, set NODE_ENV=development to generate them automatically.");return{keyFile:t,certFile:r}}function un(e,t){if(!e)return rr.createServer();let r={allowHTTP1:!0};try{t.keyFile&&(r.key=We.readFileSync(t.keyFile)),t.certFile&&(r.cert=We.readFileSync(t.certFile))}catch(o){throw new Error(`Failed to read certificate files: ${o instanceof Error?o.message:String(o)}`)}return or.createSecureServer(r)}function dn(e,t,r,o){return new Promise((n,i)=>{e.listen(t,r,()=>{let a=`${o?"https":"http"}://${r}:${t}`;E.info(`
31
+ `);if(t===-1)return e;let r=e.buffer.subarray(0,t).toString("utf8"),o=e.buffer.subarray(t+4),n=qt(r);if(!n){let{ValidationError:a}=await import("./validation-error-RO5FS3GN.js");throw new a("Missing or invalid Content-Disposition header")}let i=jt(r),s=n.filename!==void 0;if(s&&e.fileCount>=e.options.maxFiles){let{PayloadTooLargeError:a}=await import("./payload-too-large-error-PYFKUBOM.js");throw new a("Too many files in upload",{fileCount:e.fileCount+1,maxFiles:e.options.maxFiles,filename:n.filename})}if(s&&e.options.allowedMimeTypes.length>0&&!e.options.allowedMimeTypes.includes(i)){let{UnsupportedMediaTypeError:a}=await import("./unsupported-media-type-error-5B5SHATA.js");throw new a("File type not allowed",{receivedMimeType:i,allowedMimeTypes:e.options.allowedMimeTypes,filename:n.filename})}return{...e,buffer:o,stage:"content",currentHeaders:r,currentField:n.name,currentFilename:n.filename,currentMimetype:i,currentContentLength:0,fileCount:s?e.fileCount+1:e.fileCount,fieldCount:s?e.fieldCount:e.fieldCount+1,currentBufferChunks:[]}}async function ko(e){let t=e.buffer.indexOf(e.boundary),r,o=!1,n=e.buffer;if(t===-1){let s=Math.max(0,e.buffer.length-e.boundary.length);if(s===0)return e;r=e.buffer.subarray(0,s),n=e.buffer.subarray(s)}else{let s=Math.max(0,t-2);r=e.buffer.subarray(0,s),n=e.buffer.subarray(t),o=!0}let i={...e,buffer:n};return r.length>0&&(i=await Oo(i,r)),o&&(i=await Ao(i),i={...i,stage:"boundary",hasProcessedAnyPart:!0}),i}async function Oo(e,t){let r=e.currentContentLength+t.length,o=e.currentFilename!==void 0?e.options.maxFileSize:e.options.maxFieldSize;if(r>o){let n=e.currentFilename!==void 0,{PayloadTooLargeError:i}=await import("./payload-too-large-error-PYFKUBOM.js"),s=e.currentField?{contentType:n?"file":"field",currentSize:r,maxSize:o,field:e.currentField,filename:e.currentFilename}:{contentType:n?"file":"field",currentSize:r,maxSize:o,filename:e.currentFilename};throw new i(`${n?"File":"Field"} size exceeds limit`,s)}return e.currentFilename!==void 0?_o(e,t,r):{...e,currentContentLength:r,currentBufferChunks:[...e.currentBufferChunks,t]}}async function _o(e,t,r){switch(e.options.strategy){case"memory":return{...e,currentContentLength:r,currentBufferChunks:[...e.currentBufferChunks,t]};case"stream":return e.streamController&&e.streamController.enqueue(t),{...e,currentContentLength:r};case"temp":return e.currentWriteStream&&await Io(e.currentWriteStream,t),{...e,currentContentLength:r};default:{let{ValidationError:o}=await import("./validation-error-RO5FS3GN.js");throw new o("Invalid parsing strategy")}}}async function Fo(e){if(e.currentFilename===void 0)return e;switch(e.options.strategy){case"memory":return{...e,currentBufferChunks:[]};case"stream":{let t=null,r=new ReadableStream({start:o=>{t=o}});return{...e,currentStream:r,streamController:t}}case"temp":{let t=Eo(e.options.tempDir,`upload-${Wt.randomUUID()}`),r=bo(t),o=async()=>{try{let{unlink:n}=await import("node:fs/promises");await n(t)}catch(n){console.warn(`Failed to cleanup temp file: ${t}`,n)}};return{...e,currentTempPath:t,currentWriteStream:r,cleanupTasks:[...e.cleanupTasks,o]}}default:{let{ValidationError:t}=await import("./validation-error-RO5FS3GN.js");throw new t("Invalid file processing strategy")}}}async function Ao(e){return e.currentField?e.currentFilename!==void 0?Bo(e):Do(e):re(e)}async function Bo(e){if(!e.currentField||e.currentFilename===void 0)return re(e);let t,r,o;switch(e.options.strategy){case"memory":r=Buffer.concat(e.currentBufferChunks),t=Vt.from(r);break;case"stream":e.streamController&&e.streamController.close(),t=e.currentStream;break;case"temp":e.currentWriteStream&&await Gt(e.currentWriteStream),o=e.currentTempPath,t=Vt.from(Buffer.alloc(0));break;default:{let{ValidationError:s}=await import("./validation-error-RO5FS3GN.js");throw new s("Invalid file finalization strategy")}}let n={filename:e.currentFilename,fieldname:e.currentField,mimetype:e.currentMimetype,size:e.currentContentLength,stream:t,buffer:r,tempPath:o},i=Qt(e.files,e.currentField,n);return{...re(e),files:i}}function Do(e){if(!e.currentField)return re(e);let t=Buffer.concat(e.currentBufferChunks).toString("utf8"),r=Qt(e.fields,e.currentField,t);return{...re(e),fields:r}}function re(e){return{...e,currentField:null,currentFilename:void 0,currentContentLength:0,currentBufferChunks:[],currentStream:null,streamController:null,currentTempPath:null,currentWriteStream:null}}function Qt(e,t,r){let o=new Map(e),n=o.get(t)||[];return o.set(t,[...n,r]),o}async function No(e){if(!e.hasFoundValidBoundary){let{ValidationError:o}=await import("./validation-error-RO5FS3GN.js");throw new o("No valid multipart boundary found")}if(e.hasFoundValidBoundary&&!e.hasProcessedAnyPart){let{ValidationError:o}=await import("./validation-error-RO5FS3GN.js");throw new o("Empty multipart request")}let t={};for(let[o,n]of e.fields.entries())t[o]=n.length===1?n[0]:n;let r={};for(let[o,n]of e.files.entries())r[o]=n.length===1?n[0]:n;return{fields:t,files:r}}async function $o(e){await Promise.allSettled(e.cleanupTasks.map(t=>t())),e.streamController&&e.streamController.close(),e.currentWriteStream&&await Gt(e.currentWriteStream)}async function Io(e,t){return new Promise((r,o)=>{e.write(t,n=>{n?o(n):r()})})}async function Gt(e){return new Promise(t=>{e.end(()=>t())})}async function Zt(e,t={}){let r=e.headers["content-type"]||"",o=Ht(r);if(!o){let{UnsupportedMediaTypeError:i}=await import("./unsupported-media-type-error-5B5SHATA.js");throw new i("Missing boundary in multipart content-type",{receivedContentType:r,expectedFormat:"multipart/form-data; boundary=..."})}let n=Ro(o,t);n.currentFilename!==void 0&&(n=await Fo(n));try{for await(let i of e)n=await Po(n,i);return No(n)}finally{await $o(n)}}var oe="Content-Type";function Ho(e){let t=e.url||"/",r=e.headers.host||"localhost",n=`${e.socket&&e.socket.encrypted?"https":"http"}://${r}${t.startsWith("/")?"":"/"}${t}`;try{let i=new URL(n),s=i.pathname,a={};return i.searchParams.forEach((c,l)=>{a[l]!==void 0?Array.isArray(a[l])?a[l].push(c):a[l]=[a[l],c]:a[l]=c}),{path:s,url:i,query:a}}catch(i){throw console.warn(`Invalid URL: ${n}`,i),new be(`Invalid URL: ${n}`)}}function qo(e){return"stream"in e||"httpVersionMajor"in e&&e.httpVersionMajor===2}function jo(e){let t=e.socket&&e.socket.encrypted,r=e.headers["x-forwarded-proto"];return r?Array.isArray(r)?r[0]?.split(",")[0]?.trim()||"http":r.split(",")[0]?.trim()||"http":t?"https":"http"}async function Jt(e,t,r){let{path:o,url:n,query:i}=Ho(e),s=e.method||"GET",a=qo(e),c=jo(e),l={},u={...r.initialState||{}},h={...r.initialServices||{}},w={sent:!1},x={request:Uo(e,{path:o,url:n,query:i,params:l,method:s,isHttp2:a,protocol:c}),response:{},state:u,services:h};return x.response=Wo(t,w,x),r.parseBody&&await rn(e,x,r),x}function Uo(e,t){return{raw:e,...t,header:Kt(e),headers:Vo(e),body:void 0}}function Kt(e){return t=>{let r=e.headers[t.toLowerCase()];return Array.isArray(r)?r.join(", "):r||void 0}}function Vo(e){let t=Kt(e);return r=>r&&Array.isArray(r)&&r.length>0?r.reduce((o,n)=>(o[n]=t(n),o),{}):Object.entries(e.headers).reduce((o,[n,i])=>(o[n]=Array.isArray(i)?i.join(", "):i||void 0,o),{})}function ne(e,t){if(t.correlationId){let r=I(),o=String(t.correlationId);e.setHeader(r,o)}}function Wo(e,t,r){return{raw:e,get statusCode(){return e.statusCode||200},get sent(){return t.sent},status:Qo(e,t,r),header:Go(e,t,r),headers:Zo(e,t,r),type:Jo(e,t,r),json:Ko(e,t,r.state),text:Yo(e,t,r.state),html:Xo(e,t,r.state),redirect:en(e,t,r.state),stream:tn(e,t,r.state)}}function Qo(e,t,r){return function(n){if(t.sent)throw new L;return e.statusCode=n,r.response}}function Go(e,t,r){return function(n,i){if(t.sent)throw new te;return e.setHeader(n,i),r.response}}function Zo(e,t,r){return function(n){if(t.sent)throw new te;for(let[i,s]of Object.entries(n))e.setHeader(i,s);return r.response}}function Jo(e,t,r){return function(n){if(t.sent)throw new xe;return e.setHeader(oe,n),r.response}}function Ko(e,t,r){return function(n,i){if(t.sent)throw new L;i!==void 0&&(e.statusCode=i),ne(e,r),e.setHeader(oe,"application/json"),e.end(JSON.stringify(n)),t.sent=!0}}function Yo(e,t,r){return function(n,i){if(t.sent)throw new L;i!==void 0&&(e.statusCode=i),ne(e,r),e.setHeader(oe,"text/plain"),e.end(n),t.sent=!0}}function Xo(e,t,r){return function(n,i){if(t.sent)throw new L;i!==void 0&&(e.statusCode=i),ne(e,r),e.setHeader(oe,"text/html"),e.end(n),t.sent=!0}}function en(e,t,r){return function(n,i=302){if(t.sent)throw new L;ne(e,r),e.statusCode=i,e.setHeader("Location",n),e.end(),t.sent=!0}}function tn(e,t,r){return function(n,i={}){if(t.sent)throw new L;if(i.status!==void 0&&(e.statusCode=i.status),ne(e,r),i.contentType&&e.setHeader(oe,i.contentType),i.headers)for(let[s,a]of Object.entries(i.headers))e.setHeader(s,a);n.pipe(e),n.on("end",()=>{t.sent=!0}),n.on("error",s=>{console.error("Stream error:",s),t.sent||(e.statusCode=500,e.end("Stream error"),t.sent=!0)})}}async function rn(e,t,r){if(on(e.method))return;let o=e.headers["content-type"]||"",n=parseInt(e.headers["content-length"]||"0",10);if(n===0)return;let i=r.bodyLimits;if(o.includes("application/json")){if(n>i.json)throw new H("JSON body exceeds size limit",{currentSize:n,maxSize:i.json,contentType:"application/json"},S());await nn(e,t)}else if(o.includes("application/x-www-form-urlencoded")){if(n>i.form)throw new H("Form body exceeds size limit",{currentSize:n,maxSize:i.form,contentType:"application/x-www-form-urlencoded"},S());await sn(e,t)}else if(o.includes("text/")){if(n>i.text)throw new H("Text body exceeds size limit",{currentSize:n,maxSize:i.text,contentType:o},S());await cn(e,t)}else if(Ut(o))await ln(e,t,i.multipart);else{if(n>i.raw)throw new H("Request body exceeds size limit",{currentSize:n,maxSize:i.raw,contentType:o||"unknown"},S());return}}function on(e){return["GET","HEAD","OPTIONS"].includes(e||"GET")}async function nn(e,t){let r=await Ue(e);if(!r){console.warn("Empty body, skipping JSON parsing");return}if(r.trim()==="null"){console.warn('Body is the string "null"'),t.request.body=null;return}try{let o=JSON.parse(r);t.request.body=o}catch(o){throw new M("Invalid JSON in request body",{fields:[{field:"body",messages:["Request body contains malformed JSON",o instanceof Error?o.message:"JSON parse failed"]}],errorCount:1,section:"body"},S())}}async function sn(e,t){let r=await Ue(e);if(r)try{t.request.body=an(r)}catch(o){throw new M("Request body contains malformed form data",{fields:[{field:"body",messages:["Invalid URL-encoded form data",o instanceof Error?o.message:"Form parse failed"]}],errorCount:1,section:"body"},S())}}function an(e){let t=new URLSearchParams(e),r={};return t.forEach((o,n)=>{r[n]!==void 0?Array.isArray(r[n])?r[n].push(o):r[n]=[r[n],o]:r[n]=o}),r}async function cn(e,t){let r=await Ue(e);r&&(t.request.body=r)}async function ln(e,t,r){try{let o=r,n=await Zt(e,{strategy:"stream",maxFileSize:o.maxFileSize,maxFiles:o.maxFiles,maxFieldSize:o.maxFieldSize});t.request.multipart=n,t.request.files=n.files,t.request.body=n.fields}catch(o){throw o instanceof H||o instanceof le?o:new le("Failed to parse multipart/form-data",{receivedContentType:e.headers["content-type"],expectedFormat:"multipart/form-data; boundary=..."},S())}}async function Ue(e){return new Promise((t,r)=>{let o=[];e.on("data",n=>{o.push(Buffer.isBuffer(n)?n:Buffer.from(n))}),e.on("end",()=>{t(Buffer.concat(o).toString("utf8"))}),e.on("error",n=>{r(n)})})}var j=class extends b{constructor(t,r=void 0,o=void 0){super("NOT_FOUND",t,404,o??S(),r)}};function un(e){return e instanceof b}function Yt(e){if(un(e))return{type:e.type,title:e.title,status:e.status,correlationId:e.correlationId,timestamp:e.timestamp.toISOString(),details:e.details};let t=S(),r;e instanceof Error?r=e.message:e==null?r="Unknown error occurred":r=String(e);let o=new G("Internal Server Error",{originalMessage:r},t);return{type:o.type,title:o.title,status:o.status,correlationId:o.correlationId,timestamp:o.timestamp.toISOString(),details:o.details}}function Xt(e){let t=I(),r={[t]:e(t)};return ce(r)}function er(e,t){let r=I();e(r,t)}function tr(e={}){let{debug:t=!1}=e;return P({name:"ErrorBoundary",debug:t,handler:async(r,o,n)=>{try{await o()}catch(i){if(r.response.sent){t&&n.error("Error occurred after response was sent:",{error:i});return}t&&n.error("Error boundary caught error:",{error:i});let s=Xt(r.request.header),a=Yt(i);a.correlationId=s,er(r.response.header,s),r.response.status(a.status).json(a)}}})}function rr(e){return async(t,r)=>{let o=ce(t.headers);try{await ft(o,async()=>{let n=await Jt(t,r,{parseBody:!0,initialState:{correlationId:o},bodyLimits:e.bodyLimits}),i=e._logger.child({correlationId:o,method:n.request.method,path:n.request.path}),a=[tr()];"corsOptions"in e&&e.corsOptions!==!1&&a.push(fe(e.corsOptions)),a.push(...e.middleware);let c=V(a);await It(n,async()=>{await c(n,async()=>{if(!n.response.sent&&(await e.router.handleRequest(n,i),!r.headersSent&&!n.response.sent))throw new j(`Route not found: ${n.request.method} ${n.request.path}`)},i)})})}catch(n){e._logger.error("Unhandled request error",{error:n,correlationId:o});let i=I();if(r.headersSent||r.stream?.headersSent){e._logger.error("Headers already sent, cannot send error response");return}"stream"in r&&typeof r.stream?.respond=="function"?(r.stream.respond({":status":500,"content-type":"application/json",[i.toLowerCase()]:o}),r.stream.end(JSON.stringify({error:"Internal Server Error",message:"An unexpected error occurred while processing the request",correlationId:o}))):(r.setHeader(i,o),r.writeHead(500,{"Content-Type":"application/json"}),r.end(JSON.stringify({error:"Internal Server Error",message:"An unexpected error occurred while processing the request",correlationId:o})))}}}async function dn(e){if(!e.enabled)return{};let{keyFile:t,certFile:r}=e,o=process.env.NODE_ENV==="development",n=!t||!r;if(n&&o)return await $t();if(n)throw new Error("HTTP/2 requires SSL certificates. Provide keyFile and certFile in http2 options. In development, set NODE_ENV=development to generate them automatically.");return{keyFile:t,certFile:r}}function pn(e,t){if(!e)return or.createServer();let r={allowHTTP1:!0};try{t.keyFile&&(r.key=Ve.readFileSync(t.keyFile)),t.certFile&&(r.cert=Ve.readFileSync(t.certFile))}catch(o){throw new Error(`Failed to read certificate files: ${o instanceof Error?o.message:String(o)}`)}return nr.createSecureServer(r)}function fn(e,t,r,o){return new Promise((n,i)=>{e.listen(t,r,()=>{let a=`${o?"https":"http"}://${r}:${t}`;E.info(`
31
32
  \u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}
32
33
 
33
34
  \u26A1 BlaizeJS DEVELOPMENT SERVER HOT AND READY \u26A1
@@ -39,8 +40,8 @@ ${r}`)}throw new Error(`Invalid CORS options: ${String(t)}`)}}function Vr(e){ret
39
40
  Time to build something amazing! \u{1F680}
40
41
 
41
42
  \u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}\u{1F525}
42
- `),n()}),e.on("error",s=>{E.error("Server error:",{error:s,host:r,port:t}),i(s)})})}async function pn(e){for(let t of e.plugins)typeof t.initialize=="function"&&await t.initialize(e)}async function nr(e,t){if(!e.server)try{let r=t.port,o=t.host;await pn(e);let n=t.http2||{enabled:!0},i=!!n.enabled,s=await ln(n);t.http2&&s.keyFile&&s.certFile&&(t.http2.keyFile=s.keyFile,t.http2.certFile=s.certFile);let a=un(i,s);e.server=a,e.port=r,e.host=o;let c=tr(e);a.on("request",c),await dn(a,r,o,i)}catch(r){throw E.error("Failed to start server:",{error:r}),r}}var be=!1;async function ir(e,t={}){let r=e.server,o=e.events;if(be){console.log("\u26A0\uFE0F Shutdown already in progress, ignoring duplicate shutdown request");return}if(!r)return;be=!0;let n=t.timeout||5e3;try{if(t.onStopping&&await t.onStopping(),o.emit("stopping"),e.router&&typeof e.router.close=="function"){console.log("\u{1F50C} Closing router watchers...");try{await Promise.race([e.router.close(),new Promise((a,c)=>setTimeout(()=>c(new Error("Router close timeout")),2e3))]),console.log("\u2705 Router watchers closed")}catch(a){console.error("\u274C Error closing router watchers:",a)}}try{await Promise.race([e.pluginManager.onServerStop(e,r),new Promise((a,c)=>setTimeout(()=>c(new Error("Plugin stop timeout")),2e3))])}catch(a){console.error("\u274C Plugin stop timeout:",a)}let i=new Promise((a,c)=>{r.close(l=>{if(l)return c(l);a()})}),s=new Promise((a,c)=>{setTimeout(()=>{c(new Error("Server shutdown timeout"))},n)});await Promise.race([i,s]);try{await Promise.race([e.pluginManager.terminatePlugins(e),new Promise((a,c)=>setTimeout(()=>c(new Error("Plugin terminate timeout")),1e3))])}catch(a){console.error("\u274C Plugin terminate timeout:",a)}t.onStopped&&await t.onStopped(),o.emit("stopped"),e.server=null,console.log("\u2705 Graceful shutdown completed"),be=!1}catch(i){throw be=!1,console.error("\u26A0\uFE0F Shutdown error (forcing exit):",i),r&&typeof r.close=="function"&&r.close(),process.env.NODE_ENV==="development"&&(console.log("\u{1F504} Forcing exit for development restart..."),process.exit(0)),o.emit("error",i),i}}function sr(e){if(process.env.NODE_ENV==="development"){let r=()=>{console.log("\u{1F4E4} SIGINT received, forcing exit for development restart..."),process.exit(0)},o=()=>{console.log("\u{1F4E4} SIGTERM received, forcing exit for development restart..."),process.exit(0)};return process.on("SIGINT",r),process.on("SIGTERM",o),{unregister:()=>{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",o)}}}else{let r=()=>{console.log("\u{1F4E4} SIGINT received, starting graceful shutdown..."),e().catch(console.error)},o=()=>{console.log("\u{1F4E4} SIGTERM received, starting graceful shutdown..."),e().catch(console.error)};return process.on("SIGINT",r),process.on("SIGTERM",o),{unregister:()=>{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",o)}}}}import{z as y}from"zod";var fn=y.custom(e=>e!==null&&typeof e=="object"&&"execute"in e&&typeof e.execute=="function",{message:"Expected middleware to have an execute function"}),mn=y.custom(e=>e!==null&&typeof e=="object"&&"register"in e&&typeof e.register=="function",{message:"Expected a valid plugin object with a register method"}),gn=y.object({enabled:y.boolean().optional().default(!0),keyFile:y.string().optional(),certFile:y.string().optional()}).refine(e=>e.enabled&&process.env.NODE_ENV==="production"?e.keyFile&&e.certFile:!0,{message:"When HTTP/2 is enabled (outside of development mode), both keyFile and certFile must be provided"}),hn=y.object({headerName:y.string().regex(/^[a-z][a-z0-9-]*$/,{message:"Header name must start with a letter and contain only lowercase letters, numbers, and hyphens"}).optional(),generator:y.function().args().returns(y.string()).optional()}).optional(),yn=y.object({maxFileSize:y.number().positive().default(50*1024*1024),maxTotalSize:y.number().positive().default(100*1024*1024),maxFiles:y.number().positive().int().default(10),maxFieldSize:y.number().positive().default(1024*1024)}),Sn=y.object({json:y.number().positive().default(512*1024),form:y.number().positive().default(1024*1024),text:y.number().positive().default(5*1024*1024),raw:y.number().positive().default(10*1024*1024),multipart:yn}),wn=y.object({includeHeaders:y.boolean().optional(),headerWhitelist:y.array(y.string().min(1)).optional(),includeQuery:y.boolean().optional()}).optional(),vn=y.object({level:y.enum(["debug","info","warn","error"]).optional(),transport:y.any().optional(),redactKeys:y.array(y.string().min(1)).optional(),includeTimestamp:y.boolean().optional(),requestLogging:y.boolean().optional(),requestLoggerOptions:wn}).optional(),xn=y.object({port:y.number().int().positive().optional().default(3e3),host:y.string().optional().default("localhost"),routesDir:y.string().optional().default("./routes"),http2:gn.optional().default({enabled:!0}),middleware:y.array(fn).optional().default([]),plugins:y.array(mn).optional().default([]),correlation:hn,cors:Et,bodyLimits:Sn,logging:vn});function ar(e){try{return xn.parse(e)}catch(t){if(t instanceof y.ZodError){let r=t.format();throw new Error(`Invalid server options: ${JSON.stringify(r,null,2)}`)}throw new Error(`Invalid server options: ${String(t)}`)}}function cr(e={}){let{continueOnError:t=!0,onError:r}=e;function o(n,i,s){let a=`Plugin ${n.name} failed during ${i}: ${s.message}`;if(r?r(n,i,s):E.error(`[PluginLifecycle] ${a}`,{plugin:n.name,phase:i,error:{message:s.message,stack:s.stack,name:s.name}}),!t)throw new Error(a)}return{async initializePlugins(n){E.debug("[PluginLifecycle] Initializing plugins",{count:n.plugins.length});for(let i of n.plugins)if(i.initialize)try{E.debug("[PluginLifecycle] Initializing plugin",{plugin:i.name}),await i.initialize(n)}catch(s){o(i,"initialize",s)}E.info("[PluginLifecycle] Plugins initialized",{count:n.plugins.length,plugins:n.plugins.map(i=>i.name)})},async terminatePlugins(n){E.debug("[PluginLifecycle] Terminating plugins",{count:n.plugins.length});let i=[...n.plugins].reverse();for(let s of i)if(s.terminate)try{E.debug("[PluginLifecycle] Terminating plugin",{plugin:s.name}),await s.terminate(n)}catch(a){o(s,"terminate",a)}E.info("[PluginLifecycle] Plugins terminated",{count:i.length})},async onServerStart(n,i){E.debug("[PluginLifecycle] Notifying plugins of server start");for(let s of n.plugins)if(s.onServerStart)try{E.debug("[PluginLifecycle] Notifying plugin of server start",{plugin:s.name}),await s.onServerStart(i)}catch(a){o(s,"onServerStart",a)}},async onServerStop(n,i){E.debug("[PluginLifecycle] Notifying plugins of server stop...");let s=[...n.plugins].reverse();for(let a of s)if(a.onServerStop)try{E.debug(`[PluginLifecycle] Notifying plugin of server stop: ${a.name}`),await a.onServerStop(i)}catch(c){o(a,"onServerStop",c)}}}}var F=class extends Error{constructor(r,o){super(`Plugin validation error${r?` for "${r}"`:""}: ${o}`);this.pluginName=r;this.name="PluginValidationError"}};var Tn=new Set(["core","server","router","middleware","context","blaize","blaizejs"]),bn=/^[a-z]([a-z0-9-]*[a-z0-9])?$/,En=/^\d+\.\d+\.\d+(?:-[a-zA-Z0-9-.]+)?(?:\+[a-zA-Z0-9-.]+)?$/;function Ve(e,t={}){let{requireVersion:r=!0,validateNameFormat:o=!0,checkReservedNames:n=!0}=t;if(!e||typeof e!="object")throw new F("","Plugin must be an object");let i=e;if(!i.name||typeof i.name!="string")throw new F("","Plugin must have a name (string)");if(o&&!bn.test(i.name))throw new F(i.name,"Plugin name must be lowercase letters, numbers, and hyphens only");if(n&&Tn.has(i.name.toLowerCase()))throw new F(i.name,`Plugin name "${i.name}" is reserved`);if(r){if(!i.version||typeof i.version!="string")throw new F(i.name,"Plugin must have a version (string)");if(!En.test(i.version))throw new F(i.name,'Plugin version must follow semantic versioning (e.g., "1.0.0")')}if(!i.register||typeof i.register!="function")throw new F(i.name,"Plugin must have a register method (function)");let s=["initialize","terminate","onServerStart","onServerStop"];for(let a of s)if(i[a]&&typeof i[a]!="function")throw new F(i.name,`Plugin ${a} must be a function if provided`)}import*as ur from"node:crypto";import*as dr from"node:fs/promises";async function Rn(e){let t=`?t=${Date.now()}`,r=e+t;try{let o=await import(r);return console.log("\u2705 Successfully imported module"),o}catch(o){let n=o instanceof Error?o.message:String(o);return console.log("\u26A0\uFE0F Error importing with cache buster, trying original path:",n),import(e)}}async function lr(e,t){try{let r=ge(e,t),o=await Rn(e);console.log("\u{1F4E6} Module exports:",Object.keys(o));let n=[];if(o.default&&typeof o.default=="object"){let i={...o.default,path:r.routePath};n.push(i)}return Object.entries(o).forEach(([i,s])=>{if(i==="default"||!s||typeof s!="object")return;let a=s;if(Cn(a)){let c={...a,path:r.routePath};n.push(c)}}),n.length===0?(console.warn(`Route file ${e} does not export any valid route definitions`),[]):(console.log(`\u2705 Successfully Loaded ${n.length} route(s)`),n)}catch(r){return console.error(`Failed to load route module ${e}:`,r),[]}}function Cn(e){return!e||typeof e!="object"?!1:["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].some(o=>e[o]&&typeof e[o]=="object"&&e[o].handler)}var ie=new Map;async function se(e,t,r=!0){let n=(await dr.stat(e)).mtime.getTime(),i=ie.get(e);if(r&&i&&i.timestamp===n)return i.routes;let s=await lr(e,t);if(r){let a=fr(s);ie.set(e,{routes:s,timestamp:n,hash:a})}return s}function pr(e,t){let r=ie.get(e);if(!r)return!0;let o=fr(t);return r.hash!==o}function Qe(e){e?ie.delete(e):ie.clear()}function fr(e){let t=e.map(n=>({path:n.path,methods:Object.keys(n).filter(i=>i!=="path").sort().map(i=>{let s=n[i],a=s?.handler?s.handler.toString():null;return{method:i,handler:a,middleware:s?.middleware?s.middleware.length:0,hasSchema:!!s?.schema,schemaKeys:s?.schema?Object.keys(s.schema).sort():[]}})})),r=JSON.stringify(t);return ur.createHash("md5").update(r).digest("hex")}import*as gr from"node:os";import*as Ee from"node:fs/promises";import*as Q from"node:path";async function mr(e,t={}){let r=Q.isAbsolute(e)?e:Q.resolve(process.cwd(),e);console.log("Creating router with routes directory:",r);try{if(!(await Ee.stat(r)).isDirectory())throw new Error(`Route directory is not a directory: ${r}`)}catch(s){throw s.code==="ENOENT"?new Error(`Route directory not found: ${r}`):s}let o=[],n=t.ignore||["node_modules",".git"];async function i(s){let a=await Ee.readdir(s,{withFileTypes:!0});for(let c of a){let l=Q.join(s,c.name);c.isDirectory()&&n.includes(c.name)||(c.isDirectory()?await i(l):Pn(c.name)&&o.push(l))}}return await i(r),o}function Pn(e){return!e.startsWith("_")&&(e.endsWith(".ts")||e.endsWith(".js"))}async function Mn(e,t,r=Math.max(1,Math.floor(gr.cpus().length/2))){let o=zn(e,r),n=[];for(let i of o){let a=(await Promise.allSettled(i.map(c=>t(c)))).filter(c=>c.status==="fulfilled").map(c=>c.value);n.push(...a)}return n}async function hr(e){let t=await mr(e);return(await Mn(t,o=>se(o,e))).flat()}function zn(e,t){let r=[];for(let o=0;o<e.length;o+=t)r.push(e.slice(o,o+t));return r}var N={fileChanges:0,totalReloadTime:0,averageReloadTime:0,slowReloads:[]};function yr(e,t){let r=Date.now()-t;if(N.fileChanges++,N.totalReloadTime+=r,N.averageReloadTime=N.totalReloadTime/N.fileChanges,r>100&&(N.slowReloads.push({file:e,time:r}),N.slowReloads.length>10&&N.slowReloads.shift()),process.env.NODE_ENV==="development"){let o=r<50?"\u26A1":r<100?"\u{1F504}":"\u{1F40C}";console.log(`${o} Route reload: ${e} (${r}ms)`)}}function Ge(e,t){return console.log(`Tracking performance for: ${t}`),async(...r)=>{let o=Date.now();try{let n=await e(...r);return yr(t,o),n}catch(n){throw yr(t,o),n}}}import*as Ze from"node:path";import{watch as Ln}from"chokidar";function Je(e,t={}){let r=t.debounceMs||16,o=new Map;function n(p,h){return(...w)=>{let x=o.get(h);x&&clearTimeout(x);let u=setTimeout(()=>{p(...w),o.delete(h)},r);o.set(h,u)}}let i=new Map;async function s(p){try{let h=i.get(p),w=await se(p,e,!1);if(!w||w.length===0||h&&!pr(p,w))return;await se(p,e,!0);let x=Ze.normalize(p);h?(i.set(p,w),t.onRouteChanged&&t.onRouteChanged(x,w)):(i.set(p,w),t.onRouteAdded&&t.onRouteAdded(x,w))}catch(h){console.log(`\u26A0\uFE0F Error processing file ${p}:`,h),c(h)}}function a(p){let h=Ze.normalize(p),w=i.get(h);w&&w.length>0&&t.onRouteRemoved&&t.onRouteRemoved(h,w),i.delete(h)}function c(p){t.onError&&p instanceof Error?t.onError(p):console.error("\u26A0\uFE0F Route watcher error:",p)}let l=Ln(e,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:50,pollInterval:10},usePolling:!1,atomic:!0,followSymlinks:!1,depth:10,ignored:[/(^|[/\\])\../,/node_modules/,/\.git/,/\.DS_Store/,/Thumbs\.db/,/\.(test|spec)\.(ts|js)$/,/\.d\.ts$/,/\.map$/,/~$/,...t.ignore||[]]});return l.on("add",p=>{n(s,p)(p)}).on("change",p=>{n(s,p)(p)}).on("unlink",p=>{n(a,p)(p)}).on("error",c),{close:()=>(o.forEach(p=>clearTimeout(p)),o.clear(),l.close()),getRoutes:()=>{let p=[];for(let h of i.values())p.push(...h);return p},getRoutesByFile:()=>new Map(i)}}import{z as An}from"zod";import{z as On}from"zod";function Ke(e,t){return t instanceof On.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Fn}from"zod";function Ye(e,t){return t instanceof Fn.ZodObject?t.strict().parse(e):t.parse(e)}import{z as kn}from"zod";function Xe(e,t){return t instanceof kn.ZodObject?t.strict().parse(e):t.parse(e)}import{z as _n}from"zod";function et(e,t){return t instanceof _n.ZodObject?t.strict().parse(e):t.parse(e)}function tt(e,t=!1){return P({name:"RequestValidator",debug:t,handler:async(r,o,n)=>{if(e.params&&r.request.params)try{r.request.params=Ye(r.request.params,e.params)}catch(i){let s=Re(i),a=s.reduce((c,l)=>c+l.messages.length,0);throw new M("Request validation failed",{fields:s,errorCount:a,section:"params"})}if(e.query&&r.request.query)try{r.request.query=Xe(r.request.query,e.query)}catch(i){let s=Re(i),a=s.reduce((c,l)=>c+l.messages.length,0);throw new M("Request validation failed",{fields:s,errorCount:a,section:"query"})}if(e.body)try{r.request.body=Ke(r.request.body,e.body)}catch(i){let s=Re(i),a=s.reduce((c,l)=>c+l.messages.length,0);throw new M("Request validation failed",{fields:s,errorCount:a,section:"body"})}await o()}})}function Bn(e){return e!==null&&typeof e=="object"&&"type"in e&&"status"in e&&"correlationId"in e&&"timestamp"in e}function rt(e){return P({name:"ResponseValidator",handler:async(t,r)=>{let o=t.response.json,n=!0;t.response.json=(i,s)=>{if(!n||Bn(i))return o.call(t.response,i,s);try{let a=et(i,e);return o.call(t.response,a,s)}catch(a){throw n=!1,new G("Response validation failed",{validationError:Re(a),hint:"The handler returned data that does not match the response schema"})}};try{await r()}catch(i){throw n=!1,t.response.json=o,i}finally{t.response.json=o}}})}function Re(e){if(e instanceof An.ZodError){let t=new Map;for(let r of e.issues){let o=r.path.length>0?r.path.join("."):"root";t.has(o)||t.set(o,[]),t.get(o).push(r.message)}return Array.from(t.entries()).map(([r,o])=>({field:r,messages:o}))}return e instanceof Error?[{field:"unknown",messages:[e.message]}]:[{field:"unknown",messages:[String(e)]}]}async function ot(e,t,r,o){let n=[...t.middleware||[]];t.schema&&((t.schema.params||t.schema.query||t.schema.body)&&n.unshift(tt(t.schema)),t.schema.response&&n.push(rt(t.schema.response))),await W([...n])(e,async()=>{let s=o.child({route:e.request.path,method:e.request.method}),a=await t.handler(e,r,s);!e.response.sent&&a!==void 0&&e.response.json(a)},o)}function Sr(){return{routesByPath:new Map,routesByFile:new Map,pathToFile:new Map}}function $(e,t,r){console.log(`Updating routes from file: ${t}`);let o=e.routesByFile.get(t)||new Set,n=new Set(r.map(l=>l.path)),i=r.filter(l=>!o.has(l.path)),s=Array.from(o).filter(l=>!n.has(l)),c=r.filter(l=>o.has(l.path)).filter(l=>{let p=e.routesByPath.get(l.path);return!p||!Nn(p,l)});return Dn(e,t,{added:i,removed:s,changed:c}),{added:i,removed:s,changed:c}}function wr(e){return Array.from(e.routesByPath.values())}function Dn(e,t,r){let{added:o,removed:n,changed:i}=r;n.forEach(a=>{e.routesByPath.delete(a),e.pathToFile.delete(a)}),[...o,...i].forEach(a=>{e.routesByPath.set(a.path,a),e.pathToFile.set(a.path,t)});let s=new Set([...o.map(a=>a.path),...i.map(a=>a.path),...Array.from(e.routesByFile.get(t)||[]).filter(a=>!n.includes(a))]);s.size>0?e.routesByFile.set(t,s):e.routesByFile.delete(t)}function Nn(e,t){if(e.path!==t.path)return!1;let r=Object.keys(e).filter(n=>n!=="path").sort(),o=Object.keys(t).filter(n=>n!=="path").sort();return r.length!==o.length?!1:r.every(n=>{let i=e[n],s=t[n];return typeof i==typeof s})}function nt(e,t){Object.entries(e).forEach(([r,o])=>{r==="path"||!o||t.add(e.path,r,o)})}function ae(e,t){"remove"in t&&typeof t.remove=="function"?t.remove(e):console.warn("Matcher does not support selective removal, consider adding remove() method")}function vr(e,t){ae(e.path,t),nt(e,t)}var $n={routesDir:"./routes",basePath:"/",watchMode:process.env.NODE_ENV==="development"};function xr(e){let t={...$n,...e};e.basePath&&!e.basePath.startsWith("/")&&console.warn("Base path does nothing");let r=Sr(),o=ee(),n=!1,i=null,s=null,a=new Set([t.routesDir]);function c(u){console.log(`
43
- \u{1F527} APPLYING MATCHER CHANGES:`),console.log(` Adding ${u.added.length} routes`),console.log(` Removing ${u.removed.length} routes`),console.log(` Updating ${u.changed.length} routes`),u.removed.forEach(d=>{console.log(` \u2796 Removing: ${d}`),ae(d,o)}),u.added.forEach(d=>{let g=Object.keys(d).filter(f=>f!=="path");console.log(` \u2795 Adding: ${d.path} [${g.join(", ")}]`),nt(d,o)}),u.changed.forEach(d=>{let g=Object.keys(d).filter(f=>f!=="path");console.log(` \u{1F504} Updating: ${d.path} [${g.join(", ")}]`),vr(d,o)}),console.log(`\u2705 Matcher changes applied
44
- `)}function l(u,d){try{let g=$(r,d,u);return c(g),g}catch(g){throw console.error(`\u26A0\uFE0F Route conflicts from ${d}:`,g),g}}async function p(u,d,g){try{let f=await hr(u),m=f.map(R=>g?{...R,path:`${g}${R.path}`}:R),v=l(m,d);console.log(`Loaded ${f.length} routes from ${d}${g?` with prefix ${g}`:""} (${v.added.length} added, ${v.changed.length} changed, ${v.removed.length} removed)`)}catch(f){throw console.error(`\u26A0\uFE0F Failed to load routes from ${d}:`,f),f}}async function h(){return n||i||(i=(async()=>{try{await Promise.all(Array.from(a).map(u=>p(u,u))),t.watchMode&&w(),n=!0}catch(u){throw console.error("\u26A0\uFE0F Failed to initialize router:",u),u}})()),i}function w(){s||(s=new Map);for(let u of a)if(!s.has(u)){let d=Je(u,{debounceMs:16,ignore:["node_modules",".git"],onRouteAdded:(g,f)=>{try{let m=$(r,g,f);c(m)}catch(m){console.error(`Error adding routes from ${u}:`,m)}},onRouteChanged:Ge(async(g,f)=>{try{console.log(`Processing changes for ${g}`);let m=$(r,g,f);console.log(`Changes detected: ${m.added.length} added, ${m.changed.length} changed, ${m.removed.length} removed`),c(m),console.log(`Route changes applied: ${m.added.length} added, ${m.changed.length} changed, ${m.removed.length} removed`)}catch(m){console.error(`\u26A0\uFE0F Error updating routes from ${u}:`,m)}},u),onRouteRemoved:(g,f)=>{console.log(`File removed: ${g} with ${f.length} routes`);try{f.forEach(m=>{ae(m.path,o)}),Qe(g)}catch(m){console.error(`\u26A0\uFE0F Error removing routes from ${g}:`,m)}},onError:g=>{console.error(`\u26A0\uFE0F Route watcher error for ${u}:`,g)}});s.set(u,d)}}function x(u,d){s||(s=new Map);let g=Je(u,{debounceMs:16,ignore:["node_modules",".git"],onRouteAdded:(f,m)=>{try{let v=m.map(k=>d?{...k,path:`${d}${k.path}`}:k),R=$(r,f,v);c(R)}catch(v){console.error(`\u26A0\uFE0F Error adding routes from ${u}:`,v)}},onRouteChanged:Ge(async(f,m)=>{try{let v=m.map(k=>d?{...k,path:`${d}${k.path}`}:k),R=$(r,f,v);c(R)}catch(v){console.error(`\u26A0\uFE0F Error updating routes from ${u}:`,v)}},u),onRouteRemoved:(f,m)=>{try{m.forEach(v=>{let R=d?`${d}${v.path}`:v.path;ae(R,o)}),Qe(f)}catch(v){console.error(`Error removing routes from ${f}:`,v)}},onError:f=>{console.error(`\u26A0\uFE0F Route watcher error for ${u}:`,f)}});return s.set(u,g),g}return h().catch(u=>{console.error("\u26A0\uFE0F Failed to initialize router on creation:",u)}),{async handleRequest(u,d){n||(console.log("\u{1F504} Router not initialized, initializing..."),await h());let{method:g,path:f}=u.request;console.log(`
45
- \u{1F4E5} Handling request: ${g} ${f}`);let m=o.match(f,g);if(!m)throw console.log(`\u274C No match found for: ${g} ${f}`),new U("Not found");if(console.log(`\u2705 Route matched: ${g} ${f}`),console.log(` Params: ${JSON.stringify(m.params)}`),m.methodNotAllowed){u.response.status(405).json({error:"\u274C Method Not Allowed",allowed:m.allowedMethods}),m.allowedMethods&&m.allowedMethods.length>0&&u.response.header("Allow",m.allowedMethods.join(", "));return}u.request.params=m.params,await ot(u,m.route,m.params,d)},getRoutes(){return wr(r)},addRoute(u){let d=$(r,"programmatic",[u]);c(d)},addRoutes(u){let d=$(r,"programmatic",u);return c(d),d},async addRouteDirectory(u,d={}){if(a.has(u)){console.warn(`Route directory ${u} already registered`);return}a.add(u),n&&(await p(u,u,d.prefix),t.watchMode&&x(u,d.prefix))},getRouteConflicts(){return[]},async close(){if(s){for(let u of s.values())await u.close();s.clear()}}}}var C={port:3e3,host:"localhost",routesDir:"./routes",http2:{enabled:!0},middleware:[],plugins:[],bodyLimits:{json:512*1024,form:1024*1024,text:5*1024*1024,raw:10*1024*1024,multipart:{maxFileSize:50*1024*1024,maxTotalSize:100*1024*1024,maxFiles:10,maxFieldSize:1024*1024}}};function qn(e={}){let t={port:e.port??C.port,host:e.host??C.host,routesDir:e.routesDir??C.routesDir,http2:{enabled:e.http2?.enabled??C.http2.enabled,keyFile:e.http2?.keyFile,certFile:e.http2?.certFile},middleware:e.middleware??C.middleware,plugins:e.plugins??C.plugins,correlation:e.correlation,cors:e.cors,bodyLimits:e.bodyLimits?{json:e.bodyLimits.json??C.bodyLimits.json,form:e.bodyLimits.form??C.bodyLimits.form,text:e.bodyLimits.text??C.bodyLimits.text,raw:e.bodyLimits.raw??C.bodyLimits.raw,multipart:{maxFileSize:e.bodyLimits.multipart?.maxFileSize??C.bodyLimits.multipart.maxFileSize,maxTotalSize:e.bodyLimits.multipart?.maxTotalSize??C.bodyLimits.multipart.maxTotalSize,maxFiles:e.bodyLimits.multipart?.maxFiles??C.bodyLimits.multipart.maxFiles,maxFieldSize:e.bodyLimits.multipart?.maxFieldSize??C.bodyLimits.multipart.maxFieldSize}}:C.bodyLimits,logging:e.logging||C.logging};try{let r=ar(t);return zt({routesDir:r.routesDir}),r}catch(r){throw r instanceof Error?new Error(`Failed to create server: ${r.message}`):new Error(`Failed to create server: ${String(r)}`)}}function Un(e){e.correlation&&pt(e.correlation.headerName,e.correlation.generator)}function jn(e,t){return async()=>(Un(t),await Wn(e),await e.pluginManager.initializePlugins(e),await nr(e,t),await e.pluginManager.onServerStart(e,e.server),Vn(e),e)}async function Wn(e){for(let t of e.plugins)await t.register(e)}function Vn(e){let t=sr(()=>e.close());e._signalHandlers=t,e.events.emit("started")}function Qn(e){return async t=>{if(!e.server)return;let r={...t};e._signalHandlers&&(e._signalHandlers.unregister(),delete e._signalHandlers),await ir(e,r)}}function Gn(e){return t=>{let r=Array.isArray(t)?t:[t];return e.middleware.push(...r),e}}function Zn(e){return async t=>{if(Array.isArray(t))for(let r of t)Ve(r),e.plugins.push(r),await r.register(e);else Ve(t),e.plugins.push(t),await t.register(e);return e}}function it(e={}){let t=qn(e),{port:r,host:o,middleware:n,plugins:i,cors:s,bodyLimits:a}=t,c=_(t.logging||{});pe(t.logging||{});let l=Array.isArray(n)?[...n]:[],p=Array.isArray(i)?[...i]:[],h=new Hn,w=xr({routesDir:t.routesDir,watchMode:process.env.NODE_ENV==="development"}),x=cr({continueOnError:!0}),u=new In,d={server:null,port:r,host:o,context:h,events:u,plugins:[...p],middleware:[...l],corsOptions:s,bodyLimits:a,_signalHandlers:{unregister:()=>{}},_logger:c,use:()=>d,register:async()=>d,listen:async()=>d,close:async()=>{},router:w,pluginManager:x};return d.listen=jn(d,t),d.close=Qn(d),d.use=Gn(d),d.register=Zn(d),d}function Tr(e){return{}}function Uc(e){return typeof e=="object"&&e!==null&&"name"in e&&"execute"in e&&typeof e.name=="string"&&typeof e.execute=="function"}function jc(e){return typeof e=="object"&&e!==null&&"name"in e&&"version"in e&&"register"in e&&typeof e.name=="string"&&typeof e.version=="string"&&typeof e.register=="function"}function Wc(e){return e}function Vc(e){return e}function Qc(...e){return e}function Gc(...e){return e}var st=class extends T{constructor(t,r=void 0,o=void 0){super("UNAUTHORIZED",t,401,o??S(),r)}};var at=class extends T{constructor(t,r=void 0,o=void 0){super("CONFLICT",t,409,o??S(),r)}};var ct=class extends T{constructor(t,r=void 0,o=void 0){super("RATE_LIMITED",t,429,o??S(),r)}};var lt=class extends T{constructor(t,r,o){super("UPLOAD_TIMEOUT",t,408,o??S(),r)}};var ut=class extends T{constructor(t,r,o){super("UNPROCESSABLE_ENTITY",t,422,o??S(),r)}};var dt=class extends T{constructor(t,r=void 0,o=void 0){super("SERVICE_UNAVAILABLE",t,503,o??S(),r)}};var Jn="0.1.0",Kn={createServer:it,inferContext:Tr},Yn={createDeleteRoute:$e,createGetRoute:Be,createHeadRoute:Ie,createOptionsRoute:qe,createPatchRoute:He,createPostRoute:De,createPutRoute:Ne,createRouteFactory:Bt,createMatcher:ee,extractParams:V,compilePathPattern:X,paramsToQuery:we,buildUrl:Ue},Xn={createMiddleware:P,createServiceMiddleware:ze,createStateMiddleware:Me,compose:W,cors:fe,requestLoggerMiddleware:Mt},ei={createPlugin:ke},Il={createServer:it,createMiddleware:P,createServiceMiddleware:ze,createStateMiddleware:Me,createPlugin:ke,getCorrelationId:S,configureGlobalLogger:pe,createLogger:_,logger:E,Server:Kn,Router:Yn,Middleware:Xn,Plugins:ei,VERSION:Jn};export{Il as Blaize,T as BlaizeError,at as ConflictError,D as ConsoleTransport,ti as ErrorSeverity,O as ErrorType,J as ForbiddenError,G as InternalServerError,j as JSONTransport,Z as Logger,Xn as MiddlewareAPI,U as NotFoundError,de as NullTransport,I as PayloadTooLargeError,ei as PluginsAPI,ct as RateLimitError,lt as RequestTimeoutError,Yn as RouterAPI,Kn as ServerAPI,dt as ServiceNotAvailableError,st as UnauthorizedError,ut as UnprocessableEntityError,le as UnsupportedMediaTypeError,Jn as VERSION,M as ValidationError,Wc as asMiddlewareArray,Vc as asPluginArray,Ue as buildUrl,X as compilePathPattern,W as compose,pe as configureGlobalLogger,fe as cors,$e as createDeleteRoute,Be as createGetRoute,Ie as createHeadRoute,_ as createLogger,ee as createMatcher,P as createMiddleware,Qc as createMiddlewareArray,qe as createOptionsRoute,He as createPatchRoute,ke as createPlugin,Gc as createPluginArray,De as createPostRoute,Ne as createPutRoute,Bt as createRouteFactory,it as createServer,ze as createServiceMiddleware,Me as createStateMiddleware,V as extractParams,S as getCorrelationId,Tr as inferContext,Uc as isMiddleware,jc as isPlugin,E as logger,we as paramsToQuery,Mt as requestLoggerMiddleware};
43
+ `),n()}),e.on("error",s=>{E.error("Server error:",{error:s,host:r,port:t}),i(s)})})}async function mn(e){for(let t of e.plugins)typeof t.initialize=="function"&&await t.initialize(e)}async function ir(e,t){if(!e.server)try{let r=t.port,o=t.host;await mn(e);let n=t.http2||{enabled:!0},i=!!n.enabled,s=await dn(n);t.http2&&s.keyFile&&s.certFile&&(t.http2.keyFile=s.keyFile,t.http2.certFile=s.certFile);let a=pn(i,s);e.server=a,e.port=r,e.host=o;let c=rr(e);a.on("request",c),await fn(a,r,o,i)}catch(r){throw E.error("Failed to start server:",{error:r}),r}}var Te=!1;async function sr(e,t={}){let r=e.server,o=e.events;if(Te){console.log("\u26A0\uFE0F Shutdown already in progress, ignoring duplicate shutdown request");return}if(!r)return;Te=!0;let n=t.timeout||5e3;try{if(t.onStopping&&await t.onStopping(),o.emit("stopping"),e.router&&typeof e.router.close=="function"){console.log("\u{1F50C} Closing router watchers...");try{await Promise.race([e.router.close(),new Promise((a,c)=>setTimeout(()=>c(new Error("Router close timeout")),2e3))]),console.log("\u2705 Router watchers closed")}catch(a){console.error("\u274C Error closing router watchers:",a)}}try{await Promise.race([e.pluginManager.onServerStop(e,r),new Promise((a,c)=>setTimeout(()=>c(new Error("Plugin stop timeout")),2e3))])}catch(a){console.error("\u274C Plugin stop timeout:",a)}let i=new Promise((a,c)=>{r.close(l=>{if(l)return c(l);a()})}),s=new Promise((a,c)=>{setTimeout(()=>{c(new Error("Server shutdown timeout"))},n)});await Promise.race([i,s]);try{await Promise.race([e.pluginManager.terminatePlugins(e),new Promise((a,c)=>setTimeout(()=>c(new Error("Plugin terminate timeout")),1e3))])}catch(a){console.error("\u274C Plugin terminate timeout:",a)}t.onStopped&&await t.onStopped(),o.emit("stopped"),e.server=null,console.log("\u2705 Graceful shutdown completed"),Te=!1}catch(i){throw Te=!1,console.error("\u26A0\uFE0F Shutdown error (forcing exit):",i),r&&typeof r.close=="function"&&r.close(),process.env.NODE_ENV==="development"&&(console.log("\u{1F504} Forcing exit for development restart..."),process.exit(0)),o.emit("error",i),i}}function ar(e){if(process.env.NODE_ENV==="development"){let r=()=>{console.log("\u{1F4E4} SIGINT received, forcing exit for development restart..."),process.exit(0)},o=()=>{console.log("\u{1F4E4} SIGTERM received, forcing exit for development restart..."),process.exit(0)};return process.on("SIGINT",r),process.on("SIGTERM",o),{unregister:()=>{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",o)}}}else{let r=()=>{console.log("\u{1F4E4} SIGINT received, starting graceful shutdown..."),e().catch(console.error)},o=()=>{console.log("\u{1F4E4} SIGTERM received, starting graceful shutdown..."),e().catch(console.error)};return process.on("SIGINT",r),process.on("SIGTERM",o),{unregister:()=>{process.removeListener("SIGINT",r),process.removeListener("SIGTERM",o)}}}}import{z as y}from"zod";var gn=y.custom(e=>e!==null&&typeof e=="object"&&"execute"in e&&typeof e.execute=="function",{message:"Expected middleware to have an execute function"}),hn=y.custom(e=>e!==null&&typeof e=="object"&&"register"in e&&typeof e.register=="function",{message:"Expected a valid plugin object with a register method"}),yn=y.object({enabled:y.boolean().optional().default(!0),keyFile:y.string().optional(),certFile:y.string().optional()}).refine(e=>e.enabled&&process.env.NODE_ENV==="production"?e.keyFile&&e.certFile:!0,{message:"When HTTP/2 is enabled (outside of development mode), both keyFile and certFile must be provided"}),Sn=y.object({headerName:y.string().regex(/^[a-z][a-z0-9-]*$/,{message:"Header name must start with a letter and contain only lowercase letters, numbers, and hyphens"}).optional(),generator:y.function().args().returns(y.string()).optional()}).optional(),wn=y.object({maxFileSize:y.number().positive().default(50*1024*1024),maxTotalSize:y.number().positive().default(100*1024*1024),maxFiles:y.number().positive().int().default(10),maxFieldSize:y.number().positive().default(1024*1024)}),vn=y.object({json:y.number().positive().default(512*1024),form:y.number().positive().default(1024*1024),text:y.number().positive().default(5*1024*1024),raw:y.number().positive().default(10*1024*1024),multipart:wn}),xn=y.object({includeHeaders:y.boolean().optional(),headerWhitelist:y.array(y.string().min(1)).optional(),includeQuery:y.boolean().optional()}).optional(),bn=y.object({level:y.enum(["debug","info","warn","error"]).optional(),transport:y.any().optional(),redactKeys:y.array(y.string().min(1)).optional(),includeTimestamp:y.boolean().optional(),requestLogging:y.boolean().optional(),requestLoggerOptions:xn}).optional(),Tn=y.object({port:y.number().int().positive().optional().default(3e3),host:y.string().optional().default("localhost"),routesDir:y.string().optional().default("./routes"),http2:yn.optional().default({enabled:!0}),middleware:y.array(gn).optional().default([]),plugins:y.array(hn).optional().default([]),correlation:Sn,cors:Ct,bodyLimits:vn,logging:bn});function cr(e){try{return Tn.parse(e)}catch(t){if(t instanceof y.ZodError){let r=t.format();throw new Error(`Invalid server options: ${JSON.stringify(r,null,2)}`)}throw new Error(`Invalid server options: ${String(t)}`)}}function lr(e={}){let{continueOnError:t=!0,onError:r}=e;function o(n,i,s){let a=`Plugin ${n.name} failed during ${i}: ${s.message}`;if(r?r(n,i,s):E.error(`[PluginLifecycle] ${a}`,{plugin:n.name,phase:i,error:{message:s.message,stack:s.stack,name:s.name}}),!t)throw new Error(a)}return{async initializePlugins(n){E.debug("[PluginLifecycle] Initializing plugins",{count:n.plugins.length});for(let i of n.plugins)if(i.initialize)try{E.debug("[PluginLifecycle] Initializing plugin",{plugin:i.name}),await i.initialize(n)}catch(s){o(i,"initialize",s)}E.info("[PluginLifecycle] Plugins initialized",{count:n.plugins.length,plugins:n.plugins.map(i=>i.name)})},async terminatePlugins(n){E.debug("[PluginLifecycle] Terminating plugins",{count:n.plugins.length});let i=[...n.plugins].reverse();for(let s of i)if(s.terminate)try{E.debug("[PluginLifecycle] Terminating plugin",{plugin:s.name}),await s.terminate(n)}catch(a){o(s,"terminate",a)}E.info("[PluginLifecycle] Plugins terminated",{count:i.length})},async onServerStart(n,i){E.debug("[PluginLifecycle] Notifying plugins of server start");for(let s of n.plugins)if(s.onServerStart)try{E.debug("[PluginLifecycle] Notifying plugin of server start",{plugin:s.name}),await s.onServerStart(i)}catch(a){o(s,"onServerStart",a)}},async onServerStop(n,i){E.debug("[PluginLifecycle] Notifying plugins of server stop...");let s=[...n.plugins].reverse();for(let a of s)if(a.onServerStop)try{E.debug(`[PluginLifecycle] Notifying plugin of server stop: ${a.name}`),await a.onServerStop(i)}catch(c){o(a,"onServerStop",c)}}}}var O=class extends Error{constructor(r,o){super(`Plugin validation error${r?` for "${r}"`:""}: ${o}`);this.pluginName=r;this.name="PluginValidationError"}};var En=new Set(["core","server","router","middleware","context","blaize","blaizejs"]),Cn=/^[a-z]([a-z0-9-]*[a-z0-9])?$/,Rn=/^\d+\.\d+\.\d+(?:-[a-zA-Z0-9-.]+)?(?:\+[a-zA-Z0-9-.]+)?$/;function We(e,t={}){let{requireVersion:r=!0,validateNameFormat:o=!0,checkReservedNames:n=!0}=t;if(!e||typeof e!="object")throw new O("","Plugin must be an object");let i=e;if(!i.name||typeof i.name!="string")throw new O("","Plugin must have a name (string)");if(o&&!Cn.test(i.name))throw new O(i.name,"Plugin name must be lowercase letters, numbers, and hyphens only");if(n&&En.has(i.name.toLowerCase()))throw new O(i.name,`Plugin name "${i.name}" is reserved`);if(r){if(!i.version||typeof i.version!="string")throw new O(i.name,"Plugin must have a version (string)");if(!Rn.test(i.version))throw new O(i.name,'Plugin version must follow semantic versioning (e.g., "1.0.0")')}if(!i.register||typeof i.register!="function")throw new O(i.name,"Plugin must have a register method (function)");let s=["initialize","terminate","onServerStart","onServerStop"];for(let a of s)if(i[a]&&typeof i[a]!="function")throw new O(i.name,`Plugin ${a} must be a function if provided`)}import*as dr from"node:crypto";import*as pr from"node:fs/promises";async function Pn(e){let t=`?t=${Date.now()}`,r=e+t;try{let o=await import(r);return console.log("\u2705 Successfully imported module"),o}catch(o){let n=o instanceof Error?o.message:String(o);return console.log("\u26A0\uFE0F Error importing with cache buster, trying original path:",n),import(e)}}async function ur(e,t){try{let r=ge(e,t),o=await Pn(e);console.log("\u{1F4E6} Module exports:",Object.keys(o));let n=[];if(o.default&&typeof o.default=="object"){let i={...o.default,path:r.routePath};n.push(i)}return Object.entries(o).forEach(([i,s])=>{if(i==="default"||!s||typeof s!="object")return;let a=s;if(Mn(a)){let c={...a,path:r.routePath};n.push(c)}}),n.length===0?(console.warn(`Route file ${e} does not export any valid route definitions`),[]):(console.log(`\u2705 Successfully Loaded ${n.length} route(s)`),n)}catch(r){return console.error(`Failed to load route module ${e}:`,r),[]}}function Mn(e){return!e||typeof e!="object"?!1:["GET","POST","PUT","DELETE","PATCH","HEAD","OPTIONS"].some(o=>e[o]&&typeof e[o]=="object"&&e[o].handler)}var ie=new Map;async function se(e,t,r=!0){let n=(await pr.stat(e)).mtime.getTime(),i=ie.get(e);if(r&&i&&i.timestamp===n)return i.routes;let s=await ur(e,t);if(r){let a=mr(s);ie.set(e,{routes:s,timestamp:n,hash:a})}return s}function fr(e,t){let r=ie.get(e);if(!r)return!0;let o=mr(t);return r.hash!==o}function Qe(e){e?ie.delete(e):ie.clear()}function mr(e){let t=e.map(n=>({path:n.path,methods:Object.keys(n).filter(i=>i!=="path").sort().map(i=>{let s=n[i],a=s?.handler?s.handler.toString():null;return{method:i,handler:a,middleware:s?.middleware?s.middleware.length:0,hasSchema:!!s?.schema,schemaKeys:s?.schema?Object.keys(s.schema).sort():[]}})})),r=JSON.stringify(t);return dr.createHash("md5").update(r).digest("hex")}import*as hr from"node:os";import*as Ee from"node:fs/promises";import*as Q from"node:path";async function gr(e,t={}){let r=Q.isAbsolute(e)?e:Q.resolve(process.cwd(),e);console.log("Creating router with routes directory:",r);try{if(!(await Ee.stat(r)).isDirectory())throw new Error(`Route directory is not a directory: ${r}`)}catch(s){throw s.code==="ENOENT"?new Error(`Route directory not found: ${r}`):s}let o=[],n=t.ignore||["node_modules",".git"];async function i(s){let a=await Ee.readdir(s,{withFileTypes:!0});for(let c of a){let l=Q.join(s,c.name);c.isDirectory()&&n.includes(c.name)||(c.isDirectory()?await i(l):zn(c.name)&&o.push(l))}}return await i(r),o}function zn(e){return!e.startsWith("_")&&(e.endsWith(".ts")||e.endsWith(".js"))}async function Ln(e,t,r=Math.max(1,Math.floor(hr.cpus().length/2))){let o=kn(e,r),n=[];for(let i of o){let a=(await Promise.allSettled(i.map(c=>t(c)))).filter(c=>c.status==="fulfilled").map(c=>c.value);n.push(...a)}return n}async function yr(e){let t=await gr(e);return(await Ln(t,o=>se(o,e))).flat()}function kn(e,t){let r=[];for(let o=0;o<e.length;o+=t)r.push(e.slice(o,o+t));return r}var N={fileChanges:0,totalReloadTime:0,averageReloadTime:0,slowReloads:[]};function Sr(e,t){let r=Date.now()-t;if(N.fileChanges++,N.totalReloadTime+=r,N.averageReloadTime=N.totalReloadTime/N.fileChanges,r>100&&(N.slowReloads.push({file:e,time:r}),N.slowReloads.length>10&&N.slowReloads.shift()),process.env.NODE_ENV==="development"){let o=r<50?"\u26A1":r<100?"\u{1F504}":"\u{1F40C}";console.log(`${o} Route reload: ${e} (${r}ms)`)}}function Ge(e,t){return console.log(`Tracking performance for: ${t}`),async(...r)=>{let o=Date.now();try{let n=await e(...r);return Sr(t,o),n}catch(n){throw Sr(t,o),n}}}import*as Ze from"node:path";import{watch as On}from"chokidar";function Je(e,t={}){let r=t.debounceMs||16,o=new Map;function n(u,h){return(...w)=>{let x=o.get(h);x&&clearTimeout(x);let d=setTimeout(()=>{u(...w),o.delete(h)},r);o.set(h,d)}}let i=new Map;async function s(u){try{let h=i.get(u),w=await se(u,e,!1);if(!w||w.length===0||h&&!fr(u,w))return;await se(u,e,!0);let x=Ze.normalize(u);h?(i.set(u,w),t.onRouteChanged&&t.onRouteChanged(x,w)):(i.set(u,w),t.onRouteAdded&&t.onRouteAdded(x,w))}catch(h){console.log(`\u26A0\uFE0F Error processing file ${u}:`,h),c(h)}}function a(u){let h=Ze.normalize(u),w=i.get(h);w&&w.length>0&&t.onRouteRemoved&&t.onRouteRemoved(h,w),i.delete(h)}function c(u){t.onError&&u instanceof Error?t.onError(u):console.error("\u26A0\uFE0F Route watcher error:",u)}let l=On(e,{ignoreInitial:!0,awaitWriteFinish:{stabilityThreshold:50,pollInterval:10},usePolling:!1,atomic:!0,followSymlinks:!1,depth:10,ignored:[/(^|[/\\])\../,/node_modules/,/\.git/,/\.DS_Store/,/Thumbs\.db/,/\.(test|spec)\.(ts|js)$/,/\.d\.ts$/,/\.map$/,/~$/,...t.ignore||[]]});return l.on("add",u=>{n(s,u)(u)}).on("change",u=>{n(s,u)(u)}).on("unlink",u=>{n(a,u)(u)}).on("error",c),{close:()=>(o.forEach(u=>clearTimeout(u)),o.clear(),l.close()),getRoutes:()=>{let u=[];for(let h of i.values())u.push(...h);return u},getRoutesByFile:()=>new Map(i)}}import{z as Dn}from"zod";import{z as _n}from"zod";function Ke(e,t){return t instanceof _n.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Fn}from"zod";function Ye(e,t){return t instanceof Fn.ZodObject?t.strict().parse(e):t.parse(e)}import{z as An}from"zod";function Xe(e,t){return t instanceof An.ZodObject?t.strict().parse(e):t.parse(e)}import{z as Bn}from"zod";function et(e,t){return t instanceof Bn.ZodObject?t.strict().parse(e):t.parse(e)}function tt(e,t=!1){return P({name:"RequestValidator",debug:t,handler:async(r,o,n)=>{if(e.params&&r.request.params)try{r.request.params=Ye(r.request.params,e.params)}catch(i){let s=Ce(i),a=s.reduce((c,l)=>c+l.messages.length,0);throw new M("Request validation failed",{fields:s,errorCount:a,section:"params"})}if(e.query&&r.request.query)try{r.request.query=Xe(r.request.query,e.query)}catch(i){let s=Ce(i),a=s.reduce((c,l)=>c+l.messages.length,0);throw new M("Request validation failed",{fields:s,errorCount:a,section:"query"})}if(e.body)try{r.request.body=Ke(r.request.body,e.body)}catch(i){let s=Ce(i),a=s.reduce((c,l)=>c+l.messages.length,0);throw new M("Request validation failed",{fields:s,errorCount:a,section:"body"})}await o()}})}function Nn(e){return e!==null&&typeof e=="object"&&"type"in e&&"status"in e&&"correlationId"in e&&"timestamp"in e}function rt(e){return P({name:"ResponseValidator",handler:async(t,r)=>{let o=t.response.json,n=!0;t.response.json=(i,s)=>{if(!n||Nn(i))return o.call(t.response,i,s);try{let a=et(i,e);return o.call(t.response,a,s)}catch(a){throw n=!1,new G("Response validation failed",{validationError:Ce(a),hint:"The handler returned data that does not match the response schema"})}};try{await r()}catch(i){throw n=!1,t.response.json=o,i}finally{t.response.json=o}}})}function Ce(e){if(e instanceof Dn.ZodError){let t=new Map;for(let r of e.issues){let o=r.path.length>0?r.path.join("."):"root";t.has(o)||t.set(o,[]),t.get(o).push(r.message)}return Array.from(t.entries()).map(([r,o])=>({field:r,messages:o}))}return e instanceof Error?[{field:"unknown",messages:[e.message]}]:[{field:"unknown",messages:[String(e)]}]}async function ot(e,t,r,o){let n=[...t.middleware||[]];t.schema&&((t.schema.params||t.schema.query||t.schema.body)&&n.unshift(tt(t.schema)),t.schema.response&&n.push(rt(t.schema.response))),await V([...n])(e,async()=>{let s=o.child({route:e.request.path,method:e.request.method}),a=await t.handler(e,r,s);!e.response.sent&&a!==void 0&&e.response.json(a)},o)}function wr(){return{routesByPath:new Map,routesByFile:new Map,pathToFile:new Map}}function $(e,t,r){console.log(`Updating routes from file: ${t}`);let o=e.routesByFile.get(t)||new Set,n=new Set(r.map(l=>l.path)),i=r.filter(l=>!o.has(l.path)),s=Array.from(o).filter(l=>!n.has(l)),c=r.filter(l=>o.has(l.path)).filter(l=>{let u=e.routesByPath.get(l.path);return!u||!In(u,l)});return $n(e,t,{added:i,removed:s,changed:c}),{added:i,removed:s,changed:c}}function vr(e){return Array.from(e.routesByPath.values())}function $n(e,t,r){let{added:o,removed:n,changed:i}=r;n.forEach(a=>{e.routesByPath.delete(a),e.pathToFile.delete(a)}),[...o,...i].forEach(a=>{e.routesByPath.set(a.path,a),e.pathToFile.set(a.path,t)});let s=new Set([...o.map(a=>a.path),...i.map(a=>a.path),...Array.from(e.routesByFile.get(t)||[]).filter(a=>!n.includes(a))]);s.size>0?e.routesByFile.set(t,s):e.routesByFile.delete(t)}function In(e,t){if(e.path!==t.path)return!1;let r=Object.keys(e).filter(n=>n!=="path").sort(),o=Object.keys(t).filter(n=>n!=="path").sort();return r.length!==o.length?!1:r.every(n=>{let i=e[n],s=t[n];return typeof i==typeof s})}function nt(e,t){Object.entries(e).forEach(([r,o])=>{r==="path"||!o||t.add(e.path,r,o)})}function ae(e,t){"remove"in t&&typeof t.remove=="function"?t.remove(e):console.warn("Matcher does not support selective removal, consider adding remove() method")}function xr(e,t){ae(e.path,t),nt(e,t)}var Hn={routesDir:"./routes",basePath:"/",watchMode:process.env.NODE_ENV==="development"};function br(e){let t={...Hn,...e};e.basePath&&!e.basePath.startsWith("/")&&console.warn("Base path does nothing");let r=wr(),o=ee(),n=!1,i=null,s=null,a=new Set([t.routesDir]);function c(d){console.log(`
44
+ \u{1F527} APPLYING MATCHER CHANGES:`),console.log(` Adding ${d.added.length} routes`),console.log(` Removing ${d.removed.length} routes`),console.log(` Updating ${d.changed.length} routes`),d.removed.forEach(p=>{console.log(` \u2796 Removing: ${p}`),ae(p,o)}),d.added.forEach(p=>{let g=Object.keys(p).filter(f=>f!=="path");console.log(` \u2795 Adding: ${p.path} [${g.join(", ")}]`),nt(p,o)}),d.changed.forEach(p=>{let g=Object.keys(p).filter(f=>f!=="path");console.log(` \u{1F504} Updating: ${p.path} [${g.join(", ")}]`),xr(p,o)}),console.log(`\u2705 Matcher changes applied
45
+ `)}function l(d,p){try{let g=$(r,p,d);return c(g),g}catch(g){throw console.error(`\u26A0\uFE0F Route conflicts from ${p}:`,g),g}}async function u(d,p,g){try{let f=await yr(d),m=f.map(C=>g?{...C,path:`${g}${C.path}`}:C),v=l(m,p);console.log(`Loaded ${f.length} routes from ${p}${g?` with prefix ${g}`:""} (${v.added.length} added, ${v.changed.length} changed, ${v.removed.length} removed)`)}catch(f){throw console.error(`\u26A0\uFE0F Failed to load routes from ${p}:`,f),f}}async function h(){return n||i||(i=(async()=>{try{await Promise.all(Array.from(a).map(d=>u(d,d))),t.watchMode&&w(),n=!0}catch(d){throw console.error("\u26A0\uFE0F Failed to initialize router:",d),d}})()),i}function w(){s||(s=new Map);for(let d of a)if(!s.has(d)){let p=Je(d,{debounceMs:16,ignore:["node_modules",".git"],onRouteAdded:(g,f)=>{try{let m=$(r,g,f);c(m)}catch(m){console.error(`Error adding routes from ${d}:`,m)}},onRouteChanged:Ge(async(g,f)=>{try{console.log(`Processing changes for ${g}`);let m=$(r,g,f);console.log(`Changes detected: ${m.added.length} added, ${m.changed.length} changed, ${m.removed.length} removed`),c(m),console.log(`Route changes applied: ${m.added.length} added, ${m.changed.length} changed, ${m.removed.length} removed`)}catch(m){console.error(`\u26A0\uFE0F Error updating routes from ${d}:`,m)}},d),onRouteRemoved:(g,f)=>{console.log(`File removed: ${g} with ${f.length} routes`);try{f.forEach(m=>{ae(m.path,o)}),Qe(g)}catch(m){console.error(`\u26A0\uFE0F Error removing routes from ${g}:`,m)}},onError:g=>{console.error(`\u26A0\uFE0F Route watcher error for ${d}:`,g)}});s.set(d,p)}}function x(d,p){s||(s=new Map);let g=Je(d,{debounceMs:16,ignore:["node_modules",".git"],onRouteAdded:(f,m)=>{try{let v=m.map(_=>p?{..._,path:`${p}${_.path}`}:_),C=$(r,f,v);c(C)}catch(v){console.error(`\u26A0\uFE0F Error adding routes from ${d}:`,v)}},onRouteChanged:Ge(async(f,m)=>{try{let v=m.map(_=>p?{..._,path:`${p}${_.path}`}:_),C=$(r,f,v);c(C)}catch(v){console.error(`\u26A0\uFE0F Error updating routes from ${d}:`,v)}},d),onRouteRemoved:(f,m)=>{try{m.forEach(v=>{let C=p?`${p}${v.path}`:v.path;ae(C,o)}),Qe(f)}catch(v){console.error(`Error removing routes from ${f}:`,v)}},onError:f=>{console.error(`\u26A0\uFE0F Route watcher error for ${d}:`,f)}});return s.set(d,g),g}return h().catch(d=>{console.error("\u26A0\uFE0F Failed to initialize router on creation:",d)}),{async handleRequest(d,p){n||(console.log("\u{1F504} Router not initialized, initializing..."),await h());let{method:g,path:f}=d.request;console.log(`
46
+ \u{1F4E5} Handling request: ${g} ${f}`);let m=o.match(f,g);if(!m)throw console.log(`\u274C No match found for: ${g} ${f}`),new j("Not found");if(console.log(`\u2705 Route matched: ${g} ${f}`),console.log(` Params: ${JSON.stringify(m.params)}`),m.methodNotAllowed){d.response.status(405).json({error:"\u274C Method Not Allowed",allowed:m.allowedMethods}),m.allowedMethods&&m.allowedMethods.length>0&&d.response.header("Allow",m.allowedMethods.join(", "));return}d.request.params=m.params,await ot(d,m.route,m.params,p)},getRoutes(){return vr(r)},addRoute(d){let p=$(r,"programmatic",[d]);c(p)},addRoutes(d){let p=$(r,"programmatic",d);return c(p),p},async addRouteDirectory(d,p={}){if(a.has(d)){console.warn(`Route directory ${d} already registered`);return}a.add(d),n&&(await u(d,d,p.prefix),t.watchMode&&x(d,p.prefix))},getRouteConflicts(){return[]},async close(){if(s){for(let d of s.values())await d.close();s.clear()}}}}var R={port:3e3,host:"localhost",routesDir:"./routes",http2:{enabled:!0},middleware:[],plugins:[],bodyLimits:{json:512*1024,form:1024*1024,text:5*1024*1024,raw:10*1024*1024,multipart:{maxFileSize:50*1024*1024,maxTotalSize:100*1024*1024,maxFiles:10,maxFieldSize:1024*1024}}};function Un(e={}){let t={port:e.port??R.port,host:e.host??R.host,routesDir:e.routesDir??R.routesDir,http2:{enabled:e.http2?.enabled??R.http2.enabled,keyFile:e.http2?.keyFile,certFile:e.http2?.certFile},middleware:e.middleware??R.middleware,plugins:e.plugins??R.plugins,correlation:e.correlation,cors:e.cors,bodyLimits:e.bodyLimits?{json:e.bodyLimits.json??R.bodyLimits.json,form:e.bodyLimits.form??R.bodyLimits.form,text:e.bodyLimits.text??R.bodyLimits.text,raw:e.bodyLimits.raw??R.bodyLimits.raw,multipart:{maxFileSize:e.bodyLimits.multipart?.maxFileSize??R.bodyLimits.multipart.maxFileSize,maxTotalSize:e.bodyLimits.multipart?.maxTotalSize??R.bodyLimits.multipart.maxTotalSize,maxFiles:e.bodyLimits.multipart?.maxFiles??R.bodyLimits.multipart.maxFiles,maxFieldSize:e.bodyLimits.multipart?.maxFieldSize??R.bodyLimits.multipart.maxFieldSize}}:R.bodyLimits,logging:e.logging||R.logging};try{let r=cr(t);return Lt({routesDir:r.routesDir}),r}catch(r){throw r instanceof Error?new Error(`Failed to create server: ${r.message}`):new Error(`Failed to create server: ${String(r)}`)}}function Vn(e){e.correlation&&pt(e.correlation.headerName,e.correlation.generator)}function Wn(e,t){return async()=>(Vn(t),await Qn(e),await e.pluginManager.initializePlugins(e),await ir(e,t),await e.pluginManager.onServerStart(e,e.server),Gn(e),e)}async function Qn(e){for(let t of e.plugins)await t.register(e)}function Gn(e){let t=ar(()=>e.close());e._signalHandlers=t,e.events.emit("started")}function Zn(e){return async t=>{if(!e.server)return;let r={...t};e._signalHandlers&&(e._signalHandlers.unregister(),delete e._signalHandlers),await sr(e,r)}}function Jn(e){return t=>{let r=Array.isArray(t)?t:[t];return e.middleware.push(...r),e}}function Kn(e){return async t=>{if(Array.isArray(t))for(let r of t)We(r),e.plugins.push(r),await r.register(e);else We(t),e.plugins.push(t),await t.register(e);return e}}function it(e={}){let t=Un(e),{port:r,host:o,middleware:n,plugins:i,cors:s,bodyLimits:a}=t,c=F(t.logging||{});pe(t.logging||{});let l=Array.isArray(n)?[...n]:[],u=Array.isArray(i)?[...i]:[],h=new qn,w=br({routesDir:t.routesDir,watchMode:process.env.NODE_ENV==="development"}),x=lr({continueOnError:!0}),d=new jn,p={server:null,port:r,host:o,context:h,events:d,plugins:[...u],middleware:[...l],corsOptions:s,bodyLimits:a,_signalHandlers:{unregister:()=>{}},_logger:c,use:()=>p,register:async()=>p,listen:async()=>p,close:async()=>{},router:w,pluginManager:x};return p.listen=Wn(p,t),p.close=Zn(p),p.use=Jn(p),p.register=Kn(p),p}function Tr(e){return{}}function Wc(e){return typeof e=="object"&&e!==null&&"name"in e&&"execute"in e&&typeof e.name=="string"&&typeof e.execute=="function"}function Qc(e){return typeof e=="object"&&e!==null&&"name"in e&&"version"in e&&"register"in e&&typeof e.name=="string"&&typeof e.version=="string"&&typeof e.register=="function"}function Gc(e){return e}function Zc(e){return e}function Jc(...e){return e}function Kc(...e){return e}var st=class extends b{constructor(t,r=void 0,o=void 0){super("UNAUTHORIZED",t,401,o??S(),r)}};var at=class extends b{constructor(t,r=void 0,o=void 0){super("CONFLICT",t,409,o??S(),r)}};var ct=class extends b{constructor(t,r=void 0,o=void 0){super("RATE_LIMITED",t,429,o??S(),r)}};var lt=class extends b{constructor(t,r,o){super("UPLOAD_TIMEOUT",t,408,o??S(),r)}};var ut=class extends b{constructor(t,r,o){super("UNPROCESSABLE_ENTITY",t,422,o??S(),r)}};var dt=class extends b{constructor(t,r=void 0,o=void 0){super("SERVICE_UNAVAILABLE",t,503,o??S(),r)}};var Yn=mt.version,Xn={createServer:it,inferContext:Tr},ei={createDeleteRoute:$e,createGetRoute:Be,createHeadRoute:He,createOptionsRoute:qe,createPatchRoute:Ie,createPostRoute:De,createPutRoute:Ne,createRouteFactory:Dt,createMatcher:ee,extractParams:W,compilePathPattern:X,paramsToQuery:we,buildUrl:je},ti={createMiddleware:P,createServiceMiddleware:ze,createStateMiddleware:Me,compose:V,cors:fe,requestLoggerMiddleware:zt},ri={createPlugin:_e},Vl={createServer:it,createMiddleware:P,createServiceMiddleware:ze,createStateMiddleware:Me,createPlugin:_e,getCorrelationId:S,configureGlobalLogger:pe,createLogger:F,logger:E,Server:Xn,Router:ei,Middleware:ti,Plugins:ri,VERSION:Yn};export{Vl as Blaize,b as BlaizeError,at as ConflictError,D as ConsoleTransport,oi as ErrorSeverity,k as ErrorType,J as ForbiddenError,G as InternalServerError,U as JSONTransport,Z as Logger,ti as MiddlewareAPI,j as NotFoundError,de as NullTransport,H as PayloadTooLargeError,ri as PluginsAPI,ct as RateLimitError,lt as RequestTimeoutError,ei as RouterAPI,Xn as ServerAPI,dt as ServiceNotAvailableError,st as UnauthorizedError,ut as UnprocessableEntityError,le as UnsupportedMediaTypeError,Yn as VERSION,M as ValidationError,Gc as asMiddlewareArray,Zc as asPluginArray,je as buildUrl,X as compilePathPattern,V as compose,pe as configureGlobalLogger,fe as cors,$e as createDeleteRoute,Be as createGetRoute,He as createHeadRoute,F as createLogger,ee as createMatcher,P as createMiddleware,Jc as createMiddlewareArray,qe as createOptionsRoute,Ie as createPatchRoute,_e as createPlugin,Kc as createPluginArray,De as createPostRoute,Ne as createPutRoute,Dt as createRouteFactory,it as createServer,ze as createServiceMiddleware,Me as createStateMiddleware,W as extractParams,S as getCorrelationId,Tr as inferContext,Wc as isMiddleware,Qc as isPlugin,E as logger,we as paramsToQuery,zt as requestLoggerMiddleware};
46
47
  //# sourceMappingURL=index.js.map