theokit 0.2.4 → 0.4.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-HWNTIEPI.js → actions-virtual-module-IY46EEEX.js} +2 -2
- package/dist/{actions-virtual-module-SEIPACG5.js → actions-virtual-module-XNHDNCZ6.js} +2 -2
- package/dist/add-2ZFFGGE4.js +0 -0
- package/dist/{app-typed-client-6GC6VWXS.js → app-typed-client-OUJO3V5J.js} +10 -5
- package/dist/{app-typed-client-6GC6VWXS.js.map → app-typed-client-OUJO3V5J.js.map} +1 -1
- package/dist/{app-typed-client-US2ZXBEC.js → app-typed-client-YOMWSA3F.js} +11 -6
- package/dist/{app-typed-client-US2ZXBEC.js.map → app-typed-client-YOMWSA3F.js.map} +1 -1
- package/dist/audit-log-BQWM5YLG.d.ts +60 -0
- package/dist/{aws-lambda-XYCGZH3I.js → aws-lambda-GKSTX6HD.js} +3 -3
- package/dist/body-parser-web-MUWBKZ3F.js +70 -0
- package/dist/body-parser-web-MUWBKZ3F.js.map +1 -0
- package/dist/broadcast-QOQGUNNK.js +0 -0
- package/dist/{build-MREW6MVS.js → build-D4J7XECU.js} +33 -24
- package/dist/build-D4J7XECU.js.map +1 -0
- package/dist/build-request-body-preview-II2235E6.js +0 -0
- package/dist/{bun-K73TQEWC.js → bun-ISHSNFIO.js} +3 -3
- package/dist/{check-PZR67OY5.js → check-NXYPLM6M.js} +2 -2
- package/dist/{chunk-WZ7CPVQB.js → chunk-27LWMYNK.js} +28 -24
- package/dist/chunk-27LWMYNK.js.map +1 -0
- package/dist/{chunk-5OKZY2VL.js → chunk-2F4FROEQ.js} +1695 -1522
- package/dist/chunk-2F4FROEQ.js.map +1 -0
- package/dist/chunk-4HBI7DHP.js +20 -0
- package/dist/chunk-4HBI7DHP.js.map +1 -0
- package/dist/{chunk-X4JAX2U3.js → chunk-4S2UCILN.js} +180 -125
- package/dist/chunk-4S2UCILN.js.map +1 -0
- package/dist/{chunk-C52GSJPF.js → chunk-4S6YHNG2.js} +11 -8
- package/dist/chunk-4S6YHNG2.js.map +1 -0
- package/dist/chunk-5ODOE6EF.js +0 -0
- package/dist/{chunk-KJVEJILQ.js → chunk-5PU65T5W.js} +9 -3
- package/dist/chunk-5PU65T5W.js.map +1 -0
- package/dist/chunk-5QW7IQQU.js +36 -0
- package/dist/chunk-5QW7IQQU.js.map +1 -0
- package/dist/chunk-5Z2727GV.js +1324 -0
- package/dist/chunk-5Z2727GV.js.map +1 -0
- package/dist/{chunk-YLBSSEHX.js → chunk-6NEXVBPY.js} +5 -15
- package/dist/chunk-6NEXVBPY.js.map +1 -0
- package/dist/chunk-7MQOHNHE.js +36 -0
- package/dist/chunk-7MQOHNHE.js.map +1 -0
- package/dist/{chunk-TPCT3MXV.js → chunk-ABVITXFH.js} +405 -272
- package/dist/chunk-ABVITXFH.js.map +1 -0
- package/dist/chunk-ASDXVRJD.js +185 -0
- package/dist/chunk-ASDXVRJD.js.map +1 -0
- package/dist/chunk-B3L3TJVF.js +406 -0
- package/dist/chunk-B3L3TJVF.js.map +1 -0
- package/dist/{chunk-PB4GR7EP.js → chunk-C3ZZ56YZ.js} +1 -18
- package/dist/chunk-C3ZZ56YZ.js.map +1 -0
- package/dist/{chunk-O7335ZGH.js → chunk-CG563V5M.js} +5 -3
- package/dist/chunk-CG563V5M.js.map +1 -0
- package/dist/{chunk-5OFPQK6N.js → chunk-COXLEZCN.js} +2 -1
- package/dist/chunk-COXLEZCN.js.map +1 -0
- package/dist/{chunk-O4BLVPML.js → chunk-DNMSV3R3.js} +22 -28
- package/dist/chunk-DNMSV3R3.js.map +1 -0
- package/dist/chunk-E3JH6YUM.js +1 -0
- package/dist/chunk-ESC54TAK.js +220 -0
- package/dist/chunk-ESC54TAK.js.map +1 -0
- package/dist/chunk-FI7MPTJW.js +77 -0
- package/dist/chunk-FI7MPTJW.js.map +1 -0
- package/dist/chunk-H4J2LECY.js +201 -0
- package/dist/chunk-H4J2LECY.js.map +1 -0
- package/dist/chunk-IAJ2JVEH.js +256 -0
- package/dist/chunk-IAJ2JVEH.js.map +1 -0
- package/dist/{chunk-F3TG5FJV.js → chunk-IEZCAT2I.js} +7 -1
- package/dist/{chunk-F3TG5FJV.js.map → chunk-IEZCAT2I.js.map} +1 -1
- package/dist/chunk-JHEAWR3L.js +1 -0
- package/dist/chunk-JQSKBMXP.js +17 -0
- package/dist/chunk-JQSKBMXP.js.map +1 -0
- package/dist/{chunk-4QTKSLTO.js → chunk-K4M64WD6.js} +9 -5
- package/dist/{chunk-4QTKSLTO.js.map → chunk-K4M64WD6.js.map} +1 -1
- package/dist/chunk-KI7OWQUX.js +293 -0
- package/dist/chunk-KI7OWQUX.js.map +1 -0
- package/dist/chunk-KT3MWNZG.js +0 -0
- package/dist/{chunk-ZJW5FFYJ.js → chunk-LC5PYNJP.js} +2 -2
- package/dist/{chunk-X2OLD264.js → chunk-M2EY7KDR.js} +1228 -1124
- package/dist/chunk-M2EY7KDR.js.map +1 -0
- package/dist/{chunk-YWWHK7R6.js → chunk-MR7OLIC6.js} +3 -3
- package/dist/chunk-NM4WF3XD.js +63 -0
- package/dist/chunk-NM4WF3XD.js.map +1 -0
- package/dist/chunk-NPMCKOX4.js +1 -0
- package/dist/{chunk-VRHXOKRP.js → chunk-NZXH2LQQ.js} +86 -83
- package/dist/chunk-NZXH2LQQ.js.map +1 -0
- package/dist/{chunk-2BQYEBCK.js → chunk-OLPB36O2.js} +87 -5
- package/dist/chunk-OLPB36O2.js.map +1 -0
- package/dist/chunk-PIVX3DYW.js +142 -0
- package/dist/chunk-PIVX3DYW.js.map +1 -0
- package/dist/{chunk-7TOMTMHT.js → chunk-R7OC6UDK.js} +2 -1
- package/dist/chunk-R7OC6UDK.js.map +1 -0
- package/dist/chunk-RESN62GB.js +269 -0
- package/dist/chunk-RESN62GB.js.map +1 -0
- package/dist/{chunk-64JI5LTO.js → chunk-RMU7EBRO.js} +2 -2
- package/dist/chunk-RMU7EBRO.js.map +1 -0
- package/dist/chunk-TQYSPYKU.js +131 -0
- package/dist/chunk-TQYSPYKU.js.map +1 -0
- package/dist/chunk-TSLSIRBR.js +107 -0
- package/dist/chunk-TSLSIRBR.js.map +1 -0
- package/dist/{chunk-XP7YXRHO.js → chunk-U6TPSW4L.js} +37 -5
- package/dist/chunk-U6TPSW4L.js.map +1 -0
- package/dist/chunk-UD3LFGDL.js +45 -0
- package/dist/chunk-UD3LFGDL.js.map +1 -0
- package/dist/chunk-UUFYP2UM.js +161 -0
- package/dist/chunk-UUFYP2UM.js.map +1 -0
- package/dist/{chunk-SNDZQ64K.js → chunk-VBZCVFSA.js} +85 -3
- package/dist/chunk-VBZCVFSA.js.map +1 -0
- package/dist/chunk-VMEWD57H.js +137 -0
- package/dist/chunk-VMEWD57H.js.map +1 -0
- package/dist/{chunk-BE2LKDI7.js → chunk-WEGALZEU.js} +3 -3
- package/dist/{chunk-ZOXNJV2O.js → chunk-WGHJD6I7.js} +35 -138
- package/dist/chunk-WGHJD6I7.js.map +1 -0
- package/dist/chunk-XMS5VRIK.js +0 -0
- package/dist/chunk-Y4H3JNVK.js +18 -0
- package/dist/chunk-Y4H3JNVK.js.map +1 -0
- package/dist/chunk-Z5IGLBWE.js +329 -0
- package/dist/chunk-Z5IGLBWE.js.map +1 -0
- package/dist/chunk-ZEGYW52B.js +26 -0
- package/dist/chunk-ZEGYW52B.js.map +1 -0
- package/dist/chunk-ZJQ4O76G.js +87 -0
- package/dist/chunk-ZJQ4O76G.js.map +1 -0
- package/dist/cli/index.js +44 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/client/index.d.ts +107 -1
- package/dist/client/index.js +152 -6
- package/dist/client/index.js.map +1 -1
- package/dist/{cloudflare-LCAOTRYZ.js → cloudflare-OJGJ7R2D.js} +3 -3
- package/dist/configure-agent-registry-6YGTJYBC.js +0 -0
- package/dist/cookies-MJKMGJ7N.js +22 -0
- package/dist/csrf-BBrEZSBW.d.ts +107 -0
- package/dist/csrf-readiness-store-CjIoub3U.d.ts +43 -0
- package/dist/define-websocket-CdK94O-D.d.ts +64 -0
- package/dist/{deno-deploy-ZN4RE5HF.js → deno-deploy-BHWKFTOW.js} +3 -3
- package/dist/{dev-6P2DM33Q.js → dev-MJVSRZGF.js} +13 -13
- package/dist/{dev-emit-MLDFOLUU.js → dev-emit-5VPRCHOD.js} +39 -142
- package/dist/dev-emit-5VPRCHOD.js.map +1 -0
- package/dist/{dev-emit-PRSRPDHA.js → dev-emit-HHP2XJXE.js} +5 -5
- package/dist/devtools/entry.js +185 -131
- package/dist/devtools/entry.js.map +1 -1
- package/dist/{dispatcher-AQJGI3HU.js → dispatcher-63LBXYLE.js} +2 -2
- package/dist/{dispatcher-E6QV32BO.js → dispatcher-EJME6C6M.js} +5 -2
- package/dist/dispatcher-EJME6C6M.js.map +1 -0
- package/dist/{dist-E6BL4ZVY.js → dist-KRW6OVD4.js} +7 -7
- package/dist/dist-KRW6OVD4.js.map +1 -0
- package/dist/docker-EZDA5FT7.js +0 -0
- package/dist/error-envelope-BsNzzAV5.d.ts +62 -0
- package/dist/{generate-DT4IIAHF.js → generate-AZ2K6Z2Z.js} +75 -2
- package/dist/generate-AZ2K6Z2Z.js.map +1 -0
- package/dist/index-DWWEdFh5.d.ts +399 -0
- package/dist/index.d.ts +161 -1391
- package/dist/index.js +20 -8
- package/dist/index.js.map +1 -1
- package/dist/{info-FJ4NXKTB.js → info-47VB62MV.js} +5 -5
- package/dist/job-backend-CgC8Xf33.d.ts +68 -0
- package/dist/{lib-NL5JXGEB.js → lib-NST3PNZX.js} +31 -31
- package/dist/lib-NST3PNZX.js.map +1 -0
- package/dist/module-loader-Cfz7dgCP.d.ts +26 -0
- package/dist/{netlify-5VQ22Z2P.js → netlify-GSNSJGMN.js} +3 -3
- package/dist/{node-3APTLGWB.js → node-6I5B6RL3.js} +3 -3
- package/dist/node-6I5B6RL3.js.map +1 -0
- package/dist/{openapi-SOKZTFE3.js → openapi-NFLSNNVQ.js} +10 -10
- package/dist/plugin-runner-BGBkzgi0.d.ts +95 -0
- package/dist/plugin-types-DNJGxr4Z.d.ts +79 -0
- package/dist/{proper-lockfile-4Y3DP3RP.js → proper-lockfile-MVKMQGFK.js} +27 -27
- package/dist/proper-lockfile-MVKMQGFK.js.map +1 -0
- package/dist/rate-limit-BdNDZ3vt.d.ts +58 -0
- package/dist/registry-QHEZ3BWB.js +25 -0
- package/dist/router-RGZFX75G.js +274 -0
- package/dist/router-RGZFX75G.js.map +1 -0
- package/dist/{routes-XVRAUH6H.js → routes-3A4XGIEJ.js} +6 -6
- package/dist/{scan-C2BOKLSY.js → scan-NQFI5S7P.js} +2 -2
- package/dist/scan-NQFI5S7P.js.map +1 -0
- package/dist/schema-D3v8VB7o.d.ts +76 -0
- package/dist/{schema-VR6YNVLQ.js → schema-KZVOV333.js} +5 -3
- package/dist/schema-KZVOV333.js.map +1 -0
- package/dist/server/agent/index.d.ts +229 -0
- package/dist/server/agent/index.js +16 -0
- package/dist/server/agent/index.js.map +1 -0
- package/dist/server/auth/index.d.ts +46 -1
- package/dist/server/auth/index.js +10 -3
- package/dist/server/cost/index.d.ts +1 -3
- package/dist/server/cost/index.js +1 -1
- package/dist/server/cron/index.js +4 -2
- package/dist/server/define/index.d.ts +281 -0
- package/dist/server/define/index.js +26 -0
- package/dist/server/define/index.js.map +1 -0
- package/dist/server/http/index.d.ts +10 -0
- package/dist/server/http/index.js +74 -0
- package/dist/server/http/index.js.map +1 -0
- package/dist/server/index.d.ts +151 -1677
- package/dist/server/index.js +558 -1102
- package/dist/server/index.js.map +1 -1
- package/dist/server/jobs/index.d.ts +348 -2
- package/dist/server/jobs/index.js +5 -3
- package/dist/server/observability/index.d.ts +324 -0
- package/dist/server/observability/index.js +48 -0
- package/dist/server/observability/index.js.map +1 -0
- package/dist/server/plugins/index.d.ts +17 -0
- package/dist/server/plugins/index.js +17 -0
- package/dist/server/plugins/index.js.map +1 -0
- package/dist/server/rate-limit/index.d.ts +105 -0
- package/dist/server/rate-limit/index.js +25 -0
- package/dist/server/rate-limit/index.js.map +1 -0
- package/dist/server/realtime/index.d.ts +15 -0
- package/dist/server/realtime/index.js +8 -0
- package/dist/server/realtime/index.js.map +1 -0
- package/dist/server/scan/index.d.ts +106 -0
- package/dist/server/scan/index.js +43 -0
- package/dist/server/scan/index.js.map +1 -0
- package/dist/server/security/index.d.ts +193 -0
- package/dist/server/security/index.js +50 -0
- package/dist/server/security/index.js.map +1 -0
- package/dist/server/storage/index.d.ts +22 -0
- package/dist/server/storage/index.js +14 -0
- package/dist/server/storage/index.js.map +1 -0
- package/dist/server/webhook/index.d.ts +148 -0
- package/dist/server/webhook/index.js +19 -0
- package/dist/server/webhook/index.js.map +1 -0
- package/dist/server-error-to-envelope-NO4CCAFQ.js +8 -0
- package/dist/server-error-to-envelope-NO4CCAFQ.js.map +1 -0
- package/dist/server-error-to-envelope-UJK6OWDJ.js +134 -0
- package/dist/server-error-to-envelope-UJK6OWDJ.js.map +1 -0
- package/dist/server-routes-hmr-GZJGPWMS.js +44 -0
- package/dist/server-routes-hmr-GZJGPWMS.js.map +1 -0
- package/dist/server-routes-hmr-PBHSKCQJ.js +42 -0
- package/dist/server-routes-hmr-PBHSKCQJ.js.map +1 -0
- package/dist/services-json-Z2QNGVPW.js +142 -0
- package/dist/services-json-Z2QNGVPW.js.map +1 -0
- package/dist/{services-typed-client-XWYYBWGW.js → services-typed-client-KK6RHRDG.js} +2 -2
- package/dist/{services-typed-client-ZX5JUHH3.js → services-typed-client-T7M5VPBP.js} +2 -2
- package/dist/{sqlite-vec-ARPNUBWT.js → sqlite-vec-54KB4RD3.js} +2 -2
- package/dist/sqlite-vec-54KB4RD3.js.map +1 -0
- package/dist/{start-R7XSQL5L.js → start-CGSZPBAG.js} +23 -23
- package/dist/start-CGSZPBAG.js.map +1 -0
- package/dist/{static-TZBVBDTB.js → static-QI5NQT2X.js} +6 -6
- package/dist/storage-manager-C4jsO0Tp.d.ts +89 -0
- package/dist/storage-manager-D5KBXXKB.js +0 -0
- package/dist/{storage-types-DtIVejC1.d.ts → storage-types-DsDTCPbp.d.ts} +1 -1
- package/dist/{theo-cloud-3K4DGB3S.js → theo-cloud-RSQCBNXL.js} +4 -4
- package/dist/theo-cloud-RSQCBNXL.js.map +1 -0
- package/dist/upgrade-readiness-GUJBCJIS.js +0 -0
- package/dist/{vercel-MWW24ABC.js → vercel-TKPZK62A.js} +3 -3
- package/dist/vite-plugin/index.d.ts +3 -1
- package/dist/vite-plugin/index.js +20 -8
- package/dist/{vite-plugin-6MPHTKIW.js → vite-plugin-CR4JDFUQ.js} +9 -9
- package/dist/vite-plugin-CR4JDFUQ.js.map +1 -0
- package/package.json +59 -10
- package/LICENSE +0 -201
- package/dist/build-MREW6MVS.js.map +0 -1
- package/dist/chunk-2BQYEBCK.js.map +0 -1
- package/dist/chunk-5OFPQK6N.js.map +0 -1
- package/dist/chunk-5OKZY2VL.js.map +0 -1
- package/dist/chunk-64JI5LTO.js.map +0 -1
- package/dist/chunk-7TOMTMHT.js.map +0 -1
- package/dist/chunk-C52GSJPF.js.map +0 -1
- package/dist/chunk-CZM6WWWS.js +0 -2450
- package/dist/chunk-CZM6WWWS.js.map +0 -1
- package/dist/chunk-KJVEJILQ.js.map +0 -1
- package/dist/chunk-O4BLVPML.js.map +0 -1
- package/dist/chunk-O7335ZGH.js.map +0 -1
- package/dist/chunk-PB4GR7EP.js.map +0 -1
- package/dist/chunk-SNDZQ64K.js.map +0 -1
- package/dist/chunk-TPCT3MXV.js.map +0 -1
- package/dist/chunk-VRHXOKRP.js.map +0 -1
- package/dist/chunk-WZ7CPVQB.js.map +0 -1
- package/dist/chunk-X2OLD264.js.map +0 -1
- package/dist/chunk-X4JAX2U3.js.map +0 -1
- package/dist/chunk-XP7YXRHO.js.map +0 -1
- package/dist/chunk-YLBSSEHX.js.map +0 -1
- package/dist/chunk-ZOXNJV2O.js.map +0 -1
- package/dist/dev-emit-MLDFOLUU.js.map +0 -1
- package/dist/dispatcher-E6QV32BO.js.map +0 -1
- package/dist/dist-E6BL4ZVY.js.map +0 -1
- package/dist/generate-DT4IIAHF.js.map +0 -1
- package/dist/index-li83Swxa.d.ts +0 -506
- package/dist/lib-NL5JXGEB.js.map +0 -1
- package/dist/proper-lockfile-4Y3DP3RP.js.map +0 -1
- package/dist/registry-5QFTLOL2.js +0 -25
- package/dist/schema-CjVly9c_.d.ts +0 -274
- package/dist/sqlite-vec-ARPNUBWT.js.map +0 -1
- package/dist/start-R7XSQL5L.js.map +0 -1
- package/dist/theo-cloud-3K4DGB3S.js.map +0 -1
- /package/dist/{actions-virtual-module-HWNTIEPI.js.map → actions-virtual-module-IY46EEEX.js.map} +0 -0
- /package/dist/{actions-virtual-module-SEIPACG5.js.map → actions-virtual-module-XNHDNCZ6.js.map} +0 -0
- /package/dist/{aws-lambda-XYCGZH3I.js.map → aws-lambda-GKSTX6HD.js.map} +0 -0
- /package/dist/{bun-K73TQEWC.js.map → bun-ISHSNFIO.js.map} +0 -0
- /package/dist/{check-PZR67OY5.js.map → check-NXYPLM6M.js.map} +0 -0
- /package/dist/{dispatcher-AQJGI3HU.js.map → chunk-E3JH6YUM.js.map} +0 -0
- /package/dist/{node-3APTLGWB.js.map → chunk-JHEAWR3L.js.map} +0 -0
- /package/dist/{chunk-ZJW5FFYJ.js.map → chunk-LC5PYNJP.js.map} +0 -0
- /package/dist/{chunk-YWWHK7R6.js.map → chunk-MR7OLIC6.js.map} +0 -0
- /package/dist/{scan-C2BOKLSY.js.map → chunk-NPMCKOX4.js.map} +0 -0
- /package/dist/{chunk-BE2LKDI7.js.map → chunk-WEGALZEU.js.map} +0 -0
- /package/dist/{cloudflare-LCAOTRYZ.js.map → cloudflare-OJGJ7R2D.js.map} +0 -0
- /package/dist/{schema-VR6YNVLQ.js.map → cookies-MJKMGJ7N.js.map} +0 -0
- /package/dist/{deno-deploy-ZN4RE5HF.js.map → deno-deploy-BHWKFTOW.js.map} +0 -0
- /package/dist/{dev-6P2DM33Q.js.map → dev-MJVSRZGF.js.map} +0 -0
- /package/dist/{dev-emit-PRSRPDHA.js.map → dev-emit-HHP2XJXE.js.map} +0 -0
- /package/dist/{vite-plugin-6MPHTKIW.js.map → dispatcher-63LBXYLE.js.map} +0 -0
- /package/dist/{info-FJ4NXKTB.js.map → info-47VB62MV.js.map} +0 -0
- /package/dist/{netlify-5VQ22Z2P.js.map → netlify-GSNSJGMN.js.map} +0 -0
- /package/dist/{openapi-SOKZTFE3.js.map → openapi-NFLSNNVQ.js.map} +0 -0
- /package/dist/{registry-5QFTLOL2.js.map → registry-QHEZ3BWB.js.map} +0 -0
- /package/dist/{routes-XVRAUH6H.js.map → routes-3A4XGIEJ.js.map} +0 -0
- /package/dist/{services-typed-client-XWYYBWGW.js.map → services-typed-client-KK6RHRDG.js.map} +0 -0
- /package/dist/{services-typed-client-ZX5JUHH3.js.map → services-typed-client-T7M5VPBP.js.map} +0 -0
- /package/dist/{static-TZBVBDTB.js.map → static-QI5NQT2X.js.map} +0 -0
- /package/dist/{vercel-MWW24ABC.js.map → vercel-TKPZK62A.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/commands/generate.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * CLI `theo generate`. Writes scaffolded files under `cwd` + a generator\n * name from CLI args. Build-time tool. No HTTP input.\n */\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\n\nexport const VALID_TYPES = ['route', 'action', 'page', 'ws'] as const\nexport type GeneratorType = (typeof VALID_TYPES)[number]\n\nexport interface GenerateOptions {\n cwd: string\n type: string\n name: string\n}\n\nexport type GenerateStatus =\n | 'created'\n | 'already_exists'\n | 'invalid_kind'\n | 'invalid_name'\n | 'not_a_project'\n\nexport interface GenerateResult {\n status: GenerateStatus\n filePath?: string\n kind?: GeneratorType\n name?: string\n message?: string\n}\n\nfunction toKebabCase(name: string): boolean {\n return /^[a-z][a-z0-9/-]*$/.test(name)\n}\n\n/**\n * Reserved JS identifier names that conflict with object prototype machinery\n * or would shadow built-in module shapes if used as action/route names.\n * Mirrors action-scan's RESERVED_NAMES (T1.4).\n */\nconst RESERVED_BASENAMES = new Set([\n 'index',\n 'constructor',\n '__proto__',\n 'prototype',\n 'hasOwnProperty',\n])\n\n/**\n * Validate that a name segment doesn't hit the reserved-identifier list.\n * Checks the BASENAME (last `/` segment) — nested `admin/constructor` still\n * rejected because the file `constructor.ts` would be the conflict.\n */\nfunction hasReservedSegment(name: string): boolean {\n const basename = name.includes('/') ? (name.split('/').pop() ?? name) : name\n return RESERVED_BASENAMES.has(basename)\n}\n\n/**\n * EC-4: validate that resolving `targetSubpath` under `cwd` stays inside `cwd`.\n * Returns `true` when path is safe (stays inside), `false` when it escapes via\n * `..`, absolute path, null byte, or similar traversal vector.\n */\nfunction isPathInside(cwd: string, targetSubpath: string): boolean {\n if (targetSubpath.includes('\\x00')) return false\n if (targetSubpath.startsWith('/') || targetSubpath.startsWith('\\\\')) return false\n const resolved = resolve(cwd, targetSubpath)\n const cwdResolved = resolve(cwd)\n const sep = process.platform === 'win32' ? '\\\\' : '/'\n return resolved === cwdResolved || resolved.startsWith(cwdResolved + sep)\n}\n\nfunction toPascalCase(name: string): string {\n return name\n .split(/[-/]/)\n .map((s) => s.charAt(0).toUpperCase() + s.slice(1))\n .join('')\n}\n\nfunction toCamelCase(name: string): string {\n const pascal = toPascalCase(name)\n return pascal.charAt(0).toLowerCase() + pascal.slice(1)\n}\n\nfunction generateRouteTemplate(name: string): string {\n return [\n `import { defineRoute } from 'theokit/server'`,\n `import { z } from 'zod'`,\n ``,\n `export const GET = defineRoute({`,\n ` handler: ({ ctx }) => {`,\n ` return { message: 'TODO: implement ${name} GET' }`,\n ` },`,\n `})`,\n ``,\n ].join('\\n')\n}\n\nfunction generateActionTemplate(name: string): string {\n const camel = toCamelCase(name)\n return [\n `import { defineAction } from 'theokit/server'`,\n `import { z } from 'zod'`,\n ``,\n `export const ${camel} = defineAction({`,\n ` input: z.object({}),`,\n ` handler: ({ input, ctx }) => {`,\n ` return { message: 'TODO: implement ${name}' }`,\n ` },`,\n `})`,\n ``,\n ].join('\\n')\n}\n\n/**\n * Co-located test template for `theokit generate action <name>` (T5.2 +\n * plan Q4 cenário 1: roundtrip serialize). Skeleton uses vitest BDD shape\n * per testing.md.\n */\nfunction resolveTemplate(\n cwd: string,\n type: GeneratorType,\n name: string,\n): { filePath: string; content: string } | null {\n switch (type) {\n case 'route':\n return {\n filePath: resolve(cwd, 'server/routes', `${name}.ts`),\n content: generateRouteTemplate(name),\n }\n case 'action':\n return {\n filePath: resolve(cwd, 'server/actions', `${name}.ts`),\n content: generateActionTemplate(name),\n }\n case 'page':\n return { filePath: resolve(cwd, `app/${name}/page.tsx`), content: generatePageTemplate(name) }\n case 'ws':\n return {\n filePath: resolve(cwd, 'server/ws', `${name}.ts`),\n content: generateWsTemplate(name),\n }\n default:\n return null\n }\n}\n\nfunction generateActionTestTemplate(name: string): string {\n const camel = toCamelCase(name)\n return [\n `import { describe, it, expect } from 'vitest'`,\n ``,\n `import { ${camel} } from './${name.split('/').pop()}.js'`,\n ``,\n `describe('${name} action', () => {`,\n ` it('should accept a valid input shape', () => {`,\n ` expect(${camel}.input).toBeDefined()`,\n ` expect(typeof ${camel}.handler).toBe('function')`,\n ` })`,\n ``,\n ` it('should reject invalid input via zod schema', () => {`,\n ` const parsed = ${camel}.input.safeParse({ __invalid: true })`,\n ` // Empty object schema accepts {}; tighten this assertion when adding fields.`,\n ` expect(parsed.success).toBe(true)`,\n ` })`,\n `})`,\n ``,\n ].join('\\n')\n}\n\nfunction generatePageTemplate(name: string): string {\n const pascal = toPascalCase(name)\n return [`export default function ${pascal}Page() {`, ` return <h1>${pascal}</h1>`, `}`, ``].join(\n '\\n',\n )\n}\n\nfunction generateWsTemplate(_name: string): string {\n return [\n `import { defineWebSocket } from 'theokit/server'`,\n ``,\n `export default defineWebSocket({`,\n ` onMessage(ws, data) {`,\n ` ws.send(\\`echo: \\${data}\\`)`,\n ` },`,\n `})`,\n ``,\n ].join('\\n')\n}\n\n/**\n * Programmatic generate. Returns a structured result instead of throwing —\n * Studio (`theokit_generate` tool) consumes this directly. The CLI wrapper\n * below maps the structured result to console output + exit code semantics.\n */\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function generate(opts: GenerateOptions): Promise<GenerateResult> {\n const { cwd, type, name } = opts\n\n if (!existsSync(resolve(cwd, 'theo.config.ts')) && !existsSync(resolve(cwd, 'theo.config.js'))) {\n return {\n status: 'not_a_project',\n message: 'Not a Theo project. cwd has no theo.config.ts or theo.config.js',\n }\n }\n\n if (!VALID_TYPES.includes(type as GeneratorType)) {\n return {\n status: 'invalid_kind',\n message: `Invalid generator type \"${type}\". Available: ${VALID_TYPES.join(', ')}`,\n }\n }\n\n if (!name || !toKebabCase(name)) {\n return {\n status: 'invalid_name',\n message: `Invalid name \"${name}\". Use kebab-case: lowercase letters, numbers, hyphens.`,\n }\n }\n\n // EC-2-related: reject reserved JS identifier basenames (would shadow\n // built-in prototype machinery in virtual module emit or scan).\n if (hasReservedSegment(name)) {\n return {\n status: 'invalid_name',\n message: `Reserved name \"${name}\" — basename collides with built-in identifier (index/constructor/__proto__/prototype/hasOwnProperty).`,\n }\n }\n\n const resolved = resolveTemplate(cwd, type as GeneratorType, name)\n if (resolved === null) {\n return { status: 'invalid_kind', message: `Unknown type: ${type}` }\n }\n const { filePath, content } = resolved\n\n // EC-4: confirm the resolved filePath stays inside cwd. `toKebabCase`\n // already rejects most traversal vectors but a defense-in-depth check\n // against `..` slipping in via valid-looking segments is cheap.\n const relativeFromCwd = filePath.startsWith(resolve(cwd))\n ? filePath.slice(resolve(cwd).length + 1)\n : filePath\n if (!isPathInside(cwd, relativeFromCwd)) {\n return {\n status: 'invalid_name',\n message: `Path traversal denied: \"${name}\" would escape project root.`,\n }\n }\n\n if (existsSync(filePath)) {\n return { status: 'already_exists', filePath, kind: type as GeneratorType, name }\n }\n\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content)\n\n // T5.2 + plan Q4: emit co-located test file alongside actions (only\n // for action type; routes/pages/ws keep prior single-file behavior).\n // Skip if existing test file present (preserve user-customized tests).\n if (type === 'action') {\n const testPath = filePath.replace(/\\.ts$/, '.test.ts')\n if (!existsSync(testPath)) {\n writeFileSync(testPath, generateActionTestTemplate(name))\n }\n }\n\n return { status: 'created', filePath, kind: type as GeneratorType, name }\n}\n\n/**\n * CLI entry point — preserves the original surface (throws + console.log).\n * Wraps the programmatic `generate` function.\n */\nexport async function generateCommand(type: string, name: string): Promise<void> {\n const result = await generate({ cwd: process.cwd(), type, name })\n switch (result.status) {\n case 'not_a_project':\n throw new Error('Not a Theo project. Run this from a project root with theo.config.ts')\n case 'invalid_kind':\n throw new Error(result.message ?? 'Invalid kind')\n case 'invalid_name':\n throw new Error(\n `Invalid name \"${name}\". Use kebab-case: lowercase letters, numbers, hyphens. Example: my-route`,\n )\n case 'already_exists':\n console.log(`\\n ⚠ ${result.filePath} already exists. Skipping.\\n`)\n return\n case 'created':\n console.log(`\\n ✓ Created ${type}: ${result.filePath}\\n`)\n return\n }\n}\n"],"mappings":"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","names":[]}
|
package/dist/index-li83Swxa.d.ts
DELETED
|
@@ -1,506 +0,0 @@
|
|
|
1
|
-
import { S as ServerConfig, a as PostgresDatabaseConfig, P as PoolLike, d as StorageConfig, b as RedisServerConfig, R as RedisLike, c as StorageAdapter } from './storage-types-DtIVejC1.js';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Neutral `JobBackend` interface per ADR-0002.
|
|
5
|
-
*
|
|
6
|
-
* Implementations ship in core:
|
|
7
|
-
* - `InMemoryJobBackend` (T2.2) — dev + tests; no external deps
|
|
8
|
-
* - `PostgresJobBackend` (T3.1) — production; requires `pg` peer dep
|
|
9
|
-
*
|
|
10
|
-
* Community packages (`@theokit/jobs-redis`, `@theokit/jobs-sqs`, etc.)
|
|
11
|
-
* implement this same interface to plug in alternate substrates without
|
|
12
|
-
* modifying TheoKit core.
|
|
13
|
-
*/
|
|
14
|
-
interface JobEnqueueInput {
|
|
15
|
-
/** The job name (matches a `defineJob` declaration). */
|
|
16
|
-
name: string;
|
|
17
|
-
/** Validated input (already passed through Zod or equivalent at the queue-client layer). */
|
|
18
|
-
input: unknown;
|
|
19
|
-
/** Optional idempotency key for at-most-once dispatch within TTL. */
|
|
20
|
-
idempotencyKey?: string;
|
|
21
|
-
/** Optional delay before the job becomes available for dispatch. */
|
|
22
|
-
delaySeconds?: number;
|
|
23
|
-
/** W3C Trace Context propagation per ADR/R0.5.9. */
|
|
24
|
-
traceparent?: string;
|
|
25
|
-
/** Maximum dispatch attempts (read from JobDefinition by the queue client). */
|
|
26
|
-
maxAttempts?: number;
|
|
27
|
-
}
|
|
28
|
-
interface JobLease {
|
|
29
|
-
readonly jobId: string;
|
|
30
|
-
readonly name: string;
|
|
31
|
-
readonly input: unknown;
|
|
32
|
-
readonly attempts: number;
|
|
33
|
-
readonly maxAttempts: number;
|
|
34
|
-
readonly traceparent?: string;
|
|
35
|
-
readonly lockExpiresAt: Date;
|
|
36
|
-
}
|
|
37
|
-
interface JobBackend {
|
|
38
|
-
/** Human-readable name for logging (e.g., "memory", "postgres"). */
|
|
39
|
-
readonly name: string;
|
|
40
|
-
/** Persist a job for later dispatch. Returns the generated jobId. */
|
|
41
|
-
enqueue(input: JobEnqueueInput): Promise<{
|
|
42
|
-
jobId: string;
|
|
43
|
-
}>;
|
|
44
|
-
/** Worker loop polls for the next available leases. */
|
|
45
|
-
dequeue(opts: {
|
|
46
|
-
batchSize?: number;
|
|
47
|
-
lockSeconds?: number;
|
|
48
|
-
}): Promise<JobLease[]>;
|
|
49
|
-
/** Mark a job complete (success). */
|
|
50
|
-
ack(jobId: string): Promise<void>;
|
|
51
|
-
/** Mark a job failed; backend decides retry vs DLQ via attempts. */
|
|
52
|
-
nack(jobId: string, opts: {
|
|
53
|
-
error: string;
|
|
54
|
-
nonRetryable?: boolean;
|
|
55
|
-
}): Promise<void>;
|
|
56
|
-
/** Optional: return existing jobId if `key` was enqueued within `ttlSeconds`. */
|
|
57
|
-
idempotency?(key: string, ttlSeconds: number): Promise<{
|
|
58
|
-
jobId: string;
|
|
59
|
-
} | null>;
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Thrown from a job handler to opt out of retry policy. The backend MUST
|
|
63
|
-
* nack with `nonRetryable: true` and permanently remove the job.
|
|
64
|
-
*/
|
|
65
|
-
declare class NonRetryableError extends Error {
|
|
66
|
-
readonly code = "NON_RETRYABLE";
|
|
67
|
-
constructor(message: string);
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
/**
|
|
71
|
-
* Job primitive types (R0.5.5-9).
|
|
72
|
-
*
|
|
73
|
-
* @see docs/adr/0002-job-backend-interface-neutral-contract.md
|
|
74
|
-
* @see docs/adr/0003-enqueue-returns-void-transactional-outbox.md
|
|
75
|
-
*/
|
|
76
|
-
/**
|
|
77
|
-
* Type registry for jobs. Users extend via module augmentation:
|
|
78
|
-
*
|
|
79
|
-
* ```ts
|
|
80
|
-
* declare module 'theokit/server' {
|
|
81
|
-
* interface JobRegistry {
|
|
82
|
-
* 'process-document': { documentId: string }
|
|
83
|
-
* 'send-email': { to: string; subject: string }
|
|
84
|
-
* }
|
|
85
|
-
* }
|
|
86
|
-
* ```
|
|
87
|
-
*
|
|
88
|
-
* Once augmented, `ctx.queue.enqueue<'process-document'>(...)` gets full
|
|
89
|
-
* type inference on the `input` argument.
|
|
90
|
-
*/
|
|
91
|
-
interface JobRegistry {
|
|
92
|
-
}
|
|
93
|
-
interface JobContext<TInput = unknown> {
|
|
94
|
-
/** W3C trace_id propagated from the originating request or cron. */
|
|
95
|
-
readonly traceId: string;
|
|
96
|
-
/** The job's input, type-narrowed per JobRegistry entry. */
|
|
97
|
-
readonly input: TInput;
|
|
98
|
-
/** Abort signal triggered when the worker stops or lease times out. */
|
|
99
|
-
readonly signal: AbortSignal;
|
|
100
|
-
/** Attempt number (1-indexed). */
|
|
101
|
-
readonly attempt: number;
|
|
102
|
-
}
|
|
103
|
-
interface JobOptions<TInput = unknown> {
|
|
104
|
-
/** Optional Zod schema (or any `.parse(value)`-shaped object) for input validation. */
|
|
105
|
-
input?: {
|
|
106
|
-
parse: (value: unknown) => TInput;
|
|
107
|
-
};
|
|
108
|
-
/** Maximum dispatch attempts (default 1 — no retry surprise per ADR-0003). */
|
|
109
|
-
maxAttempts?: number;
|
|
110
|
-
/** Handler. Returns `void` per ADR-0003 — no workflow API. */
|
|
111
|
-
handler: (ctx: JobContext<TInput>) => Promise<void> | void;
|
|
112
|
-
}
|
|
113
|
-
interface JobDefinition<TInput = unknown> {
|
|
114
|
-
readonly name: string;
|
|
115
|
-
readonly maxAttempts: number;
|
|
116
|
-
readonly hasInputSchema: boolean;
|
|
117
|
-
readonly handler: (ctx: JobContext<TInput>) => Promise<void> | void;
|
|
118
|
-
readonly inputSchema?: {
|
|
119
|
-
parse: (value: unknown) => TInput;
|
|
120
|
-
};
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
/**
|
|
124
|
-
* Declare a background job. Pure identity helper — no registration side
|
|
125
|
-
* effect; the build-time scanner (T2.3) discovers definitions by walking
|
|
126
|
-
* `server/jobs/` and emits `.theo/jobs.json`.
|
|
127
|
-
*
|
|
128
|
-
* Per ADR-0003, handler returns `void` (or `Promise<void>`); no workflow
|
|
129
|
-
* API. To run another job after this one, call `ctx.queue.enqueue` from
|
|
130
|
-
* the handler.
|
|
131
|
-
*
|
|
132
|
-
* @example
|
|
133
|
-
* ```ts
|
|
134
|
-
* // server/jobs/process-document.ts
|
|
135
|
-
* import { defineJob } from 'theokit/server'
|
|
136
|
-
* import { z } from 'zod'
|
|
137
|
-
*
|
|
138
|
-
* export default defineJob('process-document', {
|
|
139
|
-
* input: z.object({ documentId: z.string() }),
|
|
140
|
-
* maxAttempts: 3,
|
|
141
|
-
* async handler({ input, traceId }) {
|
|
142
|
-
* // process input.documentId
|
|
143
|
-
* },
|
|
144
|
-
* })
|
|
145
|
-
* ```
|
|
146
|
-
*/
|
|
147
|
-
declare function defineJob<TInput = unknown>(name: string, options: JobOptions<TInput>): JobDefinition<TInput>;
|
|
148
|
-
|
|
149
|
-
/**
|
|
150
|
-
* Thrown when a plugin or middleware decorates `ctx.<key>` with a value
|
|
151
|
-
* that the framework would also like to inject (e.g., `ctx.queue` from
|
|
152
|
-
* the jobs backend wiring).
|
|
153
|
-
*
|
|
154
|
-
* Per EC-202 of system-100-percent-functional-plan: silent override is a
|
|
155
|
-
* latent bug class. Fail loud so the conflict surfaces immediately.
|
|
156
|
-
*/
|
|
157
|
-
declare class DuplicateContextKeyError extends Error {
|
|
158
|
-
readonly key: string;
|
|
159
|
-
readonly code = "DUPLICATE_CONTEXT_KEY";
|
|
160
|
-
constructor(key: string, opts?: {
|
|
161
|
-
reason?: string;
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* In-memory job backend for dev + tests + single-instance prototypes.
|
|
167
|
-
*
|
|
168
|
-
* Zero external dependencies. Storage is two Maps:
|
|
169
|
-
* - `pending: Map<jobId, PendingEntry>` — all enqueued jobs (locked or not)
|
|
170
|
-
* - `idempotencyMap: Map<key, { jobId; expiresAt }>` — dedup window
|
|
171
|
-
*
|
|
172
|
-
* Per ADR-0002: this is one of two first-party backends shipped in core.
|
|
173
|
-
* Production deploys plug in PostgresJobBackend (T3.1).
|
|
174
|
-
*
|
|
175
|
-
* EC-104 (jobs-crons-webhooks-cost-tracking-plan): registers a
|
|
176
|
-
* `process.on('beforeExit')` handler that clears pending dispatch timers
|
|
177
|
-
* and logs a warning with the dropped count. Failure mode is visible,
|
|
178
|
-
* not silent. `destroy()` removes the listener for test isolation.
|
|
179
|
-
*/
|
|
180
|
-
interface InMemoryJobBackendOptions {
|
|
181
|
-
/** Maximum pending entries before oldest is dropped + warning logged. */
|
|
182
|
-
maxPending?: number;
|
|
183
|
-
}
|
|
184
|
-
declare class InMemoryJobBackend implements JobBackend {
|
|
185
|
-
#private;
|
|
186
|
-
readonly name = "memory";
|
|
187
|
-
constructor(opts?: InMemoryJobBackendOptions);
|
|
188
|
-
enqueue(input: JobEnqueueInput): Promise<{
|
|
189
|
-
jobId: string;
|
|
190
|
-
}>;
|
|
191
|
-
dequeue(opts: {
|
|
192
|
-
batchSize?: number;
|
|
193
|
-
lockSeconds?: number;
|
|
194
|
-
}): Promise<JobLease[]>;
|
|
195
|
-
ack(jobId: string): Promise<void>;
|
|
196
|
-
nack(jobId: string, opts: {
|
|
197
|
-
error: string;
|
|
198
|
-
nonRetryable?: boolean;
|
|
199
|
-
}): Promise<void>;
|
|
200
|
-
idempotency(key: string, ttlSeconds: number): Promise<{
|
|
201
|
-
jobId: string;
|
|
202
|
-
} | null>;
|
|
203
|
-
/**
|
|
204
|
-
* Remove the beforeExit listener and clear all pending timers.
|
|
205
|
-
* Idempotent — safe to call multiple times. Use in test teardown to
|
|
206
|
-
* avoid leaking listeners across vitest test files.
|
|
207
|
-
*/
|
|
208
|
-
destroy(): void;
|
|
209
|
-
/** EC-104 test hook — invokes the shutdown handler synchronously. */
|
|
210
|
-
triggerBeforeExitForTest(): void;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* StorageManager — per-process singleton coordinating pluggable storage
|
|
215
|
-
* adapters (Postgres pools, Redis clients, in-memory adapters).
|
|
216
|
-
*
|
|
217
|
-
* Architectural decisions: see ADR-0007 (docs/adr/0007-storage-manager-singleton.md).
|
|
218
|
-
*
|
|
219
|
-
* Lifecycle:
|
|
220
|
-
* 1. `getStorageManager()` returns the singleton (D1).
|
|
221
|
-
* 2. `configure(storageConfig)` honored once per process (D3). Second call
|
|
222
|
-
* warns and is ignored.
|
|
223
|
-
* 3. `usePostgres(dbName, factory)` / `useRedis(serverName, factory)`
|
|
224
|
-
* lazily create + cache (D2). Factory invoked exactly once per name.
|
|
225
|
-
* 4. `register(adapter)` opts the adapter into the SIGTERM drain (D6).
|
|
226
|
-
* 5. `dispose()` drains in parallel — adapters + pools + Redis (D5).
|
|
227
|
-
* Idempotent. Adapter errors logged + swallowed (do not block shutdown).
|
|
228
|
-
*
|
|
229
|
-
* Test seam: `__resetForTests()` resets state. Test files MUST call it from
|
|
230
|
-
* `beforeEach` to avoid pollution across `it` blocks (EC-3).
|
|
231
|
-
*/
|
|
232
|
-
|
|
233
|
-
type PostgresFactory = (server: ServerConfig, db: PostgresDatabaseConfig) => PoolLike;
|
|
234
|
-
type RedisFactory = (config: RedisServerConfig) => RedisLike;
|
|
235
|
-
declare class StorageManager {
|
|
236
|
-
#private;
|
|
237
|
-
/**
|
|
238
|
-
* Apply the storage config block from `theo.config.ts`. Second call warns
|
|
239
|
-
* and is ignored (D3). Reset only via `__resetForTests()`.
|
|
240
|
-
*/
|
|
241
|
-
configure(config: StorageConfig): void;
|
|
242
|
-
/**
|
|
243
|
-
* Generic cache + factory for ANY client (MySQL, Mongo, Turso, DynamoDB, …).
|
|
244
|
-
* Returns the cached client OR invokes the factory and caches its return.
|
|
245
|
-
*
|
|
246
|
-
* EC-1 FIX: cache-hit check uses `Map.has(name)`, NOT `cached !== undefined`.
|
|
247
|
-
* Factories returning `null` or `undefined` are valid (lazy connect, stubs);
|
|
248
|
-
* the `!== undefined` check would re-invoke the factory infinitely for
|
|
249
|
-
* undefined returns AND silently cache `null` cast as `T`.
|
|
250
|
-
*
|
|
251
|
-
* EC-2 (documented type hole): `useStorage<A>('x', fA)` followed by
|
|
252
|
-
* `useStorage<B>('x', fB)` returns the cached A cast as B. Same trade-off
|
|
253
|
-
* as `Map<string, unknown>` — caller is responsible for using unique names
|
|
254
|
-
* per type.
|
|
255
|
-
*
|
|
256
|
-
* Lifecycle: generic clients are NOT auto-drained by `dispose()`. Call
|
|
257
|
-
* `manager.register({ name, dispose })` separately to participate.
|
|
258
|
-
*
|
|
259
|
-
* Reserved name prefixes (do NOT use): `__pg:`, `__redis:`, `__unstorage:`,
|
|
260
|
-
* `__db0:` — these are used internally by the typed helpers.
|
|
261
|
-
*/
|
|
262
|
-
useStorage<T>(name: string, factory: () => T): T;
|
|
263
|
-
/**
|
|
264
|
-
* Return a Postgres pool for the named database. Lazy + cached. Factory
|
|
265
|
-
* invoked exactly once per `dbName` (D2).
|
|
266
|
-
*
|
|
267
|
-
* Throws if:
|
|
268
|
-
* - manager is disposed
|
|
269
|
-
* - `dbName` is not in `config.databases`
|
|
270
|
-
* - the referenced server is not in `config.servers` (EC-2: deferred
|
|
271
|
-
* cross-field validation surfaces here, not at configure time)
|
|
272
|
-
*/
|
|
273
|
-
usePostgres(dbName: string, factory: PostgresFactory): PoolLike;
|
|
274
|
-
/**
|
|
275
|
-
* Return a Redis client for the named server. Lazy + cached. Factory
|
|
276
|
-
* invoked exactly once per `serverName`.
|
|
277
|
-
*/
|
|
278
|
-
useRedis(serverName: string, factory: RedisFactory): RedisLike;
|
|
279
|
-
/**
|
|
280
|
-
* Register an adapter for graceful shutdown coordination (D6).
|
|
281
|
-
*
|
|
282
|
-
* EC-4: throws if the manager is already disposed — prevents silent
|
|
283
|
-
* leaks in test seams that reset+reuse the manager.
|
|
284
|
-
*/
|
|
285
|
-
register(adapter: StorageAdapter): void;
|
|
286
|
-
/**
|
|
287
|
-
* Drain in parallel — registered adapters, then PG pools, then Redis
|
|
288
|
-
* clients. Idempotent (D5). Errors per resource are logged and swallowed
|
|
289
|
-
* — they do NOT prevent shutdown of the remaining resources.
|
|
290
|
-
*
|
|
291
|
-
* Caller must wrap in a timeout if a bound is needed (EC-7: documented).
|
|
292
|
-
* In production, `start.ts` wraps the whole shutdown sequence in a 25 s
|
|
293
|
-
* force-exit timer.
|
|
294
|
-
*/
|
|
295
|
-
dispose(): Promise<void>;
|
|
296
|
-
/** @internal Testing seam — resets state so a single test file can re-use the singleton across `it` blocks (EC-3). */
|
|
297
|
-
__resetForTests(): void;
|
|
298
|
-
/** @internal Introspection helper for tests. */
|
|
299
|
-
__isConfiguredForTests(): boolean;
|
|
300
|
-
/** @internal Introspection helper for tests. */
|
|
301
|
-
__isDisposedForTests(): boolean;
|
|
302
|
-
}
|
|
303
|
-
declare function getStorageManager(): StorageManager;
|
|
304
|
-
/** @internal Drops the module-level singleton — used by tests that need a fresh manager. */
|
|
305
|
-
declare function __resetSingletonForTests(): void;
|
|
306
|
-
|
|
307
|
-
interface PostgresJobBackendOptions {
|
|
308
|
-
pool: PoolLike;
|
|
309
|
-
/** Table name override (default `theokit_jobs`). */
|
|
310
|
-
tableName?: string;
|
|
311
|
-
}
|
|
312
|
-
declare class PostgresJobBackend implements JobBackend {
|
|
313
|
-
#private;
|
|
314
|
-
readonly name = "postgres";
|
|
315
|
-
constructor(opts: PostgresJobBackendOptions);
|
|
316
|
-
/**
|
|
317
|
-
* T2.1 — Construct a `PostgresJobBackend` using a pool managed by the
|
|
318
|
-
* shared `StorageManager`. The manager caches the pool per `dbName`, so
|
|
319
|
-
* repeated calls (in the same process) re-use the same connection pool.
|
|
320
|
-
*
|
|
321
|
-
* Equivalent to:
|
|
322
|
-
* ```ts
|
|
323
|
-
* const pool = manager.usePostgres(dbName, factory)
|
|
324
|
-
* new PostgresJobBackend({ pool, ...options })
|
|
325
|
-
* ```
|
|
326
|
-
*
|
|
327
|
-
* Errors thrown by the manager (unknown dbName, dangling server reference,
|
|
328
|
-
* manager already disposed) propagate to the caller with actionable text.
|
|
329
|
-
*
|
|
330
|
-
* @see ADR-0007
|
|
331
|
-
*/
|
|
332
|
-
static fromStorageManager(manager: StorageManager, dbName: string, factory: PostgresFactory, options?: Omit<PostgresJobBackendOptions, 'pool'>): PostgresJobBackend;
|
|
333
|
-
/**
|
|
334
|
-
* Create or upgrade the schema. Idempotent (uses IF NOT EXISTS).
|
|
335
|
-
* Call once at process start; safe to re-run on every deploy.
|
|
336
|
-
*/
|
|
337
|
-
migrate(): Promise<void>;
|
|
338
|
-
enqueue(input: JobEnqueueInput): Promise<{
|
|
339
|
-
jobId: string;
|
|
340
|
-
}>;
|
|
341
|
-
dequeue(opts: {
|
|
342
|
-
batchSize?: number;
|
|
343
|
-
lockSeconds?: number;
|
|
344
|
-
}): Promise<JobLease[]>;
|
|
345
|
-
ack(jobId: string): Promise<void>;
|
|
346
|
-
nack(jobId: string, opts: {
|
|
347
|
-
error: string;
|
|
348
|
-
nonRetryable?: boolean;
|
|
349
|
-
}): Promise<void>;
|
|
350
|
-
idempotency(key: string, _ttlSeconds: number): Promise<{
|
|
351
|
-
jobId: string;
|
|
352
|
-
} | null>;
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
/**
|
|
356
|
-
* Transactional outbox buffer for `ctx.queue.enqueue` (T2.5).
|
|
357
|
-
*
|
|
358
|
-
* Lifecycle (wired in `http/execute.ts` by T2.5 integration step):
|
|
359
|
-
* 1. Request handler invoked → create per-request outbox.
|
|
360
|
-
* 2. Handler calls `ctx.queue.enqueue(...)` → outbox.push(entry).
|
|
361
|
-
* 3a. Response committed (`res.on('finish')` + statusCode < 400) →
|
|
362
|
-
* outbox.flush(backend.enqueue).
|
|
363
|
-
* 3b. Response errors (statusCode >= 400, handler throws, `res.on('close')`
|
|
364
|
-
* without finish) → outbox.discard().
|
|
365
|
-
*
|
|
366
|
-
* Invariants:
|
|
367
|
-
* - Outbox NEVER dispatches before commit. Backend.enqueue is NEVER
|
|
368
|
-
* called on the request hot path.
|
|
369
|
-
* - Handler throws → ZERO jobs dispatched. KEY guarantee from ADR-0003.
|
|
370
|
-
*
|
|
371
|
-
* EC-107: when `backend.enqueue` throws DURING flush (after response
|
|
372
|
-
* committed), we log + continue. The response is already gone; partial
|
|
373
|
-
* dispatch is better than zero. Each failure goes to `onError` (default:
|
|
374
|
-
* `console.warn`).
|
|
375
|
-
*/
|
|
376
|
-
interface OutboxFlushOptions {
|
|
377
|
-
/**
|
|
378
|
-
* Called once per failed entry. Default: `console.warn` with the
|
|
379
|
-
* entry name (NOT input — privacy). Throw nothing back to caller —
|
|
380
|
-
* flush always completes.
|
|
381
|
-
*/
|
|
382
|
-
onError?: (entryName: string, errorMessage: string) => void;
|
|
383
|
-
}
|
|
384
|
-
interface Outbox {
|
|
385
|
-
push(entry: JobEnqueueInput): void;
|
|
386
|
-
drain(): JobEnqueueInput[];
|
|
387
|
-
discard(): void;
|
|
388
|
-
size(): number;
|
|
389
|
-
/**
|
|
390
|
-
* Dispatch all buffered entries via `dispatcher`. Returns after all
|
|
391
|
-
* entries attempted. Per-entry failures invoke `opts.onError` (or
|
|
392
|
-
* default warn) and do NOT abort the loop.
|
|
393
|
-
*/
|
|
394
|
-
flush(dispatcher: (entry: JobEnqueueInput) => Promise<unknown>, opts?: OutboxFlushOptions): Promise<void>;
|
|
395
|
-
}
|
|
396
|
-
declare function createOutbox(): Outbox;
|
|
397
|
-
|
|
398
|
-
/**
|
|
399
|
-
* Options forwarded to `backend.enqueue` at outbox flush time.
|
|
400
|
-
*/
|
|
401
|
-
interface EnqueueOptions {
|
|
402
|
-
/** Optional idempotency key for at-most-once dispatch within TTL. */
|
|
403
|
-
idempotencyKey?: string;
|
|
404
|
-
/** Optional delay before the job becomes available. */
|
|
405
|
-
delaySeconds?: number;
|
|
406
|
-
}
|
|
407
|
-
/**
|
|
408
|
-
* Typed queue client. Per ADR-0003, `enqueue` returns `void` and buffers
|
|
409
|
-
* to the per-request outbox. `enqueueWithId` is the log-correlation
|
|
410
|
-
* variant that resolves to `{ jobId }` AFTER the outbox flushes.
|
|
411
|
-
*
|
|
412
|
-
* Type inference: `JobName extends keyof JobRegistry`. Users extend the
|
|
413
|
-
* `JobRegistry` interface via module augmentation (see `job-types.ts`).
|
|
414
|
-
* Without augmentation, all enqueue calls compile-error with "Type X is
|
|
415
|
-
* not assignable to type never" — documented in EC-110 as a known onboarding
|
|
416
|
-
* friction.
|
|
417
|
-
*/
|
|
418
|
-
interface QueueClient {
|
|
419
|
-
/** Buffer a job to the outbox. Returns void (fire-and-forget). */
|
|
420
|
-
enqueue<JobName extends keyof JobRegistry>(name: JobName, input: JobRegistry[JobName], opts?: EnqueueOptions): void;
|
|
421
|
-
/**
|
|
422
|
-
* Buffer a job AND return a Promise that resolves with the jobId
|
|
423
|
-
* AFTER the outbox flushes (i.e., after the response commits). NOT a
|
|
424
|
-
* handle to await the job result — there is no result API.
|
|
425
|
-
*/
|
|
426
|
-
enqueueWithId<JobName extends keyof JobRegistry>(name: JobName, input: JobRegistry[JobName], opts?: EnqueueOptions): Promise<{
|
|
427
|
-
jobId: string;
|
|
428
|
-
}>;
|
|
429
|
-
}
|
|
430
|
-
interface CreateQueueClientOptions {
|
|
431
|
-
/** W3C traceparent to propagate to enqueued jobs. */
|
|
432
|
-
traceparent?: string;
|
|
433
|
-
}
|
|
434
|
-
/**
|
|
435
|
-
* Create a per-request queue client wired to a backend + outbox.
|
|
436
|
-
*
|
|
437
|
-
* The backend is referenced only to resolve `enqueueWithId` jobIds at
|
|
438
|
-
* flush time — `enqueue` itself does NOT call backend on the hot path
|
|
439
|
-
* (transactional outbox guarantee per ADR-0003).
|
|
440
|
-
*/
|
|
441
|
-
declare function createQueueClient(backend: JobBackend, outbox: Outbox, opts?: CreateQueueClientOptions): QueueClient;
|
|
442
|
-
/**
|
|
443
|
-
* Outbox dispatcher that bridges enqueueWithId's hidden promise channel
|
|
444
|
-
* (`__resolveJobId` / `__rejectJobId`) to the backend.enqueue result.
|
|
445
|
-
*
|
|
446
|
-
* Use this when the request lifecycle hooks call `outbox.flush(...)`.
|
|
447
|
-
*/
|
|
448
|
-
declare function createOutboxDispatcher(backend: JobBackend): (entry: JobEnqueueInput) => Promise<unknown>;
|
|
449
|
-
|
|
450
|
-
/**
|
|
451
|
-
* Job runner — pulls leases from a backend and invokes the matching
|
|
452
|
-
* handler. Each invocation wires up `JobContext` with:
|
|
453
|
-
* - `traceId` extracted from the lease's `traceparent` header (W3C
|
|
454
|
-
* Trace Context per R0.5.9), OR a fresh generated trace_id when
|
|
455
|
-
* the upstream had no traceparent OR it was malformed.
|
|
456
|
-
* - `attempt` from the lease.
|
|
457
|
-
* - `signal` that aborts when the lease times out.
|
|
458
|
-
*
|
|
459
|
-
* `tick()` runs one dequeue+dispatch cycle and returns when all leases
|
|
460
|
-
* have been ack'd or nack'd. Production deploys call `tick()` in a loop
|
|
461
|
-
* with backoff (the loop is outside this module's scope).
|
|
462
|
-
*
|
|
463
|
-
* EC-6 (trace continuity edge): when a lease has no traceparent OR a
|
|
464
|
-
* malformed one, the handler still gets a valid traceId (generated) —
|
|
465
|
-
* never null/undefined. The job MAY itself enqueue child jobs that
|
|
466
|
-
* continue the new trace_id.
|
|
467
|
-
*/
|
|
468
|
-
interface JobRunner {
|
|
469
|
-
/** Run one dequeue+dispatch cycle. */
|
|
470
|
-
tick(opts?: {
|
|
471
|
-
batchSize?: number;
|
|
472
|
-
lockSeconds?: number;
|
|
473
|
-
}): Promise<number>;
|
|
474
|
-
}
|
|
475
|
-
declare function createJobRunner(backend: JobBackend, definitions: readonly JobDefinition[]): JobRunner;
|
|
476
|
-
|
|
477
|
-
interface JobNode {
|
|
478
|
-
readonly name: string;
|
|
479
|
-
readonly filePath: string;
|
|
480
|
-
readonly maxAttempts: number;
|
|
481
|
-
readonly hasInputSchema: boolean;
|
|
482
|
-
}
|
|
483
|
-
declare class DuplicateJobNameError extends Error {
|
|
484
|
-
readonly jobName: string;
|
|
485
|
-
readonly filePaths: readonly string[];
|
|
486
|
-
readonly code = "DUPLICATE_JOB_NAME";
|
|
487
|
-
constructor(jobName: string, filePaths: readonly string[]);
|
|
488
|
-
}
|
|
489
|
-
declare function scanJobs(jobsDir: string): Promise<JobNode[]>;
|
|
490
|
-
|
|
491
|
-
declare const JOB_MANIFEST_SCHEMA_VERSION: 1;
|
|
492
|
-
interface JobManifestEntry {
|
|
493
|
-
readonly name: string;
|
|
494
|
-
readonly filePath: string;
|
|
495
|
-
readonly maxAttempts: number;
|
|
496
|
-
readonly hasInputSchema: boolean;
|
|
497
|
-
}
|
|
498
|
-
interface JobManifest {
|
|
499
|
-
readonly schemaVersion: typeof JOB_MANIFEST_SCHEMA_VERSION;
|
|
500
|
-
readonly generatedAt: string;
|
|
501
|
-
readonly jobs: readonly JobManifestEntry[];
|
|
502
|
-
}
|
|
503
|
-
declare function buildJobManifest(nodes: readonly JobNode[], projectRoot?: string): JobManifest;
|
|
504
|
-
declare function writeJobManifest(path: string, input: readonly JobNode[] | JobManifest, projectRoot?: string): void;
|
|
505
|
-
|
|
506
|
-
export { DuplicateContextKeyError as D, type EnqueueOptions as E, InMemoryJobBackend as I, type JobBackend as J, NonRetryableError as N, type Outbox as O, type PostgresFactory as P, type QueueClient as Q, type RedisFactory as R, StorageManager as S, __resetSingletonForTests as _, DuplicateJobNameError as a, type InMemoryJobBackendOptions as b, JOB_MANIFEST_SCHEMA_VERSION as c, type JobContext as d, type JobDefinition as e, type JobEnqueueInput as f, type JobLease as g, type JobManifest as h, type JobManifestEntry as i, type JobNode as j, type JobOptions as k, type JobRegistry as l, type JobRunner as m, type OutboxFlushOptions as n, PostgresJobBackend as o, type PostgresJobBackendOptions as p, buildJobManifest as q, createJobRunner as r, createOutbox as s, createOutboxDispatcher as t, createQueueClient as u, defineJob as v, getStorageManager as w, scanJobs as x, writeJobManifest as y };
|