stratal 0.0.21 → 0.0.23
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 +2 -2
- package/dist/bin/cloudflare-workers-loader.mjs +80 -7
- package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
- package/dist/bin/quarry.mjs +84 -160
- package/dist/bin/quarry.mjs.map +1 -1
- package/dist/cache/index.d.mts +8 -46
- package/dist/cache/index.d.mts.map +1 -1
- package/dist/cache/index.mjs +134 -97
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{cache.service-DsnKuNyO.d.mts → cache.service-uElmBtdS.d.mts} +29 -39
- package/dist/cache.service-uElmBtdS.d.mts.map +1 -0
- package/dist/{command-BgSlsS4M.mjs → command-BvmUAPPQ.mjs} +15 -4
- package/dist/command-BvmUAPPQ.mjs.map +1 -0
- package/dist/{command-Cmmf0oHX.d.mts → command-CPhFHjG3.d.mts} +3 -2
- package/dist/command-CPhFHjG3.d.mts.map +1 -0
- package/dist/command-not-found.error-ONAZ2Bpk.mjs +14 -0
- package/dist/command-not-found.error-ONAZ2Bpk.mjs.map +1 -0
- package/dist/config/index.d.mts +24 -11
- package/dist/config/index.d.mts.map +1 -1
- package/dist/config/index.mjs +32 -57
- package/dist/config/index.mjs.map +1 -1
- package/dist/{consumer-registry-B7yUNh0q.d.mts → consumer-registry-D3iMTSdy.d.mts} +54 -22
- package/dist/consumer-registry-D3iMTSdy.d.mts.map +1 -0
- package/dist/container-storage-BmOJ4_Na.mjs +52 -0
- package/dist/container-storage-BmOJ4_Na.mjs.map +1 -0
- package/dist/{controller.decorator-B9vwn0zK.mjs → controller.decorator-C5UVeJS3.mjs} +8 -8
- package/dist/controller.decorator-C5UVeJS3.mjs.map +1 -0
- package/dist/cron/index.d.mts +103 -7
- package/dist/cron/index.d.mts.map +1 -1
- package/dist/cron/index.mjs +2 -2
- package/dist/cron-job-NesZRk8F.d.mts +58 -0
- package/dist/cron-job-NesZRk8F.d.mts.map +1 -0
- package/dist/{cron-manager-DQSK8uoV.mjs → cron.module-Bgzq5hiT.mjs} +47 -17
- package/dist/cron.module-Bgzq5hiT.mjs.map +1 -0
- package/dist/decorate-CuAoSZvs.mjs +16 -0
- package/dist/deep-merge-ByiAOZ3r.mjs +18 -0
- package/dist/deep-merge-ByiAOZ3r.mjs.map +1 -0
- package/dist/di/index.d.mts +2 -2
- package/dist/di/index.mjs +4 -3
- package/dist/di-DseMn-z9.mjs +524 -0
- package/dist/di-DseMn-z9.mjs.map +1 -0
- package/dist/email/index.d.mts +40 -122
- package/dist/email/index.d.mts.map +1 -1
- package/dist/email/index.mjs +446 -131
- package/dist/email/index.mjs.map +1 -1
- package/dist/en-CDZBMcc1.mjs +202 -0
- package/dist/en-CDZBMcc1.mjs.map +1 -0
- package/dist/{env-D1rcZ8_r.d.mts → env-ug22bJj7.d.mts} +1 -1
- package/dist/env-ug22bJj7.d.mts.map +1 -0
- package/dist/errors/index.d.mts +2 -2
- package/dist/errors/index.mjs +4 -2
- package/dist/errors-mXYxG0XB.mjs +333 -0
- package/dist/errors-mXYxG0XB.mjs.map +1 -0
- package/dist/events/index.d.mts +14 -3
- package/dist/events/index.d.mts.map +1 -1
- package/dist/events/index.mjs +2 -2
- package/dist/{events-CzCV8jI8.mjs → events-BXJGZjpG.mjs} +23 -13
- package/dist/events-BXJGZjpG.mjs.map +1 -0
- package/dist/exception-context-kEoMFwze.mjs +429 -0
- package/dist/exception-context-kEoMFwze.mjs.map +1 -0
- package/dist/{gateway-context-CXmXtaUP.mjs → gateway-context-TMu_AlJt.mjs} +38 -31
- package/dist/gateway-context-TMu_AlJt.mjs.map +1 -0
- package/dist/guards/index.d.mts +3 -3
- package/dist/guards/index.d.mts.map +1 -1
- package/dist/guards/index.mjs +1 -1
- package/dist/{guards-DU1_J9YA.mjs → guards-DALPXy3_.mjs} +6 -5
- package/dist/guards-DALPXy3_.mjs.map +1 -0
- package/dist/hono-app-CvV3hOfT.mjs +161 -0
- package/dist/hono-app-CvV3hOfT.mjs.map +1 -0
- package/dist/{http-method.decorator-BrgHMdLQ.mjs → http-method.decorator-ByWZb9DO.mjs} +7 -6
- package/dist/http-method.decorator-ByWZb9DO.mjs.map +1 -0
- package/dist/i18n/index.d.mts +238 -3
- package/dist/i18n/index.d.mts.map +1 -0
- package/dist/i18n/index.mjs +39 -3
- package/dist/i18n/index.mjs.map +1 -0
- package/dist/i18n/messages/en/index.d.mts +2 -2
- package/dist/i18n/messages/en/index.mjs +2 -2
- package/dist/i18n/utils/index.d.mts +4 -26
- package/dist/i18n/utils/index.d.mts.map +1 -1
- package/dist/i18n/utils/index.mjs +2 -2
- package/dist/i18n/validation/index.d.mts +3 -2
- package/dist/i18n/validation/index.mjs +4 -2
- package/dist/i18n.module-DRQAZoSZ.mjs +222 -0
- package/dist/i18n.module-DRQAZoSZ.mjs.map +1 -0
- package/dist/i18n.tokens-CZ_v8oyS.mjs +19 -0
- package/dist/i18n.tokens-CZ_v8oyS.mjs.map +1 -0
- package/dist/{index-7-hU3GTV.d.mts → index-0ItCjaqw.d.mts} +1 -1
- package/dist/index-0ItCjaqw.d.mts.map +1 -0
- package/dist/index-B5JBRcWD.d.mts +544 -0
- package/dist/index-B5JBRcWD.d.mts.map +1 -0
- package/dist/index-BUt92sAE.d.mts +124 -0
- package/dist/index-BUt92sAE.d.mts.map +1 -0
- package/dist/{index-ByOyTmqf.d.mts → index-B_JoEl3V.d.mts} +751 -2229
- package/dist/index-B_JoEl3V.d.mts.map +1 -0
- package/dist/index-DtBNIFuP.d.mts +42 -0
- package/dist/index-DtBNIFuP.d.mts.map +1 -0
- package/dist/{index-C1KvMncZ.d.mts → index-HgOLNruQ.d.mts} +3 -108
- package/dist/index-HgOLNruQ.d.mts.map +1 -0
- package/dist/index.d.mts +6 -43
- package/dist/index.mjs +3 -2
- package/dist/{is-command-C6a7WTPw.mjs → is-command-CEPO9n8c.mjs} +2 -2
- package/dist/{is-command-C6a7WTPw.mjs.map → is-command-CEPO9n8c.mjs.map} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-Gvh_AM71.mjs} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-Gvh_AM71.mjs.map} +1 -1
- package/dist/lazy-module-loader-Ib383jH_.d.mts +60 -0
- package/dist/lazy-module-loader-Ib383jH_.d.mts.map +1 -0
- package/dist/locale-path.service-D-dHiIPc.mjs +165 -0
- package/dist/locale-path.service-D-dHiIPc.mjs.map +1 -0
- package/dist/locale-url-nZrZxqJP.mjs +44 -0
- package/dist/locale-url-nZrZxqJP.mjs.map +1 -0
- package/dist/locale-url.service-C2EWmGdq.mjs +41 -0
- package/dist/locale-url.service-C2EWmGdq.mjs.map +1 -0
- package/dist/logger/index.d.mts +2 -2
- package/dist/logger/index.mjs +170 -2
- package/dist/logger/index.mjs.map +1 -0
- package/dist/macroable/index.d.mts +2 -2
- package/dist/macroable/index.mjs +1 -1
- package/dist/{macroable-BmufBshB.mjs → macroable-cvDTFZ_A.mjs} +1 -1
- package/dist/{macroable-BmufBshB.mjs.map → macroable-cvDTFZ_A.mjs.map} +1 -1
- package/dist/metadata-DzzprcID.mjs +39 -0
- package/dist/metadata-DzzprcID.mjs.map +1 -0
- package/dist/module/index.d.mts +7 -24
- package/dist/module/index.d.mts.map +1 -1
- package/dist/module/index.mjs +10 -2
- package/dist/module/index.mjs.map +1 -0
- package/dist/module-registry-Dm-pqHd3.mjs +554 -0
- package/dist/module-registry-Dm-pqHd3.mjs.map +1 -0
- package/dist/module.decorator-CYHY6pG5.mjs +19 -0
- package/dist/module.decorator-CYHY6pG5.mjs.map +1 -0
- package/dist/openapi/index.d.mts +44 -8
- package/dist/openapi/index.d.mts.map +1 -1
- package/dist/openapi/index.mjs +3 -3
- package/dist/openapi-CstuTM8S.mjs +309 -0
- package/dist/openapi-CstuTM8S.mjs.map +1 -0
- package/dist/{openapi-tools.service-Zs-Ewv7F.mjs → openapi-tools.service-BC5EC3R3.mjs} +8 -2
- package/dist/openapi-tools.service-BC5EC3R3.mjs.map +1 -0
- package/dist/{openapi.service-Bt9bCIrd.d.mts → openapi.service-YhTiJ1bO.d.mts} +3 -3
- package/dist/openapi.service-YhTiJ1bO.d.mts.map +1 -0
- package/dist/quarry/index.d.mts +14 -163
- package/dist/quarry/index.d.mts.map +1 -1
- package/dist/quarry/index.mjs +6 -5
- package/dist/quarry/runner.d.mts +184 -0
- package/dist/quarry/runner.d.mts.map +1 -0
- package/dist/quarry/runner.mjs +945 -0
- package/dist/quarry/runner.mjs.map +1 -0
- package/dist/quarry-registry-CXg0RFXq.d.mts +69 -0
- package/dist/quarry-registry-CXg0RFXq.d.mts.map +1 -0
- package/dist/quarry.module-BuRPGMDm.mjs +312 -0
- package/dist/quarry.module-BuRPGMDm.mjs.map +1 -0
- package/dist/queue/index.d.mts +3 -3
- package/dist/queue/index.mjs +57 -48
- package/dist/queue/index.mjs.map +1 -1
- package/dist/queue.module-nddvxzCB.mjs +613 -0
- package/dist/queue.module-nddvxzCB.mjs.map +1 -0
- package/dist/queue.tokens-DjHnFmre.mjs +11 -0
- package/dist/queue.tokens-DjHnFmre.mjs.map +1 -0
- package/dist/{r2-storage.provider-DuonKeYm.mjs → r2-storage.provider-DCxQt9dD.mjs} +6 -6
- package/dist/r2-storage.provider-DCxQt9dD.mjs.map +1 -0
- package/dist/{rate-limit.decorator-6qzNcSOt.mjs → rate-limit.decorator-BPAie_p3.mjs} +6 -11
- package/dist/rate-limit.decorator-BPAie_p3.mjs.map +1 -0
- package/dist/rate-limiter/index.d.mts +11 -50
- package/dist/rate-limiter/index.d.mts.map +1 -1
- package/dist/rate-limiter/index.mjs +33 -42
- package/dist/rate-limiter/index.mjs.map +1 -1
- package/dist/route-name-DGoBOfPg.mjs +171 -0
- package/dist/route-name-DGoBOfPg.mjs.map +1 -0
- package/dist/route-registration.service-D6vSwiKP.mjs +918 -0
- package/dist/route-registration.service-D6vSwiKP.mjs.map +1 -0
- package/dist/route-registry-CYqLp2Nj.mjs +123 -0
- package/dist/route-registry-CYqLp2Nj.mjs.map +1 -0
- package/dist/router/index.d.mts +2 -2
- package/dist/router/index.mjs +18 -7
- package/dist/router-CWGBD-Bg.mjs +78 -0
- package/dist/router-CWGBD-Bg.mjs.map +1 -0
- package/dist/router-resolver-D4YlPNlm.mjs +88 -0
- package/dist/router-resolver-D4YlPNlm.mjs.map +1 -0
- package/dist/seeder/index.d.mts +16 -11
- package/dist/seeder/index.d.mts.map +1 -1
- package/dist/seeder/index.mjs +5 -3
- package/dist/seeder-7ubkms-Y.mjs +81 -0
- package/dist/seeder-7ubkms-Y.mjs.map +1 -0
- package/dist/seeder-registry-CyUmKsJq.mjs +57 -0
- package/dist/seeder-registry-CyUmKsJq.mjs.map +1 -0
- package/dist/seeder.module-CYYwk3Qk.mjs +15 -0
- package/dist/seeder.module-CYYwk3Qk.mjs.map +1 -0
- package/dist/{signed-url-BQPbv2In.mjs → signed-url-DIU0sK_6.mjs} +1 -1
- package/dist/{signed-url-BQPbv2In.mjs.map → signed-url-DIU0sK_6.mjs.map} +1 -1
- package/dist/storage/index.d.mts +15 -39
- package/dist/storage/index.d.mts.map +1 -1
- package/dist/storage/index.mjs +3 -3
- package/dist/storage/providers/index.d.mts +2 -2
- package/dist/storage/providers/index.d.mts.map +1 -1
- package/dist/storage/providers/index.mjs +1 -1
- package/dist/{storage-D8CBP72Z.mjs → storage-MDZypIE9.mjs} +66 -59
- package/dist/storage-MDZypIE9.mjs.map +1 -0
- package/dist/{storage-provider.interface-Bd6vA4ak.d.mts → storage-provider.interface-ClUwxz4S.d.mts} +2 -3
- package/dist/storage-provider.interface-ClUwxz4S.d.mts.map +1 -0
- package/dist/storage.error-Dnib4VHc.mjs +8 -0
- package/dist/storage.error-Dnib4VHc.mjs.map +1 -0
- package/dist/stratal-DL9M38_s.mjs +383 -0
- package/dist/stratal-DL9M38_s.mjs.map +1 -0
- package/dist/stratal-DwDJPY9N.d.mts +43 -0
- package/dist/stratal-DwDJPY9N.d.mts.map +1 -0
- package/dist/tiered-cache.service-Dv3BhxxE.d.mts +79 -0
- package/dist/tiered-cache.service-Dv3BhxxE.d.mts.map +1 -0
- package/dist/trailing-slash-CFyw8nYu.mjs +34 -0
- package/dist/trailing-slash-CFyw8nYu.mjs.map +1 -0
- package/dist/{types-cySNS_lp.d.mts → types-CmV_9xBD.d.mts} +1 -1
- package/dist/types-CmV_9xBD.d.mts.map +1 -0
- package/dist/uri-h7Q8Jug9.mjs +251 -0
- package/dist/uri-h7Q8Jug9.mjs.map +1 -0
- package/dist/{usage-generator-BUdlhnCK.mjs → usage-generator-DAWYasuP.mjs} +7 -4
- package/dist/usage-generator-DAWYasuP.mjs.map +1 -0
- package/dist/validation-CpOjviyT.mjs +49 -0
- package/dist/validation-CpOjviyT.mjs.map +1 -0
- package/dist/validation.context-CRvmrhq7.mjs +117 -0
- package/dist/validation.context-CRvmrhq7.mjs.map +1 -0
- package/dist/versioning.service-C6aHky8-.mjs +36 -0
- package/dist/versioning.service-C6aHky8-.mjs.map +1 -0
- package/dist/websocket/index.d.mts +16 -14
- package/dist/websocket/index.d.mts.map +1 -1
- package/dist/websocket/index.mjs +2 -2
- package/dist/workers/index.d.mts +2 -2
- package/dist/workers/index.d.mts.map +1 -1
- package/dist/workers/index.mjs +3 -2
- package/dist/workers/index.mjs.map +1 -1
- package/dist/zod-eKqqhZ5_.mjs +72 -0
- package/dist/zod-eKqqhZ5_.mjs.map +1 -0
- package/dist/{index-Bnpfq6uk.d.mts → zod-wecrEVAs.d.mts} +63 -133
- package/dist/zod-wecrEVAs.d.mts.map +1 -0
- package/package.json +28 -39
- package/dist/base-email.provider-CfQCA08m.mjs +0 -42
- package/dist/base-email.provider-CfQCA08m.mjs.map +0 -1
- package/dist/cache.service-DsnKuNyO.d.mts.map +0 -1
- package/dist/cache.tokens-B7Rw1C9Q.mjs +0 -6
- package/dist/cache.tokens-B7Rw1C9Q.mjs.map +0 -1
- package/dist/colors-DJaRDXoS.mjs +0 -16
- package/dist/colors-DJaRDXoS.mjs.map +0 -1
- package/dist/command-BgSlsS4M.mjs.map +0 -1
- package/dist/command-Cmmf0oHX.d.mts.map +0 -1
- package/dist/consumer-registry-B7yUNh0q.d.mts.map +0 -1
- package/dist/controller.decorator-B9vwn0zK.mjs.map +0 -1
- package/dist/cron-manager-CmTimEjf.d.mts +0 -131
- package/dist/cron-manager-CmTimEjf.d.mts.map +0 -1
- package/dist/cron-manager-DQSK8uoV.mjs.map +0 -1
- package/dist/en-DSH_bhh6.mjs +0 -308
- package/dist/en-DSH_bhh6.mjs.map +0 -1
- package/dist/env-D1rcZ8_r.d.mts.map +0 -1
- package/dist/errors-COW9-Mar.mjs +0 -1739
- package/dist/errors-COW9-Mar.mjs.map +0 -1
- package/dist/errors-ORxu1-Bb.mjs +0 -74
- package/dist/errors-ORxu1-Bb.mjs.map +0 -1
- package/dist/events-CzCV8jI8.mjs.map +0 -1
- package/dist/gateway-context-CXmXtaUP.mjs.map +0 -1
- package/dist/guards-DU1_J9YA.mjs.map +0 -1
- package/dist/http-method.decorator-BrgHMdLQ.mjs.map +0 -1
- package/dist/i18n.module-CzXLW9Hy.mjs +0 -2532
- package/dist/i18n.module-CzXLW9Hy.mjs.map +0 -1
- package/dist/index-7-hU3GTV.d.mts.map +0 -1
- package/dist/index-Bnpfq6uk.d.mts.map +0 -1
- package/dist/index-ByOyTmqf.d.mts.map +0 -1
- package/dist/index-C1KvMncZ.d.mts.map +0 -1
- package/dist/index-DBd_2wv8.d.mts +0 -263
- package/dist/index-DBd_2wv8.d.mts.map +0 -1
- package/dist/index-DUzWs0z7.d.mts +0 -494
- package/dist/index-DUzWs0z7.d.mts.map +0 -1
- package/dist/index.d.mts.map +0 -1
- package/dist/logger-DlV7NtvD.mjs +0 -440
- package/dist/logger-DlV7NtvD.mjs.map +0 -1
- package/dist/module-BzLg57FK.mjs +0 -866
- package/dist/module-BzLg57FK.mjs.map +0 -1
- package/dist/openapi-tools.service-Zs-Ewv7F.mjs.map +0 -1
- package/dist/openapi.service-Bt9bCIrd.d.mts.map +0 -1
- package/dist/quarry-registry-BwY2hOxm.mjs +0 -699
- package/dist/quarry-registry-BwY2hOxm.mjs.map +0 -1
- package/dist/queue.module-BhCjZp6H.mjs +0 -409
- package/dist/queue.module-BhCjZp6H.mjs.map +0 -1
- package/dist/r2-storage.provider-DuonKeYm.mjs.map +0 -1
- package/dist/rate-limit.decorator-6qzNcSOt.mjs.map +0 -1
- package/dist/resend.provider-DB4IlFjG.mjs +0 -68
- package/dist/resend.provider-DB4IlFjG.mjs.map +0 -1
- package/dist/seeder-zoEfEw9i.mjs +0 -138
- package/dist/seeder-zoEfEw9i.mjs.map +0 -1
- package/dist/setup-CefZKV_e.mjs +0 -37
- package/dist/setup-CefZKV_e.mjs.map +0 -1
- package/dist/smtp.provider-B6D7zuWX.mjs +0 -76
- package/dist/smtp.provider-B6D7zuWX.mjs.map +0 -1
- package/dist/storage-D8CBP72Z.mjs.map +0 -1
- package/dist/storage-provider.interface-Bd6vA4ak.d.mts.map +0 -1
- package/dist/stratal-CNwpbSZl.mjs +0 -535
- package/dist/stratal-CNwpbSZl.mjs.map +0 -1
- package/dist/types-cySNS_lp.d.mts.map +0 -1
- package/dist/usage-generator-BUdlhnCK.mjs.map +0 -1
- package/dist/validation-DtJwAv7O.mjs +0 -248
- package/dist/validation-DtJwAv7O.mjs.map +0 -1
- /package/dist/{chunk-D1SwGrFN.mjs → chunk-BBjsoOtd.mjs} +0 -0
package/dist/openapi/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as OpenAPIObject, r as PathItemObject } from "../
|
|
3
|
-
import { t as OpenAPIService } from "../openapi.service-
|
|
1
|
+
import { Dn as AsyncModuleOptions, kn as DynamicModule, or as RouterEnv } from "../index-B_JoEl3V.mjs";
|
|
2
|
+
import { n as OpenAPIObject, r as PathItemObject } from "../zod-wecrEVAs.mjs";
|
|
3
|
+
import { t as OpenAPIService } from "../openapi.service-YhTiJ1bO.mjs";
|
|
4
4
|
import { MiddlewareHandler } from "hono/types";
|
|
5
5
|
|
|
6
6
|
//#region src/openapi/types.d.ts
|
|
@@ -71,7 +71,18 @@ interface OpenAPIEffectiveConfig {
|
|
|
71
71
|
ui?: OpenAPIUIOptions | false;
|
|
72
72
|
}
|
|
73
73
|
/**
|
|
74
|
-
*
|
|
74
|
+
* Singleton holder of the static base config. Resolvable outside a request for
|
|
75
|
+
* static config (mount paths, base info) with no per-request state.
|
|
76
|
+
*/
|
|
77
|
+
interface IOpenAPIConfigStore {
|
|
78
|
+
/**
|
|
79
|
+
* Get the static base config (no per-request overrides applied).
|
|
80
|
+
*/
|
|
81
|
+
getBaseConfig(): OpenAPIEffectiveConfig;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Request-scoped config service: reads through to {@link IOpenAPIConfigStore}
|
|
85
|
+
* and layers per-request overrides on top.
|
|
75
86
|
*/
|
|
76
87
|
interface IOpenAPIConfigService {
|
|
77
88
|
/**
|
|
@@ -102,7 +113,13 @@ declare class OpenAPIModule {
|
|
|
102
113
|
* OpenAPI Module DI Tokens
|
|
103
114
|
*/
|
|
104
115
|
declare const OPENAPI_TOKENS: {
|
|
105
|
-
/** Static options provided via forRoot() */readonly Options: symbol;
|
|
116
|
+
/** Static options provided via forRoot() */readonly Options: symbol;
|
|
117
|
+
/**
|
|
118
|
+
* Singleton holder of the static base config. Resolvable outside a request
|
|
119
|
+
* (bootstrap endpoint mounting, CLI commands) for static config — never throws
|
|
120
|
+
* on resolve and carries no per-request state.
|
|
121
|
+
*/
|
|
122
|
+
readonly ConfigStore: symbol; /** Request-scoped config service that layers runtime overrides over the store */
|
|
106
123
|
readonly ConfigService: symbol; /** OpenAPI service that generates specs and serves endpoints */
|
|
107
124
|
readonly OpenAPIService: symbol;
|
|
108
125
|
};
|
|
@@ -131,9 +148,9 @@ declare const OPENAPI_TOKENS: {
|
|
|
131
148
|
* ```
|
|
132
149
|
*/
|
|
133
150
|
declare class OpenAPIConfigService implements IOpenAPIConfigService {
|
|
134
|
-
private
|
|
151
|
+
private store;
|
|
135
152
|
private overrides;
|
|
136
|
-
constructor(
|
|
153
|
+
constructor(store: IOpenAPIConfigStore);
|
|
137
154
|
/**
|
|
138
155
|
* Add configuration override for this request.
|
|
139
156
|
* Overrides are merged in the order they are added.
|
|
@@ -148,6 +165,25 @@ declare class OpenAPIConfigService implements IOpenAPIConfigService {
|
|
|
148
165
|
private mergeConfig;
|
|
149
166
|
}
|
|
150
167
|
//#endregion
|
|
168
|
+
//#region src/openapi/services/openapi-config.store.d.ts
|
|
169
|
+
/**
|
|
170
|
+
* OpenAPI Config Store
|
|
171
|
+
*
|
|
172
|
+
* Singleton holder of the static base configuration (mount paths, base info,
|
|
173
|
+
* security schemes) derived from `OpenAPIModule.forRoot()` options. It carries
|
|
174
|
+
* no per-request state, so it is the thing to resolve when you need OpenAPI
|
|
175
|
+
* config OUTSIDE a request scope — endpoint mounting at bootstrap, the
|
|
176
|
+
* `mcp:serve` CLI command, etc. Resolving it never throws on its own.
|
|
177
|
+
*
|
|
178
|
+
* Per-request overrides live on {@link OpenAPIConfigService}, which reads the
|
|
179
|
+
* base config from here and merges its overrides on top.
|
|
180
|
+
*/
|
|
181
|
+
declare class OpenAPIConfigStore implements IOpenAPIConfigStore {
|
|
182
|
+
private baseOptions?;
|
|
183
|
+
constructor(baseOptions?: OpenAPIModuleOptions | undefined);
|
|
184
|
+
getBaseConfig(): OpenAPIEffectiveConfig;
|
|
185
|
+
}
|
|
186
|
+
//#endregion
|
|
151
187
|
//#region src/openapi/services/openapi-tools.service.d.ts
|
|
152
188
|
type JsonSchema = Record<string, unknown>;
|
|
153
189
|
interface ToolDefinition {
|
|
@@ -198,5 +234,5 @@ declare class OpenApiToolsService {
|
|
|
198
234
|
private getOperation;
|
|
199
235
|
}
|
|
200
236
|
//#endregion
|
|
201
|
-
export { type Dispatcher, type IOpenAPIConfigService, OPENAPI_TOKENS, type OpenAPIConfigOverride, OpenAPIConfigService, type OpenAPIEffectiveConfig, type OpenAPIInfo, OpenAPIModule, type OpenAPIModuleOptions, OpenAPIService, type OpenAPIUIContext, type OpenAPIUIOptions, type OpenAPIUIRenderer, OpenApiToolsService, type RouteFilterFn, type ToolDefinition, type ToolExecutionResult, type ToolFilter };
|
|
237
|
+
export { type Dispatcher, type IOpenAPIConfigService, type IOpenAPIConfigStore, OPENAPI_TOKENS, type OpenAPIConfigOverride, OpenAPIConfigService, OpenAPIConfigStore, type OpenAPIEffectiveConfig, type OpenAPIInfo, OpenAPIModule, type OpenAPIModuleOptions, OpenAPIService, type OpenAPIUIContext, type OpenAPIUIOptions, type OpenAPIUIRenderer, OpenApiToolsService, type RouteFilterFn, type ToolDefinition, type ToolExecutionResult, type ToolFilter };
|
|
202
238
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/openapi/types.ts","../../src/openapi/openapi.module.ts","../../src/openapi/openapi.tokens.ts","../../src/openapi/services/openapi-config.service.ts","../../src/openapi/services/openapi-tools.service.ts"],"mappings":";;;;;;;;;UAOiB,WAAA;EACf,KAAA;EACA,OAAA;EACA,WAAA;AAAA;;;;UAMe,gBAAA;EACf,OAAA;EACA,
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/openapi/types.ts","../../src/openapi/openapi.module.ts","../../src/openapi/openapi.tokens.ts","../../src/openapi/services/openapi-config.service.ts","../../src/openapi/services/openapi-config.store.ts","../../src/openapi/services/openapi-tools.service.ts"],"mappings":"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"}
|
package/dist/openapi/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as
|
|
3
|
-
export { OPENAPI_TOKENS, OpenAPIConfigService, OpenAPIModule, OpenAPIService, OpenApiToolsService };
|
|
1
|
+
import { n as OPENAPI_TOKENS, t as OpenApiToolsService } from "../openapi-tools.service-BC5EC3R3.mjs";
|
|
2
|
+
import { i as OpenAPIConfigService, n as OpenAPIService, r as OpenAPIConfigStore, t as OpenAPIModule } from "../openapi-CstuTM8S.mjs";
|
|
3
|
+
export { OPENAPI_TOKENS, OpenAPIConfigService, OpenAPIConfigStore, OpenAPIModule, OpenAPIService, OpenApiToolsService };
|
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
import { d as inject, o as Request, s as Singleton } from "./di-DseMn-z9.mjs";
|
|
2
|
+
import { n as __decorateParam, t as __decorate } from "./decorate-CuAoSZvs.mjs";
|
|
3
|
+
import { d as SECURITY_SCHEMES, l as ROUTER_CONTEXT_KEYS } from "./exception-context-kEoMFwze.mjs";
|
|
4
|
+
import { n as Module } from "./module.decorator-CYHY6pG5.mjs";
|
|
5
|
+
import "./module/index.mjs";
|
|
6
|
+
import { t as I18N_TOKENS } from "./i18n.tokens-CZ_v8oyS.mjs";
|
|
7
|
+
import { n as OPENAPI_TOKENS } from "./openapi-tools.service-BC5EC3R3.mjs";
|
|
8
|
+
//#region src/openapi/services/openapi-config.service.ts
|
|
9
|
+
let OpenAPIConfigService = class OpenAPIConfigService {
|
|
10
|
+
store;
|
|
11
|
+
overrides = [];
|
|
12
|
+
constructor(store) {
|
|
13
|
+
this.store = store;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Add configuration override for this request.
|
|
17
|
+
* Overrides are merged in the order they are added.
|
|
18
|
+
*/
|
|
19
|
+
override(config) {
|
|
20
|
+
this.overrides.push(config);
|
|
21
|
+
}
|
|
22
|
+
/** Get effective configuration (base merged with all overrides) */
|
|
23
|
+
getEffectiveConfig() {
|
|
24
|
+
let effective = this.store.getBaseConfig();
|
|
25
|
+
for (const override of this.overrides) effective = this.mergeConfig(effective, override);
|
|
26
|
+
return effective;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Merge override into effective config.
|
|
30
|
+
* Info is shallow-merged, routeFilter is replaced.
|
|
31
|
+
*/
|
|
32
|
+
mergeConfig(base, override) {
|
|
33
|
+
return {
|
|
34
|
+
...base,
|
|
35
|
+
info: {
|
|
36
|
+
...base.info,
|
|
37
|
+
...override.info && {
|
|
38
|
+
title: override.info.title ?? base.info.title,
|
|
39
|
+
version: override.info.version ?? base.info.version,
|
|
40
|
+
description: override.info.description ?? base.info.description
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
routeFilter: override.routeFilter ?? base.routeFilter
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
OpenAPIConfigService = __decorate([Request(OPENAPI_TOKENS.ConfigService), __decorateParam(0, inject(OPENAPI_TOKENS.ConfigStore))], OpenAPIConfigService);
|
|
48
|
+
//#endregion
|
|
49
|
+
//#region src/openapi/services/openapi-config.store.ts
|
|
50
|
+
let OpenAPIConfigStore = class OpenAPIConfigStore {
|
|
51
|
+
baseOptions;
|
|
52
|
+
constructor(baseOptions) {
|
|
53
|
+
this.baseOptions = baseOptions;
|
|
54
|
+
}
|
|
55
|
+
getBaseConfig() {
|
|
56
|
+
return {
|
|
57
|
+
jsonPath: this.baseOptions?.jsonPath ?? "/api/openapi.json",
|
|
58
|
+
ui: this.baseOptions?.ui,
|
|
59
|
+
info: {
|
|
60
|
+
title: this.baseOptions?.info?.title ?? "API",
|
|
61
|
+
version: this.baseOptions?.info?.version ?? "1.0.0",
|
|
62
|
+
description: this.baseOptions?.info?.description
|
|
63
|
+
},
|
|
64
|
+
securitySchemes: this.baseOptions?.securitySchemes
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
OpenAPIConfigStore = __decorate([Singleton(OPENAPI_TOKENS.ConfigStore), __decorateParam(0, inject(OPENAPI_TOKENS.Options, { isOptional: true }))], OpenAPIConfigStore);
|
|
69
|
+
//#endregion
|
|
70
|
+
//#region src/openapi/services/openapi.service.ts
|
|
71
|
+
let OpenAPIService = class OpenAPIService {
|
|
72
|
+
/**
|
|
73
|
+
* Generate a filtered OpenAPI spec using the user's config.
|
|
74
|
+
* Usable from both HTTP handlers and CLI commands.
|
|
75
|
+
*/
|
|
76
|
+
getSpec(app, container) {
|
|
77
|
+
const configService = container.resolve(OPENAPI_TOKENS.ConfigService);
|
|
78
|
+
const i18n = container.resolve(I18N_TOKENS.I18nService);
|
|
79
|
+
const config = configService.getEffectiveConfig();
|
|
80
|
+
const fullSpec = app.getOpenAPIDocument({
|
|
81
|
+
openapi: "3.0.0",
|
|
82
|
+
info: {
|
|
83
|
+
version: config.info.version,
|
|
84
|
+
title: config.info.title,
|
|
85
|
+
description: config.info.description
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
fullSpec.components ??= {};
|
|
89
|
+
fullSpec.components.securitySchemes = this.getSecuritySchemeDefinitions(i18n);
|
|
90
|
+
if (config.routeFilter) fullSpec.paths = this.filterRoutes(fullSpec.paths, config);
|
|
91
|
+
if (fullSpec.components.schemas) fullSpec.components.schemas = this.filterSchemas(fullSpec);
|
|
92
|
+
return fullSpec;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Setup OpenAPI documentation endpoints
|
|
96
|
+
*/
|
|
97
|
+
setupEndpoints(app, container) {
|
|
98
|
+
const config = container.resolve(OPENAPI_TOKENS.ConfigStore).getBaseConfig();
|
|
99
|
+
const jsonPath = config.jsonPath;
|
|
100
|
+
const ui = config.ui;
|
|
101
|
+
app.get(jsonPath, (c) => {
|
|
102
|
+
const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER);
|
|
103
|
+
const fullSpec = this.getSpec(app, requestContainer);
|
|
104
|
+
const url = new URL(c.req.raw.url);
|
|
105
|
+
const i18n = requestContainer.resolve(I18N_TOKENS.I18nService);
|
|
106
|
+
fullSpec.servers = [{
|
|
107
|
+
url: `${url.protocol}//${url.host}`,
|
|
108
|
+
description: i18n.t("common.api.serverDescription")
|
|
109
|
+
}];
|
|
110
|
+
return c.json(fullSpec);
|
|
111
|
+
});
|
|
112
|
+
this.nameLastHandler(app, "OpenAPI", "spec");
|
|
113
|
+
if (ui !== false) {
|
|
114
|
+
const uiPath = ui?.path ?? "/api/docs";
|
|
115
|
+
const uiRenderer = ui?.renderer;
|
|
116
|
+
app.get(uiPath, async (c, next) => {
|
|
117
|
+
const effectiveConfig = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER).resolve(OPENAPI_TOKENS.ConfigService).getEffectiveConfig();
|
|
118
|
+
const uiContext = {
|
|
119
|
+
specUrl: effectiveConfig.jsonPath,
|
|
120
|
+
title: effectiveConfig.info.title
|
|
121
|
+
};
|
|
122
|
+
if (uiRenderer) return uiRenderer(uiContext)(c, next);
|
|
123
|
+
const { swaggerUI } = await import("@hono/swagger-ui");
|
|
124
|
+
return swaggerUI({ url: uiContext.specUrl })(c, next);
|
|
125
|
+
});
|
|
126
|
+
this.nameLastHandler(app, "OpenAPI", "docs");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
nameLastHandler(app, controller, method) {
|
|
130
|
+
const last = app.routes[app.routes.length - 1];
|
|
131
|
+
Object.defineProperty(last.handler, "name", { value: `http:${controller}.${method}` });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get localized security scheme definitions
|
|
135
|
+
*/
|
|
136
|
+
getSecuritySchemeDefinitions(i18n) {
|
|
137
|
+
return {
|
|
138
|
+
[SECURITY_SCHEMES.BEARER_AUTH]: {
|
|
139
|
+
type: "http",
|
|
140
|
+
scheme: "bearer",
|
|
141
|
+
bearerFormat: "JWT",
|
|
142
|
+
description: i18n.t("common.api.security.bearerAuth")
|
|
143
|
+
},
|
|
144
|
+
[SECURITY_SCHEMES.API_KEY]: {
|
|
145
|
+
type: "apiKey",
|
|
146
|
+
in: "header",
|
|
147
|
+
name: "X-API-Key",
|
|
148
|
+
description: i18n.t("common.api.security.apiKey")
|
|
149
|
+
},
|
|
150
|
+
[SECURITY_SCHEMES.SESSION_COOKIE]: {
|
|
151
|
+
type: "apiKey",
|
|
152
|
+
in: "cookie",
|
|
153
|
+
name: "session",
|
|
154
|
+
description: i18n.t("common.api.security.sessionCookie")
|
|
155
|
+
}
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Filter OpenAPI paths using custom routeFilter
|
|
160
|
+
*/
|
|
161
|
+
filterRoutes(paths, config) {
|
|
162
|
+
const filteredPaths = {};
|
|
163
|
+
for (const [path, pathItem] of Object.entries(paths)) {
|
|
164
|
+
if (config.routeFilter && !config.routeFilter(path, pathItem)) continue;
|
|
165
|
+
filteredPaths[path] = pathItem;
|
|
166
|
+
}
|
|
167
|
+
return filteredPaths;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Filter unreferenced schemas from OpenAPI spec
|
|
171
|
+
*/
|
|
172
|
+
filterSchemas(spec) {
|
|
173
|
+
const referencedSchemas = /* @__PURE__ */ new Set();
|
|
174
|
+
this.collectSchemaRefs(spec.paths, referencedSchemas);
|
|
175
|
+
const filteredSchemas = {};
|
|
176
|
+
const components = spec.components;
|
|
177
|
+
if (components?.schemas) {
|
|
178
|
+
const allSchemas = components.schemas;
|
|
179
|
+
let prevSize = 0;
|
|
180
|
+
while (referencedSchemas.size > prevSize) {
|
|
181
|
+
prevSize = referencedSchemas.size;
|
|
182
|
+
for (const [schemaName, schemaValue] of Object.entries(allSchemas)) if (referencedSchemas.has(schemaName) && !filteredSchemas[schemaName]) {
|
|
183
|
+
filteredSchemas[schemaName] = schemaValue;
|
|
184
|
+
this.collectSchemaRefs(schemaValue, referencedSchemas);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return filteredSchemas;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Recursively collect all schema references from an object
|
|
192
|
+
*/
|
|
193
|
+
collectSchemaRefs(obj, refs) {
|
|
194
|
+
if (!obj || typeof obj !== "object") return;
|
|
195
|
+
const record = obj;
|
|
196
|
+
if (record.$ref && typeof record.$ref === "string") {
|
|
197
|
+
const match = /^#\/components\/schemas\/(.+)$/.exec(record.$ref);
|
|
198
|
+
if (match) refs.add(match[1]);
|
|
199
|
+
}
|
|
200
|
+
if (Array.isArray(obj)) for (const item of obj) this.collectSchemaRefs(item, refs);
|
|
201
|
+
else for (const value of Object.values(record)) this.collectSchemaRefs(value, refs);
|
|
202
|
+
}
|
|
203
|
+
};
|
|
204
|
+
OpenAPIService = __decorate([Singleton(OPENAPI_TOKENS.OpenAPIService)], OpenAPIService);
|
|
205
|
+
//#endregion
|
|
206
|
+
//#region src/openapi/openapi.module.ts
|
|
207
|
+
/**
|
|
208
|
+
* OpenAPI Module
|
|
209
|
+
*
|
|
210
|
+
* Provides configurable OpenAPI documentation endpoints with runtime override support.
|
|
211
|
+
*
|
|
212
|
+
* Features:
|
|
213
|
+
* - Configurable paths for /openapi.json and /docs
|
|
214
|
+
* - Runtime config overrides via middleware
|
|
215
|
+
* - i18n support for titles and descriptions
|
|
216
|
+
* - Route filtering via hideFromDocs and custom routeFilter
|
|
217
|
+
*
|
|
218
|
+
* @example Basic usage
|
|
219
|
+
* ```typescript
|
|
220
|
+
* @Module({
|
|
221
|
+
* imports: [
|
|
222
|
+
* OpenAPIModule.forRoot({
|
|
223
|
+
* info: { title: 'My API', version: '1.0.0' }
|
|
224
|
+
* })
|
|
225
|
+
* ]
|
|
226
|
+
* })
|
|
227
|
+
* export class AppModule {}
|
|
228
|
+
* ```
|
|
229
|
+
*
|
|
230
|
+
* @example With runtime override in middleware
|
|
231
|
+
* ```typescript
|
|
232
|
+
* // In RouteAccessMiddleware
|
|
233
|
+
* constructor(
|
|
234
|
+
* @inject(OPENAPI_TOKENS.ConfigService) private openAPIConfig: IOpenAPIConfigService
|
|
235
|
+
* ) {}
|
|
236
|
+
*
|
|
237
|
+
* async handle(ctx, next) {
|
|
238
|
+
* this.openAPIConfig.override({
|
|
239
|
+
* info: { title: 'Custom API' },
|
|
240
|
+
* routeFilter: (path) => this.shouldInclude(path)
|
|
241
|
+
* })
|
|
242
|
+
* await next()
|
|
243
|
+
* }
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
var _OpenAPIModule;
|
|
247
|
+
/** Default options when none provided */
|
|
248
|
+
const DEFAULT_OPTIONS = {
|
|
249
|
+
jsonPath: "/api/openapi.json",
|
|
250
|
+
info: {
|
|
251
|
+
title: "API",
|
|
252
|
+
version: "1.0.0"
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
let OpenAPIModule = _OpenAPIModule = class OpenAPIModule {
|
|
256
|
+
/**
|
|
257
|
+
* Configure OpenAPI module with static options
|
|
258
|
+
*
|
|
259
|
+
* @param options - OpenAPI configuration (paths, info, security schemes)
|
|
260
|
+
* @returns DynamicModule with options provider
|
|
261
|
+
*/
|
|
262
|
+
static forRoot(options = {}) {
|
|
263
|
+
const mergedOptions = {
|
|
264
|
+
...DEFAULT_OPTIONS,
|
|
265
|
+
...options,
|
|
266
|
+
info: {
|
|
267
|
+
...DEFAULT_OPTIONS.info,
|
|
268
|
+
...options.info,
|
|
269
|
+
title: options.info?.title ?? DEFAULT_OPTIONS.info?.title ?? "API",
|
|
270
|
+
version: options.info?.version ?? DEFAULT_OPTIONS.info?.version ?? "1.0.0"
|
|
271
|
+
}
|
|
272
|
+
};
|
|
273
|
+
return {
|
|
274
|
+
module: _OpenAPIModule,
|
|
275
|
+
providers: [{
|
|
276
|
+
provide: OPENAPI_TOKENS.Options,
|
|
277
|
+
useValue: mergedOptions
|
|
278
|
+
}]
|
|
279
|
+
};
|
|
280
|
+
}
|
|
281
|
+
static forRootAsync(options) {
|
|
282
|
+
return {
|
|
283
|
+
module: _OpenAPIModule,
|
|
284
|
+
providers: [{
|
|
285
|
+
provide: OPENAPI_TOKENS.Options,
|
|
286
|
+
useFactory: options.useFactory,
|
|
287
|
+
inject: options.inject
|
|
288
|
+
}]
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
};
|
|
292
|
+
OpenAPIModule = _OpenAPIModule = __decorate([Module({ providers: [
|
|
293
|
+
{
|
|
294
|
+
provide: OPENAPI_TOKENS.ConfigStore,
|
|
295
|
+
useClass: OpenAPIConfigStore
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
provide: OPENAPI_TOKENS.ConfigService,
|
|
299
|
+
useClass: OpenAPIConfigService
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
provide: OPENAPI_TOKENS.OpenAPIService,
|
|
303
|
+
useClass: OpenAPIService
|
|
304
|
+
}
|
|
305
|
+
] })], OpenAPIModule);
|
|
306
|
+
//#endregion
|
|
307
|
+
export { OpenAPIConfigService as i, OpenAPIService as n, OpenAPIConfigStore as r, OpenAPIModule as t };
|
|
308
|
+
|
|
309
|
+
//# sourceMappingURL=openapi-CstuTM8S.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-CstuTM8S.mjs","names":[],"sources":["../src/openapi/services/openapi-config.service.ts","../src/openapi/services/openapi-config.store.ts","../src/openapi/services/openapi.service.ts","../src/openapi/openapi.module.ts"],"sourcesContent":["import { inject } from '../../di'\nimport { Request } from '../../di/decorators'\nimport { OPENAPI_TOKENS } from '../openapi.tokens'\nimport type {\n IOpenAPIConfigService,\n IOpenAPIConfigStore,\n OpenAPIConfigOverride,\n OpenAPIEffectiveConfig\n} from '../types'\n\n/**\n * OpenAPI Config Service\n *\n * Request-scoped service that manages OpenAPI configuration for the current request.\n * Supports runtime overrides via middleware while preserving base configuration.\n *\n * @example\n * ```typescript\n * // In middleware (e.g., RouteAccessMiddleware)\n * constructor(\n * @inject(OPENAPI_TOKENS.ConfigService) private openAPIConfig: IOpenAPIConfigService\n * ) {}\n *\n * async handle(ctx, next) {\n * this.openAPIConfig.override({\n * info: { title: 'Custom API' },\n * routeFilter: (path) => shouldInclude(path)\n * })\n * await next()\n * }\n * ```\n */\n@Request(OPENAPI_TOKENS.ConfigService)\nexport class OpenAPIConfigService implements IOpenAPIConfigService {\n private overrides: OpenAPIConfigOverride[] = []\n\n constructor(\n @inject(OPENAPI_TOKENS.ConfigStore) private store: IOpenAPIConfigStore\n ) { }\n\n /**\n * Add configuration override for this request.\n * Overrides are merged in the order they are added.\n */\n override(config: OpenAPIConfigOverride): void {\n this.overrides.push(config)\n }\n\n /** Get effective configuration (base merged with all overrides) */\n getEffectiveConfig(): OpenAPIEffectiveConfig {\n let effective = this.store.getBaseConfig()\n\n for (const override of this.overrides) {\n effective = this.mergeConfig(effective, override)\n }\n\n return effective\n }\n\n /**\n * Merge override into effective config.\n * Info is shallow-merged, routeFilter is replaced.\n */\n private mergeConfig(\n base: OpenAPIEffectiveConfig,\n override: OpenAPIConfigOverride\n ): OpenAPIEffectiveConfig {\n return {\n ...base,\n info: {\n ...base.info,\n ...(override.info && {\n title: override.info.title ?? base.info.title,\n version: override.info.version ?? base.info.version,\n description: override.info.description ?? base.info.description\n })\n },\n routeFilter: override.routeFilter ?? base.routeFilter\n }\n }\n}\n","import { inject } from '../../di'\nimport { Singleton } from '../../di/decorators'\nimport { OPENAPI_TOKENS } from '../openapi.tokens'\nimport type {\n IOpenAPIConfigStore,\n OpenAPIEffectiveConfig,\n OpenAPIModuleOptions\n} from '../types'\n\n/**\n * OpenAPI Config Store\n *\n * Singleton holder of the static base configuration (mount paths, base info,\n * security schemes) derived from `OpenAPIModule.forRoot()` options. It carries\n * no per-request state, so it is the thing to resolve when you need OpenAPI\n * config OUTSIDE a request scope — endpoint mounting at bootstrap, the\n * `mcp:serve` CLI command, etc. Resolving it never throws on its own.\n *\n * Per-request overrides live on {@link OpenAPIConfigService}, which reads the\n * base config from here and merges its overrides on top.\n */\n@Singleton(OPENAPI_TOKENS.ConfigStore)\nexport class OpenAPIConfigStore implements IOpenAPIConfigStore {\n constructor(\n @inject(OPENAPI_TOKENS.Options, { isOptional: true }) private baseOptions?: OpenAPIModuleOptions\n ) { }\n\n getBaseConfig(): OpenAPIEffectiveConfig {\n return {\n jsonPath: this.baseOptions?.jsonPath ?? '/api/openapi.json',\n ui: this.baseOptions?.ui,\n info: {\n title: this.baseOptions?.info?.title ?? 'API',\n version: this.baseOptions?.info?.version ?? '1.0.0',\n description: this.baseOptions?.info?.description\n },\n securitySchemes: this.baseOptions?.securitySchemes\n }\n }\n}\n","import type { Container } from '../../di/container'\nimport { Singleton } from '../../di/decorators'\nimport { I18N_TOKENS } from '../../i18n/i18n.tokens'\nimport type { II18nService } from '../../i18n/i18n.types'\nimport type { OpenAPIHono, OpenAPIObject, PathItemObject } from '../../i18n/validation/zod'\nimport { ROUTER_CONTEXT_KEYS, SECURITY_SCHEMES } from '../../router/constants'\nimport type { RouterEnv } from '../../router/types'\nimport { OPENAPI_TOKENS } from '../openapi.tokens'\nimport type { IOpenAPIConfigService, IOpenAPIConfigStore, OpenAPIEffectiveConfig } from '../types'\n\n/**\n * OpenAPI Service\n *\n * Generates OpenAPI specifications with support for:\n * - Runtime configuration via OpenAPIConfigService\n * - Route filtering via custom routeFilter\n * - i18n support for titles and descriptions\n * - Security scheme definitions\n *\n * Hidden routes (hideFromDocs) are excluded at registration time via\n * @hono/zod-openapi's `hide` option and don't appear in the spec.\n *\n * Configuration is resolved per-request from OpenAPIConfigService,\n * allowing middleware to override config based on domain context.\n */\n@Singleton(OPENAPI_TOKENS.OpenAPIService)\nexport class OpenAPIService {\n\n /**\n * Generate a filtered OpenAPI spec using the user's config.\n * Usable from both HTTP handlers and CLI commands.\n */\n getSpec(app: OpenAPIHono<RouterEnv>, container: Container): OpenAPIObject {\n const configService = container.resolve<IOpenAPIConfigService>(OPENAPI_TOKENS.ConfigService)\n const i18n = container.resolve<II18nService>(I18N_TOKENS.I18nService)\n const config = configService.getEffectiveConfig()\n\n const fullSpec = app.getOpenAPIDocument({\n openapi: '3.0.0',\n info: {\n version: config.info.version,\n title: config.info.title,\n description: config.info.description,\n },\n })\n\n // Security schemes\n fullSpec.components ??= {}\n fullSpec.components.securitySchemes = this.getSecuritySchemeDefinitions(i18n)\n\n // Apply custom routeFilter if provided\n if (config.routeFilter) {\n fullSpec.paths = this.filterRoutes(\n fullSpec.paths as Record<string, PathItemObject>,\n config,\n )\n }\n\n // Filter unreferenced schemas\n if (fullSpec.components.schemas) {\n fullSpec.components.schemas = this.filterSchemas(fullSpec as unknown as Record<string, unknown>) as typeof fullSpec.components.schemas\n }\n\n return fullSpec\n }\n\n /**\n * Setup OpenAPI documentation endpoints\n */\n setupEndpoints(app: OpenAPIHono<RouterEnv>, container: Container): void {\n // Endpoints are mounted at bootstrap (no request scope), so read the static\n // mount paths from the singleton config store — request overrides (info /\n // routeFilter) never affect jsonPath/ui and are resolved per request inside\n // the handlers below via the request-scoped config service.\n const config = container.resolve<IOpenAPIConfigStore>(OPENAPI_TOKENS.ConfigStore).getBaseConfig()\n const jsonPath = config.jsonPath\n const ui = config.ui\n\n // OpenAPI JSON spec endpoint\n app.get(jsonPath, (c) => {\n const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER)\n const fullSpec = this.getSpec(app, requestContainer)\n\n // Add servers (HTTP-specific — needs request URL context)\n const url = new URL(c.req.raw.url)\n const i18n = requestContainer.resolve<II18nService>(I18N_TOKENS.I18nService)\n fullSpec.servers = [{\n url: `${url.protocol}//${url.host}`,\n description: i18n.t('common.api.serverDescription'),\n }]\n\n return c.json(fullSpec)\n })\n this.nameLastHandler(app, 'OpenAPI', 'spec')\n\n // Docs UI endpoint\n if (ui !== false) {\n const uiPath = ui?.path ?? '/api/docs'\n const uiRenderer = ui?.renderer\n\n app.get(uiPath, async (c, next) => {\n const requestContainer = c.get(ROUTER_CONTEXT_KEYS.REQUEST_CONTAINER)\n const requestConfigService = requestContainer.resolve<IOpenAPIConfigService>(\n OPENAPI_TOKENS.ConfigService\n )\n const effectiveConfig = requestConfigService.getEffectiveConfig()\n const uiContext = { specUrl: effectiveConfig.jsonPath, title: effectiveConfig.info.title }\n\n if (uiRenderer) {\n return uiRenderer(uiContext)(c, next)\n }\n\n const { swaggerUI } = await import('@hono/swagger-ui')\n return swaggerUI<RouterEnv>({ url: uiContext.specUrl })(c, next)\n })\n this.nameLastHandler(app, 'OpenAPI', 'docs')\n }\n }\n\n private nameLastHandler(app: OpenAPIHono<RouterEnv>, controller: string, method: string): void {\n const last = app.routes[app.routes.length - 1]\n Object.defineProperty(last.handler, 'name', { value: `http:${controller}.${method}` })\n }\n\n /**\n * Get localized security scheme definitions\n */\n private getSecuritySchemeDefinitions(i18n: II18nService) {\n return {\n [SECURITY_SCHEMES.BEARER_AUTH]: {\n type: 'http',\n scheme: 'bearer',\n bearerFormat: 'JWT',\n description: i18n.t('common.api.security.bearerAuth')\n },\n [SECURITY_SCHEMES.API_KEY]: {\n type: 'apiKey',\n in: 'header',\n name: 'X-API-Key',\n description: i18n.t('common.api.security.apiKey')\n },\n [SECURITY_SCHEMES.SESSION_COOKIE]: {\n type: 'apiKey',\n in: 'cookie',\n name: 'session',\n description: i18n.t('common.api.security.sessionCookie')\n }\n } as const\n }\n\n /**\n * Filter OpenAPI paths using custom routeFilter\n */\n private filterRoutes(\n paths: Record<string, PathItemObject>,\n config: OpenAPIEffectiveConfig\n ): Record<string, PathItemObject> {\n const filteredPaths: Record<string, PathItemObject> = {}\n\n for (const [path, pathItem] of Object.entries(paths)) {\n if (config.routeFilter && !config.routeFilter(path, pathItem)) {\n continue\n }\n\n filteredPaths[path] = pathItem\n }\n\n return filteredPaths\n }\n\n /**\n * Filter unreferenced schemas from OpenAPI spec\n */\n private filterSchemas(spec: Record<string, unknown>): Record<string, unknown> {\n const referencedSchemas = new Set<string>()\n\n // Collect all schema references from paths\n this.collectSchemaRefs(spec.paths, referencedSchemas)\n\n // Filter schemas to only include referenced ones\n const filteredSchemas: Record<string, unknown> = {}\n const components = spec.components as Record<string, unknown> | undefined\n if (components?.schemas) {\n const allSchemas = components.schemas as Record<string, unknown>\n let prevSize = 0\n while (referencedSchemas.size > prevSize) {\n prevSize = referencedSchemas.size\n for (const [schemaName, schemaValue] of Object.entries(allSchemas)) {\n if (referencedSchemas.has(schemaName) && !filteredSchemas[schemaName]) {\n filteredSchemas[schemaName] = schemaValue\n this.collectSchemaRefs(schemaValue, referencedSchemas)\n }\n }\n }\n }\n\n return filteredSchemas\n }\n\n /**\n * Recursively collect all schema references from an object\n */\n private collectSchemaRefs(obj: unknown, refs: Set<string>): void {\n if (!obj || typeof obj !== 'object') {\n return\n }\n\n const record = obj as Record<string, unknown>\n\n // Check if this object has a $ref property\n if (record.$ref && typeof record.$ref === 'string') {\n // Extract schema name from $ref (format: #/components/schemas/SchemaName)\n const match = /^#\\/components\\/schemas\\/(.+)$/.exec(record.$ref)\n if (match) {\n refs.add(match[1])\n }\n }\n\n // Recursively check all properties\n if (Array.isArray(obj)) {\n for (const item of obj) {\n this.collectSchemaRefs(item, refs)\n }\n } else {\n for (const value of Object.values(record)) {\n this.collectSchemaRefs(value, refs)\n }\n }\n }\n}\n","/**\n * OpenAPI Module\n *\n * Provides configurable OpenAPI documentation endpoints with runtime override support.\n *\n * Features:\n * - Configurable paths for /openapi.json and /docs\n * - Runtime config overrides via middleware\n * - i18n support for titles and descriptions\n * - Route filtering via hideFromDocs and custom routeFilter\n *\n * @example Basic usage\n * ```typescript\n * @Module({\n * imports: [\n * OpenAPIModule.forRoot({\n * info: { title: 'My API', version: '1.0.0' }\n * })\n * ]\n * })\n * export class AppModule {}\n * ```\n *\n * @example With runtime override in middleware\n * ```typescript\n * // In RouteAccessMiddleware\n * constructor(\n * @inject(OPENAPI_TOKENS.ConfigService) private openAPIConfig: IOpenAPIConfigService\n * ) {}\n *\n * async handle(ctx, next) {\n * this.openAPIConfig.override({\n * info: { title: 'Custom API' },\n * routeFilter: (path) => this.shouldInclude(path)\n * })\n * await next()\n * }\n * ```\n */\n\nimport { Module } from '../module'\nimport type { AsyncModuleOptions, DynamicModule } from '../module/types'\nimport { OPENAPI_TOKENS } from './openapi.tokens'\nimport { OpenAPIConfigService, OpenAPIConfigStore, OpenAPIService } from './services'\nimport type { OpenAPIModuleOptions } from './types'\n\n/** Default options when none provided */\nconst DEFAULT_OPTIONS: OpenAPIModuleOptions = {\n jsonPath: '/api/openapi.json',\n info: {\n title: 'API',\n version: '1.0.0'\n }\n}\n\n@Module({\n providers: [\n // Static base config (singleton — resolvable outside a request scope)\n { provide: OPENAPI_TOKENS.ConfigStore, useClass: OpenAPIConfigStore },\n // OpenAPI config service (request-scoped, supports runtime overrides)\n { provide: OPENAPI_TOKENS.ConfigService, useClass: OpenAPIConfigService },\n // OpenAPI service (singleton — serves spec and docs endpoints)\n { provide: OPENAPI_TOKENS.OpenAPIService, useClass: OpenAPIService },\n ],\n})\nexport class OpenAPIModule {\n /**\n * Configure OpenAPI module with static options\n *\n * @param options - OpenAPI configuration (paths, info, security schemes)\n * @returns DynamicModule with options provider\n */\n static forRoot(options: OpenAPIModuleOptions = {}): DynamicModule {\n // Merge with defaults\n const mergedOptions: OpenAPIModuleOptions = {\n ...DEFAULT_OPTIONS,\n ...options,\n info: {\n ...DEFAULT_OPTIONS.info,\n ...options.info,\n title: options.info?.title ?? DEFAULT_OPTIONS.info?.title ?? 'API',\n version: options.info?.version ?? DEFAULT_OPTIONS.info?.version ?? '1.0.0',\n }\n }\n\n return {\n module: OpenAPIModule,\n providers: [\n { provide: OPENAPI_TOKENS.Options, useValue: mergedOptions }\n ]\n }\n }\n\n static forRootAsync(options: AsyncModuleOptions<OpenAPIModuleOptions>): DynamicModule {\n return {\n module: OpenAPIModule,\n providers: [\n {\n provide: OPENAPI_TOKENS.Options,\n useFactory: options.useFactory,\n inject: options.inject\n },\n ]\n }\n }\n}\n"],"mappings":";;;;;;;;AAiCO,IAAA,uBAAA,MAAM,qBAAsD;CAInB;CAH9C,YAA6C,CAAC;CAE9C,YACE,OACA;EAD4C,KAAA,QAAA;CAC1C;;;;;CAMJ,SAAS,QAAqC;EAC5C,KAAK,UAAU,KAAK,MAAM;CAC5B;;CAGA,qBAA6C;EAC3C,IAAI,YAAY,KAAK,MAAM,cAAc;EAEzC,KAAK,MAAM,YAAY,KAAK,WAC1B,YAAY,KAAK,YAAY,WAAW,QAAQ;EAGlD,OAAO;CACT;;;;;CAMA,YACE,MACA,UACwB;EACxB,OAAO;GACL,GAAG;GACH,MAAM;IACJ,GAAG,KAAK;IACR,GAAI,SAAS,QAAQ;KACnB,OAAO,SAAS,KAAK,SAAS,KAAK,KAAK;KACxC,SAAS,SAAS,KAAK,WAAW,KAAK,KAAK;KAC5C,aAAa,SAAS,KAAK,eAAe,KAAK,KAAK;IACtD;GACF;GACA,aAAa,SAAS,eAAe,KAAK;EAC5C;CACF;AACF;mCAhDC,QAAQ,eAAe,aAAa,GAAA,gBAAA,GAKhC,OAAO,eAAe,WAAW,CAAA,CAAA,GAAA,oBAAA;;;ACf/B,IAAA,qBAAA,MAAM,mBAAkD;CAEG;CADhE,YACE,aACA;EAD8D,KAAA,cAAA;CAC5D;CAEJ,gBAAwC;EACtC,OAAO;GACL,UAAU,KAAK,aAAa,YAAY;GACxC,IAAI,KAAK,aAAa;GACtB,MAAM;IACJ,OAAO,KAAK,aAAa,MAAM,SAAS;IACxC,SAAS,KAAK,aAAa,MAAM,WAAW;IAC5C,aAAa,KAAK,aAAa,MAAM;GACvC;GACA,iBAAiB,KAAK,aAAa;EACrC;CACF;AACF;iCAlBC,UAAU,eAAe,WAAW,GAAA,gBAAA,GAGhC,OAAO,eAAe,SAAS,EAAE,YAAY,KAAK,CAAC,CAAA,CAAA,GAAA,kBAAA;;;ACEjD,IAAA,iBAAA,MAAM,eAAe;;;;;CAM1B,QAAQ,KAA6B,WAAqC;EACxE,MAAM,gBAAgB,UAAU,QAA+B,eAAe,aAAa;EAC3F,MAAM,OAAO,UAAU,QAAsB,YAAY,WAAW;EACpE,MAAM,SAAS,cAAc,mBAAmB;EAEhD,MAAM,WAAW,IAAI,mBAAmB;GACtC,SAAS;GACT,MAAM;IACJ,SAAS,OAAO,KAAK;IACrB,OAAO,OAAO,KAAK;IACnB,aAAa,OAAO,KAAK;GAC3B;EACF,CAAC;EAGD,SAAS,eAAe,CAAC;EACzB,SAAS,WAAW,kBAAkB,KAAK,6BAA6B,IAAI;EAG5E,IAAI,OAAO,aACT,SAAS,QAAQ,KAAK,aACpB,SAAS,OACT,MACF;EAIF,IAAI,SAAS,WAAW,SACtB,SAAS,WAAW,UAAU,KAAK,cAAc,QAA8C;EAGjG,OAAO;CACT;;;;CAKA,eAAe,KAA6B,WAA4B;EAKtE,MAAM,SAAS,UAAU,QAA6B,eAAe,WAAW,EAAE,cAAc;EAChG,MAAM,WAAW,OAAO;EACxB,MAAM,KAAK,OAAO;EAGlB,IAAI,IAAI,WAAW,MAAM;GACvB,MAAM,mBAAmB,EAAE,IAAI,oBAAoB,iBAAiB;GACpE,MAAM,WAAW,KAAK,QAAQ,KAAK,gBAAgB;GAGnD,MAAM,MAAM,IAAI,IAAI,EAAE,IAAI,IAAI,GAAG;GACjC,MAAM,OAAO,iBAAiB,QAAsB,YAAY,WAAW;GAC3E,SAAS,UAAU,CAAC;IAClB,KAAK,GAAG,IAAI,SAAS,IAAI,IAAI;IAC7B,aAAa,KAAK,EAAE,8BAA8B;GACpD,CAAC;GAED,OAAO,EAAE,KAAK,QAAQ;EACxB,CAAC;EACD,KAAK,gBAAgB,KAAK,WAAW,MAAM;EAG3C,IAAI,OAAO,OAAO;GAChB,MAAM,SAAS,IAAI,QAAQ;GAC3B,MAAM,aAAa,IAAI;GAEvB,IAAI,IAAI,QAAQ,OAAO,GAAG,SAAS;IAKjC,MAAM,kBAJmB,EAAE,IAAI,oBAAoB,iBACP,EAAE,QAC5C,eAAe,aAE0B,EAAE,mBAAmB;IAChE,MAAM,YAAY;KAAE,SAAS,gBAAgB;KAAU,OAAO,gBAAgB,KAAK;IAAM;IAEzF,IAAI,YACF,OAAO,WAAW,SAAS,EAAE,GAAG,IAAI;IAGtC,MAAM,EAAE,cAAc,MAAM,OAAO;IACnC,OAAO,UAAqB,EAAE,KAAK,UAAU,QAAQ,CAAC,EAAE,GAAG,IAAI;GACjE,CAAC;GACD,KAAK,gBAAgB,KAAK,WAAW,MAAM;EAC7C;CACF;CAEA,gBAAwB,KAA6B,YAAoB,QAAsB;EAC7F,MAAM,OAAO,IAAI,OAAO,IAAI,OAAO,SAAS;EAC5C,OAAO,eAAe,KAAK,SAAS,QAAQ,EAAE,OAAO,QAAQ,WAAW,GAAG,SAAS,CAAC;CACvF;;;;CAKA,6BAAqC,MAAoB;EACvD,OAAO;IACJ,iBAAiB,cAAc;IAC9B,MAAM;IACN,QAAQ;IACR,cAAc;IACd,aAAa,KAAK,EAAE,gCAAgC;GACtD;IACC,iBAAiB,UAAU;IAC1B,MAAM;IACN,IAAI;IACJ,MAAM;IACN,aAAa,KAAK,EAAE,4BAA4B;GAClD;IACC,iBAAiB,iBAAiB;IACjC,MAAM;IACN,IAAI;IACJ,MAAM;IACN,aAAa,KAAK,EAAE,mCAAmC;GACzD;EACF;CACF;;;;CAKA,aACE,OACA,QACgC;EAChC,MAAM,gBAAgD,CAAC;EAEvD,KAAK,MAAM,CAAC,MAAM,aAAa,OAAO,QAAQ,KAAK,GAAG;GACpD,IAAI,OAAO,eAAe,CAAC,OAAO,YAAY,MAAM,QAAQ,GAC1D;GAGF,cAAc,QAAQ;EACxB;EAEA,OAAO;CACT;;;;CAKA,cAAsB,MAAwD;EAC5E,MAAM,oCAAoB,IAAI,IAAY;EAG1C,KAAK,kBAAkB,KAAK,OAAO,iBAAiB;EAGpD,MAAM,kBAA2C,CAAC;EAClD,MAAM,aAAa,KAAK;EACxB,IAAI,YAAY,SAAS;GACvB,MAAM,aAAa,WAAW;GAC9B,IAAI,WAAW;GACf,OAAO,kBAAkB,OAAO,UAAU;IACxC,WAAW,kBAAkB;IAC7B,KAAK,MAAM,CAAC,YAAY,gBAAgB,OAAO,QAAQ,UAAU,GAC/D,IAAI,kBAAkB,IAAI,UAAU,KAAK,CAAC,gBAAgB,aAAa;KACrE,gBAAgB,cAAc;KAC9B,KAAK,kBAAkB,aAAa,iBAAiB;IACvD;GAEJ;EACF;EAEA,OAAO;CACT;;;;CAKA,kBAA0B,KAAc,MAAyB;EAC/D,IAAI,CAAC,OAAO,OAAO,QAAQ,UACzB;EAGF,MAAM,SAAS;EAGf,IAAI,OAAO,QAAQ,OAAO,OAAO,SAAS,UAAU;GAElD,MAAM,QAAQ,iCAAiC,KAAK,OAAO,IAAI;GAC/D,IAAI,OACF,KAAK,IAAI,MAAM,EAAE;EAErB;EAGA,IAAI,MAAM,QAAQ,GAAG,GACnB,KAAK,MAAM,QAAQ,KACjB,KAAK,kBAAkB,MAAM,IAAI;OAGnC,KAAK,MAAM,SAAS,OAAO,OAAO,MAAM,GACtC,KAAK,kBAAkB,OAAO,IAAI;CAGxC;AACF;6BA5MC,UAAU,eAAe,cAAc,CAAA,GAAA,cAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACsBxC,MAAM,kBAAwC;CAC5C,UAAU;CACV,MAAM;EACJ,OAAO;EACP,SAAS;CACX;AACF;AAYO,IAAA,gBAAA,iBAAA,MAAM,cAAc;;;;;;;CAOzB,OAAO,QAAQ,UAAgC,CAAC,GAAkB;EAEhE,MAAM,gBAAsC;GAC1C,GAAG;GACH,GAAG;GACH,MAAM;IACJ,GAAG,gBAAgB;IACnB,GAAG,QAAQ;IACX,OAAO,QAAQ,MAAM,SAAS,gBAAgB,MAAM,SAAS;IAC7D,SAAS,QAAQ,MAAM,WAAW,gBAAgB,MAAM,WAAW;GACrE;EACF;EAEA,OAAO;GACL,QAAA;GACA,WAAW,CACT;IAAE,SAAS,eAAe;IAAS,UAAU;GAAc,CAC7D;EACF;CACF;CAEA,OAAO,aAAa,SAAkE;EACpF,OAAO;GACL,QAAA;GACA,WAAW,CACT;IACE,SAAS,eAAe;IACxB,YAAY,QAAQ;IACpB,QAAQ,QAAQ;GAClB,CACF;EACF;CACF;AACF;6CAlDC,OAAO,EACN,WAAW;CAET;EAAE,SAAS,eAAe;EAAa,UAAU;CAAmB;CAEpE;EAAE,SAAS,eAAe;EAAe,UAAU;CAAqB;CAExE;EAAE,SAAS,eAAe;EAAgB,UAAU;CAAe;AACrE,EACF,CAAC,CAAA,GAAA,aAAA"}
|
|
@@ -5,7 +5,13 @@
|
|
|
5
5
|
const OPENAPI_TOKENS = {
|
|
6
6
|
/** Static options provided via forRoot() */
|
|
7
7
|
Options: Symbol.for("stratal:openapi:options"),
|
|
8
|
-
/**
|
|
8
|
+
/**
|
|
9
|
+
* Singleton holder of the static base config. Resolvable outside a request
|
|
10
|
+
* (bootstrap endpoint mounting, CLI commands) for static config — never throws
|
|
11
|
+
* on resolve and carries no per-request state.
|
|
12
|
+
*/
|
|
13
|
+
ConfigStore: Symbol.for("stratal:openapi:config:store"),
|
|
14
|
+
/** Request-scoped config service that layers runtime overrides over the store */
|
|
9
15
|
ConfigService: Symbol.for("stratal:openapi:config:service"),
|
|
10
16
|
/** OpenAPI service that generates specs and serves endpoints */
|
|
11
17
|
OpenAPIService: Symbol.for("stratal:openapi:service")
|
|
@@ -197,4 +203,4 @@ var OpenApiToolsService = class OpenApiToolsService {
|
|
|
197
203
|
//#endregion
|
|
198
204
|
export { OPENAPI_TOKENS as n, OpenApiToolsService as t };
|
|
199
205
|
|
|
200
|
-
//# sourceMappingURL=openapi-tools.service-
|
|
206
|
+
//# sourceMappingURL=openapi-tools.service-BC5EC3R3.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi-tools.service-BC5EC3R3.mjs","names":[],"sources":["../src/openapi/openapi.tokens.ts","../src/openapi/services/openapi-tools.service.ts"],"sourcesContent":["/**\n * OpenAPI Module DI Tokens\n */\nexport const OPENAPI_TOKENS = {\n /** Static options provided via forRoot() */\n Options: Symbol.for('stratal:openapi:options'),\n\n /**\n * Singleton holder of the static base config. Resolvable outside a request\n * (bootstrap endpoint mounting, CLI commands) for static config — never throws\n * on resolve and carries no per-request state.\n */\n ConfigStore: Symbol.for('stratal:openapi:config:store'),\n\n /** Request-scoped config service that layers runtime overrides over the store */\n ConfigService: Symbol.for('stratal:openapi:config:service'),\n\n /** OpenAPI service that generates specs and serves endpoints */\n OpenAPIService: Symbol.for('stratal:openapi:service'),\n} as const\n","import type { OpenAPIObject } from '../../i18n/validation/zod'\nimport type { HttpMethod } from '../../router/types'\n\ntype JsonSchema = Record<string, unknown>\n\nexport interface ToolDefinition {\n name: string\n description: string\n inputSchema: JsonSchema\n method: string\n path: string\n pathParams: string[]\n}\n\nexport interface ToolExecutionResult {\n status: number\n body: string\n headers: Record<string, string>\n}\n\nexport interface ToolFilter {\n tags?: string[]\n pathPrefix?: string\n}\n\nexport type Dispatcher = (method: string, url: string, options?: {\n body?: unknown\n headers?: Record<string, string>\n}) => Promise<Response>\n\ninterface OperationObject {\n operationId?: string\n summary?: string\n description?: string\n tags?: string[]\n parameters?: ParameterObject[]\n requestBody?: RequestBodyObject\n}\n\ninterface ParameterObject {\n name: string\n in: string\n required?: boolean\n schema?: JsonSchema\n description?: string\n}\n\ninterface RequestBodyObject {\n required?: boolean\n content?: Record<string, { schema?: JsonSchema }>\n}\n\n/**\n * Converts an OpenAPI 3.0 spec into callable tool definitions.\n *\n * Plain class (no DI) — reusable across MCP, CLI, and custom tooling.\n */\nexport class OpenApiToolsService {\n private static readonly HTTP_METHODS: Set<string> = new Set<HttpMethod>(['get', 'post', 'put', 'delete', 'patch', 'head', 'options', 'trace'])\n\n private tools: ToolDefinition[] = []\n private toolMap = new Map<string, ToolDefinition>()\n private dispatcher?: Dispatcher\n\n private spec: OpenAPIObject\n\n constructor(spec: OpenAPIObject, options?: { dispatcher?: Dispatcher }) {\n this.spec = spec\n this.dispatcher = options?.dispatcher\n this.tools = this.buildTools()\n for (const tool of this.tools) {\n this.toolMap.set(tool.name, tool)\n }\n }\n\n getTools(filter?: ToolFilter): ToolDefinition[] {\n let tools = this.tools\n\n if (filter?.tags?.length) {\n const tagSet = new Set(filter.tags)\n tools = tools.filter((t) => {\n const op = this.getOperation(t.method, t.path)\n return op?.tags?.some((tag) => tagSet.has(tag)) ?? false\n })\n }\n\n if (filter?.pathPrefix) {\n const prefix = filter.pathPrefix\n tools = tools.filter((t) => t.path.startsWith(prefix))\n }\n\n return tools\n }\n\n getTool(name: string): ToolDefinition | undefined {\n return this.toolMap.get(name)\n }\n\n async executeTool(name: string, args: Record<string, unknown>): Promise<ToolExecutionResult> {\n const tool = this.toolMap.get(name)\n if (!tool) {\n throw new Error(`Tool not found: ${name}`)\n }\n if (!this.dispatcher) {\n throw new Error('No dispatcher configured')\n }\n\n // Interpolate path params\n let url = tool.path\n for (const param of tool.pathParams) {\n const value = args[`path_${param}`]\n if (value === undefined) {\n throw new Error(`Missing required path parameter: ${param}`)\n }\n url = url.replace(`{${param}}`, encodeURIComponent(value != null && typeof value === 'object' ? JSON.stringify(value) : String(value as string | number | boolean)))\n }\n\n // Collect query params\n const queryParts: string[] = []\n for (const key of Object.keys(args)) {\n if (key.startsWith('query_')) {\n const paramName = key.slice(6)\n const value = args[key]\n queryParts.push(`${encodeURIComponent(paramName)}=${encodeURIComponent(value != null && typeof value === 'object' ? JSON.stringify(value) : String(value as string | number | boolean))}`)\n }\n }\n if (queryParts.length > 0) {\n url += `?${queryParts.join('&')}`\n }\n\n const body = args.body\n const response = await this.dispatcher(\n tool.method.toUpperCase(),\n url,\n body !== undefined ? { body } : undefined,\n )\n\n const responseHeaders: Record<string, string> = {}\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value\n })\n\n return {\n status: response.status,\n body: await response.text(),\n headers: responseHeaders,\n }\n }\n\n private buildTools(): ToolDefinition[] {\n const tools: ToolDefinition[] = []\n const paths = this.spec.paths\n\n for (const [path, pathItem] of Object.entries(paths)) {\n for (const [method, operation] of Object.entries(pathItem)) {\n if (!operation || typeof operation !== 'object') continue\n if (!OpenApiToolsService.HTTP_METHODS.has(method.toLowerCase())) continue\n\n const op = operation as OperationObject\n const name = op.operationId ?? this.generateName(method, path)\n const description = this.buildDescription(op, method, path)\n const pathItemParams = (pathItem as Record<string, unknown>).parameters as ParameterObject[] | undefined\n const mergedParameters = this.mergeParameters(pathItemParams, op.parameters)\n const { schema, pathParams } = this.buildInputSchema({ ...op, parameters: mergedParameters })\n\n tools.push({ name, description, inputSchema: schema, method: method.toUpperCase(), path, pathParams })\n }\n }\n\n return tools\n }\n\n private generateName(method: string, path: string): string {\n const snake = path\n .replace(/[{}]/g, '')\n .replace(/[^a-zA-Z0-9]+/g, '_')\n .replace(/^_|_$/g, '')\n .toLowerCase()\n return `${method.toLowerCase()}_${snake}`\n }\n\n private buildDescription(op: OperationObject, method: string, path: string): string {\n if (op.summary && op.description) {\n return `${op.summary} — ${op.description}`\n }\n return op.summary ?? op.description ?? `${method.toUpperCase()} ${path}`\n }\n\n private buildInputSchema(op: OperationObject): { schema: JsonSchema; pathParams: string[] } {\n const properties: Record<string, JsonSchema> = {}\n const required: string[] = []\n const pathParams: string[] = []\n\n // Parameters (path + query)\n for (const param of op.parameters ?? []) {\n const resolvedParam = this.resolveRef(param) as ParameterObject\n const paramSchema = resolvedParam.schema ? this.resolveRef(resolvedParam.schema) as JsonSchema : { type: 'string' }\n\n if (resolvedParam.in === 'path') {\n pathParams.push(resolvedParam.name)\n const key = `path_${resolvedParam.name}`\n properties[key] = { ...paramSchema }\n if (resolvedParam.description) properties[key].description = resolvedParam.description\n required.push(key)\n } else if (resolvedParam.in === 'query') {\n const key = `query_${resolvedParam.name}`\n properties[key] = { ...paramSchema }\n if (resolvedParam.description) properties[key].description = resolvedParam.description\n if (resolvedParam.required) required.push(key)\n }\n }\n\n // Request body\n const resolvedBody = op.requestBody ? this.resolveRef(op.requestBody) as RequestBodyObject : undefined\n if (resolvedBody) {\n const jsonContent = resolvedBody.content?.['application/json']\n if (jsonContent?.schema) {\n properties.body = this.resolveRef(jsonContent.schema) as JsonSchema\n } else {\n properties.body = { type: 'object' }\n }\n const needsBody = resolvedBody.required === true\n if (needsBody) {\n required.push('body')\n }\n }\n\n const schema: JsonSchema = { type: 'object', properties }\n if (required.length > 0) {\n schema.required = required\n }\n\n return { schema, pathParams }\n }\n\n private mergeParameters(pathLevel?: ParameterObject[], opLevel?: ParameterObject[]): ParameterObject[] {\n const resolvedPathLevel = pathLevel?.map((p) => this.resolveRef(p) as ParameterObject)\n const resolvedOpLevel = opLevel?.map((p) => this.resolveRef(p) as ParameterObject)\n\n if (!resolvedPathLevel?.length) return resolvedOpLevel ?? []\n if (!resolvedOpLevel?.length) return resolvedPathLevel\n\n const opKeys = new Set(resolvedOpLevel.map((p) => `${p.in}:${p.name}`))\n const inherited = resolvedPathLevel.filter((p) => !opKeys.has(`${p.in}:${p.name}`))\n return [...inherited, ...resolvedOpLevel]\n }\n\n private resolveRef(obj: unknown, seen = new Set<string>()): unknown {\n if (!obj || typeof obj !== 'object') return obj\n const record = obj as Record<string, unknown>\n\n if (typeof record.$ref === 'string') {\n const refPath = record.$ref\n if (seen.has(refPath)) return obj\n seen.add(refPath)\n\n const resolved = this.lookupRef(refPath)\n if (!resolved) return obj\n return this.resolveRef(resolved, seen)\n }\n\n // Recursively walk all properties and resolve nested $refs\n const result: Record<string, unknown> = {}\n for (const [key, value] of Object.entries(record)) {\n if (Array.isArray(value)) {\n result[key] = value.map((item) => this.resolveRef(item, seen))\n } else if (value && typeof value === 'object') {\n result[key] = this.resolveRef(value, seen)\n } else {\n result[key] = value\n }\n }\n return result\n }\n\n private lookupRef(refPath: string): unknown {\n const components = this.spec.components as Record<string, Record<string, unknown>> | undefined\n if (!components) return undefined\n\n const match = /^#\\/components\\/(\\w+)\\/(.+)$/.exec(refPath)\n if (!match) return undefined\n\n const [, section, name] = match\n const sectionObj = components[section]\n if (typeof sectionObj !== 'object') return undefined\n return sectionObj[name]\n }\n\n private getOperation(method: string, path: string): OperationObject | undefined {\n const paths = this.spec.paths as Record<string, Record<string, unknown>> | undefined\n return paths?.[path]?.[method.toLowerCase()] as OperationObject | undefined\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { n as OpenAPIObject, t as OpenAPIHono } from "./
|
|
1
|
+
import { Y as Container, or as RouterEnv } from "./index-B_JoEl3V.mjs";
|
|
2
|
+
import { n as OpenAPIObject, t as OpenAPIHono } from "./zod-wecrEVAs.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/openapi/services/openapi.service.d.ts
|
|
5
5
|
/**
|
|
@@ -47,4 +47,4 @@ declare class OpenAPIService {
|
|
|
47
47
|
}
|
|
48
48
|
//#endregion
|
|
49
49
|
export { OpenAPIService as t };
|
|
50
|
-
//# sourceMappingURL=openapi.service-
|
|
50
|
+
//# sourceMappingURL=openapi.service-YhTiJ1bO.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openapi.service-YhTiJ1bO.d.mts","names":[],"sources":["../src/openapi/services/openapi.service.ts"],"mappings":";;;;;AAyBA;;;;;;;;;;;;;;cACa,cAAA;EAMH;;;;EAAR,OAAA,CAAQ,GAAA,EAAK,WAAA,CAAY,SAAA,GAAY,SAAA,EAAW,SAAA,GAAY,aAAA;EAqCxC;;;EAApB,cAAA,CAAe,GAAA,EAAK,WAAA,CAAY,SAAA,GAAY,SAAA,EAAW,SAAA;EAAA,QAkD/C,eAAA;EAAA;;;EAAA,QAQA,4BAAA;EA2EA;;AAAiB;EAAjB,QAjDA,YAAA;;;;UAoBA,aAAA;;;;UA6BA,iBAAA;AAAA"}
|