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
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "convex",
|
|
3
3
|
"description": "Client for the Convex Cloud",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.41.0",
|
|
5
5
|
"author": "Convex, Inc. <no-reply@convex.dev>",
|
|
6
6
|
"homepage": "https://convex.dev",
|
|
7
7
|
"repository": {
|
|
@@ -199,6 +199,7 @@
|
|
|
199
199
|
],
|
|
200
200
|
"devDependencies": {
|
|
201
201
|
"@auth0/auth0-react": "2.15.1",
|
|
202
|
+
"@babel/code-frame": "^7.27.1",
|
|
202
203
|
"@babel/parser": "^7.27.1",
|
|
203
204
|
"@babel/types": "^7.27.1",
|
|
204
205
|
"@clerk/react": "^6.4.3",
|
|
@@ -214,6 +215,7 @@
|
|
|
214
215
|
"@swc/core": "1.15.8",
|
|
215
216
|
"@testing-library/react": "~16.3.0",
|
|
216
217
|
"@types/adm-zip": "^0.5.7",
|
|
218
|
+
"@types/babel__code-frame": "^7.0.6",
|
|
217
219
|
"@types/deep-equal": "1.0.4",
|
|
218
220
|
"@inquirer/confirm": "^6.0.4",
|
|
219
221
|
"@inquirer/input": "^5.0.4",
|
|
@@ -269,7 +271,7 @@
|
|
|
269
271
|
"typedoc": "^0.24.6",
|
|
270
272
|
"typescript": "~5.0.3",
|
|
271
273
|
"typescript-eslint": "~8.57.0",
|
|
272
|
-
"vitest": "^
|
|
274
|
+
"vitest": "^4.1.0",
|
|
273
275
|
"undici": "7.24.0",
|
|
274
276
|
"wait-for-expect": "~4.0.0",
|
|
275
277
|
"zod": "^3.24.0",
|
|
@@ -5,10 +5,10 @@ import { ActionRequest, MutationRequest } from "./protocol.js";
|
|
|
5
5
|
import { instantiateDefaultLogger } from "../logging.js";
|
|
6
6
|
|
|
7
7
|
let requestManager: RequestManager;
|
|
8
|
-
let markConnectionStateDirty: ReturnType<typeof vi.fn
|
|
8
|
+
let markConnectionStateDirty: ReturnType<typeof vi.fn<() => void>>;
|
|
9
9
|
|
|
10
10
|
beforeEach(() => {
|
|
11
|
-
markConnectionStateDirty = vi.fn();
|
|
11
|
+
markConnectionStateDirty = vi.fn<() => void>();
|
|
12
12
|
requestManager = new RequestManager(
|
|
13
13
|
instantiateDefaultLogger({ verbose: false }),
|
|
14
14
|
markConnectionStateDirty,
|
package/src/cli/aiFiles.ts
CHANGED
|
@@ -68,7 +68,7 @@ const aiUpdate = new Command("update")
|
|
|
68
68
|
" - convex/_generated/ai/guidelines.md\n" +
|
|
69
69
|
" - AGENTS.md (Convex section only)\n" +
|
|
70
70
|
" - CLAUDE.md (Convex section only)\n" +
|
|
71
|
-
" - Agent skills (installed to each coding agent's native path, configured via convex.json)
|
|
71
|
+
" - Agent skills (installed to each coding agent's native path, configured via convex.json)",
|
|
72
72
|
)
|
|
73
73
|
.allowExcessArguments(false)
|
|
74
74
|
.action(async () => {
|
|
@@ -130,7 +130,7 @@ const aiRemove = new Command("remove")
|
|
|
130
130
|
"Removes the following:\n" +
|
|
131
131
|
" - convex/_generated/ai/ directory (guidelines.md, ai-files.state.json)\n" +
|
|
132
132
|
" - Convex sections from AGENTS.md and CLAUDE.md\n" +
|
|
133
|
-
" - Agent skills installed by `convex ai-files install`\n\n" +
|
|
133
|
+
" - Agent skills installed by `npx convex ai-files install`\n\n" +
|
|
134
134
|
"If removing the managed section leaves AGENTS.md or CLAUDE.md empty, the\n" +
|
|
135
135
|
"empty file is deleted. Otherwise the rest of the file is kept.\n\n" +
|
|
136
136
|
"Skills installed from other sources are not affected.\n\n" +
|
package/src/cli/configure.ts
CHANGED
|
@@ -93,9 +93,10 @@ type ConfigureCmdOptions = {
|
|
|
93
93
|
/**
|
|
94
94
|
* As of writing, this is used by:
|
|
95
95
|
* - `npx convex dev`
|
|
96
|
-
* - `npx convex
|
|
96
|
+
* - `npx convex init`
|
|
97
97
|
*
|
|
98
|
-
* But is not used by `npx convex deploy`
|
|
98
|
+
* But is not used by `npx convex deploy`, `npx convex codegen`,
|
|
99
|
+
* `npx convex env`, or other commands.
|
|
99
100
|
*/
|
|
100
101
|
export async function deploymentCredentialsOrConfigure(
|
|
101
102
|
ctx: Context,
|
|
@@ -692,10 +693,7 @@ async function ensureDeploymentProvisioned(
|
|
|
692
693
|
},
|
|
693
694
|
options.deploymentOptions.kind,
|
|
694
695
|
);
|
|
695
|
-
return
|
|
696
|
-
...credentials,
|
|
697
|
-
onActivity: null,
|
|
698
|
-
};
|
|
696
|
+
return credentials;
|
|
699
697
|
}
|
|
700
698
|
case "local": {
|
|
701
699
|
const credentials = await handleLocalDeployment(ctx, {
|
package/src/cli/convexExport.ts
CHANGED
|
@@ -13,9 +13,9 @@ export const convexExport = new Command("export")
|
|
|
13
13
|
[
|
|
14
14
|
"Export data, and optionally file storage, from your Convex deployment to a ZIP file.",
|
|
15
15
|
"",
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
16
|
+
"• Export to a directory: `npx convex export --path dir/`",
|
|
17
|
+
"• Export to a ZIP file: `npx convex export --path snapshot.zip`",
|
|
18
|
+
"• Include file storage: `npx convex export --include-file-storage --path dir/`",
|
|
19
19
|
"",
|
|
20
20
|
"By default, this exports from your dev deployment.",
|
|
21
21
|
"",
|
package/src/cli/convexImport.ts
CHANGED
|
@@ -14,8 +14,8 @@ export const convexImport = new Command("import")
|
|
|
14
14
|
[
|
|
15
15
|
"Import data from a file to your Convex deployment.",
|
|
16
16
|
"",
|
|
17
|
-
"
|
|
18
|
-
"
|
|
17
|
+
"• From a snapshot: `npx convex import snapshot.zip`",
|
|
18
|
+
"• For a single table: `npx convex import --table tableName file.json`",
|
|
19
19
|
"",
|
|
20
20
|
"By default, this imports into your dev deployment.",
|
|
21
21
|
"",
|
package/src/cli/dashboard.ts
CHANGED
|
@@ -6,7 +6,6 @@ import { logMessage, logOutput, logWarning } from "../bundler/log.js";
|
|
|
6
6
|
import { loadSelectedDeploymentCredentials } from "./lib/api.js";
|
|
7
7
|
import { actionDescription } from "./lib/command.js";
|
|
8
8
|
import { getDeploymentSelection } from "./lib/deploymentSelection.js";
|
|
9
|
-
import { checkIfDashboardIsRunning } from "./lib/localDeployment/dashboard.js";
|
|
10
9
|
import { DASHBOARD_HOST, getDashboardUrl } from "./lib/dashboard.js";
|
|
11
10
|
import { isAnonymousDeployment } from "./lib/deployment.js";
|
|
12
11
|
|
|
@@ -45,8 +44,15 @@ export const dashboard = new Command("dashboard")
|
|
|
45
44
|
logWarning(warningMessage);
|
|
46
45
|
return;
|
|
47
46
|
}
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
// The anonymous-mode dashboard is a separate local HTTP server; confirm
|
|
48
|
+
// it's actually serving by hitting its API rather than inferring from the
|
|
49
|
+
// backend.
|
|
50
|
+
if (
|
|
51
|
+
!(await isAnonymousDashboardRunning(
|
|
52
|
+
dashboardUrl,
|
|
53
|
+
deployment.deploymentFields.deploymentName,
|
|
54
|
+
))
|
|
55
|
+
) {
|
|
50
56
|
logWarning(warningMessage);
|
|
51
57
|
return;
|
|
52
58
|
}
|
|
@@ -57,6 +63,26 @@ export const dashboard = new Command("dashboard")
|
|
|
57
63
|
await logOrOpenUrl(ctx, dashboardUrl ?? DASHBOARD_HOST, options.open);
|
|
58
64
|
});
|
|
59
65
|
|
|
66
|
+
async function isAnonymousDashboardRunning(
|
|
67
|
+
dashboardUrl: string,
|
|
68
|
+
deploymentName: string,
|
|
69
|
+
): Promise<boolean> {
|
|
70
|
+
try {
|
|
71
|
+
// `dashboardUrl` ends with a trailing slash.
|
|
72
|
+
const resp = await fetch(`${dashboardUrl}api/current_deployment`);
|
|
73
|
+
if (resp.status !== 200) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
// The dashboard port is stored per deployment but can be reused by a
|
|
77
|
+
// different anonymous dev session, so confirm this dashboard is actually
|
|
78
|
+
// serving the selected deployment.
|
|
79
|
+
const currentDeployment = (await resp.json()) as { name?: unknown };
|
|
80
|
+
return currentDeployment.name === deploymentName;
|
|
81
|
+
} catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
60
86
|
async function logOrOpenUrl(ctx: Context, url: string, shouldOpen: boolean) {
|
|
61
87
|
if (shouldOpen) {
|
|
62
88
|
logMessage(chalkStderr.gray(`Opening ${url} in the default browser...`));
|
package/src/cli/data.ts
CHANGED
|
@@ -12,8 +12,8 @@ export const data = new Command("data")
|
|
|
12
12
|
[
|
|
13
13
|
"Inspect your Convex deployment's database.",
|
|
14
14
|
"",
|
|
15
|
-
"
|
|
16
|
-
"
|
|
15
|
+
"• List tables: `npx convex data`",
|
|
16
|
+
"• List documents in a table: `npx convex data tableName`",
|
|
17
17
|
"",
|
|
18
18
|
"By default, this inspects your dev deployment.",
|
|
19
19
|
"",
|
package/src/cli/deploy.ts
CHANGED
|
@@ -42,11 +42,11 @@ export const deploy = new Command("deploy")
|
|
|
42
42
|
"This is typically used for deploying to a prod or preview deployment manually or from CI; to deploy to your dev deployment when developing, use `npx convex dev`.",
|
|
43
43
|
"",
|
|
44
44
|
"The target deployment is chosen like this:",
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
`
|
|
48
|
-
`
|
|
49
|
-
`
|
|
45
|
+
`• If the \`${CONVEX_DEPLOYMENT_ENV_VAR_NAME}\` environment variable is set (typical during local development), the target is the project’s default production deployment.`,
|
|
46
|
+
`• If the \`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\` environment variable is set (typical in CI), it is the deployment associated with that key.`,
|
|
47
|
+
` • When it’s set to a preview deploy key, it will deploy to a preview deployment:`,
|
|
48
|
+
` • with the name of the current Git branch when running in CI (Vercel, Netlify, Cloudflare Pages, GitHub)`,
|
|
49
|
+
` • or with the name specified by the \`--preview-name\` or \`--preview-create\` flags`,
|
|
50
50
|
"",
|
|
51
51
|
"`npx convex deploy` will:",
|
|
52
52
|
" 1. Run a command if specified with `--cmd`, with the deployment URL available as an environment variable.",
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { describe, test, expect, vi, beforeEach, afterEach } from "vitest";
|
|
2
2
|
// @inquirer/testing/vitest must be imported before modules that use @inquirer/*
|
|
3
3
|
import { screen } from "@inquirer/testing/vitest";
|
|
4
|
+
import { fileURLToPath } from "url";
|
|
5
|
+
import path from "path";
|
|
4
6
|
import {
|
|
5
7
|
typedPlatformClient,
|
|
6
8
|
typedBigBrainClient,
|
|
@@ -13,7 +15,9 @@ import {
|
|
|
13
15
|
getDeploymentSelection,
|
|
14
16
|
getProjectDetails,
|
|
15
17
|
deploymentNameFromSelection,
|
|
18
|
+
initializeBigBrainAuth,
|
|
16
19
|
} from "./lib/deploymentSelection.js";
|
|
20
|
+
import type { Context } from "../bundler/context.js";
|
|
17
21
|
import { saveSelectedDeployment } from "./deploymentSelect.js";
|
|
18
22
|
import {
|
|
19
23
|
deploymentCreate,
|
|
@@ -25,10 +29,7 @@ import {
|
|
|
25
29
|
loadProjectLocalConfig,
|
|
26
30
|
saveDeploymentConfig,
|
|
27
31
|
} from "./lib/localDeployment/filePaths.js";
|
|
28
|
-
import {
|
|
29
|
-
chooseLocalBackendPorts,
|
|
30
|
-
LOCAL_BACKEND_INSTANCE_SECRET,
|
|
31
|
-
} from "./lib/localDeployment/utils.js";
|
|
32
|
+
import { chooseLocalBackendPorts } from "./lib/localDeployment/utils.js";
|
|
32
33
|
import { bigBrainStart } from "./lib/localDeployment/bigBrain.js";
|
|
33
34
|
|
|
34
35
|
vi.mock("@sentry/node", () => ({
|
|
@@ -36,19 +37,28 @@ vi.mock("@sentry/node", () => ({
|
|
|
36
37
|
close: vi.fn(),
|
|
37
38
|
}));
|
|
38
39
|
|
|
39
|
-
vi.mock("./lib/utils/utils.js", () =>
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
40
|
+
vi.mock("./lib/utils/utils.js", async (importOriginal) => {
|
|
41
|
+
const actual = await importOriginal<typeof import("./lib/utils/utils.js")>();
|
|
42
|
+
return {
|
|
43
|
+
...actual,
|
|
44
|
+
typedPlatformClient: vi.fn(),
|
|
45
|
+
typedBigBrainClient: vi.fn(),
|
|
46
|
+
selectRegion: vi.fn(),
|
|
47
|
+
logNoDefaultRegionMessage: vi.fn(),
|
|
48
|
+
};
|
|
49
|
+
});
|
|
45
50
|
|
|
46
|
-
vi.mock("./lib/deploymentSelection.js", () =>
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
51
|
+
vi.mock("./lib/deploymentSelection.js", async (importOriginal) => {
|
|
52
|
+
const actual =
|
|
53
|
+
await importOriginal<typeof import("./lib/deploymentSelection.js")>();
|
|
54
|
+
return {
|
|
55
|
+
...actual,
|
|
56
|
+
initializeBigBrainAuth: vi.fn(),
|
|
57
|
+
getDeploymentSelection: vi.fn(),
|
|
58
|
+
getProjectDetails: vi.fn(),
|
|
59
|
+
deploymentNameFromSelection: vi.fn().mockReturnValue(null),
|
|
60
|
+
};
|
|
61
|
+
});
|
|
52
62
|
|
|
53
63
|
vi.mock("./deploymentSelect.js", () => ({
|
|
54
64
|
saveSelectedDeployment: vi.fn(),
|
|
@@ -65,13 +75,17 @@ vi.mock("./lib/localDeployment/filePaths.js", () => ({
|
|
|
65
75
|
|
|
66
76
|
vi.mock("./lib/localDeployment/utils.js", () => ({
|
|
67
77
|
chooseLocalBackendPorts: vi.fn(),
|
|
68
|
-
LOCAL_BACKEND_INSTANCE_SECRET: "MockSecret123",
|
|
69
78
|
}));
|
|
70
79
|
|
|
71
80
|
vi.mock("./lib/localDeployment/bigBrain.js", () => ({
|
|
72
81
|
bigBrainStart: vi.fn(),
|
|
73
82
|
}));
|
|
74
83
|
|
|
84
|
+
const fakeLocalDevBinary = path.join(
|
|
85
|
+
path.dirname(fileURLToPath(import.meta.url)),
|
|
86
|
+
"lib/localDeployment/tests/keygenSuccess.mjs",
|
|
87
|
+
);
|
|
88
|
+
|
|
75
89
|
const mockRegions = [
|
|
76
90
|
{
|
|
77
91
|
name: "aws-us-east-1" as const,
|
|
@@ -104,6 +118,44 @@ const mockPlatformGet = vi.fn();
|
|
|
104
118
|
const mockPlatformPost = vi.fn();
|
|
105
119
|
const mockBigBrainGet = vi.fn();
|
|
106
120
|
|
|
121
|
+
function setAuthKind(
|
|
122
|
+
kind: "accessToken" | "deploymentKey" | "projectKey" | "previewDeployKey",
|
|
123
|
+
) {
|
|
124
|
+
vi.mocked(initializeBigBrainAuth).mockImplementation(async (ctx) => {
|
|
125
|
+
const fakeAuth =
|
|
126
|
+
kind === "accessToken"
|
|
127
|
+
? {
|
|
128
|
+
kind: "accessToken" as const,
|
|
129
|
+
accessToken: "test-token",
|
|
130
|
+
header: "Bearer test-token",
|
|
131
|
+
}
|
|
132
|
+
: kind === "deploymentKey"
|
|
133
|
+
? {
|
|
134
|
+
kind: "deploymentKey" as const,
|
|
135
|
+
deploymentKey: "dev:foo|secret",
|
|
136
|
+
header: "Bearer dev:foo|secret",
|
|
137
|
+
}
|
|
138
|
+
: kind === "projectKey"
|
|
139
|
+
? {
|
|
140
|
+
kind: "projectKey" as const,
|
|
141
|
+
projectKey: "project:foo|secret",
|
|
142
|
+
header: "Bearer project:foo|secret",
|
|
143
|
+
}
|
|
144
|
+
: {
|
|
145
|
+
kind: "previewDeployKey" as const,
|
|
146
|
+
previewDeployKey: "preview:t:p|secret",
|
|
147
|
+
header: "Bearer preview:t:p|secret",
|
|
148
|
+
};
|
|
149
|
+
(ctx as Context)._updateBigBrainAuth(fakeAuth);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function setNoAuth() {
|
|
154
|
+
vi.mocked(initializeBigBrainAuth).mockImplementation(async (ctx) => {
|
|
155
|
+
(ctx as Context)._updateBigBrainAuth(null);
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
|
|
107
159
|
function setupPlatformClient() {
|
|
108
160
|
vi.mocked(typedPlatformClient).mockReturnValue({
|
|
109
161
|
GET: mockPlatformGet,
|
|
@@ -123,6 +175,8 @@ beforeEach(() => {
|
|
|
123
175
|
mockPlatformGet.mockReset();
|
|
124
176
|
mockPlatformPost.mockReset();
|
|
125
177
|
mockBigBrainGet.mockReset();
|
|
178
|
+
// Default to a logged-in personal access token; guard tests override this.
|
|
179
|
+
setAuthKind("accessToken");
|
|
126
180
|
});
|
|
127
181
|
|
|
128
182
|
afterEach(() => {
|
|
@@ -161,6 +215,60 @@ function setupPlatformForCreate(overrides?: Record<string, unknown>) {
|
|
|
161
215
|
});
|
|
162
216
|
}
|
|
163
217
|
|
|
218
|
+
describe("deploy key guard", () => {
|
|
219
|
+
test.each(["deploymentKey", "previewDeployKey"] as const)(
|
|
220
|
+
"crashes before any platform call when authed with a %s",
|
|
221
|
+
async (kind) => {
|
|
222
|
+
setAuthKind(kind);
|
|
223
|
+
setupPlatformClient();
|
|
224
|
+
|
|
225
|
+
await expect(
|
|
226
|
+
deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
|
|
227
|
+
from: "user",
|
|
228
|
+
}),
|
|
229
|
+
).rejects.toThrow();
|
|
230
|
+
|
|
231
|
+
expect(process.stderr.write).toHaveBeenCalledWith(
|
|
232
|
+
expect.stringContaining("isn't supported with a deploy key"),
|
|
233
|
+
);
|
|
234
|
+
expect(mockPlatformGet).not.toHaveBeenCalled();
|
|
235
|
+
expect(mockPlatformPost).not.toHaveBeenCalled();
|
|
236
|
+
},
|
|
237
|
+
);
|
|
238
|
+
|
|
239
|
+
test("crashes when no auth is configured at all", async () => {
|
|
240
|
+
setNoAuth();
|
|
241
|
+
setupPlatformClient();
|
|
242
|
+
|
|
243
|
+
await expect(
|
|
244
|
+
deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
|
|
245
|
+
from: "user",
|
|
246
|
+
}),
|
|
247
|
+
).rejects.toThrow();
|
|
248
|
+
|
|
249
|
+
expect(process.stderr.write).toHaveBeenCalledWith(
|
|
250
|
+
expect.stringContaining("Creating a deployment requires logging in"),
|
|
251
|
+
);
|
|
252
|
+
expect(mockPlatformGet).not.toHaveBeenCalled();
|
|
253
|
+
expect(mockPlatformPost).not.toHaveBeenCalled();
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
test("also guards local deployment creation", async () => {
|
|
257
|
+
setAuthKind("deploymentKey");
|
|
258
|
+
setupPlatformClient();
|
|
259
|
+
|
|
260
|
+
await expect(
|
|
261
|
+
deploymentCreate.parseAsync(["local"], { from: "user" }),
|
|
262
|
+
).rejects.toThrow();
|
|
263
|
+
|
|
264
|
+
expect(process.stderr.write).toHaveBeenCalledWith(
|
|
265
|
+
expect.stringContaining("isn't supported with a deploy key"),
|
|
266
|
+
);
|
|
267
|
+
expect(mockPlatformGet).not.toHaveBeenCalled();
|
|
268
|
+
expect(mockPlatformPost).not.toHaveBeenCalled();
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
|
|
164
272
|
describe("non-interactive create flow", () => {
|
|
165
273
|
beforeEach(() => {
|
|
166
274
|
vi.mocked(getDeploymentSelection).mockReset();
|
|
@@ -209,7 +317,7 @@ describe("non-interactive create flow", () => {
|
|
|
209
317
|
vi.mocked(getProjectDetails).mockResolvedValue(fakeProject);
|
|
210
318
|
vi.mocked(loadProjectLocalConfig).mockReturnValue(null);
|
|
211
319
|
vi.mocked(ensureBackendBinaryDownloaded).mockResolvedValue({
|
|
212
|
-
binaryPath:
|
|
320
|
+
binaryPath: fakeLocalDevBinary,
|
|
213
321
|
version: "1.0.0",
|
|
214
322
|
});
|
|
215
323
|
vi.mocked(chooseLocalBackendPorts).mockResolvedValue({
|
|
@@ -233,8 +341,8 @@ describe("non-interactive create flow", () => {
|
|
|
233
341
|
{
|
|
234
342
|
backendVersion: "1.0.0",
|
|
235
343
|
ports: { cloud: 3210, site: 3211 },
|
|
236
|
-
adminKey: "test-
|
|
237
|
-
instanceSecret:
|
|
344
|
+
adminKey: "local-test-123|mock_admin_key",
|
|
345
|
+
instanceSecret: expect.anything(),
|
|
238
346
|
cloudProjectId: fakeProject.id,
|
|
239
347
|
},
|
|
240
348
|
);
|
|
@@ -261,7 +369,7 @@ describe("non-interactive create flow", () => {
|
|
|
261
369
|
vi.mocked(getProjectDetails).mockResolvedValue(fakeProject);
|
|
262
370
|
vi.mocked(loadProjectLocalConfig).mockReturnValue(null);
|
|
263
371
|
vi.mocked(ensureBackendBinaryDownloaded).mockResolvedValue({
|
|
264
|
-
binaryPath:
|
|
372
|
+
binaryPath: fakeLocalDevBinary,
|
|
265
373
|
version: "1.0.0",
|
|
266
374
|
});
|
|
267
375
|
vi.mocked(chooseLocalBackendPorts).mockResolvedValue({
|
|
@@ -405,6 +513,25 @@ describe("non-interactive create flow", () => {
|
|
|
405
513
|
);
|
|
406
514
|
});
|
|
407
515
|
|
|
516
|
+
test("allows a project key (creates the deployment)", async () => {
|
|
517
|
+
setAuthKind("projectKey");
|
|
518
|
+
setupPlatformForCreate();
|
|
519
|
+
|
|
520
|
+
await deploymentCreate.parseAsync(["my-deployment", "--type", "dev"], {
|
|
521
|
+
from: "user",
|
|
522
|
+
});
|
|
523
|
+
|
|
524
|
+
expect(mockPlatformPost).toHaveBeenCalledWith(
|
|
525
|
+
"/projects/{project_id}/create_deployment",
|
|
526
|
+
expect.objectContaining({
|
|
527
|
+
body: expect.objectContaining({
|
|
528
|
+
type: "dev",
|
|
529
|
+
reference: "my-deployment",
|
|
530
|
+
}),
|
|
531
|
+
}),
|
|
532
|
+
);
|
|
533
|
+
});
|
|
534
|
+
|
|
408
535
|
test("creates a prod deployment with ref and --type prod", async () => {
|
|
409
536
|
setupPlatformForCreate({
|
|
410
537
|
deploymentType: "prod",
|
|
@@ -661,7 +788,7 @@ describe("non-interactive create flow", () => {
|
|
|
661
788
|
});
|
|
662
789
|
vi.mocked(loadProjectLocalConfig).mockReturnValue(null);
|
|
663
790
|
vi.mocked(ensureBackendBinaryDownloaded).mockResolvedValue({
|
|
664
|
-
binaryPath:
|
|
791
|
+
binaryPath: fakeLocalDevBinary,
|
|
665
792
|
version: "1.0.0",
|
|
666
793
|
});
|
|
667
794
|
vi.mocked(chooseLocalBackendPorts).mockResolvedValue({
|
|
@@ -697,7 +824,7 @@ describe("non-interactive create flow", () => {
|
|
|
697
824
|
"local",
|
|
698
825
|
"local-other_team-other_project-xyz",
|
|
699
826
|
expect.objectContaining({
|
|
700
|
-
adminKey: "
|
|
827
|
+
adminKey: "local-other_team-other_project-xyz|mock_admin_key",
|
|
701
828
|
cloudProjectId: 999,
|
|
702
829
|
}),
|
|
703
830
|
);
|
|
@@ -730,7 +857,7 @@ describe("non-interactive create flow", () => {
|
|
|
730
857
|
});
|
|
731
858
|
vi.mocked(loadProjectLocalConfig).mockReturnValue(null);
|
|
732
859
|
vi.mocked(ensureBackendBinaryDownloaded).mockResolvedValue({
|
|
733
|
-
binaryPath:
|
|
860
|
+
binaryPath: fakeLocalDevBinary,
|
|
734
861
|
version: "1.0.0",
|
|
735
862
|
});
|
|
736
863
|
vi.mocked(chooseLocalBackendPorts).mockResolvedValue({
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
} from "../bundler/log.js";
|
|
10
10
|
import {
|
|
11
11
|
DeploymentSelection,
|
|
12
|
+
ensureAuthCanCreateDeployment,
|
|
12
13
|
getDeploymentSelection,
|
|
13
14
|
getProjectDetails,
|
|
14
15
|
deploymentNameFromSelection,
|
|
@@ -35,14 +36,12 @@ import {
|
|
|
35
36
|
loadProjectLocalConfig,
|
|
36
37
|
saveDeploymentConfig,
|
|
37
38
|
} from "./lib/localDeployment/filePaths.js";
|
|
38
|
-
import {
|
|
39
|
-
chooseLocalBackendPorts,
|
|
40
|
-
LOCAL_BACKEND_INSTANCE_SECRET,
|
|
41
|
-
} from "./lib/localDeployment/utils.js";
|
|
39
|
+
import { chooseLocalBackendPorts } from "./lib/localDeployment/utils.js";
|
|
42
40
|
import { bigBrainStart } from "./lib/localDeployment/bigBrain.js";
|
|
43
41
|
import { importDefaultEnvVars } from "./lib/localDeployment/localDeployment.js";
|
|
44
42
|
import { localDeploymentUrl } from "./lib/localDeployment/run.js";
|
|
45
43
|
import { announceDeploymentTarget } from "./lib/announceDeploymentTarget.js";
|
|
44
|
+
import { generateLocalDevSecrets } from "./lib/localDeployment/secrets.js";
|
|
46
45
|
|
|
47
46
|
const SUPPORTED_TYPES = ["dev", "prod", "preview"] as const;
|
|
48
47
|
|
|
@@ -52,8 +51,8 @@ export const deploymentCreate = new Command("create")
|
|
|
52
51
|
[
|
|
53
52
|
"Create a new deployment for a project.",
|
|
54
53
|
"",
|
|
55
|
-
"
|
|
56
|
-
"
|
|
54
|
+
"• Create a dev deployment and select it: `npx convex deployment create dev/my-new-feature --type dev --select`",
|
|
55
|
+
"• Create a prod deployment named “staging”: `npx convex deployment create staging --type prod`",
|
|
57
56
|
].join("\n"),
|
|
58
57
|
)
|
|
59
58
|
.argument(
|
|
@@ -91,6 +90,12 @@ export const deploymentCreate = new Command("create")
|
|
|
91
90
|
envFile: undefined,
|
|
92
91
|
});
|
|
93
92
|
|
|
93
|
+
// Creating a deployment goes through the platform API, which accepts
|
|
94
|
+
// personal access tokens and project keys but not deployment/preview deploy
|
|
95
|
+
// keys. Fail fast (and clearly) for the unsupported keys rather than
|
|
96
|
+
// surfacing an opaque 401 from the lookup below.
|
|
97
|
+
await ensureAuthCanCreateDeployment(ctx);
|
|
98
|
+
|
|
94
99
|
const currentDeployment = await getDeploymentSelection(ctx, {
|
|
95
100
|
url: undefined,
|
|
96
101
|
adminKey: undefined,
|
|
@@ -282,25 +287,30 @@ export async function createLocalDeployment(
|
|
|
282
287
|
: await resolveProject(ctx, currentDeployment);
|
|
283
288
|
|
|
284
289
|
showSpinner("Downloading local backend...");
|
|
285
|
-
const { version } =
|
|
286
|
-
|
|
287
|
-
|
|
290
|
+
const { version, binaryPath: latestBinaryPath } =
|
|
291
|
+
await ensureBackendBinaryDownloaded(ctx, {
|
|
292
|
+
kind: "latest",
|
|
293
|
+
});
|
|
288
294
|
|
|
289
295
|
const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx);
|
|
290
296
|
|
|
291
297
|
showSpinner("Registering local deployment...");
|
|
292
|
-
const { deploymentName
|
|
298
|
+
const { deploymentName } = await bigBrainStart(ctx, {
|
|
293
299
|
port: cloudPort,
|
|
294
300
|
projectSlug,
|
|
295
301
|
teamSlug,
|
|
296
302
|
instanceName: null,
|
|
297
303
|
});
|
|
304
|
+
const { instanceSecret, adminKey } = await generateLocalDevSecrets(ctx, {
|
|
305
|
+
deploymentName,
|
|
306
|
+
latestBinaryPath,
|
|
307
|
+
});
|
|
298
308
|
|
|
299
309
|
saveDeploymentConfig(ctx, "local", deploymentName, {
|
|
300
310
|
backendVersion: version,
|
|
301
311
|
ports: { cloud: cloudPort, site: sitePort },
|
|
302
312
|
adminKey,
|
|
303
|
-
instanceSecret
|
|
313
|
+
instanceSecret,
|
|
304
314
|
cloudProjectId,
|
|
305
315
|
});
|
|
306
316
|
|
|
@@ -38,11 +38,11 @@ export const deploymentSelect = new Command("select")
|
|
|
38
38
|
"",
|
|
39
39
|
"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.",
|
|
40
40
|
"",
|
|
41
|
-
"
|
|
42
|
-
"
|
|
43
|
-
"
|
|
44
|
-
"
|
|
45
|
-
"
|
|
41
|
+
"• Select your personal cloud dev deployment in the current project: `npx convex deployment select dev`",
|
|
42
|
+
"• Select your local deployment: `npx convex deployment select local`",
|
|
43
|
+
"• Select a deployment in the same project by its reference: `npx convex deployment select dev/james`",
|
|
44
|
+
"• Select a deployment in another project in the same team: `npx convex deployment select some-project:dev/james`",
|
|
45
|
+
"• Select a deployment in a particular team/project: `npx convex deployment select some-team:some-project:dev/james`",
|
|
46
46
|
].join("\n"),
|
|
47
47
|
)
|
|
48
48
|
.argument("<deployment>", "The deployment to use")
|
|
@@ -271,7 +271,6 @@ describe("deployment selection flows", () => {
|
|
|
271
271
|
deploymentName: "local-test",
|
|
272
272
|
deploymentUrl: "http://127.0.0.1:3210",
|
|
273
273
|
adminKey: "local|admin|key",
|
|
274
|
-
onActivity: async () => {},
|
|
275
274
|
} as any);
|
|
276
275
|
vi.mocked(loadLocalDeploymentCredentials).mockResolvedValue({
|
|
277
276
|
deploymentName: "local-test",
|
|
@@ -291,7 +290,6 @@ describe("deployment selection flows", () => {
|
|
|
291
290
|
adminKey: "anon|admin|key",
|
|
292
291
|
reference: null,
|
|
293
292
|
isDefault: false,
|
|
294
|
-
onActivity: async () => {},
|
|
295
293
|
});
|
|
296
294
|
});
|
|
297
295
|
|
|
@@ -2295,7 +2293,6 @@ describe("deployment selection flows", () => {
|
|
|
2295
2293
|
deploymentName: "my-local-deployment",
|
|
2296
2294
|
deploymentUrl: "http://127.0.0.1:3210",
|
|
2297
2295
|
adminKey: "fresh|admin|key",
|
|
2298
|
-
onActivity: async () => {},
|
|
2299
2296
|
} as any);
|
|
2300
2297
|
|
|
2301
2298
|
setupBigBrainRoutes({
|