convex 1.40.0 → 1.41.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 +11 -0
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/cli/aiFiles.js +2 -2
- package/dist/cjs/cli/aiFiles.js.map +1 -1
- package/dist/cjs/cli/configure.js +1 -4
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/convexExport.js +3 -3
- package/dist/cjs/cli/convexExport.js.map +1 -1
- package/dist/cjs/cli/convexImport.js +2 -2
- package/dist/cjs/cli/convexImport.js.map +1 -1
- package/dist/cjs/cli/dashboard.js +19 -6
- package/dist/cjs/cli/dashboard.js.map +3 -3
- package/dist/cjs/cli/data.js +2 -2
- package/dist/cjs/cli/data.js.map +1 -1
- package/dist/cjs/cli/deploy.js +5 -5
- package/dist/cjs/cli/deploy.js.map +2 -2
- package/dist/cjs/cli/deploymentCreate.js +11 -5
- package/dist/cjs/cli/deploymentCreate.js.map +2 -2
- package/dist/cjs/cli/deploymentSelect.js +5 -5
- package/dist/cjs/cli/deploymentSelect.js.map +1 -1
- package/dist/cjs/cli/deploymentTokenCreate.js +5 -13
- package/dist/cjs/cli/deploymentTokenCreate.js.map +2 -2
- package/dist/cjs/cli/deploymentTokenDelete.js +4 -11
- package/dist/cjs/cli/deploymentTokenDelete.js.map +2 -2
- package/dist/cjs/cli/dev.js +6 -5
- package/dist/cjs/cli/dev.js.map +2 -2
- package/dist/cjs/cli/env.js +16 -16
- package/dist/cjs/cli/env.js.map +2 -2
- package/dist/cjs/cli/envDefault.js +10 -10
- package/dist/cjs/cli/envDefault.js.map +1 -1
- package/dist/cjs/cli/insights.js +3 -3
- package/dist/cjs/cli/insights.js.map +1 -1
- package/dist/cjs/cli/lib/aiFiles/skills.js +2 -2
- package/dist/cjs/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/cjs/cli/lib/command.js +1 -1
- package/dist/cjs/cli/lib/command.js.map +1 -1
- package/dist/cjs/cli/lib/deployment.js.map +1 -1
- package/dist/cjs/cli/lib/deploymentSelection.js +39 -0
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/dev.js +31 -0
- package/dist/cjs/cli/lib/dev.js.map +2 -2
- package/dist/cjs/cli/lib/generateDocs.js +256 -0
- package/dist/cjs/cli/lib/generateDocs.js.map +7 -0
- package/dist/cjs/cli/lib/localDeployment/anonymous.js +24 -49
- package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +3 -3
- package/dist/cjs/cli/lib/localDeployment/bigBrain.js +0 -9
- package/dist/cjs/cli/lib/localDeployment/bigBrain.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/dashboard.js +30 -68
- package/dist/cjs/cli/lib/localDeployment/dashboard.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/download.js +14 -1
- package/dist/cjs/cli/lib/localDeployment/download.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/filePaths.js +33 -4
- package/dist/cjs/cli/lib/localDeployment/filePaths.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js +37 -126
- package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +3 -3
- package/dist/cjs/cli/lib/localDeployment/secrets.js +91 -0
- package/dist/cjs/cli/lib/localDeployment/secrets.js.map +7 -0
- package/dist/cjs/cli/lib/localDeployment/upgrade.js +43 -28
- package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +3 -3
- package/dist/cjs/cli/lib/localDeployment/utils.js +0 -19
- package/dist/cjs/cli/lib/localDeployment/utils.js.map +3 -3
- package/dist/cjs/cli/lib/runTestFunction.js +3 -3
- package/dist/cjs/cli/lib/runTestFunction.js.map +1 -1
- package/dist/cjs/cli/run.js +5 -5
- package/dist/cjs/cli/run.js.map +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/impl/registration_impl.js +0 -1
- package/dist/cjs/server/impl/registration_impl.js.map +2 -2
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs/server/meta.js.map +1 -1
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs-types/cli/configure.d.ts +3 -2
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/dashboard.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +16 -16
- package/dist/cjs-types/cli/lib/deployment.d.ts +0 -2
- package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +7 -0
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dev.d.ts +2 -1
- package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/generateDocs.d.ts +20 -0
- package/dist/cjs-types/cli/lib/generateDocs.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/generateDocs.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/generateDocs.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
- package/dist/cjs-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
- package/dist/cjs-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/download.d.ts +11 -1
- package/dist/cjs-types/cli/lib/localDeployment/download.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
- package/dist/cjs-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
- package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts +31 -0
- package/dist/cjs-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +0 -2
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/versionApi.d.ts +2 -2
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +1 -1
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +16 -0
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cjs-types/server/registration.d.ts +11 -5
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +66405 -67923
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/cli/aiFiles.js +2 -2
- package/dist/esm/cli/aiFiles.js.map +1 -1
- package/dist/esm/cli/configure.js +1 -4
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/convexExport.js +3 -3
- package/dist/esm/cli/convexExport.js.map +1 -1
- package/dist/esm/cli/convexImport.js +2 -2
- package/dist/esm/cli/convexImport.js.map +1 -1
- package/dist/esm/cli/dashboard.js +16 -3
- package/dist/esm/cli/dashboard.js.map +2 -2
- package/dist/esm/cli/data.js +2 -2
- package/dist/esm/cli/data.js.map +1 -1
- package/dist/esm/cli/deploy.js +5 -5
- package/dist/esm/cli/deploy.js.map +2 -2
- package/dist/esm/cli/deploymentCreate.js +13 -9
- package/dist/esm/cli/deploymentCreate.js.map +2 -2
- package/dist/esm/cli/deploymentSelect.js +5 -5
- package/dist/esm/cli/deploymentSelect.js.map +1 -1
- package/dist/esm/cli/deploymentTokenCreate.js +9 -15
- package/dist/esm/cli/deploymentTokenCreate.js.map +2 -2
- package/dist/esm/cli/deploymentTokenDelete.js +8 -16
- package/dist/esm/cli/deploymentTokenDelete.js.map +2 -2
- package/dist/esm/cli/dev.js +6 -5
- package/dist/esm/cli/dev.js.map +2 -2
- package/dist/esm/cli/env.js +16 -16
- package/dist/esm/cli/env.js.map +2 -2
- package/dist/esm/cli/envDefault.js +10 -10
- package/dist/esm/cli/envDefault.js.map +1 -1
- package/dist/esm/cli/insights.js +3 -3
- package/dist/esm/cli/insights.js.map +1 -1
- package/dist/esm/cli/lib/aiFiles/skills.js +2 -2
- package/dist/esm/cli/lib/aiFiles/skills.js.map +2 -2
- package/dist/esm/cli/lib/command.js +1 -1
- package/dist/esm/cli/lib/command.js.map +1 -1
- package/dist/esm/cli/lib/deployment.js.map +1 -1
- package/dist/esm/cli/lib/deploymentSelection.js +38 -0
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/dev.js +31 -0
- package/dist/esm/cli/lib/dev.js.map +2 -2
- package/dist/esm/cli/lib/generateDocs.js +233 -0
- package/dist/esm/cli/lib/generateDocs.js.map +7 -0
- package/dist/esm/cli/lib/localDeployment/anonymous.js +30 -61
- package/dist/esm/cli/lib/localDeployment/anonymous.js.map +3 -3
- package/dist/esm/cli/lib/localDeployment/bigBrain.js +0 -8
- package/dist/esm/cli/lib/localDeployment/bigBrain.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/dashboard.js +36 -69
- package/dist/esm/cli/lib/localDeployment/dashboard.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/download.js +15 -2
- package/dist/esm/cli/lib/localDeployment/download.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/filePaths.js +29 -2
- package/dist/esm/cli/lib/localDeployment/filePaths.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/localDeployment.js +40 -134
- package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +3 -3
- package/dist/esm/cli/lib/localDeployment/secrets.js +57 -0
- package/dist/esm/cli/lib/localDeployment/secrets.js.map +7 -0
- package/dist/esm/cli/lib/localDeployment/upgrade.js +45 -28
- package/dist/esm/cli/lib/localDeployment/upgrade.js.map +3 -3
- package/dist/esm/cli/lib/localDeployment/utils.js +0 -7
- package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/esm/cli/lib/runTestFunction.js +3 -3
- package/dist/esm/cli/lib/runTestFunction.js.map +1 -1
- package/dist/esm/cli/run.js +5 -5
- package/dist/esm/cli/run.js.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/impl/registration_impl.js +0 -1
- package/dist/esm/server/impl/registration_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm-types/cli/configure.d.ts +3 -2
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/dashboard.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +4 -4
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +16 -16
- package/dist/esm-types/cli/lib/deployment.d.ts +0 -2
- package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts +7 -0
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dev.d.ts +2 -1
- package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/generateDocs.d.ts +20 -0
- package/dist/esm-types/cli/lib/generateDocs.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/generateDocs.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/generateDocs.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts +1 -1
- package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts +2 -4
- package/dist/esm-types/cli/lib/localDeployment/bigBrain.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts +9 -4
- package/dist/esm-types/cli/lib/localDeployment/dashboard.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/download.d.ts +11 -1
- package/dist/esm-types/cli/lib/localDeployment/download.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts +16 -5
- package/dist/esm-types/cli/lib/localDeployment/filePaths.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts +1 -9
- package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts +31 -0
- package/dist/esm-types/cli/lib/localDeployment/secrets.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/localDeployment/secrets.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts +6 -3
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +0 -2
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/versionApi.d.ts +2 -2
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +1 -1
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +16 -0
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/esm-types/server/registration.d.ts +11 -5
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/react.bundle.js +1 -1
- package/dist/react.bundle.js.map +1 -1
- package/package.json +4 -2
- package/src/browser/sync/request_manager.test.ts +2 -2
- package/src/cli/aiFiles.ts +2 -2
- package/src/cli/configure.ts +4 -6
- package/src/cli/convexExport.ts +3 -3
- package/src/cli/convexImport.ts +2 -2
- package/src/cli/dashboard.ts +29 -3
- package/src/cli/data.ts +2 -2
- package/src/cli/deploy.ts +5 -5
- package/src/cli/deploymentCreate.test.ts +151 -24
- package/src/cli/deploymentCreate.ts +21 -11
- package/src/cli/deploymentSelect.ts +5 -5
- package/src/cli/deploymentSelection.test.ts +0 -3
- package/src/cli/deploymentToken.test.ts +34 -23
- package/src/cli/deploymentTokenCreate.ts +9 -21
- package/src/cli/deploymentTokenDelete.ts +8 -23
- package/src/cli/dev.ts +5 -4
- package/src/cli/env.ts +16 -16
- package/src/cli/envDefault.ts +10 -10
- package/src/cli/insights.ts +3 -3
- package/src/cli/lib/aiFiles/integration.test.ts +2 -0
- package/src/cli/lib/aiFiles/skills.ts +3 -3
- package/src/cli/lib/command.ts +2 -2
- package/src/cli/lib/deployment.ts +0 -5
- package/src/cli/lib/deploymentSelection.ts +67 -0
- package/src/cli/lib/dev.ts +39 -0
- package/src/cli/lib/generateDocs.test.ts +326 -0
- package/src/cli/lib/generateDocs.ts +393 -0
- package/src/cli/lib/localDeployment/anonymous.ts +48 -72
- package/src/cli/lib/localDeployment/bigBrain.ts +7 -15
- package/src/cli/lib/localDeployment/dashboard.ts +48 -80
- package/src/cli/lib/localDeployment/download.ts +34 -3
- package/src/cli/lib/localDeployment/filePaths.ts +66 -6
- package/src/cli/lib/localDeployment/localDeployment.ts +46 -184
- package/src/cli/lib/localDeployment/run.test.ts +6 -6
- package/src/cli/lib/localDeployment/secrets.test.ts +53 -0
- package/src/cli/lib/localDeployment/secrets.ts +93 -0
- package/src/cli/lib/localDeployment/tests/keygenFailure.mjs +9 -0
- package/src/cli/lib/localDeployment/tests/keygenSuccess.mjs +31 -0
- package/src/cli/lib/localDeployment/upgrade.ts +52 -38
- package/src/cli/lib/localDeployment/utils.ts +0 -10
- package/src/cli/lib/runTestFunction.ts +3 -3
- package/src/cli/run.ts +5 -5
- package/src/index.ts +1 -1
- package/src/server/impl/registration_impl.ts +0 -2
- package/src/server/index.ts +1 -0
- package/src/server/meta.ts +17 -0
- package/src/server/registration.test.ts +2 -35
- package/src/server/registration.ts +10 -19
|
@@ -45,13 +45,14 @@ var import_bigBrain = require("./lib/localDeployment/bigBrain.js");
|
|
|
45
45
|
var import_localDeployment = require("./lib/localDeployment/localDeployment.js");
|
|
46
46
|
var import_run = require("./lib/localDeployment/run.js");
|
|
47
47
|
var import_announceDeploymentTarget = require("./lib/announceDeploymentTarget.js");
|
|
48
|
+
var import_secrets = require("./lib/localDeployment/secrets.js");
|
|
48
49
|
const SUPPORTED_TYPES = ["dev", "prod", "preview"];
|
|
49
50
|
const deploymentCreate = new import_extra_typings.Command("create").summary("Create a new deployment for a project").description(
|
|
50
51
|
[
|
|
51
52
|
"Create a new deployment for a project.",
|
|
52
53
|
"",
|
|
53
|
-
"
|
|
54
|
-
"
|
|
54
|
+
"\u2022 Create a dev deployment and select it: `npx convex deployment create dev/my-new-feature --type dev --select`",
|
|
55
|
+
"\u2022 Create a prod deployment named \u201Cstaging\u201D: `npx convex deployment create staging --type prod`"
|
|
55
56
|
].join("\n")
|
|
56
57
|
).argument(
|
|
57
58
|
"[reference]",
|
|
@@ -74,6 +75,7 @@ const deploymentCreate = new import_extra_typings.Command("create").summary("Cre
|
|
|
74
75
|
adminKey: void 0,
|
|
75
76
|
envFile: void 0
|
|
76
77
|
});
|
|
78
|
+
await (0, import_deploymentSelection.ensureAuthCanCreateDeployment)(ctx);
|
|
77
79
|
const currentDeployment = await (0, import_deploymentSelection.getDeploymentSelection)(ctx, {
|
|
78
80
|
url: void 0,
|
|
79
81
|
adminKey: void 0,
|
|
@@ -234,22 +236,26 @@ async function createLocalDeployment(ctx, currentDeployment, select, baseDeploym
|
|
|
234
236
|
projectSlug: baseDeployment.projectSlug
|
|
235
237
|
}) : await resolveProject(ctx, currentDeployment);
|
|
236
238
|
(0, import_log.showSpinner)("Downloading local backend...");
|
|
237
|
-
const { version } = await (0, import_download.ensureBackendBinaryDownloaded)(ctx, {
|
|
239
|
+
const { version, binaryPath: latestBinaryPath } = await (0, import_download.ensureBackendBinaryDownloaded)(ctx, {
|
|
238
240
|
kind: "latest"
|
|
239
241
|
});
|
|
240
242
|
const { cloudPort, sitePort } = await (0, import_utils2.chooseLocalBackendPorts)(ctx);
|
|
241
243
|
(0, import_log.showSpinner)("Registering local deployment...");
|
|
242
|
-
const { deploymentName
|
|
244
|
+
const { deploymentName } = await (0, import_bigBrain.bigBrainStart)(ctx, {
|
|
243
245
|
port: cloudPort,
|
|
244
246
|
projectSlug,
|
|
245
247
|
teamSlug,
|
|
246
248
|
instanceName: null
|
|
247
249
|
});
|
|
250
|
+
const { instanceSecret, adminKey } = await (0, import_secrets.generateLocalDevSecrets)(ctx, {
|
|
251
|
+
deploymentName,
|
|
252
|
+
latestBinaryPath
|
|
253
|
+
});
|
|
248
254
|
(0, import_filePaths.saveDeploymentConfig)(ctx, "local", deploymentName, {
|
|
249
255
|
backendVersion: version,
|
|
250
256
|
ports: { cloud: cloudPort, site: sitePort },
|
|
251
257
|
adminKey,
|
|
252
|
-
instanceSecret
|
|
258
|
+
instanceSecret,
|
|
253
259
|
cloudProjectId
|
|
254
260
|
});
|
|
255
261
|
(0, import_log.logFinishedStep)(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/deploymentCreate.ts"],
|
|
4
|
-
"sourcesContent": ["import { execSync } from \"child_process\";\nimport { 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\";\nimport { importDefaultEnvVars } from \"./lib/localDeployment/localDeployment.js\";\nimport { localDeploymentUrl } from \"./lib/localDeployment/run.js\";\nimport { announceDeploymentTarget } from \"./lib/announceDeploymentTarget.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 [\n \"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 ].join(\"\\n\"),\n )\n .argument(\n \"[reference]\",\n \"The reference for the new deployment, e.g. `staging` or `dev/my-feature`. \\n\" +\n \"Use `local` to create a local deployment. \\n\" +\n \"You can specify a team and project with `team-slug:project-slug:ref` (e.g. `my-team:my-project:staging` or `my-team:my-project:local`). \\n\" +\n \"Can be omitted when using `--default`.\",\n )\n .allowExcessArguments(false)\n .addOption(\n new Option(\"--type <type>\", \"Deployment type\").choices(SUPPORTED_TYPES),\n )\n .option(\"--region <region>\", \"Deployment region\")\n .addOption(new Option(\"--class <class>\", \"Deployment class\").hideHelp())\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 .addOption(new Option(\"--expiry <value>\").hideHelp())\n .addOption(new Option(\"--expires <value>\").hideHelp())\n .action(async (refParam, options) => {\n const expiration = options.expiration ?? options.expiry ?? options.expires;\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 [team:project:]local`\n if (refParam !== undefined) {\n const localTarget = parseLocalCreateTarget(refParam);\n if (localTarget !== null) {\n const cloudOnlyFlags = [\"type\", \"region\", \"class\", \"default\"] 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 if (expiration !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--expiration cannot be used when creating a local deployment`,\n });\n }\n if (localTarget.kind === \"needsTeam\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Please use `team:project:local` to specify the team when creating a local deployment in a different project.\",\n });\n }\n await createLocalDeployment(\n ctx,\n currentDeployment,\n options.select ?? false,\n localTarget.kind === \"inTeamProject\"\n ? {\n teamSlug: localTarget.teamSlug,\n projectSlug: localTarget.projectSlug,\n }\n : null,\n );\n return;\n }\n }\n\n const expiresAt = await resolveExpiresAtOrCrash(ctx, expiration);\n\n const {\n ref,\n regionDetails,\n classDetails,\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 (classDetails ? ` with class ${classDetails.type}` : \"\") +\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 ...(classDetails ? { class: classDetails.type } : {}),\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 logFinishedStep(\n options.select\n ? `Created and selected new ${created.deploymentType} deployment:`\n : `Created new ${created.isDefault ? \"default \" : \"\"}${created.deploymentType} deployment:`,\n );\n announceDeploymentTarget(null, {\n url: created.deploymentUrl,\n deploymentFields: {\n deploymentName: created.name,\n deploymentType: created.deploymentType,\n teamSlug,\n projectSlug,\n reference: created.reference,\n isDefault: created.isDefault,\n },\n });\n\n if (!options.select) {\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 } else {\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\nexport async function createLocalDeployment(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n select: boolean,\n baseDeployment: { teamSlug: string; projectSlug: string } | null,\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 {\n teamSlug,\n slug: projectSlug,\n id: cloudProjectId,\n } = baseDeployment\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: baseDeployment.teamSlug,\n projectSlug: baseDeployment.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\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 cloudProjectId,\n });\n\n logFinishedStep(\n select\n ? \"Created and selected local deployment:\"\n : \"Created local deployment:\",\n );\n\n announceDeploymentTarget(null, {\n url: `http://127.0.0.1:${cloudPort}`,\n deploymentFields: {\n deploymentName,\n deploymentType: \"local\",\n teamSlug,\n projectSlug,\n reference: null,\n isDefault: false,\n },\n });\n\n await importDefaultEnvVars(ctx, {\n teamSlug,\n projectSlug,\n deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n adminKey,\n });\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 = \"npx convex dev\";\n if (select) {\n logMessage(`\\nRun ${chalkStderr.bold(devCommand)} to start it.`);\n } else {\n logMessage(\n `\\nTo use this deployment, run:\\n` +\n chalkStderr.bold(` npx convex deployment select local\\n`) +\n ` Then, run ${chalkStderr.bold(devCommand)} to start it.`,\n );\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 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 // If no class is passed in, the team's default class will be used\n let classDetails: AvailableClass | null = null;\n if (options.class) {\n const availableClasses = await fetchAvailableClasses(ctx, project.teamId);\n classDetails = await resolveClassDetailsOrCrash(\n ctx,\n availableClasses,\n options.class,\n );\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId,\n regionDetails,\n classDetails,\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 gitDefault = defaultRef(localGitBranch(), deploymentType);\n const input = await promptString(ctx, {\n message:\n \"What do you want to call 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\",\n ) +\n \"\\n>\",\n ...(gitDefault !== undefined ? { default: gitDefault } : {}),\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 await logNoDefaultRegionMessage(team.slug);\n }\n }\n\n let classDetails: AvailableClass | null = null;\n if (options.class) {\n const availableClasses = await fetchAvailableClasses(ctx, project.teamId);\n classDetails = await resolveClassDetailsOrCrash(\n ctx,\n availableClasses,\n options.class,\n );\n logAndUse(\"class\", classDetails.type);\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId: project.id,\n regionDetails,\n classDetails,\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 \"deploymentName\":\n return {\n kind: \"invalid\",\n message: `\"${selector.deploymentName}\" is not a valid deployment reference. References can't look like \"word-word-123\" \u2014 that format is reserved for automatically-generated 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 reserved as an alias for your default dev deployment.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is reserved as an alias for your default production deployment.`,\n };\n }\n if (inner.kind === \"local\") {\n return {\n kind: \"invalid\",\n message: `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(\"npx convex deployment create local\")}`,\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 reserved as an alias for your default dev deployment.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is reserved as an alias for your default production deployment.`,\n };\n }\n if (inner.kind === \"local\") {\n return {\n kind: \"invalid\",\n message: `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(`npx convex deployment create ${selector.teamSlug}:${selector.projectSlug}:local`)}`,\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\n/**\n * Detect whether the user is creating a local deployment.\n * Returns:\n * - `null` if `refParam` is not a local-deployment selector\n * - `inCurrentProject` for plain `local`\n * - `needsTeam` for `project:local` (which we reject \u2014 same rule as cloud)\n * - `inTeamProject` for `team:project:local`\n */\nfunction parseLocalCreateTarget(\n refParam: string,\n):\n | null\n | { kind: \"inCurrentProject\" }\n | { kind: \"needsTeam\" }\n | { kind: \"inTeamProject\"; teamSlug: string; projectSlug: string } {\n const parsed = parseDeploymentSelector(refParam);\n if (parsed.kind === \"inCurrentProject\" && parsed.selector.kind === \"local\") {\n return { kind: \"inCurrentProject\" };\n }\n if (parsed.kind === \"inProject\" && parsed.selector.kind === \"local\") {\n return { kind: \"needsTeam\" };\n }\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind === \"local\") {\n return {\n kind: \"inTeamProject\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n };\n }\n return null;\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\nexport async function fetchAvailableClasses(ctx: Context, teamId: number) {\n const classesResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_classes\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n return classesResponse.items.filter((item) => item.available);\n}\n\ntype AvailableClass = Awaited<ReturnType<typeof fetchAvailableClasses>>[number];\n\nexport function resolveClassDetails(\n availableClasses: AvailableClass[],\n className: string,\n) {\n return availableClasses.find((item) => item.type === className) ?? null;\n}\n\nasync function resolveClassDetailsOrCrash(\n ctx: Context,\n availableClasses: AvailableClass[],\n className: string,\n) {\n const classDetails = resolveClassDetails(availableClasses, className);\n if (!classDetails) {\n return await crashInvalidClass(ctx, availableClasses, className);\n }\n return classDetails;\n}\n\nfunction invalidClassMessage(\n availableClasses: AvailableClass[],\n className: string,\n): string {\n const formatted = availableClasses\n .map((item) => ` \\`--class ${item.type}\\``)\n .join(\"\\n\");\n return `Invalid class \"${className}\".\\n\\nAvailable classes:\\n` + formatted;\n}\n\nasync function crashInvalidClass(\n ctx: Context,\n availableClasses: AvailableClass[],\n className: string,\n): Promise<never> {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: invalidClassMessage(availableClasses, className),\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, `-`, and `/`\";\n }\n if (tentativeReference === \"dev\") {\n return '\"dev\" is reserved as an alias for your default dev deployment.';\n }\n if (tentativeReference === \"prod\") {\n return '\"prod\" is reserved as an alias for your default production deployment.';\n }\n if (tentativeReference === \"local\") {\n return `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(\"npx convex deployment create local\")}`;\n }\n if (/^[a-z]+-[a-z]+-\\d+$/.test(tentativeReference)) {\n return 'References can\\'t look like \"word-word-123\" \u2014 that format is reserved for automatically-generated deployment names. Try something like dev/my-feature or staging instead.';\n }\n\n return true;\n}\n\n/**\n * Get the current local git branch name by shelling out to git.\n * Returns null if git is unavailable, the repo is in detached HEAD state,\n * or the branch is main/master.\n */\nfunction localGitBranch(): string | null {\n try {\n const branch = (\n execSync(\"git rev-parse --abbrev-ref HEAD\", {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n }) as Buffer\n )\n .toString()\n .trim();\n if (\n !branch ||\n branch === \"HEAD\" ||\n branch === \"main\" ||\n branch === \"master\"\n ) {\n return null;\n }\n return branch;\n } catch {\n return null;\n }\n}\n\n/**\n * Slugify a git branch name into a valid deployment reference.\n * Returns undefined if the result would fail validation.\n */\nfunction defaultRef(\n branch: string | null,\n deploymentType: \"dev\" | \"prod\" | \"preview\",\n): string | undefined {\n if (deploymentType !== \"dev\" && deploymentType !== \"preview\") {\n return undefined;\n }\n if (!branch) return undefined;\n const slug = branch\n .replace(/[^a-z0-9/-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n if (!slug) return undefined;\n const ref = `${deploymentType}/${slug}`;\n const valid = validateTentativeReference(ref);\n if (valid !== true) return undefined;\n return ref;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { execSync } from \"child_process\";\nimport { 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 ensureAuthCanCreateDeployment,\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 { chooseLocalBackendPorts } from \"./lib/localDeployment/utils.js\";\nimport { bigBrainStart } from \"./lib/localDeployment/bigBrain.js\";\nimport { importDefaultEnvVars } from \"./lib/localDeployment/localDeployment.js\";\nimport { localDeploymentUrl } from \"./lib/localDeployment/run.js\";\nimport { announceDeploymentTarget } from \"./lib/announceDeploymentTarget.js\";\nimport { generateLocalDevSecrets } from \"./lib/localDeployment/secrets.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 [\n \"Create a new deployment for a project.\",\n \"\",\n \"\u2022 Create a dev deployment and select it: `npx convex deployment create dev/my-new-feature --type dev --select`\",\n \"\u2022 Create a prod deployment named \u201Cstaging\u201D: `npx convex deployment create staging --type prod`\",\n ].join(\"\\n\"),\n )\n .argument(\n \"[reference]\",\n \"The reference for the new deployment, e.g. `staging` or `dev/my-feature`. \\n\" +\n \"Use `local` to create a local deployment. \\n\" +\n \"You can specify a team and project with `team-slug:project-slug:ref` (e.g. `my-team:my-project:staging` or `my-team:my-project:local`). \\n\" +\n \"Can be omitted when using `--default`.\",\n )\n .allowExcessArguments(false)\n .addOption(\n new Option(\"--type <type>\", \"Deployment type\").choices(SUPPORTED_TYPES),\n )\n .option(\"--region <region>\", \"Deployment region\")\n .addOption(new Option(\"--class <class>\", \"Deployment class\").hideHelp())\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 .addOption(new Option(\"--expiry <value>\").hideHelp())\n .addOption(new Option(\"--expires <value>\").hideHelp())\n .action(async (refParam, options) => {\n const expiration = options.expiration ?? options.expiry ?? options.expires;\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Creating a deployment goes through the platform API, which accepts\n // personal access tokens and project keys but not deployment/preview deploy\n // keys. Fail fast (and clearly) for the unsupported keys rather than\n // surfacing an opaque 401 from the lookup below.\n await ensureAuthCanCreateDeployment(ctx);\n\n const currentDeployment = await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Handle `deployment create [team:project:]local`\n if (refParam !== undefined) {\n const localTarget = parseLocalCreateTarget(refParam);\n if (localTarget !== null) {\n const cloudOnlyFlags = [\"type\", \"region\", \"class\", \"default\"] 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 if (expiration !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--expiration cannot be used when creating a local deployment`,\n });\n }\n if (localTarget.kind === \"needsTeam\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Please use `team:project:local` to specify the team when creating a local deployment in a different project.\",\n });\n }\n await createLocalDeployment(\n ctx,\n currentDeployment,\n options.select ?? false,\n localTarget.kind === \"inTeamProject\"\n ? {\n teamSlug: localTarget.teamSlug,\n projectSlug: localTarget.projectSlug,\n }\n : null,\n );\n return;\n }\n }\n\n const expiresAt = await resolveExpiresAtOrCrash(ctx, expiration);\n\n const {\n ref,\n regionDetails,\n classDetails,\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 (classDetails ? ` with class ${classDetails.type}` : \"\") +\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 ...(classDetails ? { class: classDetails.type } : {}),\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 logFinishedStep(\n options.select\n ? `Created and selected new ${created.deploymentType} deployment:`\n : `Created new ${created.isDefault ? \"default \" : \"\"}${created.deploymentType} deployment:`,\n );\n announceDeploymentTarget(null, {\n url: created.deploymentUrl,\n deploymentFields: {\n deploymentName: created.name,\n deploymentType: created.deploymentType,\n teamSlug,\n projectSlug,\n reference: created.reference,\n isDefault: created.isDefault,\n },\n });\n\n if (!options.select) {\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 } else {\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\nexport async function createLocalDeployment(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n select: boolean,\n baseDeployment: { teamSlug: string; projectSlug: string } | null,\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 {\n teamSlug,\n slug: projectSlug,\n id: cloudProjectId,\n } = baseDeployment\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: baseDeployment.teamSlug,\n projectSlug: baseDeployment.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\n\n showSpinner(\"Downloading local backend...\");\n const { version, binaryPath: latestBinaryPath } =\n await ensureBackendBinaryDownloaded(ctx, {\n kind: \"latest\",\n });\n\n const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx);\n\n showSpinner(\"Registering local deployment...\");\n const { deploymentName } = await bigBrainStart(ctx, {\n port: cloudPort,\n projectSlug,\n teamSlug,\n instanceName: null,\n });\n const { instanceSecret, adminKey } = await generateLocalDevSecrets(ctx, {\n deploymentName,\n latestBinaryPath,\n });\n\n saveDeploymentConfig(ctx, \"local\", deploymentName, {\n backendVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n cloudProjectId,\n });\n\n logFinishedStep(\n select\n ? \"Created and selected local deployment:\"\n : \"Created local deployment:\",\n );\n\n announceDeploymentTarget(null, {\n url: `http://127.0.0.1:${cloudPort}`,\n deploymentFields: {\n deploymentName,\n deploymentType: \"local\",\n teamSlug,\n projectSlug,\n reference: null,\n isDefault: false,\n },\n });\n\n await importDefaultEnvVars(ctx, {\n teamSlug,\n projectSlug,\n deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n adminKey,\n });\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 = \"npx convex dev\";\n if (select) {\n logMessage(`\\nRun ${chalkStderr.bold(devCommand)} to start it.`);\n } else {\n logMessage(\n `\\nTo use this deployment, run:\\n` +\n chalkStderr.bold(` npx convex deployment select local\\n`) +\n ` Then, run ${chalkStderr.bold(devCommand)} to start it.`,\n );\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 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 // If no class is passed in, the team's default class will be used\n let classDetails: AvailableClass | null = null;\n if (options.class) {\n const availableClasses = await fetchAvailableClasses(ctx, project.teamId);\n classDetails = await resolveClassDetailsOrCrash(\n ctx,\n availableClasses,\n options.class,\n );\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId,\n regionDetails,\n classDetails,\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 gitDefault = defaultRef(localGitBranch(), deploymentType);\n const input = await promptString(ctx, {\n message:\n \"What do you want to call 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\",\n ) +\n \"\\n>\",\n ...(gitDefault !== undefined ? { default: gitDefault } : {}),\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 await logNoDefaultRegionMessage(team.slug);\n }\n }\n\n let classDetails: AvailableClass | null = null;\n if (options.class) {\n const availableClasses = await fetchAvailableClasses(ctx, project.teamId);\n classDetails = await resolveClassDetailsOrCrash(\n ctx,\n availableClasses,\n options.class,\n );\n logAndUse(\"class\", classDetails.type);\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId: project.id,\n regionDetails,\n classDetails,\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 \"deploymentName\":\n return {\n kind: \"invalid\",\n message: `\"${selector.deploymentName}\" is not a valid deployment reference. References can't look like \"word-word-123\" \u2014 that format is reserved for automatically-generated 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 reserved as an alias for your default dev deployment.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is reserved as an alias for your default production deployment.`,\n };\n }\n if (inner.kind === \"local\") {\n return {\n kind: \"invalid\",\n message: `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(\"npx convex deployment create local\")}`,\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 reserved as an alias for your default dev deployment.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is reserved as an alias for your default production deployment.`,\n };\n }\n if (inner.kind === \"local\") {\n return {\n kind: \"invalid\",\n message: `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(`npx convex deployment create ${selector.teamSlug}:${selector.projectSlug}:local`)}`,\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\n/**\n * Detect whether the user is creating a local deployment.\n * Returns:\n * - `null` if `refParam` is not a local-deployment selector\n * - `inCurrentProject` for plain `local`\n * - `needsTeam` for `project:local` (which we reject \u2014 same rule as cloud)\n * - `inTeamProject` for `team:project:local`\n */\nfunction parseLocalCreateTarget(\n refParam: string,\n):\n | null\n | { kind: \"inCurrentProject\" }\n | { kind: \"needsTeam\" }\n | { kind: \"inTeamProject\"; teamSlug: string; projectSlug: string } {\n const parsed = parseDeploymentSelector(refParam);\n if (parsed.kind === \"inCurrentProject\" && parsed.selector.kind === \"local\") {\n return { kind: \"inCurrentProject\" };\n }\n if (parsed.kind === \"inProject\" && parsed.selector.kind === \"local\") {\n return { kind: \"needsTeam\" };\n }\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind === \"local\") {\n return {\n kind: \"inTeamProject\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n };\n }\n return null;\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\nexport async function fetchAvailableClasses(ctx: Context, teamId: number) {\n const classesResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_classes\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n return classesResponse.items.filter((item) => item.available);\n}\n\ntype AvailableClass = Awaited<ReturnType<typeof fetchAvailableClasses>>[number];\n\nexport function resolveClassDetails(\n availableClasses: AvailableClass[],\n className: string,\n) {\n return availableClasses.find((item) => item.type === className) ?? null;\n}\n\nasync function resolveClassDetailsOrCrash(\n ctx: Context,\n availableClasses: AvailableClass[],\n className: string,\n) {\n const classDetails = resolveClassDetails(availableClasses, className);\n if (!classDetails) {\n return await crashInvalidClass(ctx, availableClasses, className);\n }\n return classDetails;\n}\n\nfunction invalidClassMessage(\n availableClasses: AvailableClass[],\n className: string,\n): string {\n const formatted = availableClasses\n .map((item) => ` \\`--class ${item.type}\\``)\n .join(\"\\n\");\n return `Invalid class \"${className}\".\\n\\nAvailable classes:\\n` + formatted;\n}\n\nasync function crashInvalidClass(\n ctx: Context,\n availableClasses: AvailableClass[],\n className: string,\n): Promise<never> {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: invalidClassMessage(availableClasses, className),\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, `-`, and `/`\";\n }\n if (tentativeReference === \"dev\") {\n return '\"dev\" is reserved as an alias for your default dev deployment.';\n }\n if (tentativeReference === \"prod\") {\n return '\"prod\" is reserved as an alias for your default production deployment.';\n }\n if (tentativeReference === \"local\") {\n return `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(\"npx convex deployment create local\")}`;\n }\n if (/^[a-z]+-[a-z]+-\\d+$/.test(tentativeReference)) {\n return 'References can\\'t look like \"word-word-123\" \u2014 that format is reserved for automatically-generated deployment names. Try something like dev/my-feature or staging instead.';\n }\n\n return true;\n}\n\n/**\n * Get the current local git branch name by shelling out to git.\n * Returns null if git is unavailable, the repo is in detached HEAD state,\n * or the branch is main/master.\n */\nfunction localGitBranch(): string | null {\n try {\n const branch = (\n execSync(\"git rev-parse --abbrev-ref HEAD\", {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n }) as Buffer\n )\n .toString()\n .trim();\n if (\n !branch ||\n branch === \"HEAD\" ||\n branch === \"main\" ||\n branch === \"master\"\n ) {\n return null;\n }\n return branch;\n } catch {\n return null;\n }\n}\n\n/**\n * Slugify a git branch name into a valid deployment reference.\n * Returns undefined if the result would fail validation.\n */\nfunction defaultRef(\n branch: string | null,\n deploymentType: \"dev\" | \"prod\" | \"preview\",\n): string | undefined {\n if (deploymentType !== \"dev\" && deploymentType !== \"preview\") {\n return undefined;\n }\n if (!branch) return undefined;\n const slug = branch\n .replace(/[^a-z0-9/-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n if (!slug) return undefined;\n const ref = `${deploymentType}/${slug}`;\n const valid = validateTentativeReference(ref);\n if (valid !== true) return undefined;\n return ref;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_utils", "team"]
|
|
7
7
|
}
|
|
@@ -44,11 +44,11 @@ const deploymentSelect = new import_extra_typings.Command("select").summary("Sel
|
|
|
44
44
|
"",
|
|
45
45
|
"The deployment will be used by all `npx convex` commands, except `npx convex deploy`. You can also run individual commands on another deployment by using the --deployment flag on that command.",
|
|
46
46
|
"",
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
47
|
+
"\u2022 Select your personal cloud dev deployment in the current project: `npx convex deployment select dev`",
|
|
48
|
+
"\u2022 Select your local deployment: `npx convex deployment select local`",
|
|
49
|
+
"\u2022 Select a deployment in the same project by its reference: `npx convex deployment select dev/james`",
|
|
50
|
+
"\u2022 Select a deployment in another project in the same team: `npx convex deployment select some-project:dev/james`",
|
|
51
|
+
"\u2022 Select a deployment in a particular team/project: `npx convex deployment select some-team:some-project:dev/james`"
|
|
52
52
|
].join("\n")
|
|
53
53
|
).argument("<deployment>", "The deployment to use").allowExcessArguments(false).action(async (selector) => {
|
|
54
54
|
const ctx = await (0, import_context.oneoffContext)({
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/deploymentSelect.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { logFinishedStep } from \"../bundler/log.js\";\nimport { announceDeploymentTarget } from \"./lib/announceDeploymentTarget.js\";\nimport {\n DeploymentSelection,\n getDeploymentSelection,\n deploymentNameFromSelection,\n} from \"./lib/deploymentSelection.js\";\nimport {\n parseDeploymentSelector,\n ParsedDeploymentSelector,\n} from \"./lib/deploymentSelector.js\";\nimport { updateEnvAndConfigForDeploymentSelection } from \"./configure.js\";\nimport { fetchDeploymentCanonicalUrls } from \"./lib/deploy2.js\";\nimport {\n loadProjectLocalConfig,\n saveDeploymentConfig,\n} from \"./lib/localDeployment/filePaths.js\";\nimport {\n checkLocalConfigMatchesProject,\n getCloudProjectSlugsBestEffort,\n pauseLocalDeploymentBestEffort,\n targetProjectForLocalSelector,\n} from \"./lib/localDeployment/projectMismatch.js\";\nimport { bigBrainStart } from \"./lib/localDeployment/bigBrain.js\";\nimport { promptYesNo } from \"./lib/utils/prompts.js\";\nimport { createLocalDeployment } from \"./deploymentCreate.js\";\nimport { chalkStderr } from \"chalk\";\nimport { logWarning } from \"../bundler/log.js\";\n\nexport const deploymentSelect = new Command(\"select\")\n .summary(\"Select the deployment to use when running commands\")\n .description(\n [\n \"Select the deployment to use when running commands.\",\n \"\",\n \"The deployment will be used by all `npx convex` commands, except `npx convex deploy`. You can also run individual commands on another deployment by using the --deployment flag on that command.\",\n \"\",\n \"- Select your personal cloud dev deployment in the current project: `npx convex deployment select dev`\",\n \"- Select your local deployment: `npx convex deployment select local`\",\n \"- Select a deployment in the same project by its reference: `npx convex deployment select dev/james`\",\n \"- Select a deployment in another project in the same team: `npx convex deployment select some-project:dev/james`\",\n \"- Select a deployment in a particular team/project: `npx convex deployment select some-team:some-project:dev/james`\",\n ].join(\"\\n\"),\n )\n .argument(\"<deployment>\", \"The deployment to use\")\n .allowExcessArguments(false)\n .action(async (selector) => {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Get the current deployment selection (no flags, just env/config state)\n const currentSelection = await getDeploymentSelection(ctx, {});\n\n const parsed = parseDeploymentSelector(selector);\n const isLocalSelector = isLocalDeploymentSelector(parsed);\n\n // If no project is configured and the selector needs project context, show a specific error\n if (\n currentSelection.kind === \"chooseProject\" &&\n parsed.kind !== \"inTeamProject\" &&\n parsed.kind !== \"deploymentName\" &&\n !isLocalSelector\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No project configured. Run \\`npx convex dev\\` to set up a project first, or use a full selector like 'my-team:my-project:dev/james' or 'happy-capybara-123'.`,\n });\n }\n\n if (isLocalSelector) {\n await handleLocalSelect(ctx, selector, parsed, currentSelection);\n return;\n }\n\n // Resolve the new deployment using the selector relative to the current project\n const newSelection = await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n deployment: selector,\n });\n\n const deployment = await saveSelectedDeployment(\n ctx,\n selector,\n newSelection,\n deploymentNameFromSelection(currentSelection),\n );\n logFinishedStep(\"Selected deployment:\");\n announceDeploymentTarget(null, deployment);\n });\n\nfunction isLocalDeploymentSelector(parsed: ParsedDeploymentSelector): boolean {\n return (\n (parsed.kind === \"inCurrentProject\" ||\n parsed.kind === \"inProject\" ||\n parsed.kind === \"inTeamProject\") &&\n parsed.selector.kind === \"local\"\n );\n}\n\nasync function handleLocalSelect(\n ctx: Context,\n selector: string,\n parsed: ParsedDeploymentSelector,\n currentSelection: DeploymentSelection,\n): Promise<void> {\n const existing = loadProjectLocalConfig(ctx);\n\n if (existing === null) {\n // No local deployment on disk. Offer to create one (interactive only).\n if (!process.stdin.isTTY) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n if (\n currentSelection.kind === \"chooseProject\" &&\n parsed.kind !== \"inTeamProject\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No project configured. Run \\`npx convex dev\\` to set up a project first.`,\n });\n }\n\n // Refusing to create a project if the user didn\u2019t explicitly specify a team.\n if (parsed.kind === \"inProject\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. To create one in ${chalkStderr.bold(parsed.projectSlug)}, run ${chalkStderr.bold(`npx convex deployment create local --project ${parsed.projectSlug}`)}, or use a fully qualified selector like ${chalkStderr.bold(`my-team:${parsed.projectSlug}:local`)}.`,\n });\n }\n\n const wantsToCreate = await promptYesNo(ctx, {\n message: \"No local deployment found. Create one now?\",\n default: true,\n });\n if (!wantsToCreate) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n const teamAndProject = teamAndProjectFromParsed(parsed);\n await createLocalDeployment(ctx, currentSelection, true, teamAndProject);\n return;\n }\n\n // Resolve the target cloud project the user is asking about\n const target = await targetProjectForLocalSelector(\n ctx,\n parsed,\n currentSelection,\n );\n\n let resolvedDeploymentName = existing.deploymentName;\n\n if (target !== null) {\n const match = checkLocalConfigMatchesProject(ctx, existing.config, target);\n if (match === \"mismatch\") {\n // The on-disk local deployment is tied to a different cloud project.\n // Move it to the new project (warn, pause old, re-register).\n const oldProjectId = existing.config.cloudProjectId!;\n const oldProject = await getCloudProjectSlugsBestEffort(\n ctx,\n oldProjectId,\n );\n const oldProjectLabel =\n oldProject !== null\n ? `project ${chalkStderr.bold(`${oldProject.teamSlug}:${oldProject.slug}`)}`\n : `an unknown cloud project (ID ${oldProjectId})`;\n logWarning(\n chalkStderr.yellow(\n `\u26A0\uFE0F This local deployment was previously in ${oldProjectLabel}. Moving it to project ${chalkStderr.bold(`${target.teamSlug}:${target.slug}`)}.`,\n ),\n );\n await pauseLocalDeploymentBestEffort(ctx, oldProject);\n const { deploymentName: newDeploymentName } = await bigBrainStart(ctx, {\n port: existing.config.ports.cloud,\n teamSlug: target.teamSlug,\n projectSlug: target.slug,\n instanceName: null,\n });\n saveDeploymentConfig(ctx, \"local\", newDeploymentName, {\n ...existing.config,\n cloudProjectId: target.id,\n });\n resolvedDeploymentName = newDeploymentName;\n } else if (match === \"skip\") {\n // The on-disk config has no `cloudProjectId` \u2014 write the resolved id back\n // so future invocations have it.\n saveDeploymentConfig(ctx, \"local\", existing.deploymentName, {\n ...existing.config,\n cloudProjectId: target.id,\n });\n }\n }\n\n const newSelection: DeploymentSelection = {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: resolvedDeploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector,\n },\n };\n await saveSelectedDeployment(\n ctx,\n selector,\n newSelection,\n deploymentNameFromSelection(currentSelection),\n );\n}\n\nfunction teamAndProjectFromParsed(\n parsed: ParsedDeploymentSelector,\n): { teamSlug: string; projectSlug: string } | null {\n if (parsed.kind === \"inTeamProject\") {\n return { teamSlug: parsed.teamSlug, projectSlug: parsed.projectSlug };\n }\n return null;\n}\n\nexport async function saveSelectedDeployment(\n ctx: Context,\n selector: string,\n selection: DeploymentSelection,\n previousDeploymentName: string | null,\n) {\n const deployment = await loadSelectedDeploymentCredentials(ctx, selection, {\n ensureLocalRunning: false,\n });\n\n if (deployment.deploymentFields === null) {\n // Should be unreachable since for now, `select` only allows users\n // to select deployments that exist in Big Brain\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: null,\n errForSentry: `Unexpected selection in select: ${JSON.stringify(deployment)}`,\n });\n }\n\n if (deployment.deploymentFields.deploymentType === \"prod\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Selecting a production deployment is unsupported. To run commands on a production deployment, pass the ${chalkStderr.bold(`--deployment ${selector}`)} flag to each command.`,\n });\n }\n\n const { convexSiteUrl: siteUrl } =\n deployment.deploymentFields.deploymentType === \"local\"\n ? { convexSiteUrl: null }\n : await fetchDeploymentCanonicalUrls(ctx, {\n adminKey: deployment.adminKey,\n deploymentUrl: deployment.url,\n });\n\n await updateEnvAndConfigForDeploymentSelection(\n ctx,\n {\n url: deployment.url,\n siteUrl,\n deploymentName: deployment.deploymentFields.deploymentName,\n teamSlug: deployment.deploymentFields.teamSlug,\n projectSlug: deployment.deploymentFields.projectSlug,\n deploymentType: deployment.deploymentFields.deploymentType,\n },\n previousDeploymentName,\n );\n\n return deployment;\n}\n"],
|
|
4
|
+
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { logFinishedStep } from \"../bundler/log.js\";\nimport { announceDeploymentTarget } from \"./lib/announceDeploymentTarget.js\";\nimport {\n DeploymentSelection,\n getDeploymentSelection,\n deploymentNameFromSelection,\n} from \"./lib/deploymentSelection.js\";\nimport {\n parseDeploymentSelector,\n ParsedDeploymentSelector,\n} from \"./lib/deploymentSelector.js\";\nimport { updateEnvAndConfigForDeploymentSelection } from \"./configure.js\";\nimport { fetchDeploymentCanonicalUrls } from \"./lib/deploy2.js\";\nimport {\n loadProjectLocalConfig,\n saveDeploymentConfig,\n} from \"./lib/localDeployment/filePaths.js\";\nimport {\n checkLocalConfigMatchesProject,\n getCloudProjectSlugsBestEffort,\n pauseLocalDeploymentBestEffort,\n targetProjectForLocalSelector,\n} from \"./lib/localDeployment/projectMismatch.js\";\nimport { bigBrainStart } from \"./lib/localDeployment/bigBrain.js\";\nimport { promptYesNo } from \"./lib/utils/prompts.js\";\nimport { createLocalDeployment } from \"./deploymentCreate.js\";\nimport { chalkStderr } from \"chalk\";\nimport { logWarning } from \"../bundler/log.js\";\n\nexport const deploymentSelect = new Command(\"select\")\n .summary(\"Select the deployment to use when running commands\")\n .description(\n [\n \"Select the deployment to use when running commands.\",\n \"\",\n \"The deployment will be used by all `npx convex` commands, except `npx convex deploy`. You can also run individual commands on another deployment by using the --deployment flag on that command.\",\n \"\",\n \"\u2022 Select your personal cloud dev deployment in the current project: `npx convex deployment select dev`\",\n \"\u2022 Select your local deployment: `npx convex deployment select local`\",\n \"\u2022 Select a deployment in the same project by its reference: `npx convex deployment select dev/james`\",\n \"\u2022 Select a deployment in another project in the same team: `npx convex deployment select some-project:dev/james`\",\n \"\u2022 Select a deployment in a particular team/project: `npx convex deployment select some-team:some-project:dev/james`\",\n ].join(\"\\n\"),\n )\n .argument(\"<deployment>\", \"The deployment to use\")\n .allowExcessArguments(false)\n .action(async (selector) => {\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Get the current deployment selection (no flags, just env/config state)\n const currentSelection = await getDeploymentSelection(ctx, {});\n\n const parsed = parseDeploymentSelector(selector);\n const isLocalSelector = isLocalDeploymentSelector(parsed);\n\n // If no project is configured and the selector needs project context, show a specific error\n if (\n currentSelection.kind === \"chooseProject\" &&\n parsed.kind !== \"inTeamProject\" &&\n parsed.kind !== \"deploymentName\" &&\n !isLocalSelector\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No project configured. Run \\`npx convex dev\\` to set up a project first, or use a full selector like 'my-team:my-project:dev/james' or 'happy-capybara-123'.`,\n });\n }\n\n if (isLocalSelector) {\n await handleLocalSelect(ctx, selector, parsed, currentSelection);\n return;\n }\n\n // Resolve the new deployment using the selector relative to the current project\n const newSelection = await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n deployment: selector,\n });\n\n const deployment = await saveSelectedDeployment(\n ctx,\n selector,\n newSelection,\n deploymentNameFromSelection(currentSelection),\n );\n logFinishedStep(\"Selected deployment:\");\n announceDeploymentTarget(null, deployment);\n });\n\nfunction isLocalDeploymentSelector(parsed: ParsedDeploymentSelector): boolean {\n return (\n (parsed.kind === \"inCurrentProject\" ||\n parsed.kind === \"inProject\" ||\n parsed.kind === \"inTeamProject\") &&\n parsed.selector.kind === \"local\"\n );\n}\n\nasync function handleLocalSelect(\n ctx: Context,\n selector: string,\n parsed: ParsedDeploymentSelector,\n currentSelection: DeploymentSelection,\n): Promise<void> {\n const existing = loadProjectLocalConfig(ctx);\n\n if (existing === null) {\n // No local deployment on disk. Offer to create one (interactive only).\n if (!process.stdin.isTTY) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n if (\n currentSelection.kind === \"chooseProject\" &&\n parsed.kind !== \"inTeamProject\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No project configured. Run \\`npx convex dev\\` to set up a project first.`,\n });\n }\n\n // Refusing to create a project if the user didn\u2019t explicitly specify a team.\n if (parsed.kind === \"inProject\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. To create one in ${chalkStderr.bold(parsed.projectSlug)}, run ${chalkStderr.bold(`npx convex deployment create local --project ${parsed.projectSlug}`)}, or use a fully qualified selector like ${chalkStderr.bold(`my-team:${parsed.projectSlug}:local`)}.`,\n });\n }\n\n const wantsToCreate = await promptYesNo(ctx, {\n message: \"No local deployment found. Create one now?\",\n default: true,\n });\n if (!wantsToCreate) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No local deployment found. Run ${chalkStderr.bold(\"npx convex deployment create local\")} to create one.`,\n });\n }\n const teamAndProject = teamAndProjectFromParsed(parsed);\n await createLocalDeployment(ctx, currentSelection, true, teamAndProject);\n return;\n }\n\n // Resolve the target cloud project the user is asking about\n const target = await targetProjectForLocalSelector(\n ctx,\n parsed,\n currentSelection,\n );\n\n let resolvedDeploymentName = existing.deploymentName;\n\n if (target !== null) {\n const match = checkLocalConfigMatchesProject(ctx, existing.config, target);\n if (match === \"mismatch\") {\n // The on-disk local deployment is tied to a different cloud project.\n // Move it to the new project (warn, pause old, re-register).\n const oldProjectId = existing.config.cloudProjectId!;\n const oldProject = await getCloudProjectSlugsBestEffort(\n ctx,\n oldProjectId,\n );\n const oldProjectLabel =\n oldProject !== null\n ? `project ${chalkStderr.bold(`${oldProject.teamSlug}:${oldProject.slug}`)}`\n : `an unknown cloud project (ID ${oldProjectId})`;\n logWarning(\n chalkStderr.yellow(\n `\u26A0\uFE0F This local deployment was previously in ${oldProjectLabel}. Moving it to project ${chalkStderr.bold(`${target.teamSlug}:${target.slug}`)}.`,\n ),\n );\n await pauseLocalDeploymentBestEffort(ctx, oldProject);\n const { deploymentName: newDeploymentName } = await bigBrainStart(ctx, {\n port: existing.config.ports.cloud,\n teamSlug: target.teamSlug,\n projectSlug: target.slug,\n instanceName: null,\n });\n saveDeploymentConfig(ctx, \"local\", newDeploymentName, {\n ...existing.config,\n cloudProjectId: target.id,\n });\n resolvedDeploymentName = newDeploymentName;\n } else if (match === \"skip\") {\n // The on-disk config has no `cloudProjectId` \u2014 write the resolved id back\n // so future invocations have it.\n saveDeploymentConfig(ctx, \"local\", existing.deploymentName, {\n ...existing.config,\n cloudProjectId: target.id,\n });\n }\n }\n\n const newSelection: DeploymentSelection = {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: resolvedDeploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector,\n },\n };\n await saveSelectedDeployment(\n ctx,\n selector,\n newSelection,\n deploymentNameFromSelection(currentSelection),\n );\n}\n\nfunction teamAndProjectFromParsed(\n parsed: ParsedDeploymentSelector,\n): { teamSlug: string; projectSlug: string } | null {\n if (parsed.kind === \"inTeamProject\") {\n return { teamSlug: parsed.teamSlug, projectSlug: parsed.projectSlug };\n }\n return null;\n}\n\nexport async function saveSelectedDeployment(\n ctx: Context,\n selector: string,\n selection: DeploymentSelection,\n previousDeploymentName: string | null,\n) {\n const deployment = await loadSelectedDeploymentCredentials(ctx, selection, {\n ensureLocalRunning: false,\n });\n\n if (deployment.deploymentFields === null) {\n // Should be unreachable since for now, `select` only allows users\n // to select deployments that exist in Big Brain\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: null,\n errForSentry: `Unexpected selection in select: ${JSON.stringify(deployment)}`,\n });\n }\n\n if (deployment.deploymentFields.deploymentType === \"prod\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Selecting a production deployment is unsupported. To run commands on a production deployment, pass the ${chalkStderr.bold(`--deployment ${selector}`)} flag to each command.`,\n });\n }\n\n const { convexSiteUrl: siteUrl } =\n deployment.deploymentFields.deploymentType === \"local\"\n ? { convexSiteUrl: null }\n : await fetchDeploymentCanonicalUrls(ctx, {\n adminKey: deployment.adminKey,\n deploymentUrl: deployment.url,\n });\n\n await updateEnvAndConfigForDeploymentSelection(\n ctx,\n {\n url: deployment.url,\n siteUrl,\n deploymentName: deployment.deploymentFields.deploymentName,\n teamSlug: deployment.deploymentFields.teamSlug,\n projectSlug: deployment.deploymentFields.projectSlug,\n deploymentType: deployment.deploymentFields.deploymentType,\n },\n previousDeploymentName,\n );\n\n return deployment;\n}\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["import_log"]
|
|
7
7
|
}
|
|
@@ -22,7 +22,6 @@ __export(deploymentTokenCreate_exports, {
|
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(deploymentTokenCreate_exports);
|
|
24
24
|
var import_extra_typings = require("@commander-js/extra-typings");
|
|
25
|
-
var import_chalk = require("chalk");
|
|
26
25
|
var import_context = require("../bundler/context.js");
|
|
27
26
|
var import_log = require("../bundler/log.js");
|
|
28
27
|
var import_api = require("./lib/api.js");
|
|
@@ -34,24 +33,17 @@ const deploymentTokenCreate = new import_extra_typings.Command("create").summary
|
|
|
34
33
|
[
|
|
35
34
|
`Creates a deploy key that, when set as \`${import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\`, scopes all commands to the target deployment.`,
|
|
36
35
|
"",
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
"
|
|
40
|
-
"
|
|
36
|
+
"\u2022 Print a new deploy key to stdout: `npx convex deployment token create my-token`",
|
|
37
|
+
`\u2022 Save a new deploy key in \`${import_utils.ENV_VAR_FILE_PATH}\`: \`npx convex deployment token create my-token --save-env\``,
|
|
38
|
+
"\u2022 Save a new deploy key in a custom env file: `npx convex deployment token create ci-token --save-env .env.production`",
|
|
39
|
+
"\u2022 Create a key for the project's prod: `npx convex deployment token create ci-token --deployment prod`"
|
|
41
40
|
].join("\n")
|
|
42
41
|
).argument("<name>", "Name for the new deploy key").allowExcessArguments(false).option(
|
|
43
42
|
"--save-env [path]",
|
|
44
43
|
`Save the new key as ${import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME} in an env file instead of printing it. Defaults to ${import_utils.ENV_VAR_FILE_PATH}.`
|
|
45
44
|
).addDeploymentSelectionOptions((0, import_command.actionDescription)("Create a deploy key for")).showHelpAfterError().action(async (name, options) => {
|
|
46
45
|
const ctx = await (0, import_context.oneoffContext)(options);
|
|
47
|
-
|
|
48
|
-
if (auth === null || auth.kind !== "accessToken") {
|
|
49
|
-
return await ctx.crash({
|
|
50
|
-
exitCode: 1,
|
|
51
|
-
errorType: "fatal",
|
|
52
|
-
printedMessage: `Creating a deploy key currently requires being logged in with a personal access token. ${process.env[import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME] ? `Unset ${import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME}` : process.env[import_utils.CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME] ? `Unset ${import_utils.CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME}` : `Run ${import_chalk.chalkStderr.bold("npx convex login")}`} and try again.`
|
|
53
|
-
});
|
|
54
|
-
}
|
|
46
|
+
await (0, import_deploymentSelection.ensureLoggedInWithAccessToken)(ctx, "Creating a deploy key");
|
|
55
47
|
const deploymentSelection = await (0, import_deploymentSelection.getDeploymentSelection)(ctx, options);
|
|
56
48
|
const deployment = await (0, import_api.loadSelectedDeploymentCredentials)(
|
|
57
49
|
ctx,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/deploymentTokenCreate.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAwB;AACxB,
|
|
4
|
+
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, logOutput, showSpinner } from \"../bundler/log.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport {\n ensureLoggedInWithAccessToken,\n getDeploymentSelection,\n} from \"./lib/deploymentSelection.js\";\nimport { changedEnvVarFile } from \"./lib/envvars.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n ENV_VAR_FILE_PATH,\n typedPlatformClient,\n} from \"./lib/utils/utils.js\";\n\nexport const deploymentTokenCreate = new Command(\"create\")\n .summary(\"Create an access token\")\n .description(\n [\n `Creates a deploy key that, when set as \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\`, scopes all commands to the target deployment.`,\n \"\",\n \"\u2022 Print a new deploy key to stdout: `npx convex deployment token create my-token`\",\n `\u2022 Save a new deploy key in \\`${ENV_VAR_FILE_PATH}\\`: \\`npx convex deployment token create my-token --save-env\\``,\n \"\u2022 Save a new deploy key in a custom env file: `npx convex deployment token create ci-token --save-env .env.production`\",\n \"\u2022 Create a key for the project's prod: `npx convex deployment token create ci-token --deployment prod`\",\n ].join(\"\\n\"),\n )\n .argument(\"<name>\", \"Name for the new deploy key\")\n .allowExcessArguments(false)\n .option(\n \"--save-env [path]\",\n `Save the new key as ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} in an env file instead of printing it. Defaults to ${ENV_VAR_FILE_PATH}.`,\n )\n .addDeploymentSelectionOptions(actionDescription(\"Create a deploy key for\"))\n .showHelpAfterError()\n .action(async (name, options) => {\n const ctx = await oneoffContext(options);\n\n await ensureLoggedInWithAccessToken(ctx, \"Creating a deploy key\");\n\n const deploymentSelection = await getDeploymentSelection(ctx, options);\n const deployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n { ensureLocalRunning: false },\n );\n\n if (deployment.deploymentFields === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot create a deploy key for a self-hosted deployment.\",\n });\n }\n\n const { deploymentName, deploymentType } = deployment.deploymentFields;\n if (deploymentType === \"local\" || deploymentType === \"anonymous\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot create a deploy key for a ${deploymentType} deployment.`,\n });\n }\n\n showSpinner(`Creating deploy key for ${deploymentName}...`);\n const response = await typedPlatformClient(ctx).POST(\n \"/deployments/{deployment_name}/create_deploy_key\",\n {\n params: { path: { deployment_name: deploymentName } },\n body: { name },\n },\n );\n const deployKey = response.data!.deployKey;\n\n if (options.saveEnv === undefined) {\n logFinishedStep(`Created deploy key \"${name}\" for ${deploymentName}.`);\n logOutput(deployKey);\n return;\n }\n\n const envFile =\n typeof options.saveEnv === \"string\" ? options.saveEnv : ENV_VAR_FILE_PATH;\n const existingFileContent = ctx.fs.exists(envFile)\n ? ctx.fs.readUtf8File(envFile)\n : null;\n const updatedContent = changedEnvVarFile({\n existingFileContent,\n envVarName: CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n envVarValue: deployKey,\n commentAfterValue: null,\n commentOnPreviousLine: null,\n });\n\n if (updatedContent === null) {\n logFinishedStep(\n `Deploy key for ${deploymentName} already present in ${envFile}; no changes made.`,\n );\n return;\n }\n\n ctx.fs.writeUtf8File(envFile, updatedContent);\n logFinishedStep(\n `Saved deploy key \"${name}\" for ${deploymentName} as ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} in ${envFile}.`,\n );\n });\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAwB;AACxB,qBAA8B;AAC9B,iBAAwD;AACxD,iBAAkD;AAClD,qBAAkC;AAClC,iCAGO;AACP,qBAAkC;AAClC,mBAIO;AAEA,MAAM,wBAAwB,IAAI,6BAAQ,QAAQ,EACtD,QAAQ,wBAAwB,EAChC;AAAA,EACC;AAAA,IACE,4CAA4C,2CAA8B;AAAA,IAC1E;AAAA,IACA;AAAA,IACA,qCAAgC,8BAAiB;AAAA,IACjD;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb,EACC,SAAS,UAAU,6BAA6B,EAChD,qBAAqB,KAAK,EAC1B;AAAA,EACC;AAAA,EACA,uBAAuB,2CAA8B,uDAAuD,8BAAiB;AAC/H,EACC,kCAA8B,kCAAkB,yBAAyB,CAAC,EAC1E,mBAAmB,EACnB,OAAO,OAAO,MAAM,YAAY;AAC/B,QAAM,MAAM,UAAM,8BAAc,OAAO;AAEvC,YAAM,0DAA8B,KAAK,uBAAuB;AAEhE,QAAM,sBAAsB,UAAM,mDAAuB,KAAK,OAAO;AACrE,QAAM,aAAa,UAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA,EAAE,oBAAoB,MAAM;AAAA,EAC9B;AAEA,MAAI,WAAW,qBAAqB,MAAM;AACxC,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,EAAE,gBAAgB,eAAe,IAAI,WAAW;AACtD,MAAI,mBAAmB,WAAW,mBAAmB,aAAa;AAChE,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,oCAAoC,cAAc;AAAA,IACpE,CAAC;AAAA,EACH;AAEA,8BAAY,2BAA2B,cAAc,KAAK;AAC1D,QAAM,WAAW,UAAM,kCAAoB,GAAG,EAAE;AAAA,IAC9C;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,eAAe,EAAE;AAAA,MACpD,MAAM,EAAE,KAAK;AAAA,IACf;AAAA,EACF;AACA,QAAM,YAAY,SAAS,KAAM;AAEjC,MAAI,QAAQ,YAAY,QAAW;AACjC,oCAAgB,uBAAuB,IAAI,SAAS,cAAc,GAAG;AACrE,8BAAU,SAAS;AACnB;AAAA,EACF;AAEA,QAAM,UACJ,OAAO,QAAQ,YAAY,WAAW,QAAQ,UAAU;AAC1D,QAAM,sBAAsB,IAAI,GAAG,OAAO,OAAO,IAC7C,IAAI,GAAG,aAAa,OAAO,IAC3B;AACJ,QAAM,qBAAiB,kCAAkB;AAAA,IACvC;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,EACzB,CAAC;AAED,MAAI,mBAAmB,MAAM;AAC3B;AAAA,MACE,kBAAkB,cAAc,uBAAuB,OAAO;AAAA,IAChE;AACA;AAAA,EACF;AAEA,MAAI,GAAG,cAAc,SAAS,cAAc;AAC5C;AAAA,IACE,qBAAqB,IAAI,SAAS,cAAc,OAAO,2CAA8B,OAAO,OAAO;AAAA,EACrG;AACF,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -35,23 +35,16 @@ const deploymentTokenDelete = new import_extra_typings.Command("delete").summary
|
|
|
35
35
|
"",
|
|
36
36
|
"The positional `<nameOrToken>` can be the unique name of the deploy key (as passed to `token create`) or the deploy key value itself. The target deployment defaults to the currently-selected one; pass `--deployment` to target a different deployment.",
|
|
37
37
|
"",
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"
|
|
38
|
+
"\u2022 Delete by name: `npx convex deployment token delete my-token`",
|
|
39
|
+
"\u2022 Delete by value: `npx convex deployment token delete 'dev:happy-animal-123|ey...'`",
|
|
40
|
+
"\u2022 Target prod: `npx convex deployment token delete ci-token --deployment prod`"
|
|
41
41
|
].join("\n")
|
|
42
42
|
).argument(
|
|
43
43
|
"<nameOrToken>",
|
|
44
44
|
"The unique name of the deploy key, or the deploy key value itself."
|
|
45
45
|
).allowExcessArguments(false).addDeploymentSelectionOptions((0, import_command.actionDescription)("Delete a deploy key for")).showHelpAfterError().action(async (nameOrToken, options) => {
|
|
46
46
|
const ctx = await (0, import_context.oneoffContext)(options);
|
|
47
|
-
|
|
48
|
-
if (auth === null || auth.kind !== "accessToken") {
|
|
49
|
-
return await ctx.crash({
|
|
50
|
-
exitCode: 1,
|
|
51
|
-
errorType: "fatal",
|
|
52
|
-
printedMessage: `Deleting a deploy key requires being logged in with a personal access token. ${auth === null ? "Run " : process.env[import_utils.CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME] && !process.env[import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME] ? `Unset ${import_utils.CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME} and run ` : `Unset ${import_utils.CONVEX_DEPLOY_KEY_ENV_VAR_NAME} and run `}${import_chalk.chalkStderr.bold("npx convex login")} and try again.`
|
|
53
|
-
});
|
|
54
|
-
}
|
|
47
|
+
await (0, import_deploymentSelection.ensureLoggedInWithAccessToken)(ctx, "Deleting a deploy key");
|
|
55
48
|
const deploymentSelection = await (0, import_deploymentSelection.getDeploymentSelection)(ctx, options);
|
|
56
49
|
const deployment = await (0, import_api.loadSelectedDeploymentCredentials)(
|
|
57
50
|
ctx,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/deploymentTokenDelete.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { chalkStderr } from \"chalk\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, showSpinner } from \"../bundler/log.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAwB;AACxB,mBAA4B;AAC5B,qBAA8B;AAC9B,iBAA6C;AAC7C,iBAAkD;AAClD,qBAAkC;AAClC,
|
|
4
|
+
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { chalkStderr } from \"chalk\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logFinishedStep, showSpinner } from \"../bundler/log.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport {\n ensureLoggedInWithAccessToken,\n getDeploymentSelection,\n} from \"./lib/deploymentSelection.js\";\nimport { typedPlatformClient } from \"./lib/utils/utils.js\";\n\nexport const deploymentTokenDelete = new Command(\"delete\")\n .summary(\"Delete an access token\")\n .description(\n [\n \"Delete an access token. Currently only deploy keys (deployment-scoped access tokens) are supported.\",\n \"\",\n \"The positional `<nameOrToken>` can be the unique name of the deploy key (as passed to `token create`) or the deploy key value itself. The target deployment defaults to the currently-selected one; pass `--deployment` to target a different deployment.\",\n \"\",\n \"\u2022 Delete by name: `npx convex deployment token delete my-token`\",\n \"\u2022 Delete by value: `npx convex deployment token delete 'dev:happy-animal-123|ey...'`\",\n \"\u2022 Target prod: `npx convex deployment token delete ci-token --deployment prod`\",\n ].join(\"\\n\"),\n )\n .argument(\n \"<nameOrToken>\",\n \"The unique name of the deploy key, or the deploy key value itself.\",\n )\n .allowExcessArguments(false)\n .addDeploymentSelectionOptions(actionDescription(\"Delete a deploy key for\"))\n .showHelpAfterError()\n .action(async (nameOrToken, options) => {\n const ctx = await oneoffContext(options);\n\n await ensureLoggedInWithAccessToken(ctx, \"Deleting a deploy key\");\n\n const deploymentSelection = await getDeploymentSelection(ctx, options);\n const deployment = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n { ensureLocalRunning: false },\n );\n\n if (deployment.deploymentFields === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot delete a deploy key for a self-hosted deployment.\",\n });\n }\n\n const { deploymentName, deploymentType } = deployment.deploymentFields;\n if (deploymentType === \"local\" || deploymentType === \"anonymous\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Cannot delete a deploy key for a ${deploymentType} deployment.`,\n });\n }\n\n // A full deploy key has the form `<type>:<deployment-name>|<token>`. If we\n // see the prefix without the `|`, the user almost certainly forgot to\n // quote: the shell ate `|` and everything after.\n if (/^(dev|prod|preview|local):[^|]*$/.test(nameOrToken)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `\"${nameOrToken}\" looks like a partial deploy key \u2014 your shell likely consumed the \\`|\\` and everything after it. Wrap the value in single quotes (e.g. ${chalkStderr.bold(`npx convex deployment token delete '${nameOrToken}|...'`)}) and try again.`,\n });\n }\n // The server matches against just the token portion, so strip the prefix\n // when present so users can paste the value of CONVEX_DEPLOY_KEY directly.\n const pipeIdx = nameOrToken.indexOf(\"|\");\n const id = pipeIdx >= 0 ? nameOrToken.slice(pipeIdx + 1) : nameOrToken;\n\n showSpinner(`Deleting deploy key for ${deploymentName}...`);\n await typedPlatformClient(ctx).POST(\n \"/deployments/{deployment_name}/delete_deploy_key\",\n {\n params: { path: { deployment_name: deploymentName } },\n body: { id },\n },\n );\n\n logFinishedStep(`Deleted deploy key for ${deploymentName}.`);\n });\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAwB;AACxB,mBAA4B;AAC5B,qBAA8B;AAC9B,iBAA6C;AAC7C,iBAAkD;AAClD,qBAAkC;AAClC,iCAGO;AACP,mBAAoC;AAE7B,MAAM,wBAAwB,IAAI,6BAAQ,QAAQ,EACtD,QAAQ,wBAAwB,EAChC;AAAA,EACC;AAAA,IACE;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb,EACC;AAAA,EACC;AAAA,EACA;AACF,EACC,qBAAqB,KAAK,EAC1B,kCAA8B,kCAAkB,yBAAyB,CAAC,EAC1E,mBAAmB,EACnB,OAAO,OAAO,aAAa,YAAY;AACtC,QAAM,MAAM,UAAM,8BAAc,OAAO;AAEvC,YAAM,0DAA8B,KAAK,uBAAuB;AAEhE,QAAM,sBAAsB,UAAM,mDAAuB,KAAK,OAAO;AACrE,QAAM,aAAa,UAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA,EAAE,oBAAoB,MAAM;AAAA,EAC9B;AAEA,MAAI,WAAW,qBAAqB,MAAM;AACxC,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBACE;AAAA,IACJ,CAAC;AAAA,EACH;AAEA,QAAM,EAAE,gBAAgB,eAAe,IAAI,WAAW;AACtD,MAAI,mBAAmB,WAAW,mBAAmB,aAAa;AAChE,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,oCAAoC,cAAc;AAAA,IACpE,CAAC;AAAA,EACH;AAKA,MAAI,mCAAmC,KAAK,WAAW,GAAG;AACxD,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,IAAI,WAAW,gJAA2I,yBAAY,KAAK,uCAAuC,WAAW,OAAO,CAAC;AAAA,IACvP,CAAC;AAAA,EACH;AAGA,QAAM,UAAU,YAAY,QAAQ,GAAG;AACvC,QAAM,KAAK,WAAW,IAAI,YAAY,MAAM,UAAU,CAAC,IAAI;AAE3D,8BAAY,2BAA2B,cAAc,KAAK;AAC1D,YAAM,kCAAoB,GAAG,EAAE;AAAA,IAC7B;AAAA,IACA;AAAA,MACE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,eAAe,EAAE;AAAA,MACpD,MAAM,EAAE,GAAG;AAAA,IACb;AAAA,EACF;AAEA,kCAAgB,0BAA0B,cAAc,GAAG;AAC7D,CAAC;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/cjs/cli/dev.js
CHANGED
|
@@ -61,7 +61,7 @@ const dev = new import_extra_typings.Command("dev").summary("Develop against a d
|
|
|
61
61
|
).addOption(
|
|
62
62
|
new import_extra_typings.Option(
|
|
63
63
|
"--start <command>",
|
|
64
|
-
"Start a long-running command alongside `convex dev`, like a frontend dev server. The command inherits stdin/stdout so you can interact with it directly. Example: npx convex dev --start 'vite --open'"
|
|
64
|
+
"Start a long-running command alongside `npx convex dev`, like a frontend dev server. The command inherits stdin/stdout so you can interact with it directly. Example: npx convex dev --start 'vite --open'"
|
|
65
65
|
).conflicts(["--run", "--run-sh"])
|
|
66
66
|
).addOption(
|
|
67
67
|
new import_extra_typings.Option("--run-sh <command>", "Deprecated: use --start instead.").conflicts(["--start", "--run"]).hideHelp()
|
|
@@ -78,9 +78,9 @@ const dev = new import_extra_typings.Command("dev").summary("Develop against a d
|
|
|
78
78
|
"--tail-logs [mode]",
|
|
79
79
|
[
|
|
80
80
|
"Choose whether to tail Convex function logs in this terminal: ",
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
81
|
+
"\u2022 `always` shows logs continuously",
|
|
82
|
+
"\u2022 `pause-on-deploy` (the default) pauses logs during deploys so you can spot sync issues",
|
|
83
|
+
"\u2022 `disable` hides logs while developing."
|
|
84
84
|
].join("\n")
|
|
85
85
|
).choices(["always", "pause-on-deploy", "disable"]).default("pause-on-deploy")
|
|
86
86
|
).addOption(new import_extra_typings.Option("--trace-events").default(false).hideHelp()).addOption(new import_extra_typings.Option("--debug-bundle-path <path>").hideHelp()).addOption(new import_extra_typings.Option("--debug-node-apis").hideHelp()).addOption(new import_extra_typings.Option("--live-component-sources").hideHelp()).addOption(
|
|
@@ -185,7 +185,8 @@ const dev = new import_extra_typings.Command("dev").summary("Develop against a d
|
|
|
185
185
|
deploymentName: credentials.deploymentFields?.deploymentName ?? null,
|
|
186
186
|
...credentials.deploymentFields?.deploymentType !== void 0 ? {
|
|
187
187
|
deploymentType: credentials.deploymentFields.deploymentType
|
|
188
|
-
} : {}
|
|
188
|
+
} : {},
|
|
189
|
+
backendVersion: localOptions.backendVersion
|
|
189
190
|
},
|
|
190
191
|
devOptions
|
|
191
192
|
)
|