@geekmidas/constructs 3.0.8 → 3.0.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.
Files changed (65) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/{Endpoint-C991gK3T.d.cts → Endpoint-BoTfIVxN.d.cts} +15 -3
  3. package/dist/Endpoint-BoTfIVxN.d.cts.map +1 -0
  4. package/dist/{Endpoint-CRHpLPV3.d.mts → Endpoint-NvjIednd.d.mts} +14 -2
  5. package/dist/Endpoint-NvjIednd.d.mts.map +1 -0
  6. package/dist/{HonoEndpointAdaptor-BDz1qM4z.cjs → HonoEndpointAdaptor-DNn3-dHv.cjs} +13 -4
  7. package/dist/HonoEndpointAdaptor-DNn3-dHv.cjs.map +1 -0
  8. package/dist/{HonoEndpointAdaptor-DPBfEPZj.mjs → HonoEndpointAdaptor-cpttJfsS.mjs} +13 -4
  9. package/dist/HonoEndpointAdaptor-cpttJfsS.mjs.map +1 -0
  10. package/dist/adaptors/aws.cjs +10 -5
  11. package/dist/adaptors/aws.cjs.map +1 -1
  12. package/dist/adaptors/aws.d.cts +2 -2
  13. package/dist/adaptors/aws.d.cts.map +1 -1
  14. package/dist/adaptors/aws.d.mts +1 -1
  15. package/dist/adaptors/aws.d.mts.map +1 -1
  16. package/dist/adaptors/aws.mjs +10 -5
  17. package/dist/adaptors/aws.mjs.map +1 -1
  18. package/dist/adaptors/hono.cjs +3 -3
  19. package/dist/adaptors/hono.d.cts +2 -2
  20. package/dist/adaptors/hono.d.cts.map +1 -1
  21. package/dist/adaptors/hono.d.mts +1 -1
  22. package/dist/adaptors/hono.d.mts.map +1 -1
  23. package/dist/adaptors/hono.mjs +3 -3
  24. package/dist/adaptors/testing.cjs +3 -3
  25. package/dist/adaptors/testing.d.cts +2 -2
  26. package/dist/adaptors/testing.d.mts +1 -1
  27. package/dist/adaptors/testing.mjs +3 -3
  28. package/dist/crons/index.cjs +1 -1
  29. package/dist/crons/index.d.cts +5 -5
  30. package/dist/crons/index.mjs +1 -1
  31. package/dist/endpoints/index.cjs +27 -3
  32. package/dist/endpoints/index.cjs.map +1 -1
  33. package/dist/endpoints/index.d.cts +24 -4
  34. package/dist/endpoints/index.d.cts.map +1 -1
  35. package/dist/endpoints/index.d.mts +21 -1
  36. package/dist/endpoints/index.d.mts.map +1 -1
  37. package/dist/endpoints/index.mjs +27 -3
  38. package/dist/endpoints/index.mjs.map +1 -1
  39. package/dist/functions/index.cjs +1 -1
  40. package/dist/functions/index.d.cts +1 -1
  41. package/dist/functions/index.mjs +1 -1
  42. package/dist/{functions-GmSHFbpr.mjs → functions-DN9d6sgj.mjs} +1 -1
  43. package/dist/{functions-GmSHFbpr.mjs.map → functions-DN9d6sgj.mjs.map} +1 -1
  44. package/dist/{functions-DiaRAdfp.cjs → functions-yrAtvBor.cjs} +1 -1
  45. package/dist/{functions-DiaRAdfp.cjs.map → functions-yrAtvBor.cjs.map} +1 -1
  46. package/dist/{index-CzIMpK-e.d.cts → index-6U4XAuUI.d.cts} +5 -5
  47. package/dist/{index-CzIMpK-e.d.cts.map → index-6U4XAuUI.d.cts.map} +1 -1
  48. package/dist/{lazyAccessors-CJZYs9uM.mjs → lazyAccessors-BPPR05EA.mjs} +11 -4
  49. package/dist/{lazyAccessors-CJZYs9uM.mjs.map → lazyAccessors-BPPR05EA.mjs.map} +1 -1
  50. package/dist/{lazyAccessors-DHvDeww0.cjs → lazyAccessors-BzMEdmis.cjs} +11 -4
  51. package/dist/{lazyAccessors-DHvDeww0.cjs.map → lazyAccessors-BzMEdmis.cjs.map} +1 -1
  52. package/package.json +9 -9
  53. package/src/endpoints/AmazonApiGatewayEndpointAdaptor.ts +23 -4
  54. package/src/endpoints/Endpoint.ts +14 -1
  55. package/src/endpoints/EndpointBuilder.ts +25 -0
  56. package/src/endpoints/HonoEndpointAdaptor.ts +24 -1
  57. package/src/endpoints/__tests__/AmazonApiGatewayV2EndpointAdaptor.responseType.spec.ts +111 -0
  58. package/src/endpoints/__tests__/Endpoint.spec.ts +29 -0
  59. package/src/endpoints/__tests__/EndpointBuilder.responseType.spec.ts +47 -0
  60. package/src/endpoints/__tests__/HonoEndpointAdaptor.pgboss-publisher.spec.ts +17 -1
  61. package/src/endpoints/__tests__/HonoEndpointAdaptor.responseType.spec.ts +128 -0
  62. package/dist/Endpoint-C991gK3T.d.cts.map +0 -1
  63. package/dist/Endpoint-CRHpLPV3.d.mts.map +0 -1
  64. package/dist/HonoEndpointAdaptor-BDz1qM4z.cjs.map +0 -1
  65. package/dist/HonoEndpointAdaptor-DPBfEPZj.mjs.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @geekmidas/constructs
2
2
 
3
+ ## 3.0.10
4
+
5
+ ### Patch Changes
6
+
7
+ - 🐛 [`aeba918`](https://github.com/geekmidas/toolbox/commit/aeba918fc258f6ccdb96b8273b2bc01bd2190553) Thanks [@geekmidas](https://github.com/geekmidas)! - Fix schema, openapi generation and events testkit
8
+
9
+ - Updated dependencies [[`aeba918`](https://github.com/geekmidas/toolbox/commit/aeba918fc258f6ccdb96b8273b2bc01bd2190553)]:
10
+ - @geekmidas/events@1.1.2
11
+ - @geekmidas/schema@1.0.1
12
+
13
+ ## 3.0.9
14
+
15
+ ### Patch Changes
16
+
17
+ - ✨ [`363c67f`](https://github.com/geekmidas/toolbox/commit/363c67fb3c3406bac6823326ab80ba55bff29e31) Thanks [@geekmidas](https://github.com/geekmidas)! - Add dynamic return types
18
+
3
19
  ## 3.0.8
4
20
 
5
21
  ### Patch Changes
@@ -1,5 +1,5 @@
1
1
  import { HttpMethod, LowerHttpMethod } from "./types-B8YlI4cx.cjs";
2
- import { Function, FunctionHandler } from "./index-CzIMpK-e.cjs";
2
+ import { Function, FunctionHandler } from "./index-6U4XAuUI.cjs";
3
3
  import { EventPublisher, ExtractPublisherMessage, MappedEvent } from "@geekmidas/events";
4
4
  import { Logger } from "@geekmidas/logger";
5
5
  import { Service, ServiceRecord } from "@geekmidas/services";
@@ -264,6 +264,12 @@ declare class Endpoint<TRoute extends string, TMethod extends HttpMethod, TInput
264
264
  tags?: string[];
265
265
  /** The HTTP success status code to return (default: 200) */
266
266
  readonly status: SuccessStatus;
267
+ /**
268
+ * Response content type for this endpoint. Defaults to `'application/json'`.
269
+ * Non-JSON types cause adaptors to emit the body as-is with the declared
270
+ * Content-Type header instead of JSON-serializing.
271
+ */
272
+ readonly responseType: string;
267
273
  /** Default headers to apply to all responses */
268
274
  readonly defaultHeaders: Record<string, string>;
269
275
  /** Function to extract session data from the request context */
@@ -450,7 +456,8 @@ declare class Endpoint<TRoute extends string, TMethod extends HttpMethod, TInput
450
456
  audits,
451
457
  databaseService,
452
458
  rlsConfig,
453
- rlsBypass
459
+ rlsBypass,
460
+ responseType
454
461
  }: EndpointOptions<TRoute, TMethod, TInput, OutSchema, TServices, TLogger, TSession, OutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>);
455
462
  }
456
463
  /**
@@ -533,6 +540,11 @@ interface EndpointOptions<TRoute extends string, TMethod extends HttpMethod, TIn
533
540
  rlsConfig?: RlsConfig<TServices, TSession, TLogger>;
534
541
  /** Whether to bypass RLS for this endpoint */
535
542
  rlsBypass?: boolean;
543
+ /**
544
+ * Response content type (e.g. `'application/json'`, `'text/html'`).
545
+ * Defaults to `'application/json'` when omitted.
546
+ */
547
+ responseType?: string;
536
548
  }
