theokit 0.43.12 → 0.45.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/dist/{actions-virtual-module-RSFRPJQZ.js → actions-virtual-module-67K4POQ2.js} +20 -20
- package/dist/actions-virtual-module-67K4POQ2.js.map +1 -0
- package/dist/{actions-virtual-module-HG66SZ7T.js → actions-virtual-module-LLDDAQWY.js} +4 -3
- package/dist/{actions-virtual-module-HG66SZ7T.js.map → actions-virtual-module-LLDDAQWY.js.map} +1 -1
- package/dist/adapters/web-shim.js +1 -1
- package/dist/adapters/web-shim.js.map +1 -1
- package/dist/adapters/ws-shim.js +1 -1
- package/dist/adapters/ws-shim.js.map +1 -1
- package/dist/{agent-OXRRKB55.js → agent-WFULT3OB.js} +2 -2
- package/dist/{agents-typed-client-ZP7BKJB3.js → agents-typed-client-TNHCUU7Q.js} +2 -2
- package/dist/agents-typed-client-TNHCUU7Q.js.map +1 -0
- package/dist/{app-typed-client-USLAMN7X.js → app-typed-client-N5WUE2CP.js} +62 -24
- package/dist/app-typed-client-N5WUE2CP.js.map +1 -0
- package/dist/{app-typed-client-GDF2OMJ2.js → app-typed-client-S3VR4ZA3.js} +47 -8
- package/dist/app-typed-client-S3VR4ZA3.js.map +1 -0
- package/dist/{body-parser-web-NNEJGX6Y.js → body-parser-web-4Z2QTPDU.js} +2 -2
- package/dist/body-parser-web-4Z2QTPDU.js.map +1 -0
- package/dist/boot/index.js +4 -4
- package/dist/boot/index.js.map +1 -1
- package/dist/{broadcast-4SX7R5XE.js → broadcast-H64DJRBE.js} +3 -3
- package/dist/broadcast-H64DJRBE.js.map +1 -0
- package/dist/{build-MQHIJROR.js → build-YQ6MXOV6.js} +13 -4
- package/dist/build-YQ6MXOV6.js.map +1 -0
- package/dist/{build-request-body-preview-FVBQ7LCE.js → build-request-body-preview-CKWWBF2M.js} +2 -2
- package/dist/build-request-body-preview-CKWWBF2M.js.map +1 -0
- package/dist/{chunk-26ECIX74.js → chunk-2ADKT37V.js} +5 -5
- package/dist/chunk-2ADKT37V.js.map +1 -0
- package/dist/{chunk-JIL74SFK.js → chunk-37ZO643S.js} +9 -9
- package/dist/chunk-37ZO643S.js.map +1 -0
- package/dist/{chunk-ESC54TAK.js → chunk-3DGIANAN.js} +1 -1
- package/dist/chunk-3DGIANAN.js.map +1 -0
- package/dist/{chunk-6FK7FKY6.js → chunk-47FFT43U.js} +1 -1
- package/dist/chunk-47FFT43U.js.map +1 -0
- package/dist/{chunk-ZJQ4O76G.js → chunk-4FWBKX6G.js} +1 -1
- package/dist/chunk-4FWBKX6G.js.map +1 -0
- package/dist/{chunk-NM4WF3XD.js → chunk-4PBJ266F.js} +1 -1
- package/dist/chunk-4PBJ266F.js.map +1 -0
- package/dist/{chunk-7MQOHNHE.js → chunk-52PDWL5S.js} +1 -1
- package/dist/chunk-52PDWL5S.js.map +1 -0
- package/dist/{chunk-575PAX5L.js → chunk-5AMXBU2R.js} +62 -38
- package/dist/chunk-5AMXBU2R.js.map +1 -0
- package/dist/{chunk-JQJN6LFK.js → chunk-62EU2BVZ.js} +2 -2
- package/dist/chunk-62EU2BVZ.js.map +1 -0
- package/dist/{chunk-SJIRP73B.js → chunk-646CA6RV.js} +2 -2
- package/dist/chunk-646CA6RV.js.map +1 -0
- package/dist/{chunk-ASDXVRJD.js → chunk-6KDXP472.js} +4 -4
- package/dist/chunk-6KDXP472.js.map +1 -0
- package/dist/chunk-6LNIGF5P.js +46 -0
- package/dist/chunk-6LNIGF5P.js.map +1 -0
- package/dist/{chunk-IE6C4KZX.js → chunk-6VDYQ4I6.js} +11 -496
- package/dist/chunk-6VDYQ4I6.js.map +1 -0
- package/dist/chunk-7IHWXDJJ.js +1 -0
- package/dist/chunk-7IHWXDJJ.js.map +1 -0
- package/dist/{chunk-JQSKBMXP.js → chunk-7LVM22VG.js} +1 -1
- package/dist/chunk-7LVM22VG.js.map +1 -0
- package/dist/{chunk-UVXB2ER7.js → chunk-7SABX4DJ.js} +1 -1
- package/dist/chunk-7SABX4DJ.js.map +1 -0
- package/dist/{chunk-X32XEJXR.js → chunk-ACKBVBUI.js} +1 -1
- package/dist/chunk-ACKBVBUI.js.map +1 -0
- package/dist/{chunk-UUFYP2UM.js → chunk-AM3QABW5.js} +3 -3
- package/dist/chunk-AM3QABW5.js.map +1 -0
- package/dist/{chunk-FH3DYBAN.js → chunk-ANS4ELRH.js} +1 -1
- package/dist/chunk-ANS4ELRH.js.map +1 -0
- package/dist/{chunk-UD3LFGDL.js → chunk-AVQU5CQF.js} +1 -1
- package/dist/chunk-AVQU5CQF.js.map +1 -0
- package/dist/{chunk-CJNMJUHE.js → chunk-B7ONQ4QJ.js} +2 -2
- package/dist/{chunk-WSJKACWB.js → chunk-C34PMLSN.js} +1 -1
- package/dist/chunk-C34PMLSN.js.map +1 -0
- package/dist/{chunk-DJFMAWH5.js → chunk-EIRQM55C.js} +6 -5
- package/dist/chunk-EIRQM55C.js.map +1 -0
- package/dist/{chunk-ZEGYW52B.js → chunk-FB2HBNIC.js} +1 -1
- package/dist/chunk-FB2HBNIC.js.map +1 -0
- package/dist/chunk-FXZZS7YW.js +605 -0
- package/dist/chunk-FXZZS7YW.js.map +1 -0
- package/dist/{chunk-HGUZWG2C.js → chunk-FZG3JYB3.js} +8 -47
- package/dist/chunk-FZG3JYB3.js.map +1 -0
- package/dist/{chunk-V3LJN2GS.js → chunk-GAPBPRPP.js} +1 -1
- package/dist/chunk-GAPBPRPP.js.map +1 -0
- package/dist/chunk-GUBN5UTT.js +1 -0
- package/dist/chunk-GUBN5UTT.js.map +1 -0
- package/dist/{chunk-6OXCZMW3.js → chunk-HEK4SET7.js} +5 -5
- package/dist/chunk-HEK4SET7.js.map +1 -0
- package/dist/{chunk-N2D5AVRR.js → chunk-HRCNHWLP.js} +7 -109
- package/dist/chunk-HRCNHWLP.js.map +1 -0
- package/dist/{chunk-C3ZZ56YZ.js → chunk-JA2ZAT5Q.js} +1 -1
- package/dist/chunk-JA2ZAT5Q.js.map +1 -0
- package/dist/{chunk-L2S2R3TI.js → chunk-KBGGQK4I.js} +25 -8
- package/dist/chunk-KBGGQK4I.js.map +1 -0
- package/dist/{chunk-VPISAMXU.js → chunk-KD5G3YXI.js} +4 -4
- package/dist/chunk-KD5G3YXI.js.map +1 -0
- package/dist/{chunk-VMEWD57H.js → chunk-KPKLIUUL.js} +1 -1
- package/dist/chunk-KPKLIUUL.js.map +1 -0
- package/dist/{chunk-4HAU7AJM.js → chunk-L4Y6RJ4E.js} +3 -3
- package/dist/chunk-L4Y6RJ4E.js.map +1 -0
- package/dist/{chunk-OVHW23YC.js → chunk-L5Z6IY5U.js} +5 -5
- package/dist/chunk-L5Z6IY5U.js.map +1 -0
- package/dist/{chunk-JBCHWRKF.js → chunk-MTEWLGVY.js} +2 -2
- package/dist/chunk-MTEWLGVY.js.map +1 -0
- package/dist/{chunk-XZ6B2Y2R.js → chunk-MWP4YXWJ.js} +1 -1
- package/dist/chunk-MWP4YXWJ.js.map +1 -0
- package/dist/{chunk-5QW7IQQU.js → chunk-NTDN54XO.js} +1 -1
- package/dist/chunk-NTDN54XO.js.map +1 -0
- package/dist/{chunk-7BIM27LV.js → chunk-OIGJOYX6.js} +1 -1
- package/dist/chunk-OIGJOYX6.js.map +1 -0
- package/dist/{chunk-TSLSIRBR.js → chunk-OLGPYOLO.js} +2 -2
- package/dist/chunk-OLGPYOLO.js.map +1 -0
- package/dist/{chunk-6NEXVBPY.js → chunk-RWNSW4FM.js} +1 -1
- package/dist/chunk-RWNSW4FM.js.map +1 -0
- package/dist/{chunk-E25FBYJP.js → chunk-SAFGDIPQ.js} +1 -1
- package/dist/chunk-SAFGDIPQ.js.map +1 -0
- package/dist/{chunk-OP7QCTR5.js → chunk-SEELKQUM.js} +2 -2
- package/dist/chunk-SEELKQUM.js.map +1 -0
- package/dist/{chunk-4B2ZMX45.js → chunk-SSYDEKWF.js} +1 -1
- package/dist/chunk-SSYDEKWF.js.map +1 -0
- package/dist/{chunk-DQVBL2G4.js → chunk-SZU6BOMV.js} +75 -53
- package/dist/chunk-SZU6BOMV.js.map +1 -0
- package/dist/{chunk-65EFIUDD.js → chunk-U267AOWS.js} +1 -1
- package/dist/chunk-U267AOWS.js.map +1 -0
- package/dist/{chunk-FX72VHAE.js → chunk-U3H53IIN.js} +6 -6
- package/dist/chunk-U3H53IIN.js.map +1 -0
- package/dist/{chunk-OPLICDUB.js → chunk-UW2TEAGR.js} +1 -1
- package/dist/chunk-UW2TEAGR.js.map +1 -0
- package/dist/{chunk-2WH6SD3C.js → chunk-UYMCKHML.js} +4 -4
- package/dist/chunk-UYMCKHML.js.map +1 -0
- package/dist/{chunk-OI6DK6ZJ.js → chunk-VFU7DTUL.js} +6 -4
- package/dist/chunk-VFU7DTUL.js.map +1 -0
- package/dist/{chunk-IAJ2JVEH.js → chunk-VSLTKX5L.js} +1 -1
- package/dist/chunk-VSLTKX5L.js.map +1 -0
- package/dist/{chunk-YB5DJJ4U.js → chunk-VZTYCAO6.js} +1 -1
- package/dist/chunk-VZTYCAO6.js.map +1 -0
- package/dist/chunk-WDGYCBNI.js +65 -0
- package/dist/chunk-WDGYCBNI.js.map +1 -0
- package/dist/chunk-WPJOTQA5.js +1 -0
- package/dist/chunk-WPJOTQA5.js.map +1 -0
- package/dist/{chunk-DGUM43GV.js → chunk-XTHN6JBX.js} +1 -1
- package/dist/chunk-XTHN6JBX.js.map +1 -0
- package/dist/{chunk-HZ6USUHC.js → chunk-YOIVCCZT.js} +1 -1
- package/dist/chunk-YOIVCCZT.js.map +1 -0
- package/dist/cli/index.js +8 -8
- package/dist/client/core.d.ts +5 -259
- package/dist/client/core.js +13 -9
- package/dist/client/core.js.map +1 -1
- package/dist/client/index.d.ts +7 -96
- package/dist/client/index.js +19 -67
- package/dist/client/index.js.map +1 -1
- package/dist/{controller-swc-transform-JJRMTSDY.js → controller-swc-transform-T7ZTD55V.js} +2 -2
- package/dist/controller-swc-transform-T7ZTD55V.js.map +1 -0
- package/dist/{cookies-MJKMGJ7N.js → cookies-SOXUQJXG.js} +3 -3
- package/dist/cookies-SOXUQJXG.js.map +1 -0
- package/dist/{dev-WQ4LWCAW.js → dev-YNO26JS3.js} +8 -7
- package/dist/{dev-WQ4LWCAW.js.map → dev-YNO26JS3.js.map} +1 -1
- package/dist/{dev-emit-HLGJK3PP.js → dev-emit-F54Y5TIU.js} +5 -5
- package/dist/dev-emit-F54Y5TIU.js.map +1 -0
- package/dist/devtools/entry.js +61 -53
- package/dist/devtools/entry.js.map +1 -1
- package/dist/dispatcher-MXKF3CRH.js +8 -0
- package/dist/dispatcher-MXKF3CRH.js.map +1 -0
- package/dist/index.js +25 -25
- package/dist/index.js.map +1 -1
- package/dist/{info-75U6GCMD.js → info-ICDTPJDC.js} +3 -3
- package/dist/{internal-api-JFORKYLR.js → internal-api-NO24QAXC.js} +10 -8
- package/dist/{internal-api-DV3H5NNV.js → internal-api-S7WK2WCY.js} +20 -20
- package/dist/internal-api-S7WK2WCY.js.map +1 -0
- package/dist/{load-config-XP7NSSA7.js → load-config-ICCNMO74.js} +3 -3
- package/dist/{mcp-FF3NTCHB.js → mcp-3S6A4A4Q.js} +3 -3
- package/dist/{openapi-ZPXYRAM2.js → openapi-NIYA2VBG.js} +3 -3
- package/dist/react-query/index.js +2 -2
- package/dist/react-query/index.js.map +1 -1
- package/dist/{routes-ZVDKABXZ.js → routes-2RD4S5PZ.js} +3 -3
- package/dist/{schema-FBOTN46F.js → schema-S553QCAU.js} +2 -2
- package/dist/server/agent/index.d.ts +3 -72
- package/dist/server/agent/index.js +4 -4
- package/dist/server/agent/index.js.map +1 -1
- package/dist/server/auth/index.js +4 -4
- package/dist/server/auth/index.js.map +1 -1
- package/dist/server/cost/index.js +2 -2
- package/dist/server/cost/index.js.map +1 -1
- package/dist/server/cron/index.js +6 -6
- package/dist/server/cron/index.js.map +1 -1
- package/dist/server/define/index.d.ts +2 -2
- package/dist/server/define/index.js +4 -4
- package/dist/server/define/index.js.map +1 -1
- package/dist/server/http/index.js +11 -11
- package/dist/server/http/index.js.map +1 -1
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.js +41 -41
- package/dist/server/index.js.map +1 -1
- package/dist/server/jobs/index.js +7 -7
- package/dist/server/jobs/index.js.map +1 -1
- package/dist/server/observability/index.d.ts +8 -1
- package/dist/server/observability/index.js +5 -5
- package/dist/server/observability/index.js.map +1 -1
- package/dist/server/plugins/index.js +3 -3
- package/dist/server/plugins/index.js.map +1 -1
- package/dist/server/rate-limit/index.js +4 -4
- package/dist/server/rate-limit/index.js.map +1 -1
- package/dist/server/realtime/index.js +2 -2
- package/dist/server/realtime/index.js.map +1 -1
- package/dist/server/scan/index.js +7 -7
- package/dist/server/scan/index.js.map +1 -1
- package/dist/server/security/index.js +5 -5
- package/dist/server/security/index.js.map +1 -1
- package/dist/server/storage/index.js +2 -2
- package/dist/server/storage/index.js.map +1 -1
- package/dist/server/webhook/index.js +3 -3
- package/dist/server/webhook/index.js.map +1 -1
- package/dist/server-error-to-envelope-UM7DEVM4.js +8 -0
- package/dist/server-error-to-envelope-UM7DEVM4.js.map +1 -0
- package/dist/{server-routes-hmr-RI7SYNT2.js → server-routes-hmr-6CRNSEWF.js} +2 -2
- package/dist/server-routes-hmr-6CRNSEWF.js.map +1 -0
- package/dist/{services-typed-client-AU6DKXAO.js → services-typed-client-IXNOPVZA.js} +3 -3
- package/dist/services-typed-client-IXNOPVZA.js.map +1 -0
- package/dist/{start-2U3FUCJX.js → start-TVT7BZ4V.js} +35 -11
- package/dist/start-TVT7BZ4V.js.map +1 -0
- package/dist/vite-plugin/index.js +25 -25
- package/dist/vite-plugin/index.js.map +1 -1
- package/dist/{vite-plugin-D2NTPZNC.js → vite-plugin-K64KQZSU.js} +8 -7
- package/package.json +11 -10
- package/dist/actions-virtual-module-RSFRPJQZ.js.map +0 -1
- package/dist/agents-typed-client-ZP7BKJB3.js.map +0 -1
- package/dist/app-typed-client-GDF2OMJ2.js.map +0 -1
- package/dist/app-typed-client-USLAMN7X.js.map +0 -1
- package/dist/body-parser-web-NNEJGX6Y.js.map +0 -1
- package/dist/build-MQHIJROR.js.map +0 -1
- package/dist/build-request-body-preview-FVBQ7LCE.js.map +0 -1
- package/dist/chunk-26ECIX74.js.map +0 -1
- package/dist/chunk-2WH6SD3C.js.map +0 -1
- package/dist/chunk-4B2ZMX45.js.map +0 -1
- package/dist/chunk-4HAU7AJM.js.map +0 -1
- package/dist/chunk-575PAX5L.js.map +0 -1
- package/dist/chunk-5QW7IQQU.js.map +0 -1
- package/dist/chunk-65EFIUDD.js.map +0 -1
- package/dist/chunk-6FK7FKY6.js.map +0 -1
- package/dist/chunk-6NEXVBPY.js.map +0 -1
- package/dist/chunk-6OXCZMW3.js.map +0 -1
- package/dist/chunk-7BIM27LV.js.map +0 -1
- package/dist/chunk-7MQOHNHE.js.map +0 -1
- package/dist/chunk-ASDXVRJD.js.map +0 -1
- package/dist/chunk-C3ZZ56YZ.js.map +0 -1
- package/dist/chunk-DJFMAWH5.js.map +0 -1
- package/dist/chunk-DQVBL2G4.js.map +0 -1
- package/dist/chunk-E25FBYJP.js.map +0 -1
- package/dist/chunk-E3JH6YUM.js +0 -1
- package/dist/chunk-ESC54TAK.js.map +0 -1
- package/dist/chunk-FH3DYBAN.js.map +0 -1
- package/dist/chunk-FX72VHAE.js.map +0 -1
- package/dist/chunk-HGUZWG2C.js.map +0 -1
- package/dist/chunk-HZ6USUHC.js.map +0 -1
- package/dist/chunk-IAJ2JVEH.js.map +0 -1
- package/dist/chunk-IE6C4KZX.js.map +0 -1
- package/dist/chunk-JBCHWRKF.js.map +0 -1
- package/dist/chunk-JHEAWR3L.js +0 -1
- package/dist/chunk-JIL74SFK.js.map +0 -1
- package/dist/chunk-JQJN6LFK.js.map +0 -1
- package/dist/chunk-JQSKBMXP.js.map +0 -1
- package/dist/chunk-KPRJS3II.js +0 -505
- package/dist/chunk-KPRJS3II.js.map +0 -1
- package/dist/chunk-L2S2R3TI.js.map +0 -1
- package/dist/chunk-N2D5AVRR.js.map +0 -1
- package/dist/chunk-NM4WF3XD.js.map +0 -1
- package/dist/chunk-NPMCKOX4.js +0 -1
- package/dist/chunk-NPMCKOX4.js.map +0 -1
- package/dist/chunk-OI6DK6ZJ.js.map +0 -1
- package/dist/chunk-OP7QCTR5.js.map +0 -1
- package/dist/chunk-OPLICDUB.js.map +0 -1
- package/dist/chunk-OVHW23YC.js.map +0 -1
- package/dist/chunk-SJIRP73B.js.map +0 -1
- package/dist/chunk-TSLSIRBR.js.map +0 -1
- package/dist/chunk-UD3LFGDL.js.map +0 -1
- package/dist/chunk-UUFYP2UM.js.map +0 -1
- package/dist/chunk-UVXB2ER7.js.map +0 -1
- package/dist/chunk-V3LJN2GS.js.map +0 -1
- package/dist/chunk-VMEWD57H.js.map +0 -1
- package/dist/chunk-VPISAMXU.js.map +0 -1
- package/dist/chunk-WSJKACWB.js.map +0 -1
- package/dist/chunk-X32XEJXR.js.map +0 -1
- package/dist/chunk-XZ6B2Y2R.js.map +0 -1
- package/dist/chunk-YB5DJJ4U.js.map +0 -1
- package/dist/chunk-ZEGYW52B.js.map +0 -1
- package/dist/chunk-ZJQ4O76G.js.map +0 -1
- package/dist/controller-swc-transform-JJRMTSDY.js.map +0 -1
- package/dist/cookies-MJKMGJ7N.js.map +0 -1
- package/dist/dev-emit-HLGJK3PP.js.map +0 -1
- package/dist/dispatcher-DLKIXYNO.js +0 -8
- package/dist/dispatcher-DLKIXYNO.js.map +0 -1
- package/dist/internal-api-DV3H5NNV.js.map +0 -1
- package/dist/internal-api-JFORKYLR.js.map +0 -1
- package/dist/load-config-XP7NSSA7.js.map +0 -1
- package/dist/schema-FBOTN46F.js.map +0 -1
- package/dist/server-error-to-envelope-EOFUIUNB.js +0 -8
- package/dist/server-error-to-envelope-EOFUIUNB.js.map +0 -1
- package/dist/server-routes-hmr-RI7SYNT2.js.map +0 -1
- package/dist/services-typed-client-AU6DKXAO.js.map +0 -1
- package/dist/start-2U3FUCJX.js.map +0 -1
- package/dist/vite-plugin-D2NTPZNC.js.map +0 -1
- /package/dist/{agent-OXRRKB55.js.map → agent-WFULT3OB.js.map} +0 -0
- /package/dist/{chunk-CJNMJUHE.js.map → chunk-B7ONQ4QJ.js.map} +0 -0
- /package/dist/{info-75U6GCMD.js.map → info-ICDTPJDC.js.map} +0 -0
- /package/dist/{broadcast-4SX7R5XE.js.map → internal-api-NO24QAXC.js.map} +0 -0
- /package/dist/{chunk-DGUM43GV.js.map → load-config-ICCNMO74.js.map} +0 -0
- /package/dist/{mcp-FF3NTCHB.js.map → mcp-3S6A4A4Q.js.map} +0 -0
- /package/dist/{openapi-ZPXYRAM2.js.map → openapi-NIYA2VBG.js.map} +0 -0
- /package/dist/{routes-ZVDKABXZ.js.map → routes-2RD4S5PZ.js.map} +0 -0
- /package/dist/{chunk-E3JH6YUM.js.map → schema-S553QCAU.js.map} +0 -0
- /package/dist/{chunk-JHEAWR3L.js.map → vite-plugin-K64KQZSU.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/server/rate-limit/rate-limit-per-route.ts"],"mappings":"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","names":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import "tsx/esm";
|
|
3
|
+
import {
|
|
4
|
+
findControllerFiles
|
|
5
|
+
} from "./chunk-FXZZS7YW.js";
|
|
6
|
+
|
|
7
|
+
// src/cli/commands/build/emit-controllers.ts
|
|
8
|
+
import { mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
9
|
+
import { basename, dirname, join, relative, resolve } from "path";
|
|
10
|
+
import { transformControllerSource } from "@theokit/http";
|
|
11
|
+
var CONTROLLER_MANIFEST_FILE = "controllers.json";
|
|
12
|
+
var CONTROLLER_OUT_DIR = "controllers";
|
|
13
|
+
async function emitControllerArtifacts(opts) {
|
|
14
|
+
const controllersDir = resolve(opts.serverDir, CONTROLLER_OUT_DIR);
|
|
15
|
+
const files = findControllerFiles(controllersDir);
|
|
16
|
+
if (files.length === 0) return null;
|
|
17
|
+
const outDir = resolve(opts.distDir, CONTROLLER_OUT_DIR);
|
|
18
|
+
mkdirSync(outDir, { recursive: true });
|
|
19
|
+
const modules = [];
|
|
20
|
+
for (const file of files) {
|
|
21
|
+
const code = await transformControllerSource(readFileSync(file, "utf-8"), file);
|
|
22
|
+
const rel = relative(controllersDir, file).replace(/\.controller\.ts$/, ".controller.mjs");
|
|
23
|
+
const outPath = join(outDir, rel);
|
|
24
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
25
|
+
writeFileSync(outPath, code);
|
|
26
|
+
modules.push(`${CONTROLLER_OUT_DIR}/${rel.split("\\").join("/")}`);
|
|
27
|
+
}
|
|
28
|
+
const manifest = { version: 1, modules };
|
|
29
|
+
writeFileSync(
|
|
30
|
+
resolve(opts.distDir, CONTROLLER_MANIFEST_FILE),
|
|
31
|
+
JSON.stringify(manifest, null, 2) + "\n"
|
|
32
|
+
);
|
|
33
|
+
return manifest;
|
|
34
|
+
}
|
|
35
|
+
function describeControllerArtifacts(manifest) {
|
|
36
|
+
if (manifest === null) return "controllers: none";
|
|
37
|
+
const names = manifest.modules.map((m) => basename(m, ".mjs")).join(", ");
|
|
38
|
+
return `controllers: ${manifest.modules.length} compiled (${names})`;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export {
|
|
42
|
+
CONTROLLER_MANIFEST_FILE,
|
|
43
|
+
emitControllerArtifacts,
|
|
44
|
+
describeControllerArtifacts
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=chunk-6LNIGF5P.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/commands/build/emit-controllers.ts"],"sourcesContent":["import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { basename, dirname, join, relative, resolve } from 'node:path'\n\nimport { transformControllerSource } from '@theokit/http'\n\nimport { findControllerFiles } from '../../../server/http/controller-dispatch.js'\n\n/**\n * theokit#123 — compile `server/controllers/**` into `dist` so production can serve them.\n *\n * ## Why production needed anything at all\n *\n * #122 made decorator controllers first-class in `theokit dev`, where a Vite `enforce:'pre'` swc\n * transform compiles them on the fly — parameter decorators (`@Body`/`@Param`/`@Query`) emit\n * metadata esbuild cannot produce. `theokit start` has no Vite and no transform, so an uncompiled\n * `.controller.ts` simply cannot load, and controller routes 404'd in production while working in\n * dev. That split is the whole issue.\n *\n * ## Why compile at BUILD time rather than load with swc at runtime\n *\n * `loadControllerWithSwc` would work in production and was the smaller diff. It is refused on\n * purpose: `@swc/core` is a peer dependency and a native binary, so that path makes every deployed\n * app carry a compiler it only needs once, and turns a missing optional peer into a runtime 404\n * instead of a build failure. Compilation belongs where the rest of the build already is — and it\n * is what the issue's root-cause note asks for.\n *\n * ## Why NOT in `generateManifest`\n *\n * ADR-5 keeps controllers out of the manifest, and that is preserved here: the manifest is the\n * deploy-adapter contract, and adding a parallel route source to it would ripple through every\n * adapter. This emits a SEPARATE artifact (`dist/controllers.json` + `dist/controllers/*.mjs`) that\n * only the Node start path reads. An adapter that knows nothing about controllers keeps working\n * exactly as before.\n */\n\n/** The build artifact `theokit start` reads to find compiled controllers. */\nexport interface ControllerBuildManifest {\n version: 1\n /** Emitted module paths, relative to `distDir`, in scan order. */\n modules: string[]\n}\n\nexport const CONTROLLER_MANIFEST_FILE = 'controllers.json'\nconst CONTROLLER_OUT_DIR = 'controllers'\n\n/**\n * Compile every controller under `<serverDir>/controllers` into `<distDir>/controllers`.\n *\n * No controllers ⇒ **no artifact at all** (not an empty one). `theokit start` treats a missing\n * manifest as \"this app has no controllers\" and skips the whole branch, so a routes-only app pays\n * nothing and its `dist` is byte-identical to before — the ADR-5 posture, kept.\n */\nexport async function emitControllerArtifacts(opts: {\n serverDir: string\n distDir: string\n}): Promise<ControllerBuildManifest | null> {\n const controllersDir = resolve(opts.serverDir, CONTROLLER_OUT_DIR)\n const files = findControllerFiles(controllersDir)\n if (files.length === 0) return null\n\n const outDir = resolve(opts.distDir, CONTROLLER_OUT_DIR)\n mkdirSync(outDir, { recursive: true })\n\n const modules: string[] = []\n for (const file of files) {\n // Errors are NOT caught. A controller that fails to compile must fail the BUILD — swallowing it\n // here would ship an app whose routes 404 at runtime with nothing pointing back at the cause,\n // which is the exact failure mode this issue reports (error-handling.md § 2).\n const code = await transformControllerSource(readFileSync(file, 'utf-8'), file)\n\n // Mirror the source tree under `dist/controllers` so two files with the same basename in\n // different folders cannot overwrite each other.\n const rel = relative(controllersDir, file).replace(/\\.controller\\.ts$/, '.controller.mjs')\n const outPath = join(outDir, rel)\n mkdirSync(dirname(outPath), { recursive: true })\n writeFileSync(outPath, code)\n modules.push(`${CONTROLLER_OUT_DIR}/${rel.split('\\\\').join('/')}`)\n }\n\n const manifest: ControllerBuildManifest = { version: 1, modules }\n writeFileSync(\n resolve(opts.distDir, CONTROLLER_MANIFEST_FILE),\n JSON.stringify(manifest, null, 2) + '\\n',\n )\n return manifest\n}\n\n/** Human-facing summary for the build log (mirrors the cron/job emitters). */\nexport function describeControllerArtifacts(manifest: ControllerBuildManifest | null): string {\n if (manifest === null) return 'controllers: none'\n const names = manifest.modules.map((m) => basename(m, '.mjs')).join(', ')\n return `controllers: ${manifest.modules.length} compiled (${names})`\n}\n"],"mappings":";;;;;;;AAAA,SAAS,WAAW,cAAc,qBAAqB;AACvD,SAAS,UAAU,SAAS,MAAM,UAAU,eAAe;AAE3D,SAAS,iCAAiC;AAuCnC,IAAM,2BAA2B;AACxC,IAAM,qBAAqB;AAS3B,eAAsB,wBAAwB,MAGF;AAC1C,QAAM,iBAAiB,QAAQ,KAAK,WAAW,kBAAkB;AACjE,QAAM,QAAQ,oBAAoB,cAAc;AAChD,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,QAAM,SAAS,QAAQ,KAAK,SAAS,kBAAkB;AACvD,YAAU,QAAQ,EAAE,WAAW,KAAK,CAAC;AAErC,QAAM,UAAoB,CAAC;AAC3B,aAAW,QAAQ,OAAO;AAIxB,UAAM,OAAO,MAAM,0BAA0B,aAAa,MAAM,OAAO,GAAG,IAAI;AAI9E,UAAM,MAAM,SAAS,gBAAgB,IAAI,EAAE,QAAQ,qBAAqB,iBAAiB;AACzF,UAAM,UAAU,KAAK,QAAQ,GAAG;AAChC,cAAU,QAAQ,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AAC/C,kBAAc,SAAS,IAAI;AAC3B,YAAQ,KAAK,GAAG,kBAAkB,IAAI,IAAI,MAAM,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;AAAA,EACnE;AAEA,QAAM,WAAoC,EAAE,SAAS,GAAG,QAAQ;AAChE;AAAA,IACE,QAAQ,KAAK,SAAS,wBAAwB;AAAA,IAC9C,KAAK,UAAU,UAAU,MAAM,CAAC,IAAI;AAAA,EACtC;AACA,SAAO;AACT;AAGO,SAAS,4BAA4B,UAAkD;AAC5F,MAAI,aAAa,KAAM,QAAO;AAC9B,QAAM,QAAQ,SAAS,QAAQ,IAAI,CAAC,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,KAAK,IAAI;AACxE,SAAO,gBAAgB,SAAS,QAAQ,MAAM,cAAc,KAAK;AACnE;","names":[]}
|
|
@@ -3,384 +3,21 @@ import "tsx/esm";
|
|
|
3
3
|
import {
|
|
4
4
|
getApprovalRegistry
|
|
5
5
|
} from "./chunk-TDNNBLGW.js";
|
|
6
|
+
import {
|
|
7
|
+
dispatchCsrfWarn,
|
|
8
|
+
enforceCsrf,
|
|
9
|
+
incomingMessageToHandlerRequest,
|
|
10
|
+
parseRequestBody,
|
|
11
|
+
sendError,
|
|
12
|
+
sendJson,
|
|
13
|
+
validateCsrfRequest,
|
|
14
|
+
warnOnce
|
|
15
|
+
} from "./chunk-FXZZS7YW.js";
|
|
6
16
|
import {
|
|
7
17
|
TheoError,
|
|
8
18
|
serverErrorToEnvelope
|
|
9
19
|
} from "./chunk-HGZL5EOI.js";
|
|
10
20
|
|
|
11
|
-
// src/server/body-parser.ts
|
|
12
|
-
import { basename } from "path";
|
|
13
|
-
import Busboy from "busboy";
|
|
14
|
-
var METHODS_WITH_BODY = /* @__PURE__ */ new Set(["POST", "PUT", "PATCH"]);
|
|
15
|
-
var DEFAULT_MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
16
|
-
var DEFAULT_MAX_FILES = 10;
|
|
17
|
-
var DEFAULT_MAX_FIELD_SIZE = 1 * 1024 * 1024;
|
|
18
|
-
var FileTooLargeError = class extends Error {
|
|
19
|
-
constructor(message, truncatedFilenames, maxFileSize) {
|
|
20
|
-
super(message);
|
|
21
|
-
this.truncatedFilenames = truncatedFilenames;
|
|
22
|
-
this.maxFileSize = maxFileSize;
|
|
23
|
-
this.name = "FileTooLargeError";
|
|
24
|
-
}
|
|
25
|
-
truncatedFilenames;
|
|
26
|
-
maxFileSize;
|
|
27
|
-
code = "FILE_TOO_LARGE";
|
|
28
|
-
status = 413;
|
|
29
|
-
};
|
|
30
|
-
function stashBodyPreview(req, body) {
|
|
31
|
-
try {
|
|
32
|
-
;
|
|
33
|
-
req[DEVTOOLS_BODY_PREVIEW] = body;
|
|
34
|
-
} catch {
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function parseJsonBody(req) {
|
|
38
|
-
return new Promise((resolve, reject) => {
|
|
39
|
-
const chunks = [];
|
|
40
|
-
req.on("data", (chunk) => chunks.push(chunk));
|
|
41
|
-
req.on("end", () => {
|
|
42
|
-
const raw = Buffer.concat(chunks).toString();
|
|
43
|
-
if (!raw) {
|
|
44
|
-
resolve(void 0);
|
|
45
|
-
return;
|
|
46
|
-
}
|
|
47
|
-
try {
|
|
48
|
-
resolve(JSON.parse(raw));
|
|
49
|
-
} catch {
|
|
50
|
-
reject(new Error("Invalid JSON body"));
|
|
51
|
-
}
|
|
52
|
-
});
|
|
53
|
-
req.on("error", reject);
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
function parseMultipartBody(req, contentType, options) {
|
|
57
|
-
if (!contentType.includes("boundary=")) {
|
|
58
|
-
return Promise.reject(new Error("Missing multipart boundary"));
|
|
59
|
-
}
|
|
60
|
-
return new Promise((resolve, reject) => {
|
|
61
|
-
const fields = {};
|
|
62
|
-
const files = [];
|
|
63
|
-
const truncatedFilenames = [];
|
|
64
|
-
let fileCount = 0;
|
|
65
|
-
const bb = Busboy({
|
|
66
|
-
headers: req.headers,
|
|
67
|
-
limits: {
|
|
68
|
-
fileSize: options.maxFileSize,
|
|
69
|
-
files: options.maxFiles,
|
|
70
|
-
fieldSize: options.maxFieldSize
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
bb.on("field", (name, value) => {
|
|
74
|
-
fields[name] = value;
|
|
75
|
-
});
|
|
76
|
-
bb.on(
|
|
77
|
-
"file",
|
|
78
|
-
(fieldname, stream, info) => {
|
|
79
|
-
fileCount++;
|
|
80
|
-
if (fileCount > options.maxFiles) {
|
|
81
|
-
stream.resume();
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
const safeName = basename(info.filename || "unnamed");
|
|
85
|
-
const chunks = [];
|
|
86
|
-
let size = 0;
|
|
87
|
-
let truncated = false;
|
|
88
|
-
stream.on("data", (chunk) => {
|
|
89
|
-
size += chunk.length;
|
|
90
|
-
if (size > options.maxFileSize) {
|
|
91
|
-
truncated = true;
|
|
92
|
-
stream.resume();
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
chunks.push(chunk);
|
|
96
|
-
});
|
|
97
|
-
stream.on("end", () => {
|
|
98
|
-
if (truncated) {
|
|
99
|
-
truncatedFilenames.push(safeName);
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
const buffer = Buffer.concat(chunks);
|
|
103
|
-
files.push({
|
|
104
|
-
fieldname,
|
|
105
|
-
filename: safeName,
|
|
106
|
-
encoding: info.encoding,
|
|
107
|
-
mimeType: info.mimeType,
|
|
108
|
-
buffer,
|
|
109
|
-
size: buffer.length
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
}
|
|
113
|
-
);
|
|
114
|
-
bb.on("filesLimit", () => {
|
|
115
|
-
reject(new Error(`Too many files. Maximum: ${options.maxFiles}`));
|
|
116
|
-
});
|
|
117
|
-
bb.on("error", (err) => {
|
|
118
|
-
reject(err);
|
|
119
|
-
});
|
|
120
|
-
bb.on("close", () => {
|
|
121
|
-
if (truncatedFilenames.length > 0) {
|
|
122
|
-
reject(
|
|
123
|
-
new FileTooLargeError(
|
|
124
|
-
`File too large (max ${options.maxFileSize} bytes): ${truncatedFilenames.join(", ")}`,
|
|
125
|
-
truncatedFilenames,
|
|
126
|
-
options.maxFileSize
|
|
127
|
-
)
|
|
128
|
-
);
|
|
129
|
-
return;
|
|
130
|
-
}
|
|
131
|
-
resolve({ fields, files });
|
|
132
|
-
});
|
|
133
|
-
req.pipe(bb);
|
|
134
|
-
});
|
|
135
|
-
}
|
|
136
|
-
var DEVTOOLS_BODY_PREVIEW = /* @__PURE__ */ Symbol("theo:devtools:bodyPreview");
|
|
137
|
-
async function parseRequestBody(req, options) {
|
|
138
|
-
const method = req.method?.toUpperCase() ?? "GET";
|
|
139
|
-
if (!METHODS_WITH_BODY.has(method)) {
|
|
140
|
-
return { fields: {}, files: [], json: void 0 };
|
|
141
|
-
}
|
|
142
|
-
const contentType = req.headers["content-type"] ?? "";
|
|
143
|
-
if (contentType.includes("application/json")) {
|
|
144
|
-
const json = await parseJsonBody(req);
|
|
145
|
-
stashBodyPreview(req, json);
|
|
146
|
-
return { fields: {}, files: [], json };
|
|
147
|
-
}
|
|
148
|
-
if (contentType.includes("multipart/form-data")) {
|
|
149
|
-
const limits = {
|
|
150
|
-
maxFileSize: options?.maxFileSize ?? DEFAULT_MAX_FILE_SIZE,
|
|
151
|
-
maxFiles: options?.maxFiles ?? DEFAULT_MAX_FILES,
|
|
152
|
-
maxFieldSize: options?.maxFieldSize ?? DEFAULT_MAX_FIELD_SIZE
|
|
153
|
-
};
|
|
154
|
-
const { fields, files } = await parseMultipartBody(req, contentType, limits);
|
|
155
|
-
stashBodyPreview(req, {
|
|
156
|
-
fields,
|
|
157
|
-
files: files.map((f) => ({
|
|
158
|
-
fieldname: f.fieldname,
|
|
159
|
-
filename: f.filename,
|
|
160
|
-
mimeType: f.mimeType,
|
|
161
|
-
size: f.size
|
|
162
|
-
}))
|
|
163
|
-
});
|
|
164
|
-
return { fields, files };
|
|
165
|
-
}
|
|
166
|
-
if (!contentType) {
|
|
167
|
-
return { fields: {}, files: [] };
|
|
168
|
-
}
|
|
169
|
-
throw new Error(`Unsupported Content-Type: ${contentType}`);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// src/server/observability/request-log.ts
|
|
173
|
-
var defaultLoggerFn = (log) => {
|
|
174
|
-
console.log(JSON.stringify(log));
|
|
175
|
-
};
|
|
176
|
-
function logRequest(info, customLogger, req) {
|
|
177
|
-
const log = {
|
|
178
|
-
level: "info",
|
|
179
|
-
...info,
|
|
180
|
-
timestamp: (/* @__PURE__ */ new Date()).toISOString()
|
|
181
|
-
};
|
|
182
|
-
const logger = customLogger ?? defaultLoggerFn;
|
|
183
|
-
logger(log);
|
|
184
|
-
broadcastRequestToDevtools(info, req);
|
|
185
|
-
}
|
|
186
|
-
function randomRequestId() {
|
|
187
|
-
return `req-${String(Date.now())}-${Math.random().toString(36).slice(2, 8)}`;
|
|
188
|
-
}
|
|
189
|
-
function broadcastToDevtoolsCore(info, headers, stashedBody) {
|
|
190
|
-
void Promise.all([
|
|
191
|
-
import("./broadcast-LUMOJIJT.js"),
|
|
192
|
-
import("./build-request-body-preview-XPZ2GYMG.js")
|
|
193
|
-
]).then(([{ broadcastRequest }, { buildRequestBodyPreview }]) => {
|
|
194
|
-
const bodyInfo = buildRequestBodyPreview(stashedBody);
|
|
195
|
-
broadcastRequest({
|
|
196
|
-
id: randomRequestId(),
|
|
197
|
-
traceId: info.requestId,
|
|
198
|
-
method: info.method,
|
|
199
|
-
path: info.url,
|
|
200
|
-
status: info.status,
|
|
201
|
-
durationMs: info.duration,
|
|
202
|
-
startedAt: Date.now() - info.duration,
|
|
203
|
-
...headers ? { headers } : {},
|
|
204
|
-
...bodyInfo ? {
|
|
205
|
-
bodyPreview: bodyInfo.preview,
|
|
206
|
-
bodyLength: bodyInfo.length,
|
|
207
|
-
bodyTruncated: bodyInfo.truncated
|
|
208
|
-
} : {}
|
|
209
|
-
});
|
|
210
|
-
}).catch(() => {
|
|
211
|
-
});
|
|
212
|
-
}
|
|
213
|
-
function broadcastRequestToDevtools(info, req) {
|
|
214
|
-
const headers = req?.headers ? Object.fromEntries(
|
|
215
|
-
Object.entries(req.headers).map(([k, v]) => [
|
|
216
|
-
k,
|
|
217
|
-
Array.isArray(v) ? v.join(", ") : v ?? ""
|
|
218
|
-
])
|
|
219
|
-
) : void 0;
|
|
220
|
-
const stashedBody = req ? req[DEVTOOLS_BODY_PREVIEW] : void 0;
|
|
221
|
-
broadcastToDevtoolsCore(info, headers, stashedBody);
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
// src/server/observability/logger.ts
|
|
225
|
-
var _warnOnceSeen = /* @__PURE__ */ new Set();
|
|
226
|
-
var MAX_SEEN = 1024;
|
|
227
|
-
function warnOnce(key, payload) {
|
|
228
|
-
if (_warnOnceSeen.has(key)) return;
|
|
229
|
-
if (_warnOnceSeen.size >= MAX_SEEN) {
|
|
230
|
-
const oldest = _warnOnceSeen.values().next().value;
|
|
231
|
-
if (oldest !== void 0) _warnOnceSeen.delete(oldest);
|
|
232
|
-
}
|
|
233
|
-
_warnOnceSeen.add(key);
|
|
234
|
-
let line;
|
|
235
|
-
try {
|
|
236
|
-
line = JSON.stringify({ ...payload, warnOnce: true });
|
|
237
|
-
} catch {
|
|
238
|
-
line = `[warnOnce] ${key} \u2014 (payload could not be serialized)`;
|
|
239
|
-
}
|
|
240
|
-
console.warn(line);
|
|
241
|
-
broadcastWarnOnceToDevtools(key, payload);
|
|
242
|
-
}
|
|
243
|
-
function payloadField(payload, key, fallback = "") {
|
|
244
|
-
const value = payload[key];
|
|
245
|
-
if (typeof value === "string") return value;
|
|
246
|
-
if (typeof value === "number" || typeof value === "boolean") return String(value);
|
|
247
|
-
return fallback;
|
|
248
|
-
}
|
|
249
|
-
function randomDevtoolsId() {
|
|
250
|
-
return `warn-${String(Date.now())}-${Math.random().toString(36).slice(2, 8)}`;
|
|
251
|
-
}
|
|
252
|
-
function broadcastWarnOnceToDevtools(key, payload) {
|
|
253
|
-
void import("./broadcast-LUMOJIJT.js").then(({ broadcastCsrfWarn, broadcastError }) => {
|
|
254
|
-
if (payload.event === "csrf.warn" && typeof payload.code === "string" && typeof payload.docsUrl === "string") {
|
|
255
|
-
broadcastCsrfWarn({
|
|
256
|
-
event: "csrf.warn",
|
|
257
|
-
code: payload.code,
|
|
258
|
-
docsUrl: payload.docsUrl,
|
|
259
|
-
method: payloadField(payload, "method"),
|
|
260
|
-
path: payloadField(payload, "path"),
|
|
261
|
-
reason: payloadField(payload, "reason")
|
|
262
|
-
});
|
|
263
|
-
} else {
|
|
264
|
-
broadcastError({
|
|
265
|
-
id: randomDevtoolsId(),
|
|
266
|
-
type: "console",
|
|
267
|
-
message: payloadField(payload, "event", key),
|
|
268
|
-
timestamp: Date.now()
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
}).catch(() => {
|
|
272
|
-
});
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
// src/server/http/send-response.ts
|
|
276
|
-
function sendJson(res, data, status = 200, transformer) {
|
|
277
|
-
const body = transformer ? transformer.serialize(data) : JSON.stringify(data);
|
|
278
|
-
res.writeHead(status, {
|
|
279
|
-
"Content-Type": "application/json",
|
|
280
|
-
"Content-Length": Buffer.byteLength(body)
|
|
281
|
-
});
|
|
282
|
-
res.end(body);
|
|
283
|
-
}
|
|
284
|
-
function sendError(res, codeOrInput, message, status, issues, requestId, options) {
|
|
285
|
-
let code;
|
|
286
|
-
if (typeof codeOrInput === "string") {
|
|
287
|
-
code = codeOrInput;
|
|
288
|
-
message = message ?? "";
|
|
289
|
-
status = status ?? 500;
|
|
290
|
-
} else {
|
|
291
|
-
code = codeOrInput.code;
|
|
292
|
-
message = codeOrInput.message;
|
|
293
|
-
status = codeOrInput.status;
|
|
294
|
-
issues = codeOrInput.issues;
|
|
295
|
-
requestId = codeOrInput.requestId;
|
|
296
|
-
options = codeOrInput.options;
|
|
297
|
-
}
|
|
298
|
-
const errorMessage = code === "INTERNAL_ERROR" && process.env.NODE_ENV === "production" ? "Internal server error" : message;
|
|
299
|
-
if (code === "INTERNAL_ERROR") {
|
|
300
|
-
console.error(`[${requestId ?? "no-id"}] ${message}`);
|
|
301
|
-
}
|
|
302
|
-
if (status === 404 && options?.custom404Html) {
|
|
303
|
-
const body = options.custom404Html;
|
|
304
|
-
res.writeHead(404, {
|
|
305
|
-
"Content-Type": "text/html; charset=utf-8",
|
|
306
|
-
"Content-Length": Buffer.byteLength(body)
|
|
307
|
-
});
|
|
308
|
-
res.end(body);
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
if (status === 500 && options?.custom500Html) {
|
|
312
|
-
const body = options.custom500Html;
|
|
313
|
-
res.writeHead(500, {
|
|
314
|
-
"Content-Type": "text/html; charset=utf-8",
|
|
315
|
-
"Content-Length": Buffer.byteLength(body)
|
|
316
|
-
});
|
|
317
|
-
res.end(body);
|
|
318
|
-
return;
|
|
319
|
-
}
|
|
320
|
-
sendJson(
|
|
321
|
-
res,
|
|
322
|
-
{
|
|
323
|
-
error: {
|
|
324
|
-
code,
|
|
325
|
-
message: errorMessage,
|
|
326
|
-
...requestId ? { requestId } : {},
|
|
327
|
-
...issues ? { issues } : {}
|
|
328
|
-
}
|
|
329
|
-
},
|
|
330
|
-
status
|
|
331
|
-
);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
// src/server/http/node-request.ts
|
|
335
|
-
import { Readable } from "stream";
|
|
336
|
-
function pickHeaderString(value) {
|
|
337
|
-
if (typeof value === "string") return value;
|
|
338
|
-
if (Array.isArray(value)) {
|
|
339
|
-
for (const v of value) if (typeof v === "string" && v.length > 0) return v;
|
|
340
|
-
}
|
|
341
|
-
return void 0;
|
|
342
|
-
}
|
|
343
|
-
function synthesizeAbsoluteUrl(req) {
|
|
344
|
-
const host = pickHeaderString(req.headers.host) ?? "localhost";
|
|
345
|
-
return `http://${host}${req.url ?? "/"}`;
|
|
346
|
-
}
|
|
347
|
-
function nodeHeadersToWeb(req) {
|
|
348
|
-
const headers = new Headers();
|
|
349
|
-
for (const [key, value] of Object.entries(req.headers)) {
|
|
350
|
-
if (value === void 0) continue;
|
|
351
|
-
if (Array.isArray(value)) {
|
|
352
|
-
headers.set(key, value.join(", "));
|
|
353
|
-
} else {
|
|
354
|
-
headers.set(key, value);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
return headers;
|
|
358
|
-
}
|
|
359
|
-
function incomingMessageToWebRequest(req) {
|
|
360
|
-
const url = synthesizeAbsoluteUrl(req);
|
|
361
|
-
const headers = nodeHeadersToWeb(req);
|
|
362
|
-
const method = (req.method ?? "GET").toUpperCase();
|
|
363
|
-
const hasBody = method !== "GET" && method !== "HEAD";
|
|
364
|
-
if (!hasBody) {
|
|
365
|
-
return new Request(url, { method, headers });
|
|
366
|
-
}
|
|
367
|
-
const webStream = Readable.toWeb(req);
|
|
368
|
-
return new Request(url, {
|
|
369
|
-
method,
|
|
370
|
-
headers,
|
|
371
|
-
body: webStream,
|
|
372
|
-
// EC-2: Node 18+ requires `duplex: 'half'` when body is a stream.
|
|
373
|
-
// The `RequestInit` type omits it (Web spec gap); cast accordingly.
|
|
374
|
-
...{ duplex: "half" }
|
|
375
|
-
});
|
|
376
|
-
}
|
|
377
|
-
function incomingMessageToHandlerRequest(req) {
|
|
378
|
-
return new Request(synthesizeAbsoluteUrl(req), {
|
|
379
|
-
method: (req.method ?? "GET").toUpperCase(),
|
|
380
|
-
headers: nodeHeadersToWeb(req)
|
|
381
|
-
});
|
|
382
|
-
}
|
|
383
|
-
|
|
384
21
|
// src/core/contracts/auth-error-guard.ts
|
|
385
22
|
function isAuthRequiredError(err) {
|
|
386
23
|
if (err == null || typeof err !== "object") return false;
|
|
@@ -488,119 +125,6 @@ function createOutboxDispatcher(backend) {
|
|
|
488
125
|
};
|
|
489
126
|
}
|
|
490
127
|
|
|
491
|
-
// src/server/security/csrf-warn-dispatch.ts
|
|
492
|
-
function dispatchCsrfWarn(payload) {
|
|
493
|
-
const key = `${payload.event}:${payload.method}:${payload.path ?? ""}`;
|
|
494
|
-
warnOnce(key, payload);
|
|
495
|
-
}
|
|
496
|
-
|
|
497
|
-
// src/server/observability/audit-log.ts
|
|
498
|
-
function safeAudit(logger, event) {
|
|
499
|
-
if (!logger) return;
|
|
500
|
-
try {
|
|
501
|
-
const r = logger.log(event);
|
|
502
|
-
if (r && typeof r.then === "function") {
|
|
503
|
-
r.catch(() => {
|
|
504
|
-
});
|
|
505
|
-
}
|
|
506
|
-
} catch {
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
|
|
510
|
-
// src/server/security/csrf.ts
|
|
511
|
-
function matchDisallowed(path, patterns) {
|
|
512
|
-
for (const p of patterns) {
|
|
513
|
-
if (typeof p === "string") {
|
|
514
|
-
if (path === p) return true;
|
|
515
|
-
} else if (p instanceof RegExp) {
|
|
516
|
-
p.lastIndex = 0;
|
|
517
|
-
if (p.test(path)) return true;
|
|
518
|
-
}
|
|
519
|
-
}
|
|
520
|
-
return false;
|
|
521
|
-
}
|
|
522
|
-
var CSRF_WARN_CODE = "CSRF_STRICT_CUTOVER";
|
|
523
|
-
var CSRF_WARN_DOCS_URL = "https://theokit.dev/upgrade/csrf-strict-cutover";
|
|
524
|
-
function pickHeader(value) {
|
|
525
|
-
if (typeof value === "string") return value;
|
|
526
|
-
if (Array.isArray(value) && value.length > 0) return value[0];
|
|
527
|
-
return "";
|
|
528
|
-
}
|
|
529
|
-
function isCsrfValidFromHeaders(opts) {
|
|
530
|
-
if (opts.csrfActionHeader !== "1") {
|
|
531
|
-
return { valid: false, reason: "Missing X-Theo-Action header" };
|
|
532
|
-
}
|
|
533
|
-
if (opts.origin === null || opts.origin === "") {
|
|
534
|
-
return { valid: true };
|
|
535
|
-
}
|
|
536
|
-
if (opts.host === null || opts.host === "") {
|
|
537
|
-
return { valid: true };
|
|
538
|
-
}
|
|
539
|
-
try {
|
|
540
|
-
const originHost = new URL(opts.origin).host;
|
|
541
|
-
if (originHost !== opts.host) {
|
|
542
|
-
return { valid: false, reason: `Origin ${opts.origin} does not match host ${opts.host}` };
|
|
543
|
-
}
|
|
544
|
-
} catch {
|
|
545
|
-
return { valid: false, reason: `Invalid origin: ${opts.origin}` };
|
|
546
|
-
}
|
|
547
|
-
return { valid: true };
|
|
548
|
-
}
|
|
549
|
-
function validateCsrf(req) {
|
|
550
|
-
const action = req.headers["x-theo-action"];
|
|
551
|
-
const origin = req.headers.origin;
|
|
552
|
-
const host = req.headers.host;
|
|
553
|
-
return isCsrfValidFromHeaders({
|
|
554
|
-
csrfActionHeader: typeof action === "string" ? action : null,
|
|
555
|
-
origin: origin !== void 0 ? pickHeader(origin) || null : null,
|
|
556
|
-
host: host !== void 0 ? pickHeader(host) || null : null
|
|
557
|
-
});
|
|
558
|
-
}
|
|
559
|
-
function validateCsrfRequest(request) {
|
|
560
|
-
return isCsrfValidFromHeaders({
|
|
561
|
-
csrfActionHeader: request.headers.get("x-theo-action"),
|
|
562
|
-
origin: request.headers.get("origin"),
|
|
563
|
-
host: request.headers.get("host")
|
|
564
|
-
});
|
|
565
|
-
}
|
|
566
|
-
function dispatchCsrfWarn2(req, reason, logger, auditLogger, pathFallback = "") {
|
|
567
|
-
const payload = {
|
|
568
|
-
event: "csrf.warn",
|
|
569
|
-
method: req.method ?? "UNKNOWN",
|
|
570
|
-
path: logger?.path ?? pathFallback,
|
|
571
|
-
reason,
|
|
572
|
-
code: CSRF_WARN_CODE,
|
|
573
|
-
docsUrl: CSRF_WARN_DOCS_URL
|
|
574
|
-
};
|
|
575
|
-
logger?.warn(payload);
|
|
576
|
-
safeAudit(auditLogger, {
|
|
577
|
-
action: "csrf.warn",
|
|
578
|
-
actor: { type: "anonymous" },
|
|
579
|
-
metadata: { ...payload }
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
function enforceCsrf(req, mode, logger, disallowed, auditLogger) {
|
|
583
|
-
if (mode === "off") {
|
|
584
|
-
return { allow: true };
|
|
585
|
-
}
|
|
586
|
-
const check = validateCsrf(req);
|
|
587
|
-
if (check.valid) {
|
|
588
|
-
return { allow: true };
|
|
589
|
-
}
|
|
590
|
-
if (disallowed?.behavior === "raise") {
|
|
591
|
-
const path = logger?.path ?? req.url ?? "";
|
|
592
|
-
if (matchDisallowed(path, disallowed.routes)) {
|
|
593
|
-
return { allow: false, reason: check.reason };
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
if (mode === "warn") {
|
|
597
|
-
dispatchCsrfWarn2(req, check.reason, logger, auditLogger);
|
|
598
|
-
return { allow: true, reason: check.reason };
|
|
599
|
-
}
|
|
600
|
-
dispatchCsrfWarn2(req, check.reason, logger, auditLogger);
|
|
601
|
-
return { allow: false, reason: check.reason };
|
|
602
|
-
}
|
|
603
|
-
|
|
604
128
|
// src/server/http/execute-stages.ts
|
|
605
129
|
async function parseQueryAndBody(req, res, requestId) {
|
|
606
130
|
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
@@ -2377,15 +1901,6 @@ function generateNonce() {
|
|
|
2377
1901
|
}
|
|
2378
1902
|
|
|
2379
1903
|
export {
|
|
2380
|
-
logRequest,
|
|
2381
|
-
warnOnce,
|
|
2382
|
-
dispatchCsrfWarn,
|
|
2383
|
-
safeAudit,
|
|
2384
|
-
validateCsrfRequest,
|
|
2385
|
-
enforceCsrf,
|
|
2386
|
-
sendError,
|
|
2387
|
-
incomingMessageToWebRequest,
|
|
2388
|
-
incomingMessageToHandlerRequest,
|
|
2389
1904
|
executeRoute,
|
|
2390
1905
|
executeAction,
|
|
2391
1906
|
findSuggestion,
|
|
@@ -2407,4 +1922,4 @@ export {
|
|
|
2407
1922
|
applySecurityHeaders,
|
|
2408
1923
|
generateNonce
|
|
2409
1924
|
};
|
|
2410
|
-
//# sourceMappingURL=chunk-
|
|
1925
|
+
//# sourceMappingURL=chunk-6VDYQ4I6.js.map
|