convex 1.34.1 → 1.35.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 +86 -43
- package/dist/browser.bundle.js +8 -2
- package/dist/browser.bundle.js.map +3 -3
- package/dist/cjs/browser/index-node.js +3 -1
- package/dist/cjs/browser/index.js +3 -1
- package/dist/cjs/browser/index.js.map +2 -2
- package/dist/cjs/browser/query_options.js.map +2 -2
- package/dist/cjs/cli/aiFiles.js +31 -13
- package/dist/cjs/cli/aiFiles.js.map +3 -3
- package/dist/cjs/cli/codegen_templates/readme.js +14 -1
- package/dist/cjs/cli/codegen_templates/readme.js.map +2 -2
- package/dist/cjs/cli/configure.js +21 -24
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/deploy.js +7 -8
- package/dist/cjs/cli/deploy.js.map +2 -2
- package/dist/cjs/cli/deploymentCreate.js +225 -40
- package/dist/cjs/cli/deploymentCreate.js.map +3 -3
- package/dist/cjs/cli/deploymentSelect.js +14 -13
- package/dist/cjs/cli/deploymentSelect.js.map +2 -2
- package/dist/cjs/cli/dev.js +30 -11
- package/dist/cjs/cli/dev.js.map +2 -2
- package/dist/cjs/cli/docs.js +1 -1
- package/dist/cjs/cli/docs.js.map +2 -2
- package/dist/cjs/cli/init.js +1 -1
- package/dist/cjs/cli/init.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/agentsmd.js +14 -10
- package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/claudemd.js +14 -10
- package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +10 -3
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/index.js +70 -86
- package/dist/cjs/cli/lib/aiFiles/index.js.map +3 -3
- package/dist/cjs/cli/lib/aiFiles/skills.js +28 -12
- package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/state.js +96 -0
- package/dist/cjs/cli/lib/aiFiles/state.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/status.js +31 -28
- package/dist/cjs/cli/lib/aiFiles/status.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/utils.js +31 -14
- package/dist/cjs/cli/lib/aiFiles/utils.js.map +2 -2
- package/dist/cjs/cli/lib/api.js +70 -7
- package/dist/cjs/cli/lib/api.js.map +2 -2
- package/dist/cjs/cli/lib/command.js +4 -5
- package/dist/cjs/cli/lib/command.js.map +2 -2
- package/dist/cjs/cli/lib/config.js +41 -4
- package/dist/cjs/cli/lib/config.js.map +3 -3
- package/dist/cjs/cli/lib/deploy2.js +9 -26
- package/dist/cjs/cli/lib/deploy2.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/componentDefinition.js +4 -1
- package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelection.js +45 -2
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelector.js +1 -0
- package/dist/cjs/cli/lib/deploymentSelector.js.map +2 -2
- package/dist/cjs/cli/lib/dev.js +162 -117
- package/dist/cjs/cli/lib/dev.js.map +2 -2
- package/dist/cjs/cli/lib/env.js +1 -13
- package/dist/cjs/cli/lib/env.js.map +2 -2
- package/dist/cjs/cli/lib/expiration.js +104 -0
- package/dist/cjs/cli/lib/expiration.js.map +7 -0
- package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/init.js +4 -3
- package/dist/cjs/cli/lib/init.js.map +2 -2
- package/dist/cjs/cli/lib/insights.js +1 -1
- package/dist/cjs/cli/lib/insights.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/anonymous.js +14 -7
- package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js +8 -10
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/run.js +1 -0
- package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/upgrade.js +2 -2
- package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/utils.js +9 -0
- package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/cjs/cli/lib/mcp/tools/status.js +1 -1
- package/dist/cjs/cli/lib/mcp/tools/status.js.map +2 -2
- package/dist/cjs/cli/lib/updates.js +8 -9
- package/dist/cjs/cli/lib/updates.js.map +2 -2
- package/dist/cjs/cli/lib/usage.js +2 -1
- package/dist/cjs/cli/lib/usage.js.map +2 -2
- package/dist/cjs/cli/lib/utils/prompts.js +2 -1
- package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
- package/dist/cjs/cli/lib/utils/utils.js +46 -20
- package/dist/cjs/cli/lib/utils/utils.js.map +3 -3
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react/client.js +43 -6
- package/dist/cjs/react/client.js.map +2 -2
- package/dist/cjs/react/index.js +2 -0
- package/dist/cjs/react/index.js.map +2 -2
- package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +1 -1
- package/dist/cjs/server/api.js.map +2 -2
- package/dist/cjs/server/components/definition.js.map +1 -1
- package/dist/cjs/server/components/index.js +40 -4
- package/dist/cjs/server/components/index.js.map +2 -2
- package/dist/cjs/server/data_model.js.map +1 -1
- package/dist/cjs/server/impl/meta_impl.js +78 -0
- package/dist/cjs/server/impl/meta_impl.js.map +7 -0
- package/dist/cjs/server/impl/registration_impl.js +16 -11
- 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 +17 -0
- package/dist/cjs/server/meta.js.map +7 -0
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs-types/browser/index.d.ts +1 -0
- package/dist/cjs-types/browser/index.d.ts.map +1 -1
- package/dist/cjs-types/browser/query_options.d.ts +12 -9
- package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
- package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/readme.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.test.d.ts +2 -0
- package/dist/cjs-types/cli/configure.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentCreate.d.ts +1 -0
- package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentSelect.d.ts +2 -1
- package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.d.ts +3 -1
- package/dist/cjs-types/cli/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +20 -18
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +6 -4
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/state.d.ts +38 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +4 -1
- package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +13 -3
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/api.d.ts +3 -3
- package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/command.d.ts +2 -1
- package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/config.d.ts +17 -6
- package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploy2.d.ts +5 -2
- package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
- package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
- package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +14 -14
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +61 -52
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelector.d.ts +2 -0
- package/dist/cjs-types/cli/lib/deploymentSelector.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/env.d.ts +0 -4
- package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/expiration.d.ts +35 -0
- package/dist/cjs-types/cli/lib/expiration.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/expiration.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/expiration.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +15 -0
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +7 -0
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/requestContext.d.ts +3 -3
- package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +2 -2
- package/dist/cjs-types/cli/lib/updates.d.ts +4 -3
- package/dist/cjs-types/cli/lib/updates.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/usage.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/prompts.d.ts +1 -0
- package/dist/cjs-types/cli/lib/utils/prompts.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/utils.d.ts +16 -2
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/react/client.d.ts +54 -2
- package/dist/cjs-types/react/client.d.ts.map +1 -1
- package/dist/cjs-types/react/index.d.ts +7 -2
- package/dist/cjs-types/react/index.d.ts.map +1 -1
- package/dist/cjs-types/react/use_query_object_options.test.d.ts +5 -0
- package/dist/cjs-types/react/use_query_object_options.test.d.ts.map +1 -0
- package/dist/cjs-types/react/use_query_result.test.d.ts +5 -0
- package/dist/cjs-types/react/use_query_result.test.d.ts.map +1 -0
- package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
- package/dist/cjs-types/server/api.d.ts +5 -1
- package/dist/cjs-types/server/api.d.ts.map +1 -1
- package/dist/cjs-types/server/components/definition.d.ts +1 -0
- package/dist/cjs-types/server/components/definition.d.ts.map +1 -1
- package/dist/cjs-types/server/components/index.d.ts +5 -1
- package/dist/cjs-types/server/components/index.d.ts.map +1 -1
- package/dist/cjs-types/server/data_model.d.ts +2 -1
- package/dist/cjs-types/server/data_model.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/meta_impl.d.ts +5 -0
- package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -0
- package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +1 -0
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +72 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -0
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +1670 -1214
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/browser/index-node.js +1 -0
- package/dist/esm/browser/index.js +1 -0
- package/dist/esm/browser/index.js.map +2 -2
- package/dist/esm/browser/query_options.js.map +2 -2
- package/dist/esm/cli/aiFiles.js +33 -15
- package/dist/esm/cli/aiFiles.js.map +2 -2
- package/dist/esm/cli/codegen_templates/readme.js +14 -1
- package/dist/esm/cli/codegen_templates/readme.js.map +2 -2
- package/dist/esm/cli/configure.js +23 -26
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/deploy.js +11 -10
- package/dist/esm/cli/deploy.js.map +2 -2
- package/dist/esm/cli/deploymentCreate.js +238 -42
- package/dist/esm/cli/deploymentCreate.js.map +2 -2
- package/dist/esm/cli/deploymentSelect.js +13 -12
- package/dist/esm/cli/deploymentSelect.js.map +2 -2
- package/dist/esm/cli/dev.js +34 -13
- package/dist/esm/cli/dev.js.map +2 -2
- package/dist/esm/cli/docs.js +1 -1
- package/dist/esm/cli/docs.js.map +2 -2
- package/dist/esm/cli/init.js +2 -2
- package/dist/esm/cli/init.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/agentsmd.js +13 -9
- package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/claudemd.js +13 -9
- package/dist/esm/cli/lib/aiFiles/claudemd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +12 -5
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/index.js +72 -89
- package/dist/esm/cli/lib/aiFiles/index.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/skills.js +29 -13
- package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/state.js +60 -0
- package/dist/esm/cli/lib/aiFiles/state.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/status.js +32 -29
- package/dist/esm/cli/lib/aiFiles/status.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/utils.js +25 -10
- package/dist/esm/cli/lib/aiFiles/utils.js.map +2 -2
- package/dist/esm/cli/lib/api.js +70 -7
- package/dist/esm/cli/lib/api.js.map +2 -2
- package/dist/esm/cli/lib/command.js +4 -5
- package/dist/esm/cli/lib/command.js.map +2 -2
- package/dist/esm/cli/lib/config.js +39 -3
- package/dist/esm/cli/lib/config.js.map +2 -2
- package/dist/esm/cli/lib/deploy2.js +13 -26
- package/dist/esm/cli/lib/deploy2.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/componentDefinition.js +4 -1
- package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelection.js +46 -2
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelector.js +1 -0
- package/dist/esm/cli/lib/deploymentSelector.js.map +2 -2
- package/dist/esm/cli/lib/dev.js +162 -118
- package/dist/esm/cli/lib/dev.js.map +2 -2
- package/dist/esm/cli/lib/env.js +0 -11
- package/dist/esm/cli/lib/env.js.map +2 -2
- package/dist/esm/cli/lib/expiration.js +80 -0
- package/dist/esm/cli/lib/expiration.js.map +7 -0
- package/dist/esm/cli/lib/init.js +4 -3
- package/dist/esm/cli/lib/init.js.map +2 -2
- package/dist/esm/cli/lib/insights.js +1 -1
- package/dist/esm/cli/lib/insights.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/anonymous.js +16 -9
- package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/localDeployment.js +9 -11
- package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/run.js +1 -1
- package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/upgrade.js +2 -2
- package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/utils.js +8 -0
- package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/esm/cli/lib/mcp/tools/status.js +1 -1
- package/dist/esm/cli/lib/mcp/tools/status.js.map +2 -2
- package/dist/esm/cli/lib/updates.js +11 -9
- package/dist/esm/cli/lib/updates.js.map +2 -2
- package/dist/esm/cli/lib/usage.js +2 -1
- package/dist/esm/cli/lib/usage.js.map +2 -2
- package/dist/esm/cli/lib/utils/prompts.js +2 -1
- package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
- package/dist/esm/cli/lib/utils/utils.js +45 -20
- package/dist/esm/cli/lib/utils/utils.js.map +3 -3
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/client.js +43 -6
- package/dist/esm/react/client.js.map +2 -2
- package/dist/esm/react/index.js +1 -0
- package/dist/esm/react/index.js.map +2 -2
- package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +1 -1
- package/dist/esm/server/api.js.map +2 -2
- package/dist/esm/server/components/index.js +40 -4
- package/dist/esm/server/components/index.js.map +2 -2
- package/dist/esm/server/impl/meta_impl.js +54 -0
- package/dist/esm/server/impl/meta_impl.js.map +7 -0
- package/dist/esm/server/impl/registration_impl.js +20 -11
- package/dist/esm/server/impl/registration_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm/server/meta.js +2 -0
- package/dist/esm/server/meta.js.map +7 -0
- package/dist/esm-types/browser/index.d.ts +1 -0
- package/dist/esm-types/browser/index.d.ts.map +1 -1
- package/dist/esm-types/browser/query_options.d.ts +12 -9
- package/dist/esm-types/browser/query_options.d.ts.map +1 -1
- package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen_templates/readme.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.test.d.ts +2 -0
- package/dist/esm-types/cli/configure.test.d.ts.map +1 -0
- package/dist/esm-types/cli/deploy.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentCreate.d.ts +1 -0
- package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentSelect.d.ts +2 -1
- package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.d.ts +3 -1
- package/dist/esm-types/cli/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +5 -5
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +5 -5
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +3 -3
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts +20 -18
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +6 -4
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/state.d.ts +38 -0
- package/dist/esm-types/cli/lib/aiFiles/state.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/state.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/status.d.ts +4 -1
- package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +13 -3
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/utils.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/api.d.ts +3 -3
- package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/command.d.ts +2 -1
- package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/config.d.ts +17 -6
- package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploy2.d.ts +5 -2
- package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +27 -12
- package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +24 -24
- package/dist/esm-types/cli/lib/deployApi/modules.d.ts +14 -14
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +61 -52
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelector.d.ts +2 -0
- package/dist/esm-types/cli/lib/deploymentSelector.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/env.d.ts +0 -4
- package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/expiration.d.ts +35 -0
- package/dist/esm-types/cli/lib/expiration.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/expiration.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/expiration.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +16 -1
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts +15 -0
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +7 -0
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/requestContext.d.ts +3 -3
- package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +2 -2
- package/dist/esm-types/cli/lib/updates.d.ts +4 -3
- package/dist/esm-types/cli/lib/updates.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/usage.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/prompts.d.ts +1 -0
- package/dist/esm-types/cli/lib/utils/prompts.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/utils.d.ts +16 -2
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/react/client.d.ts +54 -2
- package/dist/esm-types/react/client.d.ts.map +1 -1
- package/dist/esm-types/react/index.d.ts +7 -2
- package/dist/esm-types/react/index.d.ts.map +1 -1
- package/dist/esm-types/react/use_query_object_options.test.d.ts +5 -0
- package/dist/esm-types/react/use_query_object_options.test.d.ts.map +1 -0
- package/dist/esm-types/react/use_query_result.test.d.ts +5 -0
- package/dist/esm-types/react/use_query_result.test.d.ts.map +1 -0
- package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -1
- package/dist/esm-types/server/api.d.ts +5 -1
- package/dist/esm-types/server/api.d.ts.map +1 -1
- package/dist/esm-types/server/components/definition.d.ts +1 -0
- package/dist/esm-types/server/components/definition.d.ts.map +1 -1
- package/dist/esm-types/server/components/index.d.ts +5 -1
- package/dist/esm-types/server/components/index.d.ts.map +1 -1
- package/dist/esm-types/server/data_model.d.ts +2 -1
- package/dist/esm-types/server/data_model.d.ts.map +1 -1
- package/dist/esm-types/server/impl/meta_impl.d.ts +5 -0
- package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -0
- package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +1 -0
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +72 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -0
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/react.bundle.js +50 -7
- package/dist/react.bundle.js.map +3 -3
- package/package.json +11 -7
- package/schemas/convex.schema.json +15 -2
- package/src/browser/index.ts +3 -0
- package/src/browser/query_options.test.ts +0 -9
- package/src/browser/query_options.ts +36 -15
- package/src/cli/aiFiles.ts +44 -14
- package/src/cli/codegen_templates/readme.ts +14 -1
- package/src/cli/configure.test.ts +138 -0
- package/src/cli/configure.ts +48 -47
- package/src/cli/deploy.ts +12 -9
- package/src/cli/deploymentCreate.test.ts +349 -14
- package/src/cli/deploymentCreate.ts +268 -41
- package/src/cli/deploymentSelect.test.ts +136 -27
- package/src/cli/deploymentSelect.ts +50 -41
- package/src/cli/deploymentSelection.test.ts +343 -35
- package/src/cli/dev.ts +49 -14
- package/src/cli/docs.ts +1 -1
- package/src/cli/init.ts +2 -2
- package/src/cli/lib/aiFiles/agentsmd.ts +15 -11
- package/src/cli/lib/aiFiles/claudemd.ts +15 -11
- package/src/cli/lib/aiFiles/guidelinesmd.test.ts +12 -2
- package/src/cli/lib/aiFiles/guidelinesmd.ts +15 -7
- package/src/cli/lib/aiFiles/index.test.ts +188 -222
- package/src/cli/lib/aiFiles/index.ts +119 -125
- package/src/cli/lib/aiFiles/integration.test.ts +112 -45
- package/src/cli/lib/aiFiles/prompt.test.ts +6 -6
- package/src/cli/lib/aiFiles/skills.ts +46 -16
- package/src/cli/lib/aiFiles/state.test.ts +280 -0
- package/src/cli/lib/aiFiles/state.ts +82 -0
- package/src/cli/lib/aiFiles/status.ts +45 -39
- package/src/cli/lib/aiFiles/utils.test.ts +50 -0
- package/src/cli/lib/aiFiles/utils.ts +38 -10
- package/src/cli/lib/api.ts +88 -7
- package/src/cli/lib/command.ts +12 -7
- package/src/cli/lib/config.test.ts +184 -7
- package/src/cli/lib/config.ts +67 -7
- package/src/cli/lib/deploy2.ts +14 -27
- package/src/cli/lib/deployApi/componentDefinition.ts +4 -1
- package/src/cli/lib/deploymentSelection.ts +59 -6
- package/src/cli/lib/deploymentSelector.test.ts +6 -0
- package/src/cli/lib/deploymentSelector.ts +2 -0
- package/src/cli/lib/dev.ts +202 -153
- package/src/cli/lib/env.ts +0 -15
- package/src/cli/lib/expiration.test.ts +159 -0
- package/src/cli/lib/expiration.ts +124 -0
- package/src/cli/lib/generatedFunctionLogsApi.ts +16 -1
- package/src/cli/lib/init.ts +6 -2
- package/src/cli/lib/insights.ts +1 -1
- package/src/cli/lib/localDeployment/anonymous.ts +19 -9
- package/src/cli/lib/localDeployment/localDeployment.ts +9 -11
- package/src/cli/lib/localDeployment/run.ts +1 -1
- package/src/cli/lib/localDeployment/upgrade.ts +12 -10
- package/src/cli/lib/localDeployment/utils.ts +12 -0
- package/src/cli/lib/mcp/tools/status.ts +1 -1
- package/src/cli/lib/updates.test.ts +102 -75
- package/src/cli/lib/updates.ts +14 -12
- package/src/cli/lib/usage.ts +3 -1
- package/src/cli/lib/utils/prompts.ts +2 -0
- package/src/cli/lib/utils/utils.test.ts +6 -6
- package/src/cli/lib/utils/utils.ts +66 -27
- package/src/index.ts +1 -1
- package/src/react/client.test.tsx +65 -0
- package/src/react/client.ts +129 -13
- package/src/react/index.ts +9 -1
- package/src/react/use_query_object_options.test.ts +50 -0
- package/src/react/use_query_result.test.ts +41 -0
- package/src/react-clerk/ConvexProviderWithClerk.test.tsx +1 -1
- package/src/react-clerk/ConvexProviderWithClerk.tsx +1 -1
- package/src/server/api.ts +5 -1
- package/src/server/components/definition.ts +3 -0
- package/src/server/components/index.ts +62 -5
- package/src/server/data_model.ts +2 -1
- package/src/server/impl/meta_impl.ts +74 -0
- package/src/server/impl/registration_impl.ts +21 -9
- package/src/server/index.ts +8 -0
- package/src/server/meta.ts +76 -0
- package/src/server/registration.ts +10 -0
- package/src/server/schema.test.ts +78 -1
- package/dist/cjs/cli/lib/aiFiles/config.js +0 -171
- package/dist/cjs/cli/lib/aiFiles/config.js.map +0 -7
- package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +0 -46
- package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts +0 -2
- package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
- package/dist/esm/cli/lib/aiFiles/config.js +0 -135
- package/dist/esm/cli/lib/aiFiles/config.js.map +0 -7
- package/dist/esm-types/cli/lib/aiFiles/config.d.ts +0 -46
- package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts +0 -2
- package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +0 -1
- package/src/cli/lib/aiFiles/config.test.ts +0 -460
- package/src/cli/lib/aiFiles/config.ts +0 -188
- package/src/values/.claude/settings.local.json +0 -10
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/deploy.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Command, Option } from \"@commander-js/extra-typings\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, logMessage, showSpinner } from \"../bundler/log.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport {\n gitBranchFromEnvironment,\n isNonProdBuildEnvironment,\n suggestedEnvVarNames,\n} from \"./lib/envvars.js\";\nimport { PushOptions } from \"./lib/components.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n bigBrainAPI,\n} from \"./lib/utils/utils.js\";\nimport { runFunctionAndLog } from \"./lib/run.js\";\nimport { usageStateWarning } from \"./lib/usage.js\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./lib/deployment.js\";\nimport { runPush } from \"./lib/components.js\";\nimport { promptYesNo } from \"./lib/utils/prompts.js\";\nimport { deployToDeployment, runCommand } from \"./lib/deploy2.js\";\nimport { getDeploymentSelection } from \"./lib/deploymentSelection.js\";\nimport { deploymentNameAndTypeFromSelection } from \"./lib/deploymentSelection.js\";\nimport { checkVersion } from \"./lib/updates.js\";\nimport { readProjectConfig, getAuthKitConfig } from \"./lib/config.js\";\nimport { ensureAuthKitProvisionedBeforeBuild } from \"./lib/workos/workos.js\";\nimport { DASHBOARD_HOST } from \"./lib/dashboard.js\";\nimport { extractDeploymentNameForWorkOS } from \"./lib/extractDeploymentNameForWorkOS.js\";\n\nexport const deploy = new Command(\"deploy\")\n .summary(\"Deploy to your prod deployment\")\n .description(\n \"Deploy to your deployment. By default, this deploys to your prod deployment.\\n\\n\" +\n `Deploys to a preview deployment if the \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\` environment variable is set to a Preview Deploy Key.`,\n )\n .allowExcessArguments(false)\n .addDeployOptions()\n .addOption(\n new Option(\n \"--preview-run <functionName>\",\n \"Function to run if deploying to a preview deployment. This is ignored if deploying to a production deployment.\",\n ),\n )\n .addOption(\n new Option(\n \"--preview-create <name>\",\n \"The name to associate with this deployment if deploying to a newly created preview deployment. Defaults to the current Git branch name in Vercel, Netlify and GitHub CI. This parameter can only be used with a preview deploy key (when used with another type of key, the command will return an error).\",\n ).conflicts(\"preview-name\"),\n )\n .addOption(\n new Option(\n \"--check-build-environment <mode>\",\n \"Whether to check for a non-production build environment before deploying to a production Convex deployment.\",\n )\n .choices([\"enable\", \"disable\"] as const)\n .default(\"enable\" as const)\n .hideHelp(),\n )\n // Hidden options to pass in admin key and url for tests and local development\n .addOption(new Option(\"--admin-key <adminKey>\").hideHelp())\n .addOption(new Option(\"--url <url>\").hideHelp())\n .addOption(\n new Option(\n \"--preview-name <name>\",\n \"[deprecated] Use `--preview-create` instead. The name to associate with this deployment if deploying to a preview deployment.\",\n )\n .hideHelp()\n .conflicts(\"preview-create\"),\n )\n .addOption(\n new Option(\n \"--env-file <envFile>\",\n `Path to a custom file of environment variables, for choosing the \\\ndeployment, e.g. ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} or ${CONVEX_SELF_HOSTED_URL_VAR_NAME}. \\\nSame format as .env.local or .env files, and overrides them.`,\n ),\n )\n .addOption(\n new Option(\n \"--skip-workos-check\",\n \"Skip WorkOS AuthKit provisioning and credential checks during deploy.\",\n ).hideHelp(),\n )\n .addOption(\n new Option(\"--allow-deleting-large-indexes\")\n .hideHelp()\n .conflicts(\"preview-create\")\n .conflicts(\"preview-name\"),\n )\n .showHelpAfterError()\n .action(async (cmdOptions) => {\n const ctx = await oneoffContext(cmdOptions);\n\n const deploymentSelection = await getDeploymentSelection(ctx, cmdOptions);\n if (\n cmdOptions.checkBuildEnvironment === \"enable\" &&\n isNonProdBuildEnvironment() &&\n deploymentSelection.kind === \"existingDeployment\" &&\n deploymentSelection.deploymentToActOn.source === \"deployKey\" &&\n deploymentSelection.deploymentToActOn.deploymentFields?.deploymentType ===\n \"prod\"\n ) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Detected a non-production build environment and \"${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\" for a production Convex deployment.\\n\n This is probably unintentional.\n `,\n });\n }\n\n if (deploymentSelection.kind === \"anonymous\") {\n logMessage(\n \"You are currently developing anonymously with a locally running project.\\n\" +\n \"To deploy your Convex app to the cloud, log in by running `npx convex login`.\\n\" +\n \"See https://docs.convex.dev/production for more information on how Convex cloud works and instructions on how to set up hosting.\",\n );\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: null,\n });\n }\n\n if (deploymentSelection.kind === \"preview\") {\n // TODO -- add usage state warnings here too once we can do it without a deployment name\n // await usageStateWarning(ctx);\n if (cmdOptions.previewName !== undefined) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--preview-name` flag has been deprecated in favor of `--preview-create`. Please re-run the command using `--preview-create` instead.\",\n });\n }\n\n const teamAndProjectSlugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n await deployToNewPreviewDeployment(\n ctx,\n {\n previewDeployKey: deploymentSelection.previewDeployKey,\n projectSelection: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProjectSlugs.teamSlug,\n projectSlug: teamAndProjectSlugs.projectSlug,\n },\n },\n {\n ...cmdOptions,\n },\n );\n } else {\n if (cmdOptions.previewCreate !== undefined) {\n const source =\n deploymentSelection.kind === \"deploymentWithinProject\" &&\n deploymentSelection.targetProject.kind === \"deploymentName\"\n ? `at ${chalkStderr.blue.underline(`${DASHBOARD_HOST}/dp/${deploymentSelection.targetProject.deploymentName}/settings#preview-deploy-keys`)}`\n : deploymentSelection.kind === \"existingDeployment\" &&\n deploymentSelection.deploymentToActOn.deploymentFields !== null\n ? `at ${chalkStderr.blue.underline(`${DASHBOARD_HOST}/dp/${deploymentSelection.deploymentToActOn.deploymentFields.deploymentName}/settings#preview-deploy-keys`)}`\n : \"on the dashboard\";\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Preview deployments can only be created with preview deploy keys. Generate a preview deploy key ${source} and set the ${chalkStderr.bold(`CONVEX_DEPLOY_KEY`)} environment variable with it.`,\n });\n }\n\n await deployToExistingDeployment(ctx, {\n ...cmdOptions,\n skipWorkosCheck: cmdOptions.skipWorkosCheck ?? false,\n allowDeletingLargeIndexes:\n cmdOptions.allowDeletingLargeIndexes ?? false,\n });\n }\n });\n\nasync function deployToNewPreviewDeployment(\n ctx: Context,\n deploymentSelection: {\n previewDeployKey: string;\n projectSelection: {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n };\n },\n options: {\n dryRun?: boolean | undefined;\n previewCreate?: string | undefined;\n previewRun?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n cmd?: string | undefined;\n verbose?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n pushAllModules?: boolean;\n\n debug?: boolean | undefined;\n debugBundlePath?: string | undefined;\n skipWorkosCheck?: boolean | undefined;\n },\n) {\n const previewName = options.previewCreate ?? gitBranchFromEnvironment();\n if (previewName === null) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`npx convex deploy` to a preview deployment could not determine the preview name. Provide one using `--preview-create`\",\n });\n }\n\n if (options.dryRun) {\n logFinishedStep(\n `Would have claimed preview deployment for \"${previewName}\"`,\n );\n await runCommand(ctx, {\n cmdUrlEnvVarName: options.cmdUrlEnvVarName,\n cmd: options.cmd,\n dryRun: !!options.dryRun,\n url: \"https://<PREVIEW DEPLOYMENT>.convex.cloud\",\n adminKey: \"preview-deployment-admin-key\",\n });\n logFinishedStep(\n `Would have deployed Convex functions to preview deployment for \"${previewName}\"`,\n );\n if (options.previewRun !== undefined) {\n logMessage(`Would have run function \"${options.previewRun}\"`);\n }\n return;\n }\n const data = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"claim_preview_deployment\",\n data: {\n projectSelection: deploymentSelection.projectSelection,\n identifier: previewName,\n },\n });\n\n const previewAdminKey = data.adminKey;\n const previewUrl = data.instanceUrl;\n\n // Extract deployment name from URL for WorkOS provisioning\n const deploymentNameForWorkOS = extractDeploymentNameForWorkOS(previewUrl);\n\n // Provision WorkOS before building the client bundle (if configured)\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && deploymentNameForWorkOS && !options.skipWorkosCheck) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n deploymentNameForWorkOS,\n { deploymentUrl: previewUrl, adminKey: previewAdminKey },\n \"preview\",\n );\n }\n\n await runCommand(ctx, {\n ...options,\n url: previewUrl,\n adminKey: previewAdminKey,\n });\n\n const pushOptions: PushOptions = {\n deploymentName: null,\n adminKey: previewAdminKey,\n verbose: !!options.verbose,\n dryRun: false,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n debug: !!options.debug,\n debugBundlePath: options.debugBundlePath,\n debugNodeApis: false,\n codegen: options.codegen === \"enable\",\n url: previewUrl,\n liveComponentSources: false,\n pushAllModules: !!options.pushAllModules,\n largeIndexDeletionCheck: \"no verification\", // fine for preview deployments\n };\n showSpinner(`Deploying to ${previewUrl}...`);\n await runPush(ctx, pushOptions);\n logFinishedStep(`Deployed Convex functions to ${previewUrl}`);\n\n if (options.previewRun !== undefined) {\n await runFunctionAndLog(ctx, {\n deploymentUrl: previewUrl,\n adminKey: previewAdminKey,\n functionName: options.previewRun,\n argsString: \"{}\",\n componentPath: undefined,\n callbacks: {\n onSuccess: () => {\n logFinishedStep(`Finished running function \"${options.previewRun}\"`);\n },\n },\n });\n }\n}\n\nasync function deployToExistingDeployment(\n ctx: Context,\n options: {\n verbose?: boolean | undefined;\n dryRun?: boolean | undefined;\n yes?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n cmd?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n pushAllModules?: boolean;\n\n debugBundlePath?: string | undefined;\n debug?: boolean | undefined;\n adminKey?: string | undefined;\n url?: string | undefined;\n writePushRequest?: string | undefined;\n liveComponentSources?: boolean | undefined;\n envFile?: string | undefined;\n skipWorkosCheck?: boolean | undefined;\n allowDeletingLargeIndexes: boolean;\n },\n) {\n const deploymentSelection = await getDeploymentSelection(ctx, {\n ...options,\n implicitProd: true,\n });\n const deploymentToActOn = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n const { deploymentFields } = deploymentToActOn;\n\n const configuredDeployment =\n deploymentNameAndTypeFromSelection(deploymentSelection);\n if (configuredDeployment !== null && configuredDeployment.name !== null) {\n const shouldPushToProd =\n configuredDeployment.name === deploymentFields?.deploymentName ||\n (options.yes ??\n (await askToConfirmPush(\n ctx,\n {\n configuredName: configuredDeployment.name,\n configuredType: configuredDeployment.type,\n requestedName: deploymentFields?.deploymentName!,\n requestedType: deploymentFields?.deploymentType!,\n },\n deploymentToActOn.url,\n )));\n if (!shouldPushToProd) {\n await ctx.crash({\n exitCode: 1,\n printedMessage: null,\n errorType: \"fatal\",\n });\n }\n }\n\n const isCloudDeployment = deploymentFields !== null;\n await Promise.all([\n deployToDeployment(\n ctx,\n {\n url: deploymentToActOn.url,\n adminKey: deploymentToActOn.adminKey,\n deploymentName: deploymentFields?.deploymentName ?? null,\n ...(deploymentFields?.deploymentType !== undefined\n ? { deploymentType: deploymentFields.deploymentType }\n : {}),\n },\n { ...options, skipWorkosCheck: options.skipWorkosCheck },\n ),\n ...(isCloudDeployment\n ? [\n usageStateWarning(ctx, deploymentFields.deploymentName),\n checkVersion(ctx),\n ]\n : []),\n ]);\n}\n\nasync function askToConfirmPush(\n ctx: Context,\n deployment: {\n configuredName: string;\n configuredType: string | null;\n requestedName: string;\n requestedType: string;\n },\n prodUrl: string,\n) {\n logMessage(\n `\\\nYou're currently developing against your ${chalkStderr.bold(\n deployment.configuredType ?? \"dev\",\n )} deployment\n\n ${deployment.configuredName} (set in CONVEX_DEPLOYMENT)\n\nYour ${chalkStderr.bold(deployment.requestedType)} deployment ${chalkStderr.bold(\n deployment.requestedName,\n )} serves traffic at:\n\n ${(await suggestedEnvVarNames(ctx)).convexUrlEnvVar}=${chalkStderr.bold(prodUrl)}\n\nMake sure that your published client is configured with this URL (for instructions see https://docs.convex.dev/hosting)\\n`,\n );\n return promptYesNo(ctx, {\n message: `Do you want to push your code to your ${deployment.requestedType} deployment ${deployment.requestedName} now?`,\n default: true,\n });\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,mBAAmB;AAC5B,SAAS,SAAS,cAAc;AAChC,SAAkB,qBAAqB;AACvC,SAAS,iBAAiB,YAAY,mBAAmB;AACzD,SAAS,yCAAyC;AAClD;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,yBAAyB;AAClC,SAAS,yBAAyB;AAClC,SAAS,4CAA4C;AACrD,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB,kBAAkB;AAC/C,
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Command, Option } from \"@commander-js/extra-typings\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, logMessage, showSpinner } from \"../bundler/log.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport {\n gitBranchFromEnvironment,\n isNonProdBuildEnvironment,\n suggestedEnvVarNames,\n} from \"./lib/envvars.js\";\nimport { PushOptions } from \"./lib/components.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n bigBrainAPI,\n} from \"./lib/utils/utils.js\";\nimport { runFunctionAndLog } from \"./lib/run.js\";\nimport { usageStateWarning } from \"./lib/usage.js\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./lib/deployment.js\";\nimport { runPush } from \"./lib/components.js\";\nimport { promptYesNo } from \"./lib/utils/prompts.js\";\nimport { deployToDeployment, runCommand } from \"./lib/deploy2.js\";\nimport {\n DeploymentSelection,\n getDeploymentSelection,\n} from \"./lib/deploymentSelection.js\";\nimport { deploymentNameAndTypeFromSelection } from \"./lib/deploymentSelection.js\";\nimport { checkVersionAndAiFilesStaleness } from \"./lib/updates.js\";\nimport { readProjectConfig, getAuthKitConfig } from \"./lib/config.js\";\nimport { ensureAuthKitProvisionedBeforeBuild } from \"./lib/workos/workos.js\";\nimport { DASHBOARD_HOST } from \"./lib/dashboard.js\";\nimport { extractDeploymentNameForWorkOS } from \"./lib/extractDeploymentNameForWorkOS.js\";\n\nexport const deploy = new Command(\"deploy\")\n .summary(\"Deploy to your prod deployment\")\n .description(\n \"Deploy to your deployment. By default, this deploys to your prod deployment.\\n\\n\" +\n `Deploys to a preview deployment if the \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\` environment variable is set to a Preview Deploy Key.`,\n )\n .allowExcessArguments(false)\n .addDeployOptions()\n .addOption(\n new Option(\n \"--preview-run <functionName>\",\n \"Function to run if deploying to a preview deployment. This is ignored if deploying to a production deployment.\",\n ),\n )\n .addOption(\n new Option(\n \"--preview-create <name>\",\n \"The name to associate with this deployment if deploying to a newly created preview deployment. Defaults to the current Git branch name in Vercel, Netlify and GitHub CI. This parameter can only be used with a preview deploy key (when used with another type of key, the command will return an error).\",\n ).conflicts(\"preview-name\"),\n )\n .addOption(\n new Option(\n \"--check-build-environment <mode>\",\n \"Whether to check for a non-production build environment before deploying to a production Convex deployment.\",\n )\n .choices([\"enable\", \"disable\"] as const)\n .default(\"enable\" as const)\n .hideHelp(),\n )\n // Hidden options to pass in admin key and url for tests and local development\n .addOption(new Option(\"--admin-key <adminKey>\").hideHelp())\n .addOption(new Option(\"--url <url>\").hideHelp())\n .addOption(\n new Option(\n \"--preview-name <name>\",\n \"[deprecated] Use `--preview-create` instead. The name to associate with this deployment if deploying to a preview deployment.\",\n )\n .hideHelp()\n .conflicts(\"preview-create\"),\n )\n .addOption(\n new Option(\n \"--env-file <envFile>\",\n `Path to a custom file of environment variables, for choosing the \\\ndeployment, e.g. ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} or ${CONVEX_SELF_HOSTED_URL_VAR_NAME}. \\\nSame format as .env.local or .env files, and overrides them.`,\n ),\n )\n .addOption(\n new Option(\n \"--skip-workos-check\",\n \"Skip WorkOS AuthKit provisioning and credential checks during deploy.\",\n ).hideHelp(),\n )\n .addOption(\n new Option(\"--allow-deleting-large-indexes\")\n .hideHelp()\n .conflicts(\"preview-create\")\n .conflicts(\"preview-name\"),\n )\n .showHelpAfterError()\n .action(async (cmdOptions) => {\n const ctx = await oneoffContext(cmdOptions);\n\n const deploymentSelection = await getDeploymentSelection(ctx, {\n ...cmdOptions,\n implicitProd: true,\n });\n if (\n cmdOptions.checkBuildEnvironment === \"enable\" &&\n isNonProdBuildEnvironment() &&\n deploymentSelection.kind === \"existingDeployment\" &&\n deploymentSelection.deploymentToActOn.source === \"deployKey\" &&\n deploymentSelection.deploymentToActOn.deploymentFields?.deploymentType ===\n \"prod\"\n ) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Detected a non-production build environment and \"${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\" for a production Convex deployment.\\n\n This is probably unintentional.\n `,\n });\n }\n\n if (deploymentSelection.kind === \"anonymous\") {\n logMessage(\n \"You are currently developing anonymously with a locally running project.\\n\" +\n \"To deploy your Convex app to the cloud, log in by running `npx convex login`.\\n\" +\n \"See https://docs.convex.dev/production for more information on how Convex cloud works and instructions on how to set up hosting.\",\n );\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: null,\n });\n }\n\n if (deploymentSelection.kind === \"preview\") {\n // TODO -- add usage state warnings here too once we can do it without a deployment name\n // await usageStateWarning(ctx);\n if (cmdOptions.previewName !== undefined) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"The `--preview-name` flag has been deprecated in favor of `--preview-create`. Please re-run the command using `--preview-create` instead.\",\n });\n }\n\n const teamAndProjectSlugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n await deployToNewPreviewDeployment(\n ctx,\n {\n previewDeployKey: deploymentSelection.previewDeployKey,\n projectSelection: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProjectSlugs.teamSlug,\n projectSlug: teamAndProjectSlugs.projectSlug,\n },\n },\n {\n ...cmdOptions,\n },\n );\n } else {\n if (cmdOptions.previewCreate !== undefined) {\n const source =\n deploymentSelection.kind === \"deploymentWithinProject\" &&\n deploymentSelection.targetProject.kind === \"deploymentName\"\n ? `at ${chalkStderr.blue.underline(`${DASHBOARD_HOST}/dp/${deploymentSelection.targetProject.deploymentName}/settings#preview-deploy-keys`)}`\n : deploymentSelection.kind === \"existingDeployment\" &&\n deploymentSelection.deploymentToActOn.deploymentFields !== null\n ? `at ${chalkStderr.blue.underline(`${DASHBOARD_HOST}/dp/${deploymentSelection.deploymentToActOn.deploymentFields.deploymentName}/settings#preview-deploy-keys`)}`\n : \"on the dashboard\";\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Preview deployments can only be created with preview deploy keys. Generate a preview deploy key ${source} and set the ${chalkStderr.bold(`CONVEX_DEPLOY_KEY`)} environment variable with it.`,\n });\n }\n\n await deployToExistingDeployment(ctx, deploymentSelection, {\n ...cmdOptions,\n skipWorkosCheck: cmdOptions.skipWorkosCheck ?? false,\n allowDeletingLargeIndexes:\n cmdOptions.allowDeletingLargeIndexes ?? false,\n });\n }\n });\n\nasync function deployToNewPreviewDeployment(\n ctx: Context,\n deploymentSelection: {\n previewDeployKey: string;\n projectSelection: {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n };\n },\n options: {\n dryRun?: boolean | undefined;\n previewCreate?: string | undefined;\n previewRun?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n cmd?: string | undefined;\n verbose?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n pushAllModules?: boolean;\n\n debug?: boolean | undefined;\n debugBundlePath?: string | undefined;\n skipWorkosCheck?: boolean | undefined;\n },\n) {\n const previewName = options.previewCreate ?? gitBranchFromEnvironment();\n if (previewName === null) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"`npx convex deploy` to a preview deployment could not determine the preview name. Provide one using `--preview-create`\",\n });\n }\n\n if (options.dryRun) {\n logFinishedStep(\n `Would have claimed preview deployment for \"${previewName}\"`,\n );\n await runCommand(ctx, {\n cmdUrlEnvVarName: options.cmdUrlEnvVarName,\n cmd: options.cmd,\n dryRun: !!options.dryRun,\n url: \"https://<PREVIEW DEPLOYMENT>.convex.cloud\",\n adminKey: \"preview-deployment-admin-key\",\n });\n logFinishedStep(\n `Would have deployed Convex functions to preview deployment for \"${previewName}\"`,\n );\n if (options.previewRun !== undefined) {\n logMessage(`Would have run function \"${options.previewRun}\"`);\n }\n return;\n }\n const data = await bigBrainAPI({\n ctx,\n method: \"POST\",\n path: \"claim_preview_deployment\",\n data: {\n projectSelection: deploymentSelection.projectSelection,\n identifier: previewName,\n },\n });\n\n const previewAdminKey = data.adminKey;\n const previewUrl = data.instanceUrl;\n\n // Extract deployment name from URL for WorkOS provisioning\n const deploymentNameForWorkOS = extractDeploymentNameForWorkOS(previewUrl);\n\n // Provision WorkOS before building the client bundle (if configured)\n const { projectConfig } = await readProjectConfig(ctx);\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n\n if (authKitConfig && deploymentNameForWorkOS && !options.skipWorkosCheck) {\n await ensureAuthKitProvisionedBeforeBuild(\n ctx,\n deploymentNameForWorkOS,\n { deploymentUrl: previewUrl, adminKey: previewAdminKey },\n \"preview\",\n );\n }\n\n await runCommand(ctx, {\n ...options,\n url: previewUrl,\n adminKey: previewAdminKey,\n });\n\n const pushOptions: PushOptions = {\n deploymentName: null,\n adminKey: previewAdminKey,\n verbose: !!options.verbose,\n dryRun: false,\n typecheck: options.typecheck,\n typecheckComponents: options.typecheckComponents,\n debug: !!options.debug,\n debugBundlePath: options.debugBundlePath,\n debugNodeApis: false,\n codegen: options.codegen === \"enable\",\n url: previewUrl,\n liveComponentSources: false,\n pushAllModules: !!options.pushAllModules,\n largeIndexDeletionCheck: \"no verification\", // fine for preview deployments\n };\n showSpinner(`Deploying to ${previewUrl}...`);\n await runPush(ctx, pushOptions);\n logFinishedStep(`Deployed Convex functions to ${previewUrl}`);\n\n if (options.previewRun !== undefined) {\n await runFunctionAndLog(ctx, {\n deploymentUrl: previewUrl,\n adminKey: previewAdminKey,\n functionName: options.previewRun,\n argsString: \"{}\",\n componentPath: undefined,\n callbacks: {\n onSuccess: () => {\n logFinishedStep(`Finished running function \"${options.previewRun}\"`);\n },\n },\n });\n }\n}\n\nasync function deployToExistingDeployment(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n options: {\n verbose?: boolean | undefined;\n dryRun?: boolean | undefined;\n yes?: boolean | undefined;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: \"enable\" | \"disable\";\n cmd?: string | undefined;\n cmdUrlEnvVarName?: string | undefined;\n pushAllModules?: boolean;\n\n debugBundlePath?: string | undefined;\n debug?: boolean | undefined;\n adminKey?: string | undefined;\n url?: string | undefined;\n writePushRequest?: string | undefined;\n liveComponentSources?: boolean | undefined;\n envFile?: string | undefined;\n skipWorkosCheck?: boolean | undefined;\n allowDeletingLargeIndexes: boolean;\n },\n) {\n const deploymentToActOn = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n const { deploymentFields } = deploymentToActOn;\n\n const configuredDeployment =\n deploymentNameAndTypeFromSelection(deploymentSelection);\n if (configuredDeployment !== null && configuredDeployment.name !== null) {\n const shouldPushToProd =\n configuredDeployment.name === deploymentFields?.deploymentName ||\n (options.yes ??\n (await askToConfirmPush(\n ctx,\n {\n configuredName: configuredDeployment.name,\n configuredType: configuredDeployment.type,\n requestedName: deploymentFields?.deploymentName!,\n requestedType: deploymentFields?.deploymentType!,\n },\n deploymentToActOn.url,\n )));\n if (!shouldPushToProd) {\n await ctx.crash({\n exitCode: 1,\n printedMessage: null,\n errorType: \"fatal\",\n });\n }\n }\n\n const isCloudDeployment = deploymentFields !== null;\n await Promise.all([\n deployToDeployment(\n ctx,\n {\n url: deploymentToActOn.url,\n adminKey: deploymentToActOn.adminKey,\n deploymentName: deploymentFields?.deploymentName ?? null,\n ...(deploymentFields?.deploymentType !== undefined\n ? { deploymentType: deploymentFields.deploymentType }\n : {}),\n },\n { ...options, skipWorkosCheck: options.skipWorkosCheck },\n ),\n ...(isCloudDeployment\n ? [\n usageStateWarning(ctx, deploymentFields.deploymentName),\n checkVersionAndAiFilesStaleness(ctx),\n ]\n : []),\n ]);\n}\n\nasync function askToConfirmPush(\n ctx: Context,\n deployment: {\n configuredName: string;\n configuredType: string | null;\n requestedName: string;\n requestedType: string;\n },\n prodUrl: string,\n) {\n logMessage(\n `\\\nYou're currently developing against your ${chalkStderr.bold(\n deployment.configuredType ?? \"dev\",\n )} deployment\n\n ${deployment.configuredName} (set in CONVEX_DEPLOYMENT)\n\nYour ${chalkStderr.bold(deployment.requestedType)} deployment ${chalkStderr.bold(\n deployment.requestedName,\n )} serves traffic at:\n\n ${(await suggestedEnvVarNames(ctx)).convexUrlEnvVar}=${chalkStderr.bold(prodUrl)}\n\nMake sure that your published client is configured with this URL (for instructions see https://docs.convex.dev/hosting)\\n`,\n );\n return promptYesNo(ctx, {\n message: `Do you want to push your code to your ${deployment.requestedType} deployment ${deployment.requestedName} now?`,\n default: true,\n });\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -9,7 +9,8 @@ import {
|
|
|
9
9
|
} from "../bundler/log.js";
|
|
10
10
|
import {
|
|
11
11
|
getDeploymentSelection,
|
|
12
|
-
getProjectDetails
|
|
12
|
+
getProjectDetails,
|
|
13
|
+
deploymentNameFromSelection
|
|
13
14
|
} from "./lib/deploymentSelection.js";
|
|
14
15
|
import {
|
|
15
16
|
logNoDefaultRegionMessage,
|
|
@@ -18,31 +19,95 @@ import {
|
|
|
18
19
|
typedPlatformClient
|
|
19
20
|
} from "./lib/utils/utils.js";
|
|
20
21
|
import { getTeamAndProjectFromPreviewAdminKey } from "./lib/deployment.js";
|
|
21
|
-
import {
|
|
22
|
+
import { saveSelectedDeployment } from "./deploymentSelect.js";
|
|
22
23
|
import { promptOptions, promptString } from "./lib/utils/prompts.js";
|
|
23
24
|
import { chalkStderr } from "chalk";
|
|
24
25
|
import { parseDeploymentSelector } from "./lib/deploymentSelector.js";
|
|
25
|
-
|
|
26
|
-
|
|
26
|
+
import {
|
|
27
|
+
parseExpiration,
|
|
28
|
+
resolveExpiration,
|
|
29
|
+
validateExpiration
|
|
30
|
+
} from "./lib/expiration.js";
|
|
31
|
+
import { ensureBackendBinaryDownloaded } from "./lib/localDeployment/download.js";
|
|
32
|
+
import {
|
|
33
|
+
loadProjectLocalConfig,
|
|
34
|
+
saveDeploymentConfig
|
|
35
|
+
} from "./lib/localDeployment/filePaths.js";
|
|
36
|
+
import {
|
|
37
|
+
chooseLocalBackendPorts,
|
|
38
|
+
LOCAL_BACKEND_INSTANCE_SECRET
|
|
39
|
+
} from "./lib/localDeployment/utils.js";
|
|
40
|
+
import { bigBrainStart } from "./lib/localDeployment/bigBrain.js";
|
|
41
|
+
const SUPPORTED_TYPES = ["dev", "prod", "preview"];
|
|
42
|
+
export const deploymentCreate = new Command("create").summary("Create a new deployment for a project").description(
|
|
43
|
+
"Create a new deployment for a project.\n\n Create a dev deployment and select it: `npx convex deployment create dev/my-new-feature --type dev --select`\n Create a prod deployment named \u201Cstaging\u201D: `npx convex deployment create staging --type prod`\n Create a local deployment: `npx convex deployment create local`\n"
|
|
27
44
|
).argument("[ref]").allowExcessArguments(false).addOption(
|
|
28
|
-
new Option("--type <type>", "Deployment type").choices(
|
|
29
|
-
"dev",
|
|
30
|
-
"prod",
|
|
31
|
-
"preview"
|
|
32
|
-
])
|
|
45
|
+
new Option("--type <type>", "Deployment type").choices(SUPPORTED_TYPES)
|
|
33
46
|
).option("--region <region>", "Deployment region").option(
|
|
34
47
|
"--select",
|
|
35
|
-
"Select the new deployment. This will update the Convex environment variables in .env.local
|
|
48
|
+
"Select the new deployment. This will update the Convex environment variables in .env.local. Subsequent `npx convex` commands will run against this deployment."
|
|
36
49
|
).option(
|
|
37
50
|
"--default",
|
|
38
|
-
"
|
|
51
|
+
"Make the new deployment your default production deployment (used by `npx convex deploy`) or your personal dev deployment."
|
|
52
|
+
).option(
|
|
53
|
+
"--expiration <value>",
|
|
54
|
+
'When the deployment expires (e.g. "none", "in 7 days", "2026-04-01T00:00:00Z", or a UNIX timestamp in seconds or milliseconds)'
|
|
39
55
|
).action(async (refParam, options) => {
|
|
40
56
|
const ctx = await oneoffContext({
|
|
41
57
|
url: void 0,
|
|
42
58
|
adminKey: void 0,
|
|
43
59
|
envFile: void 0
|
|
44
60
|
});
|
|
45
|
-
const
|
|
61
|
+
const currentDeployment = await getDeploymentSelection(ctx, {
|
|
62
|
+
url: void 0,
|
|
63
|
+
adminKey: void 0,
|
|
64
|
+
envFile: void 0
|
|
65
|
+
});
|
|
66
|
+
if (refParam !== void 0) {
|
|
67
|
+
if (refParam === "local") {
|
|
68
|
+
const cloudOnlyFlags = [
|
|
69
|
+
"type",
|
|
70
|
+
"region",
|
|
71
|
+
"default",
|
|
72
|
+
"expiration"
|
|
73
|
+
];
|
|
74
|
+
for (const flag of cloudOnlyFlags) {
|
|
75
|
+
if (options[flag]) {
|
|
76
|
+
return await ctx.crash({
|
|
77
|
+
exitCode: 1,
|
|
78
|
+
errorType: "fatal",
|
|
79
|
+
printedMessage: `--${flag} cannot be used when creating a local deployment`
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
await createLocalDeployment(
|
|
84
|
+
ctx,
|
|
85
|
+
currentDeployment,
|
|
86
|
+
options.select ?? false
|
|
87
|
+
);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const expiresAt = await resolveExpiresAtOrCrash(ctx, options.expiration);
|
|
92
|
+
const {
|
|
93
|
+
ref,
|
|
94
|
+
regionDetails,
|
|
95
|
+
projectId,
|
|
96
|
+
type,
|
|
97
|
+
isDefault,
|
|
98
|
+
teamSlug,
|
|
99
|
+
projectSlug
|
|
100
|
+
} = process.stdin.isTTY ? await resolveOptionsInteractively(
|
|
101
|
+
ctx,
|
|
102
|
+
currentDeployment,
|
|
103
|
+
refParam,
|
|
104
|
+
options
|
|
105
|
+
) : await resolveOptionsNoninteractively(
|
|
106
|
+
ctx,
|
|
107
|
+
currentDeployment,
|
|
108
|
+
refParam,
|
|
109
|
+
options
|
|
110
|
+
);
|
|
46
111
|
showSpinner(
|
|
47
112
|
`Creating ${type} deployment` + (regionDetails ? ` in region ${regionDetails.displayName}` : "") + "..."
|
|
48
113
|
);
|
|
@@ -56,7 +121,8 @@ export const deploymentCreate = new Command("create").summary("Create a new clou
|
|
|
56
121
|
type,
|
|
57
122
|
region: regionDetails?.name ?? null,
|
|
58
123
|
reference: ref ?? null,
|
|
59
|
-
isDefault
|
|
124
|
+
isDefault,
|
|
125
|
+
...expiresAt !== void 0 ? { expiresAt } : {}
|
|
60
126
|
}
|
|
61
127
|
}
|
|
62
128
|
)).data;
|
|
@@ -71,19 +137,99 @@ export const deploymentCreate = new Command("create").summary("Create a new clou
|
|
|
71
137
|
}
|
|
72
138
|
if (!options.select) {
|
|
73
139
|
logFinishedStep(
|
|
74
|
-
`Provisioned a ${created.isDefault ? "default " : ""}${created.deploymentType} deployment
|
|
75
|
-
);
|
|
76
|
-
logMessage(
|
|
77
|
-
chalkStderr.gray(
|
|
78
|
-
"Hint: use `npx convex deployment create --select` to immediately select the newly created deployment."
|
|
79
|
-
)
|
|
140
|
+
`Provisioned a ${created.isDefault ? "default " : ""}${created.deploymentType} deployment.`
|
|
80
141
|
);
|
|
142
|
+
if (type !== "prod") {
|
|
143
|
+
const selectRef = `${teamSlug}:${projectSlug}:${created.reference}`;
|
|
144
|
+
logMessage(
|
|
145
|
+
`
|
|
146
|
+
To make \`npx convex\` use this deployment, run ${chalkStderr.bold(`npx convex deployment select ${selectRef}`)}`
|
|
147
|
+
);
|
|
148
|
+
logMessage(
|
|
149
|
+
chalkStderr.gray(
|
|
150
|
+
"Hint: use `--select` to immediately select the newly created deployment."
|
|
151
|
+
)
|
|
152
|
+
);
|
|
153
|
+
}
|
|
81
154
|
}
|
|
82
155
|
if (options.select) {
|
|
83
|
-
|
|
156
|
+
const selection = {
|
|
157
|
+
kind: "deploymentWithinProject",
|
|
158
|
+
targetProject: {
|
|
159
|
+
kind: "teamAndProjectSlugs",
|
|
160
|
+
teamSlug,
|
|
161
|
+
projectSlug
|
|
162
|
+
},
|
|
163
|
+
selectionWithinProject: {
|
|
164
|
+
kind: "deploymentSelector",
|
|
165
|
+
selector: created.reference
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
await saveSelectedDeployment(
|
|
169
|
+
ctx,
|
|
170
|
+
created.reference,
|
|
171
|
+
selection,
|
|
172
|
+
deploymentNameFromSelection(currentDeployment)
|
|
173
|
+
);
|
|
84
174
|
}
|
|
85
175
|
});
|
|
86
|
-
async function
|
|
176
|
+
async function createLocalDeployment(ctx, currentDeployment, select) {
|
|
177
|
+
const existing = loadProjectLocalConfig(ctx);
|
|
178
|
+
if (existing) {
|
|
179
|
+
return await ctx.crash({
|
|
180
|
+
exitCode: 1,
|
|
181
|
+
errorType: "fatal",
|
|
182
|
+
printedMessage: "A local deployment already exists."
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
const { teamSlug, slug: projectSlug } = await resolveProject(
|
|
186
|
+
ctx,
|
|
187
|
+
currentDeployment
|
|
188
|
+
);
|
|
189
|
+
showSpinner("Downloading local backend...");
|
|
190
|
+
const { version } = await ensureBackendBinaryDownloaded(ctx, {
|
|
191
|
+
kind: "latest"
|
|
192
|
+
});
|
|
193
|
+
const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx);
|
|
194
|
+
showSpinner("Registering local deployment...");
|
|
195
|
+
const { deploymentName, adminKey } = await bigBrainStart(ctx, {
|
|
196
|
+
port: cloudPort,
|
|
197
|
+
projectSlug,
|
|
198
|
+
teamSlug,
|
|
199
|
+
instanceName: null
|
|
200
|
+
});
|
|
201
|
+
saveDeploymentConfig(ctx, "local", deploymentName, {
|
|
202
|
+
backendVersion: version,
|
|
203
|
+
ports: { cloud: cloudPort, site: sitePort },
|
|
204
|
+
adminKey,
|
|
205
|
+
instanceSecret: LOCAL_BACKEND_INSTANCE_SECRET
|
|
206
|
+
});
|
|
207
|
+
logFinishedStep("Created local deployment.");
|
|
208
|
+
if (select) {
|
|
209
|
+
const selection = {
|
|
210
|
+
kind: "deploymentWithinProject",
|
|
211
|
+
targetProject: {
|
|
212
|
+
kind: "deploymentName",
|
|
213
|
+
deploymentName,
|
|
214
|
+
deploymentType: "local"
|
|
215
|
+
},
|
|
216
|
+
selectionWithinProject: {
|
|
217
|
+
kind: "deploymentSelector",
|
|
218
|
+
selector: "local"
|
|
219
|
+
}
|
|
220
|
+
};
|
|
221
|
+
await saveSelectedDeployment(
|
|
222
|
+
ctx,
|
|
223
|
+
"local",
|
|
224
|
+
selection,
|
|
225
|
+
deploymentNameFromSelection(currentDeployment)
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
const devCommand = select ? "npx convex dev" : "npx convex dev --deployment local";
|
|
229
|
+
logMessage(`
|
|
230
|
+
Run ${chalkStderr.bold(devCommand)} to start it.`);
|
|
231
|
+
}
|
|
232
|
+
async function resolveOptionsNoninteractively(ctx, currentDeployment, refParam, options) {
|
|
87
233
|
let ref;
|
|
88
234
|
let teamAndProject;
|
|
89
235
|
if (refParam) {
|
|
@@ -109,21 +255,14 @@ async function resolveOptionsNoninteractively(ctx, refParam, options) {
|
|
|
109
255
|
return await ctx.crash({
|
|
110
256
|
exitCode: 1,
|
|
111
257
|
errorType: "fatal",
|
|
112
|
-
printedMessage:
|
|
258
|
+
printedMessage: `--type is required (supported values: ${SUPPORTED_TYPES.join(", ")})`
|
|
113
259
|
});
|
|
114
260
|
}
|
|
115
261
|
const project = teamAndProject ? await getProjectDetails(ctx, {
|
|
116
262
|
kind: "teamAndProjectSlugs",
|
|
117
263
|
teamSlug: teamAndProject.teamSlug,
|
|
118
264
|
projectSlug: teamAndProject.projectSlug
|
|
119
|
-
}) : await resolveProject(
|
|
120
|
-
ctx,
|
|
121
|
-
await getDeploymentSelection(ctx, {
|
|
122
|
-
url: void 0,
|
|
123
|
-
adminKey: void 0,
|
|
124
|
-
envFile: void 0
|
|
125
|
-
})
|
|
126
|
-
);
|
|
265
|
+
}) : await resolveProject(ctx, currentDeployment);
|
|
127
266
|
const projectId = project.id;
|
|
128
267
|
let regionDetails = null;
|
|
129
268
|
if (options.region) {
|
|
@@ -139,10 +278,12 @@ async function resolveOptionsNoninteractively(ctx, refParam, options) {
|
|
|
139
278
|
isDefault: options.default ?? null,
|
|
140
279
|
projectId,
|
|
141
280
|
regionDetails,
|
|
142
|
-
type: options.type
|
|
281
|
+
type: options.type,
|
|
282
|
+
teamSlug: project.teamSlug,
|
|
283
|
+
projectSlug: project.slug
|
|
143
284
|
};
|
|
144
285
|
}
|
|
145
|
-
async function resolveOptionsInteractively(ctx, refParam, options) {
|
|
286
|
+
async function resolveOptionsInteractively(ctx, currentDeployment, refParam, options) {
|
|
146
287
|
let deploymentType;
|
|
147
288
|
if (options.type) {
|
|
148
289
|
deploymentType = logAndUse("type", options.type);
|
|
@@ -178,7 +319,12 @@ async function resolveOptionsInteractively(ctx, refParam, options) {
|
|
|
178
319
|
}
|
|
179
320
|
}
|
|
180
321
|
while (ref === void 0) {
|
|
181
|
-
const input = await promptString(ctx, {
|
|
322
|
+
const input = await promptString(ctx, {
|
|
323
|
+
message: "How to name this deployment?\n" + chalkStderr.reset.dim(
|
|
324
|
+
"The deployment reference will be used to identify your deployment on the dashboard and in CLI commands.\nExamples: staging, dev/james/feature-payment-integration"
|
|
325
|
+
) + "\n>",
|
|
326
|
+
validate: validateTentativeReference
|
|
327
|
+
});
|
|
182
328
|
const result = parseSelectorForNewDeployment(input);
|
|
183
329
|
if (result.kind === "invalid") {
|
|
184
330
|
logFailure(result.message);
|
|
@@ -191,14 +337,7 @@ async function resolveOptionsInteractively(ctx, refParam, options) {
|
|
|
191
337
|
kind: "teamAndProjectSlugs",
|
|
192
338
|
teamSlug: teamAndProject.teamSlug,
|
|
193
339
|
projectSlug: teamAndProject.projectSlug
|
|
194
|
-
}) : await resolveProject(
|
|
195
|
-
ctx,
|
|
196
|
-
await getDeploymentSelection(ctx, {
|
|
197
|
-
url: void 0,
|
|
198
|
-
adminKey: void 0,
|
|
199
|
-
envFile: void 0
|
|
200
|
-
})
|
|
201
|
-
);
|
|
340
|
+
}) : await resolveProject(ctx, currentDeployment);
|
|
202
341
|
const availableRegions = await fetchAvailableRegions(ctx, project.teamId);
|
|
203
342
|
let regionDetails;
|
|
204
343
|
if (options.region) {
|
|
@@ -237,12 +376,19 @@ async function resolveOptionsInteractively(ctx, refParam, options) {
|
|
|
237
376
|
isDefault: options.default ?? null,
|
|
238
377
|
projectId: project.id,
|
|
239
378
|
regionDetails,
|
|
240
|
-
type: deploymentType
|
|
379
|
+
type: deploymentType,
|
|
380
|
+
teamSlug: project.teamSlug,
|
|
381
|
+
projectSlug: project.slug
|
|
241
382
|
};
|
|
242
383
|
}
|
|
243
384
|
function parseSelectorForNewDeployment(selectorString) {
|
|
244
385
|
const selector = parseDeploymentSelector(selectorString);
|
|
245
386
|
switch (selector.kind) {
|
|
387
|
+
case "local":
|
|
388
|
+
return {
|
|
389
|
+
kind: "invalid",
|
|
390
|
+
message: `"local" is not a valid deployment reference. To create a local deployment, run ${chalkStderr.bold("npx convex deployment create local")}`
|
|
391
|
+
};
|
|
246
392
|
case "deploymentName":
|
|
247
393
|
return {
|
|
248
394
|
kind: "invalid",
|
|
@@ -398,8 +544,58 @@ async function crashInvalidRegion(ctx, availableRegions, region) {
|
|
|
398
544
|
printedMessage: invalidRegionMessage(availableRegions, region)
|
|
399
545
|
});
|
|
400
546
|
}
|
|
547
|
+
async function resolveExpiresAtOrCrash(ctx, expiration) {
|
|
548
|
+
if (!expiration) {
|
|
549
|
+
return void 0;
|
|
550
|
+
}
|
|
551
|
+
const parsed = parseExpiration(expiration);
|
|
552
|
+
if (parsed.kind === "error") {
|
|
553
|
+
return await ctx.crash({
|
|
554
|
+
exitCode: 1,
|
|
555
|
+
errorType: "fatal",
|
|
556
|
+
printedMessage: parsed.message
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
const now = Date.now();
|
|
560
|
+
const resolved = resolveExpiration(parsed, now);
|
|
561
|
+
if (resolved !== null) {
|
|
562
|
+
const validation = validateExpiration(resolved, now);
|
|
563
|
+
if (validation.kind === "error") {
|
|
564
|
+
return await ctx.crash({
|
|
565
|
+
exitCode: 1,
|
|
566
|
+
errorType: "fatal",
|
|
567
|
+
printedMessage: validation.message
|
|
568
|
+
});
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
return resolved;
|
|
572
|
+
}
|
|
401
573
|
function logAndUse(label, value) {
|
|
402
574
|
logFinishedStep(`Using ${label}: ${chalkStderr.bold(value)}`);
|
|
403
575
|
return value;
|
|
404
576
|
}
|
|
577
|
+
function validateTentativeReference(tentativeReference) {
|
|
578
|
+
if (tentativeReference.length < 3) {
|
|
579
|
+
return "References must be at least 3 characters";
|
|
580
|
+
}
|
|
581
|
+
if (tentativeReference.length > 100) {
|
|
582
|
+
return "References must be at most 100 characters";
|
|
583
|
+
}
|
|
584
|
+
if (!/^[a-z0-9/-]+$/.test(tentativeReference)) {
|
|
585
|
+
return "References can only contain lowercase letters, numbers, hyphens, and slashes";
|
|
586
|
+
}
|
|
587
|
+
if (tentativeReference === "dev") {
|
|
588
|
+
return '"dev" is not a valid deployment reference.';
|
|
589
|
+
}
|
|
590
|
+
if (tentativeReference === "prod") {
|
|
591
|
+
return '"prod" is not a valid deployment reference.';
|
|
592
|
+
}
|
|
593
|
+
if (tentativeReference === "local") {
|
|
594
|
+
return `"local" is not a valid deployment reference. To create a local deployment, run ${chalkStderr.bold("npx convex deployment create local")}`;
|
|
595
|
+
}
|
|
596
|
+
if (/^[a-z]+-[a-z]+-\d+$/.test(tentativeReference)) {
|
|
597
|
+
return "References cannot be in the format abc-xyz-123, as it is reserved for deployment names";
|
|
598
|
+
}
|
|
599
|
+
return true;
|
|
600
|
+
}
|
|
405
601
|
//# sourceMappingURL=deploymentCreate.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/deploymentCreate.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n showSpinner,\n} from \"../bundler/log.js\";\nimport {\n DeploymentSelection,\n getDeploymentSelection,\n getProjectDetails,\n} from \"./lib/deploymentSelection.js\";\nimport {\n logNoDefaultRegionMessage,\n selectRegion,\n typedBigBrainClient,\n typedPlatformClient,\n} from \"./lib/utils/utils.js\";\nimport { PlatformProjectDetails } from \"@convex-dev/platform/managementApi\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./lib/deployment.js\";\nimport { selectDeployment } from \"./deploymentSelect.js\";\nimport { promptOptions, promptString } from \"./lib/utils/prompts.js\";\nimport { chalkStderr } from \"chalk\";\nimport { parseDeploymentSelector } from \"./lib/deploymentSelector.js\";\n\nexport const deploymentCreate = new Command(\"create\")\n .summary(\"Create a new cloud deployment for a project\")\n .description(\n \"Create a new cloud deployment for a project.\\n\\n\" +\n \" Create a dev deployment and select it: `npx convex deployment create dev/my-new-feature --type dev --select`\\n\" +\n \" Create a prod staging deployment: `npx convex deployment create staging --type prod`\\n\",\n )\n .argument(\"[ref]\")\n .allowExcessArguments(false)\n .addOption(\n new Option(\"--type <type>\", \"Deployment type\").choices([\n \"dev\",\n \"prod\",\n \"preview\",\n ] as const),\n )\n .option(\"--region <region>\", \"Deployment region\")\n .option(\n \"--select\",\n \"Select the new deployment. This will update the Convex environment variables in .env.local and `npx convex dev` will run against this deployment.\",\n )\n .option(\n \"--default\",\n \"Set the new deployment as your default development or production deployment.\",\n )\n .action(async (refParam, options) => {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n const { ref, regionDetails, projectId, type, isDefault } = process.stdin\n .isTTY\n ? await resolveOptionsInteractively(ctx, refParam, options)\n : await resolveOptionsNoninteractively(ctx, refParam, options);\n\n showSpinner(\n `Creating ${type} deployment` +\n (regionDetails ? ` in region ${regionDetails.displayName}` : \"\") +\n \"...\",\n );\n\n const created = (\n await typedPlatformClient(ctx).POST(\n \"/projects/{project_id}/create_deployment\",\n {\n params: {\n path: { project_id: projectId },\n },\n body: {\n type,\n region: regionDetails?.name ?? null,\n reference: ref ?? null,\n isDefault,\n },\n },\n )\n ).data!;\n\n if (created.kind !== \"cloud\") {\n // This should be impossible\n const err = `Expected cloud deployment to be created but got ${created.kind}`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: err,\n errForSentry: err,\n });\n }\n\n if (!options.select) {\n logFinishedStep(\n `Provisioned a ${created.isDefault ? \"default \" : \"\"}${created.deploymentType} deployment. Select this deployment to develop against using \\`npx convex deployment select ${created.reference}\\``,\n );\n logMessage(\n chalkStderr.gray(\n \"Hint: use `npx convex deployment create --select` to immediately select the newly created deployment.\",\n ),\n );\n }\n\n if (options.select) {\n await selectDeployment(ctx, created.reference);\n }\n });\n\ntype RefParam = Parameters<Parameters<typeof deploymentCreate.action>[0]>[0];\ntype OptionsParam = Parameters<\n Parameters<typeof deploymentCreate.action>[0]\n>[1];\n\nasync function resolveOptionsNoninteractively(\n ctx: Context,\n refParam: RefParam,\n options: OptionsParam,\n) {\n let ref: string | undefined;\n let teamAndProject: { teamSlug: string; projectSlug: string } | undefined;\n if (refParam) {\n const result = parseSelectorForNewDeployment(refParam);\n if (result.kind === \"invalid\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: result.message,\n });\n }\n ref = result.ref;\n teamAndProject = result.teamAndProject;\n }\n\n if (!ref && !options.default) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Specify a deployment ref or use --default:\\n\" +\n \" `npx convex deployment create my-deployment-ref --type dev`\\n\" +\n \" `npx convex deployment create --type prod --default`\",\n });\n }\n\n if (!options.type) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"--type is required. Use --type dev or --type prod.\",\n });\n }\n\n const project = teamAndProject\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProject.teamSlug,\n projectSlug: teamAndProject.projectSlug,\n })\n : await resolveProject(\n ctx,\n await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n }),\n );\n const projectId = project.id;\n\n // If no region is passed in, the team's default region will be used\n let regionDetails: AvailableRegion | null = null;\n if (options.region) {\n const availableRegions = await fetchAvailableRegions(ctx, project.teamId);\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n options.region,\n );\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId,\n regionDetails,\n type: options.type,\n };\n}\n\nasync function resolveOptionsInteractively(\n ctx: Context,\n refParam: RefParam,\n options: OptionsParam,\n) {\n let deploymentType: \"dev\" | \"prod\" | \"preview\";\n if (options.type) {\n deploymentType = logAndUse(\"type\", options.type);\n } else {\n const dtypeChoices = [\n {\n name: \"dev\",\n value: \"dev\" as const,\n },\n {\n name: \"preview\",\n value: \"preview\" as const,\n },\n {\n name: \"prod\",\n value: \"prod\" as const,\n },\n ];\n deploymentType = await promptOptions(ctx, {\n message: \"Deployment type?\",\n choices: dtypeChoices,\n });\n }\n\n let ref: string | undefined;\n let teamAndProject: { teamSlug: string; projectSlug: string } | undefined;\n if (refParam) {\n const result = parseSelectorForNewDeployment(refParam);\n if (result.kind === \"invalid\") {\n logFailure(result.message);\n } else {\n ref = logAndUse(\"ref\", result.ref);\n teamAndProject = result.teamAndProject;\n }\n }\n while (ref === undefined) {\n const input = await promptString(ctx, { message: \"Deployment ref?\" });\n const result = parseSelectorForNewDeployment(input);\n if (result.kind === \"invalid\") {\n logFailure(result.message);\n continue;\n }\n ref = result.ref;\n teamAndProject = result.teamAndProject;\n }\n\n const project = teamAndProject\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProject.teamSlug,\n projectSlug: teamAndProject.projectSlug,\n })\n : await resolveProject(\n ctx,\n await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n }),\n );\n\n const availableRegions = await fetchAvailableRegions(ctx, project.teamId);\n let regionDetails: AvailableRegion;\n if (options.region) {\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n options.region,\n );\n logAndUse(\"region\", regionDetails.displayName);\n } else {\n // Use the team's default region if set, or prompt the user to pick\n // TODO: this duplicates some of the logic in selectRegionOrUseDefault (npm-packages/convex/src/cli/lib/utils/utils.ts)\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n const team = teams.find((team) => team.slug === project.teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${project.teamSlug} not found.`,\n });\n }\n const regionName =\n team.defaultRegion ?? (await selectRegion(ctx, team.id, deploymentType));\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n regionName,\n );\n if (team.defaultRegion) {\n logFinishedStep(\n `Using team default region of ${regionDetails.displayName}`,\n );\n } else {\n logNoDefaultRegionMessage(team.slug);\n }\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId: project.id,\n regionDetails,\n type: deploymentType,\n };\n}\n\ntype NewDeploymentSelectorResult =\n | {\n kind: \"valid\";\n ref: string;\n teamAndProject?: { teamSlug: string; projectSlug: string };\n }\n | { kind: \"invalid\"; message: string };\n\nfunction parseSelectorForNewDeployment(\n selectorString: string,\n): NewDeploymentSelectorResult {\n const selector = parseDeploymentSelector(selectorString);\n switch (selector.kind) {\n case \"deploymentName\":\n return {\n kind: \"invalid\",\n message: `\"${selector.deploymentName}\" is not a valid deployment reference. References cannot be in the format abc-xyz-123, as it is reserved for deployment names.`,\n };\n case \"inCurrentProject\": {\n const inner = selector.selector;\n if (inner.kind === \"dev\") {\n return {\n kind: \"invalid\",\n message: `\"dev\" is not a valid deployment reference.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is not a valid deployment reference.`,\n };\n }\n return { kind: \"valid\", ref: inner.reference };\n }\n case \"inProject\": {\n return {\n kind: \"invalid\",\n message: `Please use \"team:project:ref\" to specify the team when creating a new deployment in a different project.`,\n };\n }\n case \"inTeamProject\": {\n const inner = selector.selector;\n if (inner.kind === \"dev\") {\n return {\n kind: \"invalid\",\n message: `\"dev\" is not a valid deployment reference.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is not a valid deployment reference.`,\n };\n }\n return {\n kind: \"valid\",\n ref: inner.reference,\n teamAndProject: {\n teamSlug: selector.teamSlug,\n projectSlug: selector.projectSlug,\n },\n };\n }\n default:\n selector satisfies never;\n return {\n kind: \"invalid\",\n message: \"Unknown state. This is a bug in Convex.\",\n };\n }\n}\n\nasync function resolveProject(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n): Promise<PlatformProjectDetails> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\": {\n const { deploymentFields } = deploymentSelection.deploymentToActOn;\n if (deploymentFields) {\n return await getProjectDetails(ctx, {\n kind: \"deploymentName\",\n deploymentName: deploymentFields.deploymentName,\n deploymentType: null,\n });\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot infer project from the current deployment configuration. Use `team:project:ref` to specify team and project slugs.\",\n });\n }\n case \"deploymentWithinProject\": {\n return await getProjectDetails(ctx, deploymentSelection.targetProject);\n }\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n });\n }\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No project configured yet. Use `team:project:ref` to specify team and project slugs.\",\n });\n case \"anonymous\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot create a deployment in anonymous mode. \" +\n \"Run `npx convex login` and configure a project first.\",\n });\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deployment selection kind.`,\n });\n }\n }\n}\n\nconst REGION_NAME_TO_ALIAS: Record<string, string> = {\n \"aws-us-east-1\": \"us\",\n \"aws-eu-west-1\": \"eu\",\n};\n\nconst REGION_ALIAS_TO_NAME = Object.fromEntries(\n Object.entries(REGION_NAME_TO_ALIAS).map(([name, alias]) => [alias, name]),\n);\n\nexport async function fetchAvailableRegions(ctx: Context, teamId: number) {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n return regionsResponse.items.filter((item) => item.available);\n}\n\ntype AvailableRegion = Awaited<\n ReturnType<typeof fetchAvailableRegions>\n>[number];\n\nexport function resolveRegionDetails(\n availableRegions: AvailableRegion[],\n region: string,\n) {\n const resolvedRegion = REGION_ALIAS_TO_NAME[region] ?? region;\n return availableRegions.find((item) => item.name === resolvedRegion) ?? null;\n}\n\nasync function resolveRegionDetailsOrCrash(\n ctx: Context,\n availableRegions: AvailableRegion[],\n region: string,\n) {\n const regionDetails = resolveRegionDetails(availableRegions, region);\n if (!regionDetails) {\n return await crashInvalidRegion(ctx, availableRegions, region);\n }\n return regionDetails;\n}\n\nfunction invalidRegionMessage(\n availableRegions: AvailableRegion[],\n region: string,\n): string {\n const formatted = availableRegions\n .map(\n (item) =>\n ` Use \\`--region ${REGION_NAME_TO_ALIAS[item.name] ?? item.name}\\` for ${item.displayName}`,\n )\n .join(\"\\n\");\n return `Invalid region \"${region}\".\\n\\n` + formatted;\n}\n\nasync function crashInvalidRegion(\n ctx: Context,\n availableRegions: AvailableRegion[],\n region: string,\n): Promise<never> {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: invalidRegionMessage(availableRegions, region),\n });\n}\n\n/**\n * Helper to log a value passed in as a CLI argument in the interactive flow.\n */\nfunction logAndUse<T extends string | boolean>(label: string, value: T): T {\n logFinishedStep(`Using ${label}: ${chalkStderr.bold(value)}`);\n return value;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n showSpinner,\n} from \"../bundler/log.js\";\nimport {\n DeploymentSelection,\n getDeploymentSelection,\n getProjectDetails,\n deploymentNameFromSelection,\n} from \"./lib/deploymentSelection.js\";\nimport {\n logNoDefaultRegionMessage,\n selectRegion,\n typedBigBrainClient,\n typedPlatformClient,\n} from \"./lib/utils/utils.js\";\nimport { PlatformProjectDetails } from \"@convex-dev/platform/managementApi\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./lib/deployment.js\";\nimport { saveSelectedDeployment } from \"./deploymentSelect.js\";\nimport { promptOptions, promptString } from \"./lib/utils/prompts.js\";\nimport { chalkStderr } from \"chalk\";\nimport { parseDeploymentSelector } from \"./lib/deploymentSelector.js\";\nimport {\n parseExpiration,\n resolveExpiration,\n validateExpiration,\n} from \"./lib/expiration.js\";\nimport { ensureBackendBinaryDownloaded } from \"./lib/localDeployment/download.js\";\nimport {\n loadProjectLocalConfig,\n saveDeploymentConfig,\n} from \"./lib/localDeployment/filePaths.js\";\nimport {\n chooseLocalBackendPorts,\n LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./lib/localDeployment/utils.js\";\nimport { bigBrainStart } from \"./lib/localDeployment/bigBrain.js\";\n\nconst SUPPORTED_TYPES = [\"dev\", \"prod\", \"preview\"] as const;\n\nexport const deploymentCreate = new Command(\"create\")\n .summary(\"Create a new deployment for a project\")\n .description(\n \"Create a new deployment for a project.\\n\\n\" +\n \" Create a dev deployment and select it: `npx convex deployment create dev/my-new-feature --type dev --select`\\n\" +\n \" Create a prod deployment named \u201Cstaging\u201D: `npx convex deployment create staging --type prod`\\n\" +\n \" Create a local deployment: `npx convex deployment create local`\\n\",\n )\n .argument(\"[ref]\")\n .allowExcessArguments(false)\n .addOption(\n new Option(\"--type <type>\", \"Deployment type\").choices(SUPPORTED_TYPES),\n )\n .option(\"--region <region>\", \"Deployment region\")\n .option(\n \"--select\",\n \"Select the new deployment. This will update the Convex environment variables in .env.local. Subsequent `npx convex` commands will run against this deployment.\",\n )\n .option(\n \"--default\",\n \"Make the new deployment your default production deployment (used by `npx convex deploy`) or your personal dev deployment.\",\n )\n .option(\n \"--expiration <value>\",\n 'When the deployment expires (e.g. \"none\", \"in 7 days\", \"2026-04-01T00:00:00Z\", or a UNIX timestamp in seconds or milliseconds)',\n )\n .action(async (refParam, options) => {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n const currentDeployment = await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Handle `deployment create local`\n if (refParam !== undefined) {\n if (refParam === \"local\") {\n const cloudOnlyFlags = [\n \"type\",\n \"region\",\n \"default\",\n \"expiration\",\n ] as const;\n for (const flag of cloudOnlyFlags) {\n if (options[flag]) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--${flag} cannot be used when creating a local deployment`,\n });\n }\n }\n await createLocalDeployment(\n ctx,\n currentDeployment,\n options.select ?? false,\n );\n return;\n }\n }\n\n const expiresAt = await resolveExpiresAtOrCrash(ctx, options.expiration);\n\n const {\n ref,\n regionDetails,\n projectId,\n type,\n isDefault,\n teamSlug,\n projectSlug,\n } = process.stdin.isTTY\n ? await resolveOptionsInteractively(\n ctx,\n currentDeployment,\n refParam,\n options,\n )\n : await resolveOptionsNoninteractively(\n ctx,\n currentDeployment,\n refParam,\n options,\n );\n\n showSpinner(\n `Creating ${type} deployment` +\n (regionDetails ? ` in region ${regionDetails.displayName}` : \"\") +\n \"...\",\n );\n\n const created = (\n await typedPlatformClient(ctx).POST(\n \"/projects/{project_id}/create_deployment\",\n {\n params: {\n path: { project_id: projectId },\n },\n body: {\n type,\n region: regionDetails?.name ?? null,\n reference: ref ?? null,\n isDefault,\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n },\n },\n )\n ).data!;\n\n if (created.kind !== \"cloud\") {\n // This should be impossible\n const err = `Expected cloud deployment to be created but got ${created.kind}`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: err,\n errForSentry: err,\n });\n }\n\n if (!options.select) {\n logFinishedStep(\n `Provisioned a ${created.isDefault ? \"default \" : \"\"}${created.deploymentType} deployment.`,\n );\n if (type !== \"prod\") {\n const selectRef = `${teamSlug}:${projectSlug}:${created.reference}`;\n logMessage(\n `\\nTo make \\`npx convex\\` use this deployment, run ${chalkStderr.bold(`npx convex deployment select ${selectRef}`)}`,\n );\n logMessage(\n chalkStderr.gray(\n \"Hint: use `--select` to immediately select the newly created deployment.\",\n ),\n );\n }\n }\n\n if (options.select) {\n const selection: DeploymentSelection = {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug,\n projectSlug,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: created.reference,\n },\n };\n await saveSelectedDeployment(\n ctx,\n created.reference,\n selection,\n deploymentNameFromSelection(currentDeployment),\n );\n }\n });\n\nasync function createLocalDeployment(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n select: boolean,\n): Promise<void> {\n const existing = loadProjectLocalConfig(ctx);\n if (existing) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"A local deployment already exists.\",\n });\n }\n\n const { teamSlug, slug: projectSlug } = await resolveProject(\n ctx,\n currentDeployment,\n );\n\n showSpinner(\"Downloading local backend...\");\n const { version } = await ensureBackendBinaryDownloaded(ctx, {\n kind: \"latest\",\n });\n\n const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx);\n\n showSpinner(\"Registering local deployment...\");\n const { deploymentName, adminKey } = await bigBrainStart(ctx, {\n port: cloudPort,\n projectSlug,\n teamSlug,\n instanceName: null,\n });\n\n saveDeploymentConfig(ctx, \"local\", deploymentName, {\n backendVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret: LOCAL_BACKEND_INSTANCE_SECRET,\n });\n\n logFinishedStep(\"Created local deployment.\");\n\n if (select) {\n const selection: DeploymentSelection = {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: \"local\",\n },\n };\n await saveSelectedDeployment(\n ctx,\n \"local\",\n selection,\n deploymentNameFromSelection(currentDeployment),\n );\n }\n\n const devCommand = select\n ? \"npx convex dev\"\n : \"npx convex dev --deployment local\";\n logMessage(`\\nRun ${chalkStderr.bold(devCommand)} to start it.`);\n}\n\ntype RefParam = Parameters<Parameters<typeof deploymentCreate.action>[0]>[0];\ntype OptionsParam = Parameters<\n Parameters<typeof deploymentCreate.action>[0]\n>[1];\n\nasync function resolveOptionsNoninteractively(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n refParam: RefParam,\n options: OptionsParam,\n) {\n let ref: string | undefined;\n let teamAndProject: { teamSlug: string; projectSlug: string } | undefined;\n if (refParam) {\n const result = parseSelectorForNewDeployment(refParam);\n if (result.kind === \"invalid\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: result.message,\n });\n }\n ref = result.ref;\n teamAndProject = result.teamAndProject;\n }\n\n if (!ref && !options.default) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Specify a deployment ref or use --default:\\n\" +\n \" `npx convex deployment create my-deployment-ref --type dev`\\n\" +\n \" `npx convex deployment create --type prod --default`\",\n });\n }\n\n if (!options.type) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--type is required (supported values: ${SUPPORTED_TYPES.join(\", \")})`,\n });\n }\n\n const project = teamAndProject\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProject.teamSlug,\n projectSlug: teamAndProject.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\n const projectId = project.id;\n\n // If no region is passed in, the team's default region will be used\n let regionDetails: AvailableRegion | null = null;\n if (options.region) {\n const availableRegions = await fetchAvailableRegions(ctx, project.teamId);\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n options.region,\n );\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId,\n regionDetails,\n type: options.type,\n teamSlug: project.teamSlug,\n projectSlug: project.slug,\n };\n}\n\nasync function resolveOptionsInteractively(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n refParam: RefParam,\n options: OptionsParam,\n) {\n let deploymentType: \"dev\" | \"prod\" | \"preview\";\n if (options.type) {\n deploymentType = logAndUse(\"type\", options.type);\n } else {\n const dtypeChoices = [\n {\n name: \"dev\",\n value: \"dev\" as const,\n },\n {\n name: \"preview\",\n value: \"preview\" as const,\n },\n {\n name: \"prod\",\n value: \"prod\" as const,\n },\n ];\n deploymentType = await promptOptions(ctx, {\n message: \"Deployment type?\",\n choices: dtypeChoices,\n });\n }\n\n let ref: string | undefined;\n let teamAndProject: { teamSlug: string; projectSlug: string } | undefined;\n if (refParam) {\n const result = parseSelectorForNewDeployment(refParam);\n if (result.kind === \"invalid\") {\n logFailure(result.message);\n } else {\n ref = logAndUse(\"ref\", result.ref);\n teamAndProject = result.teamAndProject;\n }\n }\n while (ref === undefined) {\n const input = await promptString(ctx, {\n message:\n \"How to name this deployment?\\n\" +\n chalkStderr.reset.dim(\n \"The deployment reference will be used to identify your deployment on the dashboard and in CLI commands.\\nExamples: staging, dev/james/feature-payment-integration\",\n ) +\n \"\\n>\",\n validate: validateTentativeReference,\n });\n const result = parseSelectorForNewDeployment(input);\n if (result.kind === \"invalid\") {\n logFailure(result.message);\n continue;\n }\n ref = result.ref;\n teamAndProject = result.teamAndProject;\n }\n\n const project = teamAndProject\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProject.teamSlug,\n projectSlug: teamAndProject.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\n\n const availableRegions = await fetchAvailableRegions(ctx, project.teamId);\n let regionDetails: AvailableRegion;\n if (options.region) {\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n options.region,\n );\n logAndUse(\"region\", regionDetails.displayName);\n } else {\n // Use the team's default region if set, or prompt the user to pick\n // TODO: this duplicates some of the logic in selectRegionOrUseDefault (npm-packages/convex/src/cli/lib/utils/utils.ts)\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n const team = teams.find((team) => team.slug === project.teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${project.teamSlug} not found.`,\n });\n }\n const regionName =\n team.defaultRegion ?? (await selectRegion(ctx, team.id, deploymentType));\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n regionName,\n );\n if (team.defaultRegion) {\n logFinishedStep(\n `Using team default region of ${regionDetails.displayName}`,\n );\n } else {\n logNoDefaultRegionMessage(team.slug);\n }\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId: project.id,\n regionDetails,\n type: deploymentType,\n teamSlug: project.teamSlug,\n projectSlug: project.slug,\n };\n}\n\ntype NewDeploymentSelectorResult =\n | {\n kind: \"valid\";\n ref: string;\n teamAndProject?: { teamSlug: string; projectSlug: string };\n }\n | { kind: \"invalid\"; message: string };\n\nfunction parseSelectorForNewDeployment(\n selectorString: string,\n): NewDeploymentSelectorResult {\n const selector = parseDeploymentSelector(selectorString);\n switch (selector.kind) {\n case \"local\":\n return {\n kind: \"invalid\",\n message: `\"local\" is not a valid deployment reference. To create a local deployment, run ${chalkStderr.bold(\"npx convex deployment create local\")}`,\n };\n case \"deploymentName\":\n return {\n kind: \"invalid\",\n message: `\"${selector.deploymentName}\" is not a valid deployment reference. References cannot be in the format abc-xyz-123, as it is reserved for deployment names.`,\n };\n case \"inCurrentProject\": {\n const inner = selector.selector;\n if (inner.kind === \"dev\") {\n return {\n kind: \"invalid\",\n message: `\"dev\" is not a valid deployment reference.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is not a valid deployment reference.`,\n };\n }\n return { kind: \"valid\", ref: inner.reference };\n }\n case \"inProject\": {\n return {\n kind: \"invalid\",\n message: `Please use \"team:project:ref\" to specify the team when creating a new deployment in a different project.`,\n };\n }\n case \"inTeamProject\": {\n const inner = selector.selector;\n if (inner.kind === \"dev\") {\n return {\n kind: \"invalid\",\n message: `\"dev\" is not a valid deployment reference.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is not a valid deployment reference.`,\n };\n }\n return {\n kind: \"valid\",\n ref: inner.reference,\n teamAndProject: {\n teamSlug: selector.teamSlug,\n projectSlug: selector.projectSlug,\n },\n };\n }\n default:\n selector satisfies never;\n return {\n kind: \"invalid\",\n message: \"Unknown state. This is a bug in Convex.\",\n };\n }\n}\n\nasync function resolveProject(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n): Promise<PlatformProjectDetails> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\": {\n const { deploymentFields } = deploymentSelection.deploymentToActOn;\n if (deploymentFields) {\n return await getProjectDetails(ctx, {\n kind: \"deploymentName\",\n deploymentName: deploymentFields.deploymentName,\n deploymentType: null,\n });\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot infer project from the current deployment configuration. Use `team:project:ref` to specify team and project slugs.\",\n });\n }\n case \"deploymentWithinProject\": {\n return await getProjectDetails(ctx, deploymentSelection.targetProject);\n }\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n });\n }\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No project configured yet. Use `team:project:ref` to specify team and project slugs.\",\n });\n case \"anonymous\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot create a deployment in anonymous mode. \" +\n \"Run `npx convex login` and configure a project first.\",\n });\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deployment selection kind.`,\n });\n }\n }\n}\n\nconst REGION_NAME_TO_ALIAS: Record<string, string> = {\n \"aws-us-east-1\": \"us\",\n \"aws-eu-west-1\": \"eu\",\n};\n\nconst REGION_ALIAS_TO_NAME = Object.fromEntries(\n Object.entries(REGION_NAME_TO_ALIAS).map(([name, alias]) => [alias, name]),\n);\n\nexport async function fetchAvailableRegions(ctx: Context, teamId: number) {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n return regionsResponse.items.filter((item) => item.available);\n}\n\ntype AvailableRegion = Awaited<\n ReturnType<typeof fetchAvailableRegions>\n>[number];\n\nexport function resolveRegionDetails(\n availableRegions: AvailableRegion[],\n region: string,\n) {\n const resolvedRegion = REGION_ALIAS_TO_NAME[region] ?? region;\n return availableRegions.find((item) => item.name === resolvedRegion) ?? null;\n}\n\nasync function resolveRegionDetailsOrCrash(\n ctx: Context,\n availableRegions: AvailableRegion[],\n region: string,\n) {\n const regionDetails = resolveRegionDetails(availableRegions, region);\n if (!regionDetails) {\n return await crashInvalidRegion(ctx, availableRegions, region);\n }\n return regionDetails;\n}\n\nfunction invalidRegionMessage(\n availableRegions: AvailableRegion[],\n region: string,\n): string {\n const formatted = availableRegions\n .map(\n (item) =>\n ` Use \\`--region ${REGION_NAME_TO_ALIAS[item.name] ?? item.name}\\` for ${item.displayName}`,\n )\n .join(\"\\n\");\n return `Invalid region \"${region}\".\\n\\n` + formatted;\n}\n\nasync function crashInvalidRegion(\n ctx: Context,\n availableRegions: AvailableRegion[],\n region: string,\n): Promise<never> {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: invalidRegionMessage(availableRegions, region),\n });\n}\n\nasync function resolveExpiresAtOrCrash(\n ctx: Context,\n expiration: string | undefined,\n): Promise<number | null | undefined> {\n if (!expiration) {\n return undefined;\n }\n const parsed = parseExpiration(expiration);\n if (parsed.kind === \"error\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: parsed.message,\n });\n }\n const now = Date.now();\n const resolved = resolveExpiration(parsed, now);\n if (resolved !== null) {\n const validation = validateExpiration(resolved, now);\n if (validation.kind === \"error\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: validation.message,\n });\n }\n }\n return resolved;\n}\n\n/**\n * Helper to log a value passed in as a CLI argument in the interactive flow.\n */\nfunction logAndUse<T extends string | boolean>(label: string, value: T): T {\n logFinishedStep(`Using ${label}: ${chalkStderr.bold(value)}`);\n return value;\n}\n\n// This is an oversimplification, it\u2019s fine if it fails later\nfunction validateTentativeReference(tentativeReference: string): true | string {\n if (tentativeReference.length < 3) {\n return \"References must be at least 3 characters\";\n }\n if (tentativeReference.length > 100) {\n return \"References must be at most 100 characters\";\n }\n if (!/^[a-z0-9/-]+$/.test(tentativeReference)) {\n return \"References can only contain lowercase letters, numbers, hyphens, and slashes\";\n }\n if (tentativeReference === \"dev\") {\n return '\"dev\" is not a valid deployment reference.';\n }\n if (tentativeReference === \"prod\") {\n return '\"prod\" is not a valid deployment reference.';\n }\n if (tentativeReference === \"local\") {\n return `\"local\" is not a valid deployment reference. To create a local deployment, run ${chalkStderr.bold(\"npx convex deployment create local\")}`;\n }\n if (/^[a-z]+-[a-z]+-\\d+$/.test(tentativeReference)) {\n return \"References cannot be in the format abc-xyz-123, as it is reserved for deployment names\";\n }\n\n return true;\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,SAAS,cAAc;AAChC,SAAkB,qBAAqB;AACvC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EAEE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAS,4CAA4C;AACrD,SAAS,8BAA8B;AACvC,SAAS,eAAe,oBAAoB;AAC5C,SAAS,mBAAmB;AAC5B,SAAS,+BAA+B;AACxC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qCAAqC;AAC9C;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP;AAAA,EACE;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;AAE9B,MAAM,kBAAkB,CAAC,OAAO,QAAQ,SAAS;AAE1C,aAAM,mBAAmB,IAAI,QAAQ,QAAQ,EACjD,QAAQ,uCAAuC,EAC/C;AAAA,EACC;AAIF,EACC,SAAS,OAAO,EAChB,qBAAqB,KAAK,EAC1B;AAAA,EACC,IAAI,OAAO,iBAAiB,iBAAiB,EAAE,QAAQ,eAAe;AACxE,EACC,OAAO,qBAAqB,mBAAmB,EAC/C;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,OAAO,OAAO,UAAU,YAAY;AACnC,QAAM,MAAM,MAAM,cAAc;AAAA,IAC9B,KAAK;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,EACX,CAAC;AAED,QAAM,oBAAoB,MAAM,uBAAuB,KAAK;AAAA,IAC1D,KAAK;AAAA,IACL,UAAU;AAAA,IACV,SAAS;AAAA,EACX,CAAC;AAGD,MAAI,aAAa,QAAW;AAC1B,QAAI,aAAa,SAAS;AACxB,YAAM,iBAAiB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,iBAAW,QAAQ,gBAAgB;AACjC,YAAI,QAAQ,IAAI,GAAG;AACjB,iBAAO,MAAM,IAAI,MAAM;AAAA,YACrB,UAAU;AAAA,YACV,WAAW;AAAA,YACX,gBAAgB,KAAK,IAAI;AAAA,UAC3B,CAAC;AAAA,QACH;AAAA,MACF;AACA,YAAM;AAAA,QACJ;AAAA,QACA;AAAA,QACA,QAAQ,UAAU;AAAA,MACpB;AACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,YAAY,MAAM,wBAAwB,KAAK,QAAQ,UAAU;AAEvE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,QAAQ,MAAM,QACd,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IACA,MAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEJ;AAAA,IACE,YAAY,IAAI,iBACb,gBAAgB,cAAc,cAAc,WAAW,KAAK,MAC7D;AAAA,EACJ;AAEA,QAAM,WACJ,MAAM,oBAAoB,GAAG,EAAE;AAAA,IAC7B;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,QACN,MAAM,EAAE,YAAY,UAAU;AAAA,MAChC;AAAA,MACA,MAAM;AAAA,QACJ;AAAA,QACA,QAAQ,eAAe,QAAQ;AAAA,QAC/B,WAAW,OAAO;AAAA,QAClB;AAAA,QACA,GAAI,cAAc,SAAY,EAAE,UAAU,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AAAA,EACF,GACA;AAEF,MAAI,QAAQ,SAAS,SAAS;AAE5B,UAAM,MAAM,mDAAmD,QAAQ,IAAI;AAC3E,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,MAChB,cAAc;AAAA,IAChB,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,QAAQ,QAAQ;AACnB;AAAA,MACE,iBAAiB,QAAQ,YAAY,aAAa,EAAE,GAAG,QAAQ,cAAc;AAAA,IAC/E;AACA,QAAI,SAAS,QAAQ;AACnB,YAAM,YAAY,GAAG,QAAQ,IAAI,WAAW,IAAI,QAAQ,SAAS;AACjE;AAAA,QACE;AAAA,kDAAqD,YAAY,KAAK,gCAAgC,SAAS,EAAE,CAAC;AAAA,MACpH;AACA;AAAA,QACE,YAAY;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,QAAQ;AAClB,UAAM,YAAiC;AAAA,MACrC,MAAM;AAAA,MACN,eAAe;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAAA,MACA,wBAAwB;AAAA,QACtB,MAAM;AAAA,QACN,UAAU,QAAQ;AAAA,MACpB;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,MACA,QAAQ;AAAA,MACR;AAAA,MACA,4BAA4B,iBAAiB;AAAA,IAC/C;AAAA,EACF;AACF,CAAC;AAEH,eAAe,sBACb,KACA,mBACA,QACe;AACf,QAAM,WAAW,uBAAuB,GAAG;AAC3C,MAAI,UAAU;AACZ,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,EAAE,UAAU,MAAM,YAAY,IAAI,MAAM;AAAA,IAC5C;AAAA,IACA;AAAA,EACF;AAEA,cAAY,8BAA8B;AAC1C,QAAM,EAAE,QAAQ,IAAI,MAAM,8BAA8B,KAAK;AAAA,IAC3D,MAAM;AAAA,EACR,CAAC;AAED,QAAM,EAAE,WAAW,SAAS,IAAI,MAAM,wBAAwB,GAAG;AAEjE,cAAY,iCAAiC;AAC7C,QAAM,EAAE,gBAAgB,SAAS,IAAI,MAAM,cAAc,KAAK;AAAA,IAC5D,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,cAAc;AAAA,EAChB,CAAC;AAED,uBAAqB,KAAK,SAAS,gBAAgB;AAAA,IACjD,gBAAgB;AAAA,IAChB,OAAO,EAAE,OAAO,WAAW,MAAM,SAAS;AAAA,IAC1C;AAAA,IACA,gBAAgB;AAAA,EAClB,CAAC;AAED,kBAAgB,2BAA2B;AAE3C,MAAI,QAAQ;AACV,UAAM,YAAiC;AAAA,MACrC,MAAM;AAAA,MACN,eAAe;AAAA,QACb,MAAM;AAAA,QACN;AAAA,QACA,gBAAgB;AAAA,MAClB;AAAA,MACA,wBAAwB;AAAA,QACtB,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AACA,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA,4BAA4B,iBAAiB;AAAA,IAC/C;AAAA,EACF;AAEA,QAAM,aAAa,SACf,mBACA;AACJ,aAAW;AAAA,MAAS,YAAY,KAAK,UAAU,CAAC,eAAe;AACjE;AAOA,eAAe,+BACb,KACA,mBACA,UACA,SACA;AACA,MAAI;AACJ,MAAI;AACJ,MAAI,UAAU;AACZ,UAAM,SAAS,8BAA8B,QAAQ;AACrD,QAAI,OAAO,SAAS,WAAW;AAC7B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,OAAO;AAAA,MACzB,CAAC;AAAA,IACH;AACA,UAAM,OAAO;AACb,qBAAiB,OAAO;AAAA,EAC1B;AAEA,MAAI,CAAC,OAAO,CAAC,QAAQ,SAAS;AAC5B,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBACE;AAAA,IAGJ,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,QAAQ,MAAM;AACjB,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,yCAAyC,gBAAgB,KAAK,IAAI,CAAC;AAAA,IACrF,CAAC;AAAA,EACH;AAEA,QAAM,UAAU,iBACZ,MAAM,kBAAkB,KAAK;AAAA,IAC3B,MAAM;AAAA,IACN,UAAU,eAAe;AAAA,IACzB,aAAa,eAAe;AAAA,EAC9B,CAAC,IACD,MAAM,eAAe,KAAK,iBAAiB;AAC/C,QAAM,YAAY,QAAQ;AAG1B,MAAI,gBAAwC;AAC5C,MAAI,QAAQ,QAAQ;AAClB,UAAM,mBAAmB,MAAM,sBAAsB,KAAK,QAAQ,MAAM;AACxE,oBAAgB,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,WAAW,QAAQ,WAAW;AAAA,IAC9B;AAAA,IACA;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,EACvB;AACF;AAEA,eAAe,4BACb,KACA,mBACA,UACA,SACA;AACA,MAAI;AACJ,MAAI,QAAQ,MAAM;AAChB,qBAAiB,UAAU,QAAQ,QAAQ,IAAI;AAAA,EACjD,OAAO;AACL,UAAM,eAAe;AAAA,MACnB;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,QACE,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,IACF;AACA,qBAAiB,MAAM,cAAc,KAAK;AAAA,MACxC,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH;AAEA,MAAI;AACJ,MAAI;AACJ,MAAI,UAAU;AACZ,UAAM,SAAS,8BAA8B,QAAQ;AACrD,QAAI,OAAO,SAAS,WAAW;AAC7B,iBAAW,OAAO,OAAO;AAAA,IAC3B,OAAO;AACL,YAAM,UAAU,OAAO,OAAO,GAAG;AACjC,uBAAiB,OAAO;AAAA,IAC1B;AAAA,EACF;AACA,SAAO,QAAQ,QAAW;AACxB,UAAM,QAAQ,MAAM,aAAa,KAAK;AAAA,MACpC,SACE,mCACA,YAAY,MAAM;AAAA,QAChB;AAAA,MACF,IACA;AAAA,MACF,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,SAAS,8BAA8B,KAAK;AAClD,QAAI,OAAO,SAAS,WAAW;AAC7B,iBAAW,OAAO,OAAO;AACzB;AAAA,IACF;AACA,UAAM,OAAO;AACb,qBAAiB,OAAO;AAAA,EAC1B;AAEA,QAAM,UAAU,iBACZ,MAAM,kBAAkB,KAAK;AAAA,IAC3B,MAAM;AAAA,IACN,UAAU,eAAe;AAAA,IACzB,aAAa,eAAe;AAAA,EAC9B,CAAC,IACD,MAAM,eAAe,KAAK,iBAAiB;AAE/C,QAAM,mBAAmB,MAAM,sBAAsB,KAAK,QAAQ,MAAM;AACxE,MAAI;AACJ,MAAI,QAAQ,QAAQ;AAClB,oBAAgB,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA,QAAQ;AAAA,IACV;AACA,cAAU,UAAU,cAAc,WAAW;AAAA,EAC/C,OAAO;AAGL,UAAM,SAAS,MAAM,oBAAoB,GAAG,EAAE,IAAI,QAAQ,GAAG;AAC7D,UAAM,OAAO,MAAM,KAAK,CAACA,UAASA,MAAK,SAAS,QAAQ,QAAQ;AAChE,QAAI,CAAC,MAAM;AACT,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,eAAe,QAAQ,QAAQ;AAAA,MACjD,CAAC;AAAA,IACH;AACA,UAAM,aACJ,KAAK,iBAAkB,MAAM,aAAa,KAAK,KAAK,IAAI,cAAc;AACxE,oBAAgB,MAAM;AAAA,MACpB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,QAAI,KAAK,eAAe;AACtB;AAAA,QACE,gCAAgC,cAAc,WAAW;AAAA,MAC3D;AAAA,IACF,OAAO;AACL,gCAA0B,KAAK,IAAI;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA,WAAW,QAAQ,WAAW;AAAA,IAC9B,WAAW,QAAQ;AAAA,IACnB;AAAA,IACA,MAAM;AAAA,IACN,UAAU,QAAQ;AAAA,IAClB,aAAa,QAAQ;AAAA,EACvB;AACF;AAUA,SAAS,8BACP,gBAC6B;AAC7B,QAAM,WAAW,wBAAwB,cAAc;AACvD,UAAQ,SAAS,MAAM;AAAA,IACrB,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,kFAAkF,YAAY,KAAK,oCAAoC,CAAC;AAAA,MACnJ;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS,IAAI,SAAS,cAAc;AAAA,MACtC;AAAA,IACF,KAAK,oBAAoB;AACvB,YAAM,QAAQ,SAAS;AACvB,UAAI,MAAM,SAAS,OAAO;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AACA,UAAI,MAAM,SAAS,QAAQ;AACzB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AACA,aAAO,EAAE,MAAM,SAAS,KAAK,MAAM,UAAU;AAAA,IAC/C;AAAA,IACA,KAAK,aAAa;AAChB,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,YAAM,QAAQ,SAAS;AACvB,UAAI,MAAM,SAAS,OAAO;AACxB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AACA,UAAI,MAAM,SAAS,QAAQ;AACzB,eAAO;AAAA,UACL,MAAM;AAAA,UACN,SAAS;AAAA,QACX;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,gBAAgB;AAAA,UACd,UAAU,SAAS;AAAA,UACnB,aAAa,SAAS;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAAA,IACA;AACE;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,SAAS;AAAA,MACX;AAAA,EACJ;AACF;AAEA,eAAe,eACb,KACA,qBACiC;AACjC,UAAQ,oBAAoB,MAAM;AAAA,IAChC,KAAK,sBAAsB;AACzB,YAAM,EAAE,iBAAiB,IAAI,oBAAoB;AACjD,UAAI,kBAAkB;AACpB,eAAO,MAAM,kBAAkB,KAAK;AAAA,UAClC,MAAM;AAAA,UACN,gBAAgB,iBAAiB;AAAA,UACjC,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AACA,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,IACA,KAAK,2BAA2B;AAC9B,aAAO,MAAM,kBAAkB,KAAK,oBAAoB,aAAa;AAAA,IACvE;AAAA,IACA,KAAK,WAAW;AACd,YAAM,QAAQ,MAAM;AAAA,QAClB;AAAA,QACA,oBAAoB;AAAA,MACtB;AACA,aAAO,MAAM,kBAAkB,KAAK;AAAA,QAClC,MAAM;AAAA,QACN,UAAU,MAAM;AAAA,QAChB,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AACH,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MACJ,CAAC;AAAA,IACH,KAAK;AACH,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE;AAAA,MAEJ,CAAC;AAAA,IACH,SAAS;AACP;AACA,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,MAAM,uBAA+C;AAAA,EACnD,iBAAiB;AAAA,EACjB,iBAAiB;AACnB;AAEA,MAAM,uBAAuB,OAAO;AAAA,EAClC,OAAO,QAAQ,oBAAoB,EAAE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,OAAO,IAAI,CAAC;AAC3E;AAEA,sBAAsB,sBAAsB,KAAc,QAAgB;AACxE,QAAM,mBACJ,MAAM,oBAAoB,GAAG,EAAE;AAAA,IAC7B;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,QACN,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG;AAAA,MAC/B;AAAA,IACF;AAAA,EACF,GACA;AACF,SAAO,gBAAgB,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS;AAC9D;AAMO,gBAAS,qBACd,kBACA,QACA;AACA,QAAM,iBAAiB,qBAAqB,MAAM,KAAK;AACvD,SAAO,iBAAiB,KAAK,CAAC,SAAS,KAAK,SAAS,cAAc,KAAK;AAC1E;AAEA,eAAe,4BACb,KACA,kBACA,QACA;AACA,QAAM,gBAAgB,qBAAqB,kBAAkB,MAAM;AACnE,MAAI,CAAC,eAAe;AAClB,WAAO,MAAM,mBAAmB,KAAK,kBAAkB,MAAM;AAAA,EAC/D;AACA,SAAO;AACT;AAEA,SAAS,qBACP,kBACA,QACQ;AACR,QAAM,YAAY,iBACf;AAAA,IACC,CAAC,SACC,sBAAsB,qBAAqB,KAAK,IAAI,KAAK,KAAK,IAAI,UAAU,KAAK,WAAW;AAAA,EAChG,EACC,KAAK,IAAI;AACZ,SAAO,mBAAmB,MAAM;AAAA;AAAA,IAAW;AAC7C;AAEA,eAAe,mBACb,KACA,kBACA,QACgB;AAChB,SAAO,MAAM,IAAI,MAAM;AAAA,IACrB,UAAU;AAAA,IACV,WAAW;AAAA,IACX,gBAAgB,qBAAqB,kBAAkB,MAAM;AAAA,EAC/D,CAAC;AACH;AAEA,eAAe,wBACb,KACA,YACoC;AACpC,MAAI,CAAC,YAAY;AACf,WAAO;AAAA,EACT;AACA,QAAM,SAAS,gBAAgB,UAAU;AACzC,MAAI,OAAO,SAAS,SAAS;AAC3B,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,OAAO;AAAA,IACzB,CAAC;AAAA,EACH;AACA,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,WAAW,kBAAkB,QAAQ,GAAG;AAC9C,MAAI,aAAa,MAAM;AACrB,UAAM,aAAa,mBAAmB,UAAU,GAAG;AACnD,QAAI,WAAW,SAAS,SAAS;AAC/B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,WAAW;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,EACF;AACA,SAAO;AACT;AAKA,SAAS,UAAsC,OAAe,OAAa;AACzE,kBAAgB,SAAS,KAAK,KAAK,YAAY,KAAK,KAAK,CAAC,EAAE;AAC5D,SAAO;AACT;AAGA,SAAS,2BAA2B,oBAA2C;AAC7E,MAAI,mBAAmB,SAAS,GAAG;AACjC,WAAO;AAAA,EACT;AACA,MAAI,mBAAmB,SAAS,KAAK;AACnC,WAAO;AAAA,EACT;AACA,MAAI,CAAC,gBAAgB,KAAK,kBAAkB,GAAG;AAC7C,WAAO;AAAA,EACT;AACA,MAAI,uBAAuB,OAAO;AAChC,WAAO;AAAA,EACT;AACA,MAAI,uBAAuB,QAAQ;AACjC,WAAO;AAAA,EACT;AACA,MAAI,uBAAuB,SAAS;AAClC,WAAO,kFAAkF,YAAY,KAAK,oCAAoC,CAAC;AAAA,EACjJ;AACA,MAAI,sBAAsB,KAAK,kBAAkB,GAAG;AAClD,WAAO;AAAA,EACT;AAEA,SAAO;AACT;",
|
|
6
6
|
"names": ["team"]
|
|
7
7
|
}
|