537
549
  /**
538
550
  * Defines the possible input schema types for an endpoint.
@@ -832,4 +844,4 @@ declare enum SuccessStatus {
832
844
  type EndpointOutput<T> = T extends Endpoint<any, any, any, infer OutSchema, any, any, any, any> ? InferStandardSchema<OutSchema> : never;
833
845
  //#endregion
834
846
  export { ActorExtractor, AuthorizeFn, Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, CookieFn, Endpoint, EndpointContext, EndpointHandler, EndpointOutput, EndpointSchemas, HeaderFn, MappedAudit, OAuthFlow, OAuthFlows, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor, SecurityScheme, SessionFn, SuccessStatus, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme };
835
- //# sourceMappingURL=Endpoint-C991gK3T.d.cts.map
847
+ //# sourceMappingURL=Endpoint-BoTfIVxN.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Endpoint-BoTfIVxN.d.cts","names":[],"sources":["../src/endpoints/Authorizer.ts","../src/endpoints/audit.ts","../src/endpoints/rls.ts","../src/endpoints/Endpoint.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;;;;;UAIiB,cAAA;;;;;;;;;EAAA;EAwBA,MAAA,CAAA,EAAA,MAAU;EAAA;EAAA,YACf,CAAA,EAAA,MAAA;EAAS;EACA,KACA,CAAA,EAbZ,UAaY;EAAS;EACA,gBAAA,CAAA,EAAA,MAAA;EAGb;EAWJ,CAAA,GAAA,EAAA,KAAA,MAAA,EAAA,CAAA,EAAA,OAmCsC;AAGnD;AAKA;;;AAuBY,UApFK,UAAA,CAoFL;EAAM,QAAA,CAAA,EAnFN,SAmFM;EAMF,QAAA,CAAA,EAxFJ,SAwFoB;EAAA,iBAAA,CAAA,EAvFX,SAuFW;EAAA,iBAEhB,CAAA,EAxFK,SAwFL;;AACb,UAtFc,SAAA,CAsFd;EAAU,gBAAA,CAAA,EAAA,MAAA;EAUG,QAAA,CAAA,EAAA,MAAA;EASA,UAAA,CAAA,EAAA,MAAA;EAAiB,MAAA,EArGxB,MAqGwB,CAAA,MAAA,EAAA,MAAA,CAAA;;;;AAGhB;;cAjGJ;;IC1BI,SAAA,IAAW,EAAA,MAAA;IAAA,SAAA,MAAA,EAAA,QAAA;IACN,SAAA,YAAA,EAAA,KAAA;IACL,SAAA,WAAA,EAAA,iCAAA;EAAgB,CAAA;EACW,SAA7B,MAAA,EAAA;IAAkD,SAAA,IAAA,EAAA,MAAA;IAAjB,SAAA,MAAA,EAAA,QAAA;IAGzC,SAAA,WAAA,EAAA,6BAAA;EAAK,CAAA;EAGO,SAAS,MAAA,EAAA;IACH,SAAA,IAAA,EAAA,QAAA;IAApB,SAAA,EAAA,EAAA,QAAA;IAEqB,SAAA,IAAA,EAAA,WAAA;IAAc,SAAA,WAAA,EAAA,mCAAA;EAAK,CAAA;EAApB,SAGb,MAAA,EAAA;IAAgB,SAAA,IAAA,EAAA,QAAA;IACH,SAAA,KAAA,EAAA,CAAA,CAAA;IAApB,SAAA,WAAA,EAAA,0BAAA;EAAmB,CAAA;EAKL,SAAS,IAAA,EAAA;IACH,SAAA,IAAA,EAAA,eAAA;IAApB,SAAA,gBAAA,EAAA,EAAA;IAEU,SAAA,WAAA,EAAA,+BAAA;EAAM,CAAA;EAYT,SAAA,GAAA,EAAA;IAAc,SAAA,IAAA,EAAA,QAAA;IACP,SAAA,EAAA,EAAA,QAAA;IAEF,SAAA,IAAA,EAAA,eAAA;IAAS,SAAA,WAAA,EAAA,4CAAA;IAED,SAAA,8BAAA,EAAA,UAAA;EAAS,CAAA;CAAV;;AAGf,KDoBG,uBAAA,GCpBH,MAAA,ODoB0C,yBCpB1C;;;;AAEU,UDuBF,UAAA,CCvBE;EAAO;;;;EC1DT;AAoBjB;;EAA+B,cACZ,CAAA,EFoED,cEpEC;EAAO;;;;EAIF,IACd,CAAA,EAAA,MAAA;EAAQ;;;;EAIF,WAAW,CAAA,EAAA,MAAA;EAAU;AAAX;AAS1B;;EAA0B,QACP,CAAA,EFgEP,MEhEO,CAAA,MAAA,EAAA,OAAA,CAAA;;;;;AAKkC,iBFiErC,gBAAA,CEjEqC,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EFmE1C,IEnE0C,CFmErC,UEnEqC,EAAA,MAAA,CAAA,CAAA,EFoElD,UEpEkD;;AAAtB;AAQ/B;AAKY,iBFiEI,uBAAA,CEjEyB,IAAA,EAAA,MAAA,CAAA,EAAA,IAAA,IFmE9B,uBEnE8B;;;;ACR5B,iBHkFG,iBAAA,CGlFK,IAAA,EAAA,MAAA,EAAA,aAAA,CAAA,EHoFJ,MGpFI,CAAA,MAAA,EHoFW,cGpFX,CAAA,CAAA,EHqFlB,cGrFkB,GAAA,SAAA;;;;;;;;;;;AHtDJ,UCgBA,WDhBc,CAAA,qBCiBT,eDHH,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,gBCIF,gBDJE,GAAA,SAAA,EAAA,cCKJ,gBDLI,CCKa,YDLb,CAAA,GCK6B,gBDL7B,CCK8C,YDL9C,CAAA,CAAA,CAAA;EAUF;EAAU,IAAA,ECFpB,KDEoB;EAAA;EACN,OACT,EAAA,CAAA,QAAA,ECDA,ODCA,SCDgB,gBDChB,GCAP,mBDAO,CCAa,ODAb,CAAA,GAAA,OAAA,EAAA,GCEN,mBDFM,CCEc,YDFd,ECE4B,KDF5B,CAAA;EAAS;EACS,IACT,CAAA,EAAA,CAAA,QAAA,ECGT,ODHS,SCGO,gBDHP,GCIhB,mBDJgB,CCII,ODJJ,CAAA,GAAA,OAAA,EAAA,GAAA,OAAA;EAAS;EAGb,QAAA,CAAA,EAAA,CAAS,QAAA,ECMd,ODFG,SCEa,gBDFb,GCGV,mBDHU,CCGU,ODHV,CAAA,GAAA,OAAA,EAAA,GAAA,MAAA,GCKA,MDLA,CAAA,MAAA,EAAA,OAAA,CAAA;EAOF;EAsCD,KAAA,CAAA,EAAA,MAAA;AAKZ;;;;AAuBkB;AAMlB;;;AAEW,KChEC,cDgED,CAAA,kBC/DQ,OD+DR,EAAA,GAAA,EAAA,EAAA,WAAA,OAAA,EAAA,gBC7DM,MD6DN,GC7De,MD6Df,CAAA,GAAA,CAAA,GAAA,EAAA;EAAI,QACZ,EC5DQ,aD4DR,CC5DsB,SD4DtB,CAAA;EAAU,OAAA,EC3DH,QD2DG;EAUG,MAAA,ECpEP,QDoEO;EASA,MAAA,EC5EP,QD4EO;EAAiB,MAAA,EC3ExB,OD2EwB;CAAA,EAAA,GC1E3B,UD4E0B,GC5Eb,OD4Ea,CC5EL,UD4EK,CAAA;;;AACf;;;;;;;UEvIA,UAAA;;;;;;AFJjB;AAwBA;;;;;;AAI8B;AAG9B;AAWA;AAsCA;AAKA;;AAQkB,KErEN,mBFqEM,CAAA,kBEpEC,OFoED,EAAA,GAAA,EAAA,EAAA,WAAA,OAAA,EAAA,gBElED,MFkEC,GElEQ,MFkER,CAAA,GAAA,CAAA,GAAA,EAAA;EAAc,QAepB,EE/ED,aF+EC,CE/Ea,SF+Eb,CAAA;EAAM,OAAA,EE9ER,QF8EQ;EAMF,MAAA,EEnFP,QFmFO;EAAgB,MAAA,EElFvB,QFkFuB;EAAA,MAEhB,EEnFP,OFmFO;CAAU,EAAA,GElFpB,UFkFK,GElFQ,OFkFR,CElFgB,UFkFhB,CAAA;;AACE;AAUb;AASA;;;;AAGG,UEhGc,SFgGd,CAAA,kBE/FgB,OF+FhB,EAAA,GAAA,EAAA,EAAA,WAAA,OAAA,EAAA,gBE7Fc,MF6Fd,GE7FuB,MF6FvB,CAAA,CAAA;EAAc;aE1FL,oBAAoB,WAAW,UAAU;;;ADjCrD;;;;AAGgC,cCsCnB,UDtCmB,EAAA,OAAA,MAAA;;;;AAGzB,KCwCK,SAAA,GDxCL,OCwCwB,UDxCxB;;;;ADEP;;;;;;AAI8B;AAG9B;AAWA;AAsCA;AAKA;;;;AAuBkB;AAMlB;;;;;AAGa;AAUb;AASA;;;AAEiB,cGpFJ,QHoFI,CAAA,eAAA,MAAA,EAAA,gBGlFA,UHkFA,EAAA,eGjFD,eHiFC,GAAA,CAAA,CAAA,EAAA,kBGhFE,gBHgFF,GAAA,SAAA,GAAA,SAAA,EAAA,kBG/EE,OH+EF,EAAA,GAAA,EAAA,EAAA,gBG9EA,MH8EA,GG9ES,MH8ET,EAAA,WAAA,OAAA,EAAA,wBG5EQ,cH4ER,CAAA,GAAA,CAAA,GAAA,SAAA,GAAA,SAAA,EAAA,mCAAA,MAAA,GAAA,MAAA,EAAA,sBG1EM,YH0EN,GAAA,SAAA,GAAA,SAAA,EAAA,iCAAA,MAAA,GAAA,MAAA,EAAA,qBGxEK,eHwEL,CAAA,MAAA,EAAA,OAAA,CAAA,GGxEwC,eHwExC,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,YAAA,SAAA,EAAA,6BAAA,MAAA,GAAA,MAAA,CAAA,SGlEP,QHkEO,CGjEhB,MHiEgB,EGhEhB,SHgEgB,EG/DhB,OH+DgB,EG9DhB,SH8DgB,EG7DhB,eH6DgB,EG5DhB,0BH4DgB,EG3DhB,aH2DgB,EG1DhB,wBH0DgB,EGzDhB,SHyDgB,EGxDhB,oBHwDgB,EGvDhB,YHuDgB,EGtDhB,eHsDgB,CGrDf,MHqDe,EGpDf,SHoDe,EGnDf,OHmDe,EGlDf,SHkDe,EGjDf,SHiDe,EGhDf,aHgDe,EG/Cf,YH+Ce,CAAA,CAAA,CAAA;EAAM,WACpB,CAAA,EAAA,MAAA;EAAc;SG3CT;;UAEC;EFlFQ;EAAW,WAAA,CAAA,EAAA,MAAA;EAAA;EACS,IACpB,CAAA,EAAA,MAAA,EAAA;EAAgB;EACW,SAA7B,MAAA,EEqFU,aFrFV;EAAgB;;;;;EAMa,SACnB,YAAA,EAAA,MAAA;EAAO;EAAR,SAEE,cAAA,EEoFO,MFpFP,CAAA,MAAA,EAAA,MAAA,CAAA;EAAY;EAAO,UAAvC,EEsFc,SFtFd,CEsFwB,SFtFxB,EEsFmC,OFtFnC,EEsF4C,QFtF5C,EEsFsD,SFtFtD,CAAA;EAAmB;EAGN,SAAS,EEsFT,WFtFS,CEuF1B,SFvF0B,EEwF1B,OFxF0B,EEyF1B,QFzF0B,EE0F1B,MF1F0B,EE2F1B,SF3F0B,CAAA;EAAgB;EACZ,SAA3B,CAAA,EE6Fe,eF7Ff;EAAmB;EAKL,UAAS,CAAA,EE0FP,UF1FO;EAAgB;EACZ,cAA3B,CAAA,EE2FoB,cF3FpB,CE2FmC,SF3FnC,EE2F8C,QF3F9C,EE2FwD,OF3FxD,CAAA;EAAmB;EAEH,MAAA,EE2FL,WF3FK,CE2FO,YF3FP,EE2FqB,SF3FrB,CAAA,EAAA;EAYT;EAAc,eAAA,CAAA,EEiFQ,OFjFR,CEiFgB,oBFjFhB,EEiFsC,SFjFtC,CAAA;EAAA;EACA,SAET,CAAA,EEgFG,SFhFH,CEgFa,SFhFb,EEgFwB,QFhFxB,EEgFkC,OFhFlC,CAAA;EAAM;EAAS,SAEP,CAAA,EAAA,OAAA;EAAS;EAAV,QACd,UAAA;EAAQ;;;;;;AAIQ;;;;AC1D1B;AAoBA;;;;;;;EAKwB,OACd,kBAAA,CAAA,SAAA,EC2IG,QD3IH,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,CAAA,EAAA,EAAA,OAAA,CAAA,EC4IE,oBD5IF,CAAA,EC4IsB,OD5ItB,CC4IsB,WAAA,CAAA,QD5ItB,CAAA,CAAA,CAAA,CAAA,CAAA;EAAQ;;;;EAIF,IAAW,QAAA,CAAA,CAAA,EAAA,GCiJd,ODjJc,ICiJd,kBDjJc,CCiJd,MDjJc,CAAA,EAAA;EAAU;AAAX;AAS1B;;;;;;EAMyC,UAAE,CAAA,UAAA,MC8IT,MD9IS,CAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAAA,ECgJpC,CDhJoC,CAAA,ECiJvC,ODjJuC,CCiJ/B,6BDjJ+B,CCiJD,MDjJC,CCiJM,CDjJN,CAAA,CAAA,CAAA;EAAQ;;AAApB;AAQ/B;AAKA;;;4BCkJiC,QAAQ,oBAAoB;EA1JhD,OAAA,eAAQ,CAAA,MAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EAAA;;;;;;;;;;;;;EAoBX,OACT,aAAA,CAAA,OAAA,EA4J8B,MA5J9B,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA,EA4JuD,QA5JvD;EAAO;;;;;;;;;;;;;EAcG,OACT,aAAA,CAAA,YAAA,EAAA,MAAA,GAAA,SAAA,CAAA,EA8KuD,QA9KvD;EAAa;;;;;;;;;;;;;;;;;;;EAqCgB,OAES,kBAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAyL5B,aAzL4B,CAAA,EAAA,MAAA;EAAS;;;;;;;EAIa,WAAE,CAAA,GAAA,EAiNzD,eAjNyD,CAiNzC,MAjNyC,EAiNjC,SAjNiC,EAiNtB,OAjNsB,EAiNb,QAjNa,CAAA,CAAA,EAkN5D,6BAlN4D,CAkN9B,MAlN8B,CAAA;EAAS,OAAvC,EAAA,CAAA,GAAA,EA6N3B,eA7N2B,CA8N/B,MA9N+B,EA+N/B,SA/N+B,EAgO/B,OAhO+B,EAiO/B,QAjO+B,EAkO/B,YAlO+B,EAmO/B,SAnO+B,EAoO/B,aApO+B,CAAA,EAAA,QAAA,EAsOtB,eAtOsB,EAAA,GAuO9B,SAvO8B,SAuOZ,gBAvOY,GAyO5B,mBAzO4B,CAyOR,SAzOQ,CAAA,GA0O5B,oBA1O4B,CA0OP,mBA1OO,CA0Oa,SA1Ob,CAAA,CAAA,GA2O5B,OA3O4B,CA2OpB,mBA3OoB,CA2OA,SA3OA,CAAA,CAAA,GA4O5B,OA5O4B,CA4OpB,oBA5OoB,CA4OC,mBA5OD,CA4OqB,SA5OrB,CAAA,CAAA,CAAA,GAAA,GAAA,GA+O5B,oBA/O4B,CAAA,GAAA,CAAA,GAgP5B,OAhP4B,CAAA,GAAA,CAAA,GAiP5B,OAjP4B,CAiPpB,oBAjPoB,CAAA,GAAA,CAAA,CAAA;EAAO;;;;;;EAqCT,OAAA,UAAA,CAAA,GAAA,EAAA,GAAA,CAAA,EAAA,GAAA,IAgPK,QAhPL,CAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,GAAA,CAAA;EAAA;;;EASnB,OAAA,WAAA,CAAA,CAAA,CAAA,CAAA,QAAA,EAmPD,CAnPC,GAmPG,oBAnPH,CAmPwB,CAnPxB,CAAA,CAAA,EAAA,QAAA,IAoPG,oBApPH,CAoPwB,CApPxB,CAAA;EAAA;;;;;EAe4B,IAArC,KAAA,CAAA,CAAA,EAoP8C,kBApP9C,CAoPiE,MApPjE,CAAA;EAAO;;;;;EAqCqD,eAiCP,CAAA,kBAAA,CAAA,EAuLlC,kBAvLkC,CAAA,EAwLrD,OAxLqD,CAwL7C,qBAxL6C,CAwLvB,MAxLuB,EAwLf,OAxLe,CAAA,CAAA;EAAQ;;;;;;;;;;;;;;;;;;EAoGpD,WAAS,CAAA;IAAA,EAAA;IAAA,MAAA;IAAA,KAAA;IAAA,WAAA;IAAA,IAAA;IAAA,KAAA;IAAA,MAAA;IAAA,MAAA,EAqOZ,YArOY;IAAA,QAAA;IAAA,OAAA;IAAA,UAAA;IAAA,UAAA;IAAA,SAAA;IAAA,SAAA;IAAA,MAAA;IAAA,gBAAA;IAAA,MAAA;IAAA,UAAA;IAAA,qBAAA;IAAA,cAAA;IAAA,MAAA;IAAA,eAAA;IAAA,SAAA;IAAA,SAAA;IAAA;EAAA,CAAA,EAuPlB,eAvPkB,CAwPpB,MAxPoB,EAyPpB,OAzPoB,EA0PpB,MA1PoB,EA2PpB,SA3PoB,EA4PpB,SA5PoB,EA6PpB,OA7PoB,EA8PpB,QA9PoB,EA+PpB,SA/PoB,EAgQpB,eAhQoB,EAiQpB,0BAjQoB,EAkQpB,aAlQoB,EAmQpB,wBAnQoB,EAoQpB,YApQoB,EAqQpB,SArQoB,EAsQpB,oBAtQoB,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkOpB,UAuIe,eAvIf,CAAA,eAAA,MAAA,EAAA,gBAyIe,UAzIf,EAAA,eA0Ic,eA1Id,GAAA,CAAA,CAAA,EAAA,gBA2Ie,gBA3If,GAAA,SAAA,GAAA,SAAA,EAAA,kBA4IiB,OA5IjB,EAAA,GAAA,EAAA,EAAA,gBA6Ie,MA7If,GA6IwB,MA7IxB,EAAA,WAAA,OAAA,EAAA,kBA+IiB,gBA/IjB,GAAA,SAAA,GAAA,SAAA,EAAA,wBAgJuB,cAhJvB,CAAA,GAAA,CAAA,GAAA,SAAA,GAAA,SAAA,EAAA,mCAAA,MAAA,GAAA,MAAA,EAAA,sBAkJqB,YAlJrB,GAAA,SAAA,GAAA,SAAA,EAAA,iCAAA,MAAA,GAAA,MAAA,EAAA,qBAoJoB,eApJpB,CAAA,MAAA,EAAA,OAAA,CAAA,GAoJuD,eApJvD,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,YAAA,SAAA,EAAA,6BAAA,MAAA,GAAA,MAAA,CAAA,CAAA;EAAI;EACC,KACL,EA0JM,MA1JN;EAAM;EACc,MACpB,EA0JO,OA1JP;EAAQ;EACD,EAAA,EA2JJ,eA1JH,CA2JA,MA3JA,EA4JA,SA5JA,EA6JA,OA7JA,EA8JA,OA9JA,EA+JA,QA/JA,EAgKA,SAhKA,EAiKA,aAjKA,EAkKA,YAlKA,CAAA;EAAU;EACA,SACV,EAoKE,WApKF,CAoKc,SApKd,EAoKyB,OApKzB,EAoKkC,QApKlC,EAoK4C,MApK5C,EAoKoD,SApKpD,CAAA,GAAA,SAAA;EAAS;EACA,WACT,EAAA,MAAA,GAAA,SAAA;EAAyB;EACT,IAChB,CAAA,EAAA,MAAA,EAAA;EAAM;EACI,OACV,EAAA,MAAA,GAAA,SAAA;EAAqB;EACP,UACd,EAAA,MAAA,GAAA,SAAA;EAAM;EACS,KACf,EAqKM,MArKN,GAAA,SAAA;EAAS;EACA,MACT,EAqKO,OArKP,GAAA,SAAA;EAAY;EAEN,QACN,EAoKS,SApKT;EAAO;EACD,MACN,EAoKO,OApKP;EAAS;EACA,UACT,EAoKW,SApKX,CAoKqB,SApKrB,EAoKgC,OApKhC,EAoKyC,QApKzC,EAoKmD,SApKnD,CAAA,GAAA,SAAA;EAAO;EACC,SACR,CAAA,EAoKW,eApKX;EAAS;EACM,MACf,EAoKO,aApKP,GAAA,SAAA;EAA0B;;;EAGd,gBACZ,CAAA,EAoKkB,OApKlB,CAoK0B,0BApK1B,EAoKsD,eApKtD,CAAA;EAAS,MACT,CAAA,EAqKQ,WArKR,CAqKoB,eArKpB,EAqKqC,SArKrC,CAAA,EAAA;EAAoB;EAfH,UA3hBT,CAAA,EAitBI,UAjtBJ;EAAQ;AA6oBlB;;EAAgC,qBAEf,CAAA,EAsEQ,OAtER,CAsEgB,wBAtEhB,EAsE0C,aAtE1C,CAAA;EAAU;EACI,cACd,CAAA,EAsEC,cAtED,CAsEgB,SAtEhB,EAsE2B,QAtE3B,EAsEqC,OAtErC,CAAA;EAAgB;EACP,MACT,CAAA,EAsEP,WAtEO,CAsEK,YAtEL,EAsEmB,SAtEnB,CAAA,EAAA;EAAM;EAAS,eAEb,CAAA,EAsEA,OAtEA,CAsEQ,oBAtER,EAsE8B,SAtE9B,CAAA;EAAgB;EACI,SAEhB,CAAA,EAqEV,SArEU,CAqEA,SArEA,EAqEW,QArEX,EAqEqB,OArErB,CAAA;EAAY;EAEE,SAAoB,CAAA,EAAA,OAAA;EAAe;;;;EAc7D,YACT,CAAA,EAAA,MAAA;;;;;;AAHG,KAqEO,eAAA,GAAkB,OArEzB,CAAA;EAAe;EAYK,MAAE,EA2DlB,gBA3DkB;EAAO;EAAU,KAAE,EA6DtC,gBA7DsC;EAAM;EAAW,IAA3D,EA+DG,gBA/DH;CAAW,CAAA;AAaN,KAqDG,gBArDH,CAAA,kBAsDU,OAtDV,EAAA,GAAA,EAAA,EAAA,gBAuDQ,MAvDR,GAuDiB,MAvDjB,EAAA,WAAA,OAAA,EAAA,eAyDO,eAzDP,GAAA,SAAA,GAAA,SAAA,EAAA,YAAA,SAAA,CAAA,GAAA;EAAO,QAEL,EA0DA,aA1DA,CA0Dc,SA1Dd,CAAA;EAAS,MAEX,EAyDA,OAzDA;EAAO,MAEO,EAwDd,QAxDc;EAAS,MAAE,EAyDzB,QAzDyB;EAAO,OAAE,EA0DjC,QA1DiC;CAAQ,GA2D/C,6BA3DiD,CA2DnB,MA3DmB,CAAA,GA4DpD,sBA5DoD,CA4D7B,SA5D6B,CAAA;;;;;;;;;;;;;;;;;;AAoB/B,KA0DV,WA1DU,CAAA,kBA2DH,OA3DG,EAAA,GAAA,EAAA,EAAA,gBA4DL,MA5DK,GA4DI,MA5DJ,EAAA,WAAA,OAAA,EAAA,eA8DN,eA9DM,GAAA,SAAA,GAAA,SAAA,EAAA,YAAA,SAAA,CAAA,GAAA,CAAA,GAAA,EAiEhB,gBAjEgB,CAiEC,SAjED,EAiEY,OAjEZ,EAiEqB,QAjErB,EAiE+B,MAjE/B,EAiEuC,SAjEvC,CAAA,EAAA,GAkEjB,OAlEiB,CAAA,OAAA,CAAA,GAAA,OAAA;;;;KAuEjB,kBArE4C,CAAA,kBAsE9B,OAtE8B,EAAA,GAAA,EAAA,EAAA,gBAuEhC,MAvEgC,GAuEvB,MAvEuB,CAAA,GAAA;EAAS,QAAvC,EAyER,aAzEQ,CAyEM,SAzEN,CAAA;EAAO,MAEH,EAwEd,OAxEc;EAAS,MAAE,EAyEzB,QAzEyB;EAAQ,MAAE,EA0EnC,QA1EmC;CAAO;AAA7B;AActB;;KAkEK,sBAhEI,CAAA,YAAA,SAAA,CAAA,GAgE4C,SAhE5C,SAAA,SAAA,GAAA,CAAA,CAAA,GAAA;EAAgB;;;AAFY;AASrC;EAA4B,EAAA,EAiErB,SAjEqB;CAAA;AAEX,KAkEL,cAlEK,CAAA,kBAmEE,OAnEF,EAAA,GAAA,EAAA,EAAA,gBAoEA,MApEA,GAoES,MApET,EAAA,YAAA,SAAA,CAAA,GAsEb,kBAtEa,CAsEM,SAtEN,EAsEiB,OAtEjB,CAAA,GAsE4B,sBAtE5B,CAsEmD,SAtEnD,CAAA;;;;;;;;;;;;;AAWM;AAkBvB;;;;;;;;;;;;;AAQY;AAKP,KAwDO,SAxDP,CAAA,kBAyDc,OAzDI,EAAA,GAAA,EAAA,EAAA,gBA0DN,MA1DM,GA0DG,MA1DH,EAAA,WAAA,OAAA,EAAA,YAAA,SAAA,CAAA,GAAA,CAAA,GAAA,EA8DjB,cA9DiB,CA8DF,SA9DE,EA8DS,OA9DT,EA8DkB,SA9DlB,CAAA,EAAA,GA+DlB,OA/DkB,CA+DV,QA/DU,CAAA,GA+DE,QA/DF;;;;;;;;;;AAON;AAAA;;AAMoC,KAgEzC,kBAhEyC,CAAA,UAAA,MAAA,CAAA,GAiEpD,CAjEoD,SAAA,GAAA,KAAA,MAAA,IAAA,KAAA,MAAA,IAAA,KAAA,KAAA,EAAA,GAAA,GAkE9C,KAlE8C,IAkErC,KAlEqC,KAkE3B,kBAlE2B,CAkER,IAlEQ,CAAA,EAAA,GAmEjD,CAnEiD,SAAA,GAAA,KAAA,MAAA,IAAA,KAAA,MAAA,EAAA,GAAA,GAoE7C,KApE6C,IAoEpC,KApEoC,GAAA,GAqEhD,CArEgD;;AAQrC;AAGhB;;;;;;;;;;AAImE,KAoEvD,qBApEuD,CAAA,eAAA,MAAA,EAAA,gBAsElD,UAtEkD,CAAA,GAAA,UAwE1D,kBA5CY,CA4CO,MA5CP,CAAA,GAAA,UA6CX,eA7CW,CA6CK,OA7CL,CAAA,GA6CgB,WAAA,CAAY,eA7C5B,CAAA,CAAA,CAAA,CAAA,EAAA,GACF;EACF,UAAA,CAAA,EA6CF,WAAA,CAAY,eA7CV,EAAA;AAAM,CAAA,EAAS;AAKC;AAcjC;;;;;;;;;;;AAKM;AAcN;;;AAI4B,UA8BX,QAAA,CA9BW;EAAM,EAAA,EA+B7B,MA/BI,CAAA,MAAA,EAAA,MAAA,CAAA;EAAkB,CAAA,GACD,EAAA,MAAA,CAAA,EAAA,MAAA,GAAA,SAAA;;;;AAEgB;AA2B1C;AAqBA;AAQA;AAaA;;;;;;AAGuB;AAMvB;;;AAEW,UAhCM,QAAA,CAgCN;EAAgB,EAAA,EA/BtB,MA+BsB,CAAA,MAAA,EAAA,MAAA,CAAA;EAMd,CAAA,IAAA,EAAA,MAAA,CAAA,EAAA,MAAe,GAAA,SAAA;;;;;AA2Bd,UAzDG,aAAA,CAyDH;EAAa,MAKZ,CAAA,EAAA,MAAA;EAAC,IAAwB,CAAA,EAAA,MAAA;EAAC,OAAtB,CAAA,EA3DR,IA2DQ;EAAoB,MAIvB,CAAA,EAAA,MAAA;EAAgB,QAAA,CAAA,EAAA,OAAA;EAQ3B,MAAA,CAAA,EAAA,OAAA;EAAmB,QAAA,CAAA,EAAA,QAAA,GAAA,KAAA,GAAA,MAAA;;;;;AAMb,UAnEM,gBAAA,CAmEN;EAAa,OAEf,CAAA,EApEE,MAoEF,CAAA,MAAA,EAAA,MAAA,CAAA;EAAO,OAEP,CAAA,EArEE,GAqEF,CAAA,MAAA,EAAA;IAEA,KAAA,EAAA,MAAA;IAEC,OAAA,CAAA,EAzEwC,aAyExC;EAAQ,CAAA,CAAA;EAMb,MAAA,CAAA,EA9EK,aA8ES;;;;;AAeC,UAvFH,oBAuFG,CAAA,CAAA,CAAA,CAAA;EAAY,IAApB,EAtFL,CAsFK;EAAO,QAAA,EArFR,gBAqFQ;AAAA;;;;AAeH,cA9FH,eAAA,CA8FG;EAeJ,QAAA,QAAA;EAAe,MAAA,CAAA,GAAA,EAAA,MAAA,EAAA,KAAA,EAAA,MAAA,CAAA,EAAA,IAAA;EAAA,MACZ,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAnGgC,aAmGhC,CAAA,EAAA,IAAA;EAAe,YACX,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EA7FP,IA6FO,CA7FF,aA6FE,EAAA,QAAA,GAAA,MAAA,CAAA,CAAA,EAAA,IAAA;EAAO,MACT,CAAA,IAAA,EArFH,aAqFG,CAAA,EAAA,IAAA;EAAM,IAAG,CAAA,CAAA,CAAA,CAAA,IAAA,EAhFX,CAgFW,CAAA,EAhFP,oBAgFO,CAhFc,CAgFd,CAAA;EAAM,WAEV,CAAA,CAAA,EA9EN,gBA8EM;;;;;KAtEjB,mBA4ED,CAAA,kBA3Ee,OA2Ef,EAAA,GAAA,EAAA,EAAA,gBA1Ea,MA0Eb,GA1EsB,MA0EtB,EAAA,WAAA,OAAA,CAAA,GAAA;EAAmB;EACa,QAAnC,EAvEU,aAuEV,CAvEwB,SAuExB,CAAA;EAA6B;EACF,MAAE,EAtErB,OAsEqB;EAAa;EAA5B,MACE,EArER,QAqEQ;EAAS;EAAV,MAAA,EAnEP,QAmEO;EA+BJ;EAAe,OAAA,EAhGjB,QAgGiB;CAAA;;;;KA1FtB,cA8Fc,CAAA,qBA7FG,eA6FH,CAAA,MAAA,EAAA,OAAA,CAAA,GA7FsC,eA6FtC,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,gBAAA,SAAA,CAAA,GAxFf,aAwFe,SAAA,SAAA,GAAA,CAAA,CAAA,GAAA;EAAgB;;;;;;EAazB,OACR,EA7FU,OA6FV,CA7FkB,YA6FlB,CAAA;CAAY;;;;KAvFT,eA4FA,CAAA,YAAA,SAAA,CAAA,GA5FyC,SA4FzC,SAAA,SAAA,GAAA,CAAA,CAAA,GAAA;EAAS;;;;;;EAGW,EAAA,EAtFlB,SAuF0B;CAAS;;;;;;;;;;AAM9B;AAKZ;AAeA;AAA0B,KAlGd,eAkGc,CAAA,cAjGX,eAiGW,GAAA,SAAA,GAAA,SAAA,EAAA,kBAhGP,OAgGO,EAAA,GAAA,EAAA,EAAA,gBA/FT,MA+FS,GA/FA,MA+FA,EAAA,WAAA,OAAA,EAAA,qBA7FJ,eA6FI,CAAA,MAAA,EAAA,OAAA,CAAA,GA7F+B,eA6F/B,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,YAAA,SAAA,EAAA,gBAAA,SAAA,CAAA,GAvFtB,mBAuFsB,CAvFF,SAuFE,EAvFS,OAuFT,EAvFkB,QAuFlB,CAAA,GAtFzB,6BAsFyB,CAtFK,KAsFL,CAAA,GArFzB,cAqFyB,CArFV,YAqFU,EArFI,aAqFJ,CAAA,GApFzB,eAoFyB,CApFT,SAoFS,CAAA;;;;;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;KAvDX,+BACI,2DACG,gCACF,SAAS,0BACP,qIAIG,mCAAmC,0CAKnD,gBACJ,QACA,WACA,SACA,UACA,cACA,WACA,0BAES,oBACN,kBAAkB,mBAElB,oBAAoB,aACpB,qBAAqB,oBAAoB,cACzC,QAAQ,oBAAoB,cAC5B,QAAQ,qBAAqB,oBAAoB,yBAGjD,gCACA,mBACA,QAAQ;;;;aAKD,aAAA;;;;;;;;;;;;;;KAeA,oBACX,UAAU,+DACP,oBAAoB"}
@@ -264,6 +264,12 @@ declare class Endpoint<TRoute extends string, TMethod extends HttpMethod, TInput
264
264
  tags?: string[];
265
265
  /** The HTTP success status code to return (default: 200) */
