@stacksjs/bun-router 0.1.9 → 0.1.10

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.
package/dist/cli.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- import{K}from"./chunk-trm3jyqk.js";import g from"process";import{CLI as ue}from"@stacksjs/clapp";var F="0.1.9";import f from"fs/promises";import I from"path";import T from"process";var p={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m"},o={red:(e)=>`${p.red}${e}${p.reset}`,green:(e)=>`${p.green}${e}${p.reset}`,yellow:(e)=>`${p.yellow}${e}${p.reset}`,blue:(e)=>`${p.blue}${e}${p.reset}`,cyan:(e)=>`${p.cyan}${e}${p.reset}`,white:(e)=>`${p.white}${e}${p.reset}`,gray:(e)=>`${p.gray}${e}${p.reset}`,bold:(e)=>`${p.bold}${e}${p.reset}`,dim:(e)=>`${p.dim}${e}${p.reset}`,hex:(e)=>(t)=>t};async function v(e){let t=Object.entries(K).map(([n,c])=>({name:n,className:c.constructor.name})),r=`/**
3
+ import{K}from"./chunk-trm3jyqk.js";import g from"process";import{CLI as ue}from"@stacksjs/clapp";var F="0.1.10";import f from"fs/promises";import I from"path";import T from"process";var p={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",cyan:"\x1B[36m",white:"\x1B[37m",gray:"\x1B[90m"},o={red:(e)=>`${p.red}${e}${p.reset}`,green:(e)=>`${p.green}${e}${p.reset}`,yellow:(e)=>`${p.yellow}${e}${p.reset}`,blue:(e)=>`${p.blue}${e}${p.reset}`,cyan:(e)=>`${p.cyan}${e}${p.reset}`,white:(e)=>`${p.white}${e}${p.reset}`,gray:(e)=>`${p.gray}${e}${p.reset}`,bold:(e)=>`${p.bold}${e}${p.reset}`,dim:(e)=>`${p.dim}${e}${p.reset}`,hex:(e)=>(t)=>t};async function v(e){let t=Object.entries(K).map(([n,c])=>({name:n,className:c.constructor.name})),r=`/**
4
4
  * This file is auto-generated.
5
5
  * DO NOT EDIT THIS FILE DIRECTLY.
6
6
  * To update, run 'bun router middleware:types'
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{he,ft,e,me,V,ge,Ne,qe,He,Be,je,p,r,h,k,W,m,n,fe,g,Ue,Le,_e,l,A,O,I,yt,G,F,f,y,ze,w,Ve,C,a,We,Ge,Ke,Je,Xe,S,b,Ye,D,Qe,N,Ze,q,et,H,tt,R,rt,B,nt,wt,bt,Rt,vt,xt,Tt,K}from"./chunk-trm3jyqk.js";import{t,u,J,X,Y,Q,v,Z,ee,te,re,x,T,ne,se,ie,s,E,d,oe,j,ae,ce,st,it,ot,o,L,ye,we,be,_,le,ue}from"./chunk-7g1et0fb.js";var Os=Object.defineProperty;var $s=(i)=>i;function Bs(i,c){this[i]=$s.bind(null,c)}var Ds=(i,c)=>{for(var P in c)Os(i,P,{get:c[P],enumerable:!0,configurable:!0,set:Bs.bind(c,P)})};import{timingSafeEqual as Fs}from"crypto";function kr(i){return btoa(i).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function ar(i){i=i.replace(/-/g,"+").replace(/_/g,"/");while(i.length%4)i+="=";return atob(i)}class rn{secret;constructor(i){this.secret=i}sign(i,c={}){let P={alg:c.algorithm||"HS256",typ:"JWT",...c.header},M=Math.floor(Date.now()/1000),U={...i,iat:M};if(c.expiresIn){let Te=typeof c.expiresIn==="string"?this.parseTimespan(c.expiresIn):c.expiresIn;U.exp=M+Te}if(c.notBefore){let Te=typeof c.notBefore==="string"?this.parseTimespan(c.notBefore):c.notBefore;U.nbf=M+Te}if(c.issuer)U.iss=c.issuer;if(c.subject)U.sub=c.subject;if(c.audience)U.aud=c.audience;if(c.jwtid)U.jti=c.jwtid;let z=kr(JSON.stringify(P)),de=kr(JSON.stringify(U)),pe=`${z}.${de}`,Re=this.createSignature(pe,this.secret,P.alg);return`${pe}.${Re}`}verify(i,c={}){try{let P=i.split(".");if(P.length!==3)throw Error("Token structure invalid");let[M,U,z]=P,de=JSON.parse(ar(M)),pe=JSON.parse(ar(U));if(c.algorithms&&!c.algorithms.includes(de.alg))throw Error(`Algorithm ${de.alg} not allowed`);let Re=`${M}.${U}`,Te=this.createSignature(Re,this.secret,de.alg),xe=Buffer.from(z),ve=Buffer.from(Te);if(xe.length!==ve.length||!Fs(xe,ve))throw Error("Invalid signature");let Ce=Math.floor(Date.now()/1000);if(pe.exp&&!c.ignoreExpiration&&Ce>=pe.exp)throw Error("Token expired");if(pe.nbf&&Ce<pe.nbf)throw Error("Token not active yet");if(pe.iat&&pe.iat>Ce)throw Error("Token used before issued");if(c.issuer&&pe.iss!==c.issuer)throw Error("Invalid issuer");if(c.audience&&pe.aud!==c.audience)throw Error("Invalid audience");if(c.subject&&pe.sub!==c.subject)throw Error("Invalid subject");return pe}catch{return null}}decode(i){try{let c=i.split(".");if(c.length!==3)return null;let[P,M]=c;return{header:JSON.parse(ar(P)),payload:JSON.parse(ar(M))}}catch{return null}}createSignature(i,c,P){return kr(JSON.stringify({data:i,secret:c.slice(0,5),alg:P}))}parseTimespan(i){let c=i.match(/^(\d+)\s*([smhd])$/i);if(!c)return Number.parseInt(i,10)||0;let P=Number.parseInt(c[1],10);switch(c[2].toLowerCase()){case"s":return P;case"m":return P*60;case"h":return P*60*60;case"d":return P*24*60*60;default:return P}}}class nn{keys;options;constructor(i={}){this.keys=new Map,this.options={source:"header",keyName:"X-API-Key",keyPrefix:"bun_",...i}}generateKey(i,c=[],P){let M=`${this.options.keyPrefix}${this.randomString(32)}`;return this.keys.set(M,{owner:i,scopes:c,expiresAt:P?new Date(Date.now()+P*1000):void 0}),M}validateKey(i,c=[]){let P=this.keys.get(i);if(!P)return!1;if(P.expiresAt&&P.expiresAt<new Date)return!1;if(c.length>0)return c.every((M)=>P.scopes.includes(M));return!0}getKeyInfo(i){return this.keys.get(i)||null}revokeKey(i){return this.keys.delete(i)}extractFromRequest(i){let{source:c,keyName:P}=this.options;switch(c){case"header":return i.headers.get(P||"X-API-Key")||null;case"query":return new URL(i.url).searchParams.get(P||"api_key")||null;case"cookie":if(i.cookies){let M=P||"api_key";if(typeof i.cookies.get==="function")return i.cookies.get(M)||null;return i.cookies[M]||null}return null;default:return null}}randomString(i){let P="";for(let M=0;M<i;M++)P+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(Math.random()*62));return P}}class sn{config;constructor(i){this.config=i}getAuthorizationUrl(i={}){let c=new URLSearchParams({client_id:this.config.clientId,redirect_uri:this.config.redirectUri,response_type:"code",...i});if(this.config.scope)c.set("scope",this.config.scope);if(this.config.state)c.set("state",this.config.state);return`${this.config.authorizeUrl}?${c.toString()}`}async exchangeCodeForToken(i){let c=new URLSearchParams({grant_type:"authorization_code",code:i,redirect_uri:this.config.redirectUri,client_id:this.config.clientId,client_secret:this.config.clientSecret}),P=await fetch(this.config.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:c.toString()});if(!P.ok)throw Error(`OAuth token exchange failed: ${P.status} ${P.statusText}`);return await P.json()}async refreshToken(i){let c=new URLSearchParams({grant_type:"refresh_token",refresh_token:i,client_id:this.config.clientId,client_secret:this.config.clientSecret}),P=await fetch(this.config.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:c.toString()});if(!P.ok)throw Error(`OAuth token refresh failed: ${P.status} ${P.statusText}`);return await P.json()}}var Ns={JWT:rn,ApiKeyManager:nn,OAuth2Helper:sn},Us=Ns;var ln={};Ds(ln,{AuthenticationException:()=>J,AuthorizationException:()=>X,BugsnagReporter:()=>qr,BusinessLogicException:()=>ne,CircuitBreaker:()=>ur,CircuitBreakerHttpClient:()=>on,CircuitBreakerOpenException:()=>T,CircuitBreakerPresets:()=>js,CircuitBreakerRegistry:()=>Ft,CircularDependencyException:()=>d,ConfigurationException:()=>se,CustomReporter:()=>an,DatabaseException:()=>re,DegradationStrategies:()=>Js,ErrorFactory:()=>s,ErrorReportingManager:()=>Vt,ErrorReportingPresets:()=>Ws,ExternalServiceException:()=>x,FileSystemException:()=>ie,GracefulDegradationManager:()=>Jt,HandlerResolutionException:()=>ae,InternalServerException:()=>ee,MethodNotAllowedException:()=>Q,MiddlewareConfigurationException:()=>oe,ModelBindingException:()=>ce,NotFoundException:()=>Y,RateLimitException:()=>Z,RouteConflictException:()=>E,RouteNotFoundException:()=>j,RouterErrorFactory:()=>ot,RouterException:()=>t,SentryReporter:()=>Ar,ServiceHealthMonitor:()=>Or,ServiceUnavailableException:()=>te,TimeoutException:()=>v,ValidationException:()=>u,circuitBreaker:()=>Is,createAdvancedErrorHandler:()=>cn,createCircuitBreaker:()=>Ls,createCircuitBreakerMiddleware:()=>_s,createErrorReporting:()=>Gs,createGracefulDegradationMiddleware:()=>Vs,detectRouteConflicts:()=>it,findSimilarRoutes:()=>st,globalCircuitBreakerRegistry:()=>Hr,withCircuitBreaker:()=>zs});class ur{config;state="CLOSED";metrics;nextAttemptTime;halfOpenCallCount=0;recentRequests=[];constructor(i){let c={failureThreshold:5,recoveryTimeout:60000,timeout:30000,monitoringPeriod:60000,minimumRequests:10,errorThresholdPercentage:50,halfOpenMaxCalls:3,resetTimeout:60000};this.config={...c,...i},this.metrics={totalRequests:0,successfulRequests:0,failedRequests:0,timeouts:0,averageResponseTime:0,state:this.state,consecutiveFailures:0,consecutiveSuccesses:0},setInterval(()=>this.cleanupOldRequests(),this.config.monitoringPeriod/4).unref?.()}async execute(i){if(this.state==="OPEN")if(this.nextAttemptTime&&new Date<this.nextAttemptTime){let U=new T(this.config.name,this.nextAttemptTime,i.context);if(i.fallback)try{return await i.fallback()}catch(z){console.error(z)}throw U}else this.transitionToHalfOpen();if(this.state==="HALF_OPEN"&&this.halfOpenCallCount>=this.config.halfOpenMaxCalls){let U=new T(this.config.name,this.nextAttemptTime||new Date(Date.now()+this.config.recoveryTimeout),i.context);if(i.fallback)try{return await i.fallback()}catch(z){throw console.error(z),U}throw U}let c=Date.now(),P,M=null;try{if(this.state==="HALF_OPEN")this.halfOpenCallCount++;let U=i.timeout||this.config.timeout,z=new Promise((de,pe)=>{setTimeout(()=>{pe(new v(`Circuit breaker timeout for ${this.config.name}`,U,i.context))},U)});return P=await Promise.race([i.execute(),z]),this.onSuccess(Date.now()-c),P}catch(U){if(M=U,this.onFailure(M,Date.now()-c),i.fallback)try{return await i.fallback()}catch(z){throw console.error(z),M}else throw M}}getState(){return this.state}getMetrics(){return{...this.metrics,state:this.state,nextAttemptTime:this.nextAttemptTime}}forceOpen(){this.transitionToOpen()}forceClosed(){this.transitionToClosed()}reset(){this.metrics={totalRequests:0,successfulRequests:0,failedRequests:0,timeouts:0,averageResponseTime:0,state:this.state,consecutiveFailures:0,consecutiveSuccesses:0},this.recentRequests=[]}onSuccess(i){if(this.metrics.totalRequests++,this.metrics.successfulRequests++,this.metrics.consecutiveSuccesses++,this.metrics.consecutiveFailures=0,this.metrics.lastSuccessTime=new Date,this.updateAverageResponseTime(i),this.recentRequests.push({timestamp:new Date,success:!0,responseTime:i}),this.state==="HALF_OPEN"){if(this.metrics.consecutiveSuccesses>=this.config.halfOpenMaxCalls)this.transitionToClosed()}if(this.config.onSuccess)this.config.onSuccess(this.config.name)}onFailure(i,c){if(this.metrics.totalRequests++,this.metrics.failedRequests++,this.metrics.consecutiveFailures++,this.metrics.consecutiveSuccesses=0,this.metrics.lastFailureTime=new Date,i instanceof v)this.metrics.timeouts++;if(this.updateAverageResponseTime(c),this.recentRequests.push({timestamp:new Date,success:!1,responseTime:c}),this.shouldTrip(i)){if(this.state==="CLOSED")this.transitionToOpen();else if(this.state==="HALF_OPEN")this.transitionToOpen()}if(this.config.onFailure)this.config.onFailure(i,this.config.name)}shouldTrip(i){if(this.config.shouldTripOnError&&!this.config.shouldTripOnError(i))return!1;if(this.metrics.consecutiveFailures>=this.config.failureThreshold)return!0;let c=this.getRecentRequests();if(c.length>=this.config.minimumRequests){if(c.filter((U)=>!U.success).length/c.length*100>=this.config.errorThresholdPercentage)return!0}return!1}transitionToClosed(){if(this.state="CLOSED",this.nextAttemptTime=void 0,this.halfOpenCallCount=0,this.metrics.state=this.state,this.config.onStateChange)this.config.onStateChange(this.state,this.config.name)}transitionToOpen(){if(this.state="OPEN",this.nextAttemptTime=new Date(Date.now()+this.config.recoveryTimeout),this.halfOpenCallCount=0,this.metrics.state=this.state,this.metrics.nextAttemptTime=this.nextAttemptTime,this.config.onStateChange)this.config.onStateChange(this.state,this.config.name)}transitionToHalfOpen(){if(this.state="HALF_OPEN",this.halfOpenCallCount=0,this.metrics.state=this.state,this.config.onStateChange)this.config.onStateChange(this.state,this.config.name)}updateAverageResponseTime(i){if(this.metrics.totalRequests===1)this.metrics.averageResponseTime=i;else this.metrics.averageResponseTime=0.1*i+0.9*this.metrics.averageResponseTime}getRecentRequests(){let i=new Date(Date.now()-this.config.monitoringPeriod);return this.recentRequests.filter((c)=>c.timestamp>i)}cleanupOldRequests(){let i=new Date(Date.now()-this.config.monitoringPeriod);this.recentRequests=this.recentRequests.filter((c)=>c.timestamp>i)}}class Ft{breakers=new Map;configs=new Map;register(i){let c=new ur(i);return this.breakers.set(i.name,c),this.configs.set(i.name,i),c}get(i){return this.breakers.get(i)}async execute(i,c){let P=this.breakers.get(i);if(!P)throw Error(`Circuit breaker '${i}' not found`);return P.execute(c)}getAllMetrics(){let i={};for(let[c,P]of this.breakers)i[c]=P.getMetrics();return i}getBreakersByState(i){let c=[];for(let[P,M]of this.breakers)if(M.getState()===i)c.push(P);return c}forceAllClosed(){for(let i of this.breakers.values())i.forceClosed()}resetAll(){for(let i of this.breakers.values())i.reset()}remove(i){return this.configs.delete(i),this.breakers.delete(i)}getNames(){return Array.from(this.breakers.keys())}}function Is(i){let c=new ur(i);return function(P,M,U){let z=U.value;return U.value=async function(...de){return c.execute({execute:()=>z.apply(this,de),context:{method:M,timestamp:new Date}})},U}}class on{registry;constructor(i){this.registry=i||new Ft}async fetch(i,c={}){let{circuitBreaker:P,fallback:M,context:U,...z}=c,de;if(typeof P==="string")de=P;else if(P){if(de=P.name,!this.registry.get(de))this.registry.register(P)}else if(de=`http-${new URL(i).hostname}`,!this.registry.get(de))this.registry.register({name:de,failureThreshold:5,recoveryTimeout:60000,timeout:30000,monitoringPeriod:60000,minimumRequests:10,errorThresholdPercentage:50,halfOpenMaxCalls:3,resetTimeout:60000});return this.registry.execute(de,{execute:async()=>{let pe=await fetch(i,z);if(pe.status>=500)throw new x(`HTTP ${pe.status}: ${pe.statusText}`,de,i,pe.status,void 0,U);return pe},fallback:M,context:U})}getRegistry(){return this.registry}}function _s(i){return async(c,P)=>{let M=c.context?.serviceName;if(!M)return P();let U=i.get(M);if(!U)return P();return U.execute({execute:P,context:{requestId:c.requestId,route:c.route,method:c.method,url:c.url}})}}var js={critical:(i)=>({name:i,failureThreshold:3,recoveryTimeout:30000,timeout:5000,monitoringPeriod:30000,minimumRequests:5,errorThresholdPercentage:30,halfOpenMaxCalls:2,resetTimeout:30000}),standard:(i)=>({name:i,failureThreshold:5,recoveryTimeout:60000,timeout:30000,monitoringPeriod:60000,minimumRequests:10,errorThresholdPercentage:50,halfOpenMaxCalls:3,resetTimeout:60000}),tolerant:(i)=>({name:i,failureThreshold:10,recoveryTimeout:120000,timeout:60000,monitoringPeriod:120000,minimumRequests:20,errorThresholdPercentage:70,halfOpenMaxCalls:5,resetTimeout:120000}),database:(i)=>({name:i,failureThreshold:3,recoveryTimeout:60000,timeout:1e4,monitoringPeriod:60000,minimumRequests:5,errorThresholdPercentage:40,halfOpenMaxCalls:2,resetTimeout:60000,shouldTripOnError:(c)=>!(c.message.includes("validation")||c.message.includes("constraint"))}),externalApi:(i)=>({name:i,failureThreshold:5,recoveryTimeout:90000,timeout:15000,monitoringPeriod:90000,minimumRequests:8,errorThresholdPercentage:60,halfOpenMaxCalls:3,resetTimeout:90000,shouldTripOnError:(c)=>{if(c instanceof x)return c.statusCode>=500;return!0}})},Hr=new Ft;function Ls(i){return Hr.register(i)}async function zs(i,c){return Hr.execute(i,c)}class Ar{config;sentry;constructor(i){this.config=i,this.initializeSentry()}async initializeSentry(){try{let i=await import("@sentry/node");i.init({dsn:this.config.dsn,environment:this.config.environment||"production",release:this.config.release,sampleRate:this.config.sampleRate||1,beforeSend:(c,P)=>{let M=P.originalException;if(M&&this.config.beforeSend)return this.config.beforeSend(M,M.context)?c:null;return c},ignoreErrors:this.config.filters?.ignoreErrors,denyUrls:this.config.filters?.ignoreUrls,allowUrls:this.config.filters?.allowUrls,initialScope:{tags:this.config.tags,extra:this.config.extra,user:this.config.user},maxBreadcrumbs:this.config.breadcrumbs?.maxBreadcrumbs||100,tracesSampleRate:this.config.performance?.tracesSampleRate||0.1}),this.sentry=i}catch(i){console.warn("Failed to initialize Sentry:",i)}}async report(i,c){if(!this.sentry||!this.config.enabled)return null;try{if(this.shouldIgnoreError(i))return null;let P={...i.context,...c};return this.sentry.withScope((M)=>{if(P.requestId)M.setTag("requestId",P.requestId);if(P.userId)M.setUser({id:P.userId});if(P.traceId)M.setTag("traceId",P.traceId);if(P.route)M.setTag("route",P.route);if(P.method)M.setTag("method",P.method);M.setTag("errorCode",i.code),M.setTag("severity",i.severity),M.setTag("category",i.category),M.setLevel(this.mapSeverityToLevel(i.severity)),M.setExtra("statusCode",i.statusCode),M.setExtra("retryable",i.retryable),M.setExtra("timestamp",i.timestamp),M.setExtra("context",P);let U=this.generateFingerprint(i);if(U.length>0)M.setFingerprint(U);return this.sentry.captureException(i)})}catch(P){return console.error("Failed to report error to Sentry:",P),null}}addBreadcrumb(i,c="default",P="info",M){if(!this.sentry||!this.config.breadcrumbs?.enabled)return;this.sentry.addBreadcrumb({message:i,category:c,level:P,data:M,timestamp:Date.now()/1000})}setUser(i){if(!this.sentry)return;this.sentry.setUser(i)}setTag(i,c){if(!this.sentry)return;this.sentry.setTag(i,c)}setExtra(i,c){if(!this.sentry)return;this.sentry.setExtra(i,c)}setContext(i,c){if(!this.sentry)return;this.sentry.setContext(i,c)}async close(i=2000){if(!this.sentry)return!0;return this.sentry.close(i)}shouldIgnoreError(i){let c=this.config.filters;if(!c)return!1;if(c.ignoreCodes?.includes(i.code))return!0;if(c.ignoreErrors?.some((P)=>{if(typeof P==="string")return i.message.includes(P);return P.test(i.message)}))return!0;return!1}mapSeverityToLevel(i){switch(i){case"low":return"info";case"medium":return"warning";case"high":return"error";case"critical":return"fatal";default:return"error"}}generateFingerprint(i){let c=[];if(c.push(i.code),c.push(i.category),i.context.route)c.push(i.context.route);return c}}class qr{config;bugsnag;constructor(i){this.config=i,this.initializeBugsnag()}async initializeBugsnag(){try{let i=await import("@bugsnag/js");i.start({apiKey:this.config.apiKey,appVersion:this.config.release,releaseStage:this.config.environment||"production",enabledReleaseStages:["production","staging"],maxBreadcrumbs:this.config.breadcrumbs?.maxBreadcrumbs||25,onError:(c)=>{let P=c.originalError;if(P&&this.config.beforeSend)return this.config.beforeSend(P,P.context)!==null;return!this.shouldIgnoreError(P)}}),this.bugsnag=i}catch(i){console.warn("Failed to initialize Bugsnag:",i)}}async report(i,c){if(!this.bugsnag||!this.config.enabled)return null;try{if(this.shouldIgnoreError(i))return null;let P={...i.context,...c};return this.bugsnag.notify(i,(M)=>{if(M.severity=this.mapSeverityToBugsnag(i.severity),M.context=P.route||P.url,P.userId)M.setUser(P.userId,void 0,void 0);M.addMetadata("error",{code:i.code,category:i.category,statusCode:i.statusCode,retryable:i.retryable,timestamp:i.timestamp}),M.addMetadata("request",{requestId:P.requestId,method:P.method,url:P.url,userAgent:P.userAgent,ip:P.ip}),M.groupingHash=this.generateGroupingHash(i)}),"reported"}catch(P){return console.error("Failed to report error to Bugsnag:",P),null}}addBreadcrumb(i,c="manual",P="info",M){if(!this.bugsnag||!this.config.breadcrumbs?.enabled)return;this.bugsnag.leaveBreadcrumb(i,M,c)}setUser(i){if(!this.bugsnag)return;this.bugsnag.setUser(i.id,i.email,i.username)}setTag(i,c){if(!this.bugsnag)return;this.bugsnag.addMetadata("tags",{[i]:c})}setExtra(i,c){if(!this.bugsnag)return;this.bugsnag.addMetadata("extra",{[i]:c})}setContext(i,c){if(!this.bugsnag)return;this.bugsnag.addMetadata(i,c)}async close(){return!0}shouldIgnoreError(i){let c=this.config.filters;if(!c)return!1;if(c.ignoreCodes?.includes(i.code))return!0;if(c.ignoreErrors?.some((P)=>{if(typeof P==="string")return i.message.includes(P);return P.test(i.message)}))return!0;return!1}mapSeverityToBugsnag(i){switch(i){case"low":return"info";case"medium":return"warning";case"high":return"error";case"critical":return"error";default:return"warning"}}generateGroupingHash(i){return`${i.code}-${i.category}-${i.context.route||"unknown"}`}}class an{config;reportHandler;constructor(i,c){this.config=i,this.reportHandler=c}async report(i,c){if(!this.config.enabled)return null;try{let P={...i.context,...c};if(this.config.beforeSend){if(!this.config.beforeSend(i,P))return null}let M={error:i,context:P,level:this.mapSeverityToLevel(i.severity),tags:this.config.tags,extra:this.config.extra,user:this.config.user};return await this.reportHandler(M)}catch(P){return console.error("Failed to report error with custom handler:",P),null}}addBreadcrumb(){}setUser(){}setTag(){}setExtra(){}setContext(){}async close(){return!0}mapSeverityToLevel(i){switch(i){case"low":return"info";case"medium":return"warning";case"high":return"error";case"critical":return"fatal";default:return"error"}}}class Vt{reporters=[];breadcrumbs=[];maxBreadcrumbs=50;constructor(i){this.initializeReporters(i)}initializeReporters(i){for(let c of i){if(!c.enabled)continue;switch(c.service){case"sentry":this.reporters.push(new Ar(c));break;case"bugsnag":this.reporters.push(new qr(c));break;case"custom":break}}}addReporter(i){this.reporters.push(i)}async report(i,c){let P=[];this.addBreadcrumb(`Error occurred: ${i.message}`,"error",{code:i.code,severity:i.severity});let M=this.reporters.map(async(U)=>{try{let z=await U.report(i,c);if(z)P.push(z)}catch(z){console.error("Reporter failed:",z)}});return await Promise.allSettled(M),P}addBreadcrumb(i,c="default",P){if(this.breadcrumbs.push({message:i,timestamp:new Date,data:{category:c,...P}}),this.breadcrumbs.length>this.maxBreadcrumbs)this.breadcrumbs=this.breadcrumbs.slice(-this.maxBreadcrumbs);this.reporters.forEach((M)=>{M.addBreadcrumb(i,c,"info",P)})}setUser(i){this.reporters.forEach((c)=>c.setUser(i))}setTag(i,c){this.reporters.forEach((P)=>P.setTag(i,c))}setExtra(i,c){this.reporters.forEach((P)=>P.setExtra(i,c))}setContext(i,c){this.reporters.forEach((P)=>P.setContext(i,c))}async close(i=5000){let c=this.reporters.map((M)=>M.close(i));return(await Promise.allSettled(c)).every((M)=>M.status==="fulfilled"&&M.value)}getBreadcrumbs(){return[...this.breadcrumbs]}}function Gs(i){return new Vt(i)}var Ws={sentry:(i,c="production")=>({enabled:!0,service:"sentry",dsn:i,environment:c,sampleRate:1,breadcrumbs:{enabled:!0,maxBreadcrumbs:100},performance:{enabled:!0,tracesSampleRate:0.1},filters:{ignoreErrors:["Non-Error promise rejection captured","ResizeObserver loop limit exceeded"],ignoreCodes:["VALIDATION_ERROR"]}}),bugsnag:(i,c="production")=>({enabled:!0,service:"bugsnag",apiKey:i,environment:c,breadcrumbs:{enabled:!0,maxBreadcrumbs:25},filters:{ignoreCodes:["VALIDATION_ERROR"]}}),development:()=>({enabled:!1,service:"custom",environment:"development"})};class Or{healthStatus=new Map;healthCheckIntervals=new Map;config;constructor(i){this.config=i,this.initializeHealthChecks()}initializeHealthChecks(){for(let[i,c]of Object.entries(this.config.healthChecks)){if(!c.enabled)continue;this.healthStatus.set(i,{name:i,status:"healthy",lastCheck:new Date,responseTime:0,errorRate:0,availability:100,consecutiveFailures:0});let P=setInterval(()=>this.performHealthCheck(i,c),c.interval);P.unref?.(),this.healthCheckIntervals.set(i,P)}}async performHealthCheck(i,c){let P=Date.now(),M=!1;try{let z=new AbortController,de=setTimeout(()=>z.abort(),c.timeout),pe=await fetch(c.endpoint,{signal:z.signal,headers:c.headers,method:"GET"});if(clearTimeout(de),M=c.expectedStatus.includes(pe.status),M&&c.expectedBody){let Re=await pe.text();if(typeof c.expectedBody==="string")M=Re.includes(c.expectedBody);else M=c.expectedBody.test(Re)}}catch(z){console.error(z),M=!1}let U=Date.now()-P;if(this.updateHealthStatus(i,M,U),M&&c.onHealthy)c.onHealthy();else if(!M&&c.onUnhealthy)c.onUnhealthy(Error(`Health check failed for ${i}`))}updateHealthStatus(i,c,P){let M=this.healthStatus.get(i);if(!M)return;let U={...M,lastCheck:new Date,responseTime:P,consecutiveFailures:c?0:M.consecutiveFailures+1};if(U.consecutiveFailures===0)U.status="healthy";else if(U.consecutiveFailures<3)U.status="degraded";else U.status="unhealthy";let z=c?1:0;U.availability=M.availability*0.9+z*10,this.healthStatus.set(i,U)}getServiceHealth(i){return this.healthStatus.get(i)}getAllServiceHealth(){return Array.from(this.healthStatus.values())}isServiceHealthy(i){return this.healthStatus.get(i)?.status==="healthy"}isServiceDegraded(i){return this.healthStatus.get(i)?.status==="degraded"}stop(){for(let i of this.healthCheckIntervals.values())clearInterval(i);this.healthCheckIntervals.clear()}}class Jt{config;healthMonitor;cache=new Map;metrics=new Map;constructor(i){this.config=i,this.healthMonitor=new Or(i)}async handleFailure(i,c,P,M){if(!this.config.enabled)throw c;let U=this.config.fallbackStrategies[i];if(!U)throw c;let z={request:P,serviceName:i,error:c,attemptCount:1,startTime:new Date};return this.executeFallbackStrategy(U,z,M)}async executeFallbackStrategy(i,c,P){if(c.attemptCount<=i.retries)try{if(c.attemptCount>1){let z=this.calculateBackoffDelay(i.backoff,c.attemptCount);await this.sleep(z)}let M=new Promise((z,de)=>{setTimeout(()=>de(Error("Timeout")),i.timeout)}),U=await Promise.race([P(),M]);return this.updateMetrics(c.serviceName,!0,Date.now()-c.startTime.getTime()),U}catch(M){if(console.error(M),c.attemptCount++,c.attemptCount<=i.retries)return this.executeFallbackStrategy(i,c,P)}switch(this.updateMetrics(c.serviceName,!1,Date.now()-c.startTime.getTime()),i.type){case"cache":return this.handleCacheFallback(i,c);case"static":return this.handleStaticFallback(i,c);case"simplified":return this.handleSimplifiedFallback(i,c);case"redirect":return this.handleRedirectFallback(i,c);case"custom":return this.handleCustomFallback(i,c);default:throw c.error}}async handleCacheFallback(i,c){if(!i.cacheConfig)throw c.error;let P=this.generateCacheKey(i.cacheConfig.key,c),M=this.cache.get(P);if(M&&(M.expires>new Date||i.cacheConfig.staleWhileRevalidate)){let U=new Headers({"Content-Type":"application/json","X-Cache":"HIT","X-Degraded":"true","X-Service-Status":this.healthMonitor.getServiceHealth(c.serviceName)?.status||"unknown"});if(i.cacheConfig.staleWhileRevalidate&&M.expires<=new Date)U.set("X-Cache","STALE");return new Response(JSON.stringify(M.data),{status:200,headers:U})}throw c.error}async handleStaticFallback(i,c){if(!i.staticResponse)throw c.error;let P=new Headers(i.staticResponse.headers||{});return P.set("X-Degraded","true"),P.set("X-Fallback-Type","static"),P.set("X-Service-Status",this.healthMonitor.getServiceHealth(c.serviceName)?.status||"unknown"),new Response(typeof i.staticResponse.body==="string"?i.staticResponse.body:JSON.stringify(i.staticResponse.body),{status:i.staticResponse.status,headers:P})}async handleSimplifiedFallback(i,c){let P={message:"Service temporarily unavailable. Showing simplified view.",status:"degraded",timestamp:new Date().toISOString(),requestId:c.request.requestId};return new Response(JSON.stringify(P),{status:200,headers:{"Content-Type":"application/json","X-Degraded":"true","X-Fallback-Type":"simplified","X-Service-Status":this.healthMonitor.getServiceHealth(c.serviceName)?.status||"unknown"}})}async handleRedirectFallback(i,c){if(!i.redirectConfig)throw c.error;return new Response(null,{status:i.redirectConfig.permanent?301:302,headers:{Location:i.redirectConfig.url,"X-Degraded":"true","X-Fallback-Type":"redirect"}})}async handleCustomFallback(i,c){if(!i.fallbackHandler)throw c.error;try{let P=await i.fallbackHandler(c.error,c.error.context);return P.headers.set("X-Degraded","true"),P.headers.set("X-Fallback-Type","custom"),P.headers.set("X-Service-Status",this.healthMonitor.getServiceHealth(c.serviceName)?.status||"unknown"),P}catch(P){throw console.error(P),c.error}}cacheResponse(i,c,P,M){let U=this.config.fallbackStrategies[i];if(U?.type==="cache"&&U.cacheConfig){let z=this.generateCacheKey(c,{serviceName:i});this.cache.set(z,{data:P,expires:new Date(Date.now()+M*1000)})}}getServiceMetrics(i){let c=this.metrics.get(i);if(!c||c.requests===0)return{errorRate:0,avgResponseTime:0,totalRequests:0};return{errorRate:c.errors/c.requests*100,avgResponseTime:c.totalTime/c.requests,totalRequests:c.requests}}getSystemHealth(){let i=this.healthMonitor.getAllServiceHealth(),c=i.filter((U)=>U.status==="unhealthy").length,P=i.filter((U)=>U.status==="degraded").length,M="healthy";if(c>0)M=c>i.length/2?"unhealthy":"degraded";else if(P>0)M="degraded";return{status:M,services:i}}calculateBackoffDelay(i,c){if(i.type==="fixed")return i.delay;let P=i.delay*2**(c-1);return Math.min(P,i.maxDelay||30000)}generateCacheKey(i,c){return i.replace("{service}",c.serviceName).replace("{url}",c.request.url).replace("{method}",c.request.method).replace("{userId}",String(c.request.user?.id||"anonymous"))}updateMetrics(i,c,P){let M=this.metrics.get(i)||{requests:0,errors:0,totalTime:0};if(M.requests++,M.totalTime+=P,!c)M.errors++;this.metrics.set(i,M)}sleep(i){return new Promise((c)=>setTimeout(c,i))}stop(){this.healthMonitor.stop()}}function Vs(i){let c=new Jt(i);return async(P,M)=>{try{let U=await M(),z=P.context?.serviceName;if(z&&U.ok){let de=i.fallbackStrategies[z];if(de?.type==="cache"&&de.cacheConfig)try{let pe=await U.clone().json();c.cacheResponse(z,de.cacheConfig.key,pe,de.cacheConfig.ttl)}catch{}}return U}catch(U){let z=P.context?.serviceName;if(z&&U instanceof Error){let de=U;try{return await c.handleFailure(z,de,P,M)}catch(pe){throw console.error(pe),U}}throw U}}}var Js={cacheFirst:(i=3600,c=!0)=>({type:"cache",priority:1,timeout:5000,retries:2,backoff:{type:"exponential",delay:1000,maxDelay:5000},cacheConfig:{key:"{service}:{url}:{method}",ttl:i,staleWhileRevalidate:c}}),staticFallback:(i,c=200)=>({type:"static",priority:2,timeout:1000,retries:0,backoff:{type:"fixed",delay:0},staticResponse:{status:c,body:i,headers:{"Content-Type":"application/json"}}}),simplifiedView:()=>({type:"simplified",priority:3,timeout:1000,retries:0,backoff:{type:"fixed",delay:0}}),redirectToMaintenance:(i)=>({type:"redirect",priority:4,timeout:1000,retries:0,backoff:{type:"fixed",delay:0},redirectConfig:{url:i,permanent:!1}})};class un{errorReporting;gracefulDegradation;circuitBreakerRegistry;config;constructor(i={}){this.config={development:!1,includeStackTrace:!1,sanitizeErrors:!0,logErrors:!0,...i},this.initializeComponents()}initializeComponents(){if(this.config.errorReporting?.length)this.errorReporting=new Vt(this.config.errorReporting);if(this.config.gracefulDegradation?.enabled)this.gracefulDegradation=new Jt(this.config.gracefulDegradation);if(this.config.circuitBreakers?.length){this.circuitBreakerRegistry=new Ft;for(let i of this.config.circuitBreakers)this.circuitBreakerRegistry.register(i)}}middleware(){return async(i,c)=>{try{let P={requestId:i.requestId,userId:i.user?.id,traceId:i.traceId,spanId:i.spanId,route:i.params?.route||i.url,method:i.method,url:i.url,userAgent:i.userAgent?.()||void 0,ip:i.ip?.()||void 0,timestamp:new Date};if(i.context={...i.context,errorContext:P},this.circuitBreakerRegistry&&i.context?.serviceName){let M=this.circuitBreakerRegistry.get(i.context.serviceName);if(M)return await M.execute({execute:c,context:P})}return await c()}catch(P){return this.handleError(P,i)}}}async handleError(i,c){let P=this.normalizeError(i,c);if(this.errorReporting)this.errorReporting.addBreadcrumb(`Error in ${c.method} ${c.url}`,"error",{code:P.code,severity:P.severity,statusCode:P.statusCode});if(this.config.logErrors)this.logError(P,c);if(this.gracefulDegradation&&c.context?.serviceName)try{return await this.gracefulDegradation.handleFailure(c.context.serviceName,P,c,async()=>{throw P})}catch{}if(this.errorReporting)try{await this.errorReporting.report(P,P.context)}catch(U){console.error("Failed to report error:",U)}if(this.config.globalErrorHandler)try{return await this.config.globalErrorHandler(P,c)}catch(U){console.error("Global error handler failed:",U)}let M=this.config.customErrorPages?.[P.statusCode];if(M)try{if(typeof M==="string")return new Response(M,{status:P.statusCode,headers:{"Content-Type":"text/html"}});else return await M(P,c)}catch(U){console.error("Custom error page failed:",U)}return this.createErrorResponse(P,c)}normalizeError(i,c){let P={requestId:c.requestId,userId:c.user?.id,traceId:c.traceId,spanId:c.spanId,route:c.params?.route||c.url,method:c.method,url:c.url,userAgent:c.userAgent?.()||void 0,ip:c.ip?.()||void 0,timestamp:new Date,metadata:c.context};if(i instanceof t)return i;if(i instanceof Error){if(i.name==="ValidationError")return s.validation(i.message,{},P);if(i.name==="UnauthorizedError"||i.message.includes("unauthorized"))return s.authentication(i.message,P);if(i.name==="ForbiddenError"||i.message.includes("forbidden"))return s.authorization(i.message,[],P);if(i.name==="NotFoundError"||i.message.includes("not found"))return s.notFound(void 0,void 0,P);if(i.name==="TimeoutError"||i.message.includes("timeout"))return s.timeout(30000,i.message,P);return s.internalServer(i.message,i,P)}if(typeof i==="string")return s.internalServer(i,void 0,P);return s.internalServer("An unknown error occurred",void 0,P)}createErrorResponse(i,c){let P=this.config.development,M=this.config.includeStackTrace||P,U=this.config.sanitizeErrors&&!P,z=i.message;if(U&&i.statusCode>=500)z="An internal server error occurred";let de={error:{code:i.code,message:z,statusCode:i.statusCode,timestamp:i.timestamp.toISOString(),requestId:i.context.requestId,traceId:i.context.traceId}};if(P)de.error.category=i.category,de.error.severity=i.severity,de.error.retryable=i.retryable,de.error.context=i.context;if(M){if(de.error.stack=i.stack,i.cause)de.error.cause={name:i.cause.name,message:i.cause.message,stack:i.cause.stack}}if("fields"in i)de.error.fields=i.fields;if("allowedMethods"in i)de.error.allowedMethods=i.allowedMethods;if("retryAfter"in i)de.error.retryAfter=i.retryAfter;let pe=new Headers({"Content-Type":"application/json","X-Error-Code":i.code,"X-Request-ID":i.context.requestId||"","X-Trace-ID":i.context.traceId||""});if("allowedMethods"in i)pe.set("Allow",i.allowedMethods.join(", "));if("retryAfter"in i)pe.set("Retry-After",i.retryAfter.toString());if("limit"in i)pe.set("X-RateLimit-Limit",i.limit.toString()),pe.set("X-RateLimit-Remaining",i.remaining.toString());return new Response(JSON.stringify(de),{status:i.statusCode,headers:pe})}logError(i,c){let P={error:i.toJSON(),request:{method:c.method,url:c.url,headers:Object.fromEntries(c.headers.entries()),userAgent:c.userAgent?.()||void 0,ip:c.ip?.()||void 0,requestId:c.requestId,traceId:c.traceId}};switch(i.severity){case"critical":console.error("[CRITICAL ERROR]",P);break;case"high":console.error("[ERROR]",P);break;case"medium":console.warn("[WARNING]",P);break;case"low":console.warn("[INFO]",P);break;default:console.error("[ERROR]",P)}}getStats(){return{errorReporting:this.errorReporting?{breadcrumbs:this.errorReporting.getBreadcrumbs().length}:void 0,gracefulDegradation:this.gracefulDegradation?this.gracefulDegradation.getSystemHealth():void 0,circuitBreakers:this.circuitBreakerRegistry?this.circuitBreakerRegistry.getAllMetrics():void 0}}async cleanup(){if(this.errorReporting)await this.errorReporting.close();if(this.gracefulDegradation)this.gracefulDegradation.stop()}}function cn(i={}){let c=new un(i);return{middleware:c.middleware(),getStats:()=>c.getStats(),cleanup:()=>c.cleanup()}}function Nt(i){if(!i.includes("%"))return i;try{return decodeURIComponent(i)}catch{return i}}function cr(i){let{read:c,write:P,remove:M}=i,U=()=>({...c()});for(let[z,de]of Object.entries(c()))Object.defineProperty(U,z,{value:de,writable:!0,enumerable:!0,configurable:!0});return U.get=(z)=>c()[z],U.set=(z,de,pe={})=>P?.(z,de,pe),U.delete=(z,de={})=>M?.(z,de),U.getAll=()=>({...c()}),U}function Ut(i={}){let c={...i};return cr({read:()=>c,write:(P,M)=>{c[P]=M},remove:(P)=>{delete c[P]}})}import{AsyncLocalStorage as Ks}from"async_hooks";var $r=new Ks,lr=!1,At=null;function Xs(){lr=!0}function dr(i,c){if(!lr){At=i;let P=c();if(P instanceof Promise)return P.finally(()=>{At=null});return At=null,P}return $r.run({current:i},c)}function pr(i){let c=$r.getStore();if(c){c.current=i;return}if(At!==null)At=i}function dn(){if(!lr)return lr=!0,At??void 0;return $r.getStore()?.current??At??void 0}function Qs(){let i=dn();if(!i)throw Error("request() called outside a request scope. It can only be invoked from within a route handler or middleware.");return i}var pn={enabled:!0,level:6,threshold:1024};function hn(i){if(!i)return!1;let c=i.split(";")[0]?.trim().toLowerCase()??"";if(c==="text/event-stream")return!1;if(c.startsWith("text/"))return!0;return["application/json","application/ld+json","application/manifest+json","application/javascript","application/x-javascript","application/xml","application/xhtml+xml","application/rss+xml","application/atom+xml","application/graphql","application/x-ndjson","image/svg+xml"].includes(c)}function Zs(i){if(!i)return null;let c=new Map;for(let M of i.split(",")){let[U="",...z]=M.trim().split(";"),de=z.map((pe)=>/^\s*q=([\d.]+)\s*$/i.exec(pe)).find(Boolean);c.set(U.trim().toLowerCase(),de?Number(de[1]):1)}let P=(M)=>(c.get(M)??c.get("*")??0)>0;if(P("gzip"))return"gzip";if(P("deflate"))return"deflate";return null}function Ys(i,c,P){if(!c)return!1;if(i.status===204||i.status===304||i.status===206)return!1;if(i.headers.has("content-encoding"))return!1;if(!hn(i.headers.get("content-type")))return!1;if(!i.body)return!1;let M=Number(i.headers.get("content-length")??Number.NaN);return Number.isFinite(M)?M>=P:!0}function Br(i,c,P={}){if(!(P.enabled??pn.enabled))return i;let U=P.threshold??pn.threshold,z=Zs(c.headers.get("accept-encoding"));if(!Ys(i,z,U)){if(hn(i.headers.get("content-type"))&&!i.headers.has("content-encoding"))Dr(i.headers,"Accept-Encoding");return i}let de=Number(i.headers.get("content-length")??Number.NaN);if(!Number.isFinite(de))return ei(i,z,U);return gn(i,i.body,z)}async function Io(i,c,P={}){return Br(i,c,P)}async function ei(i,c,P){let M=await ti(i.body,P);if(M.ended&&M.size<P){let U=new Headers(i.headers);return Dr(U,"Accept-Encoding"),new Response(M.stream,{status:i.status,statusText:i.statusText,headers:U})}return gn(i,M.stream,c)}function gn(i,c,P){let M=new Headers(i.headers);M.set("Content-Encoding",P),Dr(M,"Accept-Encoding"),M.delete("Content-Length");let U=c.pipeThrough(new CompressionStream(P==="gzip"?"gzip":"deflate"));return new Response(U,{status:i.status,statusText:i.statusText,headers:M})}async function ti(i,c){let P=i.getReader(),M=[],U=0,z=!1;while(U<c){let{value:pe,done:Re}=await P.read();if(Re){z=!0;break}if(pe)M.push(pe),U+=pe.byteLength}return{stream:new ReadableStream({start(pe){for(let Re of M)pe.enqueue(Re);if(z)pe.close()},async pull(pe){if(z)return;let{value:Re,done:Te}=await P.read();if(Te){z=!0,pe.close();return}if(Re)pe.enqueue(Re)},cancel(pe){return P.cancel(pe)}}),size:U,ended:z}}function Dr(i,c){let P=i.get("vary");if(!P){i.set("Vary",c);return}let M=P.split(",").map((U)=>U.trim().toLowerCase());if(M.includes("*")||M.includes(c.toLowerCase()))return;i.set("Vary",`${P}, ${c}`)}var ke={json:(i,c={})=>{let P=typeof c==="number"?{status:c}:c,{status:M=200,headers:U={},pretty:z=!1}=P,de=z?JSON.stringify(i,null,2):JSON.stringify(i);return new Response(de,{status:M,headers:{"Content-Type":"application/json",...U}})},noContent:(i={})=>new Response(null,{status:204,headers:i}),download:async(i,c,P={})=>{let M=Bun.file(i);if(!await M.exists())return new Response("File not found",{status:404});let z=c||i.split("/").pop()||"download",de=M.type||"application/octet-stream";return new Response(M,{status:200,headers:{"Content-Type":de,"Content-Disposition":`attachment; filename="${z}"`,"Content-Length":String(M.size),...P}})},file:async(i,c={})=>{let P=Bun.file(i);if(!await P.exists())return new Response("File not found",{status:404});let U=P.type||"application/octet-stream";return new Response(P,{status:200,headers:{"Content-Type":U,"Content-Length":String(P.size),...c}})},streamDownload:(i,c,P={})=>{let{contentType:M="application/octet-stream",headers:U={}}=P,z=new ReadableStream({async start(de){try{for await(let pe of i())if(typeof pe==="string")de.enqueue(new TextEncoder().encode(pe));else de.enqueue(pe);de.close()}catch(pe){de.error(pe)}}});return new Response(z,{status:200,headers:{"Content-Type":M,"Content-Disposition":`attachment; filename="${c}"`,"Transfer-Encoding":"chunked",...U}})},redirect:(i,c=302)=>new Response(null,{status:c,headers:{Location:i}}),redirectPermanent:(i)=>ke.redirect(i,301),redirectTemporary:(i)=>ke.redirect(i,302),back:(i,c="/")=>{let P=i.headers.get("referer")||c;return ke.redirect(P)},view:(i,c=200,P={})=>new Response(i,{status:c,headers:{"Content-Type":"text/html; charset=utf-8",...P}}),text:(i,c=200,P={})=>new Response(i,{status:c,headers:{"Content-Type":"text/plain; charset=utf-8",...P}}),xml:(i,c=200,P={})=>new Response(i,{status:c,headers:{"Content-Type":"application/xml; charset=utf-8",...P}}),success:(i,c,P=200)=>{let M={success:!0};if(i!==void 0)M.data=i;if(c!==void 0)M.message=c;return ke.json(M,{status:P})},error:(i,c=400,P)=>{let M={success:!1,message:i};if(P!==void 0)M.errors=P;return ke.json(M,{status:c})},paginate:(i,c)=>{let{page:P,perPage:M,total:U,path:z}=c,de=Math.ceil(U/M),pe=(P-1)*M+1,Re=Math.min(P*M,U);return ke.json({data:i,meta:{current_page:P,per_page:M,total:U,last_page:de,from:pe,to:Re,path:z,first_page_url:`${z}?page=1`,last_page_url:`${z}?page=${de}`,next_page_url:P<de?`${z}?page=${P+1}`:null,prev_page_url:P>1?`${z}?page=${P-1}`:null}})},created:(i,c)=>{let P={};if(c)P.Location=c;let M={success:!0};if(i!==void 0)M.data=i;return ke.json(M,{status:201,headers:P})},accepted:(i)=>{let c={success:!0};if(i!==void 0)c.data=i;return ke.json(c,{status:202})},notFound:(i="Resource not found")=>ke.error(i,404),unauthorized:(i="Unauthorized")=>ke.error(i,401),forbidden:(i="Forbidden")=>ke.error(i,403),badRequest:(i="Bad request",c)=>ke.error(i,400,c),validationError:(i,c="Validation failed")=>ke.error(c,422,i),unprocessableEntity:(i="Unprocessable entity",c)=>ke.error(i,422,c),serverError:(i="Internal server error")=>ke.error(i,500),tooManyRequests:(i="Too many requests",c)=>{let P={};if(c)P["Retry-After"]=String(c);return new Response(JSON.stringify({message:i}),{status:429,headers:{"Content-Type":"application/json",...P}})}};class mn{_status=200;_headers={};_cookies=[];_deleteCookies=[];status(i){return this._status=i,this}header(i,c){return this._headers[i]=c,this}withHeaders(i){return this._headers={...this._headers,...i},this}cookie(i,c,P={}){return this._cookies.push({name:i,value:c,options:P}),this}withoutCookie(i,c={}){return this._deleteCookies.push({name:i,options:c}),this}json(i){let c=ke.json(i,{status:this._status,headers:this._headers});return this.applyCookies(c)}text(i){let c=ke.text(i,this._status,this._headers);return this.applyCookies(c)}html(i){let c=ke.view(i,this._status,this._headers);return this.applyCookies(c)}noContent(){let i=ke.noContent(this._headers);return this.applyCookies(i)}applyCookies(i){let c=new Headers(i.headers);for(let{name:P,value:M,options:U}of this._cookies){let z=this.serializeCookie(P,M,U);c.append("Set-Cookie",z)}for(let{name:P,options:M}of this._deleteCookies){let U=this.serializeCookie(P,"",{...M,maxAge:0,expires:new Date(0)});c.append("Set-Cookie",U)}return new Response(i.body,{status:i.status,headers:c})}serializeCookie(i,c,P){let M=`${encodeURIComponent(i)}=${encodeURIComponent(c)}`;if(P.maxAge!==void 0)M+=`; Max-Age=${P.maxAge}`;if(P.expires)M+=`; Expires=${P.expires.toUTCString()}`;if(P.httpOnly)M+="; HttpOnly";if(P.secure)M+="; Secure";if(P.path)M+=`; Path=${P.path}`;if(P.domain)M+=`; Domain=${P.domain}`;if(P.sameSite)M+=`; SameSite=${P.sameSite.charAt(0).toUpperCase()+P.sameSite.slice(1)}`;return M}}function jo(){return new mn}import ri from"process";class Fr{compiledPipelines=new Map;dependencyRegistry=new Map;singletonInstances=new Map;stats={totalExecutions:0,cacheHits:0,cacheMisses:0,shortCircuits:0,skippedMiddleware:0,averageExecutionTime:0,dependencyResolutions:0};registerDependency(i){this.dependencyRegistry.set(i.name,i)}compileMiddleware(i,c,P=[]){let M=[];for(let U=0;U<c.length;U++){let z=c[U],de=z.name||`middleware_${U}`;M.push({handler:z,name:de,skipConditions:P.filter((pe)=>pe.name.includes(de)||pe.name==="global"),dependencies:this.extractDependencies(z),canShortCircuit:this.canShortCircuit(z),priority:U})}this.compiledPipelines.set(i,M)}async execute(i,c,P){let M=performance.now();this.stats.totalExecutions++;let U=this.compiledPipelines.get(i);if(!U)return this.stats.cacheMisses++,await P();this.stats.cacheHits++;let z={request:c,dependencies:new Map,metadata:{}};await this.resolveDependencies(z,U);let de=0,pe=async()=>{if(de>=U.length)return await P();let xe=U[de++];if(await this.shouldSkip(xe,z))return this.stats.skippedMiddleware++,await pe();let ve=await xe.handler(c,pe);if(ve instanceof Response&&xe.canShortCircuit)return this.stats.shortCircuits++,ve;return ve},Re=await pe(),Te=performance.now()-M;return this.updateAverageExecutionTime(Te),Re||new Response("Internal Server Error",{status:500})}async shouldSkip(i,c){for(let P of i.skipConditions)if(await P.condition(c))return!0;return!1}async resolveDependencies(i,c){let P=new Set;for(let M of c)for(let U of M.dependencies)P.add(U);for(let M of P){let U=this.dependencyRegistry.get(M);if(!U)continue;if(this.stats.dependencyResolutions++,U.singleton&&this.singletonInstances.has(M))i.dependencies.set(M,this.singletonInstances.get(M));else{let z=await U.factory(i);if(i.dependencies.set(M,z),U.singleton)this.singletonInstances.set(M,z)}}}extractDependencies(i){let c=i.toString(),P=[];if(c.includes("database")||c.includes("db"))P.push("database");if(c.includes("logger")||c.includes("log"))P.push("logger");if(c.includes("cache"))P.push("cache");if(c.includes("httpClient")||c.includes("http"))P.push("httpClient");return P}canShortCircuit(i){let c=i.toString();return c.includes("return")&&c.includes("Response")}updateAverageExecutionTime(i){let c=this.stats.averageExecutionTime*(this.stats.totalExecutions-1);this.stats.averageExecutionTime=(c+i)/this.stats.totalExecutions}getStats(){return{...this.stats}}clear(){this.compiledPipelines.clear(),this.singletonInstances.clear(),this.stats={totalExecutions:0,cacheHits:0,cacheMisses:0,shortCircuits:0,skippedMiddleware:0,averageExecutionTime:0,dependencyResolutions:0}}}var ni={skipForMethods:(i)=>({name:`skip_for_methods_${i.join("_")}`,condition:(c)=>i.includes(c.request.method)}),skipForPaths:(i)=>({name:`skip_for_paths_${i.join("_").replace(/\//g,"_")}`,condition:(c)=>{let P=new URL(c.request.url);return i.some((M)=>P.pathname.startsWith(M))}}),skipForHeaders:(i)=>({name:`skip_for_headers_${Object.keys(i).join("_")}`,condition:(c)=>Object.entries(i).some(([P,M])=>c.request.headers.get(P)===M)}),skipForRoles:(i)=>({name:`skip_for_roles_${i.join("_")}`,condition:(c)=>{let P=c.request.user?.roles||[];return!i.some((M)=>P.includes(M))}}),skipForEnvironment:(i)=>({name:`skip_for_env_${i.join("_")}`,condition:()=>{let c=ri.env.NODE_ENV||"development";return i.includes(c)}})},si={database:(i)=>({name:"database",factory:async()=>({query:async(c)=>({rows:[]}),close:async()=>{},connectionString:i||"mock://database"}),singleton:!0}),logger:(i="info")=>({name:"logger",factory:()=>({info:(c)=>console.log(`[INFO] ${c}`),error:(c)=>console.error(`[ERROR] ${c}`),warn:(c)=>console.warn(`[WARN] ${c}`),debug:(c)=>console.debug(`[DEBUG] ${c}`),level:i}),singleton:!0}),cache:(i=1000)=>({name:"cache",factory:()=>{let c=new Map;return{get:(P)=>c.get(P),set:(P,M)=>{if(c.size>=i){let U=c.keys().next().value;c.delete(U)}c.set(P,M)},delete:(P)=>c.delete(P),clear:()=>c.clear(),size:()=>c.size}},singleton:!0}),httpClient:(i)=>({name:"httpClient",factory:()=>({get:async(c)=>fetch(i?`${i}${c}`:c),post:async(c,P)=>fetch(i?`${i}${c}`:c,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(P)}),put:async(c,P)=>fetch(i?`${i}${c}`:c,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(P)}),delete:async(c)=>fetch(i?`${i}${c}`:c,{method:"DELETE"})}),singleton:!0})},ii={auth:(i={})=>async(c,P)=>{let M=new URL(c.url);if(i.skipPaths?.some((z)=>M.pathname.startsWith(z)))return await P();if(!c.headers.get("Authorization")?.replace("Bearer ",""))return new Response("Unauthorized",{status:401});try{return c.user={id:"123",roles:["user"]},await P()}catch{return new Response("Invalid token",{status:401})}},rateLimit:(i)=>{let c=new Map;return async(P,M)=>{let U=P.headers.get("x-forwarded-for")||"unknown",z=Date.now(),de=z-i.windowMs;if(!c.has(U))c.set(U,[]);let Re=c.get(U).filter((Te)=>Te>de);if(Re.length>=i.maxRequests)return new Response("Too Many Requests",{status:429});return Re.push(z),c.set(U,Re),await M()}},cors:(i={})=>async(c,P)=>{let M=await P();if(M){let U=new Headers(M.headers);return U.set("Access-Control-Allow-Origin",i.origin||"*"),U.set("Access-Control-Allow-Methods",i.methods?.join(", ")||"GET, POST, PUT, DELETE"),U.set("Access-Control-Allow-Headers","Content-Type, Authorization"),new Response(M.body,{status:M.status,statusText:M.statusText,headers:U})}return M},logging:(i={})=>async(c,P)=>{let M=performance.now(),U=new URL(c.url);console.log(`[${new Date().toISOString()}] ${c.method} ${U.pathname}`);let z=await P(),de=performance.now()-M;if(z)console.log(`[${new Date().toISOString()}] ${c.method} ${U.pathname} - ${z.status} (${de.toFixed(2)}ms)`);return z}},oi=new Fr;import{existsSync as Rn,readdirSync as ai,statSync as ui}from"fs";import{basename as yn,extname as fn,join as ci,resolve as wn}from"path";var li=[".ts",".js"],di=["routes","src/routes"],pi=["web","index"];function hi(){let i=process.cwd();for(let c of di){let P=wn(i,c);if(Rn(P)&&ui(P).isDirectory())return P}return null}function bn(i,c){let P=[];if(!Rn(i))return P;let M=ai(i,{withFileTypes:!0});for(let U of M){if(U.name.startsWith(".")||U.name.startsWith("_"))continue;let z=ci(i,U.name);if(U.isDirectory())P.push(...bn(z,c));else if(li.includes(fn(U.name))){let de=i===c?"":i.slice(c.length),pe=yn(U.name,fn(U.name)),Re=pi.includes(pe)?de||"":`${de}/${pe}`;P.push({filePath:z,prefix:Re})}}return P}async function gi(i,c,P,M){try{let U=await import(c),z=0,de=i.routes?.length||0;if(typeof U.default==="function"){let pe=mi(i,P);await U.default(pe),z=(i.routes?.length||0)-de}else if(Array.isArray(U.routes))for(let pe of U.routes){let Re=(pe.method||"GET").toLowerCase(),Te=`${P}${pe.path}`;if(typeof i[Re]==="function")await i[Re](Te,pe.handler),z++}if(M&&z>0)console.log(` ${P||"/"} \u2192 ${yn(c)} (${z} routes)`);return z}catch(U){return console.error(`[bun-router] Failed to load route file ${c}:`,U),0}}function mi(i,c){if(!c)return i;let P=["get","post","put","patch","delete","options","any"];return new Proxy(i,{get(M,U){if(P.includes(U))return async(z,...de)=>M[U](`${c}${z}`,...de);if(U==="group")return async(z,de)=>{let pe=z.prefix?`${c}${z.prefix}`:c;return M.group({...z,prefix:pe},de)};return M[U]}})}function Tn(i){Object.defineProperties(i.prototype,{_routesDir:{value:null,writable:!0,configurable:!0},_apiRoutesInitialized:{value:!1,writable:!0,configurable:!0},_initApiRoutes:{async value(){if(this._apiRoutesInitialized)return;let c=this._routesDir||hi();if(!c){this._apiRoutesInitialized=!0;return}let P=this.config?.verbose||!1,M=bn(c,c);if(M.length===0){this._apiRoutesInitialized=!0;return}if(P)console.log(`[bun-router] Auto-discovering API routes from ${c}:`);let U=0;for(let{filePath:z,prefix:de}of M)U+=await gi(this,z,de,P);if(U>0&&P)console.log(`[bun-router] Registered ${U} API routes`);this._apiRoutesInitialized=!0},writable:!0,configurable:!0},routesFrom:{value(c){return this._routesDir=wn(c),this},writable:!0,configurable:!0}})}import{join as Kt,relative as Nr,resolve as Pt,dirname as Ri}from"path";import{readdirSync as xn,statSync as yi,existsSync as gr}from"fs";var Ko={enabled:!0,preserve:[],exclude:["_t","_cache","callback"],routes:[]};function fi(i){let{preserve:c=[],exclude:P=[],routes:M=[]}=i;if(!c.length)return"";return`<script data-query-preservation>
2
+ import{he,ft,e,me,V,ge,Ne,qe,He,Be,je,p,r,h,k,W,m,n,fe,g,Ue,Le,_e,l,A,O,I,yt,G,F,f,y,ze,w,Ve,C,a,We,Ge,Ke,Je,Xe,S,b,Ye,D,Qe,N,Ze,q,et,H,tt,R,rt,B,nt,wt,bt,Rt,vt,xt,Tt,K}from"./chunk-trm3jyqk.js";import{t,u,J,X,Y,Q,v,Z,ee,te,re,x,T,ne,se,ie,s,E,d,oe,j,ae,ce,st,it,ot,o,L,ye,we,be,_,le,ue}from"./chunk-7g1et0fb.js";var Os=Object.defineProperty;var $s=(i)=>i;function Bs(i,c){this[i]=$s.bind(null,c)}var Ds=(i,c)=>{for(var P in c)Os(i,P,{get:c[P],enumerable:!0,configurable:!0,set:Bs.bind(c,P)})};import{timingSafeEqual as Fs}from"crypto";function kr(i){return btoa(i).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}function ar(i){i=i.replace(/-/g,"+").replace(/_/g,"/");while(i.length%4)i+="=";return atob(i)}class rn{secret;constructor(i){this.secret=i}sign(i,c={}){let P={alg:c.algorithm||"HS256",typ:"JWT",...c.header},M=Math.floor(Date.now()/1000),U={...i,iat:M};if(c.expiresIn){let Te=typeof c.expiresIn==="string"?this.parseTimespan(c.expiresIn):c.expiresIn;U.exp=M+Te}if(c.notBefore){let Te=typeof c.notBefore==="string"?this.parseTimespan(c.notBefore):c.notBefore;U.nbf=M+Te}if(c.issuer)U.iss=c.issuer;if(c.subject)U.sub=c.subject;if(c.audience)U.aud=c.audience;if(c.jwtid)U.jti=c.jwtid;let z=kr(JSON.stringify(P)),de=kr(JSON.stringify(U)),pe=`${z}.${de}`,Re=this.createSignature(pe,this.secret,P.alg);return`${pe}.${Re}`}verify(i,c={}){try{let P=i.split(".");if(P.length!==3)throw Error("Token structure invalid");let[M,U,z]=P,de=JSON.parse(ar(M)),pe=JSON.parse(ar(U));if(c.algorithms&&!c.algorithms.includes(de.alg))throw Error(`Algorithm ${de.alg} not allowed`);let Re=`${M}.${U}`,Te=this.createSignature(Re,this.secret,de.alg),xe=Buffer.from(z),ve=Buffer.from(Te);if(xe.length!==ve.length||!Fs(xe,ve))throw Error("Invalid signature");let Ce=Math.floor(Date.now()/1000);if(pe.exp&&!c.ignoreExpiration&&Ce>=pe.exp)throw Error("Token expired");if(pe.nbf&&Ce<pe.nbf)throw Error("Token not active yet");if(pe.iat&&pe.iat>Ce)throw Error("Token used before issued");if(c.issuer&&pe.iss!==c.issuer)throw Error("Invalid issuer");if(c.audience&&pe.aud!==c.audience)throw Error("Invalid audience");if(c.subject&&pe.sub!==c.subject)throw Error("Invalid subject");return pe}catch{return null}}decode(i){try{let c=i.split(".");if(c.length!==3)return null;let[P,M]=c;return{header:JSON.parse(ar(P)),payload:JSON.parse(ar(M))}}catch{return null}}createSignature(i,c,P){return kr(JSON.stringify({data:i,secret:c.slice(0,5),alg:P}))}parseTimespan(i){let c=i.match(/^(\d+)\s*([smhd])$/i);if(!c)return Number.parseInt(i,10)||0;let P=Number.parseInt(c[1],10);switch(c[2].toLowerCase()){case"s":return P;case"m":return P*60;case"h":return P*60*60;case"d":return P*24*60*60;default:return P}}}class nn{keys;options;constructor(i={}){this.keys=new Map,this.options={source:"header",keyName:"X-API-Key",keyPrefix:"bun_",...i}}generateKey(i,c=[],P){let M=`${this.options.keyPrefix}${this.randomString(32)}`;return this.keys.set(M,{owner:i,scopes:c,expiresAt:P?new Date(Date.now()+P*1000):void 0}),M}validateKey(i,c=[]){let P=this.keys.get(i);if(!P)return!1;if(P.expiresAt&&P.expiresAt<new Date)return!1;if(c.length>0)return c.every((M)=>P.scopes.includes(M));return!0}getKeyInfo(i){return this.keys.get(i)||null}revokeKey(i){return this.keys.delete(i)}extractFromRequest(i){let{source:c,keyName:P}=this.options;switch(c){case"header":return i.headers.get(P||"X-API-Key")||null;case"query":return new URL(i.url).searchParams.get(P||"api_key")||null;case"cookie":if(i.cookies){let M=P||"api_key";if(typeof i.cookies.get==="function")return i.cookies.get(M)||null;return i.cookies[M]||null}return null;default:return null}}randomString(i){let P="";for(let M=0;M<i;M++)P+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789".charAt(Math.floor(Math.random()*62));return P}}class sn{config;constructor(i){this.config=i}getAuthorizationUrl(i={}){let c=new URLSearchParams({client_id:this.config.clientId,redirect_uri:this.config.redirectUri,response_type:"code",...i});if(this.config.scope)c.set("scope",this.config.scope);if(this.config.state)c.set("state",this.config.state);return`${this.config.authorizeUrl}?${c.toString()}`}async exchangeCodeForToken(i){let c=new URLSearchParams({grant_type:"authorization_code",code:i,redirect_uri:this.config.redirectUri,client_id:this.config.clientId,client_secret:this.config.clientSecret}),P=await fetch(this.config.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:c.toString()});if(!P.ok)throw Error(`OAuth token exchange failed: ${P.status} ${P.statusText}`);return await P.json()}async refreshToken(i){let c=new URLSearchParams({grant_type:"refresh_token",refresh_token:i,client_id:this.config.clientId,client_secret:this.config.clientSecret}),P=await fetch(this.config.tokenUrl,{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:c.toString()});if(!P.ok)throw Error(`OAuth token refresh failed: ${P.status} ${P.statusText}`);return await P.json()}}var Ns={JWT:rn,ApiKeyManager:nn,OAuth2Helper:sn},Us=Ns;var ln={};Ds(ln,{AuthenticationException:()=>J,AuthorizationException:()=>X,BugsnagReporter:()=>qr,BusinessLogicException:()=>ne,CircuitBreaker:()=>ur,CircuitBreakerHttpClient:()=>on,CircuitBreakerOpenException:()=>T,CircuitBreakerPresets:()=>js,CircuitBreakerRegistry:()=>Ft,CircularDependencyException:()=>d,ConfigurationException:()=>se,CustomReporter:()=>an,DatabaseException:()=>re,DegradationStrategies:()=>Js,ErrorFactory:()=>s,ErrorReportingManager:()=>Vt,ErrorReportingPresets:()=>Ws,ExternalServiceException:()=>x,FileSystemException:()=>ie,GracefulDegradationManager:()=>Jt,HandlerResolutionException:()=>ae,InternalServerException:()=>ee,MethodNotAllowedException:()=>Q,MiddlewareConfigurationException:()=>oe,ModelBindingException:()=>ce,NotFoundException:()=>Y,RateLimitException:()=>Z,RouteConflictException:()=>E,RouteNotFoundException:()=>j,RouterErrorFactory:()=>ot,RouterException:()=>t,SentryReporter:()=>Ar,ServiceHealthMonitor:()=>Or,ServiceUnavailableException:()=>te,TimeoutException:()=>v,ValidationException:()=>u,circuitBreaker:()=>Is,createAdvancedErrorHandler:()=>cn,createCircuitBreaker:()=>Ls,createCircuitBreakerMiddleware:()=>_s,createErrorReporting:()=>Gs,createGracefulDegradationMiddleware:()=>Vs,detectRouteConflicts:()=>it,findSimilarRoutes:()=>st,globalCircuitBreakerRegistry:()=>Hr,withCircuitBreaker:()=>zs});class ur{config;state="CLOSED";metrics;nextAttemptTime;halfOpenCallCount=0;recentRequests=[];constructor(i){let c={failureThreshold:5,recoveryTimeout:60000,timeout:30000,monitoringPeriod:60000,minimumRequests:10,errorThresholdPercentage:50,halfOpenMaxCalls:3,resetTimeout:60000};this.config={...c,...i},this.metrics={totalRequests:0,successfulRequests:0,failedRequests:0,timeouts:0,averageResponseTime:0,state:this.state,consecutiveFailures:0,consecutiveSuccesses:0},setInterval(()=>this.cleanupOldRequests(),this.config.monitoringPeriod/4).unref?.()}async execute(i){if(this.state==="OPEN")if(this.nextAttemptTime&&new Date<this.nextAttemptTime){let U=new T(this.config.name,this.nextAttemptTime,i.context);if(i.fallback)try{return await i.fallback()}catch(z){console.error(z)}throw U}else this.transitionToHalfOpen();if(this.state==="HALF_OPEN"&&this.halfOpenCallCount>=this.config.halfOpenMaxCalls){let U=new T(this.config.name,this.nextAttemptTime||new Date(Date.now()+this.config.recoveryTimeout),i.context);if(i.fallback)try{return await i.fallback()}catch(z){throw console.error(z),U}throw U}let c=Date.now(),P,M=null;try{if(this.state==="HALF_OPEN")this.halfOpenCallCount++;let U=i.timeout||this.config.timeout,z=new Promise((de,pe)=>{setTimeout(()=>{pe(new v(`Circuit breaker timeout for ${this.config.name}`,U,i.context))},U)});return P=await Promise.race([i.execute(),z]),this.onSuccess(Date.now()-c),P}catch(U){if(M=U,this.onFailure(M,Date.now()-c),i.fallback)try{return await i.fallback()}catch(z){throw console.error(z),M}else throw M}}getState(){return this.state}getMetrics(){return{...this.metrics,state:this.state,nextAttemptTime:this.nextAttemptTime}}forceOpen(){this.transitionToOpen()}forceClosed(){this.transitionToClosed()}reset(){this.metrics={totalRequests:0,successfulRequests:0,failedRequests:0,timeouts:0,averageResponseTime:0,state:this.state,consecutiveFailures:0,consecutiveSuccesses:0},this.recentRequests=[]}onSuccess(i){if(this.metrics.totalRequests++,this.metrics.successfulRequests++,this.metrics.consecutiveSuccesses++,this.metrics.consecutiveFailures=0,this.metrics.lastSuccessTime=new Date,this.updateAverageResponseTime(i),this.recentRequests.push({timestamp:new Date,success:!0,responseTime:i}),this.state==="HALF_OPEN"){if(this.metrics.consecutiveSuccesses>=this.config.halfOpenMaxCalls)this.transitionToClosed()}if(this.config.onSuccess)this.config.onSuccess(this.config.name)}onFailure(i,c){if(this.metrics.totalRequests++,this.metrics.failedRequests++,this.metrics.consecutiveFailures++,this.metrics.consecutiveSuccesses=0,this.metrics.lastFailureTime=new Date,i instanceof v)this.metrics.timeouts++;if(this.updateAverageResponseTime(c),this.recentRequests.push({timestamp:new Date,success:!1,responseTime:c}),this.shouldTrip(i)){if(this.state==="CLOSED")this.transitionToOpen();else if(this.state==="HALF_OPEN")this.transitionToOpen()}if(this.config.onFailure)this.config.onFailure(i,this.config.name)}shouldTrip(i){if(this.config.shouldTripOnError&&!this.config.shouldTripOnError(i))return!1;if(this.metrics.consecutiveFailures>=this.config.failureThreshold)return!0;let c=this.getRecentRequests();if(c.length>=this.config.minimumRequests){if(c.filter((U)=>!U.success).length/c.length*100>=this.config.errorThresholdPercentage)return!0}return!1}transitionToClosed(){if(this.state="CLOSED",this.nextAttemptTime=void 0,this.halfOpenCallCount=0,this.metrics.state=this.state,this.config.onStateChange)this.config.onStateChange(this.state,this.config.name)}transitionToOpen(){if(this.state="OPEN",this.nextAttemptTime=new Date(Date.now()+this.config.recoveryTimeout),this.halfOpenCallCount=0,this.metrics.state=this.state,this.metrics.nextAttemptTime=this.nextAttemptTime,this.config.onStateChange)this.config.onStateChange(this.state,this.config.name)}transitionToHalfOpen(){if(this.state="HALF_OPEN",this.halfOpenCallCount=0,this.metrics.state=this.state,this.config.onStateChange)this.config.onStateChange(this.state,this.config.name)}updateAverageResponseTime(i){if(this.metrics.totalRequests===1)this.metrics.averageResponseTime=i;else this.metrics.averageResponseTime=0.1*i+0.9*this.metrics.averageResponseTime}getRecentRequests(){let i=new Date(Date.now()-this.config.monitoringPeriod);return this.recentRequests.filter((c)=>c.timestamp>i)}cleanupOldRequests(){let i=new Date(Date.now()-this.config.monitoringPeriod);this.recentRequests=this.recentRequests.filter((c)=>c.timestamp>i)}}class Ft{breakers=new Map;configs=new Map;register(i){let c=new ur(i);return this.breakers.set(i.name,c),this.configs.set(i.name,i),c}get(i){return this.breakers.get(i)}async execute(i,c){let P=this.breakers.get(i);if(!P)throw Error(`Circuit breaker '${i}' not found`);return P.execute(c)}getAllMetrics(){let i={};for(let[c,P]of this.breakers)i[c]=P.getMetrics();return i}getBreakersByState(i){let c=[];for(let[P,M]of this.breakers)if(M.getState()===i)c.push(P);return c}forceAllClosed(){for(let i of this.breakers.values())i.forceClosed()}resetAll(){for(let i of this.breakers.values())i.reset()}remove(i){return this.configs.delete(i),this.breakers.delete(i)}getNames(){return Array.from(this.breakers.keys())}}function Is(i){let c=new ur(i);return function(P,M,U){let z=U.value;return U.value=async function(...de){return c.execute({execute:()=>z.apply(this,de),context:{method:M,timestamp:new Date}})},U}}class on{registry;constructor(i){this.registry=i||new Ft}async fetch(i,c={}){let{circuitBreaker:P,fallback:M,context:U,...z}=c,de;if(typeof P==="string")de=P;else if(P){if(de=P.name,!this.registry.get(de))this.registry.register(P)}else if(de=`http-${new URL(i).hostname}`,!this.registry.get(de))this.registry.register({name:de,failureThreshold:5,recoveryTimeout:60000,timeout:30000,monitoringPeriod:60000,minimumRequests:10,errorThresholdPercentage:50,halfOpenMaxCalls:3,resetTimeout:60000});return this.registry.execute(de,{execute:async()=>{let pe=await fetch(i,z);if(pe.status>=500)throw new x(`HTTP ${pe.status}: ${pe.statusText}`,de,i,pe.status,void 0,U);return pe},fallback:M,context:U})}getRegistry(){return this.registry}}function _s(i){return async(c,P)=>{let M=c.context?.serviceName;if(!M)return P();let U=i.get(M);if(!U)return P();return U.execute({execute:P,context:{requestId:c.requestId,route:c.route,method:c.method,url:c.url}})}}var js={critical:(i)=>({name:i,failureThreshold:3,recoveryTimeout:30000,timeout:5000,monitoringPeriod:30000,minimumRequests:5,errorThresholdPercentage:30,halfOpenMaxCalls:2,resetTimeout:30000}),standard:(i)=>({name:i,failureThreshold:5,recoveryTimeout:60000,timeout:30000,monitoringPeriod:60000,minimumRequests:10,errorThresholdPercentage:50,halfOpenMaxCalls:3,resetTimeout:60000}),tolerant:(i)=>({name:i,failureThreshold:10,recoveryTimeout:120000,timeout:60000,monitoringPeriod:120000,minimumRequests:20,errorThresholdPercentage:70,halfOpenMaxCalls:5,resetTimeout:120000}),database:(i)=>({name:i,failureThreshold:3,recoveryTimeout:60000,timeout:1e4,monitoringPeriod:60000,minimumRequests:5,errorThresholdPercentage:40,halfOpenMaxCalls:2,resetTimeout:60000,shouldTripOnError:(c)=>!(c.message.includes("validation")||c.message.includes("constraint"))}),externalApi:(i)=>({name:i,failureThreshold:5,recoveryTimeout:90000,timeout:15000,monitoringPeriod:90000,minimumRequests:8,errorThresholdPercentage:60,halfOpenMaxCalls:3,resetTimeout:90000,shouldTripOnError:(c)=>{if(c instanceof x)return c.statusCode>=500;return!0}})},Hr=new Ft;function Ls(i){return Hr.register(i)}async function zs(i,c){return Hr.execute(i,c)}class Ar{config;sentry;constructor(i){this.config=i,this.initializeSentry()}async initializeSentry(){try{let i=await import("@sentry/node");i.init({dsn:this.config.dsn,environment:this.config.environment||"production",release:this.config.release,sampleRate:this.config.sampleRate||1,beforeSend:(c,P)=>{let M=P.originalException;if(M&&this.config.beforeSend)return this.config.beforeSend(M,M.context)?c:null;return c},ignoreErrors:this.config.filters?.ignoreErrors,denyUrls:this.config.filters?.ignoreUrls,allowUrls:this.config.filters?.allowUrls,initialScope:{tags:this.config.tags,extra:this.config.extra,user:this.config.user},maxBreadcrumbs:this.config.breadcrumbs?.maxBreadcrumbs||100,tracesSampleRate:this.config.performance?.tracesSampleRate||0.1}),this.sentry=i}catch(i){console.warn("Failed to initialize Sentry:",i)}}async report(i,c){if(!this.sentry||!this.config.enabled)return null;try{if(this.shouldIgnoreError(i))return null;let P={...i.context,...c};return this.sentry.withScope((M)=>{if(P.requestId)M.setTag("requestId",P.requestId);if(P.userId)M.setUser({id:P.userId});if(P.traceId)M.setTag("traceId",P.traceId);if(P.route)M.setTag("route",P.route);if(P.method)M.setTag("method",P.method);M.setTag("errorCode",i.code),M.setTag("severity",i.severity),M.setTag("category",i.category),M.setLevel(this.mapSeverityToLevel(i.severity)),M.setExtra("statusCode",i.statusCode),M.setExtra("retryable",i.retryable),M.setExtra("timestamp",i.timestamp),M.setExtra("context",P);let U=this.generateFingerprint(i);if(U.length>0)M.setFingerprint(U);return this.sentry.captureException(i)})}catch(P){return console.error("Failed to report error to Sentry:",P),null}}addBreadcrumb(i,c="default",P="info",M){if(!this.sentry||!this.config.breadcrumbs?.enabled)return;this.sentry.addBreadcrumb({message:i,category:c,level:P,data:M,timestamp:Date.now()/1000})}setUser(i){if(!this.sentry)return;this.sentry.setUser(i)}setTag(i,c){if(!this.sentry)return;this.sentry.setTag(i,c)}setExtra(i,c){if(!this.sentry)return;this.sentry.setExtra(i,c)}setContext(i,c){if(!this.sentry)return;this.sentry.setContext(i,c)}async close(i=2000){if(!this.sentry)return!0;return this.sentry.close(i)}shouldIgnoreError(i){let c=this.config.filters;if(!c)return!1;if(c.ignoreCodes?.includes(i.code))return!0;if(c.ignoreErrors?.some((P)=>{if(typeof P==="string")return i.message.includes(P);return P.test(i.message)}))return!0;return!1}mapSeverityToLevel(i){switch(i){case"low":return"info";case"medium":return"warning";case"high":return"error";case"critical":return"fatal";default:return"error"}}generateFingerprint(i){let c=[];if(c.push(i.code),c.push(i.category),i.context.route)c.push(i.context.route);return c}}class qr{config;bugsnag;constructor(i){this.config=i,this.initializeBugsnag()}async initializeBugsnag(){try{let i=await import("@bugsnag/js");i.start({apiKey:this.config.apiKey,appVersion:this.config.release,releaseStage:this.config.environment||"production",enabledReleaseStages:["production","staging"],maxBreadcrumbs:this.config.breadcrumbs?.maxBreadcrumbs||25,onError:(c)=>{let P=c.originalError;if(P&&this.config.beforeSend)return this.config.beforeSend(P,P.context)!==null;return!this.shouldIgnoreError(P)}}),this.bugsnag=i}catch(i){console.warn("Failed to initialize Bugsnag:",i)}}async report(i,c){if(!this.bugsnag||!this.config.enabled)return null;try{if(this.shouldIgnoreError(i))return null;let P={...i.context,...c};return this.bugsnag.notify(i,(M)=>{if(M.severity=this.mapSeverityToBugsnag(i.severity),M.context=P.route||P.url,P.userId)M.setUser(P.userId,void 0,void 0);M.addMetadata("error",{code:i.code,category:i.category,statusCode:i.statusCode,retryable:i.retryable,timestamp:i.timestamp}),M.addMetadata("request",{requestId:P.requestId,method:P.method,url:P.url,userAgent:P.userAgent,ip:P.ip}),M.groupingHash=this.generateGroupingHash(i)}),"reported"}catch(P){return console.error("Failed to report error to Bugsnag:",P),null}}addBreadcrumb(i,c="manual",P="info",M){if(!this.bugsnag||!this.config.breadcrumbs?.enabled)return;this.bugsnag.leaveBreadcrumb(i,M,c)}setUser(i){if(!this.bugsnag)return;this.bugsnag.setUser(i.id,i.email,i.username)}setTag(i,c){if(!this.bugsnag)return;this.bugsnag.addMetadata("tags",{[i]:c})}setExtra(i,c){if(!this.bugsnag)return;this.bugsnag.addMetadata("extra",{[i]:c})}setContext(i,c){if(!this.bugsnag)return;this.bugsnag.addMetadata(i,c)}async close(){return!0}shouldIgnoreError(i){let c=this.config.filters;if(!c)return!1;if(c.ignoreCodes?.includes(i.code))return!0;if(c.ignoreErrors?.some((P)=>{if(typeof P==="string")return i.message.includes(P);return P.test(i.message)}))return!0;return!1}mapSeverityToBugsnag(i){switch(i){case"low":return"info";case"medium":return"warning";case"high":return"error";case"critical":return"error";default:return"warning"}}generateGroupingHash(i){return`${i.code}-${i.category}-${i.context.route||"unknown"}`}}class an{config;reportHandler;constructor(i,c){this.config=i,this.reportHandler=c}async report(i,c){if(!this.config.enabled)return null;try{let P={...i.context,...c};if(this.config.beforeSend){if(!this.config.beforeSend(i,P))return null}let M={error:i,context:P,level:this.mapSeverityToLevel(i.severity),tags:this.config.tags,extra:this.config.extra,user:this.config.user};return await this.reportHandler(M)}catch(P){return console.error("Failed to report error with custom handler:",P),null}}addBreadcrumb(){}setUser(){}setTag(){}setExtra(){}setContext(){}async close(){return!0}mapSeverityToLevel(i){switch(i){case"low":return"info";case"medium":return"warning";case"high":return"error";case"critical":return"fatal";default:return"error"}}}class Vt{reporters=[];breadcrumbs=[];maxBreadcrumbs=50;constructor(i){this.initializeReporters(i)}initializeReporters(i){for(let c of i){if(!c.enabled)continue;switch(c.service){case"sentry":this.reporters.push(new Ar(c));break;case"bugsnag":this.reporters.push(new qr(c));break;case"custom":break}}}addReporter(i){this.reporters.push(i)}async report(i,c){let P=[];this.addBreadcrumb(`Error occurred: ${i.message}`,"error",{code:i.code,severity:i.severity});let M=this.reporters.map(async(U)=>{try{let z=await U.report(i,c);if(z)P.push(z)}catch(z){console.error("Reporter failed:",z)}});return await Promise.allSettled(M),P}addBreadcrumb(i,c="default",P){if(this.breadcrumbs.push({message:i,timestamp:new Date,data:{category:c,...P}}),this.breadcrumbs.length>this.maxBreadcrumbs)this.breadcrumbs=this.breadcrumbs.slice(-this.maxBreadcrumbs);this.reporters.forEach((M)=>{M.addBreadcrumb(i,c,"info",P)})}setUser(i){this.reporters.forEach((c)=>c.setUser(i))}setTag(i,c){this.reporters.forEach((P)=>P.setTag(i,c))}setExtra(i,c){this.reporters.forEach((P)=>P.setExtra(i,c))}setContext(i,c){this.reporters.forEach((P)=>P.setContext(i,c))}async close(i=5000){let c=this.reporters.map((M)=>M.close(i));return(await Promise.allSettled(c)).every((M)=>M.status==="fulfilled"&&M.value)}getBreadcrumbs(){return[...this.breadcrumbs]}}function Gs(i){return new Vt(i)}var Ws={sentry:(i,c="production")=>({enabled:!0,service:"sentry",dsn:i,environment:c,sampleRate:1,breadcrumbs:{enabled:!0,maxBreadcrumbs:100},performance:{enabled:!0,tracesSampleRate:0.1},filters:{ignoreErrors:["Non-Error promise rejection captured","ResizeObserver loop limit exceeded"],ignoreCodes:["VALIDATION_ERROR"]}}),bugsnag:(i,c="production")=>({enabled:!0,service:"bugsnag",apiKey:i,environment:c,breadcrumbs:{enabled:!0,maxBreadcrumbs:25},filters:{ignoreCodes:["VALIDATION_ERROR"]}}),development:()=>({enabled:!1,service:"custom",environment:"development"})};class Or{healthStatus=new Map;healthCheckIntervals=new Map;config;constructor(i){this.config=i,this.initializeHealthChecks()}initializeHealthChecks(){for(let[i,c]of Object.entries(this.config.healthChecks)){if(!c.enabled)continue;this.healthStatus.set(i,{name:i,status:"healthy",lastCheck:new Date,responseTime:0,errorRate:0,availability:100,consecutiveFailures:0});let P=setInterval(()=>this.performHealthCheck(i,c),c.interval);P.unref?.(),this.healthCheckIntervals.set(i,P)}}async performHealthCheck(i,c){let P=Date.now(),M=!1;try{let z=new AbortController,de=setTimeout(()=>z.abort(),c.timeout),pe=await fetch(c.endpoint,{signal:z.signal,headers:c.headers,method:"GET"});if(clearTimeout(de),M=c.expectedStatus.includes(pe.status),M&&c.expectedBody){let Re=await pe.text();if(typeof c.expectedBody==="string")M=Re.includes(c.expectedBody);else M=c.expectedBody.test(Re)}}catch(z){console.error(z),M=!1}let U=Date.now()-P;if(this.updateHealthStatus(i,M,U),M&&c.onHealthy)c.onHealthy();else if(!M&&c.onUnhealthy)c.onUnhealthy(Error(`Health check failed for ${i}`))}updateHealthStatus(i,c,P){let M=this.healthStatus.get(i);if(!M)return;let U={...M,lastCheck:new Date,responseTime:P,consecutiveFailures:c?0:M.consecutiveFailures+1};if(U.consecutiveFailures===0)U.status="healthy";else if(U.consecutiveFailures<3)U.status="degraded";else U.status="unhealthy";let z=c?1:0;U.availability=M.availability*0.9+z*10,this.healthStatus.set(i,U)}getServiceHealth(i){return this.healthStatus.get(i)}getAllServiceHealth(){return Array.from(this.healthStatus.values())}isServiceHealthy(i){return this.healthStatus.get(i)?.status==="healthy"}isServiceDegraded(i){return this.healthStatus.get(i)?.status==="degraded"}stop(){for(let i of this.healthCheckIntervals.values())clearInterval(i);this.healthCheckIntervals.clear()}}class Jt{config;healthMonitor;cache=new Map;metrics=new Map;constructor(i){this.config=i,this.healthMonitor=new Or(i)}async handleFailure(i,c,P,M){if(!this.config.enabled)throw c;let U=this.config.fallbackStrategies[i];if(!U)throw c;let z={request:P,serviceName:i,error:c,attemptCount:1,startTime:new Date};return this.executeFallbackStrategy(U,z,M)}async executeFallbackStrategy(i,c,P){if(c.attemptCount<=i.retries)try{if(c.attemptCount>1){let z=this.calculateBackoffDelay(i.backoff,c.attemptCount);await this.sleep(z)}let M=new Promise((z,de)=>{setTimeout(()=>de(Error("Timeout")),i.timeout)}),U=await Promise.race([P(),M]);return this.updateMetrics(c.serviceName,!0,Date.now()-c.startTime.getTime()),U}catch(M){if(console.error(M),c.attemptCount++,c.attemptCount<=i.retries)return this.executeFallbackStrategy(i,c,P)}switch(this.updateMetrics(c.serviceName,!1,Date.now()-c.startTime.getTime()),i.type){case"cache":return this.handleCacheFallback(i,c);case"static":return this.handleStaticFallback(i,c);case"simplified":return this.handleSimplifiedFallback(i,c);case"redirect":return this.handleRedirectFallback(i,c);case"custom":return this.handleCustomFallback(i,c);default:throw c.error}}async handleCacheFallback(i,c){if(!i.cacheConfig)throw c.error;let P=this.generateCacheKey(i.cacheConfig.key,c),M=this.cache.get(P);if(M&&(M.expires>new Date||i.cacheConfig.staleWhileRevalidate)){let U=new Headers({"Content-Type":"application/json","X-Cache":"HIT","X-Degraded":"true","X-Service-Status":this.healthMonitor.getServiceHealth(c.serviceName)?.status||"unknown"});if(i.cacheConfig.staleWhileRevalidate&&M.expires<=new Date)U.set("X-Cache","STALE");return new Response(JSON.stringify(M.data),{status:200,headers:U})}throw c.error}async handleStaticFallback(i,c){if(!i.staticResponse)throw c.error;let P=new Headers(i.staticResponse.headers||{});return P.set("X-Degraded","true"),P.set("X-Fallback-Type","static"),P.set("X-Service-Status",this.healthMonitor.getServiceHealth(c.serviceName)?.status||"unknown"),new Response(typeof i.staticResponse.body==="string"?i.staticResponse.body:JSON.stringify(i.staticResponse.body),{status:i.staticResponse.status,headers:P})}async handleSimplifiedFallback(i,c){let P={message:"Service temporarily unavailable. Showing simplified view.",status:"degraded",timestamp:new Date().toISOString(),requestId:c.request.requestId};return new Response(JSON.stringify(P),{status:200,headers:{"Content-Type":"application/json","X-Degraded":"true","X-Fallback-Type":"simplified","X-Service-Status":this.healthMonitor.getServiceHealth(c.serviceName)?.status||"unknown"}})}async handleRedirectFallback(i,c){if(!i.redirectConfig)throw c.error;return new Response(null,{status:i.redirectConfig.permanent?301:302,headers:{Location:i.redirectConfig.url,"X-Degraded":"true","X-Fallback-Type":"redirect"}})}async handleCustomFallback(i,c){if(!i.fallbackHandler)throw c.error;try{let P=await i.fallbackHandler(c.error,c.error.context);return P.headers.set("X-Degraded","true"),P.headers.set("X-Fallback-Type","custom"),P.headers.set("X-Service-Status",this.healthMonitor.getServiceHealth(c.serviceName)?.status||"unknown"),P}catch(P){throw console.error(P),c.error}}cacheResponse(i,c,P,M){let U=this.config.fallbackStrategies[i];if(U?.type==="cache"&&U.cacheConfig){let z=this.generateCacheKey(c,{serviceName:i});this.cache.set(z,{data:P,expires:new Date(Date.now()+M*1000)})}}getServiceMetrics(i){let c=this.metrics.get(i);if(!c||c.requests===0)return{errorRate:0,avgResponseTime:0,totalRequests:0};return{errorRate:c.errors/c.requests*100,avgResponseTime:c.totalTime/c.requests,totalRequests:c.requests}}getSystemHealth(){let i=this.healthMonitor.getAllServiceHealth(),c=i.filter((U)=>U.status==="unhealthy").length,P=i.filter((U)=>U.status==="degraded").length,M="healthy";if(c>0)M=c>i.length/2?"unhealthy":"degraded";else if(P>0)M="degraded";return{status:M,services:i}}calculateBackoffDelay(i,c){if(i.type==="fixed")return i.delay;let P=i.delay*2**(c-1);return Math.min(P,i.maxDelay||30000)}generateCacheKey(i,c){return i.replace("{service}",c.serviceName).replace("{url}",c.request.url).replace("{method}",c.request.method).replace("{userId}",String(c.request.user?.id||"anonymous"))}updateMetrics(i,c,P){let M=this.metrics.get(i)||{requests:0,errors:0,totalTime:0};if(M.requests++,M.totalTime+=P,!c)M.errors++;this.metrics.set(i,M)}sleep(i){return new Promise((c)=>setTimeout(c,i))}stop(){this.healthMonitor.stop()}}function Vs(i){let c=new Jt(i);return async(P,M)=>{try{let U=await M(),z=P.context?.serviceName;if(z&&U.ok){let de=i.fallbackStrategies[z];if(de?.type==="cache"&&de.cacheConfig)try{let pe=await U.clone().json();c.cacheResponse(z,de.cacheConfig.key,pe,de.cacheConfig.ttl)}catch{}}return U}catch(U){let z=P.context?.serviceName;if(z&&U instanceof Error){let de=U;try{return await c.handleFailure(z,de,P,M)}catch(pe){throw console.error(pe),U}}throw U}}}var Js={cacheFirst:(i=3600,c=!0)=>({type:"cache",priority:1,timeout:5000,retries:2,backoff:{type:"exponential",delay:1000,maxDelay:5000},cacheConfig:{key:"{service}:{url}:{method}",ttl:i,staleWhileRevalidate:c}}),staticFallback:(i,c=200)=>({type:"static",priority:2,timeout:1000,retries:0,backoff:{type:"fixed",delay:0},staticResponse:{status:c,body:i,headers:{"Content-Type":"application/json"}}}),simplifiedView:()=>({type:"simplified",priority:3,timeout:1000,retries:0,backoff:{type:"fixed",delay:0}}),redirectToMaintenance:(i)=>({type:"redirect",priority:4,timeout:1000,retries:0,backoff:{type:"fixed",delay:0},redirectConfig:{url:i,permanent:!1}})};class un{errorReporting;gracefulDegradation;circuitBreakerRegistry;config;constructor(i={}){this.config={development:!1,includeStackTrace:!1,sanitizeErrors:!0,logErrors:!0,...i},this.initializeComponents()}initializeComponents(){if(this.config.errorReporting?.length)this.errorReporting=new Vt(this.config.errorReporting);if(this.config.gracefulDegradation?.enabled)this.gracefulDegradation=new Jt(this.config.gracefulDegradation);if(this.config.circuitBreakers?.length){this.circuitBreakerRegistry=new Ft;for(let i of this.config.circuitBreakers)this.circuitBreakerRegistry.register(i)}}middleware(){return async(i,c)=>{try{let P={requestId:i.requestId,userId:i.user?.id,traceId:i.traceId,spanId:i.spanId,route:i.params?.route||i.url,method:i.method,url:i.url,userAgent:i.userAgent?.()||void 0,ip:i.ip?.()||void 0,timestamp:new Date};if(i.context={...i.context,errorContext:P},this.circuitBreakerRegistry&&i.context?.serviceName){let M=this.circuitBreakerRegistry.get(i.context.serviceName);if(M)return await M.execute({execute:c,context:P})}return await c()}catch(P){return this.handleError(P,i)}}}async handleError(i,c){let P=this.normalizeError(i,c);if(this.errorReporting)this.errorReporting.addBreadcrumb(`Error in ${c.method} ${c.url}`,"error",{code:P.code,severity:P.severity,statusCode:P.statusCode});if(this.config.logErrors)this.logError(P,c);if(this.gracefulDegradation&&c.context?.serviceName)try{return await this.gracefulDegradation.handleFailure(c.context.serviceName,P,c,async()=>{throw P})}catch{}if(this.errorReporting)try{await this.errorReporting.report(P,P.context)}catch(U){console.error("Failed to report error:",U)}if(this.config.globalErrorHandler)try{return await this.config.globalErrorHandler(P,c)}catch(U){console.error("Global error handler failed:",U)}let M=this.config.customErrorPages?.[P.statusCode];if(M)try{if(typeof M==="string")return new Response(M,{status:P.statusCode,headers:{"Content-Type":"text/html"}});else return await M(P,c)}catch(U){console.error("Custom error page failed:",U)}return this.createErrorResponse(P,c)}normalizeError(i,c){let P={requestId:c.requestId,userId:c.user?.id,traceId:c.traceId,spanId:c.spanId,route:c.params?.route||c.url,method:c.method,url:c.url,userAgent:c.userAgent?.()||void 0,ip:c.ip?.()||void 0,timestamp:new Date,metadata:c.context};if(i instanceof t)return i;if(i instanceof Error){if(i.name==="ValidationError")return s.validation(i.message,{},P);if(i.name==="UnauthorizedError"||i.message.includes("unauthorized"))return s.authentication(i.message,P);if(i.name==="ForbiddenError"||i.message.includes("forbidden"))return s.authorization(i.message,[],P);if(i.name==="NotFoundError"||i.message.includes("not found"))return s.notFound(void 0,void 0,P);if(i.name==="TimeoutError"||i.message.includes("timeout"))return s.timeout(30000,i.message,P);return s.internalServer(i.message,i,P)}if(typeof i==="string")return s.internalServer(i,void 0,P);return s.internalServer("An unknown error occurred",void 0,P)}createErrorResponse(i,c){let P=this.config.development,M=this.config.includeStackTrace||P,U=this.config.sanitizeErrors&&!P,z=i.message;if(U&&i.statusCode>=500)z="An internal server error occurred";let de={error:{code:i.code,message:z,statusCode:i.statusCode,timestamp:i.timestamp.toISOString(),requestId:i.context.requestId,traceId:i.context.traceId}};if(P)de.error.category=i.category,de.error.severity=i.severity,de.error.retryable=i.retryable,de.error.context=i.context;if(M){if(de.error.stack=i.stack,i.cause)de.error.cause={name:i.cause.name,message:i.cause.message,stack:i.cause.stack}}if("fields"in i)de.error.fields=i.fields;if("allowedMethods"in i)de.error.allowedMethods=i.allowedMethods;if("retryAfter"in i)de.error.retryAfter=i.retryAfter;let pe=new Headers({"Content-Type":"application/json","X-Error-Code":i.code,"X-Request-ID":i.context.requestId||"","X-Trace-ID":i.context.traceId||""});if("allowedMethods"in i)pe.set("Allow",i.allowedMethods.join(", "));if("retryAfter"in i)pe.set("Retry-After",i.retryAfter.toString());if("limit"in i)pe.set("X-RateLimit-Limit",i.limit.toString()),pe.set("X-RateLimit-Remaining",i.remaining.toString());return new Response(JSON.stringify(de),{status:i.statusCode,headers:pe})}logError(i,c){let P={error:i.toJSON(),request:{method:c.method,url:c.url,headers:Object.fromEntries(c.headers.entries()),userAgent:c.userAgent?.()||void 0,ip:c.ip?.()||void 0,requestId:c.requestId,traceId:c.traceId}};switch(i.severity){case"critical":console.error("[CRITICAL ERROR]",P);break;case"high":console.error("[ERROR]",P);break;case"medium":console.warn("[WARNING]",P);break;case"low":console.warn("[INFO]",P);break;default:console.error("[ERROR]",P)}}getStats(){return{errorReporting:this.errorReporting?{breadcrumbs:this.errorReporting.getBreadcrumbs().length}:void 0,gracefulDegradation:this.gracefulDegradation?this.gracefulDegradation.getSystemHealth():void 0,circuitBreakers:this.circuitBreakerRegistry?this.circuitBreakerRegistry.getAllMetrics():void 0}}async cleanup(){if(this.errorReporting)await this.errorReporting.close();if(this.gracefulDegradation)this.gracefulDegradation.stop()}}function cn(i={}){let c=new un(i);return{middleware:c.middleware(),getStats:()=>c.getStats(),cleanup:()=>c.cleanup()}}function Nt(i){if(!i.includes("%"))return i;try{return decodeURIComponent(i)}catch{return i}}function cr(i){let{read:c,write:P,remove:M}=i,U=()=>({...c()});for(let[z,de]of Object.entries(c()))Object.defineProperty(U,z,{value:de,writable:!0,enumerable:!0,configurable:!0});return U.get=(z)=>c()[z],U.set=(z,de,pe={})=>P?.(z,de,pe),U.delete=(z,de={})=>M?.(z,de),U.getAll=()=>({...c()}),U}function Ut(i={}){let c={...i};return cr({read:()=>c,write:(P,M)=>{c[P]=M},remove:(P)=>{delete c[P]}})}import{AsyncLocalStorage as Ks}from"async_hooks";var $r=new Ks,lr=!1,At=null;function Xs(){lr=!0}function dr(i,c){if(!lr){At=i;let P=c();if(P instanceof Promise)return P.finally(()=>{At=null});return At=null,P}return $r.run({current:i},c)}function pr(i){let c=$r.getStore();if(c){c.current=i;return}if(At!==null)At=i}function dn(){if(!lr)return lr=!0,At??void 0;return $r.getStore()?.current??At??void 0}function Qs(){let i=dn();if(!i)throw Error("request() called outside a request scope. It can only be invoked from within a route handler or middleware.");return i}var pn={enabled:!0,level:6,threshold:1024};function hn(i){if(!i)return!1;let c=i.split(";")[0]?.trim().toLowerCase()??"";if(c==="text/event-stream")return!1;if(c.startsWith("text/"))return!0;return["application/json","application/ld+json","application/manifest+json","application/javascript","application/x-javascript","application/xml","application/xhtml+xml","application/rss+xml","application/atom+xml","application/graphql","application/x-ndjson","image/svg+xml"].includes(c)}function Zs(i){if(!i)return null;let c=new Map;for(let M of i.split(",")){let[U="",...z]=M.trim().split(";"),de=z.map((pe)=>/^\s*q=([\d.]+)\s*$/i.exec(pe)).find(Boolean);c.set(U.trim().toLowerCase(),de?Number(de[1]):1)}let P=(M)=>(c.get(M)??c.get("*")??0)>0;if(P("gzip"))return"gzip";if(P("deflate"))return"deflate";return null}function Ys(i,c,P){if(!c)return!1;if(i.status===204||i.status===304||i.status===206)return!1;if(i.headers.has("content-encoding"))return!1;if(!hn(i.headers.get("content-type")))return!1;let M=Number(i.headers.get("content-length")??Number.NaN);if(Number.isFinite(M)&&!(M>=P))return!1;return Boolean(i.body)}function Br(i,c,P={}){if(!(P.enabled??pn.enabled))return i;let U=P.threshold??pn.threshold,z=Zs(c.headers.get("accept-encoding"));if(!Ys(i,z,U)){if(hn(i.headers.get("content-type"))&&!i.headers.has("content-encoding"))Dr(i.headers,"Accept-Encoding");return i}let de=Number(i.headers.get("content-length")??Number.NaN);if(!Number.isFinite(de))return ei(i,z,U);return gn(i,i.body,z)}async function Io(i,c,P={}){return Br(i,c,P)}async function ei(i,c,P){let M=await ti(i.body,P);if(M.ended&&M.size<P){let U=new Headers(i.headers);return Dr(U,"Accept-Encoding"),new Response(M.stream,{status:i.status,statusText:i.statusText,headers:U})}return gn(i,M.stream,c)}function gn(i,c,P){let M=new Headers(i.headers);M.set("Content-Encoding",P),Dr(M,"Accept-Encoding"),M.delete("Content-Length");let U=c.pipeThrough(new CompressionStream(P==="gzip"?"gzip":"deflate"));return new Response(U,{status:i.status,statusText:i.statusText,headers:M})}async function ti(i,c){let P=i.getReader(),M=[],U=0,z=!1;while(U<c){let{value:pe,done:Re}=await P.read();if(Re){z=!0;break}if(pe)M.push(pe),U+=pe.byteLength}return{stream:new ReadableStream({start(pe){for(let Re of M)pe.enqueue(Re);if(z)pe.close()},async pull(pe){if(z)return;let{value:Re,done:Te}=await P.read();if(Te){z=!0,pe.close();return}if(Re)pe.enqueue(Re)},cancel(pe){return P.cancel(pe)}}),size:U,ended:z}}function Dr(i,c){let P=i.get("vary");if(!P){i.set("Vary",c);return}let M=P.split(",").map((U)=>U.trim().toLowerCase());if(M.includes("*")||M.includes(c.toLowerCase()))return;i.set("Vary",`${P}, ${c}`)}var ke={json:(i,c={})=>{let P=typeof c==="number"?{status:c}:c,{status:M=200,headers:U={},pretty:z=!1}=P,de=z?JSON.stringify(i,null,2):JSON.stringify(i);return new Response(de,{status:M,headers:{"Content-Type":"application/json",...U}})},noContent:(i={})=>new Response(null,{status:204,headers:i}),download:async(i,c,P={})=>{let M=Bun.file(i);if(!await M.exists())return new Response("File not found",{status:404});let z=c||i.split("/").pop()||"download",de=M.type||"application/octet-stream";return new Response(M,{status:200,headers:{"Content-Type":de,"Content-Disposition":`attachment; filename="${z}"`,"Content-Length":String(M.size),...P}})},file:async(i,c={})=>{let P=Bun.file(i);if(!await P.exists())return new Response("File not found",{status:404});let U=P.type||"application/octet-stream";return new Response(P,{status:200,headers:{"Content-Type":U,"Content-Length":String(P.size),...c}})},streamDownload:(i,c,P={})=>{let{contentType:M="application/octet-stream",headers:U={}}=P,z=new ReadableStream({async start(de){try{for await(let pe of i())if(typeof pe==="string")de.enqueue(new TextEncoder().encode(pe));else de.enqueue(pe);de.close()}catch(pe){de.error(pe)}}});return new Response(z,{status:200,headers:{"Content-Type":M,"Content-Disposition":`attachment; filename="${c}"`,"Transfer-Encoding":"chunked",...U}})},redirect:(i,c=302)=>new Response(null,{status:c,headers:{Location:i}}),redirectPermanent:(i)=>ke.redirect(i,301),redirectTemporary:(i)=>ke.redirect(i,302),back:(i,c="/")=>{let P=i.headers.get("referer")||c;return ke.redirect(P)},view:(i,c=200,P={})=>new Response(i,{status:c,headers:{"Content-Type":"text/html; charset=utf-8",...P}}),text:(i,c=200,P={})=>new Response(i,{status:c,headers:{"Content-Type":"text/plain; charset=utf-8",...P}}),xml:(i,c=200,P={})=>new Response(i,{status:c,headers:{"Content-Type":"application/xml; charset=utf-8",...P}}),success:(i,c,P=200)=>{let M={success:!0};if(i!==void 0)M.data=i;if(c!==void 0)M.message=c;return ke.json(M,{status:P})},error:(i,c=400,P)=>{let M={success:!1,message:i};if(P!==void 0)M.errors=P;return ke.json(M,{status:c})},paginate:(i,c)=>{let{page:P,perPage:M,total:U,path:z}=c,de=Math.ceil(U/M),pe=(P-1)*M+1,Re=Math.min(P*M,U);return ke.json({data:i,meta:{current_page:P,per_page:M,total:U,last_page:de,from:pe,to:Re,path:z,first_page_url:`${z}?page=1`,last_page_url:`${z}?page=${de}`,next_page_url:P<de?`${z}?page=${P+1}`:null,prev_page_url:P>1?`${z}?page=${P-1}`:null}})},created:(i,c)=>{let P={};if(c)P.Location=c;let M={success:!0};if(i!==void 0)M.data=i;return ke.json(M,{status:201,headers:P})},accepted:(i)=>{let c={success:!0};if(i!==void 0)c.data=i;return ke.json(c,{status:202})},notFound:(i="Resource not found")=>ke.error(i,404),unauthorized:(i="Unauthorized")=>ke.error(i,401),forbidden:(i="Forbidden")=>ke.error(i,403),badRequest:(i="Bad request",c)=>ke.error(i,400,c),validationError:(i,c="Validation failed")=>ke.error(c,422,i),unprocessableEntity:(i="Unprocessable entity",c)=>ke.error(i,422,c),serverError:(i="Internal server error")=>ke.error(i,500),tooManyRequests:(i="Too many requests",c)=>{let P={};if(c)P["Retry-After"]=String(c);return new Response(JSON.stringify({message:i}),{status:429,headers:{"Content-Type":"application/json",...P}})}};class mn{_status=200;_headers={};_cookies=[];_deleteCookies=[];status(i){return this._status=i,this}header(i,c){return this._headers[i]=c,this}withHeaders(i){return this._headers={...this._headers,...i},this}cookie(i,c,P={}){return this._cookies.push({name:i,value:c,options:P}),this}withoutCookie(i,c={}){return this._deleteCookies.push({name:i,options:c}),this}json(i){let c=ke.json(i,{status:this._status,headers:this._headers});return this.applyCookies(c)}text(i){let c=ke.text(i,this._status,this._headers);return this.applyCookies(c)}html(i){let c=ke.view(i,this._status,this._headers);return this.applyCookies(c)}noContent(){let i=ke.noContent(this._headers);return this.applyCookies(i)}applyCookies(i){let c=new Headers(i.headers);for(let{name:P,value:M,options:U}of this._cookies){let z=this.serializeCookie(P,M,U);c.append("Set-Cookie",z)}for(let{name:P,options:M}of this._deleteCookies){let U=this.serializeCookie(P,"",{...M,maxAge:0,expires:new Date(0)});c.append("Set-Cookie",U)}return new Response(i.body,{status:i.status,headers:c})}serializeCookie(i,c,P){let M=`${encodeURIComponent(i)}=${encodeURIComponent(c)}`;if(P.maxAge!==void 0)M+=`; Max-Age=${P.maxAge}`;if(P.expires)M+=`; Expires=${P.expires.toUTCString()}`;if(P.httpOnly)M+="; HttpOnly";if(P.secure)M+="; Secure";if(P.path)M+=`; Path=${P.path}`;if(P.domain)M+=`; Domain=${P.domain}`;if(P.sameSite)M+=`; SameSite=${P.sameSite.charAt(0).toUpperCase()+P.sameSite.slice(1)}`;return M}}function jo(){return new mn}import ri from"process";class Fr{compiledPipelines=new Map;dependencyRegistry=new Map;singletonInstances=new Map;stats={totalExecutions:0,cacheHits:0,cacheMisses:0,shortCircuits:0,skippedMiddleware:0,averageExecutionTime:0,dependencyResolutions:0};registerDependency(i){this.dependencyRegistry.set(i.name,i)}compileMiddleware(i,c,P=[]){let M=[];for(let U=0;U<c.length;U++){let z=c[U],de=z.name||`middleware_${U}`;M.push({handler:z,name:de,skipConditions:P.filter((pe)=>pe.name.includes(de)||pe.name==="global"),dependencies:this.extractDependencies(z),canShortCircuit:this.canShortCircuit(z),priority:U})}this.compiledPipelines.set(i,M)}async execute(i,c,P){let M=performance.now();this.stats.totalExecutions++;let U=this.compiledPipelines.get(i);if(!U)return this.stats.cacheMisses++,await P();this.stats.cacheHits++;let z={request:c,dependencies:new Map,metadata:{}};await this.resolveDependencies(z,U);let de=0,pe=async()=>{if(de>=U.length)return await P();let xe=U[de++];if(await this.shouldSkip(xe,z))return this.stats.skippedMiddleware++,await pe();let ve=await xe.handler(c,pe);if(ve instanceof Response&&xe.canShortCircuit)return this.stats.shortCircuits++,ve;return ve},Re=await pe(),Te=performance.now()-M;return this.updateAverageExecutionTime(Te),Re||new Response("Internal Server Error",{status:500})}async shouldSkip(i,c){for(let P of i.skipConditions)if(await P.condition(c))return!0;return!1}async resolveDependencies(i,c){let P=new Set;for(let M of c)for(let U of M.dependencies)P.add(U);for(let M of P){let U=this.dependencyRegistry.get(M);if(!U)continue;if(this.stats.dependencyResolutions++,U.singleton&&this.singletonInstances.has(M))i.dependencies.set(M,this.singletonInstances.get(M));else{let z=await U.factory(i);if(i.dependencies.set(M,z),U.singleton)this.singletonInstances.set(M,z)}}}extractDependencies(i){let c=i.toString(),P=[];if(c.includes("database")||c.includes("db"))P.push("database");if(c.includes("logger")||c.includes("log"))P.push("logger");if(c.includes("cache"))P.push("cache");if(c.includes("httpClient")||c.includes("http"))P.push("httpClient");return P}canShortCircuit(i){let c=i.toString();return c.includes("return")&&c.includes("Response")}updateAverageExecutionTime(i){let c=this.stats.averageExecutionTime*(this.stats.totalExecutions-1);this.stats.averageExecutionTime=(c+i)/this.stats.totalExecutions}getStats(){return{...this.stats}}clear(){this.compiledPipelines.clear(),this.singletonInstances.clear(),this.stats={totalExecutions:0,cacheHits:0,cacheMisses:0,shortCircuits:0,skippedMiddleware:0,averageExecutionTime:0,dependencyResolutions:0}}}var ni={skipForMethods:(i)=>({name:`skip_for_methods_${i.join("_")}`,condition:(c)=>i.includes(c.request.method)}),skipForPaths:(i)=>({name:`skip_for_paths_${i.join("_").replace(/\//g,"_")}`,condition:(c)=>{let P=new URL(c.request.url);return i.some((M)=>P.pathname.startsWith(M))}}),skipForHeaders:(i)=>({name:`skip_for_headers_${Object.keys(i).join("_")}`,condition:(c)=>Object.entries(i).some(([P,M])=>c.request.headers.get(P)===M)}),skipForRoles:(i)=>({name:`skip_for_roles_${i.join("_")}`,condition:(c)=>{let P=c.request.user?.roles||[];return!i.some((M)=>P.includes(M))}}),skipForEnvironment:(i)=>({name:`skip_for_env_${i.join("_")}`,condition:()=>{let c=ri.env.NODE_ENV||"development";return i.includes(c)}})},si={database:(i)=>({name:"database",factory:async()=>({query:async(c)=>({rows:[]}),close:async()=>{},connectionString:i||"mock://database"}),singleton:!0}),logger:(i="info")=>({name:"logger",factory:()=>({info:(c)=>console.log(`[INFO] ${c}`),error:(c)=>console.error(`[ERROR] ${c}`),warn:(c)=>console.warn(`[WARN] ${c}`),debug:(c)=>console.debug(`[DEBUG] ${c}`),level:i}),singleton:!0}),cache:(i=1000)=>({name:"cache",factory:()=>{let c=new Map;return{get:(P)=>c.get(P),set:(P,M)=>{if(c.size>=i){let U=c.keys().next().value;c.delete(U)}c.set(P,M)},delete:(P)=>c.delete(P),clear:()=>c.clear(),size:()=>c.size}},singleton:!0}),httpClient:(i)=>({name:"httpClient",factory:()=>({get:async(c)=>fetch(i?`${i}${c}`:c),post:async(c,P)=>fetch(i?`${i}${c}`:c,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(P)}),put:async(c,P)=>fetch(i?`${i}${c}`:c,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(P)}),delete:async(c)=>fetch(i?`${i}${c}`:c,{method:"DELETE"})}),singleton:!0})},ii={auth:(i={})=>async(c,P)=>{let M=new URL(c.url);if(i.skipPaths?.some((z)=>M.pathname.startsWith(z)))return await P();if(!c.headers.get("Authorization")?.replace("Bearer ",""))return new Response("Unauthorized",{status:401});try{return c.user={id:"123",roles:["user"]},await P()}catch{return new Response("Invalid token",{status:401})}},rateLimit:(i)=>{let c=new Map;return async(P,M)=>{let U=P.headers.get("x-forwarded-for")||"unknown",z=Date.now(),de=z-i.windowMs;if(!c.has(U))c.set(U,[]);let Re=c.get(U).filter((Te)=>Te>de);if(Re.length>=i.maxRequests)return new Response("Too Many Requests",{status:429});return Re.push(z),c.set(U,Re),await M()}},cors:(i={})=>async(c,P)=>{let M=await P();if(M){let U=new Headers(M.headers);return U.set("Access-Control-Allow-Origin",i.origin||"*"),U.set("Access-Control-Allow-Methods",i.methods?.join(", ")||"GET, POST, PUT, DELETE"),U.set("Access-Control-Allow-Headers","Content-Type, Authorization"),new Response(M.body,{status:M.status,statusText:M.statusText,headers:U})}return M},logging:(i={})=>async(c,P)=>{let M=performance.now(),U=new URL(c.url);console.log(`[${new Date().toISOString()}] ${c.method} ${U.pathname}`);let z=await P(),de=performance.now()-M;if(z)console.log(`[${new Date().toISOString()}] ${c.method} ${U.pathname} - ${z.status} (${de.toFixed(2)}ms)`);return z}},oi=new Fr;import{existsSync as Rn,readdirSync as ai,statSync as ui}from"fs";import{basename as yn,extname as fn,join as ci,resolve as wn}from"path";var li=[".ts",".js"],di=["routes","src/routes"],pi=["web","index"];function hi(){let i=process.cwd();for(let c of di){let P=wn(i,c);if(Rn(P)&&ui(P).isDirectory())return P}return null}function bn(i,c){let P=[];if(!Rn(i))return P;let M=ai(i,{withFileTypes:!0});for(let U of M){if(U.name.startsWith(".")||U.name.startsWith("_"))continue;let z=ci(i,U.name);if(U.isDirectory())P.push(...bn(z,c));else if(li.includes(fn(U.name))){let de=i===c?"":i.slice(c.length),pe=yn(U.name,fn(U.name)),Re=pi.includes(pe)?de||"":`${de}/${pe}`;P.push({filePath:z,prefix:Re})}}return P}async function gi(i,c,P,M){try{let U=await import(c),z=0,de=i.routes?.length||0;if(typeof U.default==="function"){let pe=mi(i,P);await U.default(pe),z=(i.routes?.length||0)-de}else if(Array.isArray(U.routes))for(let pe of U.routes){let Re=(pe.method||"GET").toLowerCase(),Te=`${P}${pe.path}`;if(typeof i[Re]==="function")await i[Re](Te,pe.handler),z++}if(M&&z>0)console.log(` ${P||"/"} \u2192 ${yn(c)} (${z} routes)`);return z}catch(U){return console.error(`[bun-router] Failed to load route file ${c}:`,U),0}}function mi(i,c){if(!c)return i;let P=["get","post","put","patch","delete","options","any"];return new Proxy(i,{get(M,U){if(P.includes(U))return async(z,...de)=>M[U](`${c}${z}`,...de);if(U==="group")return async(z,de)=>{let pe=z.prefix?`${c}${z.prefix}`:c;return M.group({...z,prefix:pe},de)};return M[U]}})}function Tn(i){Object.defineProperties(i.prototype,{_routesDir:{value:null,writable:!0,configurable:!0},_apiRoutesInitialized:{value:!1,writable:!0,configurable:!0},_initApiRoutes:{async value(){if(this._apiRoutesInitialized)return;let c=this._routesDir||hi();if(!c){this._apiRoutesInitialized=!0;return}let P=this.config?.verbose||!1,M=bn(c,c);if(M.length===0){this._apiRoutesInitialized=!0;return}if(P)console.log(`[bun-router] Auto-discovering API routes from ${c}:`);let U=0;for(let{filePath:z,prefix:de}of M)U+=await gi(this,z,de,P);if(U>0&&P)console.log(`[bun-router] Registered ${U} API routes`);this._apiRoutesInitialized=!0},writable:!0,configurable:!0},routesFrom:{value(c){return this._routesDir=wn(c),this},writable:!0,configurable:!0}})}import{join as Kt,relative as Nr,resolve as Pt,dirname as Ri}from"path";import{readdirSync as xn,statSync as yi,existsSync as gr}from"fs";var Ko={enabled:!0,preserve:[],exclude:["_t","_cache","callback"],routes:[]};function fi(i){let{preserve:c=[],exclude:P=[],routes:M=[]}=i;if(!c.length)return"";return`<script data-query-preservation>
3
3
  (function(){
4
4
  var preserve = ${JSON.stringify(c)};
5
5
  var exclude = ${JSON.stringify(P)};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@stacksjs/bun-router",
3
3
  "type": "module",
4
- "version": "0.1.9",
4
+ "version": "0.1.10",
5
5
  "description": "A fast, type-safe router for Bun.",
6
6
  "author": "Chris Breuer <chris@stacksjs.com>",
7
7
  "license": "MIT",