void 0.10.13 → 0.20.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 +6 -0
- package/{skills/void/docs/node_modules/void/node_modules/pglite-server/LICENSE.md → LICENSE} +1 -1
- package/README.md +34 -8
- package/dist/{auth-qgMlYp7Z.d.mts → auth-DkcFflXV.d.mts} +10 -11
- package/dist/auth-W9WII-mN.mjs +630 -0
- package/dist/{auth-cmd-BqsdZJp5.mjs → auth-cmd-CAH62yDU.mjs} +4 -3
- package/dist/{auth-migrations-BTZ-ATvQ.mjs → auth-migrations-9vif1uj8.mjs} +53 -12
- package/dist/{better-auth-shared-BQooDxbw.mjs → better-auth-shared-CYw1T3k4.mjs} +7 -10
- package/dist/{better-auth-shared-DealXecJ.d.mts → better-auth-shared-DSCeohOK.d.mts} +10 -5
- package/dist/{build-cmd-Bujrv5q-.mjs → build-cmd-CJvZvPQO.mjs} +6 -4
- package/dist/{cache-C11V8Fxq.mjs → cache-BlNeQjuP.mjs} +9 -5
- package/dist/{cancel-deploy-fwFYF04b.mjs → cancel-deploy-CmlAZ9P6.mjs} +3 -2
- package/dist/cf-access-AJ1ehiFR.mjs +42 -0
- package/dist/cf-access-DsSsZUPr.mjs +67 -0
- package/dist/cli/cli.d.mts +1 -1
- package/dist/cli/cli.mjs +1735 -165
- package/dist/cli/env-schema-probe.d.mts +48 -61
- package/dist/cli/env-schema-probe.mjs +10 -58
- package/dist/{client-Gb71-XkG.mjs → client-Clirrol3.mjs} +120 -463
- package/dist/cloudflare-auth-B1QtTO1b.mjs +217 -0
- package/dist/cloudflare-cmd-B6_OZx2V.mjs +62 -0
- package/dist/cloudflare-connect-j5D4hhrG.mjs +56 -0
- package/dist/cloudflare-operations-CPTpRW6d.mjs +566 -0
- package/dist/{config-qHGgPuWT.mjs → config-BQFq7QvD.mjs} +75 -41
- package/dist/{config-CutEMNGJ.mjs → config-NOG_U1aK.mjs} +10 -15
- package/dist/connect-C04Wdy_h.mjs +79 -0
- package/dist/{create-project-DsYvl3TB.mjs → create-project-ChGZ1DFd.mjs} +26 -16
- package/dist/database-provider.d.mts +21 -0
- package/dist/database-provider.mjs +6 -0
- package/dist/{db-C0i0sYMS.mjs → db-D2d_mUsB.mjs} +612 -117
- package/dist/{delete-mh6p-zkQ.mjs → delete-D8GigDk8.mjs} +9 -6
- package/dist/{deploy-jBJT1fUT.mjs → deploy-iXZ3F0N6.mjs} +3252 -1995
- package/dist/dev-inbox-DkgRWLkW.mjs +307 -0
- package/dist/{discover-CJHyvYfR.mjs → discover-xvfrgJeo.mjs} +3 -3
- package/dist/{magic-string.es-ZQjdJFFn.mjs → dist-BR1quN_w.mjs} +570 -216
- package/dist/{dist-DaKKDf8D.mjs → dist-BrsS7cai.mjs} +17 -2
- package/dist/{dist-BuiRJkTd.mjs → dist-m40_XgNh.mjs} +48 -33
- package/dist/{domain-DiaNQbrl.mjs → domain-B1VmoSr0.mjs} +41 -4
- package/dist/dotenv-VQxupEUv.mjs +181 -0
- package/dist/edge.d.mts +2 -0
- package/dist/edge.mjs +2 -0
- package/dist/email-Ce6SQq-i.mjs +182 -0
- package/dist/email-uKyQYUVY.mjs +1016 -0
- package/dist/{entry-D7yy4xVH.mjs → entry-DU3oDoQ3.mjs} +2 -2
- package/dist/env-BcQzYgoG.mjs +73 -0
- package/dist/env-D4Emu-M_.mjs +95 -0
- package/dist/env-helpers-CyKtOBpj.d.mts +22 -0
- package/dist/env-public-D_6u46fX.d.mts +135 -0
- package/dist/{env-types-QBj-ndax.mjs → env-types-BNPhro-M.mjs} +2 -2
- package/dist/{env-validation-Dea3v3ej.mjs → env-validation-ENpMy6Ez.mjs} +68 -122
- package/dist/{gen-BzXf3Jh2.mjs → gen-DI2YwdBM.mjs} +70 -15
- package/dist/generate-RTK8_kK1.mjs +47 -0
- package/dist/{github-cmd-DKcGUNsj.mjs → github-cmd-xItS5Zwf.mjs} +39 -31
- package/dist/{handler-Cjh8uM3Y.d.mts → handler-D1hLsObx.d.mts} +124 -122
- package/dist/{head-nmvOgFjd.d.mts → head-Do8P4puT.d.mts} +9 -8
- package/dist/{headers-ChAADPQu.mjs → headers-D8QfRX9Y.mjs} +12 -10
- package/dist/inbound-2d0zi2yS.mjs +706 -0
- package/dist/inbound-afAcWeQ9.d.mts +363 -0
- package/dist/index.d.mts +61 -34
- package/dist/index.mjs +1012 -293
- package/dist/{init-7JCAcKNQ.mjs → init-BD-9THgn.mjs} +329 -271
- package/dist/link-RMdgjF1v.mjs +52 -0
- package/dist/{list-CPwFDZ_c.mjs → list-3F52R_yO.mjs} +37 -5
- package/dist/{runner-kapo9aPs.mjs → local-d1-D2I6Ox5F.mjs} +116 -6
- package/dist/{login-BT3H8PN3.mjs → login-pV69H-ZO.mjs} +17 -15
- package/dist/{logs-Bt313ax7.mjs → logs-DFHHD6wE.mjs} +16 -2
- package/dist/mime-BJD7d_qL.mjs +1216 -0
- package/dist/neon-DHwd2zvC.mjs +54 -0
- package/dist/{node-pRg81HqV.mjs → node-Dk3H2jmU.mjs} +29 -8
- package/dist/operator-cmd-DYWRbWUA.mjs +348 -0
- package/dist/{agents-CtgBYqld.mjs → output-tFQLLj26.mjs} +676 -211
- package/dist/{package-json-Cx1osYo6.mjs → package-json-CPoWX79C.mjs} +1 -1
- package/dist/pages/client.d.mts +43 -41
- package/dist/pages/client.mjs +40 -33
- package/dist/pages/head-client.d.mts +10 -12
- package/dist/pages/head.d.mts +1 -1
- package/dist/pages/index.d.mts +37 -14
- package/dist/pages/index.mjs +5 -5
- package/dist/pages/islands-plugin.d.mts +25 -27
- package/dist/pages/islands-plugin.mjs +6 -4
- package/dist/pages/prefetch.d.mts +6 -7
- package/dist/pages/protocol.d.mts +2 -2
- package/dist/pages/protocol.mjs +2 -1
- package/dist/pages/serialize.d.mts +7 -8
- package/dist/platform-cmd-DxJ2FRwR.mjs +123 -0
- package/dist/platform-domain-ChvbJkdy.mjs +228 -0
- package/dist/platform-lifecycle-DN4MzJF_.mjs +4450 -0
- package/dist/platform-management-Db2PXw0B.mjs +698 -0
- package/dist/platform-recovery-C_YO-tIs.mjs +99 -0
- package/dist/{plugin-inference-DMeavIJ6.mjs → plugin-inference-BDRfZngg.mjs} +35 -19
- package/dist/prepare-BfJvFUtJ.mjs +14 -0
- package/dist/{prepare-BvvgAz-3.mjs → prepare-CBetXvsN.mjs} +15 -24
- package/dist/{preset-BjyR3lzz.mjs → preset-lAy0B0BQ.mjs} +25 -212
- package/dist/{project-cmd-D_w-4w5B.mjs → project-cmd-Mo0V9yKS.mjs} +25 -12
- package/dist/{project-paths-BQd7OmIo.mjs → project-paths-SK8nMHPp.mjs} +3 -1
- package/dist/{project-tsconfig-B-QtXjLQ.mjs → project-tsconfig-Ql2XsSQp.mjs} +2 -2
- package/dist/{protocol-Bnb0LFp3.d.mts → protocol-C-pqYJjE.d.mts} +3 -4
- package/dist/{provision-CPx2ZxsH.mjs → provision-Blnstcm2.mjs} +78 -45
- package/dist/r2-conditions-D1Wk8i7b.mjs +30 -0
- package/dist/{requests-B8sZxaFM.mjs → requests-BcKOVpRg.mjs} +5 -3
- package/dist/{resolve-project-BBMtLLV9.mjs → resolve-project--Vxawf7z.mjs} +2 -2
- package/dist/rollback-Bx85-0xh.mjs +166 -0
- package/dist/{rolldown-runtime-DJK8HYOj.mjs → rolldown-runtime-rQ84J-ij.mjs} +1 -1
- package/dist/{route-types-z1jtHEi_.mjs → route-types-Da-DpyUp.mjs} +77 -25
- package/dist/routes-stub.d.mts +22 -23
- package/dist/runner-mysql-7BPUNGmL.mjs +61 -0
- package/dist/{runner-pg-CHM76xuC.mjs → runner-pg-BkEza-dX.mjs} +18 -6
- package/dist/runtime/ai.d.mts +21 -14
- package/dist/runtime/ai.mjs +5 -4
- package/dist/runtime/auth-client-react.d.mts +3 -5
- package/dist/runtime/auth-client-solid.d.mts +3 -5
- package/dist/runtime/auth-client-svelte.d.mts +3 -5
- package/dist/runtime/auth-client-vue.d.mts +3 -5
- package/dist/runtime/auth-client.d.mts +3 -5
- package/dist/runtime/auth.d.mts +1 -1
- package/dist/runtime/better-auth-mysql.d.mts +10 -0
- package/dist/runtime/better-auth-mysql.mjs +49 -0
- package/dist/runtime/better-auth-pg.d.mts +8 -9
- package/dist/runtime/better-auth-pg.mjs +2 -2
- package/dist/runtime/better-auth.d.mts +8 -9
- package/dist/runtime/better-auth.mjs +2 -2
- package/dist/runtime/client-react.d.mts +1 -1
- package/dist/runtime/client-solid.d.mts +1 -1
- package/dist/runtime/client-svelte.d.mts +1 -1
- package/dist/runtime/client-vue.d.mts +1 -1
- package/dist/runtime/client.d.mts +1 -1
- package/dist/runtime/db-mysql.d.mts +2 -0
- package/dist/runtime/db-mysql.mjs +1 -0
- package/dist/runtime/db.d.mts +10 -11
- package/dist/runtime/durable.d.mts +47 -0
- package/dist/runtime/durable.mjs +146 -0
- package/dist/runtime/email/testing.d.mts +112 -0
- package/dist/runtime/email/testing.mjs +283 -0
- package/dist/runtime/email.d.mts +30 -0
- package/dist/runtime/email.mjs +573 -0
- package/dist/runtime/env-helpers.d.mts +2 -2
- package/dist/runtime/env-helpers.mjs +5 -42
- package/dist/runtime/env-public-client.d.mts +10 -11
- package/dist/runtime/env-public-client.mjs +1 -1
- package/dist/runtime/env-public.d.mts +2 -2
- package/dist/runtime/env-public.mjs +104 -49
- package/dist/runtime/env.d.mts +19 -18
- package/dist/runtime/env.mjs +15 -2
- package/dist/runtime/fetch-stream.d.mts +20 -21
- package/dist/runtime/fetch.d.mts +15 -16
- package/dist/runtime/handler.d.mts +1 -1
- package/dist/runtime/isr.d.mts +21 -22
- package/dist/runtime/isr.mjs +26 -8
- package/dist/runtime/kv.d.mts +9 -10
- package/dist/runtime/live-client.d.mts +5 -7
- package/dist/runtime/live-client.mjs +9 -7
- package/dist/runtime/live-server.d.mts +4 -5
- package/dist/runtime/live.d.mts +22 -24
- package/dist/runtime/live.mjs +1 -1
- package/dist/runtime/log.d.mts +16 -17
- package/dist/runtime/migration-handler-mysql.d.mts +4 -0
- package/dist/runtime/migration-handler-mysql.mjs +81 -0
- package/dist/runtime/migration-handler-pg.d.mts +2 -4
- package/dist/runtime/migration-handler.d.mts +5 -6
- package/dist/runtime/migration-handler.mjs +4 -3
- package/dist/runtime/queues.d.mts +3 -4
- package/dist/runtime/queues.mjs +2 -1
- package/dist/runtime/remote/binding-handler.d.mts +10 -12
- package/dist/runtime/remote/binding-handler.mjs +24 -3
- package/dist/runtime/remote/index.d.mts +5 -6
- package/dist/runtime/remote/index.mjs +21 -18
- package/dist/runtime/response.d.mts +10 -11
- package/dist/runtime/sandbox.d.mts +56 -55
- package/dist/runtime/sandbox.mjs +57 -49
- package/dist/runtime/schema-mysql.d.mts +1 -0
- package/dist/runtime/schema-mysql.mjs +2 -0
- package/dist/runtime/seed.d.mts +14 -9
- package/dist/runtime/sse-client.d.mts +6 -7
- package/dist/runtime/sse.d.mts +11 -12
- package/dist/runtime/storage.d.mts +3 -4
- package/dist/runtime/validator.d.mts +1 -1
- package/dist/runtime/ws-server.d.mts +12 -12
- package/dist/runtime/ws-server.mjs +32 -4
- package/dist/runtime/ws.d.mts +19 -21
- package/dist/{scan-ChWt4pX1.mjs → scan-BMH4rzlv.mjs} +42 -19
- package/dist/{scan-NU4xKGci.mjs → scan-CpK-57ug.mjs} +5 -4
- package/dist/{secret-Dt32J6RI.mjs → secret-ByhJ9AMl.mjs} +62 -5
- package/dist/{skills-CLjN0uUO.mjs → skills-Q46GZMO-.mjs} +6 -4
- package/dist/sqlite-validation-BzKMWnO4.mjs +25 -0
- package/dist/{standard-schema-DJ0HW7QP.d.mts → standard-schema-Fo_vCAZh.d.mts} +6 -6
- package/dist/{subcommand-prompt-BzV8iQZo.mjs → subcommand-prompt-WfySCQ7S.mjs} +67 -48
- package/dist/sveltekit.d.mts +12 -11
- package/dist/sveltekit.mjs +1 -1
- package/dist/types-BAp5AEBU.d.mts +79 -0
- package/dist/types-CKWnYgfy.d.mts +1 -0
- package/dist/{validate-Cw_RLeTj.mjs → validate-tBBN_dXH.mjs} +4 -3
- package/dist/wrangler--imS8n0d.mjs +1796 -0
- package/dist/{yarn-pnp-DJn3SAHF.mjs → yarn-pnp-DxSInkzL.mjs} +1 -1
- package/package.json +79 -65
- package/schema.json +22 -3
- package/skills/void/SKILL.md +59 -2
- package/skills/void/docs/guide/ai.md +32 -14
- package/skills/void/docs/guide/app-types.md +6 -6
- package/skills/void/docs/guide/auth.md +14 -16
- package/skills/void/docs/guide/database/d1.md +6 -0
- package/skills/void/docs/guide/database/mysql.md +60 -0
- package/skills/void/docs/guide/database/postgresql.md +14 -9
- package/skills/void/docs/guide/database.md +39 -26
- package/skills/void/docs/guide/deployment.md +99 -25
- package/skills/void/docs/guide/durable-state.md +140 -0
- package/skills/void/docs/guide/edge/headers.md +5 -5
- package/skills/void/docs/guide/edge/prerendering.md +2 -0
- package/skills/void/docs/guide/edge/revalidation.md +21 -6
- package/skills/void/docs/guide/edge/rewrites.md +18 -14
- package/skills/void/docs/guide/edge/static-assets.md +12 -10
- package/skills/void/docs/guide/email.md +640 -0
- package/skills/void/docs/guide/env-migration.md +109 -0
- package/skills/void/docs/guide/env-vars.md +70 -248
- package/skills/void/docs/guide/index.md +15 -17
- package/skills/void/docs/guide/jobs.md +8 -5
- package/skills/void/docs/guide/live.md +7 -15
- package/skills/void/docs/guide/pages-routing/actions-and-forms.md +8 -4
- package/skills/void/docs/guide/pages-routing/islands.md +3 -3
- package/skills/void/docs/guide/pages-routing/loaders.md +6 -4
- package/skills/void/docs/guide/pages-routing/overview.md +7 -7
- package/skills/void/docs/guide/platform-administration.md +212 -0
- package/skills/void/docs/guide/platform-development.md +264 -0
- package/skills/void/docs/guide/queues.md +10 -10
- package/skills/void/docs/guide/quickstart.md +46 -67
- package/skills/void/docs/guide/remote-dev.md +8 -6
- package/skills/void/docs/guide/sandboxes.md +33 -16
- package/skills/void/docs/guide/self-hosted-platform.md +553 -0
- package/skills/void/docs/guide/server-routing.md +5 -5
- package/skills/void/docs/guide/sse.md +4 -4
- package/skills/void/docs/guide/ssg.md +5 -3
- package/skills/void/docs/guide/storage.md +2 -2
- package/skills/void/docs/guide/websockets.md +15 -7
- package/skills/void/docs/index.md +3 -3
- package/skills/void/docs/integrations/agents.md +6 -64
- package/skills/void/docs/integrations/cloudflare.md +165 -146
- package/skills/void/docs/integrations/frameworks/analog.md +4 -4
- package/skills/void/docs/integrations/frameworks/astro.md +5 -5
- package/skills/void/docs/integrations/frameworks/nuxt.md +5 -5
- package/skills/void/docs/integrations/frameworks/overview.md +3 -3
- package/skills/void/docs/integrations/frameworks/react-router.md +3 -3
- package/skills/void/docs/integrations/frameworks/sveltekit.md +3 -3
- package/skills/void/docs/integrations/frameworks/tanstack-start.md +2 -2
- package/skills/void/docs/integrations/nodejs-bun-deno.md +11 -4
- package/skills/void/docs/reference/api.md +42 -6
- package/skills/void/docs/reference/cli.md +665 -160
- package/skills/void/docs/reference/config.md +67 -27
- package/skills/void/docs/reference/resource-inference.md +13 -9
- package/skills/void/docs/reference/structure.md +9 -11
- package/AGENT_PROMPT.md +0 -19
- package/dist/cf-access-Bqw81xAf.mjs +0 -22
- package/dist/env-CZy5MorI.mjs +0 -299
- package/dist/env-helpers-z4stu8uc.d.mts +0 -52
- package/dist/env-mask-Dd47NbR6.mjs +0 -90
- package/dist/env-public-BfiLcMBk.d.mts +0 -140
- package/dist/link-CdGHSIy-.mjs +0 -45
- package/dist/mcp-DoM3_nhd.mjs +0 -377
- package/dist/project-paths-GpziKeQQ.d.mts +0 -25
- package/dist/providers-BNKRacMr.d.mts +0 -7
- package/dist/proxy-D-3_D-Gl.mjs +0 -5
- package/dist/rollback-CkvTFXx5.mjs +0 -90
- package/dist/runtime/isr-cache.d.mts +0 -207
- package/dist/runtime/isr-cache.mjs +0 -523
- package/dist/types-lLjNE9Qp.d.mts +0 -51
- package/getting-started-prompt.txt +0 -28
- package/skills/void/command/void.md +0 -7
- package/skills/void/docs/integrations/auth-providers.md +0 -0
- package/skills/void/docs/integrations/payment-processors.md +0 -0
- package/skills/void/docs/node_modules/@iconify/vue/README.md +0 -408
- package/skills/void/docs/node_modules/@iconify/vue/offline/readme.md +0 -5
- package/skills/void/docs/node_modules/@voidzero-dev/vitepress-theme/README.md +0 -103
- package/skills/void/docs/node_modules/oxc-minify/README.md +0 -78
- package/skills/void/docs/node_modules/reka-ui/README.md +0 -80
- package/skills/void/docs/node_modules/vitepress/README.md +0 -28
- package/skills/void/docs/node_modules/vitepress/template/api-examples.md +0 -49
- package/skills/void/docs/node_modules/vitepress/template/index.md +0 -28
- package/skills/void/docs/node_modules/vitepress/template/markdown-examples.md +0 -85
- package/skills/void/docs/node_modules/vitepress-plugin-group-icons/README.md +0 -101
- package/skills/void/docs/node_modules/void/AGENT_PROMPT.md +0 -19
- package/skills/void/docs/node_modules/void/CLAUDE.md +0 -221
- package/skills/void/docs/node_modules/void/README.md +0 -90
- package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/CHANGELOG.md +0 -685
- package/skills/void/docs/node_modules/void/node_modules/@clack/prompts/README.md +0 -396
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/sandbox/README.md +0 -219
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/vite-plugin/README.md +0 -37
- package/skills/void/docs/node_modules/void/node_modules/@cloudflare/workers-types/README.md +0 -135
- package/skills/void/docs/node_modules/void/node_modules/@electric-sql/pglite/README.md +0 -189
- package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/CHANGELOG.md +0 -143
- package/skills/void/docs/node_modules/void/node_modules/@hono/oauth-providers/README.md +0 -1272
- package/skills/void/docs/node_modules/void/node_modules/@napi-rs/keyring/README.md +0 -19
- package/skills/void/docs/node_modules/void/node_modules/@types/better-sqlite3/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@types/node/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@types/pg/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@types/proper-lockfile/README.md +0 -51
- package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/README.md +0 -22
- package/skills/void/docs/node_modules/void/node_modules/@typescript/native-preview/vendor/vscode-jsonrpc/README.md +0 -69
- package/skills/void/docs/node_modules/void/node_modules/@void/md/README.md +0 -153
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/engine-javascript/README.md +0 -9
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@shikijs/transformers/README.md +0 -9
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/@types/node/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/CHANGELOG.md +0 -24
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/gray-matter/README.md +0 -565
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-exit/README.md +0 -127
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-anchor/README.md +0 -600
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-attrs/README.md +0 -386
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-container/README.md +0 -95
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-emoji/README.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/markdown-it-footnote/README.md +0 -135
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/pathslash/README.md +0 -64
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/shiki/README.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/tinyglobby/README.md +0 -25
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/AGENTS.md +0 -16
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/README.md +0 -220
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/build.md +0 -21
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/check.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/create.md +0 -70
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/fmt.md +0 -20
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/index.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/lint.md +0 -26
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/pack.md +0 -17
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/run.md +0 -364
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/staged.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/config/test.md +0 -18
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +0 -145
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/build.md +0 -40
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/cache.md +0 -107
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/check.md +0 -60
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ci.md +0 -62
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/commit-hooks.md +0 -60
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/create.md +0 -341
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/dev.md +0 -24
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/docker.md +0 -175
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/env.md +0 -167
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/fmt.md +0 -41
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/github-actions-cache.md +0 -165
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/ide-integration.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/implode.md +0 -23
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/index.md +0 -134
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/install.md +0 -199
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/lint.md +0 -50
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate-rules.md +0 -347
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/migrate.md +0 -197
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/monorepo.md +0 -176
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/pack.md +0 -69
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/run.md +0 -356
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/test.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/troubleshooting.md +0 -108
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/upgrade.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/vpx.md +0 -66
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/guide/why.md +0 -39
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/index.md +0 -12
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/docs/team.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/templates/generator/README.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vite-plus/templates/monorepo/README.md +0 -29
- package/skills/void/docs/node_modules/void/node_modules/@void/md/node_modules/vue/README.md +0 -58
- package/skills/void/docs/node_modules/void/node_modules/arktype/README.md +0 -165
- package/skills/void/docs/node_modules/void/node_modules/better-auth/LICENSE.md +0 -20
- package/skills/void/docs/node_modules/void/node_modules/better-auth/README.md +0 -32
- package/skills/void/docs/node_modules/void/node_modules/better-sqlite3/README.md +0 -99
- package/skills/void/docs/node_modules/void/node_modules/blake3-jit/README.md +0 -108
- package/skills/void/docs/node_modules/void/node_modules/drizzle-arktype/README.md +0 -51
- package/skills/void/docs/node_modules/void/node_modules/drizzle-kit/README.md +0 -79
- package/skills/void/docs/node_modules/void/node_modules/drizzle-orm/README.md +0 -44
- package/skills/void/docs/node_modules/void/node_modules/drizzle-valibot/README.md +0 -51
- package/skills/void/docs/node_modules/void/node_modules/drizzle-zod/README.md +0 -65
- package/skills/void/docs/node_modules/void/node_modules/es-module-lexer/README.md +0 -403
- package/skills/void/docs/node_modules/void/node_modules/estree-walker/README.md +0 -48
- package/skills/void/docs/node_modules/void/node_modules/hono/README.md +0 -85
- package/skills/void/docs/node_modules/void/node_modules/ignore/README.md +0 -452
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/CHANGELOG.md +0 -76
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/LICENSE.md +0 -21
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/README.md +0 -364
- package/skills/void/docs/node_modules/void/node_modules/jsonc-parser/SECURITY.md +0 -41
- package/skills/void/docs/node_modules/void/node_modules/magic-string/README.md +0 -325
- package/skills/void/docs/node_modules/void/node_modules/ofetch/README.md +0 -398
- package/skills/void/docs/node_modules/void/node_modules/pathslash/README.md +0 -64
- package/skills/void/docs/node_modules/void/node_modules/pg/README.md +0 -96
- package/skills/void/docs/node_modules/void/node_modules/pglite-server/README.md +0 -135
- package/skills/void/docs/node_modules/void/node_modules/picocolors/README.md +0 -21
- package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/CHANGELOG.md +0 -108
- package/skills/void/docs/node_modules/void/node_modules/proper-lockfile/README.md +0 -183
- package/skills/void/docs/node_modules/void/node_modules/tinyglobby/README.md +0 -25
- package/skills/void/docs/node_modules/void/node_modules/valibot/LICENSE.md +0 -9
- package/skills/void/docs/node_modules/void/node_modules/valibot/README.md +0 -94
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/AGENTS.md +0 -16
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/README.md +0 -220
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/build.md +0 -21
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/check.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/create.md +0 -70
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/fmt.md +0 -20
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/index.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/lint.md +0 -26
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/pack.md +0 -17
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/run.md +0 -364
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/staged.md +0 -15
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/config/test.md +0 -18
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/automatic-data-tracking.md +0 -145
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/build.md +0 -40
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/cache.md +0 -107
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/check.md +0 -60
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ci.md +0 -62
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/commit-hooks.md +0 -60
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/create.md +0 -341
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/dev.md +0 -24
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/docker.md +0 -175
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/env.md +0 -167
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/fmt.md +0 -41
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/github-actions-cache.md +0 -165
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/ide-integration.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/implode.md +0 -23
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/index.md +0 -134
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/install.md +0 -199
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/lint.md +0 -50
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate-rules.md +0 -347
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/migrate.md +0 -197
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/monorepo.md +0 -176
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/pack.md +0 -69
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/run.md +0 -356
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/test.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/troubleshooting.md +0 -108
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/upgrade.md +0 -101
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/vpx.md +0 -66
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/guide/why.md +0 -39
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/index.md +0 -12
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/docs/team.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/templates/generator/README.md +0 -35
- package/skills/void/docs/node_modules/void/node_modules/vite-plus/templates/monorepo/README.md +0 -29
- package/skills/void/docs/node_modules/void/node_modules/wrangler/README.md +0 -63
- package/skills/void/docs/node_modules/void/node_modules/zod/README.md +0 -191
- package/skills/void/docs/node_modules/void/skills/migrate-vite-cloudflare-to-void/SKILL.md +0 -175
- package/skills/void/docs/node_modules/void/skills/void/SKILL.md +0 -76
- package/skills/void/docs/node_modules/void/skills/void/command/void.md +0 -7
- package/skills/void/docs/node_modules/void/test/e2e/README.md +0 -85
|
@@ -0,0 +1,630 @@
|
|
|
1
|
+
import { n as __exportAll } from "./rolldown-runtime-rQ84J-ij.mjs";
|
|
2
|
+
import { n as dirname, o as join } from "./dist-BrsS7cai.mjs";
|
|
3
|
+
import { G as normalizePlatformApiUrl, K as platformCredentialAccount, V as getActivePlatformConnection, W as listPlatformConnections, at as readKeyringPassword, it as deleteKeyringPassword, ot as writeKeyringPassword } from "./output-tFQLLj26.mjs";
|
|
4
|
+
import { t as cfAccessHeaders } from "./cf-access-AJ1ehiFR.mjs";
|
|
5
|
+
import { t as ensureCloudflaredToken } from "./cf-access-DsSsZUPr.mjs";
|
|
6
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
8
|
+
import { homedir } from "node:os";
|
|
9
|
+
import { normalizeApplicationDomain } from "@void/platform";
|
|
10
|
+
//#region src/shared/proxy.ts
|
|
11
|
+
const DEFAULT_PROXY_URL = "https://proxy.void.cloud";
|
|
12
|
+
const STAGING_PROXY_URL = "https://proxy.staging.void.cloud";
|
|
13
|
+
//#endregion
|
|
14
|
+
//#region src/cli/hosted-platform.ts
|
|
15
|
+
const VOID_CLOUD_PLATFORM = Object.freeze({
|
|
16
|
+
apiUrl: "https://api.void.cloud",
|
|
17
|
+
applicationDomain: "void.app",
|
|
18
|
+
displayName: "Void Cloud",
|
|
19
|
+
proxyUrl: "https://proxy.void.cloud"
|
|
20
|
+
});
|
|
21
|
+
const VOID_CLOUD_STAGING_PLATFORM = Object.freeze({
|
|
22
|
+
apiUrl: "https://api.staging.void.cloud",
|
|
23
|
+
applicationDomain: "staging.void.app",
|
|
24
|
+
displayName: "Void Cloud staging",
|
|
25
|
+
proxyUrl: "https://proxy.staging.void.cloud"
|
|
26
|
+
});
|
|
27
|
+
const HOSTED_PLATFORMS = [VOID_CLOUD_PLATFORM, VOID_CLOUD_STAGING_PLATFORM];
|
|
28
|
+
function hostedPlatformForApiUrl(apiUrl) {
|
|
29
|
+
if (typeof apiUrl !== "string") return null;
|
|
30
|
+
let normalized;
|
|
31
|
+
try {
|
|
32
|
+
const parsed = new URL(apiUrl);
|
|
33
|
+
if (parsed.protocol !== "https:" || parsed.username || parsed.password || parsed.search || parsed.hash || parsed.pathname !== "/" && parsed.pathname !== "") return null;
|
|
34
|
+
normalized = parsed.origin;
|
|
35
|
+
} catch {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
return HOSTED_PLATFORMS.find((platform) => platform.apiUrl === normalized) ?? null;
|
|
39
|
+
}
|
|
40
|
+
/** Resolve an old ~/.void/config.json selection without returning credential values. */
|
|
41
|
+
function readLegacyHostedPlatformSelection(configPath = join(homedir(), ".void", "config.json")) {
|
|
42
|
+
let value = {};
|
|
43
|
+
try {
|
|
44
|
+
value = JSON.parse(readFileSync(configPath, "utf8"));
|
|
45
|
+
} catch {
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
if (value.api !== void 0) {
|
|
49
|
+
const platform = hostedPlatformForApiUrl(value.api);
|
|
50
|
+
return platform ? {
|
|
51
|
+
...platform,
|
|
52
|
+
source: "configured-api"
|
|
53
|
+
} : null;
|
|
54
|
+
}
|
|
55
|
+
if (typeof value.token === "string" && value.token !== "") return {
|
|
56
|
+
...VOID_CLOUD_PLATFORM,
|
|
57
|
+
source: "legacy-credential"
|
|
58
|
+
};
|
|
59
|
+
if (typeof value.stagingToken === "string" && value.stagingToken !== "") return {
|
|
60
|
+
...VOID_CLOUD_STAGING_PLATFORM,
|
|
61
|
+
source: "legacy-credential"
|
|
62
|
+
};
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
//#endregion
|
|
66
|
+
//#region src/cli/project.ts
|
|
67
|
+
var project_exports = /* @__PURE__ */ __exportAll({
|
|
68
|
+
attachSelectedPlatform: () => attachSelectedPlatform,
|
|
69
|
+
isLegacyVoidCloudProject: () => isLegacyVoidCloudProject,
|
|
70
|
+
isVoidInternalStaging: () => isVoidInternalStaging,
|
|
71
|
+
readDeploymentPlatform: () => readDeploymentPlatform,
|
|
72
|
+
readProjectApplicationDomain: () => readProjectApplicationDomain,
|
|
73
|
+
readProjectConfig: () => readProjectConfig,
|
|
74
|
+
readProjectPlatformUrl: () => readProjectPlatformUrl,
|
|
75
|
+
removeProjectConfig: () => removeProjectConfig,
|
|
76
|
+
writeDeploymentPlatform: () => writeDeploymentPlatform,
|
|
77
|
+
writePlatformSelection: () => writePlatformSelection,
|
|
78
|
+
writeProjectConfig: () => writeProjectConfig
|
|
79
|
+
});
|
|
80
|
+
const PROJECT_FILE = ".void/project.json";
|
|
81
|
+
function readProjectConfigFile(root) {
|
|
82
|
+
const filePath = join(root, PROJECT_FILE);
|
|
83
|
+
try {
|
|
84
|
+
const raw = readFileSync(filePath, "utf-8");
|
|
85
|
+
const config = JSON.parse(raw);
|
|
86
|
+
if (typeof config !== "object" || config === null || Array.isArray(config)) return null;
|
|
87
|
+
return config;
|
|
88
|
+
} catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Read the project config from the project root.
|
|
94
|
+
* Returns null if no project.json exists.
|
|
95
|
+
* A file containing only internal metadata is not treated as a linked project.
|
|
96
|
+
*/
|
|
97
|
+
function readProjectConfig(root) {
|
|
98
|
+
const config = readProjectConfigFile(root);
|
|
99
|
+
if (!config || typeof config.projectId !== "string" || typeof config.slug !== "string") return null;
|
|
100
|
+
const result = {
|
|
101
|
+
projectId: config.projectId,
|
|
102
|
+
slug: config.slug
|
|
103
|
+
};
|
|
104
|
+
if (typeof config.platformUrl === "string") result.platformUrl = normalizePlatformApiUrl(config.platformUrl);
|
|
105
|
+
if (typeof config.applicationDomain === "string") result.applicationDomain = normalizeApplicationDomain(config.applicationDomain);
|
|
106
|
+
if (typeof config.proxyUrl === "string") result.proxyUrl = normalizePlatformApiUrl(config.proxyUrl);
|
|
107
|
+
if (config.voidInternalStaging === true) result.voidInternalStaging = true;
|
|
108
|
+
return result;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Read the deployment platform selected during `void init`.
|
|
112
|
+
*
|
|
113
|
+
* Linked project files created before the platform field existed implicitly
|
|
114
|
+
* target Void. A metadata-only file has no deployment preference.
|
|
115
|
+
*/
|
|
116
|
+
function readDeploymentPlatform(root) {
|
|
117
|
+
const config = readProjectConfigFile(root);
|
|
118
|
+
if (!config) return null;
|
|
119
|
+
if (config.platform === "cloudflare" || config.platform === "void" || config.platform === "none") return config.platform;
|
|
120
|
+
if (typeof config.projectId === "string" && typeof config.slug === "string") return "void";
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Persist a deployment preference without discarding an existing Void project
|
|
125
|
+
* link. Keeping the link makes switching back to Void non-destructive.
|
|
126
|
+
*/
|
|
127
|
+
function writeDeploymentPlatform(root, platform) {
|
|
128
|
+
const filePath = join(root, PROJECT_FILE);
|
|
129
|
+
const existing = readProjectConfigFile(root);
|
|
130
|
+
const next = { platform };
|
|
131
|
+
if (typeof existing?.projectId === "string") next.projectId = existing.projectId;
|
|
132
|
+
if (typeof existing?.platformUrl === "string") next.platformUrl = existing.platformUrl;
|
|
133
|
+
if (typeof existing?.applicationDomain === "string") next.applicationDomain = existing.applicationDomain;
|
|
134
|
+
if (typeof existing?.proxyUrl === "string") next.proxyUrl = existing.proxyUrl;
|
|
135
|
+
if (typeof existing?.slug === "string") next.slug = existing.slug;
|
|
136
|
+
if (existing?.voidInternalStaging === true) next.voidInternalStaging = true;
|
|
137
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
138
|
+
writeFileSync(filePath, JSON.stringify(next, null, 2) + "\n");
|
|
139
|
+
}
|
|
140
|
+
/** Select a verified platform without changing an existing project link. */
|
|
141
|
+
function writePlatformSelection(root, connection) {
|
|
142
|
+
const existing = readProjectConfigFile(root);
|
|
143
|
+
const linked = readProjectConfig(root);
|
|
144
|
+
const pinnedUrl = isVoidInternalStaging(root) ? VOID_CLOUD_STAGING_PLATFORM.apiUrl : linked ? linked.platformUrl ?? VOID_CLOUD_PLATFORM.apiUrl : null;
|
|
145
|
+
if (pinnedUrl && pinnedUrl !== connection.apiUrl) return false;
|
|
146
|
+
const filePath = join(root, PROJECT_FILE);
|
|
147
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
148
|
+
writeFileSync(filePath, JSON.stringify({
|
|
149
|
+
...existing,
|
|
150
|
+
platform: "void",
|
|
151
|
+
platformUrl: normalizePlatformApiUrl(connection.apiUrl),
|
|
152
|
+
applicationDomain: normalizeApplicationDomain(connection.applicationDomain),
|
|
153
|
+
proxyUrl: normalizePlatformApiUrl(connection.proxyUrl)
|
|
154
|
+
}, null, 2) + "\n");
|
|
155
|
+
return true;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Internal-only platform developers' staging switch.
|
|
159
|
+
* This intentionally lives with the project link state, not public void.json.
|
|
160
|
+
*/
|
|
161
|
+
function isVoidInternalStaging(root) {
|
|
162
|
+
return readProjectConfigFile(root)?.voidInternalStaging === true;
|
|
163
|
+
}
|
|
164
|
+
function readProjectPlatformUrl(root) {
|
|
165
|
+
const value = readProjectConfigFile(root)?.platformUrl;
|
|
166
|
+
return typeof value === "string" && value !== "" ? normalizePlatformApiUrl(value) : null;
|
|
167
|
+
}
|
|
168
|
+
function readProjectApplicationDomain(root) {
|
|
169
|
+
const value = readProjectConfigFile(root)?.applicationDomain;
|
|
170
|
+
return typeof value === "string" && value !== "" ? normalizeApplicationDomain(value) : null;
|
|
171
|
+
}
|
|
172
|
+
/** Resolve the immutable platform identity that every newly linked project records. */
|
|
173
|
+
function attachSelectedPlatform(root, config, platformApiUrl) {
|
|
174
|
+
const apiUrl = normalizePlatformApiUrl(platformApiUrl);
|
|
175
|
+
const hosted = hostedPlatformForApiUrl(apiUrl);
|
|
176
|
+
if (hosted) return {
|
|
177
|
+
...config,
|
|
178
|
+
applicationDomain: hosted.applicationDomain,
|
|
179
|
+
platformUrl: hosted.apiUrl,
|
|
180
|
+
proxyUrl: hosted.proxyUrl,
|
|
181
|
+
...isVoidInternalStaging(root) && hosted.apiUrl === VOID_CLOUD_STAGING_PLATFORM.apiUrl ? { voidInternalStaging: true } : {}
|
|
182
|
+
};
|
|
183
|
+
const connection = listPlatformConnections().find((entry) => entry.apiUrl === apiUrl);
|
|
184
|
+
if (connection?.applicationDomain && connection.proxyUrl) return {
|
|
185
|
+
...config,
|
|
186
|
+
applicationDomain: connection.applicationDomain,
|
|
187
|
+
platformUrl: connection.apiUrl,
|
|
188
|
+
proxyUrl: connection.proxyUrl
|
|
189
|
+
};
|
|
190
|
+
throw new Error(`platform: No verified metadata is registered for ${apiUrl}. Run \`void connect ${apiUrl}\` before linking a project.`);
|
|
191
|
+
}
|
|
192
|
+
function isLegacyVoidCloudProject(root) {
|
|
193
|
+
const config = readProjectConfigFile(root);
|
|
194
|
+
return typeof config?.projectId === "string" && typeof config.slug === "string" && typeof config.platformUrl !== "string";
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Write the project config to the project root.
|
|
198
|
+
*/
|
|
199
|
+
function writeProjectConfig(root, config) {
|
|
200
|
+
const filePath = join(root, PROJECT_FILE);
|
|
201
|
+
const existing = readProjectConfigFile(root);
|
|
202
|
+
const next = {
|
|
203
|
+
platform: "void",
|
|
204
|
+
projectId: config.projectId,
|
|
205
|
+
slug: config.slug
|
|
206
|
+
};
|
|
207
|
+
if (config.platformUrl) next.platformUrl = normalizePlatformApiUrl(config.platformUrl);
|
|
208
|
+
else if (typeof existing?.platformUrl === "string") next.platformUrl = existing.platformUrl;
|
|
209
|
+
if (config.applicationDomain) next.applicationDomain = normalizeApplicationDomain(config.applicationDomain);
|
|
210
|
+
else if (typeof existing?.applicationDomain === "string") next.applicationDomain = existing.applicationDomain;
|
|
211
|
+
if (config.proxyUrl) next.proxyUrl = normalizePlatformApiUrl(config.proxyUrl);
|
|
212
|
+
else if (typeof existing?.proxyUrl === "string") next.proxyUrl = existing.proxyUrl;
|
|
213
|
+
if (config.voidInternalStaging === true || existing?.voidInternalStaging === true) next.voidInternalStaging = true;
|
|
214
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
215
|
+
writeFileSync(filePath, JSON.stringify(next, null, 2) + "\n");
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Remove the project config file. Returns true if removed, false if it didn't exist.
|
|
219
|
+
*/
|
|
220
|
+
function removeProjectConfig(root) {
|
|
221
|
+
const filePath = join(root, PROJECT_FILE);
|
|
222
|
+
try {
|
|
223
|
+
rmSync(filePath);
|
|
224
|
+
return true;
|
|
225
|
+
} catch {
|
|
226
|
+
return false;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//#endregion
|
|
230
|
+
//#region src/cli/auth.ts
|
|
231
|
+
var auth_exports = /* @__PURE__ */ __exportAll({
|
|
232
|
+
awaitBrowserCallback: () => awaitBrowserCallback,
|
|
233
|
+
createCodeChallenge: () => createCodeChallenge,
|
|
234
|
+
createCodeVerifier: () => createCodeVerifier,
|
|
235
|
+
getApiUrl: () => getApiUrl,
|
|
236
|
+
getProxyUrl: () => getProxyUrl,
|
|
237
|
+
getSiteDomain: () => getSiteDomain,
|
|
238
|
+
getToken: () => getToken,
|
|
239
|
+
getTokenSource: () => getTokenSource,
|
|
240
|
+
isStagingMode: () => isStagingMode,
|
|
241
|
+
openBrowser: () => openBrowser,
|
|
242
|
+
readPlatformToken: () => readPlatformToken,
|
|
243
|
+
removeToken: () => removeToken,
|
|
244
|
+
runLogin: () => runLogin,
|
|
245
|
+
runPlatformLogin: () => runPlatformLogin,
|
|
246
|
+
savePlatformToken: () => savePlatformToken,
|
|
247
|
+
saveToken: () => saveToken
|
|
248
|
+
});
|
|
249
|
+
const CONFIG_DIR = join(homedir(), ".void");
|
|
250
|
+
const CONFIG_PATH = join(CONFIG_DIR, "config.json");
|
|
251
|
+
const KEYRING_SERVICE = "dev.void.cli";
|
|
252
|
+
function keyringGet(account) {
|
|
253
|
+
return readKeyringPassword(KEYRING_SERVICE, account);
|
|
254
|
+
}
|
|
255
|
+
function keyringSet(account, password) {
|
|
256
|
+
return writeKeyringPassword(KEYRING_SERVICE, account, password);
|
|
257
|
+
}
|
|
258
|
+
function keyringDelete(account) {
|
|
259
|
+
return deleteKeyringPassword(KEYRING_SERVICE, account);
|
|
260
|
+
}
|
|
261
|
+
function readConfig() {
|
|
262
|
+
try {
|
|
263
|
+
return JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
|
|
264
|
+
} catch {
|
|
265
|
+
return {};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function writeConfig(config) {
|
|
269
|
+
mkdirSync(CONFIG_DIR, { recursive: true });
|
|
270
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + "\n", { mode: 384 });
|
|
271
|
+
}
|
|
272
|
+
function isStagingMode(root = process.cwd()) {
|
|
273
|
+
return isVoidInternalStaging(root);
|
|
274
|
+
}
|
|
275
|
+
function getSiteDomain(root = process.cwd()) {
|
|
276
|
+
const legacySelection = readLegacyHostedPlatformSelection();
|
|
277
|
+
const domain = readProjectApplicationDomain(root) ?? (isStagingMode(root) ? VOID_CLOUD_STAGING_PLATFORM.applicationDomain : void 0) ?? (isLegacyVoidCloudProject(root) || process.env.VOID_TOKEN && process.env.VOID_API_URL === void 0 ? VOID_CLOUD_PLATFORM.applicationDomain : void 0) ?? getActivePlatformConnection()?.applicationDomain ?? legacySelection?.applicationDomain;
|
|
278
|
+
if (!domain) throw new Error("platform: No Void platform selected. Run `void connect <url>` or `void platform install` first.");
|
|
279
|
+
return domain;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Read the deploy token.
|
|
283
|
+
* Priority: origin-bound VOID_TOKEN > system keychain > migrated config.
|
|
284
|
+
* An unscoped environment token retains its historical Void Cloud destination.
|
|
285
|
+
*/
|
|
286
|
+
function getToken(root = process.cwd()) {
|
|
287
|
+
const envToken = process.env.VOID_TOKEN;
|
|
288
|
+
let apiUrl;
|
|
289
|
+
try {
|
|
290
|
+
apiUrl = getApiUrl(root);
|
|
291
|
+
} catch (error) {
|
|
292
|
+
if (envToken) throw error;
|
|
293
|
+
return null;
|
|
294
|
+
}
|
|
295
|
+
if (envToken) {
|
|
296
|
+
const tokenOrigin = process.env.VOID_API_URL ? normalizePlatformApiUrl(process.env.VOID_API_URL) : DEFAULT_API_URL;
|
|
297
|
+
if (apiUrl !== tokenOrigin) throw new Error(`auth: VOID_TOKEN is not bound to ${apiUrl}. Set VOID_API_URL to this platform's URL with its matching token, or unset VOID_TOKEN to use the saved login.`);
|
|
298
|
+
return envToken;
|
|
299
|
+
}
|
|
300
|
+
const account = platformCredentialAccount(apiUrl);
|
|
301
|
+
const keyringToken = keyringGet(account);
|
|
302
|
+
if (keyringToken) return keyringToken;
|
|
303
|
+
const config = readConfig();
|
|
304
|
+
const normalizedApiUrl = normalizePlatformApiUrl(apiUrl);
|
|
305
|
+
const fileToken = config.tokens?.[normalizedApiUrl];
|
|
306
|
+
if (fileToken) {
|
|
307
|
+
if (keyringSet(account, fileToken)) {
|
|
308
|
+
delete config.tokens[normalizedApiUrl];
|
|
309
|
+
if (Object.keys(config.tokens).length === 0) delete config.tokens;
|
|
310
|
+
try {
|
|
311
|
+
writeConfig(config);
|
|
312
|
+
} catch {}
|
|
313
|
+
}
|
|
314
|
+
return fileToken;
|
|
315
|
+
}
|
|
316
|
+
const legacyAccount = legacyCredentialAccount(root, normalizedApiUrl, config);
|
|
317
|
+
if (legacyAccount) {
|
|
318
|
+
const legacyKeyringToken = keyringGet(legacyAccount);
|
|
319
|
+
if (legacyKeyringToken) {
|
|
320
|
+
keyringSet(account, legacyKeyringToken);
|
|
321
|
+
return legacyKeyringToken;
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
if (!legacyAccount) return null;
|
|
325
|
+
const legacyFileToken = config[legacyAccount];
|
|
326
|
+
if (legacyFileToken) {
|
|
327
|
+
if (keyringSet(account, legacyFileToken)) {
|
|
328
|
+
config.api ??= normalizedApiUrl;
|
|
329
|
+
delete config[legacyAccount];
|
|
330
|
+
try {
|
|
331
|
+
writeConfig(config);
|
|
332
|
+
} catch {}
|
|
333
|
+
}
|
|
334
|
+
return legacyFileToken;
|
|
335
|
+
}
|
|
336
|
+
return null;
|
|
337
|
+
}
|
|
338
|
+
function getTokenSource() {
|
|
339
|
+
return process.env.VOID_TOKEN ? "ci" : "manual";
|
|
340
|
+
}
|
|
341
|
+
function saveToken(token, root = process.cwd(), dependencies = {}) {
|
|
342
|
+
savePlatformToken(token, getApiUrl(root), dependencies);
|
|
343
|
+
}
|
|
344
|
+
function readPlatformToken(apiUrl) {
|
|
345
|
+
return keyringGet(platformCredentialAccount(normalizePlatformApiUrl(apiUrl)));
|
|
346
|
+
}
|
|
347
|
+
function savePlatformToken(token, origin, dependencies = {}) {
|
|
348
|
+
const apiUrl = normalizePlatformApiUrl(origin);
|
|
349
|
+
const account = platformCredentialAccount(apiUrl);
|
|
350
|
+
if ((dependencies.keyringSet ?? keyringSet)(account, token)) return;
|
|
351
|
+
throw new Error("auth: The system keychain is unavailable. Refusing to store your platform token in plaintext. Configure a system keychain, or set VOID_TOKEN from a secret manager in headless environments.");
|
|
352
|
+
}
|
|
353
|
+
function removeToken(root = process.cwd()) {
|
|
354
|
+
const apiUrl = normalizePlatformApiUrl(getApiUrl(root));
|
|
355
|
+
const account = platformCredentialAccount(apiUrl);
|
|
356
|
+
let removed = false;
|
|
357
|
+
if (keyringDelete(account)) removed = true;
|
|
358
|
+
try {
|
|
359
|
+
const config = readConfig();
|
|
360
|
+
let configChanged = false;
|
|
361
|
+
const legacyAccount = legacyCredentialAccount(root, apiUrl, config);
|
|
362
|
+
if (legacyAccount && keyringDelete(legacyAccount)) removed = true;
|
|
363
|
+
if (legacyAccount && config[legacyAccount]) {
|
|
364
|
+
delete config[legacyAccount];
|
|
365
|
+
configChanged = true;
|
|
366
|
+
removed = true;
|
|
367
|
+
}
|
|
368
|
+
if (config.tokens?.[apiUrl]) {
|
|
369
|
+
delete config.tokens[apiUrl];
|
|
370
|
+
if (Object.keys(config.tokens).length === 0) delete config.tokens;
|
|
371
|
+
configChanged = true;
|
|
372
|
+
removed = true;
|
|
373
|
+
}
|
|
374
|
+
if (configChanged) writeConfig(config);
|
|
375
|
+
} catch {}
|
|
376
|
+
return removed;
|
|
377
|
+
}
|
|
378
|
+
const DEFAULT_API_URL = VOID_CLOUD_PLATFORM.apiUrl;
|
|
379
|
+
const STAGING_API_URL = VOID_CLOUD_STAGING_PLATFORM.apiUrl;
|
|
380
|
+
function legacyCredentialAccount(root, normalizedApiUrl, config) {
|
|
381
|
+
const account = isStagingMode(root) ? "stagingToken" : "token";
|
|
382
|
+
let configuredUrl;
|
|
383
|
+
try {
|
|
384
|
+
configuredUrl = normalizePlatformApiUrl(config.api ?? (isStagingMode(root) ? STAGING_API_URL : DEFAULT_API_URL));
|
|
385
|
+
} catch {
|
|
386
|
+
return null;
|
|
387
|
+
}
|
|
388
|
+
return configuredUrl === normalizedApiUrl ? account : null;
|
|
389
|
+
}
|
|
390
|
+
function base64Url(buffer) {
|
|
391
|
+
return buffer.toString("base64").replaceAll("+", "-").replaceAll("/", "_").replaceAll("=", "");
|
|
392
|
+
}
|
|
393
|
+
function createCodeVerifier() {
|
|
394
|
+
return base64Url(randomBytes(32));
|
|
395
|
+
}
|
|
396
|
+
function createCodeChallenge(verifier) {
|
|
397
|
+
return base64Url(createHash("sha256").update(verifier).digest());
|
|
398
|
+
}
|
|
399
|
+
async function exchangeLoginCode(apiUrl, code, state, codeVerifier) {
|
|
400
|
+
const base = apiUrl.endsWith("/") ? apiUrl : `${apiUrl}/`;
|
|
401
|
+
ensureCloudflaredToken(apiUrl);
|
|
402
|
+
const res = await fetch(new URL("auth/cli/token", base), {
|
|
403
|
+
method: "POST",
|
|
404
|
+
headers: {
|
|
405
|
+
"Content-Type": "application/json",
|
|
406
|
+
...cfAccessHeaders(process.env, apiUrl)
|
|
407
|
+
},
|
|
408
|
+
body: JSON.stringify({
|
|
409
|
+
code,
|
|
410
|
+
state,
|
|
411
|
+
code_verifier: codeVerifier
|
|
412
|
+
})
|
|
413
|
+
});
|
|
414
|
+
if (!res.ok) throw new Error(`auth: Failed to exchange login code (${res.status}). Try logging in again.`);
|
|
415
|
+
let body;
|
|
416
|
+
try {
|
|
417
|
+
body = await res.json();
|
|
418
|
+
} catch {
|
|
419
|
+
throw new Error("auth: Login code exchange returned an invalid response.");
|
|
420
|
+
}
|
|
421
|
+
if (!body || typeof body !== "object" || !("token" in body) || typeof body.token !== "string" || body.token.length === 0) throw new Error("auth: Login code exchange did not return a token.");
|
|
422
|
+
return body.token;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Read the API URL from environment or config file.
|
|
426
|
+
* Priority: VOID_API_URL env var > ~/.void/config.json > default
|
|
427
|
+
*/
|
|
428
|
+
function getApiUrl(root = process.cwd()) {
|
|
429
|
+
if (process.env.VOID_API_URL) return normalizePlatformApiUrl(process.env.VOID_API_URL);
|
|
430
|
+
if (isStagingMode(root)) return STAGING_API_URL;
|
|
431
|
+
const projectApiUrl = readProjectPlatformUrl(root);
|
|
432
|
+
if (projectApiUrl) {
|
|
433
|
+
if (projectApiUrl === DEFAULT_API_URL || projectApiUrl === STAGING_API_URL) return projectApiUrl;
|
|
434
|
+
if (listPlatformConnections().some((connection) => connection.apiUrl === projectApiUrl)) return projectApiUrl;
|
|
435
|
+
throw new Error(`platform: Project metadata selected unverified platform ${projectApiUrl}. Connect to it explicitly with \`void connect ${projectApiUrl}\` before forwarding credentials.`);
|
|
436
|
+
}
|
|
437
|
+
const config = readConfig();
|
|
438
|
+
const legacySelection = readLegacyHostedPlatformSelection();
|
|
439
|
+
let apiUrl = (isLegacyVoidCloudProject(root) ? DEFAULT_API_URL : void 0) ?? getActivePlatformConnection()?.apiUrl ?? config.api ?? legacySelection?.apiUrl;
|
|
440
|
+
apiUrl ??= process.env.VOID_TOKEN ? DEFAULT_API_URL : void 0;
|
|
441
|
+
if (!apiUrl) {
|
|
442
|
+
apiUrl = keyringGet("token") ? DEFAULT_API_URL : keyringGet("stagingToken") ? STAGING_API_URL : void 0;
|
|
443
|
+
if (apiUrl) try {
|
|
444
|
+
writeConfig({
|
|
445
|
+
...config,
|
|
446
|
+
api: apiUrl
|
|
447
|
+
});
|
|
448
|
+
} catch {}
|
|
449
|
+
}
|
|
450
|
+
if (!apiUrl) throw new Error("platform: No Void platform selected. Run `void connect <url>` or `void platform install` first.");
|
|
451
|
+
return normalizePlatformApiUrl(apiUrl);
|
|
452
|
+
}
|
|
453
|
+
function getProxyUrl(root = process.cwd()) {
|
|
454
|
+
if (process.env.VOID_PROXY_URL) return normalizePlatformApiUrl(process.env.VOID_PROXY_URL);
|
|
455
|
+
const apiUrl = normalizePlatformApiUrl(getApiUrl(root));
|
|
456
|
+
if (apiUrl === STAGING_API_URL) return STAGING_PROXY_URL;
|
|
457
|
+
if (apiUrl === DEFAULT_API_URL) return DEFAULT_PROXY_URL;
|
|
458
|
+
const proxyUrl = listPlatformConnections().find((connection) => connection.apiUrl === apiUrl)?.proxyUrl;
|
|
459
|
+
if (proxyUrl === null || proxyUrl === void 0) throw new Error(`platform: No verified proxy is registered for ${apiUrl}. Reconnect with \`void connect ${apiUrl}\` or set VOID_PROXY_URL explicitly.`);
|
|
460
|
+
return proxyUrl;
|
|
461
|
+
}
|
|
462
|
+
function page(title, message) {
|
|
463
|
+
return `<!DOCTYPE html>
|
|
464
|
+
<html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
|
|
465
|
+
<title>${title} - Void</title>
|
|
466
|
+
<style>:root{color-scheme:light dark}*{margin:0;padding:0;box-sizing:border-box}body{font-family:system-ui,-apple-system,sans-serif;min-height:100vh;display:flex;align-items:center;justify-content:center;background:#fafafa;color:#111}.card{text-align:center;padding:3rem}h1{font-size:1.5rem;font-weight:600;margin-bottom:.75rem}p{color:#666;font-size:1rem}@media (prefers-color-scheme:dark){body{background:#0a0a0a;color:#fafafa}p{color:#a3a3a3}}</style>
|
|
467
|
+
</head><body><div class="card"><h1>${title}</h1><p>${message}</p></div></body></html>`;
|
|
468
|
+
}
|
|
469
|
+
function openBrowser(url, execFile) {
|
|
470
|
+
const ignore = () => {};
|
|
471
|
+
if (process.platform === "win32") {
|
|
472
|
+
execFile("rundll32.exe", ["url.dll,FileProtocolHandler", url], ignore);
|
|
473
|
+
return;
|
|
474
|
+
}
|
|
475
|
+
if (process.platform === "darwin") {
|
|
476
|
+
execFile("open", [url], ignore);
|
|
477
|
+
return;
|
|
478
|
+
}
|
|
479
|
+
if (process.env.WSL_DISTRO_NAME || process.env.WSL_INTEROP) {
|
|
480
|
+
execFile("wslview", [url], (error) => {
|
|
481
|
+
if (error) execFile("rundll32.exe", ["url.dll,FileProtocolHandler", url], ignore);
|
|
482
|
+
});
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
execFile("xdg-open", [url], ignore);
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* Start a local HTTP callback server, open the browser to a caller-built
|
|
489
|
+
* authorize URL, and wait for the redirect back to `http://localhost:PORT/callback`.
|
|
490
|
+
*
|
|
491
|
+
* The server validates the `state` it appended to the callback URL against the
|
|
492
|
+
* incoming request, then runs the caller's `finalize` hook INSIDE the request
|
|
493
|
+
* handler (so the browser only ever sees the success page after the underlying
|
|
494
|
+
* exchange/link actually succeeded). On finalize success it renders the success
|
|
495
|
+
* HTML and resolves with finalize's return value; on finalize failure it
|
|
496
|
+
* renders the same "could not complete" failure page the login flow uses and
|
|
497
|
+
* rejects with the thrown error. The server is always closed before settling.
|
|
498
|
+
*
|
|
499
|
+
* `onUrl` is invoked with the authorize URL once the local server is listening,
|
|
500
|
+
* so callers can show the URL to the user as a manual fallback when the browser
|
|
501
|
+
* fails to open (common on WSL2, headless SSH, Docker, etc.). To match the
|
|
502
|
+
* login flow it fires immediately before the browser is opened.
|
|
503
|
+
*
|
|
504
|
+
* `execFile` is injectable so tests can avoid launching a real browser.
|
|
505
|
+
*/
|
|
506
|
+
async function awaitBrowserCallback(options) {
|
|
507
|
+
const http = await import("node:http");
|
|
508
|
+
const { state, buildAuthUrl, finalize, describeError, validate, onUrl } = options;
|
|
509
|
+
const timeoutMs = options.timeoutMs ?? 3e5;
|
|
510
|
+
const execFile = options.execFile ?? (await import("node:child_process")).execFile;
|
|
511
|
+
return new Promise((resolve, reject) => {
|
|
512
|
+
let settled = false;
|
|
513
|
+
const fail = (error) => {
|
|
514
|
+
if (settled) return;
|
|
515
|
+
settled = true;
|
|
516
|
+
server.close();
|
|
517
|
+
reject(error);
|
|
518
|
+
};
|
|
519
|
+
const succeed = (result) => {
|
|
520
|
+
if (settled) return;
|
|
521
|
+
settled = true;
|
|
522
|
+
server.close();
|
|
523
|
+
resolve(result);
|
|
524
|
+
};
|
|
525
|
+
const server = http.createServer(async (req, res) => {
|
|
526
|
+
const url = new URL(req.url, `http://localhost`);
|
|
527
|
+
if (url.pathname !== "/callback") {
|
|
528
|
+
res.writeHead(404);
|
|
529
|
+
res.end("Not found");
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
if (url.searchParams.get("state") !== state) {
|
|
533
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
534
|
+
res.end(page("Login failed", "Invalid login callback. Please try again."));
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
const errorMessage = describeError?.(url.searchParams);
|
|
538
|
+
if (errorMessage) {
|
|
539
|
+
res.writeHead(403, { "Content-Type": "text/html" });
|
|
540
|
+
res.end(page("Login failed", errorMessage));
|
|
541
|
+
fail(new Error(errorMessage));
|
|
542
|
+
return;
|
|
543
|
+
}
|
|
544
|
+
const invalidMessage = validate?.(url.searchParams);
|
|
545
|
+
if (invalidMessage) {
|
|
546
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
547
|
+
res.end(page("Login failed", invalidMessage));
|
|
548
|
+
return;
|
|
549
|
+
}
|
|
550
|
+
let result;
|
|
551
|
+
try {
|
|
552
|
+
result = await finalize(url.searchParams);
|
|
553
|
+
} catch (err) {
|
|
554
|
+
if (settled) return;
|
|
555
|
+
res.writeHead(400, { "Content-Type": "text/html" });
|
|
556
|
+
res.end(page("Login failed", "Could not complete login. Please try again."));
|
|
557
|
+
fail(err instanceof Error ? err : /* @__PURE__ */ new Error("auth: Failed to complete login."));
|
|
558
|
+
return;
|
|
559
|
+
}
|
|
560
|
+
if (settled) return;
|
|
561
|
+
res.writeHead(200, { "Content-Type": "text/html" });
|
|
562
|
+
res.end(page("Login successful!", "You can close this tab and return to the terminal."));
|
|
563
|
+
succeed(result);
|
|
564
|
+
});
|
|
565
|
+
server.on("connection", (socket) => socket.unref());
|
|
566
|
+
server.listen(0, "127.0.0.1", async () => {
|
|
567
|
+
const addr = server.address();
|
|
568
|
+
if (!addr || typeof addr === "string") {
|
|
569
|
+
fail(/* @__PURE__ */ new Error("auth: Failed to start local callback server."));
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
const port = addr.port;
|
|
573
|
+
const callback = new URL(`http://localhost:${port}/callback`);
|
|
574
|
+
callback.searchParams.set("state", state);
|
|
575
|
+
let authUrl;
|
|
576
|
+
try {
|
|
577
|
+
authUrl = await buildAuthUrl(callback);
|
|
578
|
+
} catch (err) {
|
|
579
|
+
fail(err instanceof Error ? err : /* @__PURE__ */ new Error("auth: Failed to build authorize URL."));
|
|
580
|
+
return;
|
|
581
|
+
}
|
|
582
|
+
onUrl?.(authUrl);
|
|
583
|
+
openBrowser(authUrl, execFile);
|
|
584
|
+
});
|
|
585
|
+
setTimeout(() => {
|
|
586
|
+
fail(/* @__PURE__ */ new Error("auth: Login timed out after 5 minutes. Try again."));
|
|
587
|
+
}, timeoutMs).unref();
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
/**
|
|
591
|
+
* Start a local HTTP server, open the browser to the platform login page,
|
|
592
|
+
* and wait for the OAuth callback with a short-lived code. The CLI exchanges
|
|
593
|
+
* the code itself so the localhost callback never accepts bearer tokens.
|
|
594
|
+
*
|
|
595
|
+
* `onUrl` is invoked with the login URL once the local server is listening,
|
|
596
|
+
* so callers can show the URL to the user as a manual fallback when the
|
|
597
|
+
* browser fails to open (common on WSL2, headless SSH, Docker, etc.).
|
|
598
|
+
*/
|
|
599
|
+
async function runLogin(root = process.cwd(), provider = "github", onUrl) {
|
|
600
|
+
return runPlatformLogin(getApiUrl(root), provider, onUrl);
|
|
601
|
+
}
|
|
602
|
+
async function runPlatformLogin(origin, provider = "github", onUrl) {
|
|
603
|
+
const { execFile } = await import("node:child_process");
|
|
604
|
+
const apiUrl = normalizePlatformApiUrl(origin);
|
|
605
|
+
const state = randomBytes(32).toString("hex");
|
|
606
|
+
const codeVerifier = createCodeVerifier();
|
|
607
|
+
const codeChallenge = createCodeChallenge(codeVerifier);
|
|
608
|
+
return awaitBrowserCallback({
|
|
609
|
+
state,
|
|
610
|
+
execFile,
|
|
611
|
+
onUrl,
|
|
612
|
+
buildAuthUrl: (callback) => {
|
|
613
|
+
const loginUrl = new URL("auth/login", apiUrl.endsWith("/") ? apiUrl : `${apiUrl}/`);
|
|
614
|
+
loginUrl.searchParams.set("redirect", callback.href);
|
|
615
|
+
loginUrl.searchParams.set("provider", provider);
|
|
616
|
+
loginUrl.searchParams.set("code_challenge", codeChallenge);
|
|
617
|
+
loginUrl.searchParams.set("code_challenge_method", "S256");
|
|
618
|
+
return loginUrl.href;
|
|
619
|
+
},
|
|
620
|
+
describeError: (p) => p.get("error") === "signup_restricted" ? "Signup restricted: your email is not on the approved list for this environment." : null,
|
|
621
|
+
validate: (p) => {
|
|
622
|
+
if (p.has("token")) return "Invalid login callback. Please try again.";
|
|
623
|
+
if (!p.get("code")) return "No authorization code received. Please try again.";
|
|
624
|
+
return null;
|
|
625
|
+
},
|
|
626
|
+
finalize: (params) => exchangeLoginCode(apiUrl, params.get("code"), state, codeVerifier)
|
|
627
|
+
});
|
|
628
|
+
}
|
|
629
|
+
//#endregion
|
|
630
|
+
export { writeDeploymentPlatform as C, STAGING_PROXY_URL as D, DEFAULT_PROXY_URL as E, removeProjectConfig as S, writeProjectConfig as T, saveToken as _, getApiUrl as a, readDeploymentPlatform as b, getToken as c, openBrowser as d, readPlatformToken as f, savePlatformToken as g, runPlatformLogin as h, createCodeVerifier as i, getTokenSource as l, runLogin as m, awaitBrowserCallback as n, getProxyUrl as o, removeToken as p, createCodeChallenge as r, getSiteDomain as s, auth_exports as t, isStagingMode as u, attachSelectedPlatform as v, writePlatformSelection as w, readProjectConfig as x, project_exports as y };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { n as
|
|
1
|
+
import { D as log } from "./output-tFQLLj26.mjs";
|
|
2
|
+
import { c as getToken, p as removeToken } from "./auth-W9WII-mN.mjs";
|
|
3
|
+
import { n as PlatformClient } from "./client-Clirrol3.mjs";
|
|
4
|
+
import { n as runLoginCommand } from "./login-pV69H-ZO.mjs";
|
|
4
5
|
import { execSync } from "node:child_process";
|
|
5
6
|
//#region src/cli/auth-cmd.ts
|
|
6
7
|
async function runAuthCommand(root, args) {
|