266
266
  readonly status: SuccessStatus;
267
+ /**
268
+ * Response content type for this endpoint. Defaults to `'application/json'`.
269
+ * Non-JSON types cause adaptors to emit the body as-is with the declared
270
+ * Content-Type header instead of JSON-serializing.
271
+ */
272
+ readonly responseType: string;
267
273
  /** Default headers to apply to all responses */
268
274
  readonly defaultHeaders: Record<string, string>;
269
275
  /** Function to extract session data from the request context */
@@ -450,7 +456,8 @@ declare class Endpoint<TRoute extends string, TMethod extends HttpMethod, TInput
450
456
  audits,
451
457
  databaseService,
452
458
  rlsConfig,
453
- rlsBypass
459
+ rlsBypass,
460
+ responseType
454
461
  }: EndpointOptions<TRoute, TMethod, TInput, OutSchema, TServices, TLogger, TSession, OutSchema, TEventPublisher, TEventPublisherServiceName, TAuditStorage, TAuditStorageServiceName, TAuditAction, TDatabase, TDatabaseServiceName>);
455
462
  }
456
463
  /**
@@ -533,6 +540,11 @@ interface EndpointOptions<TRoute extends string, TMethod extends HttpMethod, TIn
533
540
  rlsConfig?: RlsConfig<TServices, TSession, TLogger>;
534
541
  /** Whether to bypass RLS for this endpoint */
