void 0.25.0 → 0.26.1
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/AGENTS_TEMPLATE.md +1 -3
- package/README.md +19 -9
- package/dist/{account-cmd-DcR1ywt8.mjs → account-cmd-CfUXh_nU.mjs} +8 -7
- package/dist/{application-analysis-BVsVqc11.mjs → application-analysis-DKy02UY0.mjs} +21 -32
- package/dist/{application-routing-B7QEjqSR.mjs → application-routing-DQyUh_5S.mjs} +1 -1
- package/dist/{auth-7wuZ5ob8.mjs → auth-B5_tZLxT.mjs} +9 -9
- package/dist/{auth-CdgZ9uag.mjs → auth-BgX2qYSY.mjs} +1 -1
- package/dist/{auth-link-Z6E5DYvM.mjs → auth-link-D5RmKnzh.mjs} +5 -5
- package/dist/{auth-migrations-9vif1uj8.mjs → auth-migrations-BwHgeEsD.mjs} +8 -18
- package/dist/{auth-router-BdM4avI8.mjs → auth-router-Bap-pvbn.mjs} +6 -19
- package/dist/{better-auth-shared-BVkjZ3vM.d.mts → better-auth-shared-CPvWD3nG.d.mts} +0 -4
- package/dist/{better-auth-shared-hy6RPh9W.mjs → better-auth-shared-DPpj8zxc.mjs} +94 -16
- package/dist/{build-cmd-CEE7D-hM.mjs → build-cmd-B58c8iS8.mjs} +8 -7
- package/dist/{cache-TcZnBLtH.mjs → cache-Bo52trKF.mjs} +8 -8
- package/dist/{cancel-deploy-CYoZmcmR.mjs → cancel-deploy-BZNz3Q26.mjs} +6 -5
- package/dist/{cf-access-AHKBzmuu.mjs → cf-access-ngGqZpHZ.mjs} +11 -12
- package/dist/{cf-build-output-U8o1Gl6X.mjs → cf-build-output-DjvB_872.mjs} +62 -85
- package/dist/cf-build-output-H9a97vME.mjs +2 -0
- package/dist/cli/cli.mjs +48 -83
- package/dist/cli/cloudflare-operation-process.mjs +71 -77
- package/dist/cli/env-schema-probe.d.mts +1 -1
- package/dist/cli/env-schema-probe.mjs +5 -6
- package/dist/client-By4JjMw_.mjs +2 -0
- package/dist/{client-RsPo8wsP.mjs → client-C2Prx_Bi.mjs} +30 -8
- package/dist/{cloudflare-auth-Qdc7tw8F.mjs → cloudflare-auth-CuxfF6OA.mjs} +9 -17
- package/dist/{cloudflare-cmd-bhwCxAN6.mjs → cloudflare-cmd-lHqNlJGW.mjs} +6 -5
- package/dist/{cloudflare-config-Bktvwtpf.mjs → cloudflare-config-BmhBv3HV.mjs} +1 -1
- package/dist/{cloudflare-connect-CuhRgk3k.mjs → cloudflare-connect-2G3rL2rP.mjs} +4 -4
- package/dist/{cloudflare-operations-BhbK6yTq.mjs → cloudflare-operations-BlYLlowZ.mjs} +1 -1
- package/dist/{cloudflare-operations-CjaV4lZi.mjs → cloudflare-operations-CwI1bChl.mjs} +41 -70
- package/dist/{cloudflare-process-B-wekeR6.mjs → cloudflare-process-2-TfIEzB.mjs} +20 -22
- package/dist/{config-CyQ-wVd7.mjs → config-5r-YpMC-.mjs} +1 -1
- package/dist/{config-C_XRIPx2.mjs → config-B_ggY-IO.mjs} +3 -3
- package/dist/config-BtSFvXZx.mjs +2 -0
- package/dist/config-CLYAosnQ.mjs +78 -0
- package/dist/{config-BMHb8RCj.d.mts → config-CSa15FvD.d.mts} +1 -1
- package/dist/{config-Br_JZD6u.mjs → config-DiowPT80.mjs} +24 -30
- package/dist/config-entry.d.mts +1 -1
- package/dist/{config-write-B1f88wJA.mjs → config-write-AHGesphx.mjs} +8 -7
- package/dist/{connect-DCvUmPXY.mjs → connect-X0MUA1gk.mjs} +12 -11
- package/dist/{create-project-eAPgYq35.mjs → create-project-DxiyW6iX.mjs} +7 -7
- package/dist/{create-project-C734I-Mu.mjs → create-project-iwkbqiBU.mjs} +1 -1
- package/dist/{db-C07GEdKF.mjs → db-XnVMHzoV.mjs} +101 -133
- package/dist/{delete-pKMVsrpJ.mjs → delete-esYlMiSJ.mjs} +8 -8
- package/dist/{deploy-DfsAe-T0.mjs → deploy-BsEvnlJl.mjs} +2377 -2512
- package/dist/deploy-C1d-YTfp.mjs +2 -0
- package/dist/{dev-inbox-D64ZKUod.mjs → dev-inbox-CK-UuPob.mjs} +7 -16
- package/dist/{discover-BcPPiF1o.mjs → discover-CkCYv9T_.mjs} +1 -2
- package/dist/discover-EDUf6JJw.mjs +2 -0
- package/dist/{prompts-ZAuJlyCj.mjs → dist-Bx1z6Eva.mjs} +1 -1
- package/dist/{dist-AoCzRTJE.mjs → dist-Cegxq8gs.mjs} +8 -8
- package/dist/{prompts-6OSVA7DJ.mjs → dist-D3m88sjf.mjs} +10 -53
- package/dist/{domain-D3uA9ize.mjs → domain-CbbBWhWE.mjs} +29 -30
- package/dist/{dotenv-VQxupEUv.mjs → dotenv-BfU6eqFt.mjs} +20 -32
- package/dist/{drizzle-Beb2Am5S.mjs → drizzle-CF84FOVM.mjs} +16 -13
- package/dist/{email-z3o2cwjH.mjs → email-CpuT42g7.mjs} +24 -19
- package/dist/{email--tEtMoj_.mjs → email-d_Aux1vM.mjs} +1 -1
- package/dist/{entry-CF5wvH4w.mjs → entry-CMAkqBmU.mjs} +6 -6
- package/dist/{env-_v349JBd.mjs → env-BxocywBB.mjs} +25 -6
- package/dist/{env-D5liuQYR.mjs → env-DMA3cXZt.mjs} +1 -1
- package/dist/{env-public-BX_r8HR6.d.mts → env-public-DR7ZM6d-.d.mts} +1 -1
- package/dist/{env-raw-Cx8ElDdj.mjs → env-raw-jZpP5n47.mjs} +1 -2
- package/dist/{env-types-D5kds_OZ.mjs → env-types-CwXgeMgL.mjs} +1 -1
- package/dist/{env-validation-cZBvGWaP.mjs → env-validation-CrVNjsPm.mjs} +1 -1
- package/dist/{env-validation-vBSQ8gw5.mjs → env-validation-Dxdx_5wo.mjs} +17 -21
- package/dist/{env-3Q8-_2IH.mjs → env-w9jOyGZn.mjs} +10 -9
- package/dist/{fetch-_SeGZao9.d.mts → fetch-BPCYVi3H.d.mts} +20 -1
- package/dist/{fetch-BIZJh7vR.mjs → fetch-sAcwjzLO.mjs} +1 -1
- package/dist/{fetch-stream-IvCYKyQL.mjs → fetch-stream-PGgz4uGz.mjs} +26 -24
- package/dist/{fetch-stream-Bjf0hoZb.d.mts → fetch-stream-obvZ7fvO.d.mts} +1 -16
- package/dist/{gen-NjwoG9FK.mjs → gen-DtkQhvQg.mjs} +40 -57
- package/dist/gen-dA9hW7AV.mjs +2 -0
- package/dist/{github-cmd-DquUq-b1.mjs → github-cmd-D_FsOFxq.mjs} +65 -164
- package/dist/{handler-DghKr6dU.mjs → handler-BHAn2fZJ.mjs} +1 -0
- package/dist/{handler-CZ4nAylQ.d.mts → handler-CNAwjRcW.d.mts} +5 -12
- package/dist/{head-Do8P4puT.d.mts → head-C8K_iGe6.d.mts} +1 -1
- package/dist/{head-D_QRR5Yd.mjs → head-D2VF4ApL.mjs} +29 -51
- package/dist/{headers-2rKda9Y6.mjs → headers-DlfR78Nu.mjs} +3 -3
- package/dist/{help-DRZXC4fj.mjs → help-CVFBTmBx.mjs} +23 -38
- package/dist/help-DzKUrQvk.mjs +2 -0
- package/dist/{inbound-fRkqcXaC.mjs → inbound-PfQDLXc5.mjs} +23 -24
- package/dist/index.d.mts +19 -2
- package/dist/index.mjs +632 -532
- package/dist/{info-BmA3_IFZ.mjs → info-PYWwkWyt.mjs} +4 -4
- package/dist/{init-DT7yuuyl.mjs → init-Bw-fRKGp.mjs} +161 -197
- package/dist/{limits-Bq5LG8Id.d.mts → limits-CFsDKQvU.d.mts} +1 -10
- package/dist/{limits-Cjuk2VPm.mjs → limits-D0vD1M9A.mjs} +1 -22
- package/dist/{link-CXOlqh2F.mjs → link-DlPG8iX3.mjs} +10 -10
- package/dist/{list-eEWVJEPn.mjs → list-2GN7_ueV.mjs} +11 -9
- package/dist/{live-CB1y5IuC.mjs → live-CgQuTpqD.mjs} +15 -16
- package/dist/{live-Chw1eIMv.d.mts → live-Du8jXwOW.d.mts} +4 -2
- package/dist/{local-d1-Df4XpwhW.mjs → local-d1-ga5O_idV.mjs} +2 -2
- package/dist/{login-pWQHYVu2.mjs → login-D-Q4xw3Q.mjs} +7 -7
- package/dist/login-Dc-wuTDq.mjs +2 -0
- package/dist/{logs-DnxVX7TR.mjs → logs-rd8J-OFh.mjs} +28 -11
- package/dist/migrate-BHp07yJE.mjs +2 -0
- package/dist/{migrate-CV1on-yJ.mjs → migrate-NLsjBbuM.mjs} +34 -20
- package/dist/{mime-D5Nmdzf7.mjs → mime-DxCznlJq.mjs} +45 -95
- package/dist/{node-BkyRWRx8.mjs → node-DJicPvPj.mjs} +5 -5
- package/dist/{operator-args-CAVcmwUt.mjs → operator-args-BNsW5gfp.mjs} +10 -1
- package/dist/{operator-auth-CkmTE3rt.mjs → operator-auth-AzVLbrr3.mjs} +4 -8
- package/dist/{operator-client-LmwjxT6q.mjs → operator-client-BQtzyG-g.mjs} +3 -3
- package/dist/{operator-cmd-d-IEKgNk.mjs → operator-cmd-B6f6Cg9Z.mjs} +45 -14
- package/dist/operator-cmd-Cwn50lOV.mjs +2 -0
- package/dist/{output-BBsUwdyT.mjs → output-C50ag2r3.mjs} +44 -2
- package/dist/pages/client.d.mts +19 -51
- package/dist/pages/client.mjs +204 -225
- package/dist/pages/head-client.d.mts +1 -1
- package/dist/pages/head.d.mts +1 -1
- package/dist/pages/head.mjs +1 -1
- package/dist/pages/index.d.mts +2 -2
- package/dist/pages/index.mjs +6 -12
- package/dist/pages/islands-plugin.d.mts +1 -1
- package/dist/pages/islands-plugin.mjs +21 -25
- package/dist/pages/protocol.d.mts +2 -2
- package/dist/pages/protocol.mjs +2 -2
- package/dist/{plan-NPpwZ_kc.mjs → plan-BhLO2p4w.mjs} +4 -3
- package/dist/plan-CH2G51je.mjs +2 -0
- package/dist/{platform-args-Bzf8JPc2.mjs → platform-args-BoZkWQnJ.mjs} +4 -2
- package/dist/platform-args-DYgITk0D.mjs +2 -0
- package/dist/{platform-auth-config-0V0lA3pF.mjs → platform-auth-config-n603OANg.mjs} +45 -40
- package/dist/{platform-auth-protection-DFeJ-JkK.mjs → platform-auth-protection-zxDr0hWW.mjs} +9 -8
- package/dist/{platform-auth-recovery-ICy4muq6.mjs → platform-auth-recovery-tw9lgtgE.mjs} +8 -7
- package/dist/{platform-cmd-D7vSWMvV.mjs → platform-cmd-B8-bCb7t.mjs} +48 -23
- package/dist/{platform-cmd-BPySFOew.mjs → platform-cmd-C00YM14r.mjs} +1 -1
- package/dist/{platform-discovery-DDDUvnqp.mjs → platform-discovery-BC0HCKYt.mjs} +18 -4
- package/dist/{platform-domain-CUdY064e.mjs → platform-domain-p0kobLV8.mjs} +6 -5
- package/dist/{platform-lifecycle-Dm09JNkn.mjs → platform-lifecycle-D_QEY32D.mjs} +906 -389
- package/dist/{platform-lifecycle-BaUdTRPU.mjs → platform-lifecycle-vFqtNPPa.mjs} +1 -1
- package/dist/{platform-management-BSEc_ZeG.mjs → platform-management-BdYblvvE.mjs} +175 -32
- package/dist/{platform-management-Bp6aoH2C.mjs → platform-management-oi-SvI3f.mjs} +1 -1
- package/dist/{platform-plans-config-B0pOVQyW.mjs → platform-plans-config-CjiFv5J4.mjs} +5 -4
- package/dist/{platform-recovery-WOZ95Uze.mjs → platform-recovery-PvNS9Nl2.mjs} +3 -3
- package/dist/{platform-registry-KfNEF84O.mjs → platform-registry-P387v42A.mjs} +17 -10
- package/dist/platform-setup-DVe42Ws7.mjs +299 -0
- package/dist/{plugin-inference-CXWnn79A.mjs → plugin-inference-BlQbOL0P.mjs} +43 -42
- package/dist/prepare-DRUV-g3X.mjs +2 -0
- package/dist/{prepare-DnaKBi--.mjs → prepare-Do96654b.mjs} +8 -8
- package/dist/{prepare-39EvOhI6.mjs → prepare-Dq9hTIbo.mjs} +4 -3
- package/dist/{prerender-render-D9qbLs2f.mjs → prerender-render-Ct20jftc.mjs} +17 -3
- package/dist/prerender-render.mjs +1 -1
- package/dist/{project-IOjBU8R6.mjs → project-BiaPQ7ur.mjs} +1 -1
- package/dist/{project-BkbfDs0V.mjs → project-DQstYTxO.mjs} +1 -1
- package/dist/{project-cmd-Bs5A392E.mjs → project-cmd-ti8_yTcA.mjs} +19 -19
- package/dist/{project-team-ohAWWaew.mjs → project-team-CDPE1Tsg.mjs} +15 -18
- package/dist/{project-token-CP01Jna6.mjs → project-token-CkZ1cN0Z.mjs} +14 -17
- package/dist/{project-tsconfig-B8GeM0RM.mjs → project-tsconfig-CVJhNMxs.mjs} +2 -1
- package/dist/{project-zero-trust-BzkVgx35.mjs → project-zero-trust-DdjLR61k.mjs} +12 -9
- package/dist/{protocol-CjF_iI9X.d.mts → protocol-BPZaNqBo.d.mts} +4 -2
- package/dist/{protocol-U7bfjHmA.mjs → protocol-CfaUwNs8.mjs} +46 -49
- package/dist/{providers-CJlNS3kT.mjs → providers-BXuhmuub.mjs} +1 -12
- package/dist/{provision-Btj1jppf.mjs → provision-BfaLiWbj.mjs} +51 -42
- package/dist/{provision-BEv0k-qz.mjs → provision-Wu9ZBk9L.mjs} +2 -3
- package/dist/{requests-B3PBuGlX.mjs → requests-DFAqyYy8.mjs} +5 -5
- package/dist/resolve-project-BIeYs9Cw.mjs +2 -0
- package/dist/{resolve-project-BG5ORGID.mjs → resolve-project-CP8rZs_p.mjs} +6 -1
- package/dist/{rollback-DDub9GsO.mjs → rollback-BKYXBduI.mjs} +30 -37
- package/dist/{route-types-Clm4WD0B.mjs → route-types-CbtsIeFn.mjs} +1 -1
- package/dist/route-url-BgPja1GS.d.mts +5 -0
- package/dist/route-url-BjGv_KKY.mjs +28 -0
- package/dist/runner-9wjsSZx-.mjs +2 -0
- package/dist/{runner-Ol0TNjk6.mjs → runner-DMBKSrRk.mjs} +2 -2
- package/dist/{runner-mysql-DmWchSWJ.mjs → runner-mysql-CEzKtmFb.mjs} +8 -8
- package/dist/{runner-mysql-CEG5JozK.mjs → runner-mysql-CkFqZ6CE.mjs} +1 -1
- package/dist/{runner-pg-Bh4AgZdj.mjs → runner-pg-BGYRFdRp.mjs} +1 -1
- package/dist/runtime/ai.d.mts +11 -12
- package/dist/runtime/ai.mjs +47 -113
- package/dist/runtime/better-auth-mysql.d.mts +1 -1
- package/dist/runtime/better-auth-mysql.mjs +4 -9
- package/dist/runtime/better-auth-pg.d.mts +1 -1
- package/dist/runtime/better-auth-pg.mjs +5 -10
- package/dist/runtime/better-auth.d.mts +1 -1
- package/dist/runtime/better-auth.mjs +3 -3
- package/dist/runtime/client-react.d.mts +2 -3
- package/dist/runtime/client-react.mjs +2 -2
- package/dist/runtime/client-solid.d.mts +2 -3
- package/dist/runtime/client-solid.mjs +2 -2
- package/dist/runtime/client-svelte.d.mts +2 -3
- package/dist/runtime/client-svelte.mjs +2 -2
- package/dist/runtime/client-vue.d.mts +2 -3
- package/dist/runtime/client-vue.mjs +2 -2
- package/dist/runtime/client.d.mts +2 -3
- package/dist/runtime/client.mjs +2 -2
- package/dist/runtime/db.mjs +1 -1
- package/dist/runtime/durable.mjs +3 -10
- package/dist/runtime/email/testing.mjs +5 -5
- package/dist/runtime/email.d.mts +2 -1
- package/dist/runtime/email.mjs +11 -27
- package/dist/runtime/env-public.d.mts +1 -1
- package/dist/runtime/env-public.mjs +15 -20
- package/dist/runtime/env.mjs +1 -1
- package/dist/runtime/fetch-stream.d.mts +2 -2
- package/dist/runtime/fetch-stream.mjs +1 -1
- package/dist/runtime/fetch.d.mts +2 -3
- package/dist/runtime/fetch.mjs +1 -1
- package/dist/runtime/handler.d.mts +1 -1
- package/dist/runtime/handler.mjs +2 -2
- package/dist/runtime/isr.mjs +1 -1
- package/dist/runtime/kv.mjs +10 -11
- package/dist/runtime/limits.d.mts +2 -2
- package/dist/runtime/limits.mjs +2 -2
- package/dist/runtime/live-client.d.mts +1 -1
- package/dist/runtime/live-client.mjs +12 -22
- package/dist/runtime/live-server.mjs +27 -35
- package/dist/runtime/live.d.mts +2 -2
- package/dist/runtime/live.mjs +2 -2
- package/dist/runtime/migration-handler.mjs +35 -86
- package/dist/runtime/queues.mjs +1 -1
- package/dist/runtime/remote/binding-handler.d.mts +2 -2
- package/dist/runtime/remote/binding-handler.mjs +8 -9
- package/dist/runtime/remote/index.mjs +27 -77
- package/dist/runtime/route-url.d.mts +2 -4
- package/dist/runtime/route-url.mjs +1 -1
- package/dist/runtime/routing.d.mts +1 -1
- package/dist/runtime/routing.mjs +15 -26
- package/dist/runtime/sandbox.d.mts +1 -1
- package/dist/runtime/sandbox.mjs +14 -24
- package/dist/runtime/sse.mjs +1 -1
- package/dist/runtime/storage.mjs +1 -1
- package/dist/runtime/validator.d.mts +1 -1
- package/dist/runtime/ws-server.d.mts +2 -2
- package/dist/runtime/ws-server.mjs +30 -61
- package/dist/runtime/ws.d.mts +1 -1
- package/dist/runtime/ws.mjs +1 -1
- package/dist/{sandbox-XZAqzFlG.d.mts → sandbox-C5LFoJMf.d.mts} +7 -7
- package/dist/{scan-C7okrLyM.mjs → scan-C3uDzz6J.mjs} +21 -18
- package/dist/{secret-3c72lY1U.mjs → secret-BAt2KMmO.mjs} +15 -15
- package/dist/{skills-BPQUGClu.mjs → skills-BgVMvQdy.mjs} +2 -2
- package/dist/{sse-CQNaDFFV.mjs → sse-CMvCgjNk.mjs} +1 -1
- package/dist/{subcommand-prompt-Dhom39bd.mjs → subcommand-prompt-BSlnD1fI.mjs} +2 -2
- package/dist/sveltekit.d.mts +0 -2
- package/dist/terminal-log-text-D9ACPOuG.mjs +32 -0
- package/dist/validate-BJr9LfXy.mjs +2 -0
- package/dist/{validate-ctOrgiS3.mjs → validate-C9qJArv7.mjs} +9 -28
- package/dist/{defer-YsYDUoii.mjs → validation-error-Dg9Recn1.mjs} +11 -11
- package/dist/{wrangler-DhUerFkW.mjs → wrangler-D9KTuqnv.mjs} +89 -194
- package/dist/{ws-CL1w7GXU.d.mts → ws-CChrrAU-.d.mts} +1 -1
- package/dist/{yarn-pnp-BV4AzNul.mjs → yarn-pnp-CUX_iTPA.mjs} +19 -27
- package/{skills/void/docs → docs}/guide/ai.md +69 -64
- package/{skills/void/docs → docs}/guide/app-types.md +1 -1
- package/{skills/void/docs → docs}/guide/auth.md +37 -1
- package/{skills/void/docs → docs}/guide/database/postgresql.md +2 -2
- package/{skills/void/docs → docs}/guide/database.md +23 -8
- package/{skills/void/docs → docs}/guide/edge/revalidation.md +1 -1
- package/{skills/void/docs → docs}/guide/edge/rewrites.md +2 -4
- package/{skills/void/docs → docs}/guide/email/receiving.md +2 -2
- package/{skills/void/docs → docs}/guide/email/sending.md +0 -2
- package/{skills/void/docs → docs}/guide/env-vars.md +4 -0
- package/{skills/void/docs → docs}/guide/jobs.md +2 -2
- package/{skills/void/docs → docs}/guide/live.md +12 -5
- package/{skills/void/docs → docs}/guide/pages-routing/actions-and-forms.md +21 -9
- package/{skills/void/docs → docs}/guide/pages-routing/loaders.md +7 -3
- package/{skills/void/docs → docs}/guide/pages-routing/markdown.md +15 -23
- package/{skills/void/docs → docs}/guide/pages-routing/overview.md +6 -4
- package/{skills/void/docs → docs}/guide/platform/administration/access.md +2 -10
- package/{skills/void/docs → docs}/guide/platform/administration/operations.md +3 -12
- package/{skills/void/docs → docs}/guide/platform/administration/projects.md +1 -1
- package/{skills/void/docs → docs}/guide/platform/development/local.md +4 -2
- package/{skills/void/docs → docs}/guide/platform/development/runtime.md +1 -1
- package/{skills/void/docs → docs}/guide/platform/development/schema-ci.md +1 -1
- package/{skills/void/docs → docs}/guide/platform/installation/credentials.md +2 -2
- package/{skills/void/docs → docs}/guide/platform/installation/domains.md +3 -1
- package/{skills/void/docs → docs}/guide/platform/installation/first-deployment.md +8 -2
- package/{skills/void/docs → docs}/guide/platform/installation/maintenance.md +7 -1
- package/{skills/void/docs → docs}/guide/platform/installation/setup.md +1 -1
- package/docs/guide/platform/installation/uninstall.md +102 -0
- package/{skills/void/docs → docs}/guide/project-collaboration.md +6 -2
- package/{skills/void/docs → docs}/guide/queues.md +0 -2
- package/{skills/void/docs → docs}/guide/remote-dev.md +5 -5
- package/{skills/void/docs → docs}/guide/sandboxes.md +41 -22
- package/{skills/void/docs → docs}/guide/sse.md +0 -2
- package/{skills/void/docs → docs}/guide/storage.md +7 -2
- package/{skills/void/docs → docs}/guide/websockets.md +4 -0
- package/docs/integrations/agents.md +37 -0
- package/{skills/void/docs → docs}/integrations/frameworks/astro.md +3 -3
- package/{skills/void/docs → docs}/integrations/frameworks/nuxt.md +6 -2
- package/{skills/void/docs → docs}/integrations/hono.md +15 -7
- package/{skills/void/docs → docs}/integrations/nodejs-bun-deno.md +1 -0
- package/{skills/void/docs → docs}/reference/api/auth.md +1 -1
- package/{skills/void/docs → docs}/reference/api/handlers.md +4 -2
- package/{skills/void/docs → docs}/reference/api/pages.md +4 -0
- package/{skills/void/docs → docs}/reference/api/resources.md +11 -14
- package/{skills/void/docs → docs}/reference/api.md +35 -34
- package/{skills/void/docs → docs}/reference/cli/auth.md +3 -6
- package/{skills/void/docs → docs}/reference/cli/database.md +3 -4
- package/{skills/void/docs → docs}/reference/cli/generate.md +1 -1
- package/{skills/void/docs → docs}/reference/cli/github.md +3 -12
- package/{skills/void/docs → docs}/reference/cli/platform-config.md +3 -3
- package/{skills/void/docs → docs}/reference/cli/platform-email.md +2 -3
- package/{skills/void/docs → docs}/reference/cli/platform-installation.md +15 -13
- package/{skills/void/docs → docs}/reference/cli/platform-operations.md +3 -0
- package/{skills/void/docs → docs}/reference/cli/platform-users.md +2 -2
- package/{skills/void/docs → docs}/reference/cli/platform.md +4 -2
- package/{skills/void/docs → docs}/reference/cli/project.md +5 -4
- package/{skills/void/docs → docs}/reference/cli/secrets.md +3 -3
- package/{skills/void/docs → docs}/reference/cli/setup.md +9 -11
- package/{skills/void/docs → docs}/reference/cli.md +2 -2
- package/{skills/void/docs → docs}/reference/config.md +13 -13
- package/{skills/void/docs → docs}/reference/resource-inference.md +2 -16
- package/package.json +34 -30
- package/schema.json +1 -1
- package/skills/migrate-vite-cloudflare-to-void/SKILL.md +4 -1
- package/skills/void/SKILL.md +11 -5
- package/dist/cf-build-output-ChY6-XWP.mjs +0 -2
- package/dist/client-B4Me-9HE.mjs +0 -2
- package/dist/config-0acf1oys.mjs +0 -2
- package/dist/config-D8MOgiQV.mjs +0 -32
- package/dist/deploy-BDu1vhSH.mjs +0 -2
- package/dist/discover-AMCBXivQ.mjs +0 -2
- package/dist/fetch-error-Sp1R4mZv.d.mts +0 -20
- package/dist/gen-ById9r2j.mjs +0 -2
- package/dist/help-DPGBwomV.mjs +0 -2
- package/dist/login-C98-sw79.mjs +0 -2
- package/dist/migrate-CEu2X5DB.mjs +0 -2
- package/dist/plan-D1Q5rf-r.mjs +0 -2
- package/dist/platform-args-Cq6EjQro.mjs +0 -2
- package/dist/prepare-CnjcTV2s.mjs +0 -2
- package/dist/resolve-project-DtbidV4y.mjs +0 -2
- package/dist/route-url-CG7U-cRN.mjs +0 -15
- package/dist/runner-CXA9Fh8h.mjs +0 -2
- package/dist/validate-Dq_L3s0S.mjs +0 -2
- package/skills/void/docs/guide/platform/installation/uninstall.md +0 -69
- package/skills/void/docs/integrations/agents.md +0 -26
- package/dist/{runner-pg-D4OPlil-.mjs → runner-pg-DV8p_zjA.mjs} +4 -4
- package/{skills/void/docs → docs}/guide/database/d1.md +2 -2
- package/{skills/void/docs → docs}/guide/database/mysql.md +0 -0
- package/{skills/void/docs → docs}/guide/deployment.md +0 -0
- package/{skills/void/docs → docs}/guide/durable-state.md +0 -0
- package/{skills/void/docs → docs}/guide/edge/headers.md +0 -0
- package/{skills/void/docs → docs}/guide/edge/prerendering.md +0 -0
- package/{skills/void/docs → docs}/guide/edge/redirects.md +0 -0
- package/{skills/void/docs → docs}/guide/edge/static-assets.md +0 -0
- package/{skills/void/docs → docs}/guide/email/domains.md +0 -0
- package/{skills/void/docs → docs}/guide/email.md +0 -0
- package/{skills/void/docs → docs}/guide/index.md +0 -0
- package/{skills/void/docs → docs}/guide/kv.md +0 -0
- package/{skills/void/docs → docs}/guide/pages-routing/head.md +0 -0
- package/{skills/void/docs → docs}/guide/pages-routing/islands.md +2 -2
- package/{skills/void/docs → docs}/guide/pages-routing/layouts.md +0 -0
- package/{skills/void/docs → docs}/guide/pages-routing/view-transitions.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/administration/email.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/administration/plans.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/administration/zero-trust.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/installation/ci.md +0 -0
- package/{skills/void/docs → docs}/guide/platform/installation/prerequisites.md +0 -0
- package/{skills/void/docs → docs}/guide/platform-administration.md +0 -0
- package/{skills/void/docs → docs}/guide/platform-development.md +0 -0
- package/{skills/void/docs → docs}/guide/quickstart.md +0 -0
- package/{skills/void/docs → docs}/guide/self-hosted-platform.md +0 -0
- package/{skills/void/docs → docs}/guide/server-routing.md +3 -3
- package/{skills/void/docs → docs}/guide/ssg.md +0 -0
- package/{skills/void/docs → docs}/guide/ssr.md +0 -0
- package/{skills/void/docs → docs}/guide/type-safety.md +0 -0
- package/{skills/void/docs → docs}/guide/typed-fetch.md +0 -0
- package/{skills/void/docs → docs}/index.md +0 -0
- package/{skills/void/docs → docs}/integrations/cloudflare.md +0 -0
- package/{skills/void/docs → docs}/integrations/frameworks/analog.md +3 -3
- package/{skills/void/docs → docs}/integrations/frameworks/overview.md +0 -0
- package/{skills/void/docs → docs}/integrations/frameworks/react-router.md +3 -3
- package/{skills/void/docs → docs}/integrations/frameworks/sveltekit.md +1 -1
- package/{skills/void/docs → docs}/integrations/frameworks/tanstack-start.md +2 -2
- package/{skills/void/docs → docs}/reference/api/client.md +0 -0
- package/{skills/void/docs → docs}/reference/api/database.md +2 -2
- /package/{skills/void/docs → docs}/reference/api/durable.md +0 -0
- /package/{skills/void/docs → docs}/reference/api/env.md +0 -0
- /package/{skills/void/docs → docs}/reference/api/plugin.md +0 -0
- /package/{skills/void/docs → docs}/reference/api/rewrites.md +0 -0
- /package/{skills/void/docs → docs}/reference/api/types.md +0 -0
- /package/{skills/void/docs → docs}/reference/cli/deploy.md +0 -0
- /package/{skills/void/docs → docs}/reference/cli/domains.md +0 -0
- /package/{skills/void/docs → docs}/reference/cli/email.md +0 -0
- /package/{skills/void/docs → docs}/reference/cli/platform-zero-trust.md +0 -0
- /package/{skills/void/docs → docs}/reference/structure.md +0 -0
|
@@ -52,10 +52,8 @@ function rejectCRLF(field, value) {
|
|
|
52
52
|
* `rejectCRLF` is enough for a value `encodeWord` renders (the subject, a
|
|
53
53
|
* custom header value, a display name): anything outside printable ASCII
|
|
54
54
|
* sends the whole value into base64, so a control never reaches the wire.
|
|
55
|
-
* These three go through `quoteParam` or straight into the line, so
|
|
56
|
-
*
|
|
57
|
-
* captured as a success under `void dev` and by the test harness, and left
|
|
58
|
-
* for the receiving MTA to refuse.
|
|
55
|
+
* These three go through `quoteParam` or straight into the line, so a
|
|
56
|
+
* control would reach the wire for the receiving MTA to refuse.
|
|
59
57
|
*
|
|
60
58
|
* RFC 5322 §3.2.4 `qtext` is printable US-ASCII less `"` and `\`; a
|
|
61
59
|
* control inside a quoted-string is `obs-qtext`, which §4 says MUST NOT be
|
|
@@ -88,12 +86,9 @@ function isTokenChar(c) {
|
|
|
88
86
|
* `type "/" subtype *(";" parameter)`.
|
|
89
87
|
*
|
|
90
88
|
* `rejectControls` answers only for CTLs, and `buildAttachmentPart` writes
|
|
91
|
-
* the value verbatim ahead of its own `; name="…"`, so
|
|
92
|
-
*
|
|
93
|
-
*
|
|
94
|
-
* reports `end of header inside quoted string` on that line and reads the
|
|
95
|
-
* builder's `name` parameter as the VALUE of `x`. `text` (no subtype),
|
|
96
|
-
* `text/plain; charset` (no value) and `text/plain;;` went the same way.
|
|
89
|
+
* the value verbatim ahead of its own `; name="…"`, so an unterminated
|
|
90
|
+
* quote such as `text/plain; x="` would swallow the builder's `name`
|
|
91
|
+
* parameter as the value of `x`.
|
|
97
92
|
*
|
|
98
93
|
* The grammar is the RFC's, read as a generator: a `token` is printable
|
|
99
94
|
* US-ASCII less SPACE and `tspecials`; a `value` is a `token` or a
|
|
@@ -170,10 +165,8 @@ function isAtext(c) {
|
|
|
170
165
|
*
|
|
171
166
|
* `rejectControls` answers only for CTLs, and `buildAttachmentPart` writes
|
|
172
167
|
* the value verbatim — adding `<` and `>` unless the value already starts
|
|
173
|
-
* with `<` — so
|
|
174
|
-
*
|
|
175
|
-
* captured as a success under `void dev` and by the harness, and left for
|
|
176
|
-
* the receiver to refuse or to fail the `cid:` reference against.
|
|
168
|
+
* with `<` — so a malformed id would reach the receiver and break the
|
|
169
|
+
* `cid:` reference.
|
|
177
170
|
*
|
|
178
171
|
* The grammar is the RFC's, read as a generator, with two deliberate
|
|
179
172
|
* differences. An `msg-id` is `"<" id-left "@" id-right ">"`, each side a
|
|
@@ -191,9 +184,7 @@ function isAtext(c) {
|
|
|
191
184
|
*
|
|
192
185
|
* Refused, then: whitespace of any kind, a second `@`, `<` or `>` anywhere
|
|
193
186
|
* but as that one pair, `"`, `(`, `)`, `,`, `;`, `:`, `\`, `[`, `]`,
|
|
194
|
-
* anything non-ASCII, and the empty string
|
|
195
|
-
* and then silently NOT rendered). Everything accepted renders exactly as
|
|
196
|
-
* it did.
|
|
187
|
+
* anything non-ASCII, and the empty string.
|
|
197
188
|
*
|
|
198
189
|
* One pass, no allocation, which is why this runs AFTER the value's length
|
|
199
190
|
* bound. The message names the rule and never echoes the value.
|
|
@@ -274,12 +265,7 @@ function fieldErrorCode(field) {
|
|
|
274
265
|
* `email-router.ts`), so there is exactly ONE address syntax in the tree:
|
|
275
266
|
* an action the framework records is never dropped by the router for its
|
|
276
267
|
* shape, and a test harness never captures as a success what the managed
|
|
277
|
-
* deployment would lose.
|
|
278
|
-
* per review round — the exactly-one-`@` rule, then every C0 control and
|
|
279
|
-
* DEL, then `:`, then a parity test against the router's own regex, which
|
|
280
|
-
* had drifted on the dot in the domain — and still admitted `a..b@x.com`,
|
|
281
|
-
* `.a@x.com` and `a@x..com`, which no dot-atom allows and every MTA
|
|
282
|
-
* refuses. One maintained rule on both sides ends that series.
|
|
268
|
+
* deployment would lose.
|
|
283
269
|
*
|
|
284
270
|
* What it enforces: at most 254 characters in total; an ASCII dot-atom
|
|
285
271
|
* local part of at most 64 characters (RFC 5322 §3.2.3 `atext`, dots only
|
|
@@ -315,9 +301,7 @@ function validateAddressParts(field, email, name) {
|
|
|
315
301
|
* `x` for any `x` (RFC 5322 §3.2.4 — `qtext` excludes `"` and `\`, so a
|
|
316
302
|
* quoted-string carries either only as a quoted-pair). The parsed name is
|
|
317
303
|
* the RAW text `formatAddress` will quote and escape again, so leaving the
|
|
318
|
-
* pairs in place
|
|
319
|
-
* `"Smith \\\"Bob\\\""` and the recipient saw `Smith \"Bob\"`, while the
|
|
320
|
-
* object form of the same name rendered correctly. Only the quoted branch
|
|
304
|
+
* pairs in place would escape them twice. Only the quoted branch
|
|
321
305
|
* of `parseAddress` calls this; a backslash in an unquoted name is a
|
|
322
306
|
* character like any other, as it is in the object form.
|
|
323
307
|
*
|
|
@@ -328,7 +312,7 @@ function validateAddressParts(field, email, name) {
|
|
|
328
312
|
* never bounded at all. Measured, 10 MiB of `\"` pairs peaked at 307 MB of
|
|
329
313
|
* heap that way and terminated a 128 MB isolate; this shape peaks at 49 MB.
|
|
330
314
|
* Same discipline as `to7bitBody`: one counting pass, a buffer of exactly
|
|
331
|
-
* the output size, one fill, and
|
|
315
|
+
* the output size, one fill, and one chunked `codeUnitsToString`.
|
|
332
316
|
* The common case — no backslash at all — is one scan and no allocation.
|
|
333
317
|
* The regex that admits the text guarantees every backslash is followed by
|
|
334
318
|
* a character, so the fill never reads past the end.
|
|
@@ -348,16 +332,13 @@ function unquotePairs(text) {
|
|
|
348
332
|
if (c === 92) c = text.charCodeAt(++i);
|
|
349
333
|
out[n++] = c;
|
|
350
334
|
}
|
|
351
|
-
|
|
352
|
-
const chunk = 32768;
|
|
353
|
-
for (let i = 0; i < n; i += chunk) s += String.fromCharCode(...out.subarray(i, i + chunk));
|
|
354
|
-
return s;
|
|
335
|
+
return codeUnitsToString(out);
|
|
355
336
|
}
|
|
356
337
|
/**
|
|
357
338
|
* Parse one address — a bare `email@domain` or `Display Name <email@domain>`
|
|
358
339
|
* — into its parts, throwing a `MimeError` for `field` on anything else.
|
|
359
|
-
* Exported so `void.
|
|
360
|
-
* runtime applies to `from` at send time.
|
|
340
|
+
* Exported so `void.config.ts` `email.from` is validated by the same rules
|
|
341
|
+
* the runtime applies to `from` at send time.
|
|
361
342
|
*/
|
|
362
343
|
function parseAddress(value, field) {
|
|
363
344
|
if (typeof value === "string") {
|
|
@@ -525,10 +506,9 @@ const ENCODED_WORD_PAYLOAD_BYTES = 45;
|
|
|
525
506
|
* Text longer than one word's payload becomes several encoded-words
|
|
526
507
|
* separated by a space, which `foldHeader` turns into CRLF + SPACE
|
|
527
508
|
* wherever a line would otherwise overrun (RFC 2047 §6.2: whitespace
|
|
528
|
-
* between adjacent encoded-words is dropped on decode either way).
|
|
529
|
-
*
|
|
530
|
-
*
|
|
531
|
-
* line limit, which nothing downstream repairs.
|
|
509
|
+
* between adjacent encoded-words is dropped on decode either way). This
|
|
510
|
+
* keeps each word under §2's 75-character ceiling and a long subject or
|
|
511
|
+
* display name under RFC 5322 §2.1.1's 998-octet line limit.
|
|
532
512
|
*/
|
|
533
513
|
function encodeWord(text) {
|
|
534
514
|
if (ASCII_PRINTABLE.test(text)) return text;
|
|
@@ -561,20 +541,14 @@ function encodeWord(text) {
|
|
|
561
541
|
* quoted-string`, and `atext` is everything printable EXCEPT these, so an
|
|
562
542
|
* ASCII name containing any of them must be rendered as one quoted-string.
|
|
563
543
|
* The class below lists the thirteen in the RFC's order so it can be checked
|
|
564
|
-
* against the production by eye.
|
|
565
|
-
*
|
|
566
|
-
* unreachable and a comma in a name split the address list; then the list
|
|
567
|
-
* itself lacked `.`, so `Dr. Smith <a@x.dev>` went out unquoted. That is
|
|
568
|
-
* `obs-phrase` (§4.1, `word *(word / "." / CFWS)`), which §4 says MUST NOT
|
|
569
|
-
* be generated, and a strict receiver flags it as obsolete syntax (Python's
|
|
570
|
-
* `email` parser: "period in 'phrase'"). Every conforming generator —
|
|
571
|
-
* Python's `email.headerregistry.Address`, for one — emits `"Dr. Smith"`.
|
|
544
|
+
* against the production by eye. `.` matters: an unquoted `Dr. Smith` is
|
|
545
|
+
* `obs-phrase` (§4.1), which §4 says MUST NOT be generated.
|
|
572
546
|
*/
|
|
573
547
|
const RFC5322_SPECIALS = /[()<>[\]:;@\\,."]/;
|
|
574
548
|
function formatAddress(addr) {
|
|
575
549
|
if (!addr.name) return addr.email;
|
|
576
550
|
if (!ASCII_PRINTABLE.test(addr.name)) return `${encodeWord(addr.name)} <${addr.email}>`;
|
|
577
|
-
if (RFC5322_SPECIALS.test(addr.name)) return `"${addr.name
|
|
551
|
+
if (RFC5322_SPECIALS.test(addr.name)) return `"${quoteParam(addr.name)}" <${addr.email}>`;
|
|
578
552
|
return `${addr.name} <${addr.email}>`;
|
|
579
553
|
}
|
|
580
554
|
function formatAddressList(addrs) {
|
|
@@ -596,13 +570,10 @@ function formatAddressList(addrs) {
|
|
|
596
570
|
* best a WSP-only fold rule allows (§3.2.2 permits folding only at WSP).
|
|
597
571
|
*
|
|
598
572
|
* One pass, and the only thing kept per input character is the folded
|
|
599
|
-
* output itself: each finished line is one flat string in `lines`.
|
|
600
|
-
*
|
|
601
|
-
*
|
|
602
|
-
*
|
|
603
|
-
* fold (a slice, an object and a cons-string node each), so a legal 3 MB
|
|
604
|
-
* subject of one-letter words terminated a 128 MB isolate. That was a
|
|
605
|
-
* per-TOKEN cost, invisible to any size projection: the message fit.
|
|
573
|
+
* output itself: each finished line is one flat string in `lines`. Any
|
|
574
|
+
* per-token allocation (a slice array, token objects, `out +=`) costs about
|
|
575
|
+
* 130 bytes of heap per token, so a legal 3 MB subject of one-letter words
|
|
576
|
+
* would terminate a 128 MB isolate even though the message fits.
|
|
606
577
|
*/
|
|
607
578
|
function foldHeader(name, value) {
|
|
608
579
|
const line = `${name}: ${value}`;
|
|
@@ -713,10 +684,9 @@ const HEADER_NAME_LINE_OVERHEAD = 1;
|
|
|
713
684
|
* fixed width — so a hit is always a header.
|
|
714
685
|
*
|
|
715
686
|
* One pass over the string, counting UTF-8 octets per CRLF-delimited line,
|
|
716
|
-
* with NO allocation
|
|
717
|
-
*
|
|
718
|
-
*
|
|
719
|
-
* ends a line, exactly as the split did; a bare CR or LF is content.
|
|
687
|
+
* with NO allocation: a `split(CRLF)` would hold one substring per line, and
|
|
688
|
+
* a legal body of pasted logs is millions of lines. Only a CRLF pair ends a
|
|
689
|
+
* line; a bare CR or LF is content.
|
|
720
690
|
*/
|
|
721
691
|
function findOverlongLine(text) {
|
|
722
692
|
let index = 0;
|
|
@@ -751,28 +721,16 @@ function findOverlongLine(text) {
|
|
|
751
721
|
* quoted-string comes from RFC 5322 §3.2.4).
|
|
752
722
|
*
|
|
753
723
|
* `qtext` excludes both `\\` and `"`, so each may appear only as a
|
|
754
|
-
* quoted-pair
|
|
755
|
-
*
|
|
756
|
-
* closing quote and leaves the parameter unterminated, and every embedded
|
|
757
|
-
* backslash is silently eaten by a conformant parser, so a Windows path
|
|
758
|
-
* `C:\\Users\\bob\\report.pdf` arrived as `C:Usersbobreport.pdf`. Measured,
|
|
759
|
-
* Python's `email.policy.default` and postal-mime both report
|
|
760
|
-
* `InvalidHeaderDefect: end of header inside quoted string` on the first
|
|
761
|
-
* case and disagree with a naive parser on the second.
|
|
724
|
+
* quoted-pair: a raw trailing backslash would escape the closing quote, and
|
|
725
|
+
* a conformant parser drops every other raw backslash.
|
|
762
726
|
*
|
|
763
727
|
* Backslash first, then quote — the other order would double-escape.
|
|
764
|
-
*
|
|
765
|
-
* Note this file's own `foldHeader` already tracks quoted-pairs when
|
|
766
|
-
* folding, so the emitter was contradicting the folder.
|
|
767
728
|
*/
|
|
768
729
|
function quoteParam(value) {
|
|
769
730
|
return value.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
|
|
770
731
|
}
|
|
771
732
|
function base64(bytes) {
|
|
772
|
-
|
|
773
|
-
const chunk = 32768;
|
|
774
|
-
for (let i = 0; i < bytes.length; i += chunk) binary += String.fromCharCode(...bytes.subarray(i, i + chunk));
|
|
775
|
-
return btoa(binary);
|
|
733
|
+
return btoa(codeUnitsToString(bytes));
|
|
776
734
|
}
|
|
777
735
|
function base64Wrapped(bytes) {
|
|
778
736
|
const encoded = base64(bytes);
|
|
@@ -829,13 +787,13 @@ function quotedPrintable(text) {
|
|
|
829
787
|
}
|
|
830
788
|
flush(b);
|
|
831
789
|
}
|
|
832
|
-
return
|
|
790
|
+
return codeUnitsToString(out.subarray(0, n));
|
|
833
791
|
}
|
|
834
|
-
/**
|
|
835
|
-
function
|
|
792
|
+
/** One character per code unit, in 32K chunks to stay under the call-argument limit. */
|
|
793
|
+
function codeUnitsToString(units) {
|
|
836
794
|
let s = "";
|
|
837
795
|
const chunk = 32768;
|
|
838
|
-
for (let i = 0; i <
|
|
796
|
+
for (let i = 0; i < units.length; i += chunk) s += String.fromCharCode(...units.subarray(i, i + chunk));
|
|
839
797
|
return s;
|
|
840
798
|
}
|
|
841
799
|
/**
|
|
@@ -844,13 +802,9 @@ function bytesToAsciiString(bytes) {
|
|
|
844
802
|
* makes 998 octets the hard limit). Only LF and CRLF end a line; a bare CR
|
|
845
803
|
* is a control character like any other and forces the encoding.
|
|
846
804
|
*
|
|
847
|
-
* One pass over the string with NO allocation
|
|
848
|
-
*
|
|
849
|
-
*
|
|
850
|
-
* of the body plus one array slot and one substring per line, and a legal
|
|
851
|
-
* 6 MB body of millions of two-character lines needed 64 MB for the strip
|
|
852
|
-
* and another 24-40 MB for the split. Those are per-LINE costs, invisible
|
|
853
|
-
* to any size projection: the message fit.
|
|
805
|
+
* One pass over the string with NO allocation: a `replace`/`split` shape
|
|
806
|
+
* holds a copy of the body plus one substring per line, and a legal 6 MB
|
|
807
|
+
* body of millions of two-character lines needed about 100 MB that way.
|
|
854
808
|
*/
|
|
855
809
|
function needsQuotedPrintable(text) {
|
|
856
810
|
let lineLen = 0;
|
|
@@ -895,7 +849,7 @@ function to7bitBody(text) {
|
|
|
895
849
|
if (c === 10 && (i === 0 || text.charCodeAt(i - 1) !== 13)) out[n++] = 13;
|
|
896
850
|
out[n++] = c;
|
|
897
851
|
}
|
|
898
|
-
return
|
|
852
|
+
return codeUnitsToString(out);
|
|
899
853
|
}
|
|
900
854
|
/**
|
|
901
855
|
* Lower bound on the octets `text` will occupy in the rendered message, in
|
|
@@ -961,16 +915,14 @@ function makeBoundary(prefix) {
|
|
|
961
915
|
crypto.getRandomValues(bytes);
|
|
962
916
|
return `=_void_${prefix}_${base64(bytes).replace(/[+/=]/g, "")}`;
|
|
963
917
|
}
|
|
964
|
-
function wrapMultipart(type, parts
|
|
918
|
+
function wrapMultipart(type, parts) {
|
|
965
919
|
const boundary = makeBoundary(type);
|
|
966
|
-
const headerEntries = [["Content-Type", `multipart/${type}; boundary="${boundary}"`]];
|
|
967
|
-
for (const [k, v] of Object.entries(extra)) headerEntries.push([k, v]);
|
|
968
920
|
return {
|
|
969
|
-
headers:
|
|
921
|
+
headers: [["Content-Type", `multipart/${type}; boundary="${boundary}"`]],
|
|
970
922
|
body: parts.map((p) => `--${boundary}${CRLF}${renderPart(p)}`).join(CRLF) + `${CRLF}--${boundary}--${CRLF}`
|
|
971
923
|
};
|
|
972
924
|
}
|
|
973
|
-
const RESERVED_HEADERS = new Set([
|
|
925
|
+
const RESERVED_HEADERS = /* @__PURE__ */ new Set([
|
|
974
926
|
"from",
|
|
975
927
|
"to",
|
|
976
928
|
"cc",
|
|
@@ -985,7 +937,7 @@ const RESERVED_HEADERS = new Set([
|
|
|
985
937
|
"content-type",
|
|
986
938
|
"content-transfer-encoding",
|
|
987
939
|
"content-disposition"
|
|
988
|
-
]
|
|
940
|
+
]);
|
|
989
941
|
/**
|
|
990
942
|
* Lower bound on the octets one header VALUE occupies once `encodeWord` (or
|
|
991
943
|
* `formatAddress`, for a display name) and `foldHeader` have rendered it, in
|
|
@@ -1132,10 +1084,8 @@ const CUSTOM_HEADER_FRAMING_OCTETS = 4;
|
|
|
1132
1084
|
* empty values the names and the `: ` CRLF around each are the entire
|
|
1133
1085
|
* size, and the framing is exact once the name is counted (see
|
|
1134
1086
|
* `CUSTOM_HEADER_FRAMING_OCTETS`), so charging both cannot reject a
|
|
1135
|
-
* message that fits.
|
|
1136
|
-
*
|
|
1137
|
-
* zero, rendered in full and peaked at 121 MB of a 128 MB isolate; 100k
|
|
1138
|
-
* of them (50 MB) went to 169 MB.
|
|
1087
|
+
* message that fits. Uncharged, 60k empty headers with 500-character
|
|
1088
|
+
* names (a 30 MB message) would project to zero.
|
|
1139
1089
|
* - An attachment part: `normalizeAttachment` bounds ONE filename at under
|
|
1140
1090
|
* a kilobyte, not the sum, and a message is free to carry any number of
|
|
1141
1091
|
* parts, so the filename and the framing every part is wrapped in are
|
|
@@ -1145,7 +1095,7 @@ const CUSTOM_HEADER_FRAMING_OCTETS = 4;
|
|
|
1145
1095
|
* `rawText` and `raw` — and terminated a 128 MB isolate before the final
|
|
1146
1096
|
* size check could return `MIME_ERROR`.
|
|
1147
1097
|
*
|
|
1148
|
-
* The header COUNT is deliberately not bounded here. Each header
|
|
1098
|
+
* The header COUNT is deliberately not bounded here. Each header costs
|
|
1149
1099
|
* at least five octets (a one-character name, `: `, CRLF), so the count
|
|
1150
1100
|
* the projection can admit is finite, and past a few hundred thousand keys
|
|
1151
1101
|
* the caller's own object — measured at about 74 bytes per key, before
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { a as join } from "./dist-BVqXeR_h.mjs";
|
|
2
2
|
import { n as loadVoidAuthConfig, t as findVoidAuthConfig } from "./config-DPByhVck.mjs";
|
|
3
|
-
import { m as readConfig } from "./config-
|
|
4
|
-
import { r as getMiniflareDatabasePath } from "./runner-
|
|
5
|
-
import {
|
|
6
|
-
import { r as resolveVoidAuthMigrationSchema } from "./drizzle-
|
|
7
|
-
import { n as applyPgAuthMigrations, r as applySqliteAuthMigrations, t as applyMySqlAuthMigrations } from "./auth-migrations-
|
|
3
|
+
import { m as readConfig } from "./config-DiowPT80.mjs";
|
|
4
|
+
import { r as getMiniflareDatabasePath } from "./runner-DMBKSrRk.mjs";
|
|
5
|
+
import { o as loadLocalEnv } from "./env-BxocywBB.mjs";
|
|
6
|
+
import { r as resolveVoidAuthMigrationSchema } from "./drizzle-CF84FOVM.mjs";
|
|
7
|
+
import { n as applyPgAuthMigrations, r as applySqliteAuthMigrations, t as applyMySqlAuthMigrations } from "./auth-migrations-BwHgeEsD.mjs";
|
|
8
8
|
//#region src/auth/node.ts
|
|
9
9
|
async function runLocalVoidAuthMigrations(root, dialect, persistRoot = join(root, ".void"), databaseId = "local", configPath = findVoidAuthConfig(root)) {
|
|
10
10
|
const authConfig = await loadVoidAuthConfig(configPath);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as OPERATOR_MAX_TIMEOUT_MS } from "./operator-client-
|
|
1
|
+
import { t as OPERATOR_MAX_TIMEOUT_MS } from "./operator-client-BQtzyG-g.mjs";
|
|
2
2
|
//#region src/cli/operator-args.ts
|
|
3
3
|
const operatorCommands = [
|
|
4
4
|
{
|
|
@@ -366,6 +366,15 @@ const operatorCommands = [
|
|
|
366
366
|
values: { cursor: "Opaque cursor returned by --plan" },
|
|
367
367
|
method: "POST"
|
|
368
368
|
},
|
|
369
|
+
{
|
|
370
|
+
group: "system",
|
|
371
|
+
action: "rotate-proxy-tokens",
|
|
372
|
+
description: "Rotate project proxy tokens on tenant Workers",
|
|
373
|
+
path: "/system/rotate-proxy-tokens",
|
|
374
|
+
values: { project: "Project ID" },
|
|
375
|
+
booleans: ["all"],
|
|
376
|
+
method: "POST"
|
|
377
|
+
},
|
|
369
378
|
{
|
|
370
379
|
group: "email",
|
|
371
380
|
action: "policy",
|
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
import { C as
|
|
2
|
-
import { n as OperatorClient, r as OperatorClientError } from "./operator-client-
|
|
1
|
+
import { C as deleteKeyringPassword, T as writeKeyringPassword, c as normalizePlatformApiUrl, i as getActivePlatformConnection, r as findPlatformConnections, u as platformCredentialAccount, w as readKeyringPassword } from "./platform-registry-P387v42A.mjs";
|
|
2
|
+
import { n as OperatorClient, r as OperatorClientError } from "./operator-client-BQtzyG-g.mjs";
|
|
3
3
|
/** Operator authority never comes from repository-controlled metadata. */
|
|
4
4
|
function resolveOperatorOrigin(connection = "") {
|
|
5
5
|
if (connection) {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
normalized = normalizePlatformApiUrl(connection);
|
|
9
|
-
} catch {}
|
|
10
|
-
const matches = listPlatformConnections().filter((entry) => entry.id === connection || entry.installationId === connection || entry.apiUrl === normalized);
|
|
11
|
-
if (matches.length !== 1) throw new OperatorClientError("Select a registered platform connection ID or URL. Run `void connect <url> --no-login` to register it first.", "invalid_connection");
|
|
6
|
+
const matches = findPlatformConnections(connection);
|
|
7
|
+
if (matches.length !== 1) throw new OperatorClientError("Select a registered platform slug or URL. Run `void connect <url> --no-login` to register it first.", "invalid_connection");
|
|
12
8
|
return matches[0].apiUrl;
|
|
13
9
|
}
|
|
14
10
|
if (process.env.VOID_API_URL) return normalizePlatformApiUrl(process.env.VOID_API_URL);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { c as normalizePlatformApiUrl } from "./platform-registry-P387v42A.mjs";
|
|
2
2
|
import { t as cfAccessHeaders } from "./cf-access-TWNzXltp.mjs";
|
|
3
|
-
import { t as ensureCloudflaredToken } from "./cf-access-
|
|
3
|
+
import { t as ensureCloudflaredToken } from "./cf-access-ngGqZpHZ.mjs";
|
|
4
4
|
const OPERATOR_MAX_TIMEOUT_MS = 36e5;
|
|
5
5
|
var OperatorClientError = class extends Error {
|
|
6
6
|
code;
|
|
@@ -71,7 +71,7 @@ var OperatorClient = class {
|
|
|
71
71
|
}
|
|
72
72
|
if (!data || typeof data !== "object" || Array.isArray(data)) throw new OperatorClientError("Operator API returned an invalid response object.", "invalid_response", response.status);
|
|
73
73
|
const result = data;
|
|
74
|
-
if (!response.ok) throw new OperatorClientError(typeof result.message === "string" ? result.message : `Operator request failed (HTTP ${response.status}).`, typeof result.error === "string" ? result.error : "request_failed", response.status, result.details);
|
|
74
|
+
if (!response.ok) throw new OperatorClientError(typeof result.message === "string" ? result.message : typeof result.error === "string" ? result.error === "Platform disabled" && result.reason === "maintenance" ? `Operator request failed (HTTP ${response.status}): the platform is paused for an upgrade or repair. Retry when it finishes.` : `Operator request failed (HTTP ${response.status}): ${result.error}.${result.error === "Platform disabled" ? " Run `void platform enable`." : ""}` : `Operator request failed (HTTP ${response.status}).`, typeof result.error === "string" ? result.error : "request_failed", response.status, result.details);
|
|
75
75
|
if (result.partial === true || result.ok === false) throw new OperatorClientError("The operation did not fully complete. Inspect the partial result before retrying.", "partial_failure", response.status, result);
|
|
76
76
|
return result;
|
|
77
77
|
} finally {
|
|
@@ -1,14 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { d as printSuccess, f as sanitizeTerminalText } from "./output-C50ag2r3.mjs";
|
|
2
|
+
import { n as OperatorClient, r as OperatorClientError } from "./operator-client-BQtzyG-g.mjs";
|
|
3
|
+
import { a as resolveOperatorOrigin, i as removeOperatorToken, n as readOperatorApiTokenStdin, o as saveOperatorToken, r as readOperatorToken, t as exchangeOperatorSession } from "./operator-auth-AzVLbrr3.mjs";
|
|
3
4
|
import { createHash } from "node:crypto";
|
|
4
5
|
import { setTimeout } from "node:timers/promises";
|
|
5
6
|
import { createInterface } from "node:readline/promises";
|
|
6
7
|
//#region src/cli/operator-cmd.ts
|
|
7
8
|
const MAX_RUNTIME_FOLLOW_ROWS = 1e4;
|
|
9
|
+
const BUILD_LOG_DRAIN_TIMEOUT_MS = 12e4;
|
|
8
10
|
function printable(value) {
|
|
9
11
|
if (value === null || value === void 0) return "—";
|
|
10
|
-
if (typeof value === "string") return value
|
|
11
|
-
if (typeof value === "object") return JSON.stringify(value);
|
|
12
|
+
if (typeof value === "string") return sanitizeTerminalText(value);
|
|
13
|
+
if (typeof value === "object") return sanitizeTerminalText(JSON.stringify(value));
|
|
12
14
|
return String(value);
|
|
13
15
|
}
|
|
14
16
|
function table(rows, indent) {
|
|
@@ -42,11 +44,28 @@ function eventLines(events, indent) {
|
|
|
42
44
|
if (!events.length) return [`${indent}(none)`];
|
|
43
45
|
return events.flatMap((event, index) => [`${indent}${index + 1}.`, ...humanLines(event, `${indent} `)]);
|
|
44
46
|
}
|
|
47
|
+
const LABEL_WORDS = {
|
|
48
|
+
api: "API",
|
|
49
|
+
dns: "DNS",
|
|
50
|
+
github: "GitHub",
|
|
51
|
+
http: "HTTP",
|
|
52
|
+
id: "ID",
|
|
53
|
+
ids: "IDs",
|
|
54
|
+
oauth: "OAuth",
|
|
55
|
+
oidc: "OIDC",
|
|
56
|
+
url: "URL",
|
|
57
|
+
urls: "URLs"
|
|
58
|
+
};
|
|
59
|
+
function fieldLabel(key) {
|
|
60
|
+
const words = key.replace(/([a-z0-9])([A-Z])/g, "$1 $2").split(/[\s_-]+/).filter(Boolean).map((word) => LABEL_WORDS[word.toLowerCase()] ?? word.toLowerCase());
|
|
61
|
+
if (words[0]) words[0] = words[0][0].toUpperCase() + words[0].slice(1);
|
|
62
|
+
return words.join(" ");
|
|
63
|
+
}
|
|
45
64
|
function humanLines(value, indent = "") {
|
|
46
65
|
if (Array.isArray(value)) return table(value, indent);
|
|
47
66
|
if (!value || typeof value !== "object") return [`${indent}${printable(value)}`];
|
|
48
67
|
return Object.entries(value).flatMap(([key, item]) => {
|
|
49
|
-
const label = key
|
|
68
|
+
const label = fieldLabel(key);
|
|
50
69
|
if (Array.isArray(item)) return [`${indent}${label}:`, ...key === "events" ? eventLines(item, `${indent} `) : table(item, `${indent} `)];
|
|
51
70
|
if (item && typeof item === "object") return [`${indent}${label}:`, ...humanLines(item, `${indent} `)];
|
|
52
71
|
return [`${indent}${label}: ${printable(item)}`];
|
|
@@ -55,6 +74,13 @@ function humanLines(value, indent = "") {
|
|
|
55
74
|
function output(value, json) {
|
|
56
75
|
console.log(json ? JSON.stringify(value) : humanLines(value).join("\n"));
|
|
57
76
|
}
|
|
77
|
+
function outputMutation(result, args) {
|
|
78
|
+
output(result, args.json);
|
|
79
|
+
const configuration = result.configuration;
|
|
80
|
+
const project = result.project;
|
|
81
|
+
if (args.json || result.ok === false || result.partial === true || result.complete === false || result.error || result.operationStatus && result.operationStatus !== "completed" || configuration?.status && configuration.status !== "ready" && configuration.status !== "disabled" || project?.state === "reconciling" || project?.state === "error" || project?.last_error) return;
|
|
82
|
+
printSuccess(`Platform ${args.group} ${args.action} completed.`);
|
|
83
|
+
}
|
|
58
84
|
function outputLogs(result, json) {
|
|
59
85
|
if (json) {
|
|
60
86
|
output(result, true);
|
|
@@ -137,9 +163,9 @@ async function runAuth(origin, args) {
|
|
|
137
163
|
if (args.action === "login" || args.action === "token" && args.tokenStdin) {
|
|
138
164
|
if (!args.tokenStdin && !process.stdin.isTTY) throw new OperatorClientError("Browser login requires an interactive terminal. Use --token-stdin to exchange an API session.", "interactive_login_required");
|
|
139
165
|
const apiToken = args.tokenStdin ? await readOperatorApiTokenStdin() : await (async () => {
|
|
140
|
-
const { discoverPlatform } = await import("./platform-cmd-
|
|
141
|
-
const { selectPlatformLoginMethod } = await import("./login-
|
|
142
|
-
const { runPlatformLogin } = await import("./auth-
|
|
166
|
+
const { discoverPlatform } = await import("./platform-cmd-C00YM14r.mjs");
|
|
167
|
+
const { selectPlatformLoginMethod } = await import("./login-Dc-wuTDq.mjs");
|
|
168
|
+
const { runPlatformLogin } = await import("./auth-BgX2qYSY.mjs");
|
|
143
169
|
return runPlatformLogin(origin, (await selectPlatformLoginMethod(await discoverPlatform(origin), args.providerExplicit ? args.provider : void 0)).id, (url) => process.stderr.write(`Sign in at ${url}\n`));
|
|
144
170
|
})();
|
|
145
171
|
const session = await exchangeOperatorSession(origin, apiToken);
|
|
@@ -156,6 +182,7 @@ async function runAuth(origin, args) {
|
|
|
156
182
|
origin,
|
|
157
183
|
...identity
|
|
158
184
|
}, args.json);
|
|
185
|
+
if (!args.json) printSuccess("Signed in to platform administration.");
|
|
159
186
|
}
|
|
160
187
|
return;
|
|
161
188
|
}
|
|
@@ -176,6 +203,7 @@ async function runAuth(origin, args) {
|
|
|
176
203
|
ok: true,
|
|
177
204
|
...process.env.VOID_OPERATOR_TOKEN ? { message: "Operator session revoked. Unset VOID_OPERATOR_TOKEN in your shell." } : {}
|
|
178
205
|
}, args.json);
|
|
206
|
+
if (!args.json) printSuccess("Signed out of platform administration.");
|
|
179
207
|
} else {
|
|
180
208
|
const session = await client.request("/session");
|
|
181
209
|
if (args.action === "token") {
|
|
@@ -302,7 +330,10 @@ async function migrateDeploymentAssets(client, origin, args) {
|
|
|
302
330
|
result
|
|
303
331
|
});
|
|
304
332
|
output(result, args.json);
|
|
305
|
-
if (result.complete)
|
|
333
|
+
if (result.complete) {
|
|
334
|
+
if (!args.json) printSuccess("Deployment assets migrated.");
|
|
335
|
+
return;
|
|
336
|
+
}
|
|
306
337
|
const cursor = nextCursor;
|
|
307
338
|
seenCursors.add(cursor);
|
|
308
339
|
body = {
|
|
@@ -313,7 +344,7 @@ async function migrateDeploymentAssets(client, origin, args) {
|
|
|
313
344
|
}
|
|
314
345
|
async function runOperatorCommand(args) {
|
|
315
346
|
if (!args.action) {
|
|
316
|
-
const { printHelpPage } = await import("./help-
|
|
347
|
+
const { printHelpPage } = await import("./help-DzKUrQvk.mjs");
|
|
317
348
|
printHelpPage(["platform", args.group]);
|
|
318
349
|
return;
|
|
319
350
|
}
|
|
@@ -352,18 +383,18 @@ async function runOperatorCommand(args) {
|
|
|
352
383
|
...args.group === "project" && args.action === "normalize" ? { expected: preview.changes } : {},
|
|
353
384
|
...recoveryFence
|
|
354
385
|
};
|
|
355
|
-
|
|
386
|
+
outputMutation(await client.request(args.path, {
|
|
356
387
|
method: "POST",
|
|
357
388
|
body,
|
|
358
389
|
timeoutMs: args.timeoutMs
|
|
359
|
-
}), args
|
|
390
|
+
}), args);
|
|
360
391
|
} else if (args.follow) await followOperatorLogs(client, args);
|
|
361
392
|
else {
|
|
362
393
|
const result = await client.request(args.path, { query: args.query });
|
|
363
394
|
if (args.action === "logs" && args.group !== "email") outputLogs(result, args.json);
|
|
364
395
|
else if (args.group === "system" && args.action === "asset-migrations" && !args.json && Array.isArray(result.deployments)) console.log([
|
|
365
396
|
...humanLines({ pagination: result.pagination }),
|
|
366
|
-
"
|
|
397
|
+
"Deployments:",
|
|
367
398
|
...eventLines(result.deployments, " ")
|
|
368
399
|
].join("\n"));
|
|
369
400
|
else output(result, args.json);
|
|
@@ -371,4 +402,4 @@ async function runOperatorCommand(args) {
|
|
|
371
402
|
}
|
|
372
403
|
}
|
|
373
404
|
//#endregion
|
|
374
|
-
export { runOperatorCommand };
|
|
405
|
+
export { runOperatorCommand as a, humanLines as i, confirmOperatorMutation as n, followOperatorLogs as r, BUILD_LOG_DRAIN_TIMEOUT_MS as t };
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
import { n as __toESM } from "./rolldown-runtime-DXIUcv95.mjs";
|
|
2
2
|
import { t as require_picocolors } from "./picocolors-BTps1_gs.mjs";
|
|
3
|
-
import { L as log, P as isCI, nt as settings, q as spinner } from "./
|
|
3
|
+
import { B as note$1, H as outro, L as log, P as isCI, nt as settings, q as spinner } from "./dist-D3m88sjf.mjs";
|
|
4
|
+
import { stripVTControlCharacters } from "node:util";
|
|
4
5
|
//#region src/cli/output.ts
|
|
5
6
|
var import_picocolors = /* @__PURE__ */ __toESM(require_picocolors(), 1);
|
|
7
|
+
/** Complete an action with the same spacing, checkmark, and color on every target. */
|
|
8
|
+
function printSuccess(message) {
|
|
9
|
+
outro(`\n${import_picocolors.default.green(`✓ ${stripVTControlCharacters(message)}`)}`, { withGuide: false });
|
|
10
|
+
}
|
|
6
11
|
function formatCount(count, singular, plural = `${singular}s`) {
|
|
7
12
|
return `${count} ${count === 1 ? singular : plural}`;
|
|
8
13
|
}
|
|
@@ -54,6 +59,30 @@ function createSpinner(options, isTerminal = process.stdout.isTTY === true) {
|
|
|
54
59
|
}
|
|
55
60
|
};
|
|
56
61
|
}
|
|
62
|
+
/** Narrowest terminal the shared box renderer can draw a note in, guide bar included. */
|
|
63
|
+
const MIN_NOTE_COLUMNS = 6;
|
|
64
|
+
/**
|
|
65
|
+
* The shared box renderer throws when the terminal is narrower than its smallest box (a 0x0 pty
|
|
66
|
+
* reports 0 columns). Treat a non-positive width as unknown, like `stdout.columns || 80` elsewhere
|
|
67
|
+
* in the CLI, and draw tiny terminals at the narrowest width the box supports.
|
|
68
|
+
*/
|
|
69
|
+
function note(...args) {
|
|
70
|
+
const [message, title, opts] = args;
|
|
71
|
+
const output = opts?.output ?? process.stdout;
|
|
72
|
+
const columns = output.columns;
|
|
73
|
+
if (typeof columns !== "number" || columns >= MIN_NOTE_COLUMNS) {
|
|
74
|
+
note$1(...args);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const sized = {
|
|
78
|
+
columns: columns > 0 ? MIN_NOTE_COLUMNS : 80,
|
|
79
|
+
write: (chunk) => output.write(chunk)
|
|
80
|
+
};
|
|
81
|
+
note$1(message, title, {
|
|
82
|
+
...opts,
|
|
83
|
+
output: sized
|
|
84
|
+
});
|
|
85
|
+
}
|
|
57
86
|
function sectionTitle(title) {
|
|
58
87
|
return import_picocolors.default.reset(import_picocolors.default.blue(title));
|
|
59
88
|
}
|
|
@@ -85,5 +114,18 @@ function ensureUtc(s) {
|
|
|
85
114
|
if (s.lastIndexOf("-") > 9) return s;
|
|
86
115
|
return s + "Z";
|
|
87
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* Stack frames of an error a Worker reported, one line per frame. The log or
|
|
119
|
+
* exception line already shows `Name: message`, so a leading copy of that
|
|
120
|
+
* header is dropped; Workers send stacks both with and without it.
|
|
121
|
+
*/
|
|
122
|
+
function errorStackFrames(error) {
|
|
123
|
+
if (!error || typeof error !== "object") return [];
|
|
124
|
+
const { name, message, stack } = error;
|
|
125
|
+
if (typeof stack !== "string") return [];
|
|
126
|
+
const header = message ? `${String(name)}: ${String(message)}` : String(name);
|
|
127
|
+
const frames = stack === header ? "" : stack.startsWith(`${header}\n`) ? stack.slice(header.length + 1) : stack;
|
|
128
|
+
return frames.trimEnd() ? frames.trimEnd().split("\n") : [];
|
|
129
|
+
}
|
|
88
130
|
//#endregion
|
|
89
|
-
export { ensureUtc as a,
|
|
131
|
+
export { ensureUtc as a, helpLine as c, printSuccess as d, sanitizeTerminalText as f, dim as i, import_picocolors as l, tablePrefix as m, cliCommandName as n, errorStackFrames as o, sectionTitle as p, createSpinner as r, formatCount as s, categoryTitle as t, note as u };
|