convex 1.40.0 → 1.42.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/browser/simple_client-node.js +85 -27
- package/dist/cjs/browser/simple_client-node.js.map +3 -3
- package/dist/cjs/cli/aiFiles.js +2 -2
- package/dist/cjs/cli/aiFiles.js.map +1 -1
- package/dist/cjs/cli/configure.js +1 -4
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/convexExport.js +3 -3
- package/dist/cjs/cli/convexExport.js.map +1 -1
- package/dist/cjs/cli/convexImport.js +2 -2
- package/dist/cjs/cli/convexImport.js.map +1 -1
- package/dist/cjs/cli/dashboard.js +19 -6
- package/dist/cjs/cli/dashboard.js.map +3 -3
- package/dist/cjs/cli/data.js +2 -2
- package/dist/cjs/cli/data.js.map +1 -1
- package/dist/cjs/cli/deploy.js +5 -5
- package/dist/cjs/cli/deploy.js.map +2 -2
- package/dist/cjs/cli/deploymentCreate.js +11 -5
- package/dist/cjs/cli/deploymentCreate.js.map +2 -2
- package/dist/cjs/cli/deploymentSelect.js +5 -5
- package/dist/cjs/cli/deploymentSelect.js.map +1 -1
- package/dist/cjs/cli/deploymentTokenCreate.js +5 -13
- package/dist/cjs/cli/deploymentTokenCreate.js.map +2 -2
- package/dist/cjs/cli/deploymentTokenDelete.js +4 -11
- package/dist/cjs/cli/deploymentTokenDelete.js.map +2 -2
- package/dist/cjs/cli/dev.js +6 -5
- package/dist/cjs/cli/dev.js.map +2 -2
- package/dist/cjs/cli/env.js +25 -18
- package/dist/cjs/cli/env.js.map +2 -2
- package/dist/cjs/cli/envDefault.js +20 -15
- package/dist/cjs/cli/envDefault.js.map +2 -2
- package/dist/cjs/cli/insights.js +14 -4
- package/dist/cjs/cli/insights.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/skills.js +2 -2
- package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/cjs/cli/lib/command.js +1 -1
- package/dist/cjs/cli/lib/command.js.map +1 -1
- package/dist/cjs/cli/lib/deployment.js.map +1 -1
- package/dist/cjs/cli/lib/deploymentSelection.js +39 -0
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/dev.js +31 -0
- package/dist/cjs/cli/lib/dev.js.map +2 -2
- package/dist/cjs/cli/lib/env.js +5 -1
- package/dist/cjs/cli/lib/env.js.map +2 -2
- package/dist/cjs/cli/lib/generateDocs.js +256 -0
- package/dist/cjs/cli/lib/generateDocs.js.map +7 -0
- package/dist/cjs/cli/lib/localDeployment/anonymous.js +24 -49
- package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +3 -3
- package/dist/cjs/cli/lib/localDeployment/bigBrain.js +0 -9
- package/dist/cjs/cli/lib/localDeployment/bigBrain.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/dashboard.js +30 -68
- package/dist/cjs/cli/lib/localDeployment/dashboard.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/download.js +14 -1
- package/dist/cjs/cli/lib/localDeployment/download.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/filePaths.js +33 -4
- package/dist/cjs/cli/lib/localDeployment/filePaths.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js +37 -126
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +3 -3
- package/dist/cjs/cli/lib/localDeployment/secrets.js +91 -0
- package/dist/cjs/cli/lib/localDeployment/secrets.js.map +7 -0
- package/dist/cjs/cli/lib/localDeployment/upgrade.js +43 -28
- package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
- package/dist/cjs/cli/lib/localDeployment/utils.js +0 -19
- package/dist/cjs/cli/lib/localDeployment/utils.js.map +3 -3
- package/dist/cjs/cli/lib/login.js +16 -12
- package/dist/cjs/cli/lib/login.js.map +2 -2
- package/dist/cjs/cli/lib/logs.js +4 -1
- package/dist/cjs/cli/lib/logs.js.map +2 -2
- package/dist/cjs/cli/lib/run.js +27 -2
- package/dist/cjs/cli/lib/run.js.map +2 -2
- package/dist/cjs/cli/lib/runTestFunction.js +3 -3
- package/dist/cjs/cli/lib/runTestFunction.js.map +1 -1
- package/dist/cjs/cli/lib/utils/utils.js +30 -0
- package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
- package/dist/cjs/cli/program.js +2 -1
- package/dist/cjs/cli/program.js.map +2 -2
- package/dist/cjs/cli/project.js +27 -0
- package/dist/cjs/cli/project.js.map +7 -0
- package/dist/cjs/cli/projectCreate.js +90 -0
- package/dist/cjs/cli/projectCreate.js.map +7 -0
- package/dist/cjs/cli/run.js +5 -5
- package/dist/cjs/cli/run.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/database.js.map +1 -1
- package/dist/cjs/server/impl/meta_impl.js +6 -6
- package/dist/cjs/server/impl/meta_impl.js.map +2 -2
- package/dist/cjs/server/impl/registration_impl.js +9 -3
- package/dist/cjs/server/impl/registration_impl.js.map +2 -2
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs/server/meta.js.map +1 -1
- package/dist/cjs/server/query.js.map +1 -1
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs/server/storage.js.map +1 -1
- package/dist/cjs/server/system_fields.js.map +1 -1
- package/dist/cjs-types/cli/configure.d.ts +3 -2
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/dashboard.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
- package/dist/cjs-types/cli/insights.d.ts +1 -0
- package/dist/cjs-types/cli/insights.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +16 -16
- package/dist/cjs-types/cli/lib/deployment.d.ts +0 -2
- package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +7 -0
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dev.d.ts +2 -1
- package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/env.d.ts +3 -1
- package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/env.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/env.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/generateDocs.d.ts +20 -0
- package/dist/cjs-types/cli/lib/generateDocs.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
- package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
- package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/download.d.ts +11 -1
- package/dist/cjs-types/cli/lib/localDeployment/download.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
- package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
- package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts +31 -0
- package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +0 -2
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/logs.d.ts +1 -1
- package/dist/cjs-types/cli/lib/logs.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/run.d.ts +1 -1
- package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/utils.d.ts +10 -0
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/versionApi.d.ts +2 -2
- package/dist/cjs-types/cli/program.d.ts.map +1 -1
- package/dist/cjs-types/cli/project.d.ts +3 -0
- package/dist/cjs-types/cli/project.d.ts.map +1 -0
- package/dist/cjs-types/cli/projectCreate.d.ts +5 -0
- package/dist/cjs-types/cli/projectCreate.d.ts.map +1 -0
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/server/database.d.ts +21 -3
- package/dist/cjs-types/server/database.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +2 -2
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +26 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cjs-types/server/query.d.ts +1 -1
- package/dist/cjs-types/server/registration.d.ts +23 -5
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cjs-types/server/storage.d.ts +20 -3
- package/dist/cjs-types/server/storage.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +67155 -68245
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/browser/simple_client-node.js +85 -27
- package/dist/esm/browser/simple_client-node.js.map +3 -3
- package/dist/esm/cli/aiFiles.js +2 -2
- package/dist/esm/cli/aiFiles.js.map +1 -1
- package/dist/esm/cli/configure.js +1 -4
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/convexExport.js +3 -3
- package/dist/esm/cli/convexExport.js.map +1 -1
- package/dist/esm/cli/convexImport.js +2 -2
- package/dist/esm/cli/convexImport.js.map +1 -1
- package/dist/esm/cli/dashboard.js +16 -3
- package/dist/esm/cli/dashboard.js.map +2 -2
- package/dist/esm/cli/data.js +2 -2
- package/dist/esm/cli/data.js.map +1 -1
- package/dist/esm/cli/deploy.js +5 -5
- package/dist/esm/cli/deploy.js.map +2 -2
- package/dist/esm/cli/deploymentCreate.js +13 -9
- package/dist/esm/cli/deploymentCreate.js.map +2 -2
- package/dist/esm/cli/deploymentSelect.js +5 -5
- package/dist/esm/cli/deploymentSelect.js.map +1 -1
- package/dist/esm/cli/deploymentTokenCreate.js +9 -15
- package/dist/esm/cli/deploymentTokenCreate.js.map +2 -2
- package/dist/esm/cli/deploymentTokenDelete.js +8 -16
- package/dist/esm/cli/deploymentTokenDelete.js.map +2 -2
- package/dist/esm/cli/dev.js +6 -5
- package/dist/esm/cli/dev.js.map +2 -2
- package/dist/esm/cli/env.js +25 -18
- package/dist/esm/cli/env.js.map +2 -2
- package/dist/esm/cli/envDefault.js +20 -15
- package/dist/esm/cli/envDefault.js.map +2 -2
- package/dist/esm/cli/insights.js +14 -4
- package/dist/esm/cli/insights.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/skills.js +2 -2
- package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/esm/cli/lib/command.js +1 -1
- package/dist/esm/cli/lib/command.js.map +1 -1
- package/dist/esm/cli/lib/deployment.js.map +1 -1
- package/dist/esm/cli/lib/deploymentSelection.js +38 -0
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/dev.js +31 -0
- package/dist/esm/cli/lib/dev.js.map +2 -2
- package/dist/esm/cli/lib/env.js +5 -1
- package/dist/esm/cli/lib/env.js.map +2 -2
- package/dist/esm/cli/lib/generateDocs.js +233 -0
- package/dist/esm/cli/lib/generateDocs.js.map +7 -0
- package/dist/esm/cli/lib/localDeployment/anonymous.js +30 -61
- package/dist/esm/cli/lib/localDeployment/anonymous.js.map +3 -3
- package/dist/esm/cli/lib/localDeployment/bigBrain.js +0 -8
- package/dist/esm/cli/lib/localDeployment/bigBrain.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/dashboard.js +36 -69
- package/dist/esm/cli/lib/localDeployment/dashboard.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/download.js +15 -2
- package/dist/esm/cli/lib/localDeployment/download.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/filePaths.js +29 -2
- package/dist/esm/cli/lib/localDeployment/filePaths.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/localDeployment.js +40 -134
- package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +3 -3
- package/dist/esm/cli/lib/localDeployment/secrets.js +57 -0
- package/dist/esm/cli/lib/localDeployment/secrets.js.map +7 -0
- package/dist/esm/cli/lib/localDeployment/upgrade.js +45 -28
- package/dist/esm/cli/lib/localDeployment/upgrade.js.map +3 -3
- package/dist/esm/cli/lib/localDeployment/utils.js +0 -7
- package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/esm/cli/lib/login.js +18 -13
- package/dist/esm/cli/lib/login.js.map +2 -2
- package/dist/esm/cli/lib/logs.js +5 -2
- package/dist/esm/cli/lib/logs.js.map +2 -2
- package/dist/esm/cli/lib/run.js +32 -3
- package/dist/esm/cli/lib/run.js.map +2 -2
- package/dist/esm/cli/lib/runTestFunction.js +3 -3
- package/dist/esm/cli/lib/runTestFunction.js.map +1 -1
- package/dist/esm/cli/lib/utils/utils.js +29 -0
- package/dist/esm/cli/lib/utils/utils.js.map +2 -2
- package/dist/esm/cli/program.js +2 -1
- package/dist/esm/cli/program.js.map +2 -2
- package/dist/esm/cli/project.js +5 -0
- package/dist/esm/cli/project.js.map +7 -0
- package/dist/esm/cli/projectCreate.js +68 -0
- package/dist/esm/cli/projectCreate.js.map +7 -0
- package/dist/esm/cli/run.js +5 -5
- package/dist/esm/cli/run.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/impl/meta_impl.js +6 -6
- package/dist/esm/server/impl/meta_impl.js.map +2 -2
- package/dist/esm/server/impl/registration_impl.js +9 -3
- package/dist/esm/server/impl/registration_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm-types/cli/configure.d.ts +3 -2
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/dashboard.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/env.d.ts.map +1 -1
- package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
- package/dist/esm-types/cli/insights.d.ts +1 -0
- package/dist/esm-types/cli/insights.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +16 -16
- package/dist/esm-types/cli/lib/deployment.d.ts +0 -2
- package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts +7 -0
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dev.d.ts +2 -1
- package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/env.d.ts +3 -1
- package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/env.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/env.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/generateDocs.d.ts +20 -0
- package/dist/esm-types/cli/lib/generateDocs.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/generateDocs.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
- package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
- package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
- package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/download.d.ts +11 -1
- package/dist/esm-types/cli/lib/localDeployment/download.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
- package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
- package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts +31 -0
- package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +0 -2
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/logs.d.ts +1 -1
- package/dist/esm-types/cli/lib/logs.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/run.d.ts +1 -1
- package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/utils.d.ts +10 -0
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/versionApi.d.ts +2 -2
- package/dist/esm-types/cli/program.d.ts.map +1 -1
- package/dist/esm-types/cli/project.d.ts +3 -0
- package/dist/esm-types/cli/project.d.ts.map +1 -0
- package/dist/esm-types/cli/projectCreate.d.ts +5 -0
- package/dist/esm-types/cli/projectCreate.d.ts.map +1 -0
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/server/database.d.ts +21 -3
- package/dist/esm-types/server/database.d.ts.map +1 -1
- package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
- package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +2 -2
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +26 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/esm-types/server/query.d.ts +1 -1
- package/dist/esm-types/server/registration.d.ts +23 -5
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/esm-types/server/storage.d.ts +20 -3
- package/dist/esm-types/server/storage.d.ts.map +1 -1
- package/dist/react.bundle.js +1 -1
- package/dist/react.bundle.js.map +1 -1
- package/package.json +7 -5
- package/src/browser/sync/request_manager.test.ts +2 -2
- package/src/cli/aiFiles.ts +2 -2
- package/src/cli/configure.ts +4 -6
- package/src/cli/convexExport.ts +3 -3
- package/src/cli/convexImport.ts +2 -2
- package/src/cli/dashboard.ts +29 -3
- package/src/cli/data.ts +2 -2
- package/src/cli/deploy.ts +5 -5
- package/src/cli/deploymentCreate.test.ts +151 -24
- package/src/cli/deploymentCreate.ts +21 -11
- package/src/cli/deploymentSelect.ts +5 -5
- package/src/cli/deploymentSelection.test.ts +0 -3
- package/src/cli/deploymentToken.test.ts +34 -23
- package/src/cli/deploymentTokenCreate.ts +9 -21
- package/src/cli/deploymentTokenDelete.ts +8 -23
- package/src/cli/dev.ts +5 -4
- package/src/cli/env.ts +29 -19
- package/src/cli/envDefault.ts +21 -15
- package/src/cli/insights.ts +15 -3
- package/src/cli/lib/aiFiles/integration.test.ts +2 -0
- package/src/cli/lib/aiFiles/skills.ts +3 -3
- package/src/cli/lib/command.ts +2 -2
- package/src/cli/lib/deployment.ts +0 -5
- package/src/cli/lib/deploymentSelection.ts +67 -0
- package/src/cli/lib/dev.ts +39 -0
- package/src/cli/lib/env.test.ts +60 -0
- package/src/cli/lib/env.ts +9 -1
- package/src/cli/lib/generateDocs.test.ts +326 -0
- package/src/cli/lib/generateDocs.ts +393 -0
- package/src/cli/lib/localDeployment/anonymous.ts +48 -72
- package/src/cli/lib/localDeployment/bigBrain.ts +7 -15
- package/src/cli/lib/localDeployment/dashboard.ts +48 -80
- package/src/cli/lib/localDeployment/download.ts +34 -3
- package/src/cli/lib/localDeployment/filePaths.ts +66 -6
- package/src/cli/lib/localDeployment/localDeployment.ts +46 -184
- package/src/cli/lib/localDeployment/run.test.ts +6 -6
- package/src/cli/lib/localDeployment/secrets.test.ts +53 -0
- package/src/cli/lib/localDeployment/secrets.ts +93 -0
- package/src/cli/lib/localDeployment/tests/keygenFailure.mjs +9 -0
- package/src/cli/lib/localDeployment/tests/keygenSuccess.mjs +31 -0
- package/src/cli/lib/localDeployment/upgrade.ts +52 -38
- package/src/cli/lib/localDeployment/utils.ts +0 -10
- package/src/cli/lib/login.ts +18 -18
- package/src/cli/lib/logs.ts +7 -2
- package/src/cli/lib/run.ts +37 -3
- package/src/cli/lib/runTestFunction.ts +3 -3
- package/src/cli/lib/utils/utils.ts +56 -0
- package/src/cli/program.ts +2 -0
- package/src/cli/project.ts +7 -0
- package/src/cli/projectCreate.ts +99 -0
- package/src/cli/run.ts +5 -5
- package/src/index.ts +1 -1
- package/src/server/database.ts +21 -3
- package/src/server/impl/meta_impl.ts +7 -6
- package/src/server/impl/registration_impl.ts +11 -5
- package/src/server/index.ts +2 -0
- package/src/server/meta.ts +27 -0
- package/src/server/query.ts +1 -1
- package/src/server/registration.test.ts +16 -25
- package/src/server/registration.ts +25 -19
- package/src/server/storage.ts +22 -3
- package/src/server/system_fields.ts +1 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/download.ts"],
|
|
4
|
-
"sourcesContent": ["import { version as npmVersion } from \"../../version.js\";\nimport AdmZip from \"adm-zip\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n startLogProgress,\n logVerbose,\n logMessage,\n logError,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport {\n dashboardZip,\n executablePath,\n versionedBinaryDir,\n dashboardOutDir,\n resetDashboardDir,\n loadDashboardConfig,\n executableName,\n} from \"./filePaths.js\";\nimport child_process from \"child_process\";\nimport { promisify } from \"util\";\nimport { Readable } from \"stream\";\nimport { TempPath, nodeFs, withTmpDir } from \"../../../bundler/fs.js\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport type { ProgressBarInstance } from \"../../../vendor/progress/index.js\";\nimport path from \"path\";\n\nasync function makeExecutable(p: string) {\n switch (process.platform) {\n case \"darwin\":\n case \"linux\": {\n await promisify(child_process.exec)(`chmod +x ${p}`);\n }\n }\n}\n\nexport async function ensureBackendBinaryDownloaded(\n ctx: Context,\n version:\n | { kind: \"latest\"; allowedVersion?: string | undefined }\n | { kind: \"version\"; version: string },\n): Promise<{ binaryPath: string; version: string }> {\n if (version.kind === \"version\") {\n return _ensureBackendBinaryDownloaded(ctx, version.version);\n }\n if (version.allowedVersion) {\n const latestVersionWithBinary = await findLatestVersionWithBinary(\n ctx,\n false,\n );\n if (latestVersionWithBinary === null) {\n logWarning(\n `Failed to get latest version from GitHub, using downloaded version ${version.allowedVersion}`,\n );\n return _ensureBackendBinaryDownloaded(ctx, version.allowedVersion);\n }\n return _ensureBackendBinaryDownloaded(ctx, latestVersionWithBinary);\n }\n const latestVersionWithBinary = await findLatestVersionWithBinary(ctx, true);\n return _ensureBackendBinaryDownloaded(ctx, latestVersionWithBinary);\n}\n\nasync function _ensureBackendBinaryDownloaded(\n ctx: Context,\n version: string,\n): Promise<{ binaryPath: string; version: string }> {\n logVerbose(`Ensuring backend binary downloaded for version ${version}`);\n const existingDownload = await checkForExistingDownload(ctx, version);\n if (existingDownload !== null) {\n logVerbose(`Using existing download at ${existingDownload}`);\n return {\n binaryPath: existingDownload,\n version,\n };\n }\n const binaryPath = await downloadBackendBinary(ctx, version);\n return { version, binaryPath };\n}\n\n/**\n * Finds the latest version of the Convex local backend\n * through version.convex.dev\n */\nexport async function findLatestVersionWithBinary<\n RequireSuccess extends boolean,\n>(\n ctx: Context,\n requireSuccess: RequireSuccess,\n): Promise<RequireSuccess extends true ? string : string | null> {\n // These shouldn't crash when there's a perfectly good binary already available.\n async function maybeCrash(\n ...args: Parameters<typeof ctx.crash>\n ): Promise<RequireSuccess extends true ? never : null> {\n if (requireSuccess) {\n return await ctx.crash(...args);\n }\n if (args[0].printedMessage) {\n logError(args[0].printedMessage);\n } else {\n logError(\"Error fetching latest version\");\n }\n return null as RequireSuccess extends true ? never : null;\n }\n\n logVerbose(\"Fetching latest backend version from version API\");\n\n try {\n const response = await fetch(\n \"https://version.convex.dev/v1/local_backend_version\",\n {\n headers: { \"Convex-Client\": `npm-cli-${npmVersion}` },\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n return await maybeCrash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `version.convex.dev returned ${response.status}: ${text}`,\n errForSentry: new LocalDeploymentError(\n `version.convex.dev returned ${response.status}: ${text}`,\n ),\n });\n }\n\n const data = (await response.json()) as { version: string };\n if (!data.version) {\n return await maybeCrash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Invalid response missing version field\",\n errForSentry: new LocalDeploymentError(\n \"Invalid response missing version field\",\n ),\n });\n }\n\n logVerbose(`Latest backend version is ${data.version}`);\n return data.version;\n } catch (e) {\n return maybeCrash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to fetch latest backend version\",\n errForSentry: new LocalDeploymentError(e?.toString()),\n });\n }\n}\n\n/**\n *\n * @param ctx\n * @param version\n * @returns The binary path if it exists, or null\n */\nasync function checkForExistingDownload(\n ctx: Context,\n version: string,\n): Promise<string | null> {\n const destDir = versionedBinaryDir(version);\n if (!ctx.fs.exists(destDir)) {\n return null;\n }\n const p = executablePath(version);\n if (!ctx.fs.exists(p)) {\n // This directory isn't what we expected. Remove it.\n recursivelyDelete(ctx, destDir, { force: true });\n return null;\n }\n await makeExecutable(p);\n return p;\n}\n\nasync function downloadBackendBinary(\n ctx: Context,\n version: string,\n): Promise<string> {\n const downloadPath = getDownloadPath();\n // Note: We validate earlier that there's a binary for this platform at the specified version,\n // so in practice, we should never hit errors here.\n if (downloadPath === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unsupported platform ${process.platform} and architecture ${process.arch} for local deployment.`,\n });\n }\n await downloadZipFile(ctx, {\n version,\n filename: downloadPath,\n nameForLogging: \"Convex backend binary\",\n onDownloadComplete: async (ctx, unzippedPath) => {\n const name = executableName();\n const tempExecPath = path.join(unzippedPath, name);\n await makeExecutable(tempExecPath);\n logVerbose(\"Marked as executable\");\n ctx.fs.mkdir(versionedBinaryDir(version), { recursive: true });\n ctx.fs.swapTmpFile(tempExecPath as TempPath, executablePath(version));\n },\n });\n return executablePath(version);\n}\n\n/**\n * Get the artifact name, composed of the target convex-local-backend and\n * the Rust \"target triple\" appropriate for the current machine.\n **/\nfunction getDownloadPath() {\n switch (process.platform) {\n case \"darwin\":\n if (process.arch === \"arm64\") {\n return \"convex-local-backend-aarch64-apple-darwin.zip\";\n } else if (process.arch === \"x64\") {\n return \"convex-local-backend-x86_64-apple-darwin.zip\";\n }\n break;\n case \"linux\":\n if (process.arch === \"arm64\") {\n return \"convex-local-backend-aarch64-unknown-linux-gnu.zip\";\n } else if (process.arch === \"x64\") {\n return \"convex-local-backend-x86_64-unknown-linux-gnu.zip\";\n }\n break;\n case \"win32\":\n return \"convex-local-backend-x86_64-pc-windows-msvc.zip\";\n }\n return null;\n}\n\nfunction getGithubDownloadUrl(version: string, filename: string) {\n return `https://github.com/get-convex/convex-backend/releases/download/${version}/${filename}`;\n}\n\nasync function downloadZipFile(\n ctx: Context,\n args: {\n version: string;\n filename: string;\n nameForLogging: string;\n onDownloadComplete: (ctx: Context, unzippedPath: TempPath) => Promise<void>;\n },\n) {\n const { version, filename, nameForLogging } = args;\n const url = getGithubDownloadUrl(version, filename);\n const response = await fetch(url);\n const contentLength = parseInt(\n response.headers.get(\"content-length\") ?? \"\",\n 10,\n );\n let progressBar: ProgressBarInstance | null = null;\n if (!isNaN(contentLength) && contentLength !== 0 && process.stdout.isTTY) {\n progressBar = startLogProgress(\n `Downloading ${nameForLogging} [:bar] :percent :etas`,\n {\n width: 40,\n total: contentLength,\n clear: true,\n },\n );\n } else {\n logMessage(`Downloading ${nameForLogging}`);\n }\n if (response.status !== 200) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `File not found at ${url}.`,\n });\n }\n await withTmpDir(async (tmpDir) => {\n logVerbose(`Created tmp dir ${tmpDir.path}`);\n // Create a file in the tmp dir\n const zipLocation = tmpDir.registerTempPath(null);\n const readable = Readable.fromWeb(response.body! as any);\n await tmpDir.writeFileStream(zipLocation, readable, (chunk: any) => {\n if (progressBar !== null) {\n progressBar.tick(chunk.length);\n }\n });\n if (progressBar) {\n progressBar.terminate();\n logFinishedStep(`Downloaded ${nameForLogging}`);\n }\n logVerbose(\"Downloaded zip file\");\n\n const zip = new AdmZip(zipLocation);\n await withTmpDir(async (versionDir) => {\n logVerbose(`Created tmp dir ${versionDir.path}`);\n zip.extractAllTo(versionDir.path, true);\n logVerbose(\"Extracted from zip file\");\n await args.onDownloadComplete(ctx, versionDir.path);\n });\n });\n return executablePath(version);\n}\n\nexport async function ensureDashboardDownloaded(ctx: Context, version: string) {\n const config = loadDashboardConfig(ctx);\n if (config !== null && config.version === version) {\n return;\n }\n await resetDashboardDir(ctx);\n await _ensureDashboardDownloaded(ctx, version);\n}\nasync function _ensureDashboardDownloaded(ctx: Context, version: string) {\n const zipLocation = dashboardZip();\n if (ctx.fs.exists(zipLocation)) {\n ctx.fs.unlink(zipLocation);\n }\n const outDir = dashboardOutDir();\n await downloadZipFile(ctx, {\n version,\n filename: \"dashboard.zip\",\n nameForLogging: \"Convex dashboard\",\n onDownloadComplete: async (ctx, unzippedPath) => {\n await recursivelyCopy(ctx, nodeFs, unzippedPath, outDir);\n logVerbose(\"Copied into out dir\");\n },\n });\n return outDir;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAsC;AACtC,qBAAmB;AAEnB,iBAOO;AACP,
|
|
4
|
+
"sourcesContent": ["import { version as npmVersion } from \"../../version.js\";\nimport AdmZip from \"adm-zip\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n startLogProgress,\n logVerbose,\n logMessage,\n logError,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport {\n dashboardZip,\n executablePath,\n versionedBinaryDir,\n dashboardOutDir,\n resetDashboardDir,\n loadGlobalDashboardConfig,\n saveGlobalDashboardConfig,\n executableName,\n} from \"./filePaths.js\";\nimport child_process from \"child_process\";\nimport { promisify } from \"util\";\nimport { Readable } from \"stream\";\nimport { TempPath, nodeFs, withTmpDir } from \"../../../bundler/fs.js\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { LocalDeploymentError } from \"./errors.js\";\nimport type { ProgressBarInstance } from \"../../../vendor/progress/index.js\";\nimport path from \"path\";\n\nasync function makeExecutable(p: string) {\n switch (process.platform) {\n case \"darwin\":\n case \"linux\": {\n await promisify(child_process.exec)(`chmod +x ${p}`);\n }\n }\n}\n\nexport async function ensureBackendBinaryDownloaded(\n ctx: Context,\n version:\n | { kind: \"latest\"; allowedVersion?: string | undefined }\n | { kind: \"version\"; version: string },\n): Promise<{ binaryPath: string; version: string }> {\n if (version.kind === \"version\") {\n return _ensureBackendBinaryDownloaded(ctx, version.version);\n }\n if (version.allowedVersion) {\n const latestVersionWithBinary = await findLatestVersionWithBinary(\n ctx,\n false,\n );\n if (latestVersionWithBinary === null) {\n logWarning(\n `Failed to get latest version from GitHub, using downloaded version ${version.allowedVersion}`,\n );\n return _ensureBackendBinaryDownloaded(ctx, version.allowedVersion);\n }\n return _ensureBackendBinaryDownloaded(ctx, latestVersionWithBinary);\n }\n const latestVersionWithBinary = await findLatestVersionWithBinary(ctx, true);\n return _ensureBackendBinaryDownloaded(ctx, latestVersionWithBinary);\n}\n\nasync function _ensureBackendBinaryDownloaded(\n ctx: Context,\n version: string,\n): Promise<{ binaryPath: string; version: string }> {\n logVerbose(`Ensuring backend binary downloaded for version ${version}`);\n const existingDownload = await checkForExistingDownload(ctx, version);\n if (existingDownload !== null) {\n logVerbose(`Using existing download at ${existingDownload}`);\n return {\n binaryPath: existingDownload,\n version,\n };\n }\n const binaryPath = await downloadBackendBinary(ctx, version);\n return { version, binaryPath };\n}\n\nlet cachedLatestVersion: string | null = null;\n\n/**\n * Finds the latest version of the Convex local backend through\n * version.convex.dev, caching the resolved version for the lifetime of the\n * process so repeated lookups hit the network at most once.\n *\n * Wraps {@link _findLatestVersionWithBinary}. Only successful (non-null)\n * results are cached, so a failed `requireSuccess: false` lookup can be retried\n * by a later call.\n */\nexport async function findLatestVersionWithBinary<\n RequireSuccess extends boolean,\n>(\n ctx: Context,\n requireSuccess: RequireSuccess,\n): Promise<RequireSuccess extends true ? string : string | null> {\n if (cachedLatestVersion !== null) {\n return cachedLatestVersion;\n }\n const result = await _findLatestVersionWithBinary(ctx, requireSuccess);\n if (result !== null) {\n cachedLatestVersion = result;\n }\n return result;\n}\n\n/**\n * Finds the latest version of the Convex local backend\n * through version.convex.dev\n */\nexport async function _findLatestVersionWithBinary<\n RequireSuccess extends boolean,\n>(\n ctx: Context,\n requireSuccess: RequireSuccess,\n): Promise<RequireSuccess extends true ? string : string | null> {\n // These shouldn't crash when there's a perfectly good binary already available.\n async function maybeCrash(\n ...args: Parameters<typeof ctx.crash>\n ): Promise<RequireSuccess extends true ? never : null> {\n if (requireSuccess) {\n return await ctx.crash(...args);\n }\n if (args[0].printedMessage) {\n logError(args[0].printedMessage);\n } else {\n logError(\"Error fetching latest version\");\n }\n return null as RequireSuccess extends true ? never : null;\n }\n\n logVerbose(\"Fetching latest backend version from version API\");\n\n try {\n const response = await fetch(\n \"https://version.convex.dev/v1/local_backend_version\",\n {\n headers: { \"Convex-Client\": `npm-cli-${npmVersion}` },\n },\n );\n\n if (!response.ok) {\n const text = await response.text();\n return await maybeCrash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `version.convex.dev returned ${response.status}: ${text}`,\n errForSentry: new LocalDeploymentError(\n `version.convex.dev returned ${response.status}: ${text}`,\n ),\n });\n }\n\n const data = (await response.json()) as { version: string };\n if (!data.version) {\n return await maybeCrash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Invalid response missing version field\",\n errForSentry: new LocalDeploymentError(\n \"Invalid response missing version field\",\n ),\n });\n }\n\n logVerbose(`Latest backend version is ${data.version}`);\n return data.version;\n } catch (e) {\n return maybeCrash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to fetch latest backend version\",\n errForSentry: new LocalDeploymentError(e?.toString()),\n });\n }\n}\n\n/**\n *\n * @param ctx\n * @param version\n * @returns The binary path if it exists, or null\n */\nasync function checkForExistingDownload(\n ctx: Context,\n version: string,\n): Promise<string | null> {\n const destDir = versionedBinaryDir(version);\n if (!ctx.fs.exists(destDir)) {\n return null;\n }\n const p = executablePath(version);\n if (!ctx.fs.exists(p)) {\n // This directory isn't what we expected. Remove it.\n recursivelyDelete(ctx, destDir, { force: true });\n return null;\n }\n await makeExecutable(p);\n return p;\n}\n\nasync function downloadBackendBinary(\n ctx: Context,\n version: string,\n): Promise<string> {\n const downloadPath = getDownloadPath();\n // Note: We validate earlier that there's a binary for this platform at the specified version,\n // so in practice, we should never hit errors here.\n if (downloadPath === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unsupported platform ${process.platform} and architecture ${process.arch} for local deployment.`,\n });\n }\n await downloadZipFile(ctx, {\n version,\n filename: downloadPath,\n nameForLogging: \"Convex backend binary\",\n onDownloadComplete: async (ctx, unzippedPath) => {\n const name = executableName();\n const tempExecPath = path.join(unzippedPath, name);\n await makeExecutable(tempExecPath);\n logVerbose(\"Marked as executable\");\n ctx.fs.mkdir(versionedBinaryDir(version), { recursive: true });\n ctx.fs.swapTmpFile(tempExecPath as TempPath, executablePath(version));\n },\n });\n return executablePath(version);\n}\n\n/**\n * Get the artifact name, composed of the target convex-local-backend and\n * the Rust \"target triple\" appropriate for the current machine.\n **/\nfunction getDownloadPath() {\n switch (process.platform) {\n case \"darwin\":\n if (process.arch === \"arm64\") {\n return \"convex-local-backend-aarch64-apple-darwin.zip\";\n } else if (process.arch === \"x64\") {\n return \"convex-local-backend-x86_64-apple-darwin.zip\";\n }\n break;\n case \"linux\":\n if (process.arch === \"arm64\") {\n return \"convex-local-backend-aarch64-unknown-linux-gnu.zip\";\n } else if (process.arch === \"x64\") {\n return \"convex-local-backend-x86_64-unknown-linux-gnu.zip\";\n }\n break;\n case \"win32\":\n return \"convex-local-backend-x86_64-pc-windows-msvc.zip\";\n }\n return null;\n}\n\nfunction getGithubDownloadUrl(version: string, filename: string) {\n return `https://github.com/get-convex/convex-backend/releases/download/${version}/${filename}`;\n}\n\nasync function downloadZipFile(\n ctx: Context,\n args: {\n version: string;\n filename: string;\n nameForLogging: string;\n onDownloadComplete: (ctx: Context, unzippedPath: TempPath) => Promise<void>;\n },\n) {\n const { version, filename, nameForLogging } = args;\n const url = getGithubDownloadUrl(version, filename);\n const response = await fetch(url);\n const contentLength = parseInt(\n response.headers.get(\"content-length\") ?? \"\",\n 10,\n );\n let progressBar: ProgressBarInstance | null = null;\n if (!isNaN(contentLength) && contentLength !== 0 && process.stdout.isTTY) {\n progressBar = startLogProgress(\n `Downloading ${nameForLogging} [:bar] :percent :etas`,\n {\n width: 40,\n total: contentLength,\n clear: true,\n },\n );\n } else {\n logMessage(`Downloading ${nameForLogging}`);\n }\n if (response.status !== 200) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `File not found at ${url}.`,\n });\n }\n await withTmpDir(async (tmpDir) => {\n logVerbose(`Created tmp dir ${tmpDir.path}`);\n // Create a file in the tmp dir\n const zipLocation = tmpDir.registerTempPath(null);\n const readable = Readable.fromWeb(response.body! as any);\n await tmpDir.writeFileStream(zipLocation, readable, (chunk: any) => {\n if (progressBar !== null) {\n progressBar.tick(chunk.length);\n }\n });\n if (progressBar) {\n progressBar.terminate();\n logFinishedStep(`Downloaded ${nameForLogging}`);\n }\n logVerbose(\"Downloaded zip file\");\n\n const zip = new AdmZip(zipLocation);\n await withTmpDir(async (versionDir) => {\n logVerbose(`Created tmp dir ${versionDir.path}`);\n zip.extractAllTo(versionDir.path, true);\n logVerbose(\"Extracted from zip file\");\n await args.onDownloadComplete(ctx, versionDir.path);\n });\n });\n return executablePath(version);\n}\n\nexport async function ensureDashboardDownloaded(ctx: Context, version: string) {\n const config = loadGlobalDashboardConfig(ctx);\n if (config !== null && config.version === version) {\n return;\n }\n await resetDashboardDir(ctx);\n await _ensureDashboardDownloaded(ctx, version);\n // Record which version is now in `dashboardOutDir()`\n // so we can skip the download next time.\n saveGlobalDashboardConfig(ctx, { version });\n}\nasync function _ensureDashboardDownloaded(ctx: Context, version: string) {\n const zipLocation = dashboardZip();\n if (ctx.fs.exists(zipLocation)) {\n ctx.fs.unlink(zipLocation);\n }\n const outDir = dashboardOutDir();\n await downloadZipFile(ctx, {\n version,\n filename: \"dashboard.zip\",\n nameForLogging: \"Convex dashboard\",\n onDownloadComplete: async (ctx, unzippedPath) => {\n await recursivelyCopy(ctx, nodeFs, unzippedPath, outDir);\n logVerbose(\"Copied into out dir\");\n },\n });\n return outDir;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["child_process", "latestVersionWithBinary", "npmVersion", "ctx", "path", "AdmZip"]
|
|
7
7
|
}
|
|
@@ -39,16 +39,18 @@ __export(filePaths_exports, {
|
|
|
39
39
|
executableName: () => executableName,
|
|
40
40
|
executablePath: () => executablePath,
|
|
41
41
|
legacyDeploymentStateDir: () => legacyDeploymentStateDir,
|
|
42
|
-
loadDashboardConfig: () => loadDashboardConfig,
|
|
43
42
|
loadDeploymentConfig: () => loadDeploymentConfig,
|
|
44
43
|
loadDeploymentConfigFromDir: () => loadDeploymentConfigFromDir,
|
|
44
|
+
loadGlobalDashboardConfig: () => loadGlobalDashboardConfig,
|
|
45
|
+
loadProjectDashboardConfig: () => loadProjectDashboardConfig,
|
|
45
46
|
loadProjectLocalConfig: () => loadProjectLocalConfig,
|
|
46
47
|
loadUuidForAnonymousUser: () => loadUuidForAnonymousUser,
|
|
47
48
|
projectLocalStateDir: () => projectLocalStateDir,
|
|
48
49
|
resetDashboardDir: () => resetDashboardDir,
|
|
49
50
|
rootDeploymentStateDir: () => rootDeploymentStateDir,
|
|
50
|
-
saveDashboardConfig: () => saveDashboardConfig,
|
|
51
51
|
saveDeploymentConfig: () => saveDeploymentConfig,
|
|
52
|
+
saveGlobalDashboardConfig: () => saveGlobalDashboardConfig,
|
|
53
|
+
saveProjectDashboardConfig: () => saveProjectDashboardConfig,
|
|
52
54
|
versionedBinaryDir: () => versionedBinaryDir
|
|
53
55
|
});
|
|
54
56
|
module.exports = __toCommonJS(filePaths_exports);
|
|
@@ -197,7 +199,7 @@ async function resetDashboardDir(ctx) {
|
|
|
197
199
|
function dashboardOutDir() {
|
|
198
200
|
return import_path.default.join(dashboardDir(), "out");
|
|
199
201
|
}
|
|
200
|
-
function
|
|
202
|
+
function loadGlobalDashboardConfig(ctx) {
|
|
201
203
|
const configFile = import_path.default.join(dashboardDir(), "config.json");
|
|
202
204
|
if (!ctx.fs.exists(configFile)) {
|
|
203
205
|
return null;
|
|
@@ -210,13 +212,40 @@ function loadDashboardConfig(ctx) {
|
|
|
210
212
|
return null;
|
|
211
213
|
}
|
|
212
214
|
}
|
|
213
|
-
function
|
|
215
|
+
function saveGlobalDashboardConfig(ctx, config) {
|
|
214
216
|
const configFile = import_path.default.join(dashboardDir(), "config.json");
|
|
215
217
|
if (!ctx.fs.exists(dashboardDir())) {
|
|
216
218
|
ctx.fs.mkdir(dashboardDir(), { recursive: true });
|
|
217
219
|
}
|
|
218
220
|
ctx.fs.writeUtf8File(configFile, JSON.stringify(config));
|
|
219
221
|
}
|
|
222
|
+
function dashboardConfigPath(ctx, deploymentName) {
|
|
223
|
+
return import_path.default.join(
|
|
224
|
+
deploymentStateDir(ctx, "anonymous", deploymentName),
|
|
225
|
+
"dashboard.json"
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
function loadProjectDashboardConfig(ctx, deploymentName) {
|
|
229
|
+
const configFile = dashboardConfigPath(ctx, deploymentName);
|
|
230
|
+
if (!ctx.fs.exists(configFile)) {
|
|
231
|
+
return null;
|
|
232
|
+
}
|
|
233
|
+
const content = ctx.fs.readUtf8File(configFile);
|
|
234
|
+
try {
|
|
235
|
+
return JSON.parse(content);
|
|
236
|
+
} catch (e) {
|
|
237
|
+
(0, import_log.logVerbose)(`Failed to parse project dashboard config: ${e}`);
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
function saveProjectDashboardConfig(ctx, deploymentName, config) {
|
|
242
|
+
const configPath = dashboardConfigPath(ctx, deploymentName);
|
|
243
|
+
const directoryPath = import_path.default.dirname(configPath);
|
|
244
|
+
if (!ctx.fs.exists(directoryPath)) {
|
|
245
|
+
ctx.fs.mkdir(directoryPath, { recursive: true });
|
|
246
|
+
}
|
|
247
|
+
ctx.fs.writeUtf8File(configPath, JSON.stringify(config));
|
|
248
|
+
}
|
|
220
249
|
function loadUuidForAnonymousUser(ctx) {
|
|
221
250
|
const configFile = import_path.default.join(
|
|
222
251
|
rootDeploymentStateDir("anonymous"),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/filePaths.ts"],
|
|
4
|
-
"sourcesContent": ["/*\n~/.cache/convex\n binaries\n 0.0.1\n convex-local-backend[.exe] // convex-local-backend.exe on windows\n 0.0.2\n convex-local-backend[.exe]\n dashboard\n config.json\n out\n // if present, output files from building the self-hosted dashboard which can\n // be served using `npx serve`\n index.html\n\n\nDeployment state storage locations:\n\nNew default (project-local): .convex/local/default/\n - Used for both \"local\" (linked to Convex project) and \"anonymous\" deployments\n - One deployment per project/worktree/clone\n - This allows worktrees/clones to have isolated storage without conflicts\n\nLegacy (home directory) - used for backward compatibility if data already exists:\n - For \"local\" deployments: ~/.convex/convex-backend-state/local-{team}-{project}/\n - For \"anonymous\" deployments: ~/.convex/anonymous-convex-backend-state/{anonymous-deployment-name}/\n\n\n~/.convex\n convex-backend-state\n local-my_team-chess\n config.json // contains `LocalDeploymentConfig`\n convex_local_storage\n convex_local_backend.sqlite3\n local-my_team-whisper\n config.json\n convex_local_storage\n convex_local_backend.sqlite3\n anonymous-convex-backend-state\n config.json // contains { uuid: <uuid> }, used to identify the anonymous user\n anonymous-chess\n config.json\n convex_local_storage\n convex_local_backend.sqlite3\n*/\n\nimport path from \"path\";\nimport { cacheDir, rootDirectory } from \"../utils/utils.js\";\nimport { Context } from \"../../../bundler/context.js\";\nimport { logVerbose } from \"../../../bundler/log.js\";\nimport { recursivelyDelete } from \"../fsUtils.js\";\nimport crypto from \"crypto\";\n\n/**\n * Ensure the `.convex/.gitignore` file exists with the right content.\n * This prevents local deployment state from being committed to git.\n */\nexport function ensureDotConvexGitignore(\n ctx: Context,\n projectDir?: string,\n): void {\n const baseDir = projectDir ?? process.cwd();\n const dotConvexDir = path.join(baseDir, \".convex\");\n const gitignorePath = path.join(dotConvexDir, \".gitignore\");\n\n // Only create if .convex directory exists but .gitignore doesn't\n if (ctx.fs.exists(dotConvexDir) && !ctx.fs.exists(gitignorePath)) {\n ctx.fs.writeUtf8File(gitignorePath, \"/*\\n\");\n logVerbose(`Created .convex/.gitignore to ignore local/`);\n }\n}\n\n// Naming is hard, but \"local\" refers to deployments linked to a Convex project\n// and \"anonymous\" refers to deployments that are not linked to a Convex project\n// (but in both cases they are running locally).\nexport type LocalDeploymentKind = \"local\" | \"anonymous\";\n\nexport function rootDeploymentStateDir(kind: LocalDeploymentKind) {\n return path.join(\n rootDirectory(),\n kind === \"local\"\n ? \"convex-backend-state\"\n : \"anonymous-convex-backend-state\",\n );\n}\n\n/**\n * Get the project-local state directory for a deployment.\n * Always returns `.convex/local/default/` - one deployment per project.\n */\nexport function projectLocalStateDir(projectDir?: string): string {\n const baseDir = projectDir ?? process.cwd();\n return path.join(baseDir, \".convex\", \"local\", \"default\");\n}\n\n/**\n * Get the legacy home directory state path for a deployment.\n */\nexport function legacyDeploymentStateDir(\n deploymentKind: LocalDeploymentKind,\n deploymentName: string,\n): string {\n return path.join(rootDeploymentStateDir(deploymentKind), deploymentName);\n}\n\n/**\n * Get the state directory for a deployment.\n *\n * Priority order:\n * 1. Project-local directory if it has data (config.json exists)\n * 2. Legacy home directory if it exists (backward compatibility)\n * 3. Project-local directory for new deployments\n *\n * This ensures that when project-local storage is in use, it takes precedence\n * over any legacy directories that might exist with the same deployment name.\n */\nexport function deploymentStateDir(\n ctx: Context,\n deploymentKind: LocalDeploymentKind,\n deploymentName: string,\n projectDir?: string,\n): string {\n // Check if project-local has data - if so, use it\n // This takes precedence over legacy to support switching deployment types\n // within the same project directory\n const localDir = projectLocalStateDir(projectDir);\n const localConfigFile = path.join(localDir, \"config.json\");\n if (ctx.fs.exists(localConfigFile)) {\n logVerbose(\n `Using project-local state for deployment ${deploymentName}: ${localDir}`,\n );\n return localDir;\n }\n\n // Check if legacy data exists in home directory\n const legacyDir = legacyDeploymentStateDir(deploymentKind, deploymentName);\n if (ctx.fs.exists(legacyDir) && ctx.fs.stat(legacyDir).isDirectory()) {\n logVerbose(\n `Using legacy home directory state for deployment ${deploymentName}: ${legacyDir}`,\n );\n return legacyDir;\n }\n\n // Default to project-local for new deployments\n logVerbose(\n `Using project-local state for new deployment ${deploymentName}: ${localDir}`,\n );\n return localDir;\n}\n\n/**\n * Get the state directory for a deployment without checking for legacy data.\n * This always returns the project-local path.\n */\nexport function deploymentStateDirUnchecked(projectDir?: string): string {\n return projectLocalStateDir(projectDir);\n}\n\nexport type LocalDeploymentConfig = {\n ports: {\n cloud: number;\n site: number;\n };\n backendVersion: string;\n adminKey: string;\n // If not present, use the default instance secret for local backends\n instanceSecret?: string;\n // The deployment name (e.g., \"local-my_team-my_project\" or \"anonymous-chess\")\n // This is stored in the config for project-local storage where the directory\n // name is always \"default\" rather than the deployment name.\n deploymentName?: string;\n // Numeric id of the cloud project this local deployment is registered under.\n // Used to detect when the cloud project has changed since the last time it\n // was used (e.g. through `npx convex deployment select`).\n cloudProjectId: number | undefined;\n};\n\n/**\n * Load deployment config from a specific directory.\n * This is used when we already know the directory path.\n */\nexport function loadDeploymentConfigFromDir(\n ctx: Context,\n dir: string,\n): LocalDeploymentConfig | null {\n const configFile = path.join(dir, \"config.json\");\n if (!ctx.fs.exists(configFile)) {\n return null;\n }\n const content = ctx.fs.readUtf8File(configFile);\n try {\n return JSON.parse(content);\n } catch (e) {\n logVerbose(\n `Failed to parse local deployment config at ${dir}: ${e as any}`,\n );\n return null;\n }\n}\n\n/**\n * Load the project-local deployment config.\n * This returns the config from `.convex/local/default/` if it exists.\n * Returns both the config and the deployment name stored in it.\n */\nexport function loadProjectLocalConfig(\n ctx: Context,\n projectDir?: string,\n): { deploymentName: string; config: LocalDeploymentConfig } | null {\n const localDir = projectLocalStateDir(projectDir);\n const config = loadDeploymentConfigFromDir(ctx, localDir);\n if (config !== null && config.deploymentName) {\n logVerbose(\n `Found project-local deployment config for ${config.deploymentName}`,\n );\n return { deploymentName: config.deploymentName, config };\n }\n return null;\n}\n\n/**\n * Load deployment config for a deployment.\n *\n * Priority order (matching deploymentStateDir):\n * 1. Project-local directory if it has a matching config\n * 2. Legacy home directory\n */\nexport function loadDeploymentConfig(\n ctx: Context,\n deploymentKind: LocalDeploymentKind,\n deploymentName: string,\n projectDir?: string,\n): LocalDeploymentConfig | null {\n // Check project-local location first - matches deploymentStateDir priority\n const localDir = projectLocalStateDir(projectDir);\n const localConfig = loadDeploymentConfigFromDir(ctx, localDir);\n if (localConfig !== null) {\n // Only use if config matches the requested deployment name\n // (project-local can hold different deployments at different times)\n if (\n !localConfig.deploymentName ||\n localConfig.deploymentName === deploymentName\n ) {\n logVerbose(\n `Found deployment config in project-local location for ${deploymentName}`,\n );\n return localConfig;\n }\n logVerbose(\n `Project-local config is for ${localConfig.deploymentName}, not ${deploymentName}`,\n );\n }\n\n // Check legacy location\n const legacyDir = legacyDeploymentStateDir(deploymentKind, deploymentName);\n const legacyConfig = loadDeploymentConfigFromDir(ctx, legacyDir);\n if (legacyConfig !== null) {\n logVerbose(\n `Found deployment config in legacy location for ${deploymentName}`,\n );\n return legacyConfig;\n }\n\n return null;\n}\n\n/**\n * Save deployment config.\n *\n * If data already exists in the legacy home directory, continue using that\n * location. Otherwise, use the project-local directory. The deployment name\n * is always stored in the config for project-local storage.\n */\nexport function saveDeploymentConfig(\n ctx: Context,\n deploymentKind: LocalDeploymentKind,\n deploymentName: string,\n config: LocalDeploymentConfig,\n projectDir?: string,\n) {\n const dir = deploymentStateDir(\n ctx,\n deploymentKind,\n deploymentName,\n projectDir,\n );\n const configFile = path.join(dir, \"config.json\");\n if (!ctx.fs.exists(dir)) {\n ctx.fs.mkdir(dir, { recursive: true });\n }\n // Ensure .gitignore exists to prevent local state from being committed\n ensureDotConvexGitignore(ctx, projectDir);\n // Always include the deployment name in the config for project-local storage\n const configWithName = { ...config, deploymentName };\n ctx.fs.writeUtf8File(configFile, JSON.stringify(configWithName));\n}\n\nexport function binariesDir() {\n return path.join(cacheDir(), \"binaries\");\n}\n\nexport function dashboardZip() {\n return path.join(dashboardDir(), \"dashboard.zip\");\n}\n\nexport function versionedBinaryDir(version: string) {\n return path.join(binariesDir(), version);\n}\n\nexport function executablePath(version: string) {\n return path.join(versionedBinaryDir(version), executableName());\n}\n\nexport function executableName() {\n const ext = process.platform === \"win32\" ? \".exe\" : \"\";\n return `convex-local-backend${ext}`;\n}\n\nexport function dashboardDir() {\n return path.join(cacheDir(), \"dashboard\");\n}\n\nexport async function resetDashboardDir(ctx: Context) {\n const dir = dashboardDir();\n if (ctx.fs.exists(dir)) {\n await recursivelyDelete(ctx, dir);\n }\n ctx.fs.mkdir(dir, { recursive: true });\n}\n\nexport function dashboardOutDir() {\n return path.join(dashboardDir(), \"out\");\n}\n\nexport type DashboardConfig = {\n port: number;\n apiPort: number;\n version: string;\n};\nexport function loadDashboardConfig(ctx: Context) {\n const configFile = path.join(dashboardDir(), \"config.json\");\n if (!ctx.fs.exists(configFile)) {\n return null;\n }\n const content = ctx.fs.readUtf8File(configFile);\n try {\n return JSON.parse(content);\n } catch (e) {\n logVerbose(`Failed to parse dashboard config: ${e as any}`);\n return null;\n }\n}\n\nexport function saveDashboardConfig(ctx: Context, config: DashboardConfig) {\n const configFile = path.join(dashboardDir(), \"config.json\");\n if (!ctx.fs.exists(dashboardDir())) {\n ctx.fs.mkdir(dashboardDir(), { recursive: true });\n }\n ctx.fs.writeUtf8File(configFile, JSON.stringify(config));\n}\n\nexport function loadUuidForAnonymousUser(ctx: Context) {\n const configFile = path.join(\n rootDeploymentStateDir(\"anonymous\"),\n \"config.json\",\n );\n if (!ctx.fs.exists(configFile)) {\n return null;\n }\n const content = ctx.fs.readUtf8File(configFile);\n try {\n const config = JSON.parse(content);\n return config.uuid ?? null;\n } catch (e) {\n logVerbose(`Failed to parse uuid for anonymous user: ${e as any}`);\n return null;\n }\n}\n\nexport function ensureUuidForAnonymousUser(ctx: Context) {\n const uuid = loadUuidForAnonymousUser(ctx);\n if (uuid) {\n return uuid;\n }\n const newUuid = crypto.randomUUID();\n const anonymousDir = rootDeploymentStateDir(\"anonymous\");\n if (!ctx.fs.exists(anonymousDir)) {\n ctx.fs.mkdir(anonymousDir, { recursive: true });\n }\n ctx.fs.writeUtf8File(\n path.join(anonymousDir, \"config.json\"),\n JSON.stringify({ uuid: newUuid }),\n );\n return newUuid;\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"sourcesContent": ["/*\n~/.cache/convex\n binaries\n 0.0.1\n convex-local-backend[.exe] // convex-local-backend.exe on windows\n 0.0.2\n convex-local-backend[.exe]\n dashboard\n config.json // `GlobalDashboardConfig`\n out\n // if present, output files from building the self-hosted dashboard which can\n // be served using `npx serve`\n index.html\n\n\nDeployment state storage locations:\n\nNew default (project-local): .convex/local/default/\n - Used for both \"local\" (linked to Convex project) and \"anonymous\" deployments\n - One deployment per project/worktree/clone\n - This allows worktrees/clones to have isolated storage without conflicts\n\nLegacy (home directory) - used for backward compatibility if data already exists:\n - For \"local\" deployments: ~/.convex/convex-backend-state/local-{team}-{project}/\n - For \"anonymous\" deployments: ~/.convex/anonymous-convex-backend-state/{anonymous-deployment-name}/\n\nFor anonymous deployments, the locally running dashboard's `{ port }`\nis stored as `dashboard.json` next to that deployment's `config.json` (see\n`ProjectDashboardConfig`), wherever the deployment lives.\n\n\n~/.convex\n convex-backend-state\n local-my_team-chess\n config.json // contains `LocalDeploymentConfig`\n convex_local_storage\n convex_local_backend.sqlite3\n local-my_team-whisper\n config.json\n convex_local_storage\n convex_local_backend.sqlite3\n anonymous-convex-backend-state\n config.json // contains { uuid: <uuid> }, used to identify the anonymous user\n anonymous-chess\n config.json\n convex_local_storage\n convex_local_backend.sqlite3\n*/\n\nimport path from \"path\";\nimport { cacheDir, rootDirectory } from \"../utils/utils.js\";\nimport { Context } from \"../../../bundler/context.js\";\nimport { logVerbose } from \"../../../bundler/log.js\";\nimport { recursivelyDelete } from \"../fsUtils.js\";\nimport crypto from \"crypto\";\n\n/**\n * Ensure the `.convex/.gitignore` file exists with the right content.\n * This prevents local deployment state from being committed to git.\n */\nexport function ensureDotConvexGitignore(\n ctx: Context,\n projectDir?: string,\n): void {\n const baseDir = projectDir ?? process.cwd();\n const dotConvexDir = path.join(baseDir, \".convex\");\n const gitignorePath = path.join(dotConvexDir, \".gitignore\");\n\n // Only create if .convex directory exists but .gitignore doesn't\n if (ctx.fs.exists(dotConvexDir) && !ctx.fs.exists(gitignorePath)) {\n ctx.fs.writeUtf8File(gitignorePath, \"/*\\n\");\n logVerbose(`Created .convex/.gitignore to ignore local/`);\n }\n}\n\n// Naming is hard, but \"local\" refers to deployments linked to a Convex project\n// and \"anonymous\" refers to deployments that are not linked to a Convex project\n// (but in both cases they are running locally).\nexport type LocalDeploymentKind = \"local\" | \"anonymous\";\n\nexport function rootDeploymentStateDir(kind: LocalDeploymentKind) {\n return path.join(\n rootDirectory(),\n kind === \"local\"\n ? \"convex-backend-state\"\n : \"anonymous-convex-backend-state\",\n );\n}\n\n/**\n * Get the project-local state directory for a deployment.\n * Always returns `.convex/local/default/` - one deployment per project.\n */\nexport function projectLocalStateDir(projectDir?: string): string {\n const baseDir = projectDir ?? process.cwd();\n return path.join(baseDir, \".convex\", \"local\", \"default\");\n}\n\n/**\n * Get the legacy home directory state path for a deployment.\n */\nexport function legacyDeploymentStateDir(\n deploymentKind: LocalDeploymentKind,\n deploymentName: string,\n): string {\n return path.join(rootDeploymentStateDir(deploymentKind), deploymentName);\n}\n\n/**\n * Get the state directory for a deployment.\n *\n * Priority order:\n * 1. Project-local directory if it has data (config.json exists)\n * 2. Legacy home directory if it exists (backward compatibility)\n * 3. Project-local directory for new deployments\n *\n * This ensures that when project-local storage is in use, it takes precedence\n * over any legacy directories that might exist with the same deployment name.\n */\nexport function deploymentStateDir(\n ctx: Context,\n deploymentKind: LocalDeploymentKind,\n deploymentName: string,\n projectDir?: string,\n): string {\n // Check if project-local has data - if so, use it\n // This takes precedence over legacy to support switching deployment types\n // within the same project directory\n const localDir = projectLocalStateDir(projectDir);\n const localConfigFile = path.join(localDir, \"config.json\");\n if (ctx.fs.exists(localConfigFile)) {\n logVerbose(\n `Using project-local state for deployment ${deploymentName}: ${localDir}`,\n );\n return localDir;\n }\n\n // Check if legacy data exists in home directory\n const legacyDir = legacyDeploymentStateDir(deploymentKind, deploymentName);\n if (ctx.fs.exists(legacyDir) && ctx.fs.stat(legacyDir).isDirectory()) {\n logVerbose(\n `Using legacy home directory state for deployment ${deploymentName}: ${legacyDir}`,\n );\n return legacyDir;\n }\n\n // Default to project-local for new deployments\n logVerbose(\n `Using project-local state for new deployment ${deploymentName}: ${localDir}`,\n );\n return localDir;\n}\n\n/**\n * Get the state directory for a deployment without checking for legacy data.\n * This always returns the project-local path.\n */\nexport function deploymentStateDirUnchecked(projectDir?: string): string {\n return projectLocalStateDir(projectDir);\n}\n\nexport type LocalDeploymentConfig = {\n ports: {\n cloud: number;\n site: number;\n };\n backendVersion: string;\n adminKey: string;\n // If not present, use the default instance secret for local backends\n instanceSecret?: string;\n // The deployment name (e.g., \"local-my_team-my_project\" or \"anonymous-chess\")\n // This is stored in the config for project-local storage where the directory\n // name is always \"default\" rather than the deployment name.\n deploymentName?: string;\n // Numeric id of the cloud project this local deployment is registered under.\n // Used to detect when the cloud project has changed since the last time it\n // was used (e.g. through `npx convex deployment select`).\n cloudProjectId: number | undefined;\n};\n\n/**\n * Load deployment config from a specific directory.\n * This is used when we already know the directory path.\n */\nexport function loadDeploymentConfigFromDir(\n ctx: Context,\n dir: string,\n): LocalDeploymentConfig | null {\n const configFile = path.join(dir, \"config.json\");\n if (!ctx.fs.exists(configFile)) {\n return null;\n }\n const content = ctx.fs.readUtf8File(configFile);\n try {\n return JSON.parse(content);\n } catch (e) {\n logVerbose(\n `Failed to parse local deployment config at ${dir}: ${e as any}`,\n );\n return null;\n }\n}\n\n/**\n * Load the project-local deployment config.\n * This returns the config from `.convex/local/default/` if it exists.\n * Returns both the config and the deployment name stored in it.\n */\nexport function loadProjectLocalConfig(\n ctx: Context,\n projectDir?: string,\n): { deploymentName: string; config: LocalDeploymentConfig } | null {\n const localDir = projectLocalStateDir(projectDir);\n const config = loadDeploymentConfigFromDir(ctx, localDir);\n if (config !== null && config.deploymentName) {\n logVerbose(\n `Found project-local deployment config for ${config.deploymentName}`,\n );\n return { deploymentName: config.deploymentName, config };\n }\n return null;\n}\n\n/**\n * Load deployment config for a deployment.\n *\n * Priority order (matching deploymentStateDir):\n * 1. Project-local directory if it has a matching config\n * 2. Legacy home directory\n */\nexport function loadDeploymentConfig(\n ctx: Context,\n deploymentKind: LocalDeploymentKind,\n deploymentName: string,\n projectDir?: string,\n): LocalDeploymentConfig | null {\n // Check project-local location first - matches deploymentStateDir priority\n const localDir = projectLocalStateDir(projectDir);\n const localConfig = loadDeploymentConfigFromDir(ctx, localDir);\n if (localConfig !== null) {\n // Only use if config matches the requested deployment name\n // (project-local can hold different deployments at different times)\n if (\n !localConfig.deploymentName ||\n localConfig.deploymentName === deploymentName\n ) {\n logVerbose(\n `Found deployment config in project-local location for ${deploymentName}`,\n );\n return localConfig;\n }\n logVerbose(\n `Project-local config is for ${localConfig.deploymentName}, not ${deploymentName}`,\n );\n }\n\n // Check legacy location\n const legacyDir = legacyDeploymentStateDir(deploymentKind, deploymentName);\n const legacyConfig = loadDeploymentConfigFromDir(ctx, legacyDir);\n if (legacyConfig !== null) {\n logVerbose(\n `Found deployment config in legacy location for ${deploymentName}`,\n );\n return legacyConfig;\n }\n\n return null;\n}\n\n/**\n * Save deployment config.\n *\n * If data already exists in the legacy home directory, continue using that\n * location. Otherwise, use the project-local directory. The deployment name\n * is always stored in the config for project-local storage.\n */\nexport function saveDeploymentConfig(\n ctx: Context,\n deploymentKind: LocalDeploymentKind,\n deploymentName: string,\n config: LocalDeploymentConfig,\n projectDir?: string,\n) {\n const dir = deploymentStateDir(\n ctx,\n deploymentKind,\n deploymentName,\n projectDir,\n );\n const configFile = path.join(dir, \"config.json\");\n if (!ctx.fs.exists(dir)) {\n ctx.fs.mkdir(dir, { recursive: true });\n }\n // Ensure .gitignore exists to prevent local state from being committed\n ensureDotConvexGitignore(ctx, projectDir);\n // Always include the deployment name in the config for project-local storage\n const configWithName = { ...config, deploymentName };\n ctx.fs.writeUtf8File(configFile, JSON.stringify(configWithName));\n}\n\nexport function binariesDir() {\n return path.join(cacheDir(), \"binaries\");\n}\n\nexport function dashboardZip() {\n return path.join(dashboardDir(), \"dashboard.zip\");\n}\n\nexport function versionedBinaryDir(version: string) {\n return path.join(binariesDir(), version);\n}\n\nexport function executablePath(version: string) {\n return path.join(versionedBinaryDir(version), executableName());\n}\n\nexport function executableName() {\n const ext = process.platform === \"win32\" ? \".exe\" : \"\";\n return `convex-local-backend${ext}`;\n}\n\nexport function dashboardDir() {\n return path.join(cacheDir(), \"dashboard\");\n}\n\nexport async function resetDashboardDir(ctx: Context) {\n const dir = dashboardDir();\n if (ctx.fs.exists(dir)) {\n await recursivelyDelete(ctx, dir);\n }\n ctx.fs.mkdir(dir, { recursive: true });\n}\n\nexport function dashboardOutDir() {\n return path.join(dashboardDir(), \"out\");\n}\n\n/**\n * Global dashboard config in ~/.cache/convex/dashboard/config.json.\n */\nexport type GlobalDashboardConfig = {\n version: string;\n\n // Previous versions of the Convex CLI would also store\n // fields here for ports. They are now in ProjectDashboardConfig.\n};\n\nexport function loadGlobalDashboardConfig(\n ctx: Context,\n): GlobalDashboardConfig | null {\n const configFile = path.join(dashboardDir(), \"config.json\");\n if (!ctx.fs.exists(configFile)) {\n return null;\n }\n const content = ctx.fs.readUtf8File(configFile);\n try {\n return JSON.parse(content);\n } catch (e) {\n logVerbose(`Failed to parse dashboard config: ${e as any}`);\n return null;\n }\n}\n\nexport function saveGlobalDashboardConfig(\n ctx: Context,\n config: GlobalDashboardConfig,\n) {\n const configFile = path.join(dashboardDir(), \"config.json\");\n if (!ctx.fs.exists(dashboardDir())) {\n ctx.fs.mkdir(dashboardDir(), { recursive: true });\n }\n ctx.fs.writeUtf8File(configFile, JSON.stringify(config));\n}\n\n/**\n * Project-scoped dashboard config (for anonymous dev) in\n * project/.convex/local/default/dashboard.json\n * (or legacyDeploymentStateDir/dashboard.json)\n */\nexport type ProjectDashboardConfig = {\n port: number;\n};\n\nfunction dashboardConfigPath(ctx: Context, deploymentName: string) {\n return path.join(\n deploymentStateDir(ctx, \"anonymous\", deploymentName),\n \"dashboard.json\",\n );\n}\n\nexport function loadProjectDashboardConfig(\n ctx: Context,\n deploymentName: string,\n): ProjectDashboardConfig | null {\n const configFile = dashboardConfigPath(ctx, deploymentName);\n if (!ctx.fs.exists(configFile)) {\n return null;\n }\n const content = ctx.fs.readUtf8File(configFile);\n try {\n return JSON.parse(content);\n } catch (e) {\n logVerbose(`Failed to parse project dashboard config: ${e as any}`);\n return null;\n }\n}\n\nexport function saveProjectDashboardConfig(\n ctx: Context,\n deploymentName: string,\n config: ProjectDashboardConfig,\n) {\n const configPath = dashboardConfigPath(ctx, deploymentName);\n const directoryPath = path.dirname(configPath);\n if (!ctx.fs.exists(directoryPath)) {\n ctx.fs.mkdir(directoryPath, { recursive: true });\n }\n ctx.fs.writeUtf8File(configPath, JSON.stringify(config));\n}\n\nexport function loadUuidForAnonymousUser(ctx: Context) {\n const configFile = path.join(\n rootDeploymentStateDir(\"anonymous\"),\n \"config.json\",\n );\n if (!ctx.fs.exists(configFile)) {\n return null;\n }\n const content = ctx.fs.readUtf8File(configFile);\n try {\n const config = JSON.parse(content);\n return config.uuid ?? null;\n } catch (e) {\n logVerbose(`Failed to parse uuid for anonymous user: ${e as any}`);\n return null;\n }\n}\n\nexport function ensureUuidForAnonymousUser(ctx: Context) {\n const uuid = loadUuidForAnonymousUser(ctx);\n if (uuid) {\n return uuid;\n }\n const newUuid = crypto.randomUUID();\n const anonymousDir = rootDeploymentStateDir(\"anonymous\");\n if (!ctx.fs.exists(anonymousDir)) {\n ctx.fs.mkdir(anonymousDir, { recursive: true });\n }\n ctx.fs.writeUtf8File(\n path.join(anonymousDir, \"config.json\"),\n JSON.stringify({ uuid: newUuid }),\n );\n return newUuid;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiDA,kBAAiB;AACjB,mBAAwC;AAExC,iBAA2B;AAC3B,qBAAkC;AAClC,oBAAmB;AAMZ,SAAS,yBACd,KACA,YACM;AACN,QAAM,UAAU,cAAc,QAAQ,IAAI;AAC1C,QAAM,eAAe,YAAAA,QAAK,KAAK,SAAS,SAAS;AACjD,QAAM,gBAAgB,YAAAA,QAAK,KAAK,cAAc,YAAY;AAG1D,MAAI,IAAI,GAAG,OAAO,YAAY,KAAK,CAAC,IAAI,GAAG,OAAO,aAAa,GAAG;AAChE,QAAI,GAAG,cAAc,eAAe,MAAM;AAC1C,+BAAW,6CAA6C;AAAA,EAC1D;AACF;AAOO,SAAS,uBAAuB,MAA2B;AAChE,SAAO,YAAAA,QAAK;AAAA,QACV,4BAAc;AAAA,IACd,SAAS,UACL,yBACA;AAAA,EACN;AACF;AAMO,SAAS,qBAAqB,YAA6B;AAChE,QAAM,UAAU,cAAc,QAAQ,IAAI;AAC1C,SAAO,YAAAA,QAAK,KAAK,SAAS,WAAW,SAAS,SAAS;AACzD;AAKO,SAAS,yBACd,gBACA,gBACQ;AACR,SAAO,YAAAA,QAAK,KAAK,uBAAuB,cAAc,GAAG,cAAc;AACzE;AAaO,SAAS,mBACd,KACA,gBACA,gBACA,YACQ;AAIR,QAAM,WAAW,qBAAqB,UAAU;AAChD,QAAM,kBAAkB,YAAAA,QAAK,KAAK,UAAU,aAAa;AACzD,MAAI,IAAI,GAAG,OAAO,eAAe,GAAG;AAClC;AAAA,MACE,4CAA4C,cAAc,KAAK,QAAQ;AAAA,IACzE;AACA,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,yBAAyB,gBAAgB,cAAc;AACzE,MAAI,IAAI,GAAG,OAAO,SAAS,KAAK,IAAI,GAAG,KAAK,SAAS,EAAE,YAAY,GAAG;AACpE;AAAA,MACE,oDAAoD,cAAc,KAAK,SAAS;AAAA,IAClF;AACA,WAAO;AAAA,EACT;AAGA;AAAA,IACE,gDAAgD,cAAc,KAAK,QAAQ;AAAA,EAC7E;AACA,SAAO;AACT;AAMO,SAAS,4BAA4B,YAA6B;AACvE,SAAO,qBAAqB,UAAU;AACxC;AAyBO,SAAS,4BACd,KACA,KAC8B;AAC9B,QAAM,aAAa,YAAAA,QAAK,KAAK,KAAK,aAAa;AAC/C,MAAI,CAAC,IAAI,GAAG,OAAO,UAAU,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,IAAI,GAAG,aAAa,UAAU;AAC9C,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,GAAG;AACV;AAAA,MACE,8CAA8C,GAAG,KAAK,CAAQ;AAAA,IAChE;AACA,WAAO;AAAA,EACT;AACF;AAOO,SAAS,uBACd,KACA,YACkE;AAClE,QAAM,WAAW,qBAAqB,UAAU;AAChD,QAAM,SAAS,4BAA4B,KAAK,QAAQ;AACxD,MAAI,WAAW,QAAQ,OAAO,gBAAgB;AAC5C;AAAA,MACE,6CAA6C,OAAO,cAAc;AAAA,IACpE;AACA,WAAO,EAAE,gBAAgB,OAAO,gBAAgB,OAAO;AAAA,EACzD;AACA,SAAO;AACT;AASO,SAAS,qBACd,KACA,gBACA,gBACA,YAC8B;AAE9B,QAAM,WAAW,qBAAqB,UAAU;AAChD,QAAM,cAAc,4BAA4B,KAAK,QAAQ;AAC7D,MAAI,gBAAgB,MAAM;AAGxB,QACE,CAAC,YAAY,kBACb,YAAY,mBAAmB,gBAC/B;AACA;AAAA,QACE,yDAAyD,cAAc;AAAA,MACzE;AACA,aAAO;AAAA,IACT;AACA;AAAA,MACE,+BAA+B,YAAY,cAAc,SAAS,cAAc;AAAA,IAClF;AAAA,EACF;AAGA,QAAM,YAAY,yBAAyB,gBAAgB,cAAc;AACzE,QAAM,eAAe,4BAA4B,KAAK,SAAS;AAC/D,MAAI,iBAAiB,MAAM;AACzB;AAAA,MACE,kDAAkD,cAAc;AAAA,IAClE;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AASO,SAAS,qBACd,KACA,gBACA,gBACA,QACA,YACA;AACA,QAAM,MAAM;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAM,aAAa,YAAAA,QAAK,KAAK,KAAK,aAAa;AAC/C,MAAI,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG;AACvB,QAAI,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,EACvC;AAEA,2BAAyB,KAAK,UAAU;AAExC,QAAM,iBAAiB,EAAE,GAAG,QAAQ,eAAe;AACnD,MAAI,GAAG,cAAc,YAAY,KAAK,UAAU,cAAc,CAAC;AACjE;AAEO,SAAS,cAAc;AAC5B,SAAO,YAAAA,QAAK,SAAK,uBAAS,GAAG,UAAU;AACzC;AAEO,SAAS,eAAe;AAC7B,SAAO,YAAAA,QAAK,KAAK,aAAa,GAAG,eAAe;AAClD;AAEO,SAAS,mBAAmB,SAAiB;AAClD,SAAO,YAAAA,QAAK,KAAK,YAAY,GAAG,OAAO;AACzC;AAEO,SAAS,eAAe,SAAiB;AAC9C,SAAO,YAAAA,QAAK,KAAK,mBAAmB,OAAO,GAAG,eAAe,CAAC;AAChE;AAEO,SAAS,iBAAiB;AAC/B,QAAM,MAAM,QAAQ,aAAa,UAAU,SAAS;AACpD,SAAO,uBAAuB,GAAG;AACnC;AAEO,SAAS,eAAe;AAC7B,SAAO,YAAAA,QAAK,SAAK,uBAAS,GAAG,WAAW;AAC1C;AAEA,eAAsB,kBAAkB,KAAc;AACpD,QAAM,MAAM,aAAa;AACzB,MAAI,IAAI,GAAG,OAAO,GAAG,GAAG;AACtB,cAAM,kCAAkB,KAAK,GAAG;AAAA,EAClC;AACA,MAAI,GAAG,MAAM,KAAK,EAAE,WAAW,KAAK,CAAC;AACvC;AAEO,SAAS,kBAAkB;AAChC,SAAO,YAAAA,QAAK,KAAK,aAAa,GAAG,KAAK;AACxC;AAYO,SAAS,0BACd,KAC8B;AAC9B,QAAM,aAAa,YAAAA,QAAK,KAAK,aAAa,GAAG,aAAa;AAC1D,MAAI,CAAC,IAAI,GAAG,OAAO,UAAU,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,IAAI,GAAG,aAAa,UAAU;AAC9C,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,GAAG;AACV,+BAAW,qCAAqC,CAAQ,EAAE;AAC1D,WAAO;AAAA,EACT;AACF;AAEO,SAAS,0BACd,KACA,QACA;AACA,QAAM,aAAa,YAAAA,QAAK,KAAK,aAAa,GAAG,aAAa;AAC1D,MAAI,CAAC,IAAI,GAAG,OAAO,aAAa,CAAC,GAAG;AAClC,QAAI,GAAG,MAAM,aAAa,GAAG,EAAE,WAAW,KAAK,CAAC;AAAA,EAClD;AACA,MAAI,GAAG,cAAc,YAAY,KAAK,UAAU,MAAM,CAAC;AACzD;AAWA,SAAS,oBAAoB,KAAc,gBAAwB;AACjE,SAAO,YAAAA,QAAK;AAAA,IACV,mBAAmB,KAAK,aAAa,cAAc;AAAA,IACnD;AAAA,EACF;AACF;AAEO,SAAS,2BACd,KACA,gBAC+B;AAC/B,QAAM,aAAa,oBAAoB,KAAK,cAAc;AAC1D,MAAI,CAAC,IAAI,GAAG,OAAO,UAAU,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,IAAI,GAAG,aAAa,UAAU;AAC9C,MAAI;AACF,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B,SAAS,GAAG;AACV,+BAAW,6CAA6C,CAAQ,EAAE;AAClE,WAAO;AAAA,EACT;AACF;AAEO,SAAS,2BACd,KACA,gBACA,QACA;AACA,QAAM,aAAa,oBAAoB,KAAK,cAAc;AAC1D,QAAM,gBAAgB,YAAAA,QAAK,QAAQ,UAAU;AAC7C,MAAI,CAAC,IAAI,GAAG,OAAO,aAAa,GAAG;AACjC,QAAI,GAAG,MAAM,eAAe,EAAE,WAAW,KAAK,CAAC;AAAA,EACjD;AACA,MAAI,GAAG,cAAc,YAAY,KAAK,UAAU,MAAM,CAAC;AACzD;AAEO,SAAS,yBAAyB,KAAc;AACrD,QAAM,aAAa,YAAAA,QAAK;AAAA,IACtB,uBAAuB,WAAW;AAAA,IAClC;AAAA,EACF;AACA,MAAI,CAAC,IAAI,GAAG,OAAO,UAAU,GAAG;AAC9B,WAAO;AAAA,EACT;AACA,QAAM,UAAU,IAAI,GAAG,aAAa,UAAU;AAC9C,MAAI;AACF,UAAM,SAAS,KAAK,MAAM,OAAO;AACjC,WAAO,OAAO,QAAQ;AAAA,EACxB,SAAS,GAAG;AACV,+BAAW,4CAA4C,CAAQ,EAAE;AACjE,WAAO;AAAA,EACT;AACF;AAEO,SAAS,2BAA2B,KAAc;AACvD,QAAM,OAAO,yBAAyB,GAAG;AACzC,MAAI,MAAM;AACR,WAAO;AAAA,EACT;AACA,QAAM,UAAU,cAAAC,QAAO,WAAW;AAClC,QAAM,eAAe,uBAAuB,WAAW;AACvD,MAAI,CAAC,IAAI,GAAG,OAAO,YAAY,GAAG;AAChC,QAAI,GAAG,MAAM,cAAc,EAAE,WAAW,KAAK,CAAC;AAAA,EAChD;AACA,MAAI,GAAG;AAAA,IACL,YAAAD,QAAK,KAAK,cAAc,aAAa;AAAA,IACrC,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAAA,EAClC;AACA,SAAO;AACT;",
|
|
6
6
|
"names": ["path", "crypto"]
|
|
7
7
|
}
|
|
@@ -29,17 +29,14 @@ var import_bigBrain = require("./bigBrain.js");
|
|
|
29
29
|
var import_filePaths = require("./filePaths.js");
|
|
30
30
|
var import_run = require("./run.js");
|
|
31
31
|
var import_upgrade = require("./upgrade.js");
|
|
32
|
-
var import_prompts = require("../utils/prompts.js");
|
|
33
32
|
var import_errors = require("./errors.js");
|
|
34
33
|
var import_utils2 = require("./utils.js");
|
|
35
34
|
var import_download = require("./download.js");
|
|
36
35
|
var import_defaultEnv = require("../defaultEnv.js");
|
|
37
36
|
var import_env = require("../env.js");
|
|
38
37
|
var import_deploymentSelection = require("../deploymentSelection.js");
|
|
38
|
+
var import_secrets = require("./secrets.js");
|
|
39
39
|
async function handleLocalDeployment(ctx, options) {
|
|
40
|
-
if (await (0, import_utils2.isOffline)()) {
|
|
41
|
-
return handleOffline(ctx, options);
|
|
42
|
-
}
|
|
43
40
|
const existingDeploymentForProject = await getExistingDeployment(ctx, {
|
|
44
41
|
projectSlug: options.projectSlug,
|
|
45
42
|
teamSlug: options.teamSlug
|
|
@@ -75,37 +72,29 @@ async function handleLocalDeployment(ctx, options) {
|
|
|
75
72
|
requestedPorts: options.ports,
|
|
76
73
|
suggestedPorts: existingDeploymentForProject?.config.ports
|
|
77
74
|
});
|
|
78
|
-
const { deploymentName,
|
|
75
|
+
const { deploymentName, projectId } = await (0, import_bigBrain.bigBrainStart)(ctx, {
|
|
79
76
|
port: cloudPort,
|
|
80
77
|
projectSlug: options.projectSlug,
|
|
81
78
|
teamSlug: options.teamSlug,
|
|
82
79
|
instanceName: existingDeploymentForProject?.deploymentName ?? null
|
|
83
80
|
});
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
|
|
81
|
+
const { cleanupHandle, adminKey } = await (0, import_upgrade.handlePotentialUpgradeAndStart)(
|
|
82
|
+
ctx,
|
|
83
|
+
{
|
|
84
|
+
deploymentKind: "local",
|
|
87
85
|
deploymentName,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
86
|
+
oldVersion: existingDeploymentForProject?.config.backendVersion ?? null,
|
|
87
|
+
newBinaryPath: binaryPath,
|
|
88
|
+
newVersion: version,
|
|
89
|
+
ports: { cloud: cloudPort, site: sitePort },
|
|
90
|
+
existingCredentials: existingDeploymentForProject?.config ? {
|
|
91
|
+
adminKey: existingDeploymentForProject?.config.adminKey,
|
|
92
|
+
instanceSecret: existingDeploymentForProject?.config.instanceSecret ?? import_secrets.LEGACY_LOCAL_BACKEND_INSTANCE_SECRET
|
|
93
|
+
} : null,
|
|
94
|
+
forceUpgrade: options.forceUpgrade,
|
|
95
|
+
cloudProjectId: projectId
|
|
92
96
|
}
|
|
93
|
-
|
|
94
|
-
instanceName: deploymentName
|
|
95
|
-
});
|
|
96
|
-
};
|
|
97
|
-
const { cleanupHandle } = await (0, import_upgrade.handlePotentialUpgrade)(ctx, {
|
|
98
|
-
deploymentKind: "local",
|
|
99
|
-
deploymentName,
|
|
100
|
-
oldVersion: existingDeploymentForProject?.config.backendVersion ?? null,
|
|
101
|
-
newBinaryPath: binaryPath,
|
|
102
|
-
newVersion: version,
|
|
103
|
-
ports: { cloud: cloudPort, site: sitePort },
|
|
104
|
-
adminKey,
|
|
105
|
-
instanceSecret: import_utils2.LOCAL_BACKEND_INSTANCE_SECRET,
|
|
106
|
-
forceUpgrade: options.forceUpgrade,
|
|
107
|
-
cloudProjectId: projectId
|
|
108
|
-
});
|
|
97
|
+
);
|
|
109
98
|
if (isFirstTime) {
|
|
110
99
|
await importDefaultEnvVars(ctx, {
|
|
111
100
|
teamSlug: options.teamSlug,
|
|
@@ -116,20 +105,29 @@ async function handleLocalDeployment(ctx, options) {
|
|
|
116
105
|
});
|
|
117
106
|
}
|
|
118
107
|
let activityTimeout = null;
|
|
119
|
-
|
|
108
|
+
let activityPingStopped = false;
|
|
109
|
+
async function activityPing() {
|
|
110
|
+
if (activityPingStopped) {
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
try {
|
|
114
|
+
await (0, import_bigBrain.bigBrainRecordActivity)(ctx, {
|
|
115
|
+
instanceName: deploymentName,
|
|
116
|
+
adminKey
|
|
117
|
+
});
|
|
118
|
+
} catch {
|
|
119
|
+
}
|
|
120
|
+
if (activityPingStopped) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
120
123
|
activityTimeout = setTimeout(async () => {
|
|
121
|
-
|
|
122
|
-
await (0, import_bigBrain.bigBrainRecordActivity)(ctx, {
|
|
123
|
-
instanceName: deploymentName
|
|
124
|
-
});
|
|
125
|
-
} catch {
|
|
126
|
-
}
|
|
127
|
-
scheduleActivityPing();
|
|
124
|
+
void activityPing();
|
|
128
125
|
}, 6e4);
|
|
129
|
-
}
|
|
130
|
-
|
|
126
|
+
}
|
|
127
|
+
void activityPing();
|
|
131
128
|
const cleanupFunc = ctx.removeCleanup(cleanupHandle);
|
|
132
129
|
ctx.registerCleanup(async (exitCode, err) => {
|
|
130
|
+
activityPingStopped = true;
|
|
133
131
|
if (activityTimeout !== null) {
|
|
134
132
|
clearTimeout(activityTimeout);
|
|
135
133
|
}
|
|
@@ -146,8 +144,7 @@ async function handleLocalDeployment(ctx, options) {
|
|
|
146
144
|
deploymentName,
|
|
147
145
|
deploymentUrl: (0, import_run.localDeploymentUrl)(cloudPort),
|
|
148
146
|
reference: null,
|
|
149
|
-
isDefault: false
|
|
150
|
-
onActivity
|
|
147
|
+
isDefault: false
|
|
151
148
|
};
|
|
152
149
|
}
|
|
153
150
|
async function loadLocalDeploymentCredentials(ctx, deploymentName) {
|
|
@@ -165,55 +162,6 @@ async function loadLocalDeploymentCredentials(ctx, deploymentName) {
|
|
|
165
162
|
adminKey: config.adminKey
|
|
166
163
|
};
|
|
167
164
|
}
|
|
168
|
-
async function handleOffline(ctx, options) {
|
|
169
|
-
const { deploymentName, config } = await chooseFromExistingLocalDeployments(ctx);
|
|
170
|
-
const { binaryPath } = await (0, import_download.ensureBackendBinaryDownloaded)(ctx, {
|
|
171
|
-
kind: "version",
|
|
172
|
-
version: config.backendVersion
|
|
173
|
-
});
|
|
174
|
-
const { cloudPort, sitePort } = await (0, import_utils2.chooseLocalBackendPorts)(ctx, {
|
|
175
|
-
requestedPorts: options.ports
|
|
176
|
-
// FIXME: This doesn’t try to reuse the ports already assigned in the config.
|
|
177
|
-
// Please update this if we ever support offline mode (currently this is dead code).
|
|
178
|
-
});
|
|
179
|
-
(0, import_filePaths.saveDeploymentConfig)(ctx, "local", deploymentName, config);
|
|
180
|
-
await (0, import_run.runLocalBackend)(ctx, {
|
|
181
|
-
binaryPath,
|
|
182
|
-
ports: { cloud: cloudPort, site: sitePort },
|
|
183
|
-
deploymentName,
|
|
184
|
-
deploymentKind: "local",
|
|
185
|
-
instanceSecret: import_utils2.LOCAL_BACKEND_INSTANCE_SECRET,
|
|
186
|
-
isLatestVersion: false
|
|
187
|
-
});
|
|
188
|
-
return {
|
|
189
|
-
adminKey: config.adminKey,
|
|
190
|
-
deploymentName,
|
|
191
|
-
deploymentUrl: (0, import_run.localDeploymentUrl)(cloudPort),
|
|
192
|
-
reference: null,
|
|
193
|
-
isDefault: false,
|
|
194
|
-
onActivity: async (isOffline2, wasOffline) => {
|
|
195
|
-
await (0, import_run.ensureBackendRunning)(ctx, {
|
|
196
|
-
cloudPort,
|
|
197
|
-
deploymentName,
|
|
198
|
-
maxTimeSecs: 5
|
|
199
|
-
});
|
|
200
|
-
if (isOffline2) {
|
|
201
|
-
return;
|
|
202
|
-
}
|
|
203
|
-
if (wasOffline) {
|
|
204
|
-
await (0, import_bigBrain.bigBrainStart)(ctx, {
|
|
205
|
-
port: cloudPort,
|
|
206
|
-
projectSlug: options.projectSlug,
|
|
207
|
-
teamSlug: options.teamSlug,
|
|
208
|
-
instanceName: deploymentName
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
await (0, import_bigBrain.bigBrainRecordActivity)(ctx, {
|
|
212
|
-
instanceName: deploymentName
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
};
|
|
216
|
-
}
|
|
217
165
|
async function getExistingDeployment(ctx, options) {
|
|
218
166
|
const { projectSlug, teamSlug } = options;
|
|
219
167
|
const projectLocal = (0, import_filePaths.loadProjectLocalConfig)(ctx);
|
|
@@ -254,43 +202,6 @@ async function getLegacyLocalDeployments(ctx) {
|
|
|
254
202
|
return [];
|
|
255
203
|
});
|
|
256
204
|
}
|
|
257
|
-
async function getLocalDeployments(ctx) {
|
|
258
|
-
const deployments = [];
|
|
259
|
-
const projectLocal = (0, import_filePaths.loadProjectLocalConfig)(ctx);
|
|
260
|
-
if (projectLocal !== null && projectLocal.deploymentName.startsWith("local-")) {
|
|
261
|
-
deployments.push(projectLocal);
|
|
262
|
-
}
|
|
263
|
-
const legacyDeployments = await getLegacyLocalDeployments(ctx);
|
|
264
|
-
for (const legacy of legacyDeployments) {
|
|
265
|
-
if (!deployments.some((d) => d.deploymentName === legacy.deploymentName)) {
|
|
266
|
-
deployments.push(legacy);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
return deployments;
|
|
270
|
-
}
|
|
271
|
-
async function chooseFromExistingLocalDeployments(ctx) {
|
|
272
|
-
const localDeployments = await getLocalDeployments(ctx);
|
|
273
|
-
if (localDeployments.length === 0) {
|
|
274
|
-
return ctx.crash({
|
|
275
|
-
exitCode: 1,
|
|
276
|
-
errorType: "fatal",
|
|
277
|
-
printedMessage: "No local deployments found. Please run `npx convex dev` while online first."
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
if (localDeployments.length === 1) {
|
|
281
|
-
(0, import_log.logVerbose)(
|
|
282
|
-
`Auto-selecting the only local deployment: ${localDeployments[0].deploymentName}`
|
|
283
|
-
);
|
|
284
|
-
return localDeployments[0];
|
|
285
|
-
}
|
|
286
|
-
return (0, import_prompts.promptSearch)(ctx, {
|
|
287
|
-
message: "Choose from an existing local deployment:",
|
|
288
|
-
choices: localDeployments.map((d) => ({
|
|
289
|
-
name: d.deploymentName,
|
|
290
|
-
value: d
|
|
291
|
-
}))
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
205
|
async function importDefaultEnvVars(ctx, {
|
|
295
206
|
teamSlug,
|
|
296
207
|
projectSlug,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/localDeployment.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logVerbose,\n logWarning,\n showSpinner,\n stopSpinner,\n} from \"../../../bundler/log.js\";\nimport { logAndHandleFetchError, ThrowingFetchError } from \"../utils/utils.js\";\nimport {\n bigBrainPause,\n bigBrainRecordActivity,\n bigBrainStart,\n} from \"./bigBrain.js\";\nimport {\n LocalDeploymentConfig,\n loadDeploymentConfig,\n loadDeploymentConfigFromDir,\n loadProjectLocalConfig,\n legacyDeploymentStateDir,\n rootDeploymentStateDir,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport {\n ensureBackendRunning,\n ensureBackendStopped,\n localDeploymentUrl,\n runLocalBackend,\n withRunningBackend,\n} from \"./run.js\";\nimport { handlePotentialUpgrade } from \"./upgrade.js\";\nimport { OnDeploymentActivityFunc } from \"../deployment.js\";\nimport { promptSearch } from \"../utils/prompts.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n chooseLocalBackendPorts,\n printLocalDeploymentWelcomeMessage,\n isOffline,\n LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./utils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { defaultEnvBackend } from \"../defaultEnv.js\";\nimport { deploymentEnvBackend, EnvVar } from \"../env.js\";\nimport { getProjectDetails } from \"../deploymentSelection.js\";\n\nexport type DeploymentDetails = {\n deploymentName: string;\n deploymentUrl: string;\n adminKey: string;\n reference: string | null;\n isDefault: boolean;\n onActivity: OnDeploymentActivityFunc;\n};\n\nexport async function handleLocalDeployment(\n ctx: Context,\n options: {\n teamSlug: string;\n projectSlug: string;\n ports: {\n cloud: number | undefined;\n site: number | undefined;\n };\n backendVersion?: string | undefined;\n forceUpgrade: boolean;\n },\n): Promise<DeploymentDetails> {\n if (await isOffline()) {\n return handleOffline(ctx, options);\n }\n\n const existingDeploymentForProject = await getExistingDeployment(ctx, {\n projectSlug: options.projectSlug,\n teamSlug: options.teamSlug,\n });\n const isFirstTime = existingDeploymentForProject === null;\n if (isFirstTime) {\n printLocalDeploymentWelcomeMessage();\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError();\n }\n });\n if (existingDeploymentForProject !== null) {\n logVerbose(`Found existing deployment for project ${options.projectSlug}`);\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: existingDeploymentForProject.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: existingDeploymentForProject.deploymentName,\n allowOtherDeployments: true,\n });\n }\n\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n allowedVersion: existingDeploymentForProject?.config.backendVersion,\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx, {\n requestedPorts: options.ports,\n suggestedPorts: existingDeploymentForProject?.config.ports,\n });\n const { deploymentName, adminKey, projectId } = await bigBrainStart(ctx, {\n port: cloudPort,\n projectSlug: options.projectSlug,\n teamSlug: options.teamSlug,\n instanceName: existingDeploymentForProject?.deploymentName ?? null,\n });\n const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {\n await ensureBackendRunning(ctx, {\n cloudPort,\n deploymentName,\n maxTimeSecs: 5,\n });\n if (isOffline) {\n return;\n }\n await bigBrainRecordActivity(ctx, {\n instanceName: deploymentName,\n });\n };\n\n const { cleanupHandle } = await handlePotentialUpgrade(ctx, {\n deploymentKind: \"local\",\n deploymentName,\n oldVersion: existingDeploymentForProject?.config.backendVersion ?? null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret: LOCAL_BACKEND_INSTANCE_SECRET,\n forceUpgrade: options.forceUpgrade,\n cloudProjectId: projectId,\n });\n\n if (isFirstTime) {\n await importDefaultEnvVars(ctx, {\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n adminKey,\n });\n }\n\n // Periodically report activity to BigBrain every 60 seconds.\n // Uses self-scheduling setTimeout to avoid overlapping requests.\n let activityTimeout: ReturnType<typeof setTimeout> | null = null;\n const scheduleActivityPing = () => {\n activityTimeout = setTimeout(async () => {\n try {\n await bigBrainRecordActivity(ctx, {\n instanceName: deploymentName,\n });\n } catch {\n // Best-effort: don't crash on failed pings\n }\n scheduleActivityPing();\n }, 60_000);\n };\n scheduleActivityPing();\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n if (activityTimeout !== null) {\n clearTimeout(activityTimeout);\n }\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n await bigBrainPause(ctx, {\n projectSlug: options.projectSlug,\n teamSlug: options.teamSlug,\n });\n });\n\n return {\n adminKey,\n deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n reference: null,\n isDefault: false,\n onActivity,\n };\n}\n\nexport async function loadLocalDeploymentCredentials(\n ctx: Context,\n deploymentName: string,\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n adminKey: string;\n}> {\n const config = loadDeploymentConfig(ctx, \"local\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Failed to load deployment config - try running `npx convex dev --configure`\",\n });\n }\n return {\n deploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n adminKey: config.adminKey,\n };\n}\n\nasync function handleOffline(\n ctx: Context,\n options: {\n teamSlug: string;\n projectSlug: string;\n ports: { cloud: number | undefined; site: number | undefined };\n },\n): Promise<DeploymentDetails> {\n const { deploymentName, config } =\n await chooseFromExistingLocalDeployments(ctx);\n const { binaryPath } = await ensureBackendBinaryDownloaded(ctx, {\n kind: \"version\",\n version: config.backendVersion,\n });\n const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx, {\n requestedPorts: options.ports,\n // FIXME: This doesn\u2019t try to reuse the ports already assigned in the config.\n // Please update this if we ever support offline mode (currently this is dead code).\n });\n saveDeploymentConfig(ctx, \"local\", deploymentName, config);\n await runLocalBackend(ctx, {\n binaryPath,\n ports: { cloud: cloudPort, site: sitePort },\n deploymentName,\n deploymentKind: \"local\",\n instanceSecret: LOCAL_BACKEND_INSTANCE_SECRET,\n isLatestVersion: false,\n });\n return {\n adminKey: config.adminKey,\n deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n reference: null,\n isDefault: false,\n onActivity: async (isOffline: boolean, wasOffline: boolean) => {\n await ensureBackendRunning(ctx, {\n cloudPort,\n deploymentName,\n maxTimeSecs: 5,\n });\n if (isOffline) {\n return;\n }\n if (wasOffline) {\n await bigBrainStart(ctx, {\n port: cloudPort,\n projectSlug: options.projectSlug,\n teamSlug: options.teamSlug,\n instanceName: deploymentName,\n });\n }\n await bigBrainRecordActivity(ctx, {\n instanceName: deploymentName,\n });\n },\n };\n}\n\nasync function getExistingDeployment(\n ctx: Context,\n options: {\n projectSlug: string;\n teamSlug: string;\n },\n): Promise<{ deploymentName: string; config: LocalDeploymentConfig } | null> {\n const { projectSlug, teamSlug } = options;\n\n // Check project-local storage first - this is the new default location\n const projectLocal = loadProjectLocalConfig(ctx);\n if (projectLocal !== null) {\n // Verify this deployment is for the expected project (matches the naming pattern)\n const expectedPrefix = `local-${teamSlug.replace(/-/g, \"_\")}-${projectSlug.replace(/-/g, \"_\")}`;\n if (projectLocal.deploymentName.startsWith(expectedPrefix)) {\n return projectLocal;\n }\n logVerbose(\n `Project-local deployment ${projectLocal.deploymentName} doesn't match expected prefix ${expectedPrefix}`,\n );\n }\n\n // Fall back to checking legacy home directory\n const prefix = `local-${teamSlug.replace(/-/g, \"_\")}-${projectSlug.replace(/-/g, \"_\")}`;\n const legacyDeployments = await getLegacyLocalDeployments(ctx);\n const existingDeploymentForProject = legacyDeployments.find((d) =>\n d.deploymentName.startsWith(prefix),\n );\n if (existingDeploymentForProject === undefined) {\n return null;\n }\n return {\n deploymentName: existingDeploymentForProject.deploymentName,\n config: existingDeploymentForProject.config,\n };\n}\n\n/**\n * Get local deployments from the legacy home directory location.\n * This is used for backward compatibility and for listing deployments in offline mode.\n */\nasync function getLegacyLocalDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const dir = rootDeploymentStateDir(\"local\");\n if (!ctx.fs.exists(dir)) {\n return [];\n }\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => d.startsWith(\"local-\"));\n return deploymentNames.flatMap((deploymentName) => {\n const legacyDir = legacyDeploymentStateDir(\"local\", deploymentName);\n const config = loadDeploymentConfigFromDir(ctx, legacyDir);\n if (config !== null) {\n return [{ deploymentName, config }];\n }\n return [];\n });\n}\n\n/**\n * Get all local deployments from both project-local and legacy locations.\n */\nasync function getLocalDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const deployments: Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }> = [];\n\n // Check project-local storage\n const projectLocal = loadProjectLocalConfig(ctx);\n if (\n projectLocal !== null &&\n projectLocal.deploymentName.startsWith(\"local-\")\n ) {\n deployments.push(projectLocal);\n }\n\n // Also include legacy deployments (but avoid duplicates)\n const legacyDeployments = await getLegacyLocalDeployments(ctx);\n for (const legacy of legacyDeployments) {\n if (!deployments.some((d) => d.deploymentName === legacy.deploymentName)) {\n deployments.push(legacy);\n }\n }\n\n return deployments;\n}\n\nasync function chooseFromExistingLocalDeployments(ctx: Context): Promise<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n}> {\n const localDeployments = await getLocalDeployments(ctx);\n\n if (localDeployments.length === 0) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No local deployments found. Please run `npx convex dev` while online first.\",\n });\n }\n\n // Auto-select if there's only one deployment\n if (localDeployments.length === 1) {\n logVerbose(\n `Auto-selecting the only local deployment: ${localDeployments[0].deploymentName}`,\n );\n return localDeployments[0];\n }\n\n // Multiple deployments (legacy) - prompt user to choose\n return promptSearch(ctx, {\n message: \"Choose from an existing local deployment:\",\n choices: localDeployments.map((d) => ({\n name: d.deploymentName,\n value: d,\n })),\n });\n}\n\n/** Copies the default dev env vars from big brain the first time the local dev backend is started */\nexport async function importDefaultEnvVars(\n ctx: Context,\n {\n teamSlug,\n projectSlug,\n deploymentName,\n deploymentUrl,\n adminKey,\n }: {\n teamSlug: string;\n projectSlug: string;\n deploymentName: string;\n deploymentUrl: string;\n adminKey: string;\n },\n) {\n showSpinner(\"Importing default env vars...\");\n\n const project = await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug,\n projectSlug,\n });\n let defaults: EnvVar[];\n try {\n defaults = await defaultEnvBackend(ctx, project.id, \"dev\").list();\n } catch (err) {\n if (err instanceof ThrowingFetchError && err.response.status === 403) {\n stopSpinner();\n logWarning(\n `Skipping default env var import: ${err.serverErrorData?.message ?? err.message}`,\n );\n return;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n if (defaults.length === 0) {\n logFinishedStep(\"No default env vars to import.\");\n return;\n }\n\n const deployment = {\n deploymentUrl,\n deploymentFields: {\n deploymentName,\n deploymentType: \"local\" as const,\n projectSlug,\n teamSlug,\n reference: null,\n isDefault: false,\n },\n };\n\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n await deploymentEnvBackend(ctx, { deploymentUrl, adminKey }).update(\n defaults.map((v) => ({ name: v.name, value: v.value })),\n );\n logFinishedStep(\n `Imported ${defaults.length} environment ${defaults.length === 1 ? \"variable\" : \"variables\"} from default environment variables: ${defaults.map((v) => v.name).join(\", \")}`,\n );\n },\n });\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAMO;AACP,mBAA2D;AAC3D,sBAIO;AACP,
|
|
6
|
-
"names": ["import_utils"
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logVerbose,\n logWarning,\n showSpinner,\n stopSpinner,\n} from \"../../../bundler/log.js\";\nimport { logAndHandleFetchError, ThrowingFetchError } from \"../utils/utils.js\";\nimport {\n bigBrainPause,\n bigBrainRecordActivity,\n bigBrainStart,\n} from \"./bigBrain.js\";\nimport {\n LocalDeploymentConfig,\n loadDeploymentConfig,\n loadDeploymentConfigFromDir,\n loadProjectLocalConfig,\n legacyDeploymentStateDir,\n rootDeploymentStateDir,\n} from \"./filePaths.js\";\nimport {\n ensureBackendStopped,\n localDeploymentUrl,\n withRunningBackend,\n} from \"./run.js\";\nimport { handlePotentialUpgradeAndStart } from \"./upgrade.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n chooseLocalBackendPorts,\n printLocalDeploymentWelcomeMessage,\n} from \"./utils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { defaultEnvBackend } from \"../defaultEnv.js\";\nimport { deploymentEnvBackend, EnvVar } from \"../env.js\";\nimport { getProjectDetails } from \"../deploymentSelection.js\";\nimport { DeploymentDetails } from \"../deployment.js\";\nimport { LEGACY_LOCAL_BACKEND_INSTANCE_SECRET } from \"./secrets.js\";\n\nexport async function handleLocalDeployment(\n ctx: Context,\n options: {\n teamSlug: string;\n projectSlug: string;\n ports: {\n cloud: number | undefined;\n site: number | undefined;\n };\n backendVersion?: string | undefined;\n forceUpgrade: boolean;\n },\n): Promise<DeploymentDetails> {\n const existingDeploymentForProject = await getExistingDeployment(ctx, {\n projectSlug: options.projectSlug,\n teamSlug: options.teamSlug,\n });\n const isFirstTime = existingDeploymentForProject === null;\n if (isFirstTime) {\n printLocalDeploymentWelcomeMessage();\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError();\n }\n });\n if (existingDeploymentForProject !== null) {\n logVerbose(`Found existing deployment for project ${options.projectSlug}`);\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: existingDeploymentForProject.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: existingDeploymentForProject.deploymentName,\n allowOtherDeployments: true,\n });\n }\n\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n allowedVersion: existingDeploymentForProject?.config.backendVersion,\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx, {\n requestedPorts: options.ports,\n suggestedPorts: existingDeploymentForProject?.config.ports,\n });\n const { deploymentName, projectId } = await bigBrainStart(ctx, {\n port: cloudPort,\n projectSlug: options.projectSlug,\n teamSlug: options.teamSlug,\n instanceName: existingDeploymentForProject?.deploymentName ?? null,\n });\n\n const { cleanupHandle, adminKey } = await handlePotentialUpgradeAndStart(\n ctx,\n {\n deploymentKind: \"local\",\n deploymentName,\n oldVersion: existingDeploymentForProject?.config.backendVersion ?? null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n existingCredentials: existingDeploymentForProject?.config\n ? {\n adminKey: existingDeploymentForProject?.config.adminKey,\n instanceSecret:\n existingDeploymentForProject?.config.instanceSecret ??\n LEGACY_LOCAL_BACKEND_INSTANCE_SECRET,\n }\n : null,\n forceUpgrade: options.forceUpgrade,\n cloudProjectId: projectId,\n },\n );\n\n if (isFirstTime) {\n await importDefaultEnvVars(ctx, {\n teamSlug: options.teamSlug,\n projectSlug: options.projectSlug,\n deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n adminKey,\n });\n }\n\n // Periodically report activity to BigBrain every 60 seconds.\n // Uses self-scheduling setTimeout to avoid overlapping requests.\n let activityTimeout: ReturnType<typeof setTimeout> | null = null;\n let activityPingStopped = false;\n async function activityPing() {\n if (activityPingStopped) {\n return;\n }\n try {\n await bigBrainRecordActivity(ctx, {\n instanceName: deploymentName,\n adminKey,\n });\n } catch {\n // Best-effort: don't crash on failed pings\n }\n\n if (activityPingStopped) {\n return;\n }\n activityTimeout = setTimeout(async () => {\n void activityPing();\n }, 60_000);\n }\n void activityPing();\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n activityPingStopped = true;\n if (activityTimeout !== null) {\n clearTimeout(activityTimeout);\n }\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n await bigBrainPause(ctx, {\n projectSlug: options.projectSlug,\n teamSlug: options.teamSlug,\n });\n });\n\n return {\n adminKey,\n deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n reference: null,\n isDefault: false,\n };\n}\n\nexport async function loadLocalDeploymentCredentials(\n ctx: Context,\n deploymentName: string,\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n adminKey: string;\n}> {\n const config = loadDeploymentConfig(ctx, \"local\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Failed to load deployment config - try running `npx convex dev --configure`\",\n });\n }\n return {\n deploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n adminKey: config.adminKey,\n };\n}\n\nasync function getExistingDeployment(\n ctx: Context,\n options: {\n projectSlug: string;\n teamSlug: string;\n },\n): Promise<{ deploymentName: string; config: LocalDeploymentConfig } | null> {\n const { projectSlug, teamSlug } = options;\n\n // Check project-local storage first - this is the new default location\n const projectLocal = loadProjectLocalConfig(ctx);\n if (projectLocal !== null) {\n // Verify this deployment is for the expected project (matches the naming pattern)\n const expectedPrefix = `local-${teamSlug.replace(/-/g, \"_\")}-${projectSlug.replace(/-/g, \"_\")}`;\n if (projectLocal.deploymentName.startsWith(expectedPrefix)) {\n return projectLocal;\n }\n logVerbose(\n `Project-local deployment ${projectLocal.deploymentName} doesn't match expected prefix ${expectedPrefix}`,\n );\n }\n\n // Fall back to checking legacy home directory\n const prefix = `local-${teamSlug.replace(/-/g, \"_\")}-${projectSlug.replace(/-/g, \"_\")}`;\n const legacyDeployments = await getLegacyLocalDeployments(ctx);\n const existingDeploymentForProject = legacyDeployments.find((d) =>\n d.deploymentName.startsWith(prefix),\n );\n if (existingDeploymentForProject === undefined) {\n return null;\n }\n return {\n deploymentName: existingDeploymentForProject.deploymentName,\n config: existingDeploymentForProject.config,\n };\n}\n\n/**\n * Get local deployments from the legacy home directory location.\n * This is used for backward compatibility and for listing deployments in offline mode.\n */\nasync function getLegacyLocalDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const dir = rootDeploymentStateDir(\"local\");\n if (!ctx.fs.exists(dir)) {\n return [];\n }\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => d.startsWith(\"local-\"));\n return deploymentNames.flatMap((deploymentName) => {\n const legacyDir = legacyDeploymentStateDir(\"local\", deploymentName);\n const config = loadDeploymentConfigFromDir(ctx, legacyDir);\n if (config !== null) {\n return [{ deploymentName, config }];\n }\n return [];\n });\n}\n\n/** Copies the default dev env vars from big brain the first time the local dev backend is started */\nexport async function importDefaultEnvVars(\n ctx: Context,\n {\n teamSlug,\n projectSlug,\n deploymentName,\n deploymentUrl,\n adminKey,\n }: {\n teamSlug: string;\n projectSlug: string;\n deploymentName: string;\n deploymentUrl: string;\n adminKey: string;\n },\n) {\n showSpinner(\"Importing default env vars...\");\n\n const project = await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug,\n projectSlug,\n });\n let defaults: EnvVar[];\n try {\n defaults = await defaultEnvBackend(ctx, project.id, \"dev\").list();\n } catch (err) {\n if (err instanceof ThrowingFetchError && err.response.status === 403) {\n stopSpinner();\n logWarning(\n `Skipping default env var import: ${err.serverErrorData?.message ?? err.message}`,\n );\n return;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n if (defaults.length === 0) {\n logFinishedStep(\"No default env vars to import.\");\n return;\n }\n\n const deployment = {\n deploymentUrl,\n deploymentFields: {\n deploymentName,\n deploymentType: \"local\" as const,\n projectSlug,\n teamSlug,\n reference: null,\n isDefault: false,\n },\n };\n\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n await deploymentEnvBackend(ctx, { deploymentUrl, adminKey }).update(\n defaults.map((v) => ({ name: v.name, value: v.value })),\n );\n logFinishedStep(\n `Imported ${defaults.length} environment ${defaults.length === 1 ? \"variable\" : \"variables\"} from default environment variables: ${defaults.map((v) => v.name).join(\", \")}`,\n );\n },\n });\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,iBAMO;AACP,mBAA2D;AAC3D,sBAIO;AACP,uBAOO;AACP,iBAIO;AACP,qBAA+C;AAC/C,oBAAkE;AAClE,IAAAA,gBAGO;AACP,sBAA8C;AAC9C,wBAAkC;AAClC,iBAA6C;AAC7C,iCAAkC;AAElC,qBAAqD;AAErD,eAAsB,sBACpB,KACA,SAU4B;AAC5B,QAAM,+BAA+B,MAAM,sBAAsB,KAAK;AAAA,IACpE,aAAa,QAAQ;AAAA,IACrB,UAAU,QAAQ;AAAA,EACpB,CAAC;AACD,QAAM,cAAc,iCAAiC;AACrD,MAAI,aAAa;AACf,0DAAmC;AAAA,EACrC;AACA,MAAI,gBAAgB,OAAO,WAAW,QAAQ;AAC5C,QAAI,eAAe,oCAAsB;AACvC,qDAA4B;AAAA,IAC9B;AAAA,EACF,CAAC;AACD,MAAI,iCAAiC,MAAM;AACzC,+BAAW,yCAAyC,QAAQ,WAAW,EAAE;AAIzE,cAAM,iCAAqB,KAAK;AAAA,MAC9B,OAAO;AAAA,QACL,OAAO,6BAA6B,OAAO,MAAM;AAAA,MACnD;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB,6BAA6B;AAAA,MAC7C,uBAAuB;AAAA,IACzB,CAAC;AAAA,EACH;AAEA,QAAM,EAAE,YAAY,QAAQ,IAAI,UAAM;AAAA,IACpC;AAAA,IACA,QAAQ,mBAAmB,SACvB;AAAA,MACE,MAAM;AAAA,MACN,gBAAgB,8BAA8B,OAAO;AAAA,IACvD,IACA,EAAE,MAAM,WAAW,SAAS,QAAQ,eAAe;AAAA,EACzD;AACA,QAAM,EAAE,WAAW,SAAS,IAAI,UAAM,uCAAwB,KAAK;AAAA,IACjE,gBAAgB,QAAQ;AAAA,IACxB,gBAAgB,8BAA8B,OAAO;AAAA,EACvD,CAAC;AACD,QAAM,EAAE,gBAAgB,UAAU,IAAI,UAAM,+BAAc,KAAK;AAAA,IAC7D,MAAM;AAAA,IACN,aAAa,QAAQ;AAAA,IACrB,UAAU,QAAQ;AAAA,IAClB,cAAc,8BAA8B,kBAAkB;AAAA,EAChE,CAAC;AAED,QAAM,EAAE,eAAe,SAAS,IAAI,UAAM;AAAA,IACxC;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,MAChB;AAAA,MACA,YAAY,8BAA8B,OAAO,kBAAkB;AAAA,MACnE,eAAe;AAAA,MACf,YAAY;AAAA,MACZ,OAAO,EAAE,OAAO,WAAW,MAAM,SAAS;AAAA,MAC1C,qBAAqB,8BAA8B,SAC/C;AAAA,QACE,UAAU,8BAA8B,OAAO;AAAA,QAC/C,gBACE,8BAA8B,OAAO,kBACrC;AAAA,MACJ,IACA;AAAA,MACJ,cAAc,QAAQ;AAAA,MACtB,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,aAAa;AACf,UAAM,qBAAqB,KAAK;AAAA,MAC9B,UAAU,QAAQ;AAAA,MAClB,aAAa,QAAQ;AAAA,MACrB;AAAA,MACA,mBAAe,+BAAmB,SAAS;AAAA,MAC3C;AAAA,IACF,CAAC;AAAA,EACH;AAIA,MAAI,kBAAwD;AAC5D,MAAI,sBAAsB;AAC1B,iBAAe,eAAe;AAC5B,QAAI,qBAAqB;AACvB;AAAA,IACF;AACA,QAAI;AACF,gBAAM,wCAAuB,KAAK;AAAA,QAChC,cAAc;AAAA,QACd;AAAA,MACF,CAAC;AAAA,IACH,QAAQ;AAAA,IAER;AAEA,QAAI,qBAAqB;AACvB;AAAA,IACF;AACA,sBAAkB,WAAW,YAAY;AACvC,WAAK,aAAa;AAAA,IACpB,GAAG,GAAM;AAAA,EACX;AACA,OAAK,aAAa;AAElB,QAAM,cAAc,IAAI,cAAc,aAAa;AACnD,MAAI,gBAAgB,OAAO,UAAU,QAAQ;AAC3C,0BAAsB;AACtB,QAAI,oBAAoB,MAAM;AAC5B,mBAAa,eAAe;AAAA,IAC9B;AACA,QAAI,gBAAgB,MAAM;AACxB,YAAM,YAAY,UAAU,GAAG;AAAA,IACjC;AACA,cAAM,+BAAc,KAAK;AAAA,MACvB,aAAa,QAAQ;AAAA,MACrB,UAAU,QAAQ;AAAA,IACpB,CAAC;AAAA,EACH,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,mBAAe,+BAAmB,SAAS;AAAA,IAC3C,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AACF;AAEA,eAAsB,+BACpB,KACA,gBAKC;AACD,QAAM,aAAS,uCAAqB,KAAK,SAAS,cAAc;AAChE,MAAI,WAAW,MAAM;AACnB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBACE;AAAA,IACJ,CAAC;AAAA,EACH;AACA,SAAO;AAAA,IACL;AAAA,IACA,mBAAe,+BAAmB,OAAO,MAAM,KAAK;AAAA,IACpD,UAAU,OAAO;AAAA,EACnB;AACF;AAEA,eAAe,sBACb,KACA,SAI2E;AAC3E,QAAM,EAAE,aAAa,SAAS,IAAI;AAGlC,QAAM,mBAAe,yCAAuB,GAAG;AAC/C,MAAI,iBAAiB,MAAM;AAEzB,UAAM,iBAAiB,SAAS,SAAS,QAAQ,MAAM,GAAG,CAAC,IAAI,YAAY,QAAQ,MAAM,GAAG,CAAC;AAC7F,QAAI,aAAa,eAAe,WAAW,cAAc,GAAG;AAC1D,aAAO;AAAA,IACT;AACA;AAAA,MACE,4BAA4B,aAAa,cAAc,kCAAkC,cAAc;AAAA,IACzG;AAAA,EACF;AAGA,QAAM,SAAS,SAAS,SAAS,QAAQ,MAAM,GAAG,CAAC,IAAI,YAAY,QAAQ,MAAM,GAAG,CAAC;AACrF,QAAM,oBAAoB,MAAM,0BAA0B,GAAG;AAC7D,QAAM,+BAA+B,kBAAkB;AAAA,IAAK,CAAC,MAC3D,EAAE,eAAe,WAAW,MAAM;AAAA,EACpC;AACA,MAAI,iCAAiC,QAAW;AAC9C,WAAO;AAAA,EACT;AACA,SAAO;AAAA,IACL,gBAAgB,6BAA6B;AAAA,IAC7C,QAAQ,6BAA6B;AAAA,EACvC;AACF;AAMA,eAAe,0BAA0B,KAKvC;AACA,QAAM,UAAM,yCAAuB,OAAO;AAC1C,MAAI,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG;AACvB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,kBAAkB,IAAI,GACzB,QAAQ,GAAG,EACX,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,OAAO,CAAC,MAAM,EAAE,WAAW,QAAQ,CAAC;AACvC,SAAO,gBAAgB,QAAQ,CAAC,mBAAmB;AACjD,UAAM,gBAAY,2CAAyB,SAAS,cAAc;AAClE,UAAM,aAAS,8CAA4B,KAAK,SAAS;AACzD,QAAI,WAAW,MAAM;AACnB,aAAO,CAAC,EAAE,gBAAgB,OAAO,CAAC;AAAA,IACpC;AACA,WAAO,CAAC;AAAA,EACV,CAAC;AACH;AAGA,eAAsB,qBACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOA;AACA,8BAAY,+BAA+B;AAE3C,QAAM,UAAU,UAAM,8CAAkB,KAAK;AAAA,IAC3C,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,CAAC;AACD,MAAI;AACJ,MAAI;AACF,eAAW,UAAM,qCAAkB,KAAK,QAAQ,IAAI,KAAK,EAAE,KAAK;AAAA,EAClE,SAAS,KAAK;AACZ,QAAI,eAAe,mCAAsB,IAAI,SAAS,WAAW,KAAK;AACpE,kCAAY;AACZ;AAAA,QACE,oCAAoC,IAAI,iBAAiB,WAAW,IAAI,OAAO;AAAA,MACjF;AACA;AAAA,IACF;AACA,WAAO,UAAM,qCAAuB,KAAK,GAAG;AAAA,EAC9C;AACA,MAAI,SAAS,WAAW,GAAG;AACzB,oCAAgB,gCAAgC;AAChD;AAAA,EACF;AAEA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA,kBAAkB;AAAA,MAChB;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,EACF;AAEA,YAAM,+BAAmB;AAAA,IACvB;AAAA,IACA;AAAA,IACA,QAAQ,YAAY;AAClB,gBAAM,iCAAqB,KAAK,EAAE,eAAe,SAAS,CAAC,EAAE;AAAA,QAC3D,SAAS,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,EAAE,MAAM,EAAE;AAAA,MACxD;AACA;AAAA,QACE,YAAY,SAAS,MAAM,gBAAgB,SAAS,WAAW,IAAI,aAAa,WAAW,wCAAwC,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,MAC3K;AAAA,IACF;AAAA,EACF,CAAC;AACH;",
|
|
6
|
+
"names": ["import_utils"]
|
|
7
7
|
}
|