535
542
  rlsBypass?: boolean;
543
+ /**
544
+ * Response content type (e.g. `'application/json'`, `'text/html'`).
545
+ * Defaults to `'application/json'` when omitted.
546
+ */
547
+ responseType?: string;
536
548
  }
537
549
  /**
538
550
  * Defines the possible input schema types for an endpoint.
@@ -832,4 +844,4 @@ declare enum SuccessStatus {
832
844
  type EndpointOutput<T> = T extends Endpoint<any, any, any, infer OutSchema, any, any, any, any> ? InferStandardSchema<OutSchema> : never;
833
845
  //#endregion
834
846
  export { ActorExtractor, AuthorizeFn, Authorizer, BUILT_IN_SECURITY_SCHEMES, BuiltInSecuritySchemeId, CookieFn, Endpoint, EndpointContext, EndpointHandler, EndpointOutput, EndpointSchemas, HeaderFn, MappedAudit, OAuthFlow, OAuthFlows, RLS_BYPASS, ResponseBuilder, RlsBypass, RlsConfig, RlsContext, RlsContextExtractor, SecurityScheme, SessionFn, SuccessStatus, createAuthorizer, getSecurityScheme, isBuiltInSecurityScheme };
835
- //# sourceMappingURL=Endpoint-CRHpLPV3.d.mts.map
847
+ //# sourceMappingURL=Endpoint-NvjIednd.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Endpoint-NvjIednd.d.mts","names":[],"sources":["../src/endpoints/Authorizer.ts","../src/endpoints/audit.ts","../src/endpoints/rls.ts","../src/endpoints/Endpoint.ts"],"sourcesContent":[],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  const require_Construct = require('./Construct-B14miJ6P.cjs');
2
- const require_lazyAccessors = require('./lazyAccessors-DHvDeww0.cjs');
2
+ const require_lazyAccessors = require('./lazyAccessors-BzMEdmis.cjs');
3
3
  const require_processAudits = require('./processAudits-CUko08pi.cjs');
4
- const __geekmidas_db_rls = require_Construct.__toESM(require("@geekmidas/db/rls"));
5
4
  const __geekmidas_errors = require_Construct.__toESM(require("@geekmidas/errors"));
5
+ const __geekmidas_db_rls = require_Construct.__toESM(require("@geekmidas/db/rls"));
6
6
  const __geekmidas_services = require_Construct.__toESM(require("@geekmidas/services"));
7
7
  const qs = require_Construct.__toESM(require("qs"));
8
8
  const hono_cookie = require_Construct.__toESM(require("hono/cookie"));
@@ -74,6 +74,13 @@ function parseHonoQuery(c) {
74
74
  //#endregion
75
75
  //#region src/endpoints/HonoEndpointAdaptor.ts
76
76
  /**
77
+ * Case-insensitive check for a `content-type` header in a metadata headers map.
78
+ */
79
+ function hasContentTypeHeader(headers) {
80
+ for (const key of Object.keys(headers)) if (key.toLowerCase() === "content-type") return true;
81
+ return false;
82
+ }
83
+ /**
77
84
  * Analyze endpoint features at registration time (not per-request)
78
85
  */
79
86
  function analyzeEndpointFeatures(endpoint) {
@@ -273,7 +280,9 @@ var HonoEndpoint = class HonoEndpoint {
273
280
  status,
274
281
  body: output
275
282
  }, "Outgoing response");
276
- return c.json(output, status);
283
+ if (endpoint.responseType === "application/json") return c.json(output, status);
284
+ if (!(metadata.headers && hasContentTypeHeader(metadata.headers))) c.header("content-type", endpoint.responseType);
285
+ return c.body(output, status);
277
286
  } catch (validationError) {
278
287
  logger.error(validationError, "Output validation failed");
279
288
  const error = (0, __geekmidas_errors.wrapError)(validationError, 422, "Response validation failed");
@@ -315,4 +324,4 @@ Object.defineProperty(exports, 'HonoEndpoint', {
315
324
  return HonoEndpoint;
316
325
  }
317
326
  });
