stratal 0.0.26 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +912 -0
- package/README.md +96 -14
- package/dist/bin/cloudflare-workers-loader.mjs +18 -3
- package/dist/bin/cloudflare-workers-loader.mjs.map +1 -1
- package/dist/bin/quarry.mjs +85 -14
- package/dist/bin/quarry.mjs.map +1 -1
- package/dist/cache/index.d.mts +8 -9
- package/dist/cache/index.d.mts.map +1 -1
- package/dist/cache/index.mjs +56 -17
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{cache.service-uElmBtdS.d.mts → cache.service-Dg0Hj0gp.d.mts} +27 -12
- package/dist/cache.service-Dg0Hj0gp.d.mts.map +1 -0
- package/dist/{command-DoBD2Cwl.d.mts → command-BXMccV_9.d.mts} +6 -3
- package/dist/command-BXMccV_9.d.mts.map +1 -0
- package/dist/{command-BvmUAPPQ.mjs → command-Bb820B6W.mjs} +36 -13
- package/dist/command-Bb820B6W.mjs.map +1 -0
- package/dist/common.schemas-BigQCwYB.mjs +89 -0
- package/dist/common.schemas-BigQCwYB.mjs.map +1 -0
- package/dist/config/index.d.mts +15 -15
- package/dist/config/index.d.mts.map +1 -1
- package/dist/config/index.mjs +4 -6
- package/dist/config/index.mjs.map +1 -1
- package/dist/{consumer-registry-D3iMTSdy.d.mts → consumer-registry-i9oCdarv.d.mts} +2 -3
- package/dist/consumer-registry-i9oCdarv.d.mts.map +1 -0
- package/dist/{container-storage-BmOJ4_Na.mjs → container-storage-DfF7SXdV.mjs} +11 -1
- package/dist/container-storage-DfF7SXdV.mjs.map +1 -0
- package/dist/{controller.decorator-YSTPQntu.mjs → controller.decorator-BB0JcwMg.mjs} +18 -9
- package/dist/controller.decorator-BB0JcwMg.mjs.map +1 -0
- package/dist/cron/index.d.mts +6 -7
- package/dist/cron/index.d.mts.map +1 -1
- package/dist/cron/index.mjs +1 -1
- package/dist/{cron-job-NesZRk8F.d.mts → cron-job-DAgNw4Bn.d.mts} +1 -2
- package/dist/cron-job-DAgNw4Bn.d.mts.map +1 -0
- package/dist/{cron.module-C81HTzR7.mjs → cron.module-Dnyl9sFk.mjs} +6 -7
- package/dist/{cron.module-C81HTzR7.mjs.map → cron.module-Dnyl9sFk.mjs.map} +1 -1
- package/dist/{decorate-CuAoSZvs.mjs → decorate-C79yt3Wt.mjs} +2 -2
- package/dist/di/index.d.mts +1 -1
- package/dist/di/index.mjs +2 -3
- package/dist/{di-D7qmrAir.mjs → di-DQ3xbjgf.mjs} +48 -6
- package/dist/di-DQ3xbjgf.mjs.map +1 -0
- package/dist/email/index.d.mts +158 -133
- package/dist/email/index.d.mts.map +1 -1
- package/dist/email/index.mjs +66 -78
- package/dist/email/index.mjs.map +1 -1
- package/dist/{en-CDZBMcc1.mjs → en-CCL84z4k.mjs} +2 -2
- package/dist/{en-CDZBMcc1.mjs.map → en-CCL84z4k.mjs.map} +1 -1
- package/dist/env-ug22bJj7.d.mts.map +1 -1
- package/dist/errors/index.d.mts +1 -1
- package/dist/errors/index.mjs +3 -3
- package/dist/{errors-C01O2T-n.mjs → errors-CrOXI_y5.mjs} +6 -8
- package/dist/errors-CrOXI_y5.mjs.map +1 -0
- package/dist/events/index.d.mts +8 -9
- package/dist/events/index.d.mts.map +1 -1
- package/dist/events/index.mjs +1 -1
- package/dist/{events-BhEQuT1X.mjs → events-GtwGEHyT.mjs} +5 -6
- package/dist/events-GtwGEHyT.mjs.map +1 -0
- package/dist/{exception-context-D-kvney-.mjs → exception-context-CdnGTQNF.mjs} +13 -7
- package/dist/exception-context-CdnGTQNF.mjs.map +1 -0
- package/dist/{gateway-context-m7kEzRa2.mjs → gateway-context-Cmc1NRS0.mjs} +7 -7
- package/dist/{gateway-context-m7kEzRa2.mjs.map → gateway-context-Cmc1NRS0.mjs.map} +1 -1
- package/dist/gateway-mode-0rUaeW3g.mjs +53 -0
- package/dist/gateway-mode-0rUaeW3g.mjs.map +1 -0
- package/dist/guards/index.d.mts +38 -20
- package/dist/guards/index.d.mts.map +1 -1
- package/dist/guards/index.mjs +2 -2
- package/dist/{guards-DALPXy3_.mjs → guards-DOGly9IF.mjs} +34 -11
- package/dist/guards-DOGly9IF.mjs.map +1 -0
- package/dist/hono-app-IhdqL0Fk.mjs +399 -0
- package/dist/hono-app-IhdqL0Fk.mjs.map +1 -0
- package/dist/{http-method.decorator-BljM8BDj.mjs → http-method.decorator-BDi9LTWj.mjs} +9 -8
- package/dist/http-method.decorator-BDi9LTWj.mjs.map +1 -0
- package/dist/i18n/index.d.mts +26 -137
- package/dist/i18n/index.d.mts.map +1 -1
- package/dist/i18n/index.mjs +4 -5
- package/dist/i18n/index.mjs.map +1 -1
- package/dist/i18n/messages/en/index.d.mts +1 -1
- package/dist/i18n/messages/en/index.mjs +1 -1
- package/dist/i18n/utils/index.d.mts +1 -2
- package/dist/i18n/utils/index.d.mts.map +1 -1
- package/dist/i18n/validation/index.d.mts +80 -5
- package/dist/i18n/validation/index.d.mts.map +1 -0
- package/dist/i18n/validation/index.mjs +4 -5
- package/dist/{i18n.module-B2DvWUPa.mjs → i18n.module-Bm3xlViA.mjs} +28 -13
- package/dist/i18n.module-Bm3xlViA.mjs.map +1 -0
- package/dist/index-0ItCjaqw.d.mts.map +1 -1
- package/dist/{index-CNuFQSNj.d.mts → index-3HJfhLlE.d.mts} +9 -11
- package/dist/index-3HJfhLlE.d.mts.map +1 -0
- package/dist/{index-uybm0bhQ.d.mts → index-B2WtEagR.d.mts} +1187 -234
- package/dist/index-B2WtEagR.d.mts.map +1 -0
- package/dist/index-BUt92sAE.d.mts.map +1 -1
- package/dist/index-CAHNCpvr.d.mts +203 -0
- package/dist/index-CAHNCpvr.d.mts.map +1 -0
- package/dist/index.d.mts +4 -4
- package/dist/index.mjs +2 -2
- package/dist/{is-command-CEPO9n8c.mjs → is-command-CSVv14wh.mjs} +2 -2
- package/dist/{is-command-CEPO9n8c.mjs.map → is-command-CSVv14wh.mjs.map} +1 -1
- package/dist/{is-seeder-Gvh_AM71.mjs → is-seeder-gLgXYbqC.mjs} +2 -2
- package/dist/is-seeder-gLgXYbqC.mjs.map +1 -0
- package/dist/{lazy-module-loader-M6YKudNL.d.mts → lazy-module-loader-C3OHoUnR.d.mts} +4 -5
- package/dist/lazy-module-loader-C3OHoUnR.d.mts.map +1 -0
- package/dist/limit-BE0HNAF6.mjs +116 -0
- package/dist/limit-BE0HNAF6.mjs.map +1 -0
- package/dist/locale-path.service-BqzDIrgy.mjs +213 -0
- package/dist/locale-path.service-BqzDIrgy.mjs.map +1 -0
- package/dist/locale-url-nZrZxqJP.mjs.map +1 -1
- package/dist/{locale-url.service-6bgia24_.mjs → locale-url.service-H8PH6GGh.mjs} +15 -5
- package/dist/{locale-url.service-6bgia24_.mjs.map → locale-url.service-H8PH6GGh.mjs.map} +1 -1
- package/dist/logger/index.mjs +3 -5
- package/dist/logger/index.mjs.map +1 -1
- package/dist/macroable-cvDTFZ_A.mjs.map +1 -1
- package/dist/metadata-Ba8Fxs1F.mjs +48 -0
- package/dist/metadata-Ba8Fxs1F.mjs.map +1 -0
- package/dist/module/index.d.mts +8 -9
- package/dist/module/index.d.mts.map +1 -1
- package/dist/module/index.mjs +3 -4
- package/dist/module/index.mjs.map +1 -1
- package/dist/{module-registry-NxX5O0Qk.mjs → module-registry-lkQPDuQe.mjs} +17 -15
- package/dist/module-registry-lkQPDuQe.mjs.map +1 -0
- package/dist/{module.decorator-CYHY6pG5.mjs → module.decorator-CYbrOlX9.mjs} +2 -2
- package/dist/{module.decorator-CYHY6pG5.mjs.map → module.decorator-CYbrOlX9.mjs.map} +1 -1
- package/dist/openapi/index.d.mts +19 -16
- package/dist/openapi/index.d.mts.map +1 -1
- package/dist/openapi/index.mjs +2 -2
- package/dist/{openapi-CMwuCp31.mjs → openapi-DBfBa5Qh.mjs} +41 -65
- package/dist/openapi-DBfBa5Qh.mjs.map +1 -0
- package/dist/openapi-generator-CCwiu8AU.mjs +134 -0
- package/dist/openapi-generator-CCwiu8AU.mjs.map +1 -0
- package/dist/{openapi-tools.service-BC5EC3R3.mjs → openapi-tools.service-VKZJlTIX.mjs} +12 -4
- package/dist/openapi-tools.service-VKZJlTIX.mjs.map +1 -0
- package/dist/openapi.service-Ds-R1tih.d.mts +43 -0
- package/dist/openapi.service-Ds-R1tih.d.mts.map +1 -0
- package/dist/quarry/index.d.mts +10 -11
- package/dist/quarry/index.d.mts.map +1 -1
- package/dist/quarry/index.mjs +4 -4
- package/dist/quarry/runner.d.mts +19 -20
- package/dist/quarry/runner.d.mts.map +1 -1
- package/dist/quarry/runner.mjs +16 -13
- package/dist/quarry/runner.mjs.map +1 -1
- package/dist/{quarry-registry-DRnV-DDa.d.mts → quarry-registry-Ci4k58FZ.d.mts} +3 -4
- package/dist/quarry-registry-Ci4k58FZ.d.mts.map +1 -0
- package/dist/{quarry.module-CcGxU2dJ.mjs → quarry.module-BssRR8f0.mjs} +20 -37
- package/dist/quarry.module-BssRR8f0.mjs.map +1 -0
- package/dist/queue/index.d.mts +2 -2
- package/dist/queue/index.mjs +3 -3
- package/dist/queue/index.mjs.map +1 -1
- package/dist/{queue.module-CEs4_kEM.mjs → queue.module-DnAdSbR-.mjs} +40 -41
- package/dist/queue.module-DnAdSbR-.mjs.map +1 -0
- package/dist/{r2-storage.provider-BoZmR6Ut.mjs → r2-storage.provider-wU_6api4.mjs} +45 -6
- package/dist/r2-storage.provider-wU_6api4.mjs.map +1 -0
- package/dist/{rate-limit.decorator-Djs4oYDB.mjs → rate-limit.decorator-PYQ9EYqs.mjs} +10 -5
- package/dist/{rate-limit.decorator-Djs4oYDB.mjs.map → rate-limit.decorator-PYQ9EYqs.mjs.map} +1 -1
- package/dist/rate-limiter/index.d.mts +64 -19
- package/dist/rate-limiter/index.d.mts.map +1 -1
- package/dist/rate-limiter/index.mjs +67 -83
- package/dist/rate-limiter/index.mjs.map +1 -1
- package/dist/response-cache/index.d.mts +326 -0
- package/dist/response-cache/index.d.mts.map +1 -0
- package/dist/response-cache/index.mjs +511 -0
- package/dist/response-cache/index.mjs.map +1 -0
- package/dist/response-cache.error-B4D0zy9W.mjs +24 -0
- package/dist/response-cache.error-B4D0zy9W.mjs.map +1 -0
- package/dist/response-headers-BqA57S_X.mjs +158 -0
- package/dist/response-headers-BqA57S_X.mjs.map +1 -0
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/dist/route-cache-binding-CrLh8tB6.mjs +390 -0
- package/dist/route-cache-binding-CrLh8tB6.mjs.map +1 -0
- package/dist/route-metadata-QQhbed1i.mjs +17 -0
- package/dist/route-metadata-QQhbed1i.mjs.map +1 -0
- package/dist/{route-name-DGoBOfPg.mjs → route-name-BslSbmMP.mjs} +15 -11
- package/dist/route-name-BslSbmMP.mjs.map +1 -0
- package/dist/route-registration.service-COKBZTsn.mjs +1265 -0
- package/dist/route-registration.service-COKBZTsn.mjs.map +1 -0
- package/dist/{route-registry-BvLJisvK.mjs → route-registry-DFz9_-N6.mjs} +6 -6
- package/dist/{route-registry-BvLJisvK.mjs.map → route-registry-DFz9_-N6.mjs.map} +1 -1
- package/dist/router/index.d.mts +2 -2
- package/dist/router/index.mjs +16 -15
- package/dist/{router-resolver-sUV_jTrU.mjs → router-resolver-B-dMSMIG.mjs} +7 -3
- package/dist/router-resolver-B-dMSMIG.mjs.map +1 -0
- package/dist/{router-DwyqEXgf.mjs → router-wlsVkGkM.mjs} +5 -14
- package/dist/{router-DwyqEXgf.mjs.map → router-wlsVkGkM.mjs.map} +1 -1
- package/dist/seeder/index.d.mts +12 -13
- package/dist/seeder/index.d.mts.map +1 -1
- package/dist/seeder/index.mjs +4 -4
- package/dist/{seeder-BPGY5rUb.mjs → seeder-BrAk7XIj.mjs} +5 -6
- package/dist/{seeder-BPGY5rUb.mjs.map → seeder-BrAk7XIj.mjs.map} +1 -1
- package/dist/{seeder-registry-DEvCycsT.mjs → seeder-registry-Bo5BgLbC.mjs} +5 -6
- package/dist/{seeder-registry-DEvCycsT.mjs.map → seeder-registry-Bo5BgLbC.mjs.map} +1 -1
- package/dist/{seeder.module-CIwQbdN4.mjs → seeder.module-DOoVgTsK.mjs} +5 -5
- package/dist/{seeder.module-CIwQbdN4.mjs.map → seeder.module-DOoVgTsK.mjs.map} +1 -1
- package/dist/signed-url-DIU0sK_6.mjs.map +1 -1
- package/dist/storage/index.d.mts +63 -13
- package/dist/storage/index.d.mts.map +1 -1
- package/dist/storage/index.mjs +2 -2
- package/dist/storage/providers/index.d.mts +18 -16
- package/dist/storage/providers/index.d.mts.map +1 -1
- package/dist/storage/providers/index.mjs +1 -1
- package/dist/{storage-C30X81CS.mjs → storage-DBWVYMnn.mjs} +167 -49
- package/dist/storage-DBWVYMnn.mjs.map +1 -0
- package/dist/storage-provider.interface-CinHpjl1.d.mts +315 -0
- package/dist/storage-provider.interface-CinHpjl1.d.mts.map +1 -0
- package/dist/storage.error-Ao38Qdjx.mjs +7 -0
- package/dist/storage.error-Ao38Qdjx.mjs.map +1 -0
- package/dist/{stratal-D5j_I14G.d.mts → stratal-Bs1_E8GQ.d.mts} +13 -3
- package/dist/stratal-Bs1_E8GQ.d.mts.map +1 -0
- package/dist/{stratal-BL6FKUM_.mjs → stratal-CiwNpWy2.mjs} +56 -23
- package/dist/stratal-CiwNpWy2.mjs.map +1 -0
- package/dist/{tiered-cache.service-Dv3BhxxE.d.mts → tiered-cache.service-Bz8bbvyb.d.mts} +16 -3
- package/dist/tiered-cache.service-Bz8bbvyb.d.mts.map +1 -0
- package/dist/trailing-slash-2SctvePW.mjs.map +1 -1
- package/dist/types-CmV_9xBD.d.mts.map +1 -1
- package/dist/{uri-iwofWJ_T.mjs → uri-BrOq148R.mjs} +13 -9
- package/dist/{uri-iwofWJ_T.mjs.map → uri-BrOq148R.mjs.map} +1 -1
- package/dist/{usage-generator-DAWYasuP.mjs → usage-generator-BW7EcO-C.mjs} +3 -3
- package/dist/{usage-generator-DAWYasuP.mjs.map → usage-generator-BW7EcO-C.mjs.map} +1 -1
- package/dist/{zod-eKqqhZ5_.mjs → validation-CZ_B0aXY.mjs} +38 -17
- package/dist/validation-CZ_B0aXY.mjs.map +1 -0
- package/dist/{validation.context-CRvmrhq7.mjs → validation.context-CdbwQWIr.mjs} +2 -2
- package/dist/{validation.context-CRvmrhq7.mjs.map → validation.context-CdbwQWIr.mjs.map} +1 -1
- package/dist/{versioning.service-CCa2oYMJ.mjs → versioning.service-DnF_4Lnd.mjs} +5 -5
- package/dist/{versioning.service-CCa2oYMJ.mjs.map → versioning.service-DnF_4Lnd.mjs.map} +1 -1
- package/dist/websocket/index.d.mts +12 -13
- package/dist/websocket/index.d.mts.map +1 -1
- package/dist/websocket/index.mjs +1 -1
- package/dist/workers/index.d.mts +70 -7
- package/dist/workers/index.d.mts.map +1 -1
- package/dist/workers/index.mjs +72 -3
- package/dist/workers/index.mjs.map +1 -1
- package/dist/{zod-wecrEVAs.d.mts → zod-BGisqLs3.d.mts} +9 -16
- package/dist/zod-BGisqLs3.d.mts.map +1 -0
- package/package.json +33 -25
- package/dist/cache.service-uElmBtdS.d.mts.map +0 -1
- package/dist/chunk-BBjsoOtd.mjs +0 -27
- package/dist/command-BvmUAPPQ.mjs.map +0 -1
- package/dist/command-DoBD2Cwl.d.mts.map +0 -1
- package/dist/consumer-registry-D3iMTSdy.d.mts.map +0 -1
- package/dist/container-storage-BmOJ4_Na.mjs.map +0 -1
- package/dist/controller.decorator-YSTPQntu.mjs.map +0 -1
- package/dist/cron-job-NesZRk8F.d.mts.map +0 -1
- package/dist/di-D7qmrAir.mjs.map +0 -1
- package/dist/errors-C01O2T-n.mjs.map +0 -1
- package/dist/events-BhEQuT1X.mjs.map +0 -1
- package/dist/exception-context-D-kvney-.mjs.map +0 -1
- package/dist/guards-DALPXy3_.mjs.map +0 -1
- package/dist/hono-app-COAgmutc.mjs +0 -168
- package/dist/hono-app-COAgmutc.mjs.map +0 -1
- package/dist/http-method.decorator-BljM8BDj.mjs.map +0 -1
- package/dist/i18n.module-B2DvWUPa.mjs.map +0 -1
- package/dist/index-CNuFQSNj.d.mts.map +0 -1
- package/dist/index-DtBNIFuP.d.mts +0 -42
- package/dist/index-DtBNIFuP.d.mts.map +0 -1
- package/dist/index-HgOLNruQ.d.mts +0 -203
- package/dist/index-HgOLNruQ.d.mts.map +0 -1
- package/dist/index-uybm0bhQ.d.mts.map +0 -1
- package/dist/is-seeder-Gvh_AM71.mjs.map +0 -1
- package/dist/lazy-module-loader-M6YKudNL.d.mts.map +0 -1
- package/dist/locale-path.service-CH0CaxwH.mjs +0 -165
- package/dist/locale-path.service-CH0CaxwH.mjs.map +0 -1
- package/dist/metadata-DzzprcID.mjs +0 -39
- package/dist/metadata-DzzprcID.mjs.map +0 -1
- package/dist/module-registry-NxX5O0Qk.mjs.map +0 -1
- package/dist/openapi-CMwuCp31.mjs.map +0 -1
- package/dist/openapi-tools.service-BC5EC3R3.mjs.map +0 -1
- package/dist/openapi.service-2rvJBCEg.d.mts +0 -50
- package/dist/openapi.service-2rvJBCEg.d.mts.map +0 -1
- package/dist/quarry-registry-DRnV-DDa.d.mts.map +0 -1
- package/dist/quarry.module-CcGxU2dJ.mjs.map +0 -1
- package/dist/queue.module-CEs4_kEM.mjs.map +0 -1
- package/dist/r2-storage.provider-BoZmR6Ut.mjs.map +0 -1
- package/dist/route-name-DGoBOfPg.mjs.map +0 -1
- package/dist/route-registration.service-CDPQKpm4.mjs +0 -918
- package/dist/route-registration.service-CDPQKpm4.mjs.map +0 -1
- package/dist/router-resolver-sUV_jTrU.mjs.map +0 -1
- package/dist/storage-C30X81CS.mjs.map +0 -1
- package/dist/storage-provider.interface-ClUwxz4S.d.mts +0 -201
- package/dist/storage-provider.interface-ClUwxz4S.d.mts.map +0 -1
- package/dist/storage.error-BStXPmO4.mjs +0 -8
- package/dist/storage.error-BStXPmO4.mjs.map +0 -1
- package/dist/stratal-BL6FKUM_.mjs.map +0 -1
- package/dist/stratal-D5j_I14G.d.mts.map +0 -1
- package/dist/tiered-cache.service-Dv3BhxxE.d.mts.map +0 -1
- package/dist/validation-CpOjviyT.mjs +0 -49
- package/dist/validation-CpOjviyT.mjs.map +0 -1
- package/dist/zod-eKqqhZ5_.mjs.map +0 -1
- package/dist/zod-wecrEVAs.d.mts.map +0 -1
package/dist/guards/index.d.mts
CHANGED
|
@@ -1,7 +1,23 @@
|
|
|
1
|
-
import { $ as Container, st as RouterContext } from "../index-
|
|
1
|
+
import { $ as Container, l as HttpException, st as RouterContext } from "../index-B2WtEagR.mjs";
|
|
2
2
|
import { r as LoggerService } from "../index-BUt92sAE.mjs";
|
|
3
3
|
import { t as Constructor } from "../types-CmV_9xBD.mjs";
|
|
4
|
-
|
|
4
|
+
//#region src/guards/errors.d.ts
|
|
5
|
+
/**
|
|
6
|
+
* Thrown when a guard's `canActivate` returns `false`.
|
|
7
|
+
*
|
|
8
|
+
* HTTP Status: 403 Forbidden
|
|
9
|
+
*
|
|
10
|
+
* A guard denies by returning `false` or by throwing its own error; this class is what the
|
|
11
|
+
* former becomes, so both paths surface as an exception the {@link ExceptionHandler} can render
|
|
12
|
+
* and an application can match with `instanceof` or replace via `renderable()`. A guard that
|
|
13
|
+
* needs a different status (401 for unauthenticated, 429 for a budget) should throw its own
|
|
14
|
+
* `HttpException` instead — that is passed through untouched.
|
|
15
|
+
*/
|
|
16
|
+
export declare class GuardRejectedError extends HttpException {
|
|
17
|
+
readonly guard: string;
|
|
18
|
+
constructor(guard: string);
|
|
19
|
+
}
|
|
20
|
+
//#endregion
|
|
5
21
|
//#region src/guards/types.d.ts
|
|
6
22
|
/**
|
|
7
23
|
* Interface for guards that control access to routes
|
|
@@ -21,28 +37,30 @@ import { t as Constructor } from "../types-CmV_9xBD.mjs";
|
|
|
21
37
|
* }
|
|
22
38
|
* ```
|
|
23
39
|
*/
|
|
24
|
-
interface CanActivate {
|
|
40
|
+
export interface CanActivate {
|
|
25
41
|
/**
|
|
26
42
|
* Determine if the request should be allowed
|
|
27
43
|
*
|
|
28
44
|
* @param context - Router context with request/response helpers
|
|
29
|
-
* @returns true to allow, false to deny
|
|
45
|
+
* @returns true to allow, false to deny — a `false` is turned into a `GuardRejectedError`
|
|
46
|
+
* (HTTP 403) and thrown, so the handler never runs. To deny with a different status, throw your
|
|
47
|
+
* own `HttpException` instead; it is passed through untouched.
|
|
30
48
|
*/
|
|
31
49
|
canActivate(context: RouterContext): boolean | Promise<boolean>;
|
|
32
50
|
}
|
|
33
51
|
/**
|
|
34
52
|
* Type for guard class constructors
|
|
35
53
|
*/
|
|
36
|
-
type GuardClass = Constructor<CanActivate>;
|
|
54
|
+
export type GuardClass = Constructor<CanActivate>;
|
|
37
55
|
/**
|
|
38
56
|
* Guard can be a class constructor or an instance
|
|
39
57
|
* Instances are used for factory-created guards with configuration
|
|
40
58
|
*/
|
|
41
|
-
type Guard = GuardClass | CanActivate;
|
|
59
|
+
export type Guard = GuardClass | CanActivate;
|
|
42
60
|
/**
|
|
43
61
|
* Options for AuthGuard factory
|
|
44
62
|
*/
|
|
45
|
-
interface AuthGuardOptions {
|
|
63
|
+
export interface AuthGuardOptions {
|
|
46
64
|
/**
|
|
47
65
|
* Required permissions for authorization as `"resource:action"` strings.
|
|
48
66
|
* If provided, permission check is performed after authentication.
|
|
@@ -62,13 +80,13 @@ interface AuthGuardOptions {
|
|
|
62
80
|
/**
|
|
63
81
|
* Metadata stored by `@UseGuards` decorator
|
|
64
82
|
*/
|
|
65
|
-
interface GuardMetadata {
|
|
83
|
+
export interface GuardMetadata {
|
|
66
84
|
guards: Guard[];
|
|
67
85
|
}
|
|
68
86
|
/**
|
|
69
87
|
* Metadata key for guard storage
|
|
70
88
|
*/
|
|
71
|
-
declare const GUARD_METADATA_KEY: unique symbol;
|
|
89
|
+
export declare const GUARD_METADATA_KEY: unique symbol;
|
|
72
90
|
//#endregion
|
|
73
91
|
//#region src/guards/use-guards.decorator.d.ts
|
|
74
92
|
/**
|
|
@@ -90,7 +108,7 @@ declare const GUARD_METADATA_KEY: unique symbol;
|
|
|
90
108
|
*
|
|
91
109
|
* @example Authentication only
|
|
92
110
|
* ```typescript
|
|
93
|
-
* @Controller('/
|
|
111
|
+
* @Controller('/profile', { version: '1' })
|
|
94
112
|
* @UseGuards(AuthGuard())
|
|
95
113
|
* export class ProfileController {
|
|
96
114
|
* show() { } // Requires authentication
|
|
@@ -99,8 +117,8 @@ declare const GUARD_METADATA_KEY: unique symbol;
|
|
|
99
117
|
*
|
|
100
118
|
* @example Authentication with permissions
|
|
101
119
|
* ```typescript
|
|
102
|
-
* @Controller('/
|
|
103
|
-
* @UseGuards(AuthGuard({
|
|
120
|
+
* @Controller('/students', { version: '1' })
|
|
121
|
+
* @UseGuards(AuthGuard({ permissions: ['students:read'] }))
|
|
104
122
|
* export class StudentsController {
|
|
105
123
|
* index() { } // Requires 'students:read' permission
|
|
106
124
|
* }
|
|
@@ -108,12 +126,12 @@ declare const GUARD_METADATA_KEY: unique symbol;
|
|
|
108
126
|
*
|
|
109
127
|
* @example Method-level guards
|
|
110
128
|
* ```typescript
|
|
111
|
-
* @Controller('/
|
|
129
|
+
* @Controller('/students', { version: '1' })
|
|
112
130
|
* @UseGuards(AuthGuard()) // Controller-level: auth only
|
|
113
131
|
* export class StudentsController {
|
|
114
132
|
* index() { } // Auth only (inherited)
|
|
115
133
|
*
|
|
116
|
-
* @UseGuards(AuthGuard({
|
|
134
|
+
* @UseGuards(AuthGuard({ permissions: ['students:create'] }))
|
|
117
135
|
* create() { } // Auth + 'students:create' permission
|
|
118
136
|
* }
|
|
119
137
|
* ```
|
|
@@ -126,14 +144,14 @@ declare const GUARD_METADATA_KEY: unique symbol;
|
|
|
126
144
|
* }
|
|
127
145
|
* ```
|
|
128
146
|
*/
|
|
129
|
-
declare function UseGuards(...guards: Guard[]): ClassDecorator & MethodDecorator;
|
|
147
|
+
export declare function UseGuards(...guards: Guard[]): ClassDecorator & MethodDecorator;
|
|
130
148
|
/**
|
|
131
149
|
* Get controller-level guard metadata
|
|
132
150
|
*
|
|
133
151
|
* @param target - Controller class
|
|
134
152
|
* @returns Guard metadata or undefined if not decorated
|
|
135
153
|
*/
|
|
136
|
-
declare function getControllerGuards(target: object): GuardMetadata | undefined;
|
|
154
|
+
export declare function getControllerGuards(target: object): GuardMetadata | undefined;
|
|
137
155
|
/**
|
|
138
156
|
* Get method-level guard metadata
|
|
139
157
|
*
|
|
@@ -141,7 +159,7 @@ declare function getControllerGuards(target: object): GuardMetadata | undefined;
|
|
|
141
159
|
* @param propertyKey - Method name
|
|
142
160
|
* @returns Guard metadata or undefined if not decorated
|
|
143
161
|
*/
|
|
144
|
-
declare function getMethodGuards(target: object, propertyKey: string | symbol): GuardMetadata | undefined;
|
|
162
|
+
export declare function getMethodGuards(target: object, propertyKey: string | symbol): GuardMetadata | undefined;
|
|
145
163
|
//#endregion
|
|
146
164
|
//#region src/guards/guard-execution.service.d.ts
|
|
147
165
|
/**
|
|
@@ -150,7 +168,7 @@ declare function getMethodGuards(target: object, propertyKey: string | symbol):
|
|
|
150
168
|
* Executes guards for a route and determines if the request should proceed.
|
|
151
169
|
* Guards are executed in order; all must pass for the request to proceed.
|
|
152
170
|
*/
|
|
153
|
-
declare class GuardExecutionService {
|
|
171
|
+
export declare class GuardExecutionService {
|
|
154
172
|
private readonly logger;
|
|
155
173
|
constructor(logger: LoggerService);
|
|
156
174
|
/**
|
|
@@ -160,7 +178,8 @@ declare class GuardExecutionService {
|
|
|
160
178
|
* @param context - Router context
|
|
161
179
|
* @param container - Request-scoped DI container
|
|
162
180
|
* @returns true if all guards pass
|
|
163
|
-
* @throws
|
|
181
|
+
* @throws {@link GuardRejectedError} if a guard's `canActivate` returns `false`, or the guard's
|
|
182
|
+
* own thrown error if it rejects by throwing instead
|
|
164
183
|
*/
|
|
165
184
|
executeGuards(guards: Guard[], context: RouterContext, container: Container): Promise<boolean>;
|
|
166
185
|
/**
|
|
@@ -177,5 +196,4 @@ declare class GuardExecutionService {
|
|
|
177
196
|
private isGuardInstance;
|
|
178
197
|
}
|
|
179
198
|
//#endregion
|
|
180
|
-
export { AuthGuardOptions, CanActivate, GUARD_METADATA_KEY, Guard, GuardClass, GuardExecutionService, GuardMetadata, UseGuards, getControllerGuards, getMethodGuards };
|
|
181
199
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/guards/types.ts","../../src/guards/use-guards.decorator.ts","../../src/guards/guard-execution.service.ts"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/guards/errors.ts","../../src/guards/types.ts","../../src/guards/use-guards.decorator.ts","../../src/guards/guard-execution.service.ts"],"mappings":";;;;;;;;;;;;;;;qBAaa,2BAA2B;WACV;EAA5B,YAA4B;;;;;;;;;;;;;;;;;;;;;;iBCOb;;;;;;;;;EASf,YAAY,SAAS,0BAA0B;;;;;YAMrC,aAAa,YAAY;;;;;YAMzB,QAAQ,aAAa;;;;iBAKhB;;;;;;;;;;;;;;;EAef;;;;;iBAMe;EACf,QAAQ;;;;;qBAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBCjBG,aAAa,QAAQ,UAAU,iBAAiB;;;;;;;wBAoBhD,oBAAoB,iBAAiB;;;;;;;;wBAWrC,gBAAgB,gBAAgB,+BAA+B;;;;;;;;;qBC7ElE;mBACkB;EAA7B,YAA6B,QAAQ;;;;;;;;;;;EAY/B,cACJ,QAAQ,SACR,SAAS,eACT,WAAW,YACV;;;;;;;;UA6CK;;;;UAaA"}
|
package/dist/guards/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as GUARD_METADATA_KEY, i as getMethodGuards, n as UseGuards, r as getControllerGuards, t as GuardExecutionService } from "../guards-
|
|
2
|
-
export { GUARD_METADATA_KEY, GuardExecutionService, UseGuards, getControllerGuards, getMethodGuards };
|
|
1
|
+
import { a as GUARD_METADATA_KEY, i as getMethodGuards, n as UseGuards, o as GuardRejectedError, r as getControllerGuards, t as GuardExecutionService } from "../guards-DOGly9IF.mjs";
|
|
2
|
+
export { GUARD_METADATA_KEY, GuardExecutionService, GuardRejectedError, UseGuards, getControllerGuards, getMethodGuards };
|
|
@@ -1,4 +1,25 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { _ as defineMetadata, v as getMetadata } from "./di-DQ3xbjgf.mjs";
|
|
2
|
+
import { d as HttpException } from "./errors-CrOXI_y5.mjs";
|
|
3
|
+
//#region src/guards/errors.ts
|
|
4
|
+
/**
|
|
5
|
+
* Thrown when a guard's `canActivate` returns `false`.
|
|
6
|
+
*
|
|
7
|
+
* HTTP Status: 403 Forbidden
|
|
8
|
+
*
|
|
9
|
+
* A guard denies by returning `false` or by throwing its own error; this class is what the
|
|
10
|
+
* former becomes, so both paths surface as an exception the {@link ExceptionHandler} can render
|
|
11
|
+
* and an application can match with `instanceof` or replace via `renderable()`. A guard that
|
|
12
|
+
* needs a different status (401 for unauthenticated, 429 for a budget) should throw its own
|
|
13
|
+
* `HttpException` instead — that is passed through untouched.
|
|
14
|
+
*/
|
|
15
|
+
var GuardRejectedError = class extends HttpException {
|
|
16
|
+
guard;
|
|
17
|
+
constructor(guard) {
|
|
18
|
+
super(403, "Forbidden");
|
|
19
|
+
this.guard = guard;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
//#endregion
|
|
2
23
|
//#region src/guards/types.ts
|
|
3
24
|
/**
|
|
4
25
|
* Metadata key for guard storage
|
|
@@ -25,7 +46,7 @@ const GUARD_METADATA_KEY = Symbol.for("stratal:guards");
|
|
|
25
46
|
*
|
|
26
47
|
* @example Authentication only
|
|
27
48
|
* ```typescript
|
|
28
|
-
* @Controller('/
|
|
49
|
+
* @Controller('/profile', { version: '1' })
|
|
29
50
|
* @UseGuards(AuthGuard())
|
|
30
51
|
* export class ProfileController {
|
|
31
52
|
* show() { } // Requires authentication
|
|
@@ -34,8 +55,8 @@ const GUARD_METADATA_KEY = Symbol.for("stratal:guards");
|
|
|
34
55
|
*
|
|
35
56
|
* @example Authentication with permissions
|
|
36
57
|
* ```typescript
|
|
37
|
-
* @Controller('/
|
|
38
|
-
* @UseGuards(AuthGuard({
|
|
58
|
+
* @Controller('/students', { version: '1' })
|
|
59
|
+
* @UseGuards(AuthGuard({ permissions: ['students:read'] }))
|
|
39
60
|
* export class StudentsController {
|
|
40
61
|
* index() { } // Requires 'students:read' permission
|
|
41
62
|
* }
|
|
@@ -43,12 +64,12 @@ const GUARD_METADATA_KEY = Symbol.for("stratal:guards");
|
|
|
43
64
|
*
|
|
44
65
|
* @example Method-level guards
|
|
45
66
|
* ```typescript
|
|
46
|
-
* @Controller('/
|
|
67
|
+
* @Controller('/students', { version: '1' })
|
|
47
68
|
* @UseGuards(AuthGuard()) // Controller-level: auth only
|
|
48
69
|
* export class StudentsController {
|
|
49
70
|
* index() { } // Auth only (inherited)
|
|
50
71
|
*
|
|
51
|
-
* @UseGuards(AuthGuard({
|
|
72
|
+
* @UseGuards(AuthGuard({ permissions: ['students:create'] }))
|
|
52
73
|
* create() { } // Auth + 'students:create' permission
|
|
53
74
|
* }
|
|
54
75
|
* ```
|
|
@@ -107,7 +128,8 @@ var GuardExecutionService = class {
|
|
|
107
128
|
* @param context - Router context
|
|
108
129
|
* @param container - Request-scoped DI container
|
|
109
130
|
* @returns true if all guards pass
|
|
110
|
-
* @throws
|
|
131
|
+
* @throws {@link GuardRejectedError} if a guard's `canActivate` returns `false`, or the guard's
|
|
132
|
+
* own thrown error if it rejects by throwing instead
|
|
111
133
|
*/
|
|
112
134
|
async executeGuards(guards, context, container) {
|
|
113
135
|
if (guards.length === 0) return true;
|
|
@@ -117,11 +139,12 @@ var GuardExecutionService = class {
|
|
|
117
139
|
method: context.c.req.method
|
|
118
140
|
});
|
|
119
141
|
for (const guard of guards) if (!await this.resolveGuard(guard, container).canActivate(context)) {
|
|
142
|
+
const guardName = guard.constructor?.name || "AnonymousGuard";
|
|
120
143
|
this.logger.debug("Guard denied access", {
|
|
121
|
-
guard:
|
|
144
|
+
guard: guardName,
|
|
122
145
|
path: context.c.req.path
|
|
123
146
|
});
|
|
124
|
-
|
|
147
|
+
throw new GuardRejectedError(guardName);
|
|
125
148
|
}
|
|
126
149
|
this.logger.debug("All guards passed", {
|
|
127
150
|
guardCount: guards.length,
|
|
@@ -148,6 +171,6 @@ var GuardExecutionService = class {
|
|
|
148
171
|
}
|
|
149
172
|
};
|
|
150
173
|
//#endregion
|
|
151
|
-
export { GUARD_METADATA_KEY as a, getMethodGuards as i, UseGuards as n, getControllerGuards as r, GuardExecutionService as t };
|
|
174
|
+
export { GUARD_METADATA_KEY as a, getMethodGuards as i, UseGuards as n, GuardRejectedError as o, getControllerGuards as r, GuardExecutionService as t };
|
|
152
175
|
|
|
153
|
-
//# sourceMappingURL=guards-
|
|
176
|
+
//# sourceMappingURL=guards-DOGly9IF.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guards-DOGly9IF.mjs","names":[],"sources":["../src/guards/errors.ts","../src/guards/types.ts","../src/guards/use-guards.decorator.ts","../src/guards/guard-execution.service.ts"],"sourcesContent":["import { HttpException } from '../errors'\n\n/**\n * Thrown when a guard's `canActivate` returns `false`.\n *\n * HTTP Status: 403 Forbidden\n *\n * A guard denies by returning `false` or by throwing its own error; this class is what the\n * former becomes, so both paths surface as an exception the {@link ExceptionHandler} can render\n * and an application can match with `instanceof` or replace via `renderable()`. A guard that\n * needs a different status (401 for unauthenticated, 429 for a budget) should throw its own\n * `HttpException` instead — that is passed through untouched.\n */\nexport class GuardRejectedError extends HttpException {\n constructor(public readonly guard: string) {\n super(403, 'Forbidden')\n }\n}\n","import type { RouterContext } from '../router'\nimport type { Constructor } from '../types'\n\n/**\n * Interface for guards that control access to routes\n *\n * Guards are executed after middlewares but before route handlers.\n * They determine if a request should be allowed to proceed.\n *\n * @example\n * ```typescript\n * class RoleGuard implements CanActivate {\n * constructor(private readonly role: string) {}\n *\n * async canActivate(context: RouterContext): Promise<boolean> {\n * const user = context.getUser()\n * return user?.roles.includes(this.role) ?? false\n * }\n * }\n * ```\n */\nexport interface CanActivate {\n /**\n * Determine if the request should be allowed\n *\n * @param context - Router context with request/response helpers\n * @returns true to allow, false to deny — a `false` is turned into a `GuardRejectedError`\n * (HTTP 403) and thrown, so the handler never runs. To deny with a different status, throw your\n * own `HttpException` instead; it is passed through untouched.\n */\n canActivate(context: RouterContext): boolean | Promise<boolean>\n}\n\n/**\n * Type for guard class constructors\n */\nexport type GuardClass = Constructor<CanActivate>\n\n/**\n * Guard can be a class constructor or an instance\n * Instances are used for factory-created guards with configuration\n */\nexport type Guard = GuardClass | CanActivate\n\n/**\n * Options for AuthGuard factory\n */\nexport interface AuthGuardOptions {\n /**\n * Required permissions for authorization as `\"resource:action\"` strings.\n * If provided, permission check is performed after authentication.\n * If omitted, only authentication is required.\n *\n * Multiple permissions are combined with AND logic (all must be satisfied).\n *\n * @example\n * ```typescript\n * @UseGuards(AuthGuard({ permissions: 'posts:update' }))\n * @UseGuards(AuthGuard({ permissions: ['posts:update', 'posts:delete'] }))\n * @UseGuards(AuthGuard({ permissions: 'admin:access' }))\n * ```\n */\n permissions?: string | string[]\n}\n\n/**\n * Metadata stored by `@UseGuards` decorator\n */\nexport interface GuardMetadata {\n guards: Guard[]\n}\n\n/**\n * Metadata key for guard storage\n */\nexport const GUARD_METADATA_KEY = Symbol.for('stratal:guards')\n","import { defineMetadata, getMetadata } from '../di/metadata'\nimport { GUARD_METADATA_KEY, type Guard, type GuardMetadata } from './types'\n\n/**\n * UseGuards Decorator\n *\n * Applies one or more guards to a controller or method.\n * Guards are executed in order and all must pass for the request to proceed.\n *\n * **Execution Order:**\n * 1. Request → Global Middlewares → Route Middlewares\n * 2. **Guards (controller-level, then method-level)**\n * 3. Route Handler\n *\n * **Guard Resolution:**\n * - Guard classes are resolved from the request-scoped DI container\n * - Guard instances (from factory functions) are used directly\n *\n * @param guards - Guard classes or instances to apply\n *\n * @example Authentication only\n * ```typescript\n * @Controller('/profile', { version: '1' })\n * @UseGuards(AuthGuard())\n * export class ProfileController {\n * show() { } // Requires authentication\n * }\n * ```\n *\n * @example Authentication with permissions\n * ```typescript\n * @Controller('/students', { version: '1' })\n * @UseGuards(AuthGuard({ permissions: ['students:read'] }))\n * export class StudentsController {\n * index() { } // Requires 'students:read' permission\n * }\n * ```\n *\n * @example Method-level guards\n * ```typescript\n * @Controller('/students', { version: '1' })\n * @UseGuards(AuthGuard()) // Controller-level: auth only\n * export class StudentsController {\n * index() { } // Auth only (inherited)\n *\n * @UseGuards(AuthGuard({ permissions: ['students:create'] }))\n * create() { } // Auth + 'students:create' permission\n * }\n * ```\n *\n * @example Multiple guards\n * ```typescript\n * @UseGuards(AuthGuard(), RateLimitGuard(), CustomGuard())\n * export class SecureController {\n * // All guards must pass\n * }\n * ```\n */\nexport function UseGuards(...guards: Guard[]): ClassDecorator & MethodDecorator {\n return (target: object, propertyKey?: string | symbol) => {\n const metadata: GuardMetadata = { guards }\n\n if (propertyKey !== undefined) {\n // Method decorator - store on method\n defineMetadata(GUARD_METADATA_KEY, metadata, target, propertyKey)\n } else {\n // Class decorator - store on class\n defineMetadata(GUARD_METADATA_KEY, metadata, target)\n }\n }\n}\n\n/**\n * Get controller-level guard metadata\n *\n * @param target - Controller class\n * @returns Guard metadata or undefined if not decorated\n */\nexport function getControllerGuards(target: object): GuardMetadata | undefined {\n return getMetadata<GuardMetadata>(GUARD_METADATA_KEY, target)\n}\n\n/**\n * Get method-level guard metadata\n *\n * @param target - Controller prototype\n * @param propertyKey - Method name\n * @returns Guard metadata or undefined if not decorated\n */\nexport function getMethodGuards(target: object, propertyKey: string | symbol): GuardMetadata | undefined {\n return getMetadata<GuardMetadata>(GUARD_METADATA_KEY, target, propertyKey)\n}\n","import type { Container } from '../di'\nimport type { LoggerService } from '../logger'\nimport type { RouterContext } from '../router'\nimport { GuardRejectedError } from './errors'\nimport type { CanActivate, Guard } from './types'\n\n/**\n * Guard Execution Service\n *\n * Executes guards for a route and determines if the request should proceed.\n * Guards are executed in order; all must pass for the request to proceed.\n */\nexport class GuardExecutionService {\n constructor(private readonly logger: LoggerService) { }\n\n /**\n * Execute all guards for a route\n *\n * @param guards - Array of guards (classes or instances)\n * @param context - Router context\n * @param container - Request-scoped DI container\n * @returns true if all guards pass\n * @throws {@link GuardRejectedError} if a guard's `canActivate` returns `false`, or the guard's\n * own thrown error if it rejects by throwing instead\n */\n async executeGuards(\n guards: Guard[],\n context: RouterContext,\n container: Container\n ): Promise<boolean> {\n if (guards.length === 0) {\n return true\n }\n\n this.logger.debug('Executing guards', {\n guardCount: guards.length,\n path: context.c.req.path,\n method: context.c.req.method,\n })\n\n for (const guard of guards) {\n const guardInstance = this.resolveGuard(guard, container)\n const canActivate = await guardInstance.canActivate(context)\n\n if (!canActivate) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- guard.constructor may be null at runtime\n const guardName = guard.constructor?.name || 'AnonymousGuard'\n\n this.logger.debug('Guard denied access', {\n guard: guardName,\n path: context.c.req.path,\n })\n // Denial is an exception, not a return value: every caller awaits this without\n // branching, so a `false` that merely returned would let the handler run and the guard\n // would silently protect nothing.\n throw new GuardRejectedError(guardName)\n }\n }\n\n this.logger.debug('All guards passed', {\n guardCount: guards.length,\n path: context.c.req.path,\n })\n\n return true\n }\n\n /**\n * Resolve a guard to an instance\n *\n * @param guard - Guard class or instance\n * @param container - Request-scoped DI container\n * @returns Guard instance\n */\n private resolveGuard(guard: Guard, container: Container): CanActivate {\n // If already an instance (has canActivate method), use directly\n if (this.isGuardInstance(guard)) {\n return guard\n }\n\n // Otherwise, resolve from container\n return container.resolve<CanActivate>(guard)\n }\n\n /**\n * Type guard to check if value is a guard instance\n */\n private isGuardInstance(guard: Guard): guard is CanActivate {\n return (\n typeof guard === 'object' &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- typeof null === 'object', null check is required\n guard !== null &&\n 'canActivate' in guard &&\n typeof guard.canActivate === 'function'\n )\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAaA,IAAa,qBAAb,cAAwC,cAAc;CACxB;CAA5B,YAAY,OAA+B;EACzC,MAAM,KAAK,WAAW;EADI,KAAA,QAAA;CAE5B;AACF;;;;;;AC0DA,MAAa,qBAAqB,OAAO,IAAI,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACjB7D,SAAgB,UAAU,GAAG,QAAmD;CAC9E,QAAQ,QAAgB,gBAAkC;EACxD,MAAM,WAA0B,EAAE,OAAO;EAEzC,IAAI,gBAAgB,KAAA,GAElB,eAAe,oBAAoB,UAAU,QAAQ,WAAW;OAGhE,eAAe,oBAAoB,UAAU,MAAM;CAEvD;AACF;;;;;;;AAQA,SAAgB,oBAAoB,QAA2C;CAC7E,OAAO,YAA2B,oBAAoB,MAAM;AAC9D;;;;;;;;AASA,SAAgB,gBAAgB,QAAgB,aAAyD;CACvG,OAAO,YAA2B,oBAAoB,QAAQ,WAAW;AAC3E;;;;;;;;;AC/EA,IAAa,wBAAb,MAAmC;CACJ;CAA7B,YAAY,QAAwC;EAAvB,KAAA,SAAA;CAAyB;;;;;;;;;;;CAYtD,MAAM,cACJ,QACA,SACA,WACkB;EAClB,IAAI,OAAO,WAAW,GACpB,OAAO;EAGT,KAAK,OAAO,MAAM,oBAAoB;GACpC,YAAY,OAAO;GACnB,MAAM,QAAQ,EAAE,IAAI;GACpB,QAAQ,QAAQ,EAAE,IAAI;EACxB,CAAC;EAED,KAAK,MAAM,SAAS,QAIlB,IAAI,CAAC,MAHiB,KAAK,aAAa,OAAO,SACT,CAAC,CAAC,YAAY,OAAO,GAEzC;GAEhB,MAAM,YAAY,MAAM,aAAa,QAAQ;GAE7C,KAAK,OAAO,MAAM,uBAAuB;IACvC,OAAO;IACP,MAAM,QAAQ,EAAE,IAAI;GACtB,CAAC;GAID,MAAM,IAAI,mBAAmB,SAAS;EACxC;EAGF,KAAK,OAAO,MAAM,qBAAqB;GACrC,YAAY,OAAO;GACnB,MAAM,QAAQ,EAAE,IAAI;EACtB,CAAC;EAED,OAAO;CACT;;;;;;;;CASA,aAAqB,OAAc,WAAmC;EAEpE,IAAI,KAAK,gBAAgB,KAAK,GAC5B,OAAO;EAIT,OAAO,UAAU,QAAqB,KAAK;CAC7C;;;;CAKA,gBAAwB,OAAoC;EAC1D,OACE,OAAO,UAAU,YAEjB,UAAU,QACV,iBAAiB,SACjB,OAAO,MAAM,gBAAgB;CAEjC;AACF"}
|