convex 1.31.6 → 1.31.8-alpha.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 +6 -0
- package/bin/main-dev +1 -1
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +1 -1
- package/dist/cjs/cli/configure.js +21 -15
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/convexImport.js +1 -1
- package/dist/cjs/cli/convexImport.js.map +2 -2
- package/dist/cjs/cli/dashboard.js +5 -4
- package/dist/cjs/cli/dashboard.js.map +2 -2
- package/dist/cjs/cli/deploy.js +4 -2
- package/dist/cjs/cli/deploy.js.map +2 -2
- package/dist/cjs/cli/dev.js +5 -0
- package/dist/cjs/cli/dev.js.map +2 -2
- package/dist/cjs/cli/integration.js +8 -1
- package/dist/cjs/cli/integration.js.map +2 -2
- package/dist/cjs/cli/lib/api.js +2 -4
- package/dist/cjs/cli/lib/api.js.map +2 -2
- package/dist/cjs/cli/lib/command.js +8 -2
- package/dist/cjs/cli/lib/command.js.map +2 -2
- package/dist/cjs/cli/lib/components.js +53 -1
- package/dist/cjs/cli/lib/components.js.map +2 -2
- package/dist/cjs/cli/lib/config.js.map +2 -2
- package/dist/cjs/cli/lib/dashboard.js +8 -2
- package/dist/cjs/cli/lib/dashboard.js.map +2 -2
- package/dist/cjs/cli/lib/deploy2.js +21 -6
- package/dist/cjs/cli/lib/deploy2.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/componentDefinition.js +3 -2
- package/dist/cjs/cli/lib/deployApi/componentDefinition.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/definitionConfig.js +2 -1
- package/dist/cjs/cli/lib/deployApi/definitionConfig.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/modules.js +6 -0
- package/dist/cjs/cli/lib/deployApi/modules.js.map +2 -2
- package/dist/cjs/cli/lib/deployment.js.map +2 -2
- package/dist/cjs/cli/lib/dev.js +3 -1
- package/dist/cjs/cli/lib/dev.js.map +2 -2
- package/dist/cjs/cli/lib/env.js +13 -1
- package/dist/cjs/cli/lib/env.js.map +2 -2
- package/dist/cjs/cli/lib/envvars.js +100 -39
- package/dist/cjs/cli/lib/envvars.js.map +2 -2
- package/dist/cjs/cli/lib/init.js +12 -6
- package/dist/cjs/cli/lib/init.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/anonymous.js +1 -1
- package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/cjs/cli/lib/run.js +1 -0
- package/dist/cjs/cli/lib/run.js.map +2 -2
- package/dist/cjs/cli/lib/typecheck.js +30 -0
- package/dist/cjs/cli/lib/typecheck.js.map +2 -2
- package/dist/cjs/cli/lib/watch.js +3 -1
- package/dist/cjs/cli/lib/watch.js.map +2 -2
- package/dist/cjs/cli/lib/workos/workos.js +1 -1
- package/dist/cjs/cli/lib/workos/workos.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/server/pagination.js.map +2 -2
- package/dist/cjs/values/index.js +3 -0
- package/dist/cjs/values/index.js.map +2 -2
- package/dist/cjs/values/size.js +108 -0
- package/dist/cjs/values/size.js.map +7 -0
- package/dist/cjs-types/cli/configure.d.ts +2 -7
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/dashboard.d.ts +0 -1
- package/dist/cjs-types/cli/dashboard.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploy.d.ts.map +1 -1
- package/dist/cjs-types/cli/dev.d.ts +1 -0
- package/dist/cjs-types/cli/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/integration.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/api.d.ts +2 -2
- package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/command.d.ts +2 -0
- package/dist/cjs-types/cli/lib/command.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/components.d.ts +8 -0
- package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/components.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/components.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/config.d.ts +1 -1
- package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dashboard.d.ts +1 -1
- package/dist/cjs-types/cli/lib/dashboard.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploy2.d.ts +1 -0
- package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +16 -15
- package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts +26 -3
- package/dist/cjs-types/cli/lib/deployApi/definitionConfig.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +14 -0
- package/dist/cjs-types/cli/lib/deployApi/modules.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +38 -5
- package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dev.d.ts +1 -0
- package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/env.d.ts +4 -0
- package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/envvars.d.ts +32 -5
- package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/init.d.ts +1 -0
- package/dist/cjs-types/cli/lib/init.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/typecheck.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/watch.d.ts +2 -1
- package/dist/cjs-types/cli/lib/watch.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/index.d.ts.map +1 -1
- package/dist/cjs-types/server/pagination.d.ts +34 -0
- package/dist/cjs-types/server/pagination.d.ts.map +1 -1
- package/dist/cjs-types/values/index.d.ts +1 -0
- package/dist/cjs-types/values/index.d.ts.map +1 -1
- package/dist/cjs-types/values/size.d.ts +53 -0
- package/dist/cjs-types/values/size.d.ts.map +1 -0
- package/dist/cjs-types/values/size.test.d.ts +2 -0
- package/dist/cjs-types/values/size.test.d.ts.map +1 -0
- package/dist/cli.bundle.cjs +655 -4297
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/cli/configure.js +24 -17
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/convexImport.js +2 -2
- package/dist/esm/cli/convexImport.js.map +2 -2
- package/dist/esm/cli/dashboard.js +5 -3
- package/dist/esm/cli/dashboard.js.map +2 -2
- package/dist/esm/cli/deploy.js +5 -3
- package/dist/esm/cli/deploy.js.map +2 -2
- package/dist/esm/cli/dev.js +5 -0
- package/dist/esm/cli/dev.js.map +2 -2
- package/dist/esm/cli/integration.js +8 -1
- package/dist/esm/cli/integration.js.map +2 -2
- package/dist/esm/cli/lib/api.js +1 -3
- package/dist/esm/cli/lib/api.js.map +2 -2
- package/dist/esm/cli/lib/command.js +8 -2
- package/dist/esm/cli/lib/command.js.map +2 -2
- package/dist/esm/cli/lib/components.js +51 -1
- package/dist/esm/cli/lib/components.js.map +2 -2
- package/dist/esm/cli/lib/config.js.map +2 -2
- package/dist/esm/cli/lib/dashboard.js +8 -2
- package/dist/esm/cli/lib/dashboard.js.map +2 -2
- package/dist/esm/cli/lib/deploy2.js +22 -7
- package/dist/esm/cli/lib/deploy2.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/componentDefinition.js +3 -2
- package/dist/esm/cli/lib/deployApi/componentDefinition.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/definitionConfig.js +3 -2
- package/dist/esm/cli/lib/deployApi/definitionConfig.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/modules.js +5 -0
- package/dist/esm/cli/lib/deployApi/modules.js.map +2 -2
- package/dist/esm/cli/lib/deployment.js.map +2 -2
- package/dist/esm/cli/lib/dev.js +3 -1
- package/dist/esm/cli/lib/dev.js.map +2 -2
- package/dist/esm/cli/lib/env.js +11 -0
- package/dist/esm/cli/lib/env.js.map +2 -2
- package/dist/esm/cli/lib/envvars.js +98 -37
- package/dist/esm/cli/lib/envvars.js.map +2 -2
- package/dist/esm/cli/lib/init.js +13 -7
- package/dist/esm/cli/lib/init.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/anonymous.js +2 -2
- package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/esm/cli/lib/run.js +1 -0
- package/dist/esm/cli/lib/run.js.map +2 -2
- package/dist/esm/cli/lib/typecheck.js +37 -2
- package/dist/esm/cli/lib/typecheck.js.map +2 -2
- package/dist/esm/cli/lib/watch.js +3 -1
- package/dist/esm/cli/lib/watch.js.map +2 -2
- package/dist/esm/cli/lib/workos/workos.js +2 -2
- package/dist/esm/cli/lib/workos/workos.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/server/pagination.js.map +2 -2
- package/dist/esm/values/index.js +1 -0
- package/dist/esm/values/index.js.map +2 -2
- package/dist/esm/values/size.js +83 -0
- package/dist/esm/values/size.js.map +7 -0
- package/dist/esm-types/cli/configure.d.ts +2 -7
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/dashboard.d.ts +0 -1
- package/dist/esm-types/cli/dashboard.d.ts.map +1 -1
- package/dist/esm-types/cli/deploy.d.ts.map +1 -1
- package/dist/esm-types/cli/dev.d.ts +1 -0
- package/dist/esm-types/cli/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/integration.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/api.d.ts +2 -2
- package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/command.d.ts +2 -0
- package/dist/esm-types/cli/lib/command.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/components.d.ts +8 -0
- package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/components.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/components.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/config.d.ts +1 -1
- package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dashboard.d.ts +1 -1
- package/dist/esm-types/cli/lib/dashboard.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploy2.d.ts +1 -0
- package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +16 -15
- package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts +26 -3
- package/dist/esm-types/cli/lib/deployApi/definitionConfig.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/modules.d.ts +14 -0
- package/dist/esm-types/cli/lib/deployApi/modules.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +38 -5
- package/dist/esm-types/cli/lib/deployApi/startPush.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployment.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dev.d.ts +1 -0
- package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/env.d.ts +4 -0
- package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/envvars.d.ts +32 -5
- package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/init.d.ts +1 -0
- package/dist/esm-types/cli/lib/init.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/typecheck.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/watch.d.ts +2 -1
- package/dist/esm-types/cli/lib/watch.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/index.d.ts.map +1 -1
- package/dist/esm-types/server/pagination.d.ts +34 -0
- package/dist/esm-types/server/pagination.d.ts.map +1 -1
- package/dist/esm-types/values/index.d.ts +1 -0
- package/dist/esm-types/values/index.d.ts.map +1 -1
- package/dist/esm-types/values/size.d.ts +53 -0
- package/dist/esm-types/values/size.d.ts.map +1 -0
- package/dist/esm-types/values/size.test.d.ts +2 -0
- package/dist/esm-types/values/size.test.d.ts.map +1 -0
- package/dist/react.bundle.js +1 -1
- package/dist/react.bundle.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/configure.ts +44 -25
- package/src/cli/convexImport.ts +2 -2
- package/src/cli/dashboard.ts +5 -6
- package/src/cli/deploy.ts +8 -4
- package/src/cli/dev.ts +8 -0
- package/src/cli/integration.ts +11 -3
- package/src/cli/lib/api.ts +3 -14
- package/src/cli/lib/command.ts +12 -1
- package/src/cli/lib/components.test.ts +227 -0
- package/src/cli/lib/components.ts +83 -1
- package/src/cli/lib/config.ts +4 -1
- package/src/cli/lib/dashboard.ts +9 -3
- package/src/cli/lib/deploy2.ts +24 -8
- package/src/cli/lib/deployApi/componentDefinition.ts +4 -2
- package/src/cli/lib/deployApi/definitionConfig.ts +3 -2
- package/src/cli/lib/deployApi/modules.ts +7 -0
- package/src/cli/lib/deployment.ts +1 -0
- package/src/cli/lib/dev.ts +3 -0
- package/src/cli/lib/env.ts +15 -0
- package/src/cli/lib/envvars.ts +164 -51
- package/src/cli/lib/init.ts +16 -7
- package/src/cli/lib/localDeployment/anonymous.ts +7 -6
- package/src/cli/lib/run.ts +1 -0
- package/src/cli/lib/typecheck.ts +44 -2
- package/src/cli/lib/watch.ts +7 -1
- package/src/cli/lib/workos/workos.ts +2 -2
- package/src/index.ts +1 -1
- package/src/server/pagination.ts +16 -17
- package/src/values/index.ts +1 -0
- package/src/values/size.test.ts +86 -0
- package/src/values/size.ts +191 -0
package/dist/cjs/cli/lib/init.js
CHANGED
|
@@ -26,12 +26,17 @@ var import_log = require("../../bundler/log.js");
|
|
|
26
26
|
var import_envvars = require("./envvars.js");
|
|
27
27
|
var import_dashboard = require("./dashboard.js");
|
|
28
28
|
async function finalizeConfiguration(ctx, options) {
|
|
29
|
-
const
|
|
30
|
-
|
|
29
|
+
const envFileConfig = await (0, import_envvars.writeUrlsToEnvFile)(ctx, {
|
|
30
|
+
convexUrl: options.url,
|
|
31
|
+
siteUrl: options.siteUrl
|
|
32
|
+
});
|
|
33
|
+
if (envFileConfig !== null) {
|
|
31
34
|
(0, import_log.logFinishedStep)(
|
|
32
35
|
`${messageForDeploymentType(options.deploymentType, options.url)} and saved its:
|
|
33
|
-
name as CONVEX_DEPLOYMENT
|
|
34
|
-
URL as ${
|
|
36
|
+
name as CONVEX_DEPLOYMENT
|
|
37
|
+
Client URL as ${envFileConfig.convexUrlEnvVar}
|
|
38
|
+
` + (envFileConfig.siteUrlEnvVar ? ` HTTP Actions URL as ${envFileConfig.siteUrlEnvVar}
|
|
39
|
+
` : "") + ` to ${envFileConfig.envFile}`
|
|
35
40
|
);
|
|
36
41
|
} else if (options.changedDeploymentEnvVar) {
|
|
37
42
|
(0, import_log.logFinishedStep)(
|
|
@@ -46,9 +51,9 @@ async function finalizeConfiguration(ctx, options) {
|
|
|
46
51
|
`Run \`npx convex login\` at any time to create an account and link this deployment.`
|
|
47
52
|
);
|
|
48
53
|
}
|
|
49
|
-
const anyChanges = options.wroteToGitIgnore || options.changedDeploymentEnvVar ||
|
|
54
|
+
const anyChanges = options.wroteToGitIgnore || options.changedDeploymentEnvVar || envFileConfig !== null;
|
|
50
55
|
if (anyChanges) {
|
|
51
|
-
const dashboardUrl = (0, import_dashboard.getDashboardUrl)(ctx, {
|
|
56
|
+
const dashboardUrl = await (0, import_dashboard.getDashboardUrl)(ctx, {
|
|
52
57
|
deploymentName: options.deploymentName,
|
|
53
58
|
deploymentType: options.deploymentType
|
|
54
59
|
});
|
|
@@ -70,6 +75,7 @@ function messageForDeploymentType(deploymentType, url) {
|
|
|
70
75
|
case "dev":
|
|
71
76
|
case "prod":
|
|
72
77
|
case "preview":
|
|
78
|
+
case "custom":
|
|
73
79
|
return `Provisioned a ${deploymentType} deployment`;
|
|
74
80
|
default: {
|
|
75
81
|
deploymentType;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/init.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage } from \"../../bundler/log.js\";\nimport { DeploymentType } from \"./api.js\";\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAA4C;AAE5C,
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport { Context } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage } from \"../../bundler/log.js\";\nimport { DeploymentType } from \"./api.js\";\nimport { writeUrlsToEnvFile } from \"./envvars.js\";\nimport { getDashboardUrl } from \"./dashboard.js\";\n\nexport async function finalizeConfiguration(\n ctx: Context,\n options: {\n functionsPath: string;\n deploymentType: DeploymentType;\n deploymentName: string;\n url: string;\n siteUrl: string | null | undefined;\n wroteToGitIgnore: boolean;\n changedDeploymentEnvVar: boolean;\n },\n) {\n const envFileConfig = await writeUrlsToEnvFile(ctx, {\n convexUrl: options.url,\n siteUrl: options.siteUrl,\n });\n if (envFileConfig !== null) {\n logFinishedStep(\n `${messageForDeploymentType(options.deploymentType, options.url)} and saved its:\\n` +\n ` name as CONVEX_DEPLOYMENT\\n` +\n ` Client URL as ${envFileConfig.convexUrlEnvVar}\\n` +\n (envFileConfig.siteUrlEnvVar\n ? ` HTTP Actions URL as ${envFileConfig.siteUrlEnvVar}\\n`\n : \"\") +\n ` to ${envFileConfig.envFile}`,\n );\n } else if (options.changedDeploymentEnvVar) {\n logFinishedStep(\n `${messageForDeploymentType(options.deploymentType, options.url)} and saved its name as CONVEX_DEPLOYMENT to .env.local`,\n );\n }\n if (options.wroteToGitIgnore) {\n logMessage(chalkStderr.gray(` Added \".env.local\" to .gitignore`));\n }\n if (options.deploymentType === \"anonymous\") {\n logMessage(\n `Run \\`npx convex login\\` at any time to create an account and link this deployment.`,\n );\n }\n\n const anyChanges =\n options.wroteToGitIgnore ||\n options.changedDeploymentEnvVar ||\n envFileConfig !== null;\n if (anyChanges) {\n const dashboardUrl = await getDashboardUrl(ctx, {\n deploymentName: options.deploymentName,\n deploymentType: options.deploymentType,\n });\n logMessage(\n `\\nWrite your Convex functions in ${chalkStderr.bold(options.functionsPath)}\\n` +\n \"Give us feedback at https://convex.dev/community or support@convex.dev\\n\" +\n `View the Convex dashboard at ${dashboardUrl}\\n`,\n );\n }\n}\n\nfunction messageForDeploymentType(deploymentType: DeploymentType, url: string) {\n switch (deploymentType) {\n case \"anonymous\":\n return `Started running a deployment locally at ${url}`;\n case \"local\":\n return `Started running a deployment locally at ${url}`;\n case \"dev\":\n case \"prod\":\n case \"preview\":\n case \"custom\":\n return `Provisioned a ${deploymentType} deployment`;\n default: {\n deploymentType satisfies never;\n return `Provisioned a ${deploymentType as any} deployment`;\n }\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAE5B,iBAA4C;AAE5C,qBAAmC;AACnC,uBAAgC;AAEhC,eAAsB,sBACpB,KACA,SASA;AACA,QAAM,gBAAgB,UAAM,mCAAmB,KAAK;AAAA,IAClD,WAAW,QAAQ;AAAA,IACnB,SAAS,QAAQ;AAAA,EACnB,CAAC;AACD,MAAI,kBAAkB,MAAM;AAC1B;AAAA,MACE,GAAG,yBAAyB,QAAQ,gBAAgB,QAAQ,GAAG,CAAC;AAAA;AAAA,oBAEzC,cAAc,eAAe;AAAA,KACjD,cAAc,gBACX,2BAA2B,cAAc,aAAa;AAAA,IACtD,MACJ,OAAO,cAAc,OAAO;AAAA,IAChC;AAAA,EACF,WAAW,QAAQ,yBAAyB;AAC1C;AAAA,MACE,GAAG,yBAAyB,QAAQ,gBAAgB,QAAQ,GAAG,CAAC;AAAA,IAClE;AAAA,EACF;AACA,MAAI,QAAQ,kBAAkB;AAC5B,+BAAW,yBAAY,KAAK,oCAAoC,CAAC;AAAA,EACnE;AACA,MAAI,QAAQ,mBAAmB,aAAa;AAC1C;AAAA,MACE;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aACJ,QAAQ,oBACR,QAAQ,2BACR,kBAAkB;AACpB,MAAI,YAAY;AACd,UAAM,eAAe,UAAM,kCAAgB,KAAK;AAAA,MAC9C,gBAAgB,QAAQ;AAAA,MACxB,gBAAgB,QAAQ;AAAA,IAC1B,CAAC;AACD;AAAA,MACE;AAAA,iCAAoC,yBAAY,KAAK,QAAQ,aAAa,CAAC;AAAA;AAAA,+BAEzC,YAAY;AAAA;AAAA,IAChD;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,gBAAgC,KAAa;AAC7E,UAAQ,gBAAgB;AAAA,IACtB,KAAK;AACH,aAAO,2CAA2C,GAAG;AAAA,IACvD,KAAK;AACH,aAAO,2CAA2C,GAAG;AAAA,IACvD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,aAAO,iBAAiB,cAAc;AAAA,IACxC,SAAS;AACP;AACA,aAAO,iBAAiB,cAAqB;AAAA,IAC/C;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -344,7 +344,7 @@ async function handleLinkToProject(ctx, args) {
|
|
|
344
344
|
if (args.projectSlug !== null) {
|
|
345
345
|
projectSlug = args.projectSlug;
|
|
346
346
|
} else {
|
|
347
|
-
const { projectSlug: newProjectSlug } = await (0, import_api.
|
|
347
|
+
const { projectSlug: newProjectSlug } = await (0, import_api.createProjectAndCreateDeployment)(ctx, {
|
|
348
348
|
teamSlug: args.teamSlug,
|
|
349
349
|
projectName,
|
|
350
350
|
deploymentTypeToProvision: "prod"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/anonymous.ts"],
|
|
4
|
-
"sourcesContent": ["// ----------------------------------------------------------------------------\n// Anonymous (No account)\n\nimport path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logMessage,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { promptSearch, promptString, promptYesNo } from \"../utils/prompts.js\";\nimport {\n bigBrainGenerateAdminKeyForAnonymousDeployment,\n bigBrainPause,\n bigBrainStart,\n} from \"./bigBrain.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n ensureUuidForAnonymousUser,\n loadDeploymentConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { rootDeploymentStateDir } from \"./filePaths.js\";\nimport { LocalDeploymentConfig } from \"./filePaths.js\";\nimport { DeploymentDetails } from \"./localDeployment.js\";\nimport { ensureBackendStopped, localDeploymentUrl } from \"./run.js\";\nimport { ensureBackendRunning } from \"./run.js\";\nimport { handlePotentialUpgrade } from \"./upgrade.js\";\nimport {\n isOffline,\n generateInstanceSecret,\n choosePorts,\n LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./utils.js\";\nimport { handleDashboard } from \"./dashboard.js\";\nimport crypto from \"crypto\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { isAnonymousDeployment } from \"../deployment.js\";\nimport { createProject } from \"../api.js\";\nimport { removeAnonymousPrefix } from \"../deployment.js\";\nimport { nodeFs } from \"../../../bundler/fs.js\";\nimport { doInitConvexFolder } from \"../codegen.js\";\n\nexport async function handleAnonymousDeployment(\n ctx: Context,\n options: {\n ports?:\n | {\n cloud: number;\n site: number;\n }\n | undefined;\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<DeploymentDetails> {\n if (await isOffline()) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Cannot run a local deployment while offline\",\n });\n }\n\n const deployment = await chooseDeployment(ctx, {\n deploymentName: options.deploymentName,\n chosenConfiguration: options.chosenConfiguration,\n });\n if (\n deployment.kind === \"first\" &&\n process.env.CONVEX_AGENT_MODE !== \"anonymous\"\n ) {\n logMessage(\n \"This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.\",\n );\n logMessage(\n \"Use `npx convex dashboard` to view and interact with your project from a web UI.\",\n );\n logMessage(\n \"Use `npx convex docs` to read the docs and `npx convex help` to see other commands.\",\n );\n ensureUuidForAnonymousUser(ctx);\n if (process.stdin.isTTY) {\n const result = await promptYesNo(ctx, {\n message: \"Continue?\",\n default: true,\n });\n if (!result) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Exiting\",\n });\n }\n }\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError();\n }\n });\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n await handleDashboard(ctx, version);\n let adminKey: string;\n let instanceSecret: string;\n if (deployment.kind === \"existing\") {\n adminKey = deployment.config.adminKey;\n instanceSecret =\n deployment.config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: deployment.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: deployment.deploymentName,\n allowOtherDeployments: true,\n });\n } else {\n instanceSecret = generateInstanceSecret();\n const data = await bigBrainGenerateAdminKeyForAnonymousDeployment(ctx, {\n instanceName: deployment.deploymentName,\n instanceSecret,\n });\n adminKey = data.adminKey;\n }\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [options.ports?.cloud ?? null, options.ports?.site ?? null],\n });\n const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {\n await ensureBackendRunning(ctx, {\n cloudPort,\n deploymentName: deployment.deploymentName,\n maxTimeSecs: 5,\n });\n if (isOffline) {\n return;\n }\n };\n\n const { cleanupHandle } = await handlePotentialUpgrade(ctx, {\n deploymentName: deployment.deploymentName,\n deploymentKind: \"anonymous\",\n oldVersion:\n deployment.kind === \"existing\" ? deployment.config.backendVersion : null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n forceUpgrade: options.forceUpgrade,\n });\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n });\n\n if (deployment.kind === \"new\") {\n await doInitConvexFolder(ctx);\n }\n return {\n adminKey,\n deploymentName: deployment.deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n onActivity,\n };\n}\n\nexport async function loadAnonymousDeployment(\n ctx: Context,\n deploymentName: string,\n): Promise<LocalDeploymentConfig> {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find deployment with name ${deploymentName}!`,\n });\n }\n return config;\n}\n\nexport async function listExistingAnonymousDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const dir = rootDeploymentStateDir(\"anonymous\");\n if (!ctx.fs.exists(dir)) {\n return [];\n }\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => isAnonymousDeployment(d));\n return deploymentNames.flatMap((deploymentName) => {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config !== null) {\n return [{ deploymentName, config }];\n }\n return [];\n });\n}\n\nasync function chooseDeployment(\n ctx: Context,\n options: {\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<\n | {\n kind: \"existing\";\n deploymentName: string;\n config: LocalDeploymentConfig;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n | {\n kind: \"first\";\n deploymentName: string;\n }\n> {\n const deployments = await listExistingAnonymousDeployments(ctx);\n if (options.deploymentName !== null && options.chosenConfiguration === null) {\n const existing = deployments.find(\n (d) => d.deploymentName === options.deploymentName,\n );\n if (existing === undefined) {\n logWarning(`Could not find project with name ${options.deploymentName}!`);\n } else {\n return {\n kind: \"existing\",\n deploymentName: existing.deploymentName,\n config: existing.config,\n };\n }\n }\n if (process.env.CONVEX_AGENT_MODE === \"anonymous\") {\n const deploymentName = \"anonymous-agent\";\n const uniqueName = await getUniqueName(\n ctx,\n deploymentName,\n deployments.map((d) => d.deploymentName),\n );\n logVerbose(`Deployment name: ${uniqueName}`);\n return {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n }\n\n if (deployments.length === 0) {\n logMessage(\"Let's set up your first project.\");\n return await promptForNewDeployment(ctx, []);\n }\n\n if (options.chosenConfiguration === \"new\") {\n const deploymentName = await promptString(ctx, {\n message: \"Choose a name for your new project:\",\n default: path.basename(process.cwd()),\n });\n const uniqueName = await getUniqueName(\n ctx,\n deploymentName,\n deployments.map((d) => d.deploymentName),\n );\n logVerbose(`Deployment name: ${uniqueName}`);\n return {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n }\n\n const newOrExisting = await promptSearch(ctx, {\n message: \"Which project would you like to use?\",\n choices: [\n ...(options.chosenConfiguration === \"existing\"\n ? []\n : [\n {\n name: \"Create a new one\",\n value: \"new\",\n },\n ]),\n ...deployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n ],\n });\n\n if (newOrExisting !== \"new\") {\n const existingDeployment = deployments.find(\n (d) => d.deploymentName === newOrExisting,\n );\n if (existingDeployment === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find project with name ${newOrExisting}!`,\n });\n }\n return {\n kind: \"existing\",\n deploymentName: existingDeployment.deploymentName,\n config: existingDeployment.config,\n };\n }\n return await promptForNewDeployment(\n ctx,\n deployments.map((d) => d.deploymentName),\n );\n}\n\nasync function promptForNewDeployment(\n ctx: Context,\n existingNames: string[],\n): Promise<\n | {\n kind: \"first\";\n deploymentName: string;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n> {\n const isFirstDeployment = existingNames.length === 0;\n const deploymentName = await promptString(ctx, {\n message: \"Choose a name:\",\n default: path.basename(process.cwd()),\n });\n\n const uniqueName = await getUniqueName(\n ctx,\n `anonymous-${deploymentName}`,\n existingNames,\n );\n logVerbose(`Deployment name: ${uniqueName}`);\n return isFirstDeployment\n ? {\n kind: \"first\",\n deploymentName: uniqueName,\n }\n : {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n}\n\nasync function getUniqueName(\n ctx: Context,\n name: string,\n existingNames: string[],\n) {\n if (!existingNames.includes(name)) {\n return name;\n }\n for (let i = 1; i <= 5; i++) {\n const uniqueName = `${name}-${i}`;\n if (!existingNames.includes(uniqueName)) {\n return uniqueName;\n }\n }\n const randomSuffix = crypto.randomBytes(4).toString(\"hex\");\n\n const uniqueName = `${name}-${randomSuffix}`;\n if (!existingNames.includes(uniqueName)) {\n return uniqueName;\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not generate a unique name for your project, please choose a different name`,\n });\n}\n/**\n * This takes an \"anonymous\" deployment and makes it a \"local\" deployment\n * that is associated with a project in the given team.\n */\nexport async function handleLinkToProject(\n ctx: Context,\n args: {\n deploymentName: string;\n teamSlug: string;\n projectSlug: string | null;\n },\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n projectSlug: string;\n}> {\n logVerbose(\n `Linking ${args.deploymentName} to a project in team ${args.teamSlug}`,\n );\n const config = loadDeploymentConfig(ctx, \"anonymous\", args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to load deployment config\",\n });\n }\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: config.ports.cloud,\n },\n deploymentName: args.deploymentName,\n allowOtherDeployments: true,\n maxTimeSecs: 5,\n });\n const projectName = removeAnonymousPrefix(args.deploymentName);\n let projectSlug: string;\n if (args.projectSlug !== null) {\n projectSlug = args.projectSlug;\n } else {\n const { projectSlug: newProjectSlug } = await createProject(ctx, {\n teamSlug: args.teamSlug,\n projectName,\n deploymentTypeToProvision: \"prod\",\n });\n projectSlug = newProjectSlug;\n }\n logVerbose(`Creating local deployment in project ${projectSlug}`);\n // Register it in big brain\n const { deploymentName: localDeploymentName, adminKey } = await bigBrainStart(\n ctx,\n {\n port: config.ports.cloud,\n projectSlug,\n teamSlug: args.teamSlug,\n instanceName: null,\n },\n );\n const localConfig = loadDeploymentConfig(ctx, \"local\", localDeploymentName);\n if (localConfig !== null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Project ${projectSlug} already has a local deployment, so we cannot link this anonymous local deployment to it.`,\n });\n }\n logVerbose(`Moving ${args.deploymentName} to ${localDeploymentName}`);\n await moveDeployment(\n ctx,\n {\n deploymentKind: \"anonymous\",\n deploymentName: args.deploymentName,\n },\n {\n deploymentKind: \"local\",\n deploymentName: localDeploymentName,\n },\n );\n logVerbose(`Saving deployment config for ${localDeploymentName}`);\n saveDeploymentConfig(ctx, \"local\", localDeploymentName, {\n adminKey,\n backendVersion: config.backendVersion,\n ports: config.ports,\n });\n await bigBrainPause(ctx, {\n projectSlug,\n teamSlug: args.teamSlug,\n });\n logFinishedStep(`Linked ${args.deploymentName} to project ${projectSlug}`);\n return {\n projectSlug,\n deploymentName: localDeploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n };\n}\n\nexport async function moveDeployment(\n ctx: Context,\n oldDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n newDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n) {\n const oldPath = deploymentStateDir(\n oldDeployment.deploymentKind,\n oldDeployment.deploymentName,\n );\n const newPath = deploymentStateDir(\n newDeployment.deploymentKind,\n newDeployment.deploymentName,\n );\n await recursivelyCopy(ctx, nodeFs, oldPath, newPath);\n recursivelyDelete(ctx, oldPath);\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAEjB,iBAKO;AACP,qBAAwD;AACxD,sBAIO;AACP,oBAAkE;AAClE,uBAMO;AACP,IAAAA,oBAAuC;AAGvC,iBAAyD;AACzD,IAAAC,cAAqC;AACrC,qBAAuC;AACvC,mBAKO;AACP,uBAAgC;AAChC,oBAAmB;AACnB,qBAAmD;AACnD,sBAA8C;AAC9C,wBAAsC;AACtC,
|
|
4
|
+
"sourcesContent": ["// ----------------------------------------------------------------------------\n// Anonymous (No account)\n\nimport path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logMessage,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { promptSearch, promptString, promptYesNo } from \"../utils/prompts.js\";\nimport {\n bigBrainGenerateAdminKeyForAnonymousDeployment,\n bigBrainPause,\n bigBrainStart,\n} from \"./bigBrain.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n ensureUuidForAnonymousUser,\n loadDeploymentConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { rootDeploymentStateDir } from \"./filePaths.js\";\nimport { LocalDeploymentConfig } from \"./filePaths.js\";\nimport { DeploymentDetails } from \"./localDeployment.js\";\nimport { ensureBackendStopped, localDeploymentUrl } from \"./run.js\";\nimport { ensureBackendRunning } from \"./run.js\";\nimport { handlePotentialUpgrade } from \"./upgrade.js\";\nimport {\n isOffline,\n generateInstanceSecret,\n choosePorts,\n LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./utils.js\";\nimport { handleDashboard } from \"./dashboard.js\";\nimport crypto from \"crypto\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { isAnonymousDeployment } from \"../deployment.js\";\nimport { createProjectAndCreateDeployment } from \"../api.js\";\nimport { removeAnonymousPrefix } from \"../deployment.js\";\nimport { nodeFs } from \"../../../bundler/fs.js\";\nimport { doInitConvexFolder } from \"../codegen.js\";\n\nexport async function handleAnonymousDeployment(\n ctx: Context,\n options: {\n ports?:\n | {\n cloud: number;\n site: number;\n }\n | undefined;\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<DeploymentDetails> {\n if (await isOffline()) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Cannot run a local deployment while offline\",\n });\n }\n\n const deployment = await chooseDeployment(ctx, {\n deploymentName: options.deploymentName,\n chosenConfiguration: options.chosenConfiguration,\n });\n if (\n deployment.kind === \"first\" &&\n process.env.CONVEX_AGENT_MODE !== \"anonymous\"\n ) {\n logMessage(\n \"This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.\",\n );\n logMessage(\n \"Use `npx convex dashboard` to view and interact with your project from a web UI.\",\n );\n logMessage(\n \"Use `npx convex docs` to read the docs and `npx convex help` to see other commands.\",\n );\n ensureUuidForAnonymousUser(ctx);\n if (process.stdin.isTTY) {\n const result = await promptYesNo(ctx, {\n message: \"Continue?\",\n default: true,\n });\n if (!result) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Exiting\",\n });\n }\n }\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError();\n }\n });\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n await handleDashboard(ctx, version);\n let adminKey: string;\n let instanceSecret: string;\n if (deployment.kind === \"existing\") {\n adminKey = deployment.config.adminKey;\n instanceSecret =\n deployment.config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: deployment.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: deployment.deploymentName,\n allowOtherDeployments: true,\n });\n } else {\n instanceSecret = generateInstanceSecret();\n const data = await bigBrainGenerateAdminKeyForAnonymousDeployment(ctx, {\n instanceName: deployment.deploymentName,\n instanceSecret,\n });\n adminKey = data.adminKey;\n }\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [options.ports?.cloud ?? null, options.ports?.site ?? null],\n });\n const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {\n await ensureBackendRunning(ctx, {\n cloudPort,\n deploymentName: deployment.deploymentName,\n maxTimeSecs: 5,\n });\n if (isOffline) {\n return;\n }\n };\n\n const { cleanupHandle } = await handlePotentialUpgrade(ctx, {\n deploymentName: deployment.deploymentName,\n deploymentKind: \"anonymous\",\n oldVersion:\n deployment.kind === \"existing\" ? deployment.config.backendVersion : null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n forceUpgrade: options.forceUpgrade,\n });\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n });\n\n if (deployment.kind === \"new\") {\n await doInitConvexFolder(ctx);\n }\n return {\n adminKey,\n deploymentName: deployment.deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n onActivity,\n };\n}\n\nexport async function loadAnonymousDeployment(\n ctx: Context,\n deploymentName: string,\n): Promise<LocalDeploymentConfig> {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find deployment with name ${deploymentName}!`,\n });\n }\n return config;\n}\n\nexport async function listExistingAnonymousDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const dir = rootDeploymentStateDir(\"anonymous\");\n if (!ctx.fs.exists(dir)) {\n return [];\n }\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => isAnonymousDeployment(d));\n return deploymentNames.flatMap((deploymentName) => {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config !== null) {\n return [{ deploymentName, config }];\n }\n return [];\n });\n}\n\nasync function chooseDeployment(\n ctx: Context,\n options: {\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<\n | {\n kind: \"existing\";\n deploymentName: string;\n config: LocalDeploymentConfig;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n | {\n kind: \"first\";\n deploymentName: string;\n }\n> {\n const deployments = await listExistingAnonymousDeployments(ctx);\n if (options.deploymentName !== null && options.chosenConfiguration === null) {\n const existing = deployments.find(\n (d) => d.deploymentName === options.deploymentName,\n );\n if (existing === undefined) {\n logWarning(`Could not find project with name ${options.deploymentName}!`);\n } else {\n return {\n kind: \"existing\",\n deploymentName: existing.deploymentName,\n config: existing.config,\n };\n }\n }\n if (process.env.CONVEX_AGENT_MODE === \"anonymous\") {\n const deploymentName = \"anonymous-agent\";\n const uniqueName = await getUniqueName(\n ctx,\n deploymentName,\n deployments.map((d) => d.deploymentName),\n );\n logVerbose(`Deployment name: ${uniqueName}`);\n return {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n }\n\n if (deployments.length === 0) {\n logMessage(\"Let's set up your first project.\");\n return await promptForNewDeployment(ctx, []);\n }\n\n if (options.chosenConfiguration === \"new\") {\n const deploymentName = await promptString(ctx, {\n message: \"Choose a name for your new project:\",\n default: path.basename(process.cwd()),\n });\n const uniqueName = await getUniqueName(\n ctx,\n deploymentName,\n deployments.map((d) => d.deploymentName),\n );\n logVerbose(`Deployment name: ${uniqueName}`);\n return {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n }\n\n const newOrExisting = await promptSearch(ctx, {\n message: \"Which project would you like to use?\",\n choices: [\n ...(options.chosenConfiguration === \"existing\"\n ? []\n : [\n {\n name: \"Create a new one\",\n value: \"new\",\n },\n ]),\n ...deployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n ],\n });\n\n if (newOrExisting !== \"new\") {\n const existingDeployment = deployments.find(\n (d) => d.deploymentName === newOrExisting,\n );\n if (existingDeployment === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find project with name ${newOrExisting}!`,\n });\n }\n return {\n kind: \"existing\",\n deploymentName: existingDeployment.deploymentName,\n config: existingDeployment.config,\n };\n }\n return await promptForNewDeployment(\n ctx,\n deployments.map((d) => d.deploymentName),\n );\n}\n\nasync function promptForNewDeployment(\n ctx: Context,\n existingNames: string[],\n): Promise<\n | {\n kind: \"first\";\n deploymentName: string;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n> {\n const isFirstDeployment = existingNames.length === 0;\n const deploymentName = await promptString(ctx, {\n message: \"Choose a name:\",\n default: path.basename(process.cwd()),\n });\n\n const uniqueName = await getUniqueName(\n ctx,\n `anonymous-${deploymentName}`,\n existingNames,\n );\n logVerbose(`Deployment name: ${uniqueName}`);\n return isFirstDeployment\n ? {\n kind: \"first\",\n deploymentName: uniqueName,\n }\n : {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n}\n\nasync function getUniqueName(\n ctx: Context,\n name: string,\n existingNames: string[],\n) {\n if (!existingNames.includes(name)) {\n return name;\n }\n for (let i = 1; i <= 5; i++) {\n const uniqueName = `${name}-${i}`;\n if (!existingNames.includes(uniqueName)) {\n return uniqueName;\n }\n }\n const randomSuffix = crypto.randomBytes(4).toString(\"hex\");\n\n const uniqueName = `${name}-${randomSuffix}`;\n if (!existingNames.includes(uniqueName)) {\n return uniqueName;\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not generate a unique name for your project, please choose a different name`,\n });\n}\n/**\n * This takes an \"anonymous\" deployment and makes it a \"local\" deployment\n * that is associated with a project in the given team.\n */\nexport async function handleLinkToProject(\n ctx: Context,\n args: {\n deploymentName: string;\n teamSlug: string;\n projectSlug: string | null;\n },\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n projectSlug: string;\n}> {\n logVerbose(\n `Linking ${args.deploymentName} to a project in team ${args.teamSlug}`,\n );\n const config = loadDeploymentConfig(ctx, \"anonymous\", args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to load deployment config\",\n });\n }\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: config.ports.cloud,\n },\n deploymentName: args.deploymentName,\n allowOtherDeployments: true,\n maxTimeSecs: 5,\n });\n const projectName = removeAnonymousPrefix(args.deploymentName);\n let projectSlug: string;\n if (args.projectSlug !== null) {\n projectSlug = args.projectSlug;\n } else {\n const { projectSlug: newProjectSlug } =\n await createProjectAndCreateDeployment(ctx, {\n teamSlug: args.teamSlug,\n projectName,\n deploymentTypeToProvision: \"prod\",\n });\n projectSlug = newProjectSlug;\n }\n logVerbose(`Creating local deployment in project ${projectSlug}`);\n // Register it in big brain\n const { deploymentName: localDeploymentName, adminKey } = await bigBrainStart(\n ctx,\n {\n port: config.ports.cloud,\n projectSlug,\n teamSlug: args.teamSlug,\n instanceName: null,\n },\n );\n const localConfig = loadDeploymentConfig(ctx, \"local\", localDeploymentName);\n if (localConfig !== null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Project ${projectSlug} already has a local deployment, so we cannot link this anonymous local deployment to it.`,\n });\n }\n logVerbose(`Moving ${args.deploymentName} to ${localDeploymentName}`);\n await moveDeployment(\n ctx,\n {\n deploymentKind: \"anonymous\",\n deploymentName: args.deploymentName,\n },\n {\n deploymentKind: \"local\",\n deploymentName: localDeploymentName,\n },\n );\n logVerbose(`Saving deployment config for ${localDeploymentName}`);\n saveDeploymentConfig(ctx, \"local\", localDeploymentName, {\n adminKey,\n backendVersion: config.backendVersion,\n ports: config.ports,\n });\n await bigBrainPause(ctx, {\n projectSlug,\n teamSlug: args.teamSlug,\n });\n logFinishedStep(`Linked ${args.deploymentName} to project ${projectSlug}`);\n return {\n projectSlug,\n deploymentName: localDeploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n };\n}\n\nexport async function moveDeployment(\n ctx: Context,\n oldDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n newDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n) {\n const oldPath = deploymentStateDir(\n oldDeployment.deploymentKind,\n oldDeployment.deploymentName,\n );\n const newPath = deploymentStateDir(\n newDeployment.deploymentKind,\n newDeployment.deploymentName,\n );\n await recursivelyCopy(ctx, nodeFs, oldPath, newPath);\n recursivelyDelete(ctx, oldPath);\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAEjB,iBAKO;AACP,qBAAwD;AACxD,sBAIO;AACP,oBAAkE;AAClE,uBAMO;AACP,IAAAA,oBAAuC;AAGvC,iBAAyD;AACzD,IAAAC,cAAqC;AACrC,qBAAuC;AACvC,mBAKO;AACP,uBAAgC;AAChC,oBAAmB;AACnB,qBAAmD;AACnD,sBAA8C;AAC9C,wBAAsC;AACtC,iBAAiD;AACjD,IAAAC,qBAAsC;AACtC,gBAAuB;AACvB,qBAAmC;AAEnC,eAAsB,0BACpB,KACA,SAa4B;AAC5B,MAAI,UAAM,wBAAU,GAAG;AACrB,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,MAAM,iBAAiB,KAAK;AAAA,IAC7C,gBAAgB,QAAQ;AAAA,IACxB,qBAAqB,QAAQ;AAAA,EAC/B,CAAC;AACD,MACE,WAAW,SAAS,WACpB,QAAQ,IAAI,sBAAsB,aAClC;AACA;AAAA,MACE;AAAA,IACF;AACA;AAAA,MACE;AAAA,IACF;AACA;AAAA,MACE;AAAA,IACF;AACA,qDAA2B,GAAG;AAC9B,QAAI,QAAQ,MAAM,OAAO;AACvB,YAAM,SAAS,UAAM,4BAAY,KAAK;AAAA,QACpC,SAAS;AAAA,QACT,SAAS;AAAA,MACX,CAAC;AACD,UAAI,CAAC,QAAQ;AACX,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACA,MAAI,gBAAgB,OAAO,WAAW,QAAQ;AAC5C,QAAI,eAAe,oCAAsB;AACvC,qDAA4B;AAAA,IAC9B;AAAA,EACF,CAAC;AACD,QAAM,EAAE,YAAY,QAAQ,IAAI,UAAM;AAAA,IACpC;AAAA,IACA,QAAQ,mBAAmB,SACvB;AAAA,MACE,MAAM;AAAA,IACR,IACA,EAAE,MAAM,WAAW,SAAS,QAAQ,eAAe;AAAA,EACzD;AACA,YAAM,kCAAgB,KAAK,OAAO;AAClC,MAAI;AACJ,MAAI;AACJ,MAAI,WAAW,SAAS,YAAY;AAClC,eAAW,WAAW,OAAO;AAC7B,qBACE,WAAW,OAAO,kBAAkB;AAItC,cAAM,iCAAqB,KAAK;AAAA,MAC9B,OAAO;AAAA,QACL,OAAO,WAAW,OAAO,MAAM;AAAA,MACjC;AAAA,MACA,aAAa;AAAA,MACb,gBAAgB,WAAW;AAAA,MAC3B,uBAAuB;AAAA,IACzB,CAAC;AAAA,EACH,OAAO;AACL,yBAAiB,qCAAuB;AACxC,UAAM,OAAO,UAAM,gEAA+C,KAAK;AAAA,MACrE,cAAc,WAAW;AAAA,MACzB;AAAA,IACF,CAAC;AACD,eAAW,KAAK;AAAA,EAClB;AAEA,QAAM,CAAC,WAAW,QAAQ,IAAI,UAAM,0BAAY,KAAK;AAAA,IACnD,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB,CAAC,QAAQ,OAAO,SAAS,MAAM,QAAQ,OAAO,QAAQ,IAAI;AAAA,EAC5E,CAAC;AACD,QAAM,aAAa,OAAOC,YAAoB,gBAAyB;AACrE,cAAM,kCAAqB,KAAK;AAAA,MAC9B;AAAA,MACA,gBAAgB,WAAW;AAAA,MAC3B,aAAa;AAAA,IACf,CAAC;AACD,QAAIA,YAAW;AACb;AAAA,IACF;AAAA,EACF;AAEA,QAAM,EAAE,cAAc,IAAI,UAAM,uCAAuB,KAAK;AAAA,IAC1D,gBAAgB,WAAW;AAAA,IAC3B,gBAAgB;AAAA,IAChB,YACE,WAAW,SAAS,aAAa,WAAW,OAAO,iBAAiB;AAAA,IACtE,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,OAAO,EAAE,OAAO,WAAW,MAAM,SAAS;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,cAAc,QAAQ;AAAA,EACxB,CAAC;AAED,QAAM,cAAc,IAAI,cAAc,aAAa;AACnD,MAAI,gBAAgB,OAAO,UAAU,QAAQ;AAC3C,QAAI,gBAAgB,MAAM;AACxB,YAAM,YAAY,UAAU,GAAG;AAAA,IACjC;AAAA,EACF,CAAC;AAED,MAAI,WAAW,SAAS,OAAO;AAC7B,cAAM,mCAAmB,GAAG;AAAA,EAC9B;AACA,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB,WAAW;AAAA,IAC3B,mBAAe,+BAAmB,SAAS;AAAA,IAC3C;AAAA,EACF;AACF;AAEA,eAAsB,wBACpB,KACA,gBACgC;AAChC,QAAM,aAAS,uCAAqB,KAAK,aAAa,cAAc;AACpE,MAAI,WAAW,MAAM;AACnB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,uCAAuC,cAAc;AAAA,IACvE,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,eAAsB,iCAAiC,KAKrD;AACA,QAAM,UAAM,0CAAuB,WAAW;AAC9C,MAAI,CAAC,IAAI,GAAG,OAAO,GAAG,GAAG;AACvB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,kBAAkB,IAAI,GACzB,QAAQ,GAAG,EACX,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,OAAO,CAAC,UAAM,yCAAsB,CAAC,CAAC;AACzC,SAAO,gBAAgB,QAAQ,CAAC,mBAAmB;AACjD,UAAM,aAAS,uCAAqB,KAAK,aAAa,cAAc;AACpE,QAAI,WAAW,MAAM;AACnB,aAAO,CAAC,EAAE,gBAAgB,OAAO,CAAC;AAAA,IACpC;AACA,WAAO,CAAC;AAAA,EACV,CAAC;AACH;AAEA,eAAe,iBACb,KACA,SAkBA;AACA,QAAM,cAAc,MAAM,iCAAiC,GAAG;AAC9D,MAAI,QAAQ,mBAAmB,QAAQ,QAAQ,wBAAwB,MAAM;AAC3E,UAAM,WAAW,YAAY;AAAA,MAC3B,CAAC,MAAM,EAAE,mBAAmB,QAAQ;AAAA,IACtC;AACA,QAAI,aAAa,QAAW;AAC1B,iCAAW,oCAAoC,QAAQ,cAAc,GAAG;AAAA,IAC1E,OAAO;AACL,aAAO;AAAA,QACL,MAAM;AAAA,QACN,gBAAgB,SAAS;AAAA,QACzB,QAAQ,SAAS;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,IAAI,sBAAsB,aAAa;AACjD,UAAM,iBAAiB;AACvB,UAAM,aAAa,MAAM;AAAA,MACvB;AAAA,MACA;AAAA,MACA,YAAY,IAAI,CAAC,MAAM,EAAE,cAAc;AAAA,IACzC;AACA,+BAAW,oBAAoB,UAAU,EAAE;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,MAAI,YAAY,WAAW,GAAG;AAC5B,+BAAW,kCAAkC;AAC7C,WAAO,MAAM,uBAAuB,KAAK,CAAC,CAAC;AAAA,EAC7C;AAEA,MAAI,QAAQ,wBAAwB,OAAO;AACzC,UAAM,iBAAiB,UAAM,6BAAa,KAAK;AAAA,MAC7C,SAAS;AAAA,MACT,SAAS,YAAAC,QAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,IACtC,CAAC;AACD,UAAM,aAAa,MAAM;AAAA,MACvB;AAAA,MACA;AAAA,MACA,YAAY,IAAI,CAAC,MAAM,EAAE,cAAc;AAAA,IACzC;AACA,+BAAW,oBAAoB,UAAU,EAAE;AAC3C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB;AAAA,EACF;AAEA,QAAM,gBAAgB,UAAM,6BAAa,KAAK;AAAA,IAC5C,SAAS;AAAA,IACT,SAAS;AAAA,MACP,GAAI,QAAQ,wBAAwB,aAChC,CAAC,IACD;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACJ,GAAG,YAAY,IAAI,CAAC,OAAO;AAAA,QACzB,MAAM,EAAE;AAAA,QACR,OAAO,EAAE;AAAA,MACX,EAAE;AAAA,IACJ;AAAA,EACF,CAAC;AAED,MAAI,kBAAkB,OAAO;AAC3B,UAAM,qBAAqB,YAAY;AAAA,MACrC,CAAC,MAAM,EAAE,mBAAmB;AAAA,IAC9B;AACA,QAAI,uBAAuB,QAAW;AACpC,aAAO,IAAI,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,oCAAoC,aAAa;AAAA,MACnE,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB,mBAAmB;AAAA,MACnC,QAAQ,mBAAmB;AAAA,IAC7B;AAAA,EACF;AACA,SAAO,MAAM;AAAA,IACX;AAAA,IACA,YAAY,IAAI,CAAC,MAAM,EAAE,cAAc;AAAA,EACzC;AACF;AAEA,eAAe,uBACb,KACA,eAUA;AACA,QAAM,oBAAoB,cAAc,WAAW;AACnD,QAAM,iBAAiB,UAAM,6BAAa,KAAK;AAAA,IAC7C,SAAS;AAAA,IACT,SAAS,YAAAA,QAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,EACtC,CAAC;AAED,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA,aAAa,cAAc;AAAA,IAC3B;AAAA,EACF;AACA,6BAAW,oBAAoB,UAAU,EAAE;AAC3C,SAAO,oBACH;AAAA,IACE,MAAM;AAAA,IACN,gBAAgB;AAAA,EAClB,IACA;AAAA,IACE,MAAM;AAAA,IACN,gBAAgB;AAAA,EAClB;AACN;AAEA,eAAe,cACb,KACA,MACA,eACA;AACA,MAAI,CAAC,cAAc,SAAS,IAAI,GAAG;AACjC,WAAO;AAAA,EACT;AACA,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,UAAMC,cAAa,GAAG,IAAI,IAAI,CAAC;AAC/B,QAAI,CAAC,cAAc,SAASA,WAAU,GAAG;AACvC,aAAOA;AAAA,IACT;AAAA,EACF;AACA,QAAM,eAAe,cAAAC,QAAO,YAAY,CAAC,EAAE,SAAS,KAAK;AAEzD,QAAM,aAAa,GAAG,IAAI,IAAI,YAAY;AAC1C,MAAI,CAAC,cAAc,SAAS,UAAU,GAAG;AACvC,WAAO;AAAA,EACT;AACA,SAAO,IAAI,MAAM;AAAA,IACf,UAAU;AAAA,IACV,WAAW;AAAA,IACX,gBAAgB;AAAA,EAClB,CAAC;AACH;AAKA,eAAsB,oBACpB,KACA,MASC;AACD;AAAA,IACE,WAAW,KAAK,cAAc,yBAAyB,KAAK,QAAQ;AAAA,EACtE;AACA,QAAM,aAAS,uCAAqB,KAAK,aAAa,KAAK,cAAc;AACzE,MAAI,WAAW,MAAM;AACnB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB;AAAA,IAClB,CAAC;AAAA,EACH;AACA,YAAM,iCAAqB,KAAK;AAAA,IAC9B,OAAO;AAAA,MACL,OAAO,OAAO,MAAM;AAAA,IACtB;AAAA,IACA,gBAAgB,KAAK;AAAA,IACrB,uBAAuB;AAAA,IACvB,aAAa;AAAA,EACf,CAAC;AACD,QAAM,kBAAc,0CAAsB,KAAK,cAAc;AAC7D,MAAI;AACJ,MAAI,KAAK,gBAAgB,MAAM;AAC7B,kBAAc,KAAK;AAAA,EACrB,OAAO;AACL,UAAM,EAAE,aAAa,eAAe,IAClC,UAAM,6CAAiC,KAAK;AAAA,MAC1C,UAAU,KAAK;AAAA,MACf;AAAA,MACA,2BAA2B;AAAA,IAC7B,CAAC;AACH,kBAAc;AAAA,EAChB;AACA,6BAAW,wCAAwC,WAAW,EAAE;AAEhE,QAAM,EAAE,gBAAgB,qBAAqB,SAAS,IAAI,UAAM;AAAA,IAC9D;AAAA,IACA;AAAA,MACE,MAAM,OAAO,MAAM;AAAA,MACnB;AAAA,MACA,UAAU,KAAK;AAAA,MACf,cAAc;AAAA,IAChB;AAAA,EACF;AACA,QAAM,kBAAc,uCAAqB,KAAK,SAAS,mBAAmB;AAC1E,MAAI,gBAAgB,MAAM;AACxB,WAAO,IAAI,MAAM;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBAAgB,WAAW,WAAW;AAAA,IACxC,CAAC;AAAA,EACH;AACA,6BAAW,UAAU,KAAK,cAAc,OAAO,mBAAmB,EAAE;AACpE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,MAChB,gBAAgB,KAAK;AAAA,IACvB;AAAA,IACA;AAAA,MACE,gBAAgB;AAAA,MAChB,gBAAgB;AAAA,IAClB;AAAA,EACF;AACA,6BAAW,gCAAgC,mBAAmB,EAAE;AAChE,6CAAqB,KAAK,SAAS,qBAAqB;AAAA,IACtD;AAAA,IACA,gBAAgB,OAAO;AAAA,IACvB,OAAO,OAAO;AAAA,EAChB,CAAC;AACD,YAAM,+BAAc,KAAK;AAAA,IACvB;AAAA,IACA,UAAU,KAAK;AAAA,EACjB,CAAC;AACD,kCAAgB,UAAU,KAAK,cAAc,eAAe,WAAW,EAAE;AACzE,SAAO;AAAA,IACL;AAAA,IACA,gBAAgB;AAAA,IAChB,mBAAe,+BAAmB,OAAO,MAAM,KAAK;AAAA,EACtD;AACF;AAEA,eAAsB,eACpB,KACA,eAIA,eAIA;AACA,QAAM,cAAU;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACA,QAAM,cAAU;AAAA,IACd,cAAc;AAAA,IACd,cAAc;AAAA,EAChB;AACA,YAAM,gCAAgB,KAAK,kBAAQ,SAAS,OAAO;AACnD,wCAAkB,KAAK,OAAO;AAChC;",
|
|
6
6
|
"names": ["import_filePaths", "import_run", "import_deployment", "isOffline", "path", "uniqueName", "crypto"]
|
|
7
7
|
}
|
package/dist/cjs/cli/lib/run.js
CHANGED
|
@@ -364,6 +364,7 @@ async function runInDeployment(ctx, args) {
|
|
|
364
364
|
debugNodeApis: false,
|
|
365
365
|
codegen: args.codegen,
|
|
366
366
|
liveComponentSources: args.liveComponentSources,
|
|
367
|
+
pushAllModules: false,
|
|
367
368
|
largeIndexDeletionCheck: "no verification"
|
|
368
369
|
// `convex run` can’t push to prod
|
|
369
370
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/run.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport util from \"util\";\nimport ws from \"ws\";\nimport { ConvexHttpClient } from \"../../browser/http_client.js\";\nimport { BaseConvexClient } from \"../../browser/index.js\";\nimport {\n PaginationResult,\n UserIdentityAttributes,\n makeFunctionReference,\n} from \"../../server/index.js\";\nimport { Value, convexToJson, jsonToConvex } from \"../../values/value.js\";\nimport { Context, OneoffCtx } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage, logOutput } from \"../../bundler/log.js\";\nimport { waitForever, waitUntilCalled } from \"./utils/utils.js\";\nimport JSON5 from \"json5\";\nimport path from \"path\";\nimport { readProjectConfig } from \"./config.js\";\nimport { watchAndPush } from \"./dev.js\";\nimport { Logger, DefaultLogger } from \"../../browser/logging.js\";\n\nexport async function runFunctionAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath?: string | undefined;\n callbacks?:\n | {\n onSuccess?: () => void | undefined;\n }\n | undefined;\n },\n) {\n const client = new ConvexHttpClient(args.deploymentUrl, {\n logger: instantiateStderrLogger(),\n });\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n client.setAdminAuth(args.adminKey, identity);\n\n const functionArgs = await parseArgs(ctx, args.argsString);\n const { projectConfig } = await readProjectConfig(ctx);\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n let result: Value;\n try {\n result = await client.function(\n makeFunctionReference(parsedFunctionName),\n args.componentPath,\n functionArgs,\n );\n } catch (err) {\n const errorMessage = (err as Error).toString().trim();\n\n if (errorMessage.includes(\"Could not find function\")) {\n const functions = (await runSystemQuery(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n functionName: \"_system/cli/modules:apiSpec\",\n componentPath: args.componentPath,\n args: {},\n })) as (\n | {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n }\n | {\n functionType: \"HttpAction\";\n }\n )[];\n\n const functionNames = functions\n .filter(\n (\n fn,\n ): fn is {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n } => fn.functionType !== \"HttpAction\",\n )\n .map(({ identifier }) => {\n const separatorPos = identifier.indexOf(\":\");\n\n const path =\n separatorPos === -1\n ? \"\"\n : identifier.substring(0, separatorPos).replace(/\\.js$/, \"\");\n const name =\n separatorPos === -1\n ? identifier\n : identifier.substring(separatorPos + 1);\n\n return `\u2022 ${chalkStderr.gray(`${path}:`)}${name}`;\n });\n\n const availableFunctionsMessage =\n functionNames.length > 0\n ? `Available functions:\\n${functionNames.join(\"\\n\")}`\n : \"No functions found.\";\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}\\n\\n${availableFunctionsMessage}`,\n });\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}`,\n });\n }\n\n args.callbacks?.onSuccess?.();\n\n // `null` is the default return type\n if (result !== null) {\n logOutput(formatValue(result));\n }\n}\n\nasync function getFakeIdentity(ctx: Context, identityString: string) {\n let identity: UserIdentityAttributes;\n try {\n identity = JSON5.parse(identityString);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Failed to parse identity as JSON: \"${identityString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n const subject = identity.subject ?? \"\" + simpleHash(JSON.stringify(identity));\n const issuer = identity.issuer ?? \"https://convex.test\";\n const tokenIdentifier =\n identity.tokenIdentifier ?? `${issuer.toString()}|${subject.toString()}`;\n return {\n ...identity,\n subject,\n issuer,\n tokenIdentifier,\n };\n}\n\nexport async function parseArgs(ctx: Context, argsString: string) {\n try {\n const argsJson = JSON5.parse(argsString);\n return jsonToConvex(argsJson) as Record<string, Value>;\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to parse arguments as JSON: \"${argsString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n}\n\nexport async function parseFunctionName(\n ctx: Context,\n functionName: string,\n // Usually `convex/` -- should contain trailing slash\n functionDirName: string,\n) {\n // api.foo.bar -> foo:bar\n // foo/bar -> foo/bar:default\n // foo/bar:baz -> foo/bar:baz\n // convex/foo/bar -> foo/bar:default\n\n // This is the `api.foo.bar` format\n if (functionName.startsWith(\"api.\") || functionName.startsWith(\"internal.\")) {\n const parts = functionName.split(\".\");\n if (parts.length < 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function name has too few parts: \"${functionName}\"`,\n });\n }\n const exportName = parts.pop();\n const parsedName = `${parts.slice(1).join(\"/\")}:${exportName}`;\n return parsedName;\n }\n\n // This is the `foo/bar:baz` format\n\n // This is something like `convex/foo/bar`, which could either be addressing `foo/bar:default` or `convex/foo/bar:default`\n // if there's a directory with the same name as the functions directory nested directly underneath.\n // We'll prefer the `convex/foo/bar:default` version, and check if the file exists, and otherwise treat this as a relative path from the project root.\n const filePath = functionName.split(\":\")[0];\n const possibleExtensions = [\n \".ts\",\n \".js\",\n \".tsx\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n ];\n let hasExtension = false;\n let normalizedFilePath: string = filePath;\n for (const extension of possibleExtensions) {\n if (filePath.endsWith(extension)) {\n normalizedFilePath = filePath.slice(0, -extension.length);\n hasExtension = true;\n break;\n }\n }\n\n const exportName = functionName.split(\":\")[1] ?? \"default\";\n const normalizedName = `${normalizedFilePath}:${exportName}`;\n\n // This isn't a relative path from the project root\n if (!filePath.startsWith(functionDirName)) {\n return normalizedName;\n }\n\n const filePathWithoutPrefix = normalizedFilePath.slice(\n functionDirName.length,\n );\n const functionNameWithoutPrefix = `${filePathWithoutPrefix}:${exportName}`;\n\n if (hasExtension) {\n if (ctx.fs.exists(path.join(functionDirName, filePath))) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n } else {\n const exists = possibleExtensions.some((extension) =>\n ctx.fs.exists(path.join(functionDirName, filePath + extension)),\n );\n if (exists) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n }\n}\n\nfunction simpleHash(string: string) {\n let hash = 0;\n for (let i = 0; i < string.length; i++) {\n const char = string.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\nexport async function runSystemPaginatedQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n limit?: number;\n },\n) {\n const results = [];\n let cursor = null;\n let isDone = false;\n while (!isDone && (args.limit === undefined || results.length < args.limit)) {\n const paginationResult = (await runSystemQuery(ctx, {\n ...args,\n args: {\n ...args.args,\n paginationOpts: {\n cursor,\n numItems:\n args.limit === undefined ? 10000 : args.limit - results.length,\n },\n },\n })) as unknown as PaginationResult<Record<string, Value>>;\n isDone = paginationResult.isDone;\n cursor = paginationResult.continueCursor;\n results.push(...paginationResult.page);\n }\n return results;\n}\n\nexport async function runSystemQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n },\n): Promise<Value> {\n let onResult: (result: Value) => void;\n const resultPromise = new Promise<Value>((resolve) => {\n onResult = resolve;\n });\n const [donePromise, onDone] = waitUntilCalled();\n await subscribe(ctx, {\n ...args,\n parsedFunctionName: args.functionName,\n parsedFunctionArgs: args.args,\n until: donePromise,\n callbacks: {\n onChange: (result) => {\n onDone();\n onResult(result);\n },\n },\n });\n return resultPromise;\n}\n\nexport function formatValue(value: Value) {\n const json = convexToJson(value);\n if (process.stdout.isTTY) {\n // TODO (Tom) add JSON syntax highlighting like https://stackoverflow.com/a/51319962/398212\n // until then, just spit out something that isn't quite JSON because it's easy\n return util.inspect(value, { colors: true, depth: null });\n } else {\n return JSON.stringify(json, null, 2);\n }\n}\n\nexport async function subscribeAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath: string | undefined;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n const functionArgs = await parseArgs(ctx, args.argsString);\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n identity,\n parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: waitForever(),\n callbacks: {\n onStart() {\n logFinishedStep(\n `Watching query ${args.functionName} on ${args.deploymentUrl}...`,\n );\n },\n onChange(result) {\n logOutput(formatValue(result));\n },\n onStop() {\n logMessage(`Closing connection to ${args.deploymentUrl}...`);\n },\n },\n });\n}\n\nexport async function subscribe(\n _ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n identity?: UserIdentityAttributes | undefined;\n parsedFunctionName: string;\n parsedFunctionArgs: Record<string, Value>;\n componentPath: string | undefined;\n until: Promise<unknown>;\n callbacks?:\n | {\n onStart?: () => void;\n onChange?: (result: Value) => void;\n onStop?: () => void;\n }\n | undefined;\n },\n) {\n const client = new BaseConvexClient(\n args.deploymentUrl,\n (updatedQueries) => {\n for (const queryToken of updatedQueries) {\n args.callbacks?.onChange?.(client.localQueryResultByToken(queryToken)!);\n }\n },\n {\n // pretend that a Node.js 'ws' library WebSocket is a browser WebSocket\n webSocketConstructor: ws as unknown as typeof WebSocket,\n unsavedChangesWarning: false,\n },\n );\n client.setAdminAuth(args.adminKey, args.identity);\n const { unsubscribe } = client.subscribe(\n args.parsedFunctionName,\n args.parsedFunctionArgs,\n {\n componentPath: args.componentPath,\n },\n );\n\n args.callbacks?.onStart?.();\n\n let done = false;\n const [donePromise, onDone] = waitUntilCalled();\n const stopWatching = () => {\n if (done) {\n return;\n }\n done = true;\n unsubscribe();\n void client.close();\n process.off(\"SIGINT\", sigintListener);\n onDone();\n args.callbacks?.onStop?.();\n };\n function sigintListener() {\n stopWatching();\n }\n process.on(\"SIGINT\", sigintListener);\n void args.until.finally(stopWatching);\n while (!done) {\n // loops once per day (any large value < 2**31 would work)\n const oneDay = 24 * 60 * 60 * 1000;\n await Promise.race([\n donePromise,\n new Promise((resolve) => setTimeout(resolve, oneDay)),\n ]);\n }\n}\n\nexport async function runInDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n push: boolean;\n watch: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n componentPath: string | undefined;\n liveComponentSources: boolean;\n },\n) {\n if (args.push) {\n await watchAndPush(\n ctx,\n {\n url: args.deploymentUrl,\n adminKey: args.adminKey,\n deploymentName: args.deploymentName,\n verbose: false,\n dryRun: false,\n typecheck: args.typecheck,\n typecheckComponents: args.typecheckComponents,\n debug: false,\n debugNodeApis: false,\n codegen: args.codegen,\n liveComponentSources: args.liveComponentSources,\n largeIndexDeletionCheck: \"no verification\", // `convex run` can\u2019t push to prod\n },\n {\n once: true,\n traceEvents: false,\n untilSuccess: true,\n },\n );\n }\n\n if (args.watch) {\n return await subscribeAndLog(ctx, args);\n }\n return await runFunctionAndLog(ctx, args);\n}\n\nfunction instantiateStderrLogger(): Logger {\n const logger = new DefaultLogger({ verbose: false });\n logger.addLogLineListener((_level, ...args) => {\n // eslint-disable-next-line no-console\n console.error(...args);\n });\n return logger;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport util from \"util\";\nimport ws from \"ws\";\nimport { ConvexHttpClient } from \"../../browser/http_client.js\";\nimport { BaseConvexClient } from \"../../browser/index.js\";\nimport {\n PaginationResult,\n UserIdentityAttributes,\n makeFunctionReference,\n} from \"../../server/index.js\";\nimport { Value, convexToJson, jsonToConvex } from \"../../values/value.js\";\nimport { Context, OneoffCtx } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage, logOutput } from \"../../bundler/log.js\";\nimport { waitForever, waitUntilCalled } from \"./utils/utils.js\";\nimport JSON5 from \"json5\";\nimport path from \"path\";\nimport { readProjectConfig } from \"./config.js\";\nimport { watchAndPush } from \"./dev.js\";\nimport { Logger, DefaultLogger } from \"../../browser/logging.js\";\n\nexport async function runFunctionAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath?: string | undefined;\n callbacks?:\n | {\n onSuccess?: () => void | undefined;\n }\n | undefined;\n },\n) {\n const client = new ConvexHttpClient(args.deploymentUrl, {\n logger: instantiateStderrLogger(),\n });\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n client.setAdminAuth(args.adminKey, identity);\n\n const functionArgs = await parseArgs(ctx, args.argsString);\n const { projectConfig } = await readProjectConfig(ctx);\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n let result: Value;\n try {\n result = await client.function(\n makeFunctionReference(parsedFunctionName),\n args.componentPath,\n functionArgs,\n );\n } catch (err) {\n const errorMessage = (err as Error).toString().trim();\n\n if (errorMessage.includes(\"Could not find function\")) {\n const functions = (await runSystemQuery(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n functionName: \"_system/cli/modules:apiSpec\",\n componentPath: args.componentPath,\n args: {},\n })) as (\n | {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n }\n | {\n functionType: \"HttpAction\";\n }\n )[];\n\n const functionNames = functions\n .filter(\n (\n fn,\n ): fn is {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n } => fn.functionType !== \"HttpAction\",\n )\n .map(({ identifier }) => {\n const separatorPos = identifier.indexOf(\":\");\n\n const path =\n separatorPos === -1\n ? \"\"\n : identifier.substring(0, separatorPos).replace(/\\.js$/, \"\");\n const name =\n separatorPos === -1\n ? identifier\n : identifier.substring(separatorPos + 1);\n\n return `\u2022 ${chalkStderr.gray(`${path}:`)}${name}`;\n });\n\n const availableFunctionsMessage =\n functionNames.length > 0\n ? `Available functions:\\n${functionNames.join(\"\\n\")}`\n : \"No functions found.\";\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}\\n\\n${availableFunctionsMessage}`,\n });\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}`,\n });\n }\n\n args.callbacks?.onSuccess?.();\n\n // `null` is the default return type\n if (result !== null) {\n logOutput(formatValue(result));\n }\n}\n\nasync function getFakeIdentity(ctx: Context, identityString: string) {\n let identity: UserIdentityAttributes;\n try {\n identity = JSON5.parse(identityString);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Failed to parse identity as JSON: \"${identityString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n const subject = identity.subject ?? \"\" + simpleHash(JSON.stringify(identity));\n const issuer = identity.issuer ?? \"https://convex.test\";\n const tokenIdentifier =\n identity.tokenIdentifier ?? `${issuer.toString()}|${subject.toString()}`;\n return {\n ...identity,\n subject,\n issuer,\n tokenIdentifier,\n };\n}\n\nexport async function parseArgs(ctx: Context, argsString: string) {\n try {\n const argsJson = JSON5.parse(argsString);\n return jsonToConvex(argsJson) as Record<string, Value>;\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to parse arguments as JSON: \"${argsString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n}\n\nexport async function parseFunctionName(\n ctx: Context,\n functionName: string,\n // Usually `convex/` -- should contain trailing slash\n functionDirName: string,\n) {\n // api.foo.bar -> foo:bar\n // foo/bar -> foo/bar:default\n // foo/bar:baz -> foo/bar:baz\n // convex/foo/bar -> foo/bar:default\n\n // This is the `api.foo.bar` format\n if (functionName.startsWith(\"api.\") || functionName.startsWith(\"internal.\")) {\n const parts = functionName.split(\".\");\n if (parts.length < 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function name has too few parts: \"${functionName}\"`,\n });\n }\n const exportName = parts.pop();\n const parsedName = `${parts.slice(1).join(\"/\")}:${exportName}`;\n return parsedName;\n }\n\n // This is the `foo/bar:baz` format\n\n // This is something like `convex/foo/bar`, which could either be addressing `foo/bar:default` or `convex/foo/bar:default`\n // if there's a directory with the same name as the functions directory nested directly underneath.\n // We'll prefer the `convex/foo/bar:default` version, and check if the file exists, and otherwise treat this as a relative path from the project root.\n const filePath = functionName.split(\":\")[0];\n const possibleExtensions = [\n \".ts\",\n \".js\",\n \".tsx\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n ];\n let hasExtension = false;\n let normalizedFilePath: string = filePath;\n for (const extension of possibleExtensions) {\n if (filePath.endsWith(extension)) {\n normalizedFilePath = filePath.slice(0, -extension.length);\n hasExtension = true;\n break;\n }\n }\n\n const exportName = functionName.split(\":\")[1] ?? \"default\";\n const normalizedName = `${normalizedFilePath}:${exportName}`;\n\n // This isn't a relative path from the project root\n if (!filePath.startsWith(functionDirName)) {\n return normalizedName;\n }\n\n const filePathWithoutPrefix = normalizedFilePath.slice(\n functionDirName.length,\n );\n const functionNameWithoutPrefix = `${filePathWithoutPrefix}:${exportName}`;\n\n if (hasExtension) {\n if (ctx.fs.exists(path.join(functionDirName, filePath))) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n } else {\n const exists = possibleExtensions.some((extension) =>\n ctx.fs.exists(path.join(functionDirName, filePath + extension)),\n );\n if (exists) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n }\n}\n\nfunction simpleHash(string: string) {\n let hash = 0;\n for (let i = 0; i < string.length; i++) {\n const char = string.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\nexport async function runSystemPaginatedQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n limit?: number;\n },\n) {\n const results = [];\n let cursor = null;\n let isDone = false;\n while (!isDone && (args.limit === undefined || results.length < args.limit)) {\n const paginationResult = (await runSystemQuery(ctx, {\n ...args,\n args: {\n ...args.args,\n paginationOpts: {\n cursor,\n numItems:\n args.limit === undefined ? 10000 : args.limit - results.length,\n },\n },\n })) as unknown as PaginationResult<Record<string, Value>>;\n isDone = paginationResult.isDone;\n cursor = paginationResult.continueCursor;\n results.push(...paginationResult.page);\n }\n return results;\n}\n\nexport async function runSystemQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n },\n): Promise<Value> {\n let onResult: (result: Value) => void;\n const resultPromise = new Promise<Value>((resolve) => {\n onResult = resolve;\n });\n const [donePromise, onDone] = waitUntilCalled();\n await subscribe(ctx, {\n ...args,\n parsedFunctionName: args.functionName,\n parsedFunctionArgs: args.args,\n until: donePromise,\n callbacks: {\n onChange: (result) => {\n onDone();\n onResult(result);\n },\n },\n });\n return resultPromise;\n}\n\nexport function formatValue(value: Value) {\n const json = convexToJson(value);\n if (process.stdout.isTTY) {\n // TODO (Tom) add JSON syntax highlighting like https://stackoverflow.com/a/51319962/398212\n // until then, just spit out something that isn't quite JSON because it's easy\n return util.inspect(value, { colors: true, depth: null });\n } else {\n return JSON.stringify(json, null, 2);\n }\n}\n\nexport async function subscribeAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath: string | undefined;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n const functionArgs = await parseArgs(ctx, args.argsString);\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n identity,\n parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: waitForever(),\n callbacks: {\n onStart() {\n logFinishedStep(\n `Watching query ${args.functionName} on ${args.deploymentUrl}...`,\n );\n },\n onChange(result) {\n logOutput(formatValue(result));\n },\n onStop() {\n logMessage(`Closing connection to ${args.deploymentUrl}...`);\n },\n },\n });\n}\n\nexport async function subscribe(\n _ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n identity?: UserIdentityAttributes | undefined;\n parsedFunctionName: string;\n parsedFunctionArgs: Record<string, Value>;\n componentPath: string | undefined;\n until: Promise<unknown>;\n callbacks?:\n | {\n onStart?: () => void;\n onChange?: (result: Value) => void;\n onStop?: () => void;\n }\n | undefined;\n },\n) {\n const client = new BaseConvexClient(\n args.deploymentUrl,\n (updatedQueries) => {\n for (const queryToken of updatedQueries) {\n args.callbacks?.onChange?.(client.localQueryResultByToken(queryToken)!);\n }\n },\n {\n // pretend that a Node.js 'ws' library WebSocket is a browser WebSocket\n webSocketConstructor: ws as unknown as typeof WebSocket,\n unsavedChangesWarning: false,\n },\n );\n client.setAdminAuth(args.adminKey, args.identity);\n const { unsubscribe } = client.subscribe(\n args.parsedFunctionName,\n args.parsedFunctionArgs,\n {\n componentPath: args.componentPath,\n },\n );\n\n args.callbacks?.onStart?.();\n\n let done = false;\n const [donePromise, onDone] = waitUntilCalled();\n const stopWatching = () => {\n if (done) {\n return;\n }\n done = true;\n unsubscribe();\n void client.close();\n process.off(\"SIGINT\", sigintListener);\n onDone();\n args.callbacks?.onStop?.();\n };\n function sigintListener() {\n stopWatching();\n }\n process.on(\"SIGINT\", sigintListener);\n void args.until.finally(stopWatching);\n while (!done) {\n // loops once per day (any large value < 2**31 would work)\n const oneDay = 24 * 60 * 60 * 1000;\n await Promise.race([\n donePromise,\n new Promise((resolve) => setTimeout(resolve, oneDay)),\n ]);\n }\n}\n\nexport async function runInDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n push: boolean;\n watch: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n componentPath: string | undefined;\n liveComponentSources: boolean;\n },\n) {\n if (args.push) {\n await watchAndPush(\n ctx,\n {\n url: args.deploymentUrl,\n adminKey: args.adminKey,\n deploymentName: args.deploymentName,\n verbose: false,\n dryRun: false,\n typecheck: args.typecheck,\n typecheckComponents: args.typecheckComponents,\n debug: false,\n debugNodeApis: false,\n codegen: args.codegen,\n liveComponentSources: args.liveComponentSources,\n pushAllModules: false,\n largeIndexDeletionCheck: \"no verification\", // `convex run` can\u2019t push to prod\n },\n {\n once: true,\n traceEvents: false,\n untilSuccess: true,\n },\n );\n }\n\n if (args.watch) {\n return await subscribeAndLog(ctx, args);\n }\n return await runFunctionAndLog(ctx, args);\n}\n\nfunction instantiateStderrLogger(): Logger {\n const logger = new DefaultLogger({ verbose: false });\n logger.addLogLineListener((_level, ...args) => {\n // eslint-disable-next-line no-console\n console.error(...args);\n });\n return logger;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path", "JSON5", "exportName", "util", "ws"]
|
|
7
7
|
}
|
|
@@ -35,11 +35,15 @@ __export(typecheck_exports, {
|
|
|
35
35
|
module.exports = __toCommonJS(typecheck_exports);
|
|
36
36
|
var import_chalk = require("chalk");
|
|
37
37
|
var import_path = __toESM(require("path"), 1);
|
|
38
|
+
var import_perf_hooks = require("perf_hooks");
|
|
38
39
|
var import_log = require("../../bundler/log.js");
|
|
39
40
|
var Sentry = __toESM(require("@sentry/node"), 1);
|
|
40
41
|
var semver = __toESM(require("semver"), 1);
|
|
41
42
|
var import_utils = require("./utils/utils.js");
|
|
42
43
|
var import_config = require("./config.js");
|
|
44
|
+
var import_watch = require("./watch.js");
|
|
45
|
+
const SLOW_TYPECHECK_THRESHOLD_MS = 1e4;
|
|
46
|
+
const SLOW_TYPECHECK_DOCS_URL = "https://docs.convex.dev/production/project-configuration#configuring-the-typescript-compiler";
|
|
43
47
|
async function resolveTypescriptCompiler(ctx, cliOption) {
|
|
44
48
|
const { projectConfig } = await (0, import_config.readProjectConfig)(ctx);
|
|
45
49
|
return cliOption ?? projectConfig?.typescriptCompiler ?? "tsc";
|
|
@@ -49,6 +53,7 @@ async function typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir) {
|
|
|
49
53
|
return;
|
|
50
54
|
}
|
|
51
55
|
const typescriptCompiler = await resolveTypescriptCompiler(ctx);
|
|
56
|
+
const typecheckStart = import_perf_hooks.performance.now();
|
|
52
57
|
await typeCheckFunctions(
|
|
53
58
|
ctx,
|
|
54
59
|
typescriptCompiler,
|
|
@@ -76,6 +81,11 @@ async function typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir) {
|
|
|
76
81
|
}
|
|
77
82
|
}
|
|
78
83
|
);
|
|
84
|
+
maybeLogSlowTypecheckSuggestion(
|
|
85
|
+
ctx,
|
|
86
|
+
import_perf_hooks.performance.now() - typecheckStart,
|
|
87
|
+
typescriptCompiler
|
|
88
|
+
);
|
|
79
89
|
}
|
|
80
90
|
async function typeCheckFunctions(ctx, typescriptCompiler, functionsDir, handleResult) {
|
|
81
91
|
const tsconfig = import_path.default.join(functionsDir, "tsconfig.json");
|
|
@@ -185,4 +195,24 @@ async function runTscInner(ctx, tscPath, tscArgs, handleResult) {
|
|
|
185
195
|
}
|
|
186
196
|
);
|
|
187
197
|
}
|
|
198
|
+
function maybeLogSlowTypecheckSuggestion(ctx, durationMs, typescriptCompiler) {
|
|
199
|
+
if (!(ctx instanceof import_watch.WatchContext)) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (!ctx.isFirstPush) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (typescriptCompiler === "tsgo") {
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (durationMs <= SLOW_TYPECHECK_THRESHOLD_MS) {
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const formattedDuration = (0, import_utils.formatDuration)(durationMs);
|
|
212
|
+
(0, import_log.logMessage)(
|
|
213
|
+
import_chalk.chalkStderr.gray(
|
|
214
|
+
`Typechecking took ${formattedDuration}. For faster iteration, consider enabling the TypeScript 7 compiler (tsgo) in your project configuration: ${SLOW_TYPECHECK_DOCS_URL}`
|
|
215
|
+
)
|
|
216
|
+
);
|
|
217
|
+
}
|
|
188
218
|
//# sourceMappingURL=typecheck.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/typecheck.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport path from \"path\";\nimport { Context } from \"../../bundler/context.js\";\nimport {
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAA4B;AAC5B,kBAAiB;
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport path from \"path\";\nimport { performance } from \"perf_hooks\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logError,\n logFailure,\n logMessage,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport * as Sentry from \"@sentry/node\";\nimport * as semver from \"semver\";\nimport { formatDuration, spawnAsync } from \"./utils/utils.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { WatchContext } from \"./watch.js\";\n\nexport type TypecheckResult = \"cantTypeCheck\" | \"success\" | \"typecheckFailed\";\n\nexport type TypeCheckMode = \"enable\" | \"try\" | \"disable\";\n\nexport type TypescriptCompiler = \"tsc\" | \"tsgo\";\n\nconst SLOW_TYPECHECK_THRESHOLD_MS = 10_000;\nconst SLOW_TYPECHECK_DOCS_URL =\n \"https://docs.convex.dev/production/project-configuration#configuring-the-typescript-compiler\";\n\n/**\n * Resolves the TypeScript compiler to use based on CLI flag, config file, and default.\n * Precedence: CLI flag \u2192 config file \u2192 default \"tsc\"\n */\nexport async function resolveTypescriptCompiler(\n ctx: Context,\n cliOption?: TypescriptCompiler,\n): Promise<TypescriptCompiler> {\n const { projectConfig } = await readProjectConfig(ctx);\n return cliOption ?? projectConfig?.typescriptCompiler ?? \"tsc\";\n}\n\ntype TypecheckResultHandler = (\n result: TypecheckResult,\n logSpecificError?: () => void,\n // If given, we run it to print out errors.\n // We expect it to throw or resolve to \"success\"\n // if a concurrent change invalidated the error result.\n runOnError?: () => Promise<\"success\">,\n) => Promise<void>;\n\n/**\n * Conditionally run a typecheck function and interpret the result.\n *\n * If typeCheckMode === \"disable\", never run the typecheck function.\n * If typeCheckMode === \"enable\", run the typecheck and crash if typechecking\n * fails or we can't find tsc.\n * If typeCheckMode === \"try\", try and run the typecheck. crash if typechecking\n * fails but don't worry if tsc is missing and we can't run it.\n */\nexport async function typeCheckFunctionsInMode(\n ctx: Context,\n typeCheckMode: TypeCheckMode,\n functionsDir: string,\n): Promise<void> {\n if (typeCheckMode === \"disable\") {\n return;\n }\n const typescriptCompiler = await resolveTypescriptCompiler(ctx);\n const typecheckStart = performance.now();\n await typeCheckFunctions(\n ctx,\n typescriptCompiler,\n functionsDir,\n async (result, logSpecificError, runOnError) => {\n if (\n (result === \"cantTypeCheck\" && typeCheckMode === \"enable\") ||\n result === \"typecheckFailed\"\n ) {\n logSpecificError?.();\n logError(\n chalkStderr.gray(\n \"To ignore failing typecheck, use `--typecheck=disable`.\",\n ),\n );\n try {\n const result = await runOnError?.();\n // Concurrent change invalidated the error, don't fail\n if (result === \"success\") {\n return;\n }\n } catch {\n // As expected, `runOnError` threw\n }\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: null,\n });\n }\n },\n );\n maybeLogSlowTypecheckSuggestion(\n ctx,\n performance.now() - typecheckStart,\n typescriptCompiler,\n );\n}\n\n// Runs TypeScript compiler to typecheck Convex query and mutation functions.\nexport async function typeCheckFunctions(\n ctx: Context,\n typescriptCompiler: TypescriptCompiler,\n functionsDir: string,\n handleResult: TypecheckResultHandler,\n): Promise<void> {\n const tsconfig = path.join(functionsDir, \"tsconfig.json\");\n if (!ctx.fs.exists(tsconfig)) {\n return handleResult(\"cantTypeCheck\", () => {\n logError(\n \"Found no convex/tsconfig.json to use to typecheck Convex functions, so skipping typecheck.\",\n );\n logError(\"Run `npx convex codegen --init` to create one.\");\n });\n }\n await runTsc(\n ctx,\n typescriptCompiler,\n [\"--project\", functionsDir],\n handleResult,\n );\n}\n\nasync function runTsc(\n ctx: Context,\n typescriptCompiler: TypescriptCompiler,\n tscArgs: string[],\n handleResult: TypecheckResultHandler,\n): Promise<void> {\n // Check if tsc is even installed\n const tscPath =\n typescriptCompiler === \"tsgo\"\n ? path.join(\n \"node_modules\",\n \"@typescript\",\n \"native-preview\",\n \"bin\",\n \"tsgo.js\",\n )\n : path.join(\"node_modules\", \"typescript\", \"bin\", \"tsc\");\n if (!ctx.fs.exists(tscPath)) {\n return handleResult(\"cantTypeCheck\", () => {\n logError(\n chalkStderr.gray(\n `No \\`${typescriptCompiler}\\` binary found, so skipping typecheck.`,\n ),\n );\n });\n }\n\n // Check the TypeScript version matches the recommendation from Convex\n const versionResult = await spawnAsync(ctx, process.execPath, [\n tscPath,\n \"--version\",\n ]);\n\n const version = versionResult.stdout.match(/Version (.*)/)?.[1] ?? null;\n const hasOlderTypeScriptVersion = version && semver.lt(version, \"4.8.4\");\n\n await runTscInner(ctx, tscPath, tscArgs, handleResult);\n\n // Print this warning after any logs from running `tsc`\n if (hasOlderTypeScriptVersion) {\n logError(\n chalkStderr.yellow(\n \"Convex works best with TypeScript version 4.8.4 or newer -- npm i --save-dev typescript@latest to update.\",\n ),\n );\n }\n}\n\nasync function runTscInner(\n ctx: Context,\n tscPath: string,\n tscArgs: string[],\n handleResult: TypecheckResultHandler,\n) {\n // Run `tsc` once and have it print out the files it touched. This output won't\n // be very useful if there's an error, but we'll run it again to get a nice\n // user-facing error in this exceptional case.\n // The `--listFiles` command prints out files touched on success or error.\n const result = await spawnAsync(ctx, process.execPath, [\n tscPath,\n ...tscArgs,\n \"--listFiles\",\n ]);\n if (result.status === null) {\n return handleResult(\"typecheckFailed\", () => {\n logFailure(`TypeScript typecheck timed out.`);\n if (result.error) {\n logError(chalkStderr.red(`${result.error.toString()}`));\n }\n });\n }\n // Okay, we may have failed `tsc` but at least it returned. Try to parse its\n // output to discover which files it touched.\n const filesTouched = result.stdout\n .split(\"\\n\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n let anyPathsFound = false;\n for (const fileTouched of filesTouched) {\n const absPath = path.resolve(fileTouched);\n let st;\n try {\n st = ctx.fs.stat(absPath);\n anyPathsFound = true;\n } catch {\n // Just move on if we have a bogus path from `tsc`. We'll log below if\n // we fail to stat *any* of the paths emitted by `tsc`.\n // TODO: Switch to using their JS API so we can get machine readable output.\n continue;\n }\n ctx.fs.registerPath(absPath, st);\n }\n if (filesTouched.length > 0 && !anyPathsFound) {\n const err = new Error(\n `Failed to stat any files emitted by tsc (received ${filesTouched.length})`,\n );\n Sentry.captureException(err);\n }\n\n if (!result.error && result.status === 0) {\n return handleResult(\"success\");\n }\n\n // This is the \"No inputs were found\", which is fine and we shouldn't\n // report it to the user.\n if (result.stdout.startsWith(\"error TS18003\")) {\n return handleResult(\"success\");\n }\n\n // At this point we know that `tsc` failed. Rerun it without `--listFiles`\n // and with stderr redirected to have it print out a nice error.\n return handleResult(\n \"typecheckFailed\",\n () => {\n logFailure(\"TypeScript typecheck via `tsc` failed.\");\n },\n async () => {\n showSpinner(\"Collecting TypeScript errors\");\n await spawnAsync(\n ctx,\n process.execPath,\n [tscPath, ...tscArgs, \"--pretty\", \"true\"],\n {\n stdio: \"inherit\",\n },\n );\n // If this passes, we had a concurrent file change that'll overlap with\n // our observations in the first run. Invalidate our context's filesystem\n // but allow the rest of the system to observe the success.\n ctx.fs.invalidate();\n return \"success\";\n },\n );\n}\n\nfunction maybeLogSlowTypecheckSuggestion(\n ctx: Context,\n durationMs: number,\n typescriptCompiler: TypescriptCompiler,\n) {\n if (!(ctx instanceof WatchContext)) {\n return;\n }\n if (!ctx.isFirstPush) {\n return;\n }\n if (typescriptCompiler === \"tsgo\") {\n return;\n }\n if (durationMs <= SLOW_TYPECHECK_THRESHOLD_MS) {\n return;\n }\n const formattedDuration = formatDuration(durationMs);\n logMessage(\n chalkStderr.gray(\n `Typechecking took ${formattedDuration}. For faster iteration, consider enabling the TypeScript 7 compiler (tsgo) in your project configuration: ${SLOW_TYPECHECK_DOCS_URL}`,\n ),\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["result", "path"]
|
|
7
7
|
}
|
|
@@ -114,14 +114,16 @@ class Crash extends Error {
|
|
|
114
114
|
}
|
|
115
115
|
}
|
|
116
116
|
class WatchContext {
|
|
117
|
-
constructor(traceEvents, bigBrainAuth) {
|
|
117
|
+
constructor(traceEvents, bigBrainAuth, isFirstPush) {
|
|
118
118
|
__publicField(this, "_cleanupFns", {});
|
|
119
119
|
__publicField(this, "fs");
|
|
120
120
|
__publicField(this, "deprecationMessagePrinted");
|
|
121
|
+
__publicField(this, "isFirstPush");
|
|
121
122
|
__publicField(this, "spinner");
|
|
122
123
|
__publicField(this, "_bigBrainAuth");
|
|
123
124
|
this.fs = new import_fs.RecordingFs(traceEvents);
|
|
124
125
|
this.deprecationMessagePrinted = false;
|
|
126
|
+
this.isFirstPush = isFirstPush;
|
|
125
127
|
this._bigBrainAuth = bigBrainAuth;
|
|
126
128
|
}
|
|
127
129
|
async crash(args) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/watch.ts"],
|
|
4
|
-
"sourcesContent": ["import chokidar from \"chokidar\";\nimport path from \"path\";\nimport { Observations, RecordingFs, WatchEvent } from \"../../bundler/fs.js\";\nimport { BigBrainAuth, Context, ErrorType } from \"../../bundler/context.js\";\nimport { logFailure } from \"../../bundler/log.js\";\nimport * as Sentry from \"@sentry/node\";\nimport { Ora } from \"ora\";\n\nexport class Watcher {\n private watch: chokidar.FSWatcher;\n private readyCb: Promise<void>;\n\n private bufferedEvents: WatchEvent[];\n private waiters: (() => void)[];\n\n constructor(observations: Observations) {\n this.bufferedEvents = [];\n this.waiters = [];\n\n const watch = chokidar.watch(observations.paths(), { persistent: true });\n watch.on(\"all\", (eventName, eventPath) => {\n const absPath = path.resolve(eventPath);\n this.bufferedEvents.push({ name: eventName, absPath });\n for (const waiter of drain(this.waiters)) {\n waiter();\n }\n });\n this.readyCb = new Promise<void>((resolve) => {\n watch.on(\"ready\", () => resolve());\n });\n this.watch = watch;\n }\n\n update(observations: Observations) {\n const watchedDirs = new Set(Object.keys(this.watch.getWatched()));\n for (const newPath of observations.paths()) {\n if (!this.isWatched(watchedDirs, newPath)) {\n this.watch.add(newPath);\n }\n }\n }\n\n isWatched(watchedDirs: Set<string>, observedPath: string) {\n // Walk over all of path's parents (inclusively) to see if any of them are in the watch set.\n // This function assumes that Chokidar recursively watches all directories, which is\n // definitely true on Mac with its FSEvents-based watcher.\n // TODO (CX-2151): Verify this condition on Windows and Linux.\n let curPath = observedPath;\n while (true) {\n const parsed = path.parse(curPath);\n\n // TODO(CX-2152): Check to see if this condition for walking parents works on Windows.\n if (parsed.dir === curPath) {\n break;\n }\n if (watchedDirs.has(curPath)) {\n return true;\n }\n curPath = parsed.dir;\n }\n return false;\n }\n\n async ready(): Promise<void> {\n await this.readyCb;\n }\n\n async waitForEvent(): Promise<void> {\n while (this.bufferedEvents.length === 0) {\n const newEvent = new Promise<void>((resolve) => {\n this.waiters.push(resolve);\n });\n await newEvent;\n }\n }\n\n drainEvents(): WatchEvent[] {\n return drain(this.bufferedEvents);\n }\n\n async close() {\n await this.watch.close();\n }\n}\nfunction drain<T>(l: T[]): T[] {\n return l.splice(0, l.length);\n}\n\nexport class Crash extends Error {\n errorType?: ErrorType;\n\n constructor(errorType?: ErrorType, err?: any) {\n super(err?.message);\n if (errorType) {\n this.errorType = errorType;\n }\n }\n}\n\nexport class WatchContext implements Context {\n private _cleanupFns: Record<\n string,\n (exitCode: number, err?: any) => Promise<void>\n > = {};\n fs: RecordingFs;\n deprecationMessagePrinted: boolean;\n spinner: Ora | undefined;\n private _bigBrainAuth: BigBrainAuth | null;\n\n constructor(traceEvents: boolean
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAqB;AACrB,kBAAiB;AACjB,gBAAsD;AAEtD,iBAA2B;AAC3B,aAAwB;AAGjB,MAAM,QAAQ;AAAA,EAOnB,YAAY,cAA4B;AANxC,wBAAQ;AACR,wBAAQ;AAER,wBAAQ;AACR,wBAAQ;AAGN,SAAK,iBAAiB,CAAC;AACvB,SAAK,UAAU,CAAC;AAEhB,UAAM,QAAQ,gBAAAA,QAAS,MAAM,aAAa,MAAM,GAAG,EAAE,YAAY,KAAK,CAAC;AACvE,UAAM,GAAG,OAAO,CAAC,WAAW,cAAc;AACxC,YAAM,UAAU,YAAAC,QAAK,QAAQ,SAAS;AACtC,WAAK,eAAe,KAAK,EAAE,MAAM,WAAW,QAAQ,CAAC;AACrD,iBAAW,UAAU,MAAM,KAAK,OAAO,GAAG;AACxC,eAAO;AAAA,MACT;AAAA,IACF,CAAC;AACD,SAAK,UAAU,IAAI,QAAc,CAAC,YAAY;AAC5C,YAAM,GAAG,SAAS,MAAM,QAAQ,CAAC;AAAA,IACnC,CAAC;AACD,SAAK,QAAQ;AAAA,EACf;AAAA,EAEA,OAAO,cAA4B;AACjC,UAAM,cAAc,IAAI,IAAI,OAAO,KAAK,KAAK,MAAM,WAAW,CAAC,CAAC;AAChE,eAAW,WAAW,aAAa,MAAM,GAAG;AAC1C,UAAI,CAAC,KAAK,UAAU,aAAa,OAAO,GAAG;AACzC,aAAK,MAAM,IAAI,OAAO;AAAA,MACxB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,aAA0B,cAAsB;AAKxD,QAAI,UAAU;AACd,WAAO,MAAM;AACX,YAAM,SAAS,YAAAA,QAAK,MAAM,OAAO;AAGjC,UAAI,OAAO,QAAQ,SAAS;AAC1B;AAAA,MACF;AACA,UAAI,YAAY,IAAI,OAAO,GAAG;AAC5B,eAAO;AAAA,MACT;AACA,gBAAU,OAAO;AAAA,IACnB;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK;AAAA,EACb;AAAA,EAEA,MAAM,eAA8B;AAClC,WAAO,KAAK,eAAe,WAAW,GAAG;AACvC,YAAM,WAAW,IAAI,QAAc,CAAC,YAAY;AAC9C,aAAK,QAAQ,KAAK,OAAO;AAAA,MAC3B,CAAC;AACD,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,cAA4B;AAC1B,WAAO,MAAM,KAAK,cAAc;AAAA,EAClC;AAAA,EAEA,MAAM,QAAQ;AACZ,UAAM,KAAK,MAAM,MAAM;AAAA,EACzB;AACF;AACA,SAAS,MAAS,GAAa;AAC7B,SAAO,EAAE,OAAO,GAAG,EAAE,MAAM;AAC7B;AAEO,MAAM,cAAc,MAAM;AAAA,EAG/B,YAAY,WAAuB,KAAW;AAC5C,UAAM,KAAK,OAAO;AAHpB;AAIE,QAAI,WAAW;AACb,WAAK,YAAY;AAAA,IACnB;AAAA,EACF;AACF;AAEO,MAAM,aAAgC;AAAA,
|
|
4
|
+
"sourcesContent": ["import chokidar from \"chokidar\";\nimport path from \"path\";\nimport { Observations, RecordingFs, WatchEvent } from \"../../bundler/fs.js\";\nimport { BigBrainAuth, Context, ErrorType } from \"../../bundler/context.js\";\nimport { logFailure } from \"../../bundler/log.js\";\nimport * as Sentry from \"@sentry/node\";\nimport { Ora } from \"ora\";\n\nexport class Watcher {\n private watch: chokidar.FSWatcher;\n private readyCb: Promise<void>;\n\n private bufferedEvents: WatchEvent[];\n private waiters: (() => void)[];\n\n constructor(observations: Observations) {\n this.bufferedEvents = [];\n this.waiters = [];\n\n const watch = chokidar.watch(observations.paths(), { persistent: true });\n watch.on(\"all\", (eventName, eventPath) => {\n const absPath = path.resolve(eventPath);\n this.bufferedEvents.push({ name: eventName, absPath });\n for (const waiter of drain(this.waiters)) {\n waiter();\n }\n });\n this.readyCb = new Promise<void>((resolve) => {\n watch.on(\"ready\", () => resolve());\n });\n this.watch = watch;\n }\n\n update(observations: Observations) {\n const watchedDirs = new Set(Object.keys(this.watch.getWatched()));\n for (const newPath of observations.paths()) {\n if (!this.isWatched(watchedDirs, newPath)) {\n this.watch.add(newPath);\n }\n }\n }\n\n isWatched(watchedDirs: Set<string>, observedPath: string) {\n // Walk over all of path's parents (inclusively) to see if any of them are in the watch set.\n // This function assumes that Chokidar recursively watches all directories, which is\n // definitely true on Mac with its FSEvents-based watcher.\n // TODO (CX-2151): Verify this condition on Windows and Linux.\n let curPath = observedPath;\n while (true) {\n const parsed = path.parse(curPath);\n\n // TODO(CX-2152): Check to see if this condition for walking parents works on Windows.\n if (parsed.dir === curPath) {\n break;\n }\n if (watchedDirs.has(curPath)) {\n return true;\n }\n curPath = parsed.dir;\n }\n return false;\n }\n\n async ready(): Promise<void> {\n await this.readyCb;\n }\n\n async waitForEvent(): Promise<void> {\n while (this.bufferedEvents.length === 0) {\n const newEvent = new Promise<void>((resolve) => {\n this.waiters.push(resolve);\n });\n await newEvent;\n }\n }\n\n drainEvents(): WatchEvent[] {\n return drain(this.bufferedEvents);\n }\n\n async close() {\n await this.watch.close();\n }\n}\nfunction drain<T>(l: T[]): T[] {\n return l.splice(0, l.length);\n}\n\nexport class Crash extends Error {\n errorType?: ErrorType;\n\n constructor(errorType?: ErrorType, err?: any) {\n super(err?.message);\n if (errorType) {\n this.errorType = errorType;\n }\n }\n}\n\nexport class WatchContext implements Context {\n private _cleanupFns: Record<\n string,\n (exitCode: number, err?: any) => Promise<void>\n > = {};\n fs: RecordingFs;\n deprecationMessagePrinted: boolean;\n isFirstPush: boolean;\n spinner: Ora | undefined;\n private _bigBrainAuth: BigBrainAuth | null;\n\n constructor(\n traceEvents: boolean,\n bigBrainAuth: BigBrainAuth | null,\n isFirstPush: boolean,\n ) {\n this.fs = new RecordingFs(traceEvents);\n this.deprecationMessagePrinted = false;\n this.isFirstPush = isFirstPush;\n this._bigBrainAuth = bigBrainAuth;\n }\n\n async crash(args: {\n exitCode: number;\n errorType?: ErrorType;\n errForSentry?: any;\n printedMessage: string | null;\n }): Promise<never> {\n if (args.errForSentry) {\n Sentry.captureException(args.errForSentry);\n }\n if (args.printedMessage !== null) {\n logFailure(args.printedMessage);\n }\n for (const fn of Object.values(this._cleanupFns)) {\n await fn(args.exitCode, args.errForSentry);\n }\n // Okay to throw here. We've wrapped it in a Crash that we'll catch later.\n // eslint-disable-next-line no-restricted-syntax\n throw new Crash(args.errorType, args.errForSentry);\n }\n\n registerCleanup(fn: (exitCode: number, err?: any) => Promise<void>): string {\n const handle = Math.random().toString(36).slice(2);\n this._cleanupFns[handle] = fn;\n return handle;\n }\n\n removeCleanup(handle: string) {\n const value = this._cleanupFns[handle];\n delete this._cleanupFns[handle];\n return value ?? null;\n }\n\n bigBrainAuth(): BigBrainAuth | null {\n return this._bigBrainAuth;\n }\n\n _updateBigBrainAuth(auth: BigBrainAuth | null): void {\n this._bigBrainAuth = auth;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["chokidar", "path"]
|
|
7
7
|
}
|
|
@@ -699,7 +699,7 @@ async function updateEnvLocal(ctx, clientId, apiKey, environmentId, localEnvVars
|
|
|
699
699
|
const envPath = ".env.local";
|
|
700
700
|
let existingFileContent = ctx.fs.exists(envPath) ? ctx.fs.readUtf8File(envPath) : null;
|
|
701
701
|
let suggestedChanges = {};
|
|
702
|
-
const { detectedFramework } = await (0, import_envvars.
|
|
702
|
+
const { detectedFramework } = await (0, import_envvars.suggestedEnvVarNames)(ctx);
|
|
703
703
|
const existingEnvVars = existingFileContent ? dotenv.parse(existingFileContent) : {};
|
|
704
704
|
for (const [envVarName, templateValue] of Object.entries(
|
|
705
705
|
localEnvVarsConfig
|