318
- //# sourceMappingURL=HonoEndpointAdaptor-BDz1qM4z.cjs.map
327
+ //# sourceMappingURL=HonoEndpointAdaptor-DNn3-dHv.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HonoEndpointAdaptor-DNn3-dHv.cjs","names":["routes: string[]","cwd: string","endpoints: Endpoint<string, HttpMethod, any, any, TServices>[]","c: Context","headers: Record<string, string>","endpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>","endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>","c: Context<any, string, {}>","data: unknown","schema?: T","serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>>","app: Hono","_app: Hono","_serviceDiscovery: ServiceDiscovery<any>","routes: string[]","envParser: EnvironmentParser<{}>","Hono","_logger: TLogger","options?: HonoEndpointOptions","endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[]","validators: any[]","c: Context","db: TDatabase | undefined","ResponseBuilder","metadata","output","result","validationError: any","e: any","docsPath: string","openApiOptions?: HonoEndpointOptions['openApiOptions']"],"sources":["../src/endpoints/helpers.ts","../src/endpoints/parseHonoQuery.ts","../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":["import path from 'node:path';\nimport type { Service } from '@geekmidas/services';\nimport fg from 'fast-glob';\nimport type { HttpMethod } from '../types';\nimport { Endpoint } from './Endpoint';\n\n// Re-export utility functions\n\n/**\n * Recursively finds the project root directory by looking for lock files.\n * Traverses up the directory tree until it finds a package manager lock file.\n *\n * @param cwd - The current working directory to start searching from\n * @returns Promise resolving to the absolute path of the project root\n *\n * @example\n * ```typescript\n * const projectRoot = await getProjectRoot(process.cwd());\n * console.log(`Project root: ${projectRoot}`);\n * // Output: Project root: /Users/user/my-project\n * ```\n */\nexport async function getProjectRoot(cwd: string): Promise<string> {\n\tif (cwd === '/') {\n\t\treturn cwd;\n\t}\n\n\tconst stream = fg.stream(\n\t\t['yarn.lock', 'pnpm-lock.yaml', 'package-lock.json', 'deno.lock'],\n\t\t{ dot: true, cwd },\n\t);\n\n\tlet isRoot = false;\n\n\tfor await (const _ of stream) {\n\t\tisRoot = true;\n\t\tbreak;\n\t}\n\n\tif (isRoot) {\n\t\treturn cwd;\n\t}\n\n\treturn getProjectRoot(path.resolve(cwd, '..'));\n}\n\n/**\n * Discovers and imports all Endpoint instances from the specified route patterns.\n * Uses fast-glob to find files matching the patterns and extracts exported Endpoints.\n *\n * @template TServices - Array of service types used by the endpoints\n * @param routes - Array of glob patterns to match route files (e.g., ['src/routes/*.ts'])\n * @param cwd - The current working directory to resolve paths from\n * @returns Promise resolving to an array of Endpoint instances found in the matched files\n *\n * @example\n * ```typescript\n * // Find all endpoints in the routes directory\n * const endpoints = await getEndpointsFromRoutes(\n * ['src/routes/**\\/*.ts'],\n * process.cwd()\n * );\n *\n * // Register endpoints with your server\n * for (const endpoint of endpoints) {\n * server.register(endpoint);\n * }\n * ```\n *\n * @remarks\n * - Only exports that are valid Endpoint instances are included\n * - Files are imported dynamically, so they must be valid ES modules\n * - The function filters out non-Endpoint exports automatically\n */\nexport async function getEndpointsFromRoutes<TServices extends Service[]>(\n\troutes: string[],\n\tcwd: string,\n): Promise<Endpoint<string, HttpMethod, any, any, TServices>[]> {\n\tconst stream = fg.stream(routes, { cwd });\n\n\tconst endpoints: Endpoint<string, HttpMethod, any, any, TServices>[] = [];\n\n\tfor await (const f of stream) {\n\t\t// Resolve the absolute path for the route file\n\t\tconst routePath = path.resolve(cwd, f.toString());\n\t\t// Dynamically import the route module\n\t\tconst route = await import(routePath);\n\n\t\t// Filter exported values to find only Endpoint instances\n\t\tconst handlers = Object.values(route).filter((value) => {\n\t\t\treturn Endpoint.isEndpoint(value);\n\t\t}) as unknown as Endpoint<string, HttpMethod, any, any, TServices>[];\n\n\t\tendpoints.push(...handlers);\n\t}\n\n\treturn endpoints;\n}\n","import type { Context } from 'hono';\nimport qs from 'qs';\n\n/**\n * Parse Hono query parameters using qs bracket notation\n * Supports nested objects, arrays, and deep nesting via standard bracket syntax\n */\nexport function parseHonoQuery(c: Context): Record<string, any> {\n\tconst url = c.req.url;\n\tconst queryIndex = url.indexOf('?');\n\tif (queryIndex === -1) {\n\t\treturn {};\n\t}\n\tconst queryString = url.slice(queryIndex + 1);\n\treturn qs.parse(queryString) as Record<string, any>;\n}\n","import type { AuditableAction, AuditStorage } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { checkRateLimit, getRateLimitHeaders } from '@geekmidas/rate-limit';\nimport {\n\trunWithRequestContext,\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type Context, Hono } from 'hono';\nimport { setCookie } from 'hono/cookie';\nimport { logger as honoLogger } from 'hono/logger';\nimport { timing } from 'hono/timing';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { validator } from 'hono/validator';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod, LowerHttpMethod } from '../types';\nimport type { MappedAudit } from './audit';\nimport {\n\tEndpoint,\n\ttype EndpointContext,\n\ttype EndpointSchemas,\n\tResponseBuilder,\n} from './Endpoint';\nimport { getEndpointsFromRoutes } from './helpers';\nimport { createHonoCookies, createHonoHeaders } from './lazyAccessors';\nimport { parseHonoQuery } from './parseHonoQuery';\nimport {\n\tcreateAuditContext,\n\texecuteWithAuditTransaction,\n} from './processAudits';\n\nexport interface HonoEndpointOptions {\n\t/**\n\t * Path where OpenAPI documentation will be served.\n\t * Set to false to disable docs route.\n\t * @default '/docs'\n\t */\n\tdocsPath?: string | false;\n\t/**\n\t * OpenAPI schema options\n\t */\n\topenApiOptions?: {\n\t\ttitle?: string;\n\t\tversion?: string;\n\t\tdescription?: string;\n\t};\n}\n\n/**\n * Feature flags for an endpoint, analyzed once at route registration time.\n * This avoids per-request feature detection overhead.\n */\ninterface EndpointFeatures {\n\thasServices: boolean;\n\thasDatabase: boolean;\n\thasBodyValidation: boolean;\n\thasQueryValidation: boolean;\n\thasParamValidation: boolean;\n\thasAudits: boolean;\n\thasEvents: boolean;\n\thasRateLimit: boolean;\n\thasRls: boolean;\n}\n\n/**\n * Case-insensitive check for a `content-type` header in a metadata headers map.\n */\nfunction hasContentTypeHeader(headers: Record<string, string>): boolean {\n\tfor (const key of Object.keys(headers)) {\n\t\tif (key.toLowerCase() === 'content-type') return true;\n\t}\n\treturn false;\n}\n\n/**\n * Analyze endpoint features at registration time (not per-request)\n */\nfunction analyzeEndpointFeatures(\n\tendpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>,\n): EndpointFeatures {\n\treturn {\n\t\thasServices: endpoint.services.length > 0,\n\t\thasDatabase: !!endpoint.databaseService,\n\t\thasBodyValidation: !!endpoint.input?.body,\n\t\thasQueryValidation: !!endpoint.input?.query,\n\t\thasParamValidation: !!endpoint.input?.params,\n\t\t// Audit context needed if declarative audits OR auditor storage service configured (for manual audits)\n\t\thasAudits:\n\t\t\t(endpoint.audits?.length ?? 0) > 0 || !!endpoint.auditorStorageService,\n\t\thasEvents: (endpoint.events?.length ?? 0) > 0,\n\t\thasRateLimit: !!endpoint.rateLimit,\n\t\thasRls: !!endpoint.rlsConfig && !endpoint.rlsBypass,\n\t};\n}\n\nexport class HonoEndpoint<\n\tTRoute extends string,\n\tTMethod extends HttpMethod,\n\tTInput extends EndpointSchemas = {},\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTSession = unknown,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> {\n\tconstructor(\n\t\tprivate readonly endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t) {}\n\n\tstatic isDev = process.env.NODE_ENV === 'development';\n\n\tstatic async validate<T extends StandardSchemaV1>(\n\t\tc: Context<any, string, {}>,\n\t\tdata: unknown,\n\t\tschema?: T,\n\t) {\n\t\tif (!schema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsed = await Endpoint.validate(schema, data);\n\n\t\tif (parsed.issues) {\n\t\t\treturn c.json(parsed.issues, 422);\n\t\t}\n\n\t\treturn parsed.value;\n\t}\n\taddRoute(\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>>,\n\t\tapp: Hono,\n\t): void {\n\t\tHonoEndpoint.addRoute(this.endpoint, serviceDiscovery, app);\n\t}\n\n\t/**\n\t * @deprecated Global event middleware is no longer used.\n\t * Events are now published per-route only for endpoints that have events configured.\n\t * This method is kept for backward compatibility but does nothing.\n\t */\n\tstatic applyEventMiddleware(\n\t\t_app: Hono,\n\t\t_serviceDiscovery: ServiceDiscovery<any>,\n\t) {\n\t\t// No-op: Event publishing is now handled per-route in addRoute\n\t\t// This avoids running middleware on every request including 404s\n\t}\n\n\tstatic async fromRoutes<TLogger extends Logger, TServices extends Service[]>(\n\t\troutes: string[],\n\t\tenvParser: EnvironmentParser<{}>,\n\t\tapp = new Hono(),\n\t\t_logger: TLogger,\n\t\tcwd = process.cwd(),\n\t\toptions?: HonoEndpointOptions,\n\t): Promise<Hono> {\n\t\tconst endpoints = await getEndpointsFromRoutes<TServices>(routes, cwd);\n\t\tconst serviceDiscovery =\n\t\t\tServiceDiscovery.getInstance<ServiceRecord<TServices>>(envParser);\n\n\t\tHonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);\n\n\t\treturn app;\n\t}\n\n\tstatic addRoutes<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>>,\n\t\tapp: Hono,\n\t\toptions?: HonoEndpointOptions,\n\t): void {\n\t\t// Add timing middleware (always enabled)\n\t\tapp.use('*', timing());\n\n\t\t// Add logger middleware in development mode\n\n\t\tif (HonoEndpoint.isDev) {\n\t\t\tapp.use('*', honoLogger());\n\t\t}\n\n\t\t// Add docs route if not disabled\n\t\tconst docsPath =\n\t\t\toptions?.docsPath !== false ? options?.docsPath || '/docs' : null;\n\t\tif (docsPath) {\n\t\t\tHonoEndpoint.addDocsRoute(\n\t\t\t\tendpoints,\n\t\t\t\tapp,\n\t\t\t\tdocsPath,\n\t\t\t\toptions?.openApiOptions,\n\t\t\t);\n\t\t}\n\n\t\t// Sort endpoints to ensure static routes come before dynamic ones\n\t\tconst sortedEndpoints = endpoints.sort((a, b) => {\n\t\t\tconst aSegments = a.route.split('/');\n\t\t\tconst bSegments = b.route.split('/');\n\n\t\t\t// Compare each segment\n\t\t\tfor (let i = 0; i < Math.max(aSegments.length, bSegments.length); i++) {\n\t\t\t\tconst aSegment = aSegments[i] || '';\n\t\t\t\tconst bSegment = bSegments[i] || '';\n\n\t\t\t\t// If one is dynamic and the other is not, static comes first\n\t\t\t\tconst aIsDynamic = aSegment.startsWith(':');\n\t\t\t\tconst bIsDynamic = bSegment.startsWith(':');\n\n\t\t\t\tif (!aIsDynamic && bIsDynamic) return -1;\n\t\t\t\tif (aIsDynamic && !bIsDynamic) return 1;\n\n\t\t\t\t// If both are the same type, compare alphabetically\n\t\t\t\tif (aSegment !== bSegment) {\n\t\t\t\t\treturn aSegment.localeCompare(bSegment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\n\t\t// Note: Global event middleware removed for performance\n\t\t// Events are now published per-route only for endpoints with events configured\n\t\tfor (const endpoint of sortedEndpoints) {\n\t\t\tHonoEndpoint.addRoute(endpoint, serviceDiscovery, app);\n\t\t}\n\t}\n\n\tstatic addRoute<\n\t\tTRoute extends string,\n\t\tTMethod extends HttpMethod,\n\t\tTInput extends EndpointSchemas = {},\n\t\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t\tTSession = unknown,\n\t\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\t\tTEventPublisherServiceName extends string = string,\n\t\tTAuditStorage extends AuditStorage | undefined = undefined,\n\t\tTAuditStorageServiceName extends string = string,\n\t\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>,\n\t\tTDatabase = undefined,\n\t\tTDatabaseServiceName extends string = string,\n\t>(\n\t\tendpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>>,\n\t\tapp: Hono,\n\t): void {\n\t\tconst { route } = endpoint;\n\t\tconst method = endpoint.method.toLowerCase() as LowerHttpMethod<TMethod>;\n\n\t\t// Analyze endpoint features once at registration time (not per-request)\n\t\tconst features = analyzeEndpointFeatures(endpoint);\n\n\t\t// Build validators array - only add validators for schemas that exist\n\t\tconst validators: any[] = [];\n\n\t\tif (features.hasBodyValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('json', (value, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, value, endpoint.input?.body),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasQueryValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('query', (_, c) => {\n\t\t\t\t\tconst parsedQuery = parseHonoQuery(c);\n\t\t\t\t\treturn HonoEndpoint.validate(c, parsedQuery, endpoint.input?.query);\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasParamValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('param', (params, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, params, endpoint.input?.params),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// Main handler\n\t\tconst handler = async (c: Context) => {\n\t\t\t// Request context setup\n\t\t\tconst startTime = Date.now();\n\t\t\tconst requestId = c.req.header('X-Request-ID') ?? crypto.randomUUID();\n\n\t\t\tconst logger = endpoint.logger.child({\n\t\t\t\trequestId,\n\t\t\t\tendpoint: endpoint.fullPath,\n\t\t\t\troute: endpoint.route,\n\t\t\t\thost: c.req.header('host'),\n\t\t\t\tmethod: endpoint.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t}) as TLogger;\n\n\t\t\t// Set response header\n\t\t\tc.header('X-Request-ID', requestId);\n\n\t\t\t// Wrap entire handler in request context for services to access\n\t\t\treturn runWithRequestContext(\n\t\t\t\t{ logger, requestId, startTime },\n\t\t\t\tasync () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Lazy accessors - no upfront parsing, use native Hono methods\n\t\t\t\t\t\tconst header = createHonoHeaders(c);\n\t\t\t\t\t\tconst cookie = createHonoCookies(c);\n\n\t\t\t\t\t\t// Only register services if endpoint has any\n\t\t\t\t\t\tconst services = features.hasServices\n\t\t\t\t\t\t\t? await serviceDiscovery.register(endpoint.services)\n\t\t\t\t\t\t\t: ({} as ServiceRecord<TServices>);\n\n\t\t\t\t\t\t// Resolve database service only if configured\n\t\t\t\t\t\tconst rawDb = features.hasDatabase\n\t\t\t\t\t\t\t? await serviceDiscovery\n\t\t\t\t\t\t\t\t\t.register([endpoint.databaseService!])\n\t\t\t\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t\t\t\ts[\n\t\t\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName as keyof typeof s\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Extract session (defaults to empty object)\n\t\t\t\t\t\tconst session = await endpoint.getSession({\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t...(rawDb !== undefined && { db: rawDb }),\n\t\t\t\t\t\t} as any);\n\n\t\t\t\t\t\t// Check authorization (defaults to true)\n\t\t\t\t\t\tconst isAuthorized = await endpoint.authorize({\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t...(rawDb !== undefined && { db: rawDb }),\n\t\t\t\t\t\t\tbody: features.hasBodyValidation\n\t\t\t\t\t\t\t\t? (c.req.valid as any)('json')\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tquery: features.hasQueryValidation\n\t\t\t\t\t\t\t\t? (c.req.valid as any)('query')\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tparams: features.hasParamValidation\n\t\t\t\t\t\t\t\t? (c.req.valid as any)('param')\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t} as any);\n\n\t\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\t\tlogger.warn('Unauthorized access attempt');\n\t\t\t\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check rate limit only if configured\n\t\t\t\t\t\tif (features.hasRateLimit) {\n\t\t\t\t\t\t\tconst rateLimitInfo = await checkRateLimit(endpoint.rateLimit!, {\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\tpath: c.req.path,\n\t\t\t\t\t\t\t\tmethod: endpoint.method,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst rateLimitHeaders = getRateLimitHeaders(\n\t\t\t\t\t\t\t\trateLimitInfo,\n\t\t\t\t\t\t\t\tendpoint.rateLimit!,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(rateLimitHeaders)) {\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Create audit context only if audits are configured\n\t\t\t\t\t\tconst auditContext = features.hasAudits\n\t\t\t\t\t\t\t? await createAuditContext(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tservices: services as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst audits = features.hasAudits\n\t\t\t\t\t\t\t? (endpoint.audits as MappedAudit<TAuditAction, TOutSchema>[])\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\t// Warn if declarative audits are configured but no audit storage\n\t\t\t\t\t\tif (features.hasAudits && !auditContext) {\n\t\t\t\t\t\t\tlogger.warn('No auditor storage service available');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Extract RLS context only if configured and not bypassed\n\t\t\t\t\t\tconst rlsContext =\n\t\t\t\t\t\t\tfeatures.hasRls && rawDb !== undefined\n\t\t\t\t\t\t\t\t? await endpoint.rlsConfig?.extractor({\n\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\tsession: session as TSession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Execute handler with automatic audit transaction support\n\t\t\t\t\t\tconst result = await executeWithAuditTransaction(\n\t\t\t\t\t\t\tauditContext,\n\t\t\t\t\t\t\tasync (auditor) => {\n\t\t\t\t\t\t\t\tconst sameDatabase =\n\t\t\t\t\t\t\t\t\tauditContext?.storage?.databaseServiceName &&\n\t\t\t\t\t\t\t\t\tauditContext.storage.databaseServiceName ===\n\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName;\n\t\t\t\t\t\t\t\tconst baseDb = sameDatabase\n\t\t\t\t\t\t\t\t\t? (auditor?.getTransaction?.() ?? rawDb)\n\t\t\t\t\t\t\t\t\t: rawDb;\n\n\t\t\t\t\t\t\t\tconst executeHandler = async (db: TDatabase | undefined) => {\n\t\t\t\t\t\t\t\t\tconst responseBuilder = new ResponseBuilder();\n\t\t\t\t\t\t\t\t\tconst response = await endpoint.handler(\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t\t\tbody: features.hasBodyValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('json')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tquery: features.hasQueryValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('query')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tparams: features.hasParamValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('param')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\t\tauditor,\n\t\t\t\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\t\t\t} as unknown as EndpointContext<\n\t\t\t\t\t\t\t\t\t\t\tTInput,\n\t\t\t\t\t\t\t\t\t\t\tTServices,\n\t\t\t\t\t\t\t\t\t\t\tTLogger,\n\t\t\t\t\t\t\t\t\t\t\tTSession,\n\t\t\t\t\t\t\t\t\t\t\tTAuditAction,\n\t\t\t\t\t\t\t\t\t\t\tTDatabase,\n\t\t\t\t\t\t\t\t\t\t\tTAuditStorage\n\t\t\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\t\t\tresponseBuilder,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tlet data = response;\n\t\t\t\t\t\t\t\t\tlet metadata = responseBuilder.getMetadata();\n\n\t\t\t\t\t\t\t\t\tif (Endpoint.hasMetadata(response)) {\n\t\t\t\t\t\t\t\t\t\tdata = response.data;\n\t\t\t\t\t\t\t\t\t\tmetadata = response.metadata;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst output = endpoint.outputSchema\n\t\t\t\t\t\t\t\t\t\t? await endpoint.parseOutput(data)\n\t\t\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\t\t\treturn { output, metadata, responseBuilder };\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tif (features.hasRls && rlsContext && baseDb) {\n\t\t\t\t\t\t\t\t\treturn withRlsContext(\n\t\t\t\t\t\t\t\t\t\tbaseDb as any,\n\t\t\t\t\t\t\t\t\t\trlsContext,\n\t\t\t\t\t\t\t\t\t\tasync (trx) => executeHandler(trx as TDatabase),\n\t\t\t\t\t\t\t\t\t\t{ prefix: endpoint.rlsConfig?.prefix },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn executeHandler(baseDb as TDatabase | undefined);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tasync (result, auditor) => {\n\t\t\t\t\t\t\t\tif (!audits?.length) return;\n\n\t\t\t\t\t\t\t\tfor (const audit of audits) {\n\t\t\t\t\t\t\t\t\tif (audit.when && !audit.when(result.output as any)) {\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst payload = audit.payload(result.output as any);\n\t\t\t\t\t\t\t\t\tconst entityId = audit.entityId?.(result.output as any);\n\t\t\t\t\t\t\t\t\tauditor.audit(audit.type as any, payload as any, {\n\t\t\t\t\t\t\t\t\t\ttable: audit.table,\n\t\t\t\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ db: rawDb },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst { output, metadata } = result;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet status = endpoint.status as ContentfulStatusCode;\n\n\t\t\t\t\t\t\tif (metadata.status) {\n\t\t\t\t\t\t\t\tstatus = metadata.status as ContentfulStatusCode;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.headers) {\n\t\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(metadata.headers)) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.cookies) {\n\t\t\t\t\t\t\t\tfor (const [name, { value, options }] of metadata.cookies) {\n\t\t\t\t\t\t\t\t\tsetCookie(c, name, value, options);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Only publish events if configured (no global middleware overhead)\n\t\t\t\t\t\t\tif (features.hasEvents && Endpoint.isSuccessStatus(status)) {\n\t\t\t\t\t\t\t\tawait publishConstructEvents<any, any>(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info({ status, body: output }, 'Outgoing response');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Respect the endpoint's declared responseType. For JSON (default)\n\t\t\t\t\t\t\t// we use c.json() which sets Content-Type and serializes. For any\n\t\t\t\t\t\t\t// other type, emit the body as-is and set the header explicitly —\n\t\t\t\t\t\t\t// metadata.headers (from r.header()) applied above still wins.\n\t\t\t\t\t\t\tif (endpoint.responseType === 'application/json') {\n\t\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\t\treturn c.json(output, status);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!(metadata.headers && hasContentTypeHeader(metadata.headers))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tc.header('content-type', endpoint.responseType);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn c.body(output as any, status);\n\t\t\t\t\t\t} catch (validationError: any) {\n\t\t\t\t\t\t\tlogger.error(validationError, 'Output validation failed');\n\t\t\t\t\t\t\tconst error = wrapError(\n\t\t\t\t\t\t\t\tvalidationError,\n\t\t\t\t\t\t\t\t422,\n\t\t\t\t\t\t\t\t'Response validation failed',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tlogger.error(e, 'Error processing endpoint request');\n\t\t\t\t\t\tconst error = wrapError(e, 500, 'Internal Server Error');\n\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\t// Register route with conditional validators\n\t\tapp[method](route, ...validators, handler);\n\t}\n\n\tstatic addDocsRoute<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tapp: Hono,\n\t\tdocsPath: string,\n\t\topenApiOptions?: HonoEndpointOptions['openApiOptions'],\n\t): void {\n\t\tapp.get(docsPath, async (c) => {\n\t\t\ttry {\n\t\t\t\tconst openApiSchema = await Endpoint.buildOpenApiSchema(\n\t\t\t\t\tendpoints,\n\t\t\t\t\topenApiOptions,\n\t\t\t\t);\n\n\t\t\t\treturn c.json(openApiSchema);\n\t\t\t} catch {\n\t\t\t\treturn c.json(\n\t\t\t\t\t{ error: 'Failed to generate OpenAPI documentation' },\n\t\t\t\t\t500,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import { Endpoint, ResponseBuilder, createHonoCookies, createHonoHeaders, publishConstructEvents } from "./lazyAccessors-CJZYs9uM.mjs";
1
+ import { Endpoint, ResponseBuilder, createHonoCookies, createHonoHeaders, publishConstructEvents } from "./lazyAccessors-BPPR05EA.mjs";
2
2
  import { createAuditContext, executeWithAuditTransaction } from "./processAudits-B0PbJf1Z.mjs";
