honestjs 0.1.20 → 0.1.21

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/README.md CHANGED
@@ -94,13 +94,13 @@ See [honestjs/skills](https://github.com/honestjs/skills) for details.
94
94
 
95
95
  ```bash
96
96
  bun add -g @honestjs/cli
97
- honestjs new my-project # alias: honest, hnjs
97
+ honestjs new my-project -t blank # alias: honest, hnjs; smallest layout (omit -t for interactive template pick)
98
98
  cd my-project
99
99
  bun dev
100
100
  ```
101
101
 
102
- This creates a new project with a standard structure and config. Use the [website](https://github.com/honestjs/website)
103
- for full docs.
102
+ See **[Getting Started](https://honestjs.dev/docs/getting-started)** on [honestjs.dev](https://honestjs.dev) for the full
103
+ tutorial. Repo: [website](https://github.com/honestjs/website).
104
104
 
105
105
  ## Features
106
106
 
@@ -0,0 +1,13 @@
1
+ import type { IPlugin, PluginEntry, PluginProcessor } from '../interfaces';
2
+ import type { Constructor } from '../types';
3
+ export declare const DEFAULT_PLUGIN_NAME = "AnonymousPlugin";
4
+ export interface NormalizedPluginEntry {
5
+ plugin: IPlugin;
6
+ name: string;
7
+ preProcessors: PluginProcessor[];
8
+ postProcessors: PluginProcessor[];
9
+ }
10
+ export declare function resolvePlugin(pluginType: Constructor<IPlugin> | IPlugin): IPlugin;
11
+ export declare function resolvePluginName(plugin: IPlugin, index: number, override?: string): string;
12
+ export declare function normalizePluginEntry(entry: PluginEntry, index: number): NormalizedPluginEntry;
13
+ export declare function normalizePluginEntries(plugins: PluginEntry[] | undefined): NormalizedPluginEntry[];
@@ -0,0 +1,4 @@
1
+ import type { HonestOptions, ILogger } from '../interfaces';
2
+ import type { Constructor } from '../types';
3
+ export declare function createStartupGuideHints(errorMessage: string): string[];
4
+ export declare function emitStartupGuide(logger: ILogger, startupGuide: HonestOptions['startupGuide'], error: unknown, rootModule: Constructor): void;
@@ -18,15 +18,10 @@ export declare class Application {
18
18
  private readonly routeManager;
19
19
  private readonly logger;
20
20
  private readonly options;
21
- private static readonly DEFAULT_PLUGIN_NAME;
22
21
  constructor(options?: HonestOptions, metadataRepository?: IMetadataRepository);
23
22
  private setupErrorHandlers;
24
- private resolvePlugin;
25
- private normalizePluginEntry;
26
- private resolvePluginName;
27
23
  private shouldEmitRouteDiagnostics;
28
24
  private emitStartupGuide;
29
- private createStartupGuideHints;
30
25
  register(moduleClass: Constructor): Promise<Application>;
31
26
  static create(rootModule: Constructor, options?: HonestOptions): Promise<{
32
27
  app: Application;
@@ -24,5 +24,5 @@ export declare class ErrorHandler {
24
24
  [x: string]: string;
25
25
  };
26
26
  }[] | undefined;
27
- }, 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 300 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511 | -1, "json">>;
27
+ }, -1 | 100 | 102 | 103 | 200 | 201 | 202 | 203 | 206 | 207 | 208 | 226 | 300 | 301 | 302 | 303 | 305 | 306 | 307 | 308 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 421 | 422 | 423 | 424 | 425 | 426 | 428 | 429 | 431 | 451 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 510 | 511, "json">>;
28
28
  }
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import"reflect-metadata";import{Hono as B$}from"hono";class h{store=new Map;get($){return this.store.get($)}set($,_){this.store.set($,_)}has($){return this.store.has($)}delete($){return this.store.delete($)}keys(){return this.store.keys()}}class g{emit($){let _=`[HonestJS:${$.category}]`,W=$.details?[_,$.message,$.details]:[_,$.message];switch($.level){case"debug":case"info":console.info(...W);break;case"warn":console.warn(...W);break;case"error":console.error(...W);break}}}class A{emit($){}}class Y{static routes=new Map;static controllers=new Map;static controllerOptions=new Map;static services=new Set;static modules=new Map;static parameters=new Map;static contextIndices=new Map;static controller=new Map([["middleware",new Map],["guard",new Map],["pipe",new Map],["filter",new Map]]);static handler=new Map([["middleware",new Map],["guard",new Map],["pipe",new Map],["filter",new Map]]);static getRoutes($){return this.routes.get($)||[]}static setRoutes($,_){this.routes.set($,_)}static addRoute($,_){if(!this.routes.has($))this.routes.set($,[]);this.routes.get($).push(_)}static getControllerPath($){return this.controllers.get($)||""}static hasController($){return this.controllers.has($)}static setControllerPath($,_){this.controllers.set($,_)}static getControllerOptions($){return this.controllerOptions.get($)||{}}static setControllerOptions($,_){this.controllerOptions.set($,_)}static isService($){return this.services.has($)}static addService($){this.services.add($)}static getAllServices(){return this.services}static getModuleOptions($){return this.modules.get($)}static setModuleOptions($,_){this.modules.set($,_)}static getParameters($){return this.parameters.get($)||new Map}static setParameterMap($,_){this.parameters.set($,_)}static getContextIndices($){return this.contextIndices.get($)||new Map}static setContextIndices($,_){this.contextIndices.set($,_)}static registerController($,_,W){let Q=this.controller.get($);if(!Q.has(_))Q.set(_,[]);Q.get(_).push(W)}static getController($,_){return this.controller.get($).get(_)||[]}static registerHandler($,_,W){let Q=this.handler.get($);if(!Q.has(_))Q.set(_,[]);Q.get(_).push(W)}static getHandler($,_){return this.handler.get($).get(_)||[]}static clearHandlerComponents(){for(let $ of this.handler.values())$.clear()}static clear(){this.routes.clear(),this.controllers.clear(),this.controllerOptions.clear(),this.services.clear(),this.modules.clear(),this.parameters.clear(),this.contextIndices.clear();for(let $ of this.controller.values())$.clear();for(let $ of this.handler.values())$.clear()}}class H{hasController($){return Y.hasController($)}getControllerPath($){return Y.getControllerPath($)}getControllerOptions($){return Y.getControllerOptions($)}getRoutes($){return Y.getRoutes($)}getParameters($){return Y.getParameters($)}getContextIndices($){return Y.getContextIndices($)}getModuleOptions($){return Y.getModuleOptions($)}getControllerComponents($,_){return Y.getController($,_)}getHandlerComponents($,_){return Y.getHandler($,_)}}class C{controllerPaths=new Map;controllerOptions=new Map;routes=new Map;parameters=new Map;contextIndices=new Map;modules=new Map;controllerComponents=new Map([["middleware",new Map],["guard",new Map],["pipe",new Map],["filter",new Map]]);handlerComponents=new Map([["middleware",new Map],["guard",new Map],["pipe",new Map],["filter",new Map]]);static fromRootModule($,_=new H){let W=new C;return W.captureModuleGraph($,_),W}hasController($){return this.controllerPaths.has($)}getControllerPath($){return this.controllerPaths.get($)||""}getControllerOptions($){let _=this.controllerOptions.get($);return _?{..._}:{}}getRoutes($){return(this.routes.get($)||[]).map((_)=>this.cloneRouteDefinition(_))}getParameters($){let _=this.parameters.get($);if(!_)return new Map;let W=new Map;for(let[Q,X]of _.entries())W.set(Q,X.map((Z)=>({...Z})));return W}getContextIndices($){return new Map(this.contextIndices.get($)||new Map)}getModuleOptions($){let _=this.modules.get($);if(!_)return;return{controllers:_.controllers?[..._.controllers]:void 0,services:_.services?[..._.services]:void 0,imports:_.imports?[..._.imports]:void 0}}getControllerComponents($,_){return[...this.controllerComponents.get($).get(_)||[]]}getHandlerComponents($,_){return[...this.handlerComponents.get($).get(_)||[]]}captureModuleGraph($,_){let W=new Set,Q=new Set,X=(Z)=>{if(W.has(Z))return;W.add(Z);let J=_.getModuleOptions(Z);if(!J)return;let U={controllers:J.controllers?[...J.controllers]:void 0,services:J.services?[...J.services]:void 0,imports:J.imports?[...J.imports]:void 0};this.modules.set(Z,U);for(let B of U.controllers||[])Q.add(B);for(let B of U.imports||[])X(B)};X($);for(let Z of Q)this.captureController(Z,_)}captureController($,_){if(!_.hasController($))return;this.controllerPaths.set($,_.getControllerPath($)||""),this.controllerOptions.set($,{..._.getControllerOptions($)});let W=(_.getRoutes($)||[]).map((Z)=>this.cloneRouteDefinition(Z));this.routes.set($,W);let Q=_.getParameters($),X=new Map;for(let[Z,J]of Q.entries())X.set(Z,(J||[]).map((U)=>({...U})));this.parameters.set($,X),this.contextIndices.set($,new Map(_.getContextIndices($)||new Map));for(let Z of["middleware","guard","pipe","filter"])this.controllerComponents.get(Z).set($,[..._.getControllerComponents(Z,$)||[]]);for(let Z of W){let J=`${$.name}:${String(Z.handlerName)}`;for(let U of["middleware","guard","pipe","filter"])this.handlerComponents.get(U).set(J,[..._.getHandlerComponents(U,J)||[]])}}cloneRouteDefinition($){return{...$,version:Array.isArray($.version)?[...$.version]:$.version}}}class m{routes=[];registerRoute($){if(!$)throw Error("Route info is required");if(!$.controller)throw Error("Route controller is required");if(!$.handler)throw Error("Route handler is required");if(!$.method)throw Error("Route method is required");if(!$.fullPath)throw Error("Route fullPath is required");if(this.routes.some((W)=>W.fullPath===$.fullPath&&W.method.toUpperCase()===$.method.toUpperCase()))throw Error(`Duplicate route detected: ${$.method.toUpperCase()} ${$.fullPath} (${String($.controller)}.${String($.handler)})`);this.routes.push($)}getRoutes(){return this.routes}getRoutesByController($){return this.routes.filter((_)=>_.controller===$)}getRoutesByMethod($){return this.routes.filter((_)=>_.method.toUpperCase()===$.toUpperCase())}getRoutesByPath($){return this.routes.filter((_)=>$.test(_.fullPath))}clear(){this.routes.length=0}}class u{isService($){return Y.isService($)}}class w{serviceRegistry;logger;debugDi;constructor($=new u,_=new A,W=!1){this.serviceRegistry=$;this.logger=_;this.debugDi=W}instances=new Map;emitLog($){if(!this.debugDi)return;this.logger.emit($)}resolve($){return this.resolveWithTracking($,new Set)}resolveWithTracking($,_){if(this.instances.has($))return this.emitLog({level:"debug",category:"di",message:`Resolved ${$.name} from DI cache`}),this.instances.get($);if(_.has($)){let Z=[..._.keys(),$].map((J)=>J.name).join(" -> ");throw this.emitLog({level:"error",category:"di",message:`Circular dependency detected while resolving ${$.name}`,details:{cycle:Z}}),Error(`Circular dependency detected: ${Z}`)}_.add($),this.emitLog({level:"debug",category:"di",message:`Resolving ${$.name}`,details:{resolving:[..._].map((Z)=>Z.name)}});let W=Reflect.getMetadata("design:paramtypes",$)||[];if($.length>0&&W.length===0){if(!this.serviceRegistry.isService($))throw this.emitLog({level:"error",category:"di",message:`Cannot resolve ${$.name}: missing @Service() decorator`}),Error(`Cannot resolve ${$.name}: it is not decorated with @Service(). Did you forget to add @Service() to the class?`);throw this.emitLog({level:"error",category:"di",message:`Cannot resolve ${$.name}: missing constructor metadata`}),Error(`Cannot resolve dependencies for ${$.name}: constructor metadata is missing. Ensure 'reflect-metadata' is imported and 'emitDecoratorMetadata' is enabled.`)}let Q=W.map((Z,J)=>{if(!Z||Z===Object||Z===Array||Z===Function)throw this.emitLog({level:"error",category:"di",message:`Cannot resolve dependency at index ${J} of ${$.name}`}),Error(`Cannot resolve dependency at index ${J} of ${$.name}. Use concrete class types for constructor dependencies.`);return this.resolveWithTracking(Z,new Set(_))}),X=new $(...Q);return this.instances.set($,X),this.emitLog({level:"debug",category:"di",message:`Created ${$.name} instance`,details:{dependencyCount:Q.length}}),X}register($,_){this.instances.set($,_)}has($){return this.instances.has($)}clear(){this.instances.clear()}}import{HTTPException as U$}from"hono/http-exception";class d extends Error{status;code;category;remediation;details;constructor($,_){super($);if(this.name="FrameworkError",this.status=_.status,this.code=_.code,this.category=_.category,this.remediation=_.remediation,this.details=_.details,_.cause!==void 0)this.cause=_.cause}}function b($,_,W){let Q=$ instanceof Error?$:Error(String($)),X=new Date().toISOString(),Z=_.get("requestId"),J=_.req.path;if(Q instanceof U$)return{response:{status:W?.status||Q.status,message:W?.title||Q.message,timestamp:X,path:J,requestId:Z,code:W?.code,details:W?.additionalDetails,...W?.detail&&{detail:W.detail}},status:W?.status||Q.status};if(Q instanceof d){let j=W?.status||Q.status||500;return{response:{status:j,message:W?.title||Q.message,timestamp:X,path:J,requestId:Z,code:W?.code||Q.code,details:{category:Q.category,remediation:Q.remediation,...Q.details,...W?.additionalDetails},...W?.detail&&{detail:W.detail}},status:j}}if(Q.statusCode||Q.status){let j=Q.statusCode||Q.status||500,q=W?.status||j;return{response:{status:q,message:W?.title||Q.message,timestamp:X,path:J,requestId:Z,code:W?.code||Q.name,details:W?.additionalDetails,...W?.detail&&{detail:W.detail}},status:q}}let U=W?.status||500;return{response:{status:U,message:W?.title||Q.message,timestamp:X,path:J,requestId:Z,code:W?.code||Q.name,details:W?.additionalDetails||{stack:Q.stack},...W?.detail&&{detail:W.detail}},status:U}}function O($){return(_="",W={})=>{return(Q,X,Z)=>{let J=Q.constructor;Y.addRoute(J,{path:_,method:$,handlerName:X,version:W.version,prefix:W.prefix})}}}function L($,_){let W=(Q,X)=>{if(Q===void 0)return X;return X.get(String(Q))};return(Q)=>{return(X,Z,J)=>{let U=X.constructor;if(!Y.getParameters(U).size)Y.setParameterMap(U,new Map);let B=Y.getParameters(U);if(!B.has(Z))B.set(Z,[]);let q=Reflect.getMetadata("design:paramtypes",X,Z)?.[J];if(B.get(Z).push({index:J,name:$,data:Q,factory:_||W,metatype:q}),$==="context"){if(!Y.getContextIndices(U).size)Y.setContextIndices(U,new Map);Y.getContextIndices(U).set(Z,J)}}}}class c{static handle(){return async($,_)=>{let{response:W,status:Q}=b($,_);return _.json(W,Q)}}}class p{static handle(){return async($)=>{return $.json({message:`Not Found - ${$.req.path}`},404)}}}var i=Symbol("VERSION_NEUTRAL");var I="__honest_controllerClass",M="__honest_handlerName",s="__honest.body.cache";var X_=($)=>typeof $>"u",S=($)=>$===null||typeof $>"u",T=($)=>$!==null&&typeof $==="object",Z_=($)=>{if(!T($))return!1;let _=Object.getPrototypeOf($);if(_===null)return!0;let W=Object.prototype.hasOwnProperty.call(_,"constructor")&&_.constructor;return typeof W==="function"&&W instanceof W&&Function.prototype.toString.call(W)===Function.prototype.toString.call(Object)},_$=($)=>typeof $==="function",f=($)=>typeof $==="string",J_=($)=>typeof $==="number",U_=($)=>$.length===0,Y_=($)=>typeof $==="symbol",B_=($)=>typeof $==="string"?$.charAt(0)!=="/"?"/"+$:$:"",l=($)=>$?$.startsWith("/")?("/"+$.replace(/\/+$/,"")).replace(/\/+/g,"/"):"/"+$.replace(/\/+$/,""):"/",q_=($)=>$.endsWith("/")?$.slice(0,-1):$,W$=($)=>{return _$($)&&!S($.prototype)&&!_$($.prototype)&&Object.getOwnPropertyNames($.prototype).length>=1};class n{container;metadataRepository;logger;globalComponents=new Map([["middleware",new Set],["guard",new Set],["pipe",new Set],["filter",new Set]]);constructor($,_=new H,W=new A){this.container=$;this.metadataRepository=_;this.logger=W}setupGlobalComponents($){let _=$.components||{};if(_.middleware)this.registerGlobal("middleware",..._.middleware);if(_.guards)this.registerGlobal("guard",..._.guards);if(_.pipes)this.registerGlobal("pipe",..._.pipes);if(_.filters)this.registerGlobal("filter",..._.filters)}registerGlobal($,..._){_.forEach((W)=>{this.globalComponents.get($).add(W)})}getGlobal($){return this.globalComponents.get($)}getComponents($,_,W){let Q=`${_.name}:${String(W)}`,X=this.metadataRepository.getHandlerComponents($,Q),Z=this.metadataRepository.getControllerComponents($,_);return[...Array.from(this.globalComponents.get($)||[]),...Z,...X]}resolveMiddleware($){return $.map((_)=>{if(T(_)&&"use"in _)return _.use.bind(_);let W=this.container.resolve(_);return W.use.bind(W)})}getHandlerMiddleware($,_){let W=this.getComponents("middleware",$,_);return this.resolveMiddleware(W)}getGlobalMiddleware(){let $=Array.from(this.globalComponents.get("middleware")||[]);return this.resolveMiddleware($)}resolveGuards($){return $.map((_)=>{if(T(_)&&"canActivate"in _)return _;return this.container.resolve(_)})}getHandlerGuards($,_){let W=this.getComponents("guard",$,_);return this.resolveGuards(W)}resolvePipes($){return $.map((_)=>{if(T(_)&&"transform"in _)return _;return this.container.resolve(_)})}getHandlerPipes($,_){let W=this.getComponents("pipe",$,_);return this.resolvePipes(W)}async executePipes($,_,W){let Q=$;for(let X of W)Q=await X.transform(Q,_);return Q}async handleException($,_){let W=_.get(I),Q=_.get(M);if(W&&Q){let U=this.metadataRepository.getHandlerComponents("filter",`${W.name}:${Q}`);if(U.length>0){let B=await this.executeFilters(U,$,_);if(B)return B}}if(W){let U=this.metadataRepository.getControllerComponents("filter",W);if(U.length>0){let B=await this.executeFilters(U,$,_);if(B)return B}}let X=Array.from(this.globalComponents.get("filter")||[]);if(X.length>0){let U=await this.executeFilters(X,$,_);if(U)return U}let{response:Z,status:J}=b($,_);return _.json(Z,J)}async executeFilters($,_,W){for(let Q of $){let X;if(T(Q)&&"catch"in Q)X=Q;else X=this.container.resolve(Q);try{let Z=await X.catch(_,W);if(Z!==void 0)return Z}catch(Z){let J=X.constructor?.name||"UnknownFilter";this.logger.emit({level:"error",category:"errors",message:`Error in exception filter ${J}`,details:{error:Z instanceof Error?Z.message:String(Z)}});let{response:U,status:B}=b(Z,W);return W.json(U,B)}}return}async registerModule($,_=new Set){if(_.has($))return[];_.add($);let W=this.metadataRepository.getModuleOptions($);if(!W)throw this.logger.emit({level:"error",category:"startup",message:`Module ${$.name} is not properly decorated with @Module()`}),Error(`Module ${$.name} is not properly decorated with @Module()`);let Q=[];if(W.imports&&W.imports.length>0)for(let X of W.imports){let Z=await this.registerModule(X,_);Q.push(...Z)}if(W.services&&W.services.length>0)for(let X of W.services)this.container.resolve(X);if(W.controllers&&W.controllers.length>0)Q.push(...W.controllers);return Q}}class a{async invoke({handler:$,args:_,context:W,contextIndex:Q}){let X=await $(..._);if(Q!==void 0)return X;if(X instanceof Response)return X;if(S(X))return W.json(null);if(f(X))return W.text(X);return W.json(X)}}class r{componentManager;constructor($){this.componentManager=$}async resolveArguments($){let{controllerName:_,handlerName:W,handlerArity:Q,handlerParams:X,handlerPipes:Z,context:J}=$,U=X.length>0?Math.max(...X.map((j)=>j.index)):-1,B=Array(Math.max(Q,U+1));for(let j of X){if(typeof j.factory!=="function")throw Error(`Invalid parameter decorator metadata for ${_}.${String(W)}`);let q=await j.factory(j.data,J),z=await this.componentManager.executePipes(q,{type:j.name,metatype:j.metatype,data:typeof j.data==="string"||typeof j.data>"u"?j.data:String(j.data)},Z);B[j.index]=z}return B}}import{HTTPException as Y$}from"hono/http-exception";class o{componentManager;parameterResolver;handlerInvoker;logger;debugPipeline;constructor($,_,W,Q=new A,X=!1){this.componentManager=$;this.parameterResolver=_;this.handlerInvoker=W;this.logger=Q;this.debugPipeline=X}async execute($){let{controllerClass:_,handlerName:W,handler:Q,handlerParams:X,handlerPipes:Z,contextIndex:J,context:U}=$;U.set(I,_),U.set(M,String(W));let B=this.componentManager.getHandlerGuards(_,W);for(let q of B)if(!await q.canActivate(U)){if(this.debugPipeline)this.logger.emit({level:"warn",category:"pipeline",message:`Guard rejected request at ${_.name}.${String(W)}`,details:{guard:q.constructor?.name||"UnknownGuard"}});throw new Y$(403,{message:`Forbidden by ${q.constructor?.name||"UnknownGuard"} at ${_.name}.${String(W)}`})}let j=await this.parameterResolver.resolveArguments({controllerName:_.name,handlerName:W,handlerArity:Q.length,handlerParams:X,handlerPipes:Z,context:U});if(this.debugPipeline)this.logger.emit({level:"debug",category:"pipeline",message:`Resolved handler arguments for ${_.name}.${String(W)}`,details:{guardCount:B.length,parameterCount:X.length,pipeCount:Z.length}});return this.handlerInvoker.invoke({handler:Q,args:j,context:U,contextIndex:J})}}class t{hono;container;routeRegistry;componentManager;parameterResolver;pipelineExecutor;metadataRepository;logger;globalPrefix;globalVersion;constructor($,_,W,Q,X=new H,Z=new A,J={}){this.hono=$,this.container=_,this.routeRegistry=W,this.componentManager=Q,this.parameterResolver=new r(this.componentManager),this.logger=Z,this.pipelineExecutor=new o(this.componentManager,this.parameterResolver,new a,this.logger,Boolean(J.debugPipeline)),this.metadataRepository=X,this.globalPrefix=J.prefix!==void 0?this.normalizePath(J.prefix):void 0,this.globalVersion=J.version,this.applyGlobalMiddleware()}applyGlobalMiddleware(){let $=this.componentManager.getGlobalMiddleware();for(let _ of $)this.hono.use("*",_)}normalizePath($){if(!f($))throw Error(`Invalid path: expected a string but received ${typeof $}. Check your @Controller() and route decorator arguments.`);return l($)}registerRouteHandler($,_,W,Q){if(W.length>0)this.hono.on($.toUpperCase(),[_],...W,Q);else this.hono.on($.toUpperCase(),[_],Q)}buildRoutePath($,_,W,Q){return l(`${$}${_}${W}${Q}`)}formatVersionSegment($){if(S($))return"";return $===i?"":`/v${String($)}`}async registerController($){if(!this.metadataRepository.hasController($))throw Error(`Controller ${$.name} is not decorated with @Controller()`);let _=this.metadataRepository.getControllerPath($)||"",W=this.metadataRepository.getControllerOptions($)||{},Q=this.metadataRepository.getRoutes($)||[],X=this.metadataRepository.getParameters($)||new Map,Z=this.metadataRepository.getContextIndices($)||new Map,J=this.normalizePath(_),U=this.container.resolve($),B=W.prefix!==void 0?W.prefix:this.globalPrefix,j=W.version!==void 0?W.version:this.globalVersion;if(Q.length===0)throw Error(`Controller ${$.name} has no route handlers. Add HTTP method decorators like @Get()`);for(let q of Q){let{path:z,method:G,version:V,prefix:k}=q,D=k!==void 0?k:B,N=!S(D)?this.normalizePath(D):"",K=V!==void 0?V:j,E=this.normalizePath(z);if(S(K)){this.registerRoute(U,q,X,Z,$,N,"",J,E,G);continue}if(K===i){this.registerRoute(U,q,X,Z,$,N,"",J,E,G),this.registerRoute(U,q,X,Z,$,N,"/:version{v[0-9]+}",J,E,G);continue}if(Array.isArray(K)){for(let R of K){let y=this.formatVersionSegment(R);this.registerRoute(U,q,X,Z,$,N,y,J,E,G)}continue}let v=this.formatVersionSegment(K);this.registerRoute(U,q,X,Z,$,N,v,J,E,G)}}registerRoute($,_,W,Q,X,Z,J,U,B,j){let{handlerName:q}=_,z=this.buildRoutePath(Z,J,U,B),G=$[q].bind($),V=W.get(q)||[],k=Q.get(q),D=this.componentManager.getHandlerMiddleware(X,q),N=this.componentManager.getHandlerPipes(X,q);this.routeRegistry.registerRoute({controller:X.name,handler:q,method:j,prefix:Z,version:J,route:U,path:B,fullPath:z,parameters:V});let K=this.componentManager,E=this.pipelineExecutor,v=async(R)=>{try{return await E.execute({controllerClass:X,handlerName:q,handler:G,handlerParams:V,handlerPipes:N,contextIndex:k,context:R})}catch(y){return K.handleException(y,R)}};this.registerRouteHandler(j,z,D,v)}}class P{hono;container;context;routeRegistry;metadataRepository;componentManager;routeManager;logger;options;static DEFAULT_PLUGIN_NAME="AnonymousPlugin";constructor($={},_=new H){this.options=T($)?$:{};let W=this.options.debug===!0||typeof this.options.debug==="object"&&Boolean(this.options.debug.pipeline),Q=this.options.debug===!0||typeof this.options.debug==="object"&&Boolean(this.options.debug.di);if(this.hono=new B$(this.options.hono),this.logger=this.options.logger||new g,this.container=this.options.container||new w(void 0,this.logger,Q),this.context=new h,this.routeRegistry=new m,this.metadataRepository=_,this.componentManager=new n(this.container,this.metadataRepository,this.logger),this.componentManager.setupGlobalComponents(this.options),this.setupErrorHandlers(),this.routeManager=new t(this.hono,this.container,this.routeRegistry,this.componentManager,this.metadataRepository,this.logger,{prefix:this.options.routing?.prefix,version:this.options.routing?.version,debugPipeline:W}),this.options.deprecations?.printPreV1Warning)this.logger.emit({level:"warn",category:"deprecations",message:"Pre-v1 warning: APIs may change before 1.0.0."})}setupErrorHandlers(){this.hono.notFound(this.options.notFound||p.handle()),this.hono.onError(this.options.onError||c.handle())}resolvePlugin($){if(W$($))return new $;return $}normalizePluginEntry($,_){if($&&typeof $==="object"&&"plugin"in $){let Q=$,X=this.resolvePlugin(Q.plugin),Z=this.resolvePluginName(X,_,Q.name);return{plugin:X,name:Z,preProcessors:Q.preProcessors??[],postProcessors:Q.postProcessors??[]}}let W=this.resolvePlugin($);return{plugin:W,name:this.resolvePluginName(W,_),preProcessors:[],postProcessors:[]}}resolvePluginName($,_,W){let Q=W||$.meta?.name||$.constructor?.name;if(!Q||Q===P.DEFAULT_PLUGIN_NAME)return`${P.DEFAULT_PLUGIN_NAME}#${_+1}`;return Q}shouldEmitRouteDiagnostics(){let $=this.options.debug;return $===!0||typeof $==="object"&&Boolean($.routes)}emitStartupGuide($,_){let W=this.options.startupGuide;if(!W)return;let Q=typeof W==="object"&&Boolean(W.verbose),X=$ instanceof Error?$.message:String($),Z=this.createStartupGuideHints(X);if(this.logger.emit({level:"warn",category:"startup",message:"Startup guide",details:{rootModule:_.name,errorMessage:X,hints:Z,verbose:Q}}),Q)this.logger.emit({level:"warn",category:"startup",message:"Startup guide (verbose)",details:{steps:["Verify decorators are present for controllers/services used by DI and routing.","Ensure 'reflect-metadata' is imported once at entry and 'emitDecoratorMetadata' is enabled.","Enable debug.startup for extra startup diagnostics and timing details."]}})}createStartupGuideHints($){let _=new Set;if(_.add("Check module wiring: root module imports, controllers, and services should be registered correctly."),$.includes("not decorated with @Controller()"))_.add("Add @Controller() to the class or remove it from module.controllers.");if($.includes("has no route handlers"))_.add("Add at least one HTTP method decorator such as @Get() or @Post() in the controller.");if($.includes("not decorated with @Service()"))_.add("Add @Service() to injectable classes used in constructor dependencies.");if($.includes("constructor metadata is missing")||$.includes("reflect-metadata"))_.add("Import 'reflect-metadata' in your entry file and enable 'emitDecoratorMetadata' in tsconfig.");if($.includes("Strict mode: no routes were registered"))_.add("Disable strict.requireRoutes for empty modules, or add a controller with at least one route.");return[..._]}async register($){let _=await this.componentManager.registerModule($),W=this.shouldEmitRouteDiagnostics();for(let Q of _){let X=Date.now(),Z=this.routeRegistry.getRoutes().length;try{if(await this.routeManager.registerController(Q),W)this.logger.emit({level:"info",category:"routes",message:"Registered controller routes",details:{controller:Q.name,routeCountAdded:this.routeRegistry.getRoutes().length-Z,registrationDurationMs:Date.now()-X}})}catch(J){if(W)this.logger.emit({level:"error",category:"routes",message:"Failed to register controller routes",details:{controller:Q.name,registrationDurationMs:Date.now()-X,errorMessage:J instanceof Error?J.message:String(J)}});throw J}}return this}static async create($,_={}){let W=Date.now(),Q=C.fromRootModule($),X=new P(_,Q),Z=(_.plugins||[]).map((G,V)=>X.normalizePluginEntry(G,V)),J=X.getContext(),U=_.debug,B=U===!0||typeof U==="object"&&U.plugins,j=U===!0||typeof U==="object"&&U.routes,q=U===!0||typeof U==="object"&&(U.startup||j),z=!1;try{if(B&&Z.length>0)X.logger.emit({level:"info",category:"plugins",message:`Plugin order: ${Z.map(({name:V})=>V).join(" -> ")}`});for(let{plugin:V,preProcessors:k}of Z){V.logger=X.logger;for(let D of k)await D(X,X.hono,J);if(V.beforeModulesRegistered)await V.beforeModulesRegistered(X,X.hono)}await X.register($);let G=X.getRoutes();if(q)X.logger.emit({level:"info",category:"startup",message:`Application registered ${G.length} route(s)`,details:{routeCount:G.length,rootModule:$.name}});if(_.strict?.requireRoutes&&G.length===0){z=!0,X.logger.emit({level:"error",category:"startup",message:"Strict mode failed: no routes were registered",details:{rootModule:$.name,requireRoutes:!0,startupDurationMs:Date.now()-W}});let V=Error("Strict mode: no routes were registered. Check your module/controller decorators.");throw X.emitStartupGuide(V,$),V}if(j)X.logger.emit({level:"info",category:"routes",message:"Registered routes",details:{routes:G.map((V)=>`${V.method.toUpperCase()} ${V.fullPath}`)}});for(let{plugin:V,postProcessors:k}of Z){if(V.afterModulesRegistered)await V.afterModulesRegistered(X,X.hono);for(let D of k)await D(X,X.hono,J)}if(q)X.logger.emit({level:"info",category:"startup",message:"Application startup completed",details:{rootModule:$.name,pluginCount:Z.length,routeCount:G.length,startupDurationMs:Date.now()-W}});return{app:X,hono:X.getApp()}}catch(G){if(X.emitStartupGuide(G,$),q&&!z)X.logger.emit({level:"error",category:"startup",message:"Application startup failed",details:{rootModule:$.name,startupDurationMs:Date.now()-W,errorMessage:G instanceof Error?G.message:String(G)}});throw G}}getApp(){return this.hono}getContainer(){return this.container}getContext(){return this.context}getRoutes(){return this.routeRegistry.getRoutes()}}import{html as F,raw as e}from"hono/html";var q$={type:"website",locale:"en_US"},$$=($)=>{if(!$)return"";return Object.entries($).map(([_,W])=>{if(typeof W==="boolean")return W?_:"";let Q=String(W).replace(/"/g,"&quot;");return`${_}="${Q}"`}).filter(Boolean).join(" ")},o_=($)=>{let _={...q$,...$};return F`
1
+ import"reflect-metadata";import{Hono as P$}from"hono";function G$($){let _=new Set;if(_.add("Check module wiring: root module imports, controllers, and services should be registered correctly."),$.includes("not decorated with @Controller()"))_.add("Add @Controller() to the class or remove it from module.controllers.");if($.includes("has no route handlers"))_.add("Add at least one HTTP method decorator such as @Get() or @Post() in the controller.");if($.includes("not decorated with @Service()"))_.add("Add @Service() to injectable classes used in constructor dependencies.");if($.includes("constructor metadata is missing")||$.includes("reflect-metadata"))_.add("Import 'reflect-metadata' in your entry file and enable 'emitDecoratorMetadata' in tsconfig.");if($.includes("Strict mode: no routes were registered"))_.add("Disable strict.requireRoutes for empty modules, or add a controller with at least one route.");return[..._]}function _$($,_,W,Q){if(!_)return;let U=typeof _==="object"&&Boolean(_.verbose),X=W instanceof Error?W.message:String(W),Z=G$(X);if($.emit({level:"warn",category:"startup",message:"Startup guide",details:{rootModule:Q.name,errorMessage:X,hints:Z,verbose:U}}),U)$.emit({level:"warn",category:"startup",message:"Startup guide (verbose)",details:{steps:["Verify decorators are present for controllers/services used by DI and routing.","Ensure 'reflect-metadata' is imported once at entry and 'emitDecoratorMetadata' is enabled.","Enable debug.startup for extra startup diagnostics and timing details."]}})}var D$=($)=>typeof $>"u",N=($)=>$===null||typeof $>"u",H=($)=>$!==null&&typeof $==="object",H$=($)=>{if(!H($))return!1;let _=Object.getPrototypeOf($);if(_===null)return!0;let W=Object.prototype.hasOwnProperty.call(_,"constructor")&&_.constructor;return typeof W==="function"&&W instanceof W&&Function.prototype.toString.call(W)===Function.prototype.toString.call(Object)},W$=($)=>typeof $==="function",R=($)=>typeof $==="string",k$=($)=>typeof $==="number",O$=($)=>$.length===0,T$=($)=>typeof $==="symbol",E$=($)=>typeof $==="string"?$.charAt(0)!=="/"?"/"+$:$:"",g=($)=>$?$.startsWith("/")?("/"+$.replace(/\/+$/,"")).replace(/\/+/g,"/"):"/"+$.replace(/\/+$/,""):"/",b$=($)=>$.endsWith("/")?$.slice(0,-1):$,Q$=($)=>{return W$($)&&!N($.prototype)&&!W$($.prototype)&&Object.getOwnPropertyNames($.prototype).length>=1};var U$="AnonymousPlugin";function X$($){if(Q$($))return new $;return $}function Z$($,_,W){let Q=W||$.meta?.name||$.constructor?.name;if(!Q||Q===U$)return`${U$}#${_+1}`;return Q}function V$($,_){if($&&typeof $==="object"&&"plugin"in $){let Q=$,U=X$(Q.plugin),X=Z$(U,_,Q.name);return{plugin:U,name:X,preProcessors:Q.preProcessors??[],postProcessors:Q.postProcessors??[]}}let W=X$($);return{plugin:W,name:Z$(W,_),preProcessors:[],postProcessors:[]}}function J$($){return($??[]).map((_,W)=>V$(_,W))}class h{store=new Map;get($){return this.store.get($)}set($,_){this.store.set($,_)}has($){return this.store.has($)}delete($){return this.store.delete($)}keys(){return this.store.keys()}}class m{emit($){let _=`[HonestJS:${$.category}]`,W=$.details?[_,$.message,$.details]:[_,$.message];switch($.level){case"debug":case"info":console.info(...W);break;case"warn":console.warn(...W);break;case"error":console.error(...W);break}}}class A{emit($){}}class B{static routes=new Map;static controllers=new Map;static controllerOptions=new Map;static services=new Set;static modules=new Map;static parameters=new Map;static contextIndices=new Map;static controller=new Map([["middleware",new Map],["guard",new Map],["pipe",new Map],["filter",new Map]]);static handler=new Map([["middleware",new Map],["guard",new Map],["pipe",new Map],["filter",new Map]]);static getRoutes($){return this.routes.get($)||[]}static setRoutes($,_){this.routes.set($,_)}static addRoute($,_){if(!this.routes.has($))this.routes.set($,[]);this.routes.get($).push(_)}static getControllerPath($){return this.controllers.get($)||""}static hasController($){return this.controllers.has($)}static setControllerPath($,_){this.controllers.set($,_)}static getControllerOptions($){return this.controllerOptions.get($)||{}}static setControllerOptions($,_){this.controllerOptions.set($,_)}static isService($){return this.services.has($)}static addService($){this.services.add($)}static getAllServices(){return this.services}static getModuleOptions($){return this.modules.get($)}static setModuleOptions($,_){this.modules.set($,_)}static getParameters($){return this.parameters.get($)||new Map}static setParameterMap($,_){this.parameters.set($,_)}static getContextIndices($){return this.contextIndices.get($)||new Map}static setContextIndices($,_){this.contextIndices.set($,_)}static registerController($,_,W){let Q=this.controller.get($);if(!Q.has(_))Q.set(_,[]);Q.get(_).push(W)}static getController($,_){return this.controller.get($).get(_)||[]}static registerHandler($,_,W){let Q=this.handler.get($);if(!Q.has(_))Q.set(_,[]);Q.get(_).push(W)}static getHandler($,_){return this.handler.get($).get(_)||[]}static clearHandlerComponents(){for(let $ of this.handler.values())$.clear()}static clear(){this.routes.clear(),this.controllers.clear(),this.controllerOptions.clear(),this.services.clear(),this.modules.clear(),this.parameters.clear(),this.contextIndices.clear();for(let $ of this.controller.values())$.clear();for(let $ of this.handler.values())$.clear()}}class k{hasController($){return B.hasController($)}getControllerPath($){return B.getControllerPath($)}getControllerOptions($){return B.getControllerOptions($)}getRoutes($){return B.getRoutes($)}getParameters($){return B.getParameters($)}getContextIndices($){return B.getContextIndices($)}getModuleOptions($){return B.getModuleOptions($)}getControllerComponents($,_){return B.getController($,_)}getHandlerComponents($,_){return B.getHandler($,_)}}class C{controllerPaths=new Map;controllerOptions=new Map;routes=new Map;parameters=new Map;contextIndices=new Map;modules=new Map;controllerComponents=new Map([["middleware",new Map],["guard",new Map],["pipe",new Map],["filter",new Map]]);handlerComponents=new Map([["middleware",new Map],["guard",new Map],["pipe",new Map],["filter",new Map]]);static fromRootModule($,_=new k){let W=new C;return W.captureModuleGraph($,_),W}hasController($){return this.controllerPaths.has($)}getControllerPath($){return this.controllerPaths.get($)||""}getControllerOptions($){let _=this.controllerOptions.get($);return _?{..._}:{}}getRoutes($){return(this.routes.get($)||[]).map((_)=>this.cloneRouteDefinition(_))}getParameters($){let _=this.parameters.get($);if(!_)return new Map;let W=new Map;for(let[Q,U]of _.entries())W.set(Q,U.map((X)=>({...X})));return W}getContextIndices($){return new Map(this.contextIndices.get($)||new Map)}getModuleOptions($){let _=this.modules.get($);if(!_)return;return{controllers:_.controllers?[..._.controllers]:void 0,services:_.services?[..._.services]:void 0,imports:_.imports?[..._.imports]:void 0}}getControllerComponents($,_){return[...this.controllerComponents.get($).get(_)||[]]}getHandlerComponents($,_){return[...this.handlerComponents.get($).get(_)||[]]}captureModuleGraph($,_){let W=new Set,Q=new Set,U=(X)=>{if(W.has(X))return;W.add(X);let Z=_.getModuleOptions(X);if(!Z)return;let J={controllers:Z.controllers?[...Z.controllers]:void 0,services:Z.services?[...Z.services]:void 0,imports:Z.imports?[...Z.imports]:void 0};this.modules.set(X,J);for(let Y of J.controllers||[])Q.add(Y);for(let Y of J.imports||[])U(Y)};U($);for(let X of Q)this.captureController(X,_)}captureController($,_){if(!_.hasController($))return;this.controllerPaths.set($,_.getControllerPath($)||""),this.controllerOptions.set($,{..._.getControllerOptions($)});let W=(_.getRoutes($)||[]).map((X)=>this.cloneRouteDefinition(X));this.routes.set($,W);let Q=_.getParameters($),U=new Map;for(let[X,Z]of Q.entries())U.set(X,(Z||[]).map((J)=>({...J})));this.parameters.set($,U),this.contextIndices.set($,new Map(_.getContextIndices($)||new Map));for(let X of["middleware","guard","pipe","filter"])this.controllerComponents.get(X).set($,[..._.getControllerComponents(X,$)||[]]);for(let X of W){let Z=`${$.name}:${String(X.handlerName)}`;for(let J of["middleware","guard","pipe","filter"])this.handlerComponents.get(J).set(Z,[..._.getHandlerComponents(J,Z)||[]])}}cloneRouteDefinition($){return{...$,version:Array.isArray($.version)?[...$.version]:$.version}}}class u{routes=[];registerRoute($){if(!$)throw Error("Route info is required");if(!$.controller)throw Error("Route controller is required");if(!$.handler)throw Error("Route handler is required");if(!$.method)throw Error("Route method is required");if(!$.fullPath)throw Error("Route fullPath is required");if(this.routes.some((W)=>W.fullPath===$.fullPath&&W.method.toUpperCase()===$.method.toUpperCase()))throw Error(`Duplicate route detected: ${$.method.toUpperCase()} ${$.fullPath} (${String($.controller)}.${String($.handler)})`);this.routes.push($)}getRoutes(){return this.routes}getRoutesByController($){return this.routes.filter((_)=>_.controller===$)}getRoutesByMethod($){return this.routes.filter((_)=>_.method.toUpperCase()===$.toUpperCase())}getRoutesByPath($){return this.routes.filter((_)=>$.test(_.fullPath))}clear(){this.routes.length=0}}class d{isService($){return B.isService($)}}class S{serviceRegistry;logger;debugDi;constructor($=new d,_=new A,W=!1){this.serviceRegistry=$;this.logger=_;this.debugDi=W}instances=new Map;emitLog($){if(!this.debugDi)return;this.logger.emit($)}resolve($){return this.resolveWithTracking($,new Set)}resolveWithTracking($,_){if(this.instances.has($))return this.emitLog({level:"debug",category:"di",message:`Resolved ${$.name} from DI cache`}),this.instances.get($);if(_.has($)){let X=[..._.keys(),$].map((Z)=>Z.name).join(" -> ");throw this.emitLog({level:"error",category:"di",message:`Circular dependency detected while resolving ${$.name}`,details:{cycle:X}}),Error(`Circular dependency detected: ${X}`)}_.add($),this.emitLog({level:"debug",category:"di",message:`Resolving ${$.name}`,details:{resolving:[..._].map((X)=>X.name)}});let W=Reflect.getMetadata("design:paramtypes",$)||[];if($.length>0&&W.length===0){if(!this.serviceRegistry.isService($))throw this.emitLog({level:"error",category:"di",message:`Cannot resolve ${$.name}: missing @Service() decorator`}),Error(`Cannot resolve ${$.name}: it is not decorated with @Service(). Did you forget to add @Service() to the class?`);throw this.emitLog({level:"error",category:"di",message:`Cannot resolve ${$.name}: missing constructor metadata`}),Error(`Cannot resolve dependencies for ${$.name}: constructor metadata is missing. Ensure 'reflect-metadata' is imported and 'emitDecoratorMetadata' is enabled.`)}let Q=W.map((X,Z)=>{if(!X||X===Object||X===Array||X===Function)throw this.emitLog({level:"error",category:"di",message:`Cannot resolve dependency at index ${Z} of ${$.name}`}),Error(`Cannot resolve dependency at index ${Z} of ${$.name}. Use concrete class types for constructor dependencies.`);return this.resolveWithTracking(X,new Set(_))}),U=new $(...Q);return this.instances.set($,U),this.emitLog({level:"debug",category:"di",message:`Created ${$.name} instance`,details:{dependencyCount:Q.length}}),U}register($,_){this.instances.set($,_)}has($){return this.instances.has($)}clear(){this.instances.clear()}}import{HTTPException as F$}from"hono/http-exception";class c extends Error{status;code;category;remediation;details;constructor($,_){super($);if(this.name="FrameworkError",this.status=_.status,this.code=_.code,this.category=_.category,this.remediation=_.remediation,this.details=_.details,_.cause!==void 0)this.cause=_.cause}}function w($,_,W){let Q=$ instanceof Error?$:Error(String($)),U=new Date().toISOString(),X=_.get("requestId"),Z=_.req.path;if(Q instanceof F$)return{response:{status:W?.status||Q.status,message:W?.title||Q.message,timestamp:U,path:Z,requestId:X,code:W?.code,details:W?.additionalDetails,...W?.detail&&{detail:W.detail}},status:W?.status||Q.status};if(Q instanceof c){let q=W?.status||Q.status||500;return{response:{status:q,message:W?.title||Q.message,timestamp:U,path:Z,requestId:X,code:W?.code||Q.code,details:{category:Q.category,remediation:Q.remediation,...Q.details,...W?.additionalDetails},...W?.detail&&{detail:W.detail}},status:q}}if(Q.statusCode||Q.status){let q=Q.statusCode||Q.status||500,j=W?.status||q;return{response:{status:j,message:W?.title||Q.message,timestamp:U,path:Z,requestId:X,code:W?.code||Q.name,details:W?.additionalDetails,...W?.detail&&{detail:W.detail}},status:j}}let J=W?.status||500;return{response:{status:J,message:W?.title||Q.message,timestamp:U,path:Z,requestId:X,code:W?.code||Q.name,details:W?.additionalDetails||{stack:Q.stack},...W?.detail&&{detail:W.detail}},status:J}}function O($){return(_="",W={})=>{return(Q,U,X)=>{let Z=Q.constructor;B.addRoute(Z,{path:_,method:$,handlerName:U,version:W.version,prefix:W.prefix})}}}function L($,_){let W=(Q,U)=>{if(Q===void 0)return U;return U.get(String(Q))};return(Q)=>{return(U,X,Z)=>{let J=U.constructor;if(!B.getParameters(J).size)B.setParameterMap(J,new Map);let Y=B.getParameters(J);if(!Y.has(X))Y.set(X,[]);let j=Reflect.getMetadata("design:paramtypes",U,X)?.[Z];if(Y.get(X).push({index:Z,name:$,data:Q,factory:_||W,metatype:j}),$==="context"){if(!B.getContextIndices(J).size)B.setContextIndices(J,new Map);B.getContextIndices(J).set(X,Z)}}}}class i{static handle(){return async($,_)=>{let{response:W,status:Q}=w($,_);return _.json(W,Q)}}}class p{static handle(){return async($)=>{return $.json({message:`Not Found - ${$.req.path}`},404)}}}var s=Symbol("VERSION_NEUTRAL");var f="__honest_controllerClass",I="__honest_handlerName",l="__honest.body.cache";class n{container;metadataRepository;logger;globalComponents=new Map([["middleware",new Set],["guard",new Set],["pipe",new Set],["filter",new Set]]);constructor($,_=new k,W=new A){this.container=$;this.metadataRepository=_;this.logger=W}setupGlobalComponents($){let _=$.components||{};if(_.middleware)this.registerGlobal("middleware",..._.middleware);if(_.guards)this.registerGlobal("guard",..._.guards);if(_.pipes)this.registerGlobal("pipe",..._.pipes);if(_.filters)this.registerGlobal("filter",..._.filters)}registerGlobal($,..._){_.forEach((W)=>{this.globalComponents.get($).add(W)})}getGlobal($){return this.globalComponents.get($)}getComponents($,_,W){let Q=`${_.name}:${String(W)}`,U=this.metadataRepository.getHandlerComponents($,Q),X=this.metadataRepository.getControllerComponents($,_);return[...Array.from(this.globalComponents.get($)||[]),...X,...U]}resolveMiddleware($){return $.map((_)=>{if(H(_)&&"use"in _)return _.use.bind(_);let W=this.container.resolve(_);return W.use.bind(W)})}getHandlerMiddleware($,_){let W=`${$.name}:${String(_)}`,Q=this.metadataRepository.getControllerComponents("middleware",$),U=this.metadataRepository.getHandlerComponents("middleware",W);return this.resolveMiddleware([...Q,...U])}getGlobalMiddleware(){let $=Array.from(this.globalComponents.get("middleware")||[]);return this.resolveMiddleware($)}resolveGuards($){return $.map((_)=>{if(H(_)&&"canActivate"in _)return _;return this.container.resolve(_)})}getHandlerGuards($,_){let W=this.getComponents("guard",$,_);return this.resolveGuards(W)}resolvePipes($){return $.map((_)=>{if(H(_)&&"transform"in _)return _;return this.container.resolve(_)})}getHandlerPipes($,_){let W=this.getComponents("pipe",$,_);return this.resolvePipes(W)}async executePipes($,_,W){let Q=$;for(let U of W)Q=await U.transform(Q,_);return Q}async handleException($,_){let W=_.get(f),Q=_.get(I);if(W&&Q){let J=this.metadataRepository.getHandlerComponents("filter",`${W.name}:${Q}`);if(J.length>0){let Y=await this.executeFilters(J,$,_);if(Y)return Y}}if(W){let J=this.metadataRepository.getControllerComponents("filter",W);if(J.length>0){let Y=await this.executeFilters(J,$,_);if(Y)return Y}}let U=Array.from(this.globalComponents.get("filter")||[]);if(U.length>0){let J=await this.executeFilters(U,$,_);if(J)return J}let{response:X,status:Z}=w($,_);return _.json(X,Z)}async executeFilters($,_,W){for(let Q of $){let U;if(H(Q)&&"catch"in Q)U=Q;else U=this.container.resolve(Q);try{let X=await U.catch(_,W);if(X!==void 0)return X}catch(X){let Z=U.constructor?.name||"UnknownFilter";this.logger.emit({level:"error",category:"errors",message:`Error in exception filter ${Z}`,details:{error:X instanceof Error?X.message:String(X)}});let{response:J,status:Y}=w(X,W);return W.json(J,Y)}}return}async registerModule($,_=new Set){if(_.has($))return[];_.add($);let W=this.metadataRepository.getModuleOptions($);if(!W)throw this.logger.emit({level:"error",category:"startup",message:`Module ${$.name} is not properly decorated with @Module()`}),Error(`Module ${$.name} is not properly decorated with @Module()`);let Q=[];if(W.imports&&W.imports.length>0)for(let U of W.imports){let X=await this.registerModule(U,_);Q.push(...X)}if(W.services&&W.services.length>0)for(let U of W.services)this.container.resolve(U);if(W.controllers&&W.controllers.length>0)Q.push(...W.controllers);return Q}}class a{async invoke({handler:$,args:_,context:W,contextIndex:Q}){let U=await $(..._);if(Q!==void 0)return U;if(U instanceof Response)return U;if(N(U))return W.json(null);if(R(U))return W.text(U);return W.json(U)}}class r{componentManager;constructor($){this.componentManager=$}async resolveArguments($){let{controllerName:_,handlerName:W,handlerArity:Q,handlerParams:U,handlerPipes:X,context:Z}=$,J=U.length>0?Math.max(...U.map((q)=>q.index)):-1,Y=Array(Math.max(Q,J+1));for(let q of U){if(typeof q.factory!=="function")throw Error(`Invalid parameter decorator metadata for ${_}.${String(W)}`);let j=await q.factory(q.data,Z),P=await this.componentManager.executePipes(j,{type:q.name,metatype:q.metatype,data:typeof q.data==="string"||typeof q.data>"u"?q.data:String(q.data)},X);Y[q.index]=P}return Y}}import{HTTPException as L$}from"hono/http-exception";class o{componentManager;parameterResolver;handlerInvoker;logger;debugPipeline;constructor($,_,W,Q=new A,U=!1){this.componentManager=$;this.parameterResolver=_;this.handlerInvoker=W;this.logger=Q;this.debugPipeline=U}async execute($){let{controllerClass:_,handlerName:W,handler:Q,handlerParams:U,handlerPipes:X,contextIndex:Z,context:J}=$;J.set(f,_),J.set(I,String(W));let Y=this.componentManager.getHandlerGuards(_,W);for(let j of Y)if(!await j.canActivate(J)){if(this.debugPipeline)this.logger.emit({level:"warn",category:"pipeline",message:`Guard rejected request at ${_.name}.${String(W)}`,details:{guard:j.constructor?.name||"UnknownGuard"}});throw new L$(403,{message:`Forbidden by ${j.constructor?.name||"UnknownGuard"} at ${_.name}.${String(W)}`})}let q=await this.parameterResolver.resolveArguments({controllerName:_.name,handlerName:W,handlerArity:Q.length,handlerParams:U,handlerPipes:X,context:J});if(this.debugPipeline)this.logger.emit({level:"debug",category:"pipeline",message:`Resolved handler arguments for ${_.name}.${String(W)}`,details:{guardCount:Y.length,parameterCount:U.length,pipeCount:X.length}});return this.handlerInvoker.invoke({handler:Q,args:q,context:J,contextIndex:Z})}}class t{hono;container;routeRegistry;componentManager;parameterResolver;pipelineExecutor;metadataRepository;logger;globalPrefix;globalVersion;constructor($,_,W,Q,U=new k,X=new A,Z={}){this.hono=$,this.container=_,this.routeRegistry=W,this.componentManager=Q,this.parameterResolver=new r(this.componentManager),this.logger=X,this.pipelineExecutor=new o(this.componentManager,this.parameterResolver,new a,this.logger,Boolean(Z.debugPipeline)),this.metadataRepository=U,this.globalPrefix=Z.prefix!==void 0?this.normalizePath(Z.prefix):void 0,this.globalVersion=Z.version,this.applyGlobalMiddleware()}applyGlobalMiddleware(){let $=this.componentManager.getGlobalMiddleware();for(let _ of $)this.hono.use("*",_)}normalizePath($){if(!R($))throw Error(`Invalid path: expected a string but received ${typeof $}. Check your @Controller() and route decorator arguments.`);return g($)}registerRouteHandler($,_,W,Q){if(W.length>0)this.hono.on($.toUpperCase(),[_],...W,Q);else this.hono.on($.toUpperCase(),[_],Q)}buildRoutePath($,_,W,Q){return g(`${$}${_}${W}${Q}`)}formatVersionSegment($){if(N($))return"";return $===s?"":`/v${String($)}`}async registerController($){if(!this.metadataRepository.hasController($))throw Error(`Controller ${$.name} is not decorated with @Controller()`);let _=this.metadataRepository.getControllerPath($)||"",W=this.metadataRepository.getControllerOptions($)||{},Q=this.metadataRepository.getRoutes($)||[],U=this.metadataRepository.getParameters($)||new Map,X=this.metadataRepository.getContextIndices($)||new Map,Z=this.normalizePath(_),J=this.container.resolve($),Y=W.prefix!==void 0?W.prefix:this.globalPrefix,q=W.version!==void 0?W.version:this.globalVersion;if(Q.length===0)throw Error(`Controller ${$.name} has no route handlers. Add HTTP method decorators like @Get()`);for(let j of Q){let{path:P,method:G,version:V,prefix:z}=j,D=z!==void 0?z:Y,T=!N(D)?this.normalizePath(D):"",E=V!==void 0?V:q,b=this.normalizePath(P);if(N(E)){this.registerRoute(J,j,U,X,$,T,"",Z,b,G);continue}if(E===s){this.registerRoute(J,j,U,X,$,T,"",Z,b,G),this.registerRoute(J,j,U,X,$,T,"/:version{v[0-9]+}",Z,b,G);continue}if(Array.isArray(E)){for(let K of E){let y=this.formatVersionSegment(K);this.registerRoute(J,j,U,X,$,T,y,Z,b,G)}continue}let v=this.formatVersionSegment(E);this.registerRoute(J,j,U,X,$,T,v,Z,b,G)}}registerRoute($,_,W,Q,U,X,Z,J,Y,q){let{handlerName:j}=_,P=this.buildRoutePath(X,Z,J,Y),G=$[j].bind($),V=W.get(j)||[],z=Q.get(j),D=this.componentManager.getHandlerMiddleware(U,j),T=this.componentManager.getHandlerPipes(U,j);this.routeRegistry.registerRoute({controller:U.name,handler:j,method:q,prefix:X,version:Z,route:J,path:Y,fullPath:P,parameters:V});let E=this.componentManager,b=this.pipelineExecutor,v=async(K)=>{try{return await b.execute({controllerClass:U,handlerName:j,handler:G,handlerParams:V,handlerPipes:T,contextIndex:z,context:K})}catch(y){return E.handleException(y,K)}};this.registerRouteHandler(q,P,D,v)}}class M{hono;container;context;routeRegistry;metadataRepository;componentManager;routeManager;logger;options;constructor($={},_=new k){this.options=H($)?$:{};let W=this.options.debug===!0||typeof this.options.debug==="object"&&Boolean(this.options.debug.pipeline),Q=this.options.debug===!0||typeof this.options.debug==="object"&&Boolean(this.options.debug.di);if(this.hono=new P$(this.options.hono),this.logger=this.options.logger||new m,this.container=this.options.container||new S(void 0,this.logger,Q),this.context=new h,this.routeRegistry=new u,this.metadataRepository=_,this.componentManager=new n(this.container,this.metadataRepository,this.logger),this.componentManager.setupGlobalComponents(this.options),this.setupErrorHandlers(),this.routeManager=new t(this.hono,this.container,this.routeRegistry,this.componentManager,this.metadataRepository,this.logger,{prefix:this.options.routing?.prefix,version:this.options.routing?.version,debugPipeline:W}),this.options.deprecations?.printPreV1Warning)this.logger.emit({level:"warn",category:"deprecations",message:"Pre-v1 warning: APIs may change before 1.0.0."})}setupErrorHandlers(){this.hono.notFound(this.options.notFound||p.handle()),this.hono.onError(this.options.onError||i.handle())}shouldEmitRouteDiagnostics(){let $=this.options.debug;return $===!0||typeof $==="object"&&Boolean($.routes)}emitStartupGuide($,_){_$(this.logger,this.options.startupGuide,$,_)}async register($){let _=await this.componentManager.registerModule($),W=this.shouldEmitRouteDiagnostics();for(let Q of _){let U=Date.now(),X=this.routeRegistry.getRoutes().length;try{if(await this.routeManager.registerController(Q),W)this.logger.emit({level:"info",category:"routes",message:"Registered controller routes",details:{controller:Q.name,routeCountAdded:this.routeRegistry.getRoutes().length-X,registrationDurationMs:Date.now()-U}})}catch(Z){if(W)this.logger.emit({level:"error",category:"routes",message:"Failed to register controller routes",details:{controller:Q.name,registrationDurationMs:Date.now()-U,errorMessage:Z instanceof Error?Z.message:String(Z)}});throw Z}}return this}static async create($,_={}){let W=Date.now(),Q=C.fromRootModule($),U=new M(_,Q),X=J$(_.plugins),Z=U.getContext(),J=_.debug,Y=J===!0||typeof J==="object"&&J.plugins,q=J===!0||typeof J==="object"&&J.routes,j=J===!0||typeof J==="object"&&(J.startup||q),P=!1;try{if(Y&&X.length>0)U.logger.emit({level:"info",category:"plugins",message:`Plugin order: ${X.map(({name:V})=>V).join(" -> ")}`});for(let{plugin:V,preProcessors:z}of X){V.logger=U.logger;for(let D of z)await D(U,U.hono,Z);if(V.beforeModulesRegistered)await V.beforeModulesRegistered(U,U.hono)}await U.register($);let G=U.getRoutes();if(j)U.logger.emit({level:"info",category:"startup",message:`Application registered ${G.length} route(s)`,details:{routeCount:G.length,rootModule:$.name}});if(_.strict?.requireRoutes&&G.length===0){P=!0,U.logger.emit({level:"error",category:"startup",message:"Strict mode failed: no routes were registered",details:{rootModule:$.name,requireRoutes:!0,startupDurationMs:Date.now()-W}});let V=Error("Strict mode: no routes were registered. Check your module/controller decorators.");throw U.emitStartupGuide(V,$),V}if(q)U.logger.emit({level:"info",category:"routes",message:"Registered routes",details:{routes:G.map((V)=>`${V.method.toUpperCase()} ${V.fullPath}`)}});for(let{plugin:V,postProcessors:z}of X){if(V.afterModulesRegistered)await V.afterModulesRegistered(U,U.hono);for(let D of z)await D(U,U.hono,Z)}if(j)U.logger.emit({level:"info",category:"startup",message:"Application startup completed",details:{rootModule:$.name,pluginCount:X.length,routeCount:G.length,startupDurationMs:Date.now()-W}});return{app:U,hono:U.getApp()}}catch(G){if(U.emitStartupGuide(G,$),j&&!P)U.logger.emit({level:"error",category:"startup",message:"Application startup failed",details:{rootModule:$.name,startupDurationMs:Date.now()-W,errorMessage:G instanceof Error?G.message:String(G)}});throw G}}getApp(){return this.hono}getContainer(){return this.container}getContext(){return this.context}getRoutes(){return this.routeRegistry.getRoutes()}}import{html as F,raw as e}from"hono/html";var A$={type:"website",locale:"en_US"},$$=($)=>{if(!$)return"";return Object.entries($).map(([_,W])=>{if(typeof W==="boolean")return W?_:"";let Q=String(W).replace(/"/g,"&quot;");return`${_}="${Q}"`}).filter(Boolean).join(" ")},YW=($)=>{let _={...A$,...$};return F`
2
2
  <!DOCTYPE html>
3
3
  <html lang="${_.locale?.split("_")[0]||"en"}" ${e($$(_.htmlAttributes))}>
4
4
  <head ${e($$(_.headAttributes))}>
@@ -28,7 +28,7 @@ import"reflect-metadata";import{Hono as B$}from"hono";class h{store=new Map;get(
28
28
  ${_.image?F`<meta name="twitter:image" content="${_.image}" />`:""}
29
29
 
30
30
  <!-- Custom Meta Tags -->
31
- ${_.customMeta?_.customMeta.map((W)=>{let Q=W.name?`name="${W.name}"`:"",X=W.property?`property="${W.property}"`:"";return F`<meta ${Q} ${X} content="${W.content}" />`}):""}
31
+ ${_.customMeta?_.customMeta.map((W)=>{let Q=W.name?`name="${W.name}"`:"",U=W.property?`property="${W.property}"`:"";return F`<meta ${Q} ${U} content="${W.content}" />`}):""}
32
32
 
33
33
  <!-- Favicon -->
34
34
  ${_.favicon?F`<link rel="icon" href="${_.favicon}" />`:""}
@@ -37,10 +37,10 @@ import"reflect-metadata";import{Hono as B$}from"hono";class h{store=new Map;get(
37
37
  ${_.stylesheets?_.stylesheets.map((W)=>F`<link rel="stylesheet" href="${W}" />`):""}
38
38
 
39
39
  <!-- Scripts -->
40
- ${_.scripts?_.scripts.map((W)=>{if(typeof W==="string")return F`<script src="${W}"></script>`;let{src:Q,async:X,defer:Z}=W;if(X&&Z)return F`<script src="${Q}" async defer></script>`;if(X)return F`<script src="${Q}" async></script>`;if(Z)return F`<script src="${Q}" defer></script>`;return F`<script src="${Q}"></script>`}):""}
40
+ ${_.scripts?_.scripts.map((W)=>{if(typeof W==="string")return F`<script src="${W}"></script>`;let{src:Q,async:U,defer:X}=W;if(U&&X)return F`<script src="${Q}" async defer></script>`;if(U)return F`<script src="${Q}" async></script>`;if(X)return F`<script src="${Q}" defer></script>`;return F`<script src="${Q}"></script>`}):""}
41
41
  </head>
42
42
  <body ${e($$(_.bodyAttributes))}>
43
43
  ${_.children}
44
44
  </body>
45
45
  </html>
46
- `};function Q$($="",_={}){return(W)=>{Y.setControllerPath(W,$),Y.setControllerOptions(W,_)}}var X$=O("get"),XW=O("post"),ZW=O("put"),JW=O("delete"),UW=O("patch"),YW=O("options"),BW=O("all");function x($={}){return(_)=>{Y.setModuleOptions(_,$)}}function zW($="",_={prefix:null,version:null}){return Q$($,_)}var AW=X$;function kW($={}){return x({imports:$.imports,services:$.services,controllers:($.views||[]).concat($.controllers||[])})}var TW=L("body",async($,_)=>{let W=_.get(s);if(W===void 0)W=await _.req.json(),_.set(s,W);if($&&W&&typeof W==="object")return W[String($)];return W}),NW=L("param",($,_)=>{return $?_.req.param(String($)):_.req.param()}),KW=L("query",($,_)=>{return $?_.req.query(String($)):_.req.query()}),EW=L("header",($,_)=>{return $?_.req.header(String($)):_.req.header()}),SW=L("request",($,_)=>_.req),PW=L("request",($,_)=>_.req),wW=L("response",($,_)=>_.res),bW=L("response",($,_)=>_.res),RW=L("context",($,_)=>_),CW=L("context",($,_)=>_),IW=L("variable",($,_)=>$===void 0?void 0:_.get(String($))),MW=L("variable",($,_)=>$===void 0?void 0:_.get(String($)));function vW(){return($)=>{Y.addService($)}}function gW($,..._){return(W,Q)=>{if(Q){let Z=`${W.constructor.name}:${String(Q)}`;_.forEach((J)=>Y.registerHandler($,Z,J))}else _.forEach((X)=>Y.registerController($,W,X))}}function dW(...$){return(_,W)=>{if(W){let X=`${_.constructor.name}:${String(W)}`;$.forEach((Z)=>Y.registerHandler("filter",X,Z))}else $.forEach((Q)=>Y.registerController("filter",_,Q))}}function iW(...$){return(_,W)=>{if(W){let X=`${_.constructor.name}:${String(W)}`;$.forEach((Z)=>Y.registerHandler("guard",X,Z))}else $.forEach((Q)=>Y.registerController("guard",_,Q))}}function nW(...$){return(_,W)=>{if(W){let X=`${_.constructor.name}:${String(W)}`;$.forEach((Z)=>Y.registerHandler("middleware",X,Z))}else $.forEach((Q)=>Y.registerController("middleware",_,Q))}}function oW(...$){return(_,W)=>{if(W){let X=`${_.constructor.name}:${String(W)}`;$.forEach((Z)=>Y.registerHandler("pipe",X,Z))}else $.forEach((Q)=>Y.registerController("pipe",_,Q))}}function Z$($={}){let{controllers:_,services:W,imports:Q,name:X="TestModule"}=$,Z={[X]:class{}}[X];return x({controllers:_,services:W,imports:Q})(Z),Z}async function J$($={}){let{module:_,appOptions:W,...Q}=$,X=_??Z$(Q),{app:Z,hono:J}=await P.create(X,W);return{app:Z,hono:J,request:(B,j)=>{if(typeof B==="string"){let q=B.startsWith("http://")||B.startsWith("https://")?B:`http://localhost${B.startsWith("/")?B:`/${B}`}`;return Promise.resolve(J.request(q,j))}return Promise.resolve(J.request(B))}}}async function g8($){let{controller:_,...W}=$;return J$({...W,controllers:[_]})}function c8($={}){let _=$.logger??new A,W=new w(void 0,_,Boolean($.debugDi));for(let Q of $.overrides??[]){let X=Q;W.register(X.provide,X.useValue)}for(let Q of $.preload??[])W.resolve(Q);return{container:W,get(Q){return W.resolve(Q)},register(Q,X){W.register(Q,X)},has(Q){return W.has(Q)},clear(){W.clear()}}}export{q_ as stripEndSlash,l as normalizePath,X_ as isUndefined,Y_ as isSymbol,f as isString,Z_ as isPlainObject,T as isObject,J_ as isNumber,S as isNil,_$ as isFunction,U_ as isEmpty,W$ as isConstructor,Z$ as createTestingModule,J$ as createTestApplication,c8 as createServiceTestContainer,L as createParamDecorator,O as createHttpMethodDecorator,b as createErrorResponse,g8 as createControllerTestApplication,B_ as addLeadingSlash,zW as View,MW as Variable,IW as Var,i as VERSION_NEUTRAL,oW as UsePipes,nW as UseMiddleware,iW as UseGuards,dW as UseFilters,gW as UseComponent,u as StaticServiceRegistry,H as StaticMetadataRepository,C as SnapshotMetadataRepository,vW as Service,m as RouteRegistry,bW as Response,wW as Res,PW as Request,SW as Req,KW as Query,ZW as Put,XW as Post,UW as Patch,NW as Param,AW as Page,YW as Options,p as NotFoundHandler,A as NoopLogger,kW as MvcModule,x as Module,Y as MetadataRegistry,o_ as Layout,EW as Header,M as HONEST_PIPELINE_HANDLER_KEY,I as HONEST_PIPELINE_CONTROLLER_KEY,s as HONEST_PIPELINE_BODY_CACHE_KEY,X$ as Get,d as FrameworkError,c as ErrorHandler,JW as Delete,RW as Ctx,Q$ as Controller,CW as Context,w as Container,g as ConsoleLogger,TW as Body,h as ApplicationContext,P as Application,BW as All};
46
+ `};function B$($="",_={}){return(W)=>{B.setControllerPath(W,$),B.setControllerOptions(W,_)}}var Y$=O("get"),PW=O("post"),AW=O("put"),zW=O("delete"),DW=O("patch"),HW=O("options"),kW=O("all");function x($={}){return(_)=>{B.setModuleOptions(_,$)}}function wW($="",_={prefix:null,version:null}){return B$($,_)}var KW=Y$;function RW($={}){return x({imports:$.imports,services:$.services,controllers:($.views||[]).concat($.controllers||[])})}var MW=L("body",async($,_)=>{let W=_.get(l);if(W===void 0)W=await _.req.json(),_.set(l,W);if($&&W&&typeof W==="object")return W[String($)];return W}),xW=L("param",($,_)=>{return $?_.req.param(String($)):_.req.param()}),vW=L("query",($,_)=>{return $?_.req.query(String($)):_.req.query()}),yW=L("header",($,_)=>{return $?_.req.header(String($)):_.req.header()}),gW=L("request",($,_)=>_.req),hW=L("request",($,_)=>_.req),mW=L("response",($,_)=>_.res),uW=L("response",($,_)=>_.res),dW=L("context",($,_)=>_),cW=L("context",($,_)=>_),iW=L("variable",($,_)=>$===void 0?void 0:_.get(String($))),pW=L("variable",($,_)=>$===void 0?void 0:_.get(String($)));function nW(){return($)=>{B.addService($)}}function oW($,..._){return(W,Q)=>{if(Q){let X=`${W.constructor.name}:${String(Q)}`;_.forEach((Z)=>B.registerHandler($,X,Z))}else _.forEach((U)=>B.registerController($,W,U))}}function $8(...$){return(_,W)=>{if(W){let U=`${_.constructor.name}:${String(W)}`;$.forEach((X)=>B.registerHandler("filter",U,X))}else $.forEach((Q)=>B.registerController("filter",_,Q))}}function Q8(...$){return(_,W)=>{if(W){let U=`${_.constructor.name}:${String(W)}`;$.forEach((X)=>B.registerHandler("guard",U,X))}else $.forEach((Q)=>B.registerController("guard",_,Q))}}function Z8(...$){return(_,W)=>{if(W){let U=`${_.constructor.name}:${String(W)}`;$.forEach((X)=>B.registerHandler("middleware",U,X))}else $.forEach((Q)=>B.registerController("middleware",_,Q))}}function Y8(...$){return(_,W)=>{if(W){let U=`${_.constructor.name}:${String(W)}`;$.forEach((X)=>B.registerHandler("pipe",U,X))}else $.forEach((Q)=>B.registerController("pipe",_,Q))}}function j$($={}){let{controllers:_,services:W,imports:Q,name:U="TestModule"}=$,X={[U]:class{}}[U];return x({controllers:_,services:W,imports:Q})(X),X}async function q$($={}){let{module:_,appOptions:W,...Q}=$,U=_??j$(Q),{app:X,hono:Z}=await M.create(U,W);return{app:X,hono:Z,request:(Y,q)=>{if(typeof Y==="string"){let j=Y.startsWith("http://")||Y.startsWith("https://")?Y:`http://localhost${Y.startsWith("/")?Y:`/${Y}`}`;return Promise.resolve(Z.request(j,q))}return Promise.resolve(Z.request(Y))}}}async function o8($){let{controller:_,...W}=$;return q$({...W,controllers:[_]})}function _Q($={}){let _=$.logger??new A,W=new S(void 0,_,Boolean($.debugDi));for(let Q of $.overrides??[]){let U=Q;W.register(U.provide,U.useValue)}for(let Q of $.preload??[])W.resolve(Q);return{container:W,get(Q){return W.resolve(Q)},register(Q,U){W.register(Q,U)},has(Q){return W.has(Q)},clear(){W.clear()}}}export{b$ as stripEndSlash,g as normalizePath,D$ as isUndefined,T$ as isSymbol,R as isString,H$ as isPlainObject,H as isObject,k$ as isNumber,N as isNil,W$ as isFunction,O$ as isEmpty,Q$ as isConstructor,j$ as createTestingModule,q$ as createTestApplication,_Q as createServiceTestContainer,L as createParamDecorator,O as createHttpMethodDecorator,w as createErrorResponse,o8 as createControllerTestApplication,E$ as addLeadingSlash,wW as View,pW as Variable,iW as Var,s as VERSION_NEUTRAL,Y8 as UsePipes,Z8 as UseMiddleware,Q8 as UseGuards,$8 as UseFilters,oW as UseComponent,d as StaticServiceRegistry,k as StaticMetadataRepository,C as SnapshotMetadataRepository,nW as Service,u as RouteRegistry,uW as Response,mW as Res,hW as Request,gW as Req,vW as Query,AW as Put,PW as Post,DW as Patch,xW as Param,KW as Page,HW as Options,p as NotFoundHandler,A as NoopLogger,RW as MvcModule,x as Module,B as MetadataRegistry,YW as Layout,yW as Header,I as HONEST_PIPELINE_HANDLER_KEY,f as HONEST_PIPELINE_CONTROLLER_KEY,l as HONEST_PIPELINE_BODY_CACHE_KEY,Y$ as Get,c as FrameworkError,i as ErrorHandler,zW as Delete,dW as Ctx,B$ as Controller,cW as Context,S as Container,m as ConsoleLogger,MW as Body,h as ApplicationContext,M as Application,kW as All};
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "honestjs",
3
3
  "description": "HonestJS - a modern web framework built on top of Hono",
4
- "version": "0.1.20",
4
+ "version": "0.1.21",
5
5
  "author": "Orkhan Karimov <karimovok1@gmail.com> (https://github.com/kerimovok)",
6
6
  "repository": {
7
7
  "type": "git",