3
- import { withRlsContext } from "@geekmidas/db/rls";
4
3
  import { wrapError } from "@geekmidas/errors";
4
+ import { withRlsContext } from "@geekmidas/db/rls";
5
5
  import { ServiceDiscovery, runWithRequestContext } from "@geekmidas/services";
6
6
  import qs from "qs";
7
7
  import { setCookie } from "hono/cookie";
@@ -73,6 +73,13 @@ function parseHonoQuery(c) {
73
73
  //#endregion
74
74
  //#region src/endpoints/HonoEndpointAdaptor.ts
75
75
  /**
76
+ * Case-insensitive check for a `content-type` header in a metadata headers map.
77
+ */
78
+ function hasContentTypeHeader(headers) {
79
+ for (const key of Object.keys(headers)) if (key.toLowerCase() === "content-type") return true;
80
+ return false;
81
+ }
82
+ /**
76
83
  * Analyze endpoint features at registration time (not per-request)
77
84
  */
78
85
  function analyzeEndpointFeatures(endpoint) {
@@ -272,7 +279,9 @@ var HonoEndpoint = class HonoEndpoint {
272
279
  status,
273
280
  body: output
274
281
  }, "Outgoing response");
275
- return c.json(output, status);
282
+ if (endpoint.responseType === "application/json") return c.json(output, status);
283
+ if (!(metadata.headers && hasContentTypeHeader(metadata.headers))) c.header("content-type", endpoint.responseType);
284
+ return c.body(output, status);
276
285
  } catch (validationError) {
277
286
  logger$1.error(validationError, "Output validation failed");
278
287
  const error = wrapError(validationError, 422, "Response validation failed");
@@ -309,4 +318,4 @@ var HonoEndpoint = class HonoEndpoint {
309
318
 
310
319
  //#endregion
311
320
  export { HonoEndpoint };
312
- //# sourceMappingURL=HonoEndpointAdaptor-DPBfEPZj.mjs.map
321
+ //# sourceMappingURL=HonoEndpointAdaptor-cpttJfsS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HonoEndpointAdaptor-cpttJfsS.mjs","names":["routes: string[]","cwd: string","endpoints: Endpoint<string, HttpMethod, any, any, TServices>[]","c: Context","headers: Record<string, string>","endpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>","endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>","c: Context<any, string, {}>","data: unknown","schema?: T","serviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>>","app: Hono","_app: Hono","_serviceDiscovery: ServiceDiscovery<any>","routes: string[]","envParser: EnvironmentParser<{}>","_logger: TLogger","options?: HonoEndpointOptions","endpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[]","validators: any[]","c: Context","logger","db: TDatabase | undefined","metadata","output","result","validationError: any","e: any","docsPath: string","openApiOptions?: HonoEndpointOptions['openApiOptions']"],"sources":["../src/endpoints/helpers.ts","../src/endpoints/parseHonoQuery.ts","../src/endpoints/HonoEndpointAdaptor.ts"],"sourcesContent":["import path from 'node:path';\nimport type { Service } from '@geekmidas/services';\nimport fg from 'fast-glob';\nimport type { HttpMethod } from '../types';\nimport { Endpoint } from './Endpoint';\n\n// Re-export utility functions\n\n/**\n * Recursively finds the project root directory by looking for lock files.\n * Traverses up the directory tree until it finds a package manager lock file.\n *\n * @param cwd - The current working directory to start searching from\n * @returns Promise resolving to the absolute path of the project root\n *\n * @example\n * ```typescript\n * const projectRoot = await getProjectRoot(process.cwd());\n * console.log(`Project root: ${projectRoot}`);\n * // Output: Project root: /Users/user/my-project\n * ```\n */\nexport async function getProjectRoot(cwd: string): Promise<string> {\n\tif (cwd === '/') {\n\t\treturn cwd;\n\t}\n\n\tconst stream = fg.stream(\n\t\t['yarn.lock', 'pnpm-lock.yaml', 'package-lock.json', 'deno.lock'],\n\t\t{ dot: true, cwd },\n\t);\n\n\tlet isRoot = false;\n\n\tfor await (const _ of stream) {\n\t\tisRoot = true;\n\t\tbreak;\n\t}\n\n\tif (isRoot) {\n\t\treturn cwd;\n\t}\n\n\treturn getProjectRoot(path.resolve(cwd, '..'));\n}\n\n/**\n * Discovers and imports all Endpoint instances from the specified route patterns.\n * Uses fast-glob to find files matching the patterns and extracts exported Endpoints.\n *\n * @template TServices - Array of service types used by the endpoints\n * @param routes - Array of glob patterns to match route files (e.g., ['src/routes/*.ts'])\n * @param cwd - The current working directory to resolve paths from\n * @returns Promise resolving to an array of Endpoint instances found in the matched files\n *\n * @example\n * ```typescript\n * // Find all endpoints in the routes directory\n * const endpoints = await getEndpointsFromRoutes(\n * ['src/routes/**\\/*.ts'],\n * process.cwd()\n * );\n *\n * // Register endpoints with your server\n * for (const endpoint of endpoints) {\n * server.register(endpoint);\n * }\n * ```\n *\n * @remarks\n * - Only exports that are valid Endpoint instances are included\n * - Files are imported dynamically, so they must be valid ES modules\n * - The function filters out non-Endpoint exports automatically\n */\nexport async function getEndpointsFromRoutes<TServices extends Service[]>(\n\troutes: string[],\n\tcwd: string,\n): Promise<Endpoint<string, HttpMethod, any, any, TServices>[]> {\n\tconst stream = fg.stream(routes, { cwd });\n\n\tconst endpoints: Endpoint<string, HttpMethod, any, any, TServices>[] = [];\n\n\tfor await (const f of stream) {\n\t\t// Resolve the absolute path for the route file\n\t\tconst routePath = path.resolve(cwd, f.toString());\n\t\t// Dynamically import the route module\n\t\tconst route = await import(routePath);\n\n\t\t// Filter exported values to find only Endpoint instances\n\t\tconst handlers = Object.values(route).filter((value) => {\n\t\t\treturn Endpoint.isEndpoint(value);\n\t\t}) as unknown as Endpoint<string, HttpMethod, any, any, TServices>[];\n\n\t\tendpoints.push(...handlers);\n\t}\n\n\treturn endpoints;\n}\n","import type { Context } from 'hono';\nimport qs from 'qs';\n\n/**\n * Parse Hono query parameters using qs bracket notation\n * Supports nested objects, arrays, and deep nesting via standard bracket syntax\n */\nexport function parseHonoQuery(c: Context): Record<string, any> {\n\tconst url = c.req.url;\n\tconst queryIndex = url.indexOf('?');\n\tif (queryIndex === -1) {\n\t\treturn {};\n\t}\n\tconst queryString = url.slice(queryIndex + 1);\n\treturn qs.parse(queryString) as Record<string, any>;\n}\n","import type { AuditableAction, AuditStorage } from '@geekmidas/audit';\nimport { withRlsContext } from '@geekmidas/db/rls';\nimport type { EnvironmentParser } from '@geekmidas/envkit';\nimport { wrapError } from '@geekmidas/errors';\nimport type { EventPublisher } from '@geekmidas/events';\nimport type { Logger } from '@geekmidas/logger';\nimport { checkRateLimit, getRateLimitHeaders } from '@geekmidas/rate-limit';\nimport {\n\trunWithRequestContext,\n\ttype Service,\n\tServiceDiscovery,\n\ttype ServiceRecord,\n} from '@geekmidas/services';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type Context, Hono } from 'hono';\nimport { setCookie } from 'hono/cookie';\nimport { logger as honoLogger } from 'hono/logger';\nimport { timing } from 'hono/timing';\nimport type { ContentfulStatusCode } from 'hono/utils/http-status';\nimport { validator } from 'hono/validator';\nimport { publishConstructEvents } from '../publisher';\nimport type { HttpMethod, LowerHttpMethod } from '../types';\nimport type { MappedAudit } from './audit';\nimport {\n\tEndpoint,\n\ttype EndpointContext,\n\ttype EndpointSchemas,\n\tResponseBuilder,\n} from './Endpoint';\nimport { getEndpointsFromRoutes } from './helpers';\nimport { createHonoCookies, createHonoHeaders } from './lazyAccessors';\nimport { parseHonoQuery } from './parseHonoQuery';\nimport {\n\tcreateAuditContext,\n\texecuteWithAuditTransaction,\n} from './processAudits';\n\nexport interface HonoEndpointOptions {\n\t/**\n\t * Path where OpenAPI documentation will be served.\n\t * Set to false to disable docs route.\n\t * @default '/docs'\n\t */\n\tdocsPath?: string | false;\n\t/**\n\t * OpenAPI schema options\n\t */\n\topenApiOptions?: {\n\t\ttitle?: string;\n\t\tversion?: string;\n\t\tdescription?: string;\n\t};\n}\n\n/**\n * Feature flags for an endpoint, analyzed once at route registration time.\n * This avoids per-request feature detection overhead.\n */\ninterface EndpointFeatures {\n\thasServices: boolean;\n\thasDatabase: boolean;\n\thasBodyValidation: boolean;\n\thasQueryValidation: boolean;\n\thasParamValidation: boolean;\n\thasAudits: boolean;\n\thasEvents: boolean;\n\thasRateLimit: boolean;\n\thasRls: boolean;\n}\n\n/**\n * Case-insensitive check for a `content-type` header in a metadata headers map.\n */\nfunction hasContentTypeHeader(headers: Record<string, string>): boolean {\n\tfor (const key of Object.keys(headers)) {\n\t\tif (key.toLowerCase() === 'content-type') return true;\n\t}\n\treturn false;\n}\n\n/**\n * Analyze endpoint features at registration time (not per-request)\n */\nfunction analyzeEndpointFeatures(\n\tendpoint: Endpoint<\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany,\n\t\tany\n\t>,\n): EndpointFeatures {\n\treturn {\n\t\thasServices: endpoint.services.length > 0,\n\t\thasDatabase: !!endpoint.databaseService,\n\t\thasBodyValidation: !!endpoint.input?.body,\n\t\thasQueryValidation: !!endpoint.input?.query,\n\t\thasParamValidation: !!endpoint.input?.params,\n\t\t// Audit context needed if declarative audits OR auditor storage service configured (for manual audits)\n\t\thasAudits:\n\t\t\t(endpoint.audits?.length ?? 0) > 0 || !!endpoint.auditorStorageService,\n\t\thasEvents: (endpoint.events?.length ?? 0) > 0,\n\t\thasRateLimit: !!endpoint.rateLimit,\n\t\thasRls: !!endpoint.rlsConfig && !endpoint.rlsBypass,\n\t};\n}\n\nexport class HonoEndpoint<\n\tTRoute extends string,\n\tTMethod extends HttpMethod,\n\tTInput extends EndpointSchemas = {},\n\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\tTServices extends Service[] = [],\n\tTLogger extends Logger = Logger,\n\tTSession = unknown,\n\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\tTEventPublisherServiceName extends string = string,\n\tTAuditStorage extends AuditStorage | undefined = undefined,\n\tTAuditStorageServiceName extends string = string,\n\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\tstring,\n\t\tunknown\n\t>,\n\tTDatabase = undefined,\n\tTDatabaseServiceName extends string = string,\n> {\n\tconstructor(\n\t\tprivate readonly endpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t) {}\n\n\tstatic isDev = process.env.NODE_ENV === 'development';\n\n\tstatic async validate<T extends StandardSchemaV1>(\n\t\tc: Context<any, string, {}>,\n\t\tdata: unknown,\n\t\tschema?: T,\n\t) {\n\t\tif (!schema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsed = await Endpoint.validate(schema, data);\n\n\t\tif (parsed.issues) {\n\t\t\treturn c.json(parsed.issues, 422);\n\t\t}\n\n\t\treturn parsed.value;\n\t}\n\taddRoute(\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>>,\n\t\tapp: Hono,\n\t): void {\n\t\tHonoEndpoint.addRoute(this.endpoint, serviceDiscovery, app);\n\t}\n\n\t/**\n\t * @deprecated Global event middleware is no longer used.\n\t * Events are now published per-route only for endpoints that have events configured.\n\t * This method is kept for backward compatibility but does nothing.\n\t */\n\tstatic applyEventMiddleware(\n\t\t_app: Hono,\n\t\t_serviceDiscovery: ServiceDiscovery<any>,\n\t) {\n\t\t// No-op: Event publishing is now handled per-route in addRoute\n\t\t// This avoids running middleware on every request including 404s\n\t}\n\n\tstatic async fromRoutes<TLogger extends Logger, TServices extends Service[]>(\n\t\troutes: string[],\n\t\tenvParser: EnvironmentParser<{}>,\n\t\tapp = new Hono(),\n\t\t_logger: TLogger,\n\t\tcwd = process.cwd(),\n\t\toptions?: HonoEndpointOptions,\n\t): Promise<Hono> {\n\t\tconst endpoints = await getEndpointsFromRoutes<TServices>(routes, cwd);\n\t\tconst serviceDiscovery =\n\t\t\tServiceDiscovery.getInstance<ServiceRecord<TServices>>(envParser);\n\n\t\tHonoEndpoint.addRoutes(endpoints, serviceDiscovery, app, options);\n\n\t\treturn app;\n\t}\n\n\tstatic addRoutes<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>>,\n\t\tapp: Hono,\n\t\toptions?: HonoEndpointOptions,\n\t): void {\n\t\t// Add timing middleware (always enabled)\n\t\tapp.use('*', timing());\n\n\t\t// Add logger middleware in development mode\n\n\t\tif (HonoEndpoint.isDev) {\n\t\t\tapp.use('*', honoLogger());\n\t\t}\n\n\t\t// Add docs route if not disabled\n\t\tconst docsPath =\n\t\t\toptions?.docsPath !== false ? options?.docsPath || '/docs' : null;\n\t\tif (docsPath) {\n\t\t\tHonoEndpoint.addDocsRoute(\n\t\t\t\tendpoints,\n\t\t\t\tapp,\n\t\t\t\tdocsPath,\n\t\t\t\toptions?.openApiOptions,\n\t\t\t);\n\t\t}\n\n\t\t// Sort endpoints to ensure static routes come before dynamic ones\n\t\tconst sortedEndpoints = endpoints.sort((a, b) => {\n\t\t\tconst aSegments = a.route.split('/');\n\t\t\tconst bSegments = b.route.split('/');\n\n\t\t\t// Compare each segment\n\t\t\tfor (let i = 0; i < Math.max(aSegments.length, bSegments.length); i++) {\n\t\t\t\tconst aSegment = aSegments[i] || '';\n\t\t\t\tconst bSegment = bSegments[i] || '';\n\n\t\t\t\t// If one is dynamic and the other is not, static comes first\n\t\t\t\tconst aIsDynamic = aSegment.startsWith(':');\n\t\t\t\tconst bIsDynamic = bSegment.startsWith(':');\n\n\t\t\t\tif (!aIsDynamic && bIsDynamic) return -1;\n\t\t\t\tif (aIsDynamic && !bIsDynamic) return 1;\n\n\t\t\t\t// If both are the same type, compare alphabetically\n\t\t\t\tif (aSegment !== bSegment) {\n\t\t\t\t\treturn aSegment.localeCompare(bSegment);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t});\n\n\t\t// Note: Global event middleware removed for performance\n\t\t// Events are now published per-route only for endpoints with events configured\n\t\tfor (const endpoint of sortedEndpoints) {\n\t\t\tHonoEndpoint.addRoute(endpoint, serviceDiscovery, app);\n\t\t}\n\t}\n\n\tstatic addRoute<\n\t\tTRoute extends string,\n\t\tTMethod extends HttpMethod,\n\t\tTInput extends EndpointSchemas = {},\n\t\tTOutSchema extends StandardSchemaV1 | undefined = undefined,\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t\tTSession = unknown,\n\t\tTEventPublisher extends EventPublisher<any> | undefined = undefined,\n\t\tTEventPublisherServiceName extends string = string,\n\t\tTAuditStorage extends AuditStorage | undefined = undefined,\n\t\tTAuditStorageServiceName extends string = string,\n\t\tTAuditAction extends AuditableAction<string, unknown> = AuditableAction<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>,\n\t\tTDatabase = undefined,\n\t\tTDatabaseServiceName extends string = string,\n\t>(\n\t\tendpoint: Endpoint<\n\t\t\tTRoute,\n\t\t\tTMethod,\n\t\t\tTInput,\n\t\t\tTOutSchema,\n\t\t\tTServices,\n\t\t\tTLogger,\n\t\t\tTSession,\n\t\t\tTEventPublisher,\n\t\t\tTEventPublisherServiceName,\n\t\t\tTAuditStorage,\n\t\t\tTAuditStorageServiceName,\n\t\t\tTAuditAction,\n\t\t\tTDatabase,\n\t\t\tTDatabaseServiceName\n\t\t>,\n\t\tserviceDiscovery: ServiceDiscovery<ServiceRecord<TServices>>,\n\t\tapp: Hono,\n\t): void {\n\t\tconst { route } = endpoint;\n\t\tconst method = endpoint.method.toLowerCase() as LowerHttpMethod<TMethod>;\n\n\t\t// Analyze endpoint features once at registration time (not per-request)\n\t\tconst features = analyzeEndpointFeatures(endpoint);\n\n\t\t// Build validators array - only add validators for schemas that exist\n\t\tconst validators: any[] = [];\n\n\t\tif (features.hasBodyValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('json', (value, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, value, endpoint.input?.body),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasQueryValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('query', (_, c) => {\n\t\t\t\t\tconst parsedQuery = parseHonoQuery(c);\n\t\t\t\t\treturn HonoEndpoint.validate(c, parsedQuery, endpoint.input?.query);\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\n\t\tif (features.hasParamValidation) {\n\t\t\tvalidators.push(\n\t\t\t\tvalidator('param', (params, c) =>\n\t\t\t\t\tHonoEndpoint.validate(c, params, endpoint.input?.params),\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\n\t\t// Main handler\n\t\tconst handler = async (c: Context) => {\n\t\t\t// Request context setup\n\t\t\tconst startTime = Date.now();\n\t\t\tconst requestId = c.req.header('X-Request-ID') ?? crypto.randomUUID();\n\n\t\t\tconst logger = endpoint.logger.child({\n\t\t\t\trequestId,\n\t\t\t\tendpoint: endpoint.fullPath,\n\t\t\t\troute: endpoint.route,\n\t\t\t\thost: c.req.header('host'),\n\t\t\t\tmethod: endpoint.method,\n\t\t\t\tpath: c.req.path,\n\t\t\t}) as TLogger;\n\n\t\t\t// Set response header\n\t\t\tc.header('X-Request-ID', requestId);\n\n\t\t\t// Wrap entire handler in request context for services to access\n\t\t\treturn runWithRequestContext(\n\t\t\t\t{ logger, requestId, startTime },\n\t\t\t\tasync () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Lazy accessors - no upfront parsing, use native Hono methods\n\t\t\t\t\t\tconst header = createHonoHeaders(c);\n\t\t\t\t\t\tconst cookie = createHonoCookies(c);\n\n\t\t\t\t\t\t// Only register services if endpoint has any\n\t\t\t\t\t\tconst services = features.hasServices\n\t\t\t\t\t\t\t? await serviceDiscovery.register(endpoint.services)\n\t\t\t\t\t\t\t: ({} as ServiceRecord<TServices>);\n\n\t\t\t\t\t\t// Resolve database service only if configured\n\t\t\t\t\t\tconst rawDb = features.hasDatabase\n\t\t\t\t\t\t\t? await serviceDiscovery\n\t\t\t\t\t\t\t\t\t.register([endpoint.databaseService!])\n\t\t\t\t\t\t\t\t\t.then(\n\t\t\t\t\t\t\t\t\t\t(s) =>\n\t\t\t\t\t\t\t\t\t\t\ts[\n\t\t\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName as keyof typeof s\n\t\t\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Extract session (defaults to empty object)\n\t\t\t\t\t\tconst session = await endpoint.getSession({\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t...(rawDb !== undefined && { db: rawDb }),\n\t\t\t\t\t\t} as any);\n\n\t\t\t\t\t\t// Check authorization (defaults to true)\n\t\t\t\t\t\tconst isAuthorized = await endpoint.authorize({\n\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t...(rawDb !== undefined && { db: rawDb }),\n\t\t\t\t\t\t\tbody: features.hasBodyValidation\n\t\t\t\t\t\t\t\t? (c.req.valid as any)('json')\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tquery: features.hasQueryValidation\n\t\t\t\t\t\t\t\t? (c.req.valid as any)('query')\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\tparams: features.hasParamValidation\n\t\t\t\t\t\t\t\t? (c.req.valid as any)('param')\n\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t} as any);\n\n\t\t\t\t\t\tif (!isAuthorized) {\n\t\t\t\t\t\t\tlogger.warn('Unauthorized access attempt');\n\t\t\t\t\t\t\treturn c.json({ error: 'Unauthorized' }, 401);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Check rate limit only if configured\n\t\t\t\t\t\tif (features.hasRateLimit) {\n\t\t\t\t\t\t\tconst rateLimitInfo = await checkRateLimit(endpoint.rateLimit!, {\n\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\tpath: c.req.path,\n\t\t\t\t\t\t\t\tmethod: endpoint.method,\n\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\tconst rateLimitHeaders = getRateLimitHeaders(\n\t\t\t\t\t\t\t\trateLimitInfo,\n\t\t\t\t\t\t\t\tendpoint.rateLimit!,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(rateLimitHeaders)) {\n\t\t\t\t\t\t\t\tif (value) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Create audit context only if audits are configured\n\t\t\t\t\t\tconst auditContext = features.hasAudits\n\t\t\t\t\t\t\t? await createAuditContext(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tservices: services as Record<string, unknown>,\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst audits = features.hasAudits\n\t\t\t\t\t\t\t? (endpoint.audits as MappedAudit<TAuditAction, TOutSchema>[])\n\t\t\t\t\t\t\t: [];\n\n\t\t\t\t\t\t// Warn if declarative audits are configured but no audit storage\n\t\t\t\t\t\tif (features.hasAudits && !auditContext) {\n\t\t\t\t\t\t\tlogger.warn('No auditor storage service available');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Extract RLS context only if configured and not bypassed\n\t\t\t\t\t\tconst rlsContext =\n\t\t\t\t\t\t\tfeatures.hasRls && rawDb !== undefined\n\t\t\t\t\t\t\t\t? await endpoint.rlsConfig?.extractor({\n\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\tsession: session as TSession,\n\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t// Execute handler with automatic audit transaction support\n\t\t\t\t\t\tconst result = await executeWithAuditTransaction(\n\t\t\t\t\t\t\tauditContext,\n\t\t\t\t\t\t\tasync (auditor) => {\n\t\t\t\t\t\t\t\tconst sameDatabase =\n\t\t\t\t\t\t\t\t\tauditContext?.storage?.databaseServiceName &&\n\t\t\t\t\t\t\t\t\tauditContext.storage.databaseServiceName ===\n\t\t\t\t\t\t\t\t\t\tendpoint.databaseService?.serviceName;\n\t\t\t\t\t\t\t\tconst baseDb = sameDatabase\n\t\t\t\t\t\t\t\t\t? (auditor?.getTransaction?.() ?? rawDb)\n\t\t\t\t\t\t\t\t\t: rawDb;\n\n\t\t\t\t\t\t\t\tconst executeHandler = async (db: TDatabase | undefined) => {\n\t\t\t\t\t\t\t\t\tconst responseBuilder = new ResponseBuilder();\n\t\t\t\t\t\t\t\t\tconst response = await endpoint.handler(\n\t\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\t\tservices,\n\t\t\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t\t\t\tbody: features.hasBodyValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('json')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tquery: features.hasQueryValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('query')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tparams: features.hasParamValidation\n\t\t\t\t\t\t\t\t\t\t\t\t? (c.req.valid as any)('param')\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined,\n\t\t\t\t\t\t\t\t\t\t\tsession,\n\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\tcookie,\n\t\t\t\t\t\t\t\t\t\t\tauditor,\n\t\t\t\t\t\t\t\t\t\t\tdb,\n\t\t\t\t\t\t\t\t\t\t} as unknown as EndpointContext<\n\t\t\t\t\t\t\t\t\t\t\tTInput,\n\t\t\t\t\t\t\t\t\t\t\tTServices,\n\t\t\t\t\t\t\t\t\t\t\tTLogger,\n\t\t\t\t\t\t\t\t\t\t\tTSession,\n\t\t\t\t\t\t\t\t\t\t\tTAuditAction,\n\t\t\t\t\t\t\t\t\t\t\tTDatabase,\n\t\t\t\t\t\t\t\t\t\t\tTAuditStorage\n\t\t\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\t\t\tresponseBuilder,\n\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\tlet data = response;\n\t\t\t\t\t\t\t\t\tlet metadata = responseBuilder.getMetadata();\n\n\t\t\t\t\t\t\t\t\tif (Endpoint.hasMetadata(response)) {\n\t\t\t\t\t\t\t\t\t\tdata = response.data;\n\t\t\t\t\t\t\t\t\t\tmetadata = response.metadata;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tconst output = endpoint.outputSchema\n\t\t\t\t\t\t\t\t\t\t? await endpoint.parseOutput(data)\n\t\t\t\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\t\t\t\treturn { output, metadata, responseBuilder };\n\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\tif (features.hasRls && rlsContext && baseDb) {\n\t\t\t\t\t\t\t\t\treturn withRlsContext(\n\t\t\t\t\t\t\t\t\t\tbaseDb as any,\n\t\t\t\t\t\t\t\t\t\trlsContext,\n\t\t\t\t\t\t\t\t\t\tasync (trx) => executeHandler(trx as TDatabase),\n\t\t\t\t\t\t\t\t\t\t{ prefix: endpoint.rlsConfig?.prefix },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\treturn executeHandler(baseDb as TDatabase | undefined);\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tasync (result, auditor) => {\n\t\t\t\t\t\t\t\tif (!audits?.length) return;\n\n\t\t\t\t\t\t\t\tfor (const audit of audits) {\n\t\t\t\t\t\t\t\t\tif (audit.when && !audit.when(result.output as any)) {\n\t\t\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconst payload = audit.payload(result.output as any);\n\t\t\t\t\t\t\t\t\tconst entityId = audit.entityId?.(result.output as any);\n\t\t\t\t\t\t\t\t\tauditor.audit(audit.type as any, payload as any, {\n\t\t\t\t\t\t\t\t\t\ttable: audit.table,\n\t\t\t\t\t\t\t\t\t\tentityId,\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t{ db: rawDb },\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst { output, metadata } = result;\n\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet status = endpoint.status as ContentfulStatusCode;\n\n\t\t\t\t\t\t\tif (metadata.status) {\n\t\t\t\t\t\t\t\tstatus = metadata.status as ContentfulStatusCode;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.headers) {\n\t\t\t\t\t\t\t\tfor (const [key, value] of Object.entries(metadata.headers)) {\n\t\t\t\t\t\t\t\t\tc.header(key, value);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (metadata.cookies) {\n\t\t\t\t\t\t\t\tfor (const [name, { value, options }] of metadata.cookies) {\n\t\t\t\t\t\t\t\t\tsetCookie(c, name, value, options);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Only publish events if configured (no global middleware overhead)\n\t\t\t\t\t\t\tif (features.hasEvents && Endpoint.isSuccessStatus(status)) {\n\t\t\t\t\t\t\t\tawait publishConstructEvents<any, any>(\n\t\t\t\t\t\t\t\t\tendpoint as any,\n\t\t\t\t\t\t\t\t\toutput,\n\t\t\t\t\t\t\t\t\tserviceDiscovery,\n\t\t\t\t\t\t\t\t\tlogger,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info({ status, body: output }, 'Outgoing response');\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// Respect the endpoint's declared responseType. For JSON (default)\n\t\t\t\t\t\t\t// we use c.json() which sets Content-Type and serializes. For any\n\t\t\t\t\t\t\t// other type, emit the body as-is and set the header explicitly —\n\t\t\t\t\t\t\t// metadata.headers (from r.header()) applied above still wins.\n\t\t\t\t\t\t\tif (endpoint.responseType === 'application/json') {\n\t\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\t\treturn c.json(output, status);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t!(metadata.headers && hasContentTypeHeader(metadata.headers))\n\t\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t\tc.header('content-type', endpoint.responseType);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// @ts-expect-error\n\t\t\t\t\t\t\treturn c.body(output as any, status);\n\t\t\t\t\t\t} catch (validationError: any) {\n\t\t\t\t\t\t\tlogger.error(validationError, 'Output validation failed');\n\t\t\t\t\t\t\tconst error = wrapError(\n\t\t\t\t\t\t\t\tvalidationError,\n\t\t\t\t\t\t\t\t422,\n\t\t\t\t\t\t\t\t'Response validation failed',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch (e: any) {\n\t\t\t\t\t\tlogger.error(e, 'Error processing endpoint request');\n\t\t\t\t\t\tconst error = wrapError(e, 500, 'Internal Server Error');\n\t\t\t\t\t\tif (HonoEndpoint.isDev) {\n\t\t\t\t\t\t\tlogger.info(\n\t\t\t\t\t\t\t\t{ status: error.statusCode, body: error },\n\t\t\t\t\t\t\t\t'Outgoing response',\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn c.json(error, error.statusCode as ContentfulStatusCode);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t);\n\t\t};\n\n\t\t// Register route with conditional validators\n\t\tapp[method](route, ...validators, handler);\n\t}\n\n\tstatic addDocsRoute<\n\t\tTServices extends Service[] = [],\n\t\tTLogger extends Logger = Logger,\n\t>(\n\t\tendpoints: Endpoint<string, HttpMethod, any, any, TServices, TLogger>[],\n\t\tapp: Hono,\n\t\tdocsPath: string,\n\t\topenApiOptions?: HonoEndpointOptions['openApiOptions'],\n\t): void {\n\t\tapp.get(docsPath, async (c) => {\n\t\t\ttry {\n\t\t\t\tconst openApiSchema = await Endpoint.buildOpenApiSchema(\n\t\t\t\t\tendpoints,\n\t\t\t\t\topenApiOptions,\n\t\t\t\t);\n\n\t\t\t\treturn c.json(openApiSchema);\n\t\t\t} catch {\n\t\t\t\treturn c.json(\n\t\t\t\t\t{ error: 'Failed to generate OpenAPI documentation' },\n\t\t\t\t\t500,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
@@ -1,10 +1,10 @@
1
1
  const require_Construct = require('../Construct-B14miJ6P.cjs');
2
- const require_lazyAccessors = require('../lazyAccessors-DHvDeww0.cjs');
3
- const require_functions = require('../functions-DiaRAdfp.cjs');
2
+ const require_functions = require('../functions-yrAtvBor.cjs');
3
+ const require_lazyAccessors = require('../lazyAccessors-BzMEdmis.cjs');
4
4
  const require_processAudits = require('../processAudits-CUko08pi.cjs');
5
+ const __geekmidas_errors = require_Construct.__toESM(require("@geekmidas/errors"));
5
6
  const __geekmidas_db_rls = require_Construct.__toESM(require("@geekmidas/db/rls"));
6
7
  const __middy_core = require_Construct.__toESM(require("@middy/core"));
7
- const __geekmidas_errors = require_Construct.__toESM(require("@geekmidas/errors"));
8
8
  const __geekmidas_services = require_Construct.__toESM(require("@geekmidas/services"));
9
9
  const __geekmidas_audit = require_Construct.__toESM(require("@geekmidas/audit"));
10
10
  const qs = require_Construct.__toESM(require("qs"));
@@ -207,13 +207,18 @@ var AmazonApiGatewayEndpoint = class {
207
207
  }
208
208
  }, { db: rawDb });
209
209
  const { output, metadata } = result;
210
- const body = output !== void 0 ? JSON.stringify(output) : void 0;
210
+ const isJsonResponse = this.endpoint.responseType === "application/json";
211
+ const body = output === void 0 ? void 0 : isJsonResponse ? JSON.stringify(output) : typeof output === "string" ? output : String(output);
211
212
  event.__response = output;
212
213
  const lambdaResponse = {
213
214
  statusCode: metadata.status ?? this.endpoint.status,
214
215
  body
215
216
  };
216
- if (metadata.headers && Object.keys(metadata.headers).length > 0) lambdaResponse.headers = { ...metadata.headers };
217
+ const baseHeaders = isJsonResponse ? void 0 : { "content-type": this.endpoint.responseType };
218
+ if (baseHeaders || metadata.headers && Object.keys(metadata.headers).length > 0) lambdaResponse.headers = {
219
+ ...baseHeaders ?? {},
220
+ ...metadata.headers ?? {}
221
+ };
217
222
  if (metadata.cookies && metadata.cookies.size > 0) {
218
223
  const setCookieHeaders = [];
219
224
  for (const [name, { value, options }] of metadata.cookies) setCookieHeaders.push(require_lazyAccessors.Endpoint.formatCookieHeader(name, value, options));