convex 1.41.0 → 1.42.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/browser/simple_client-node.js +85 -27
  5. package/dist/cjs/browser/simple_client-node.js.map +3 -3
  6. package/dist/cjs/cli/env.js +12 -5
  7. package/dist/cjs/cli/env.js.map +2 -2
  8. package/dist/cjs/cli/envDefault.js +12 -7
  9. package/dist/cjs/cli/envDefault.js.map +2 -2
  10. package/dist/cjs/cli/insights.js +11 -1
  11. package/dist/cjs/cli/insights.js.map +2 -2
  12. package/dist/cjs/cli/lib/env.js +5 -1
  13. package/dist/cjs/cli/lib/env.js.map +2 -2
  14. package/dist/cjs/cli/lib/login.js +16 -12
  15. package/dist/cjs/cli/lib/login.js.map +2 -2
  16. package/dist/cjs/cli/lib/logs.js +4 -1
  17. package/dist/cjs/cli/lib/logs.js.map +2 -2
  18. package/dist/cjs/cli/lib/run.js +27 -2
  19. package/dist/cjs/cli/lib/run.js.map +2 -2
  20. package/dist/cjs/cli/lib/utils/utils.js +30 -0
  21. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  22. package/dist/cjs/cli/program.js +2 -1
  23. package/dist/cjs/cli/program.js.map +2 -2
  24. package/dist/cjs/cli/project.js +27 -0
  25. package/dist/cjs/cli/project.js.map +7 -0
  26. package/dist/cjs/cli/projectCreate.js +90 -0
  27. package/dist/cjs/cli/projectCreate.js.map +7 -0
  28. package/dist/cjs/index.js +1 -1
  29. package/dist/cjs/index.js.map +1 -1
  30. package/dist/cjs/server/database.js.map +1 -1
  31. package/dist/cjs/server/impl/meta_impl.js +6 -6
  32. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  33. package/dist/cjs/server/impl/registration_impl.js +9 -2
  34. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  35. package/dist/cjs/server/index.js.map +2 -2
  36. package/dist/cjs/server/meta.js.map +1 -1
  37. package/dist/cjs/server/query.js.map +1 -1
  38. package/dist/cjs/server/registration.js.map +1 -1
  39. package/dist/cjs/server/storage.js.map +1 -1
  40. package/dist/cjs/server/system_fields.js.map +1 -1
  41. package/dist/cjs-types/cli/env.d.ts.map +1 -1
  42. package/dist/cjs-types/cli/envDefault.d.ts.map +1 -1
  43. package/dist/cjs-types/cli/insights.d.ts +1 -0
  44. package/dist/cjs-types/cli/insights.d.ts.map +1 -1
  45. package/dist/cjs-types/cli/lib/env.d.ts +3 -1
  46. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  47. package/dist/cjs-types/cli/lib/env.test.d.ts +2 -0
  48. package/dist/cjs-types/cli/lib/env.test.d.ts.map +1 -0
  49. package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
  50. package/dist/cjs-types/cli/lib/logs.d.ts +1 -1
  51. package/dist/cjs-types/cli/lib/logs.d.ts.map +1 -1
  52. package/dist/cjs-types/cli/lib/run.d.ts +1 -1
  53. package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
  54. package/dist/cjs-types/cli/lib/utils/utils.d.ts +10 -0
  55. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  56. package/dist/cjs-types/cli/program.d.ts.map +1 -1
  57. package/dist/cjs-types/cli/project.d.ts +3 -0
  58. package/dist/cjs-types/cli/project.d.ts.map +1 -0
  59. package/dist/cjs-types/cli/projectCreate.d.ts +5 -0
  60. package/dist/cjs-types/cli/projectCreate.d.ts.map +1 -0
  61. package/dist/cjs-types/index.d.ts +1 -1
  62. package/dist/cjs-types/server/database.d.ts +21 -3
  63. package/dist/cjs-types/server/database.d.ts.map +1 -1
  64. package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
  65. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  66. package/dist/cjs-types/server/index.d.ts +1 -1
  67. package/dist/cjs-types/server/index.d.ts.map +1 -1
  68. package/dist/cjs-types/server/meta.d.ts +10 -0
  69. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  70. package/dist/cjs-types/server/query.d.ts +1 -1
  71. package/dist/cjs-types/server/registration.d.ts +15 -3
  72. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  73. package/dist/cjs-types/server/storage.d.ts +20 -3
  74. package/dist/cjs-types/server/storage.d.ts.map +1 -1
  75. package/dist/cli.bundle.cjs +1047 -619
  76. package/dist/cli.bundle.cjs.map +4 -4
  77. package/dist/esm/browser/simple_client-node.js +85 -27
  78. package/dist/esm/browser/simple_client-node.js.map +3 -3
  79. package/dist/esm/cli/env.js +12 -5
  80. package/dist/esm/cli/env.js.map +2 -2
  81. package/dist/esm/cli/envDefault.js +12 -7
  82. package/dist/esm/cli/envDefault.js.map +2 -2
  83. package/dist/esm/cli/insights.js +11 -1
  84. package/dist/esm/cli/insights.js.map +2 -2
  85. package/dist/esm/cli/lib/env.js +5 -1
  86. package/dist/esm/cli/lib/env.js.map +2 -2
  87. package/dist/esm/cli/lib/login.js +18 -13
  88. package/dist/esm/cli/lib/login.js.map +2 -2
  89. package/dist/esm/cli/lib/logs.js +5 -2
  90. package/dist/esm/cli/lib/logs.js.map +2 -2
  91. package/dist/esm/cli/lib/run.js +32 -3
  92. package/dist/esm/cli/lib/run.js.map +2 -2
  93. package/dist/esm/cli/lib/utils/utils.js +29 -0
  94. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  95. package/dist/esm/cli/program.js +2 -1
  96. package/dist/esm/cli/program.js.map +2 -2
  97. package/dist/esm/cli/project.js +5 -0
  98. package/dist/esm/cli/project.js.map +7 -0
  99. package/dist/esm/cli/projectCreate.js +68 -0
  100. package/dist/esm/cli/projectCreate.js.map +7 -0
  101. package/dist/esm/index.js +1 -1
  102. package/dist/esm/index.js.map +1 -1
  103. package/dist/esm/server/impl/meta_impl.js +6 -6
  104. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  105. package/dist/esm/server/impl/registration_impl.js +9 -2
  106. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  107. package/dist/esm/server/index.js.map +2 -2
  108. package/dist/esm-types/cli/env.d.ts.map +1 -1
  109. package/dist/esm-types/cli/envDefault.d.ts.map +1 -1
  110. package/dist/esm-types/cli/insights.d.ts +1 -0
  111. package/dist/esm-types/cli/insights.d.ts.map +1 -1
  112. package/dist/esm-types/cli/lib/env.d.ts +3 -1
  113. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  114. package/dist/esm-types/cli/lib/env.test.d.ts +2 -0
  115. package/dist/esm-types/cli/lib/env.test.d.ts.map +1 -0
  116. package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
  117. package/dist/esm-types/cli/lib/logs.d.ts +1 -1
  118. package/dist/esm-types/cli/lib/logs.d.ts.map +1 -1
  119. package/dist/esm-types/cli/lib/run.d.ts +1 -1
  120. package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
  121. package/dist/esm-types/cli/lib/utils/utils.d.ts +10 -0
  122. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  123. package/dist/esm-types/cli/program.d.ts.map +1 -1
  124. package/dist/esm-types/cli/project.d.ts +3 -0
  125. package/dist/esm-types/cli/project.d.ts.map +1 -0
  126. package/dist/esm-types/cli/projectCreate.d.ts +5 -0
  127. package/dist/esm-types/cli/projectCreate.d.ts.map +1 -0
  128. package/dist/esm-types/index.d.ts +1 -1
  129. package/dist/esm-types/server/database.d.ts +21 -3
  130. package/dist/esm-types/server/database.d.ts.map +1 -1
  131. package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
  132. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  133. package/dist/esm-types/server/index.d.ts +1 -1
  134. package/dist/esm-types/server/index.d.ts.map +1 -1
  135. package/dist/esm-types/server/meta.d.ts +10 -0
  136. package/dist/esm-types/server/meta.d.ts.map +1 -1
  137. package/dist/esm-types/server/query.d.ts +1 -1
  138. package/dist/esm-types/server/registration.d.ts +15 -3
  139. package/dist/esm-types/server/registration.d.ts.map +1 -1
  140. package/dist/esm-types/server/storage.d.ts +20 -3
  141. package/dist/esm-types/server/storage.d.ts.map +1 -1
  142. package/dist/react.bundle.js +1 -1
  143. package/dist/react.bundle.js.map +1 -1
  144. package/package.json +4 -4
  145. package/src/cli/env.ts +16 -6
  146. package/src/cli/envDefault.ts +13 -7
  147. package/src/cli/insights.ts +12 -0
  148. package/src/cli/lib/env.test.ts +60 -0
  149. package/src/cli/lib/env.ts +9 -1
  150. package/src/cli/lib/login.ts +18 -18
  151. package/src/cli/lib/logs.ts +7 -2
  152. package/src/cli/lib/run.ts +37 -3
  153. package/src/cli/lib/utils/utils.ts +56 -0
  154. package/src/cli/program.ts +2 -0
  155. package/src/cli/project.ts +7 -0
  156. package/src/cli/projectCreate.ts +99 -0
  157. package/src/index.ts +1 -1
  158. package/src/server/database.ts +21 -3
  159. package/src/server/impl/meta_impl.ts +7 -6
  160. package/src/server/impl/registration_impl.ts +11 -3
  161. package/src/server/index.ts +1 -0
  162. package/src/server/meta.ts +10 -0
  163. package/src/server/query.ts +1 -1
  164. package/src/server/registration.test.ts +25 -1
  165. package/src/server/registration.ts +16 -1
  166. package/src/server/storage.ts +22 -3
  167. package/src/server/system_fields.ts +1 -1
@@ -129,13 +129,17 @@ const envRemoveCmd = new import_extra_typings.Command("remove").alias("rm").alia
129
129
  }
130
130
  });
131
131
  });
132
- const envListCmd = new import_extra_typings.Command("list").summary("List all variables and their values").description(
132
+ const envListCmd = new import_extra_typings.Command("list").summary("List all environment variables and their values").description(
133
133
  [
134
- "\u2022 List all variables: `npx convex env list`",
134
+ "\u2022 List all variables and their values: `npx convex env list`",
135
+ "\u2022 List only variable names (no values): `npx convex env list --names-only`",
135
136
  "\u2022 Save all variables to a file: `npx convex env list > .env.convex`",
136
137
  "\u2022 Append to a file: `npx convex env list >> .env.convex`"
137
138
  ].join("\n")
138
- ).configureHelp({ showGlobalOptions: true }).allowExcessArguments(false).action(async (_options, cmd) => {
139
+ ).option(
140
+ "--names-only",
141
+ "List only the names of environment variables, without their values"
142
+ ).configureHelp({ showGlobalOptions: true }).allowExcessArguments(false).action(async (cmdOptions, cmd) => {
139
143
  const options = cmd.optsWithGlobals();
140
144
  const { ctx, deployment } = await selectEnvDeployment(options);
141
145
  await (0, import_utils.ensureHasConvexDependency)(ctx, "env list");
@@ -144,7 +148,9 @@ const envListCmd = new import_extra_typings.Command("list").summary("List all va
144
148
  deployment,
145
149
  action: async () => {
146
150
  const backend = (0, import_env.deploymentEnvBackend)(ctx, deployment);
147
- await (0, import_env.envList)(ctx, backend);
151
+ await (0, import_env.envList)(ctx, backend, {
152
+ namesOnly: cmdOptions.namesOnly ?? false
153
+ });
148
154
  }
149
155
  });
150
156
  });
@@ -156,7 +162,8 @@ const env = new import_extra_typings.Command("env").summary("Set and view enviro
156
162
  "\u2022 Set interactively: `npx convex env set NAME`",
157
163
  "\u2022 Set multiple from file: `npx convex env set --from-file .env`",
158
164
  "\u2022 Unset a variable: `npx convex env remove NAME`",
159
- "\u2022 List all variables: `npx convex env list`",
165
+ "\u2022 List all variables and their values: `npx convex env list`",
166
+ "\u2022 List only variable names (no values): `npx convex env list --names-only`",
160
167
  "\u2022 Print a variable's value: `npx convex env get NAME`",
161
168
  "",
162
169
  "By default, this sets and views variables on your dev deployment.",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/env.ts"],
4
- "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { chalkStderr } from \"chalk\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport {\n DeploymentSelectionOptions,\n DetailedDeploymentCredentials,\n loadSelectedDeploymentCredentials,\n} from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport { ensureHasConvexDependency } from \"./lib/utils/utils.js\";\nimport {\n deploymentEnvBackend,\n envGet,\n envList,\n envRemove,\n envSet,\n} from \"./lib/env.js\";\nimport { getDeploymentSelection } from \"./lib/deploymentSelection.js\";\nimport { withRunningBackend } from \"./lib/localDeployment/run.js\";\nimport { envDefault } from \"./envDefault.js\";\n\nconst envSetCmd = new Command(\"set\")\n // Pretend value is required\n .usage(\"[options] <name> <value>\")\n .argument(\"[name]\", \"The name of the environment variable to set.\")\n .argument(\n \"[value]\",\n \"The value to set the variable to. Omit to set it interactively.\",\n )\n .summary(\"Set a variable\")\n .description(\n [\n \"Set environment variables on your deployment.\",\n \"\",\n \"\u2022 `npx convex env set NAME 'value'`\",\n \"\u2022 `npx convex env set NAME # omit a value to set one interactively`\",\n \"\u2022 `npx convex env set NAME --from-file value.txt`\",\n \"\u2022 `npx convex env set --from-file .env.defaults`\",\n \"\",\n \"When setting multiple values, it will refuse all changes if any variables are already set to different values by default. Pass --force to overwrite the provided values.\",\n \"\",\n \"To keep secrets out of your shell history, omit the value to pipe it in via stdin, for instance:\",\n \"\u2022 `pbpaste | npx convex env set API_KEY` (macOS)\",\n \"\u2022 `Get-Clipboard | npx convex env set API_KEY` (Windows PowerShell)\",\n \"\",\n \"To update many variables at once, save them with `npx convex env list > .env.convex`, edit the file, then reapply the changes with `npx convex env set --force < .env.convex`.\",\n ].join(\"\\n\"),\n )\n .option(\n \"--from-file <file>\",\n \"Read environment variables from a .env file. Without --force, fails if any existing variable has a different value.\",\n )\n .option(\n \"--force\",\n \"When setting multiple variables, overwrite existing environment variable values instead of failing on mismatch.\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (name, value, cmdOptions, cmd) => {\n // Note: We use `as` here because optsWithGlobals() type inference doesn't\n // include global options from the parent command (added via addDeploymentSelectionOptions)\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions;\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"env set\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const backend = deploymentEnvBackend(ctx, deployment);\n const didAnything = await envSet(ctx, backend, name, value, cmdOptions);\n if (didAnything === false) {\n cmd.outputHelp({ error: true });\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"error: No environment variables specified to be set.\",\n });\n }\n },\n });\n });\n\nexport async function selectEnvDeployment(\n options: DeploymentSelectionOptions,\n): Promise<{\n ctx: Context;\n deployment: {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice: string;\n deploymentFields: DetailedDeploymentCredentials[\"deploymentFields\"];\n };\n}> {\n const ctx = await oneoffContext(options);\n const deploymentSelection = await getDeploymentSelection(ctx, options);\n const {\n adminKey,\n url: deploymentUrl,\n deploymentFields,\n } = await loadSelectedDeploymentCredentials(ctx, deploymentSelection, {\n ensureLocalRunning: false,\n });\n\n const deploymentNotice =\n deploymentFields !== null\n ? ` (on ${chalkStderr.bold(deploymentFields.deploymentType)} deployment ${chalkStderr.bold(deploymentFields.deploymentName)})`\n : \"\";\n const result = {\n ctx,\n deployment: {\n deploymentUrl,\n adminKey,\n deploymentNotice,\n deploymentFields,\n },\n };\n return result;\n}\n\nconst envGetCmd = new Command(\"get\")\n .argument(\"<name>\", \"The name of the environment variable to print.\")\n .summary(\"Print a variable's value\")\n .description(\"Print a variable's value: `npx convex env get NAME`\")\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (envVarName, _options, cmd) => {\n const options = cmd.optsWithGlobals();\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"env get\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const backend = deploymentEnvBackend(ctx, deployment);\n await envGet(ctx, backend, envVarName);\n },\n });\n });\n\nconst envRemoveCmd = new Command(\"remove\")\n .alias(\"rm\")\n .alias(\"unset\")\n .argument(\"<name>\", \"The name of the environment variable to unset.\")\n .summary(\"Unset a variable\")\n .description(\n \"Unset a variable: `npx convex env remove NAME`\\n\" +\n \"If the variable doesn't exist, the command doesn't do anything and succeeds.\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (name, _options, cmd) => {\n const options = cmd.optsWithGlobals();\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"env remove\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const backend = deploymentEnvBackend(ctx, deployment);\n await envRemove(ctx, backend, name);\n },\n });\n });\n\nconst envListCmd = new Command(\"list\")\n .summary(\"List all variables and their values\")\n .description(\n [\n \"\u2022 List all variables: `npx convex env list`\",\n \"\u2022 Save all variables to a file: `npx convex env list > .env.convex`\",\n \"\u2022 Append to a file: `npx convex env list >> .env.convex`\",\n ].join(\"\\n\"),\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (_options, cmd) => {\n const options = cmd.optsWithGlobals();\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"env list\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const backend = deploymentEnvBackend(ctx, deployment);\n await envList(ctx, backend);\n },\n });\n });\n\nexport const env = new Command(\"env\")\n .summary(\"Set and view environment variables\")\n .description(\n [\n \"Set and view environment variables on your deployment\",\n \"\",\n \"\u2022 Set a variable: `npx convex env set NAME 'value'`\",\n \"\u2022 Set interactively: `npx convex env set NAME`\",\n \"\u2022 Set multiple from file: `npx convex env set --from-file .env`\",\n \"\u2022 Unset a variable: `npx convex env remove NAME`\",\n \"\u2022 List all variables: `npx convex env list`\",\n \"\u2022 Print a variable's value: `npx convex env get NAME`\",\n \"\",\n \"By default, this sets and views variables on your dev deployment.\",\n \"\",\n \"See the environment variables guide (https://docs.convex.dev/production/environment-variables) to learn more.\",\n ].join(\"\\n\"),\n )\n .addCommand(envSetCmd)\n .addCommand(envGetCmd)\n .addCommand(envRemoveCmd)\n .addCommand(envListCmd)\n .addCommand(envDefault)\n .helpCommand(false)\n .addDeploymentSelectionOptions(\n actionDescription(\"Set and view environment variables on\"),\n );\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { chalkStderr } from \"chalk\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport {\n DeploymentSelectionOptions,\n DetailedDeploymentCredentials,\n loadSelectedDeploymentCredentials,\n} from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport { ensureHasConvexDependency } from \"./lib/utils/utils.js\";\nimport {\n deploymentEnvBackend,\n envGet,\n envList,\n envRemove,\n envSet,\n} from \"./lib/env.js\";\nimport { getDeploymentSelection } from \"./lib/deploymentSelection.js\";\nimport { withRunningBackend } from \"./lib/localDeployment/run.js\";\nimport { envDefault } from \"./envDefault.js\";\n\nconst envSetCmd = new Command(\"set\")\n // Pretend value is required\n .usage(\"[options] <name> <value>\")\n .argument(\"[name]\", \"The name of the environment variable to set.\")\n .argument(\n \"[value]\",\n \"The value to set the variable to. Omit to set it interactively.\",\n )\n .summary(\"Set a variable\")\n .description(\n [\n \"Set environment variables on your deployment.\",\n \"\",\n \"\u2022 `npx convex env set NAME 'value'`\",\n \"\u2022 `npx convex env set NAME # omit a value to set one interactively`\",\n \"\u2022 `npx convex env set NAME --from-file value.txt`\",\n \"\u2022 `npx convex env set --from-file .env.defaults`\",\n \"\",\n \"When setting multiple values, it will refuse all changes if any variables are already set to different values by default. Pass --force to overwrite the provided values.\",\n \"\",\n \"To keep secrets out of your shell history, omit the value to pipe it in via stdin, for instance:\",\n \"\u2022 `pbpaste | npx convex env set API_KEY` (macOS)\",\n \"\u2022 `Get-Clipboard | npx convex env set API_KEY` (Windows PowerShell)\",\n \"\",\n \"To update many variables at once, save them with `npx convex env list > .env.convex`, edit the file, then reapply the changes with `npx convex env set --force < .env.convex`.\",\n ].join(\"\\n\"),\n )\n .option(\n \"--from-file <file>\",\n \"Read environment variables from a .env file. Without --force, fails if any existing variable has a different value.\",\n )\n .option(\n \"--force\",\n \"When setting multiple variables, overwrite existing environment variable values instead of failing on mismatch.\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (name, value, cmdOptions, cmd) => {\n // Note: We use `as` here because optsWithGlobals() type inference doesn't\n // include global options from the parent command (added via addDeploymentSelectionOptions)\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions;\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"env set\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const backend = deploymentEnvBackend(ctx, deployment);\n const didAnything = await envSet(ctx, backend, name, value, cmdOptions);\n if (didAnything === false) {\n cmd.outputHelp({ error: true });\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"error: No environment variables specified to be set.\",\n });\n }\n },\n });\n });\n\nexport async function selectEnvDeployment(\n options: DeploymentSelectionOptions,\n): Promise<{\n ctx: Context;\n deployment: {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice: string;\n deploymentFields: DetailedDeploymentCredentials[\"deploymentFields\"];\n };\n}> {\n const ctx = await oneoffContext(options);\n const deploymentSelection = await getDeploymentSelection(ctx, options);\n const {\n adminKey,\n url: deploymentUrl,\n deploymentFields,\n } = await loadSelectedDeploymentCredentials(ctx, deploymentSelection, {\n ensureLocalRunning: false,\n });\n\n const deploymentNotice =\n deploymentFields !== null\n ? ` (on ${chalkStderr.bold(deploymentFields.deploymentType)} deployment ${chalkStderr.bold(deploymentFields.deploymentName)})`\n : \"\";\n const result = {\n ctx,\n deployment: {\n deploymentUrl,\n adminKey,\n deploymentNotice,\n deploymentFields,\n },\n };\n return result;\n}\n\nconst envGetCmd = new Command(\"get\")\n .argument(\"<name>\", \"The name of the environment variable to print.\")\n .summary(\"Print a variable's value\")\n .description(\"Print a variable's value: `npx convex env get NAME`\")\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (envVarName, _options, cmd) => {\n const options = cmd.optsWithGlobals();\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"env get\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const backend = deploymentEnvBackend(ctx, deployment);\n await envGet(ctx, backend, envVarName);\n },\n });\n });\n\nconst envRemoveCmd = new Command(\"remove\")\n .alias(\"rm\")\n .alias(\"unset\")\n .argument(\"<name>\", \"The name of the environment variable to unset.\")\n .summary(\"Unset a variable\")\n .description(\n \"Unset a variable: `npx convex env remove NAME`\\n\" +\n \"If the variable doesn't exist, the command doesn't do anything and succeeds.\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (name, _options, cmd) => {\n const options = cmd.optsWithGlobals();\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"env remove\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const backend = deploymentEnvBackend(ctx, deployment);\n await envRemove(ctx, backend, name);\n },\n });\n });\n\nconst envListCmd = new Command(\"list\")\n .summary(\"List all environment variables and their values\")\n .description(\n [\n \"\u2022 List all variables and their values: `npx convex env list`\",\n \"\u2022 List only variable names (no values): `npx convex env list --names-only`\",\n \"\u2022 Save all variables to a file: `npx convex env list > .env.convex`\",\n \"\u2022 Append to a file: `npx convex env list >> .env.convex`\",\n ].join(\"\\n\"),\n )\n .option(\n \"--names-only\",\n \"List only the names of environment variables, without their values\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false)\n .action(async (cmdOptions, cmd) => {\n // Note: We use `as` here because optsWithGlobals() type inference doesn't\n // include global options from the parent command (added via addDeploymentSelectionOptions)\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions;\n const { ctx, deployment } = await selectEnvDeployment(options);\n await ensureHasConvexDependency(ctx, \"env list\");\n await withRunningBackend({\n ctx,\n deployment,\n action: async () => {\n const backend = deploymentEnvBackend(ctx, deployment);\n await envList(ctx, backend, {\n namesOnly: cmdOptions.namesOnly ?? false,\n });\n },\n });\n });\n\nexport const env = new Command(\"env\")\n .summary(\"Set and view environment variables\")\n .description(\n [\n \"Set and view environment variables on your deployment\",\n \"\",\n \"\u2022 Set a variable: `npx convex env set NAME 'value'`\",\n \"\u2022 Set interactively: `npx convex env set NAME`\",\n \"\u2022 Set multiple from file: `npx convex env set --from-file .env`\",\n \"\u2022 Unset a variable: `npx convex env remove NAME`\",\n \"\u2022 List all variables and their values: `npx convex env list`\",\n \"\u2022 List only variable names (no values): `npx convex env list --names-only`\",\n \"\u2022 Print a variable's value: `npx convex env get NAME`\",\n \"\",\n \"By default, this sets and views variables on your dev deployment.\",\n \"\",\n \"See the environment variables guide (https://docs.convex.dev/production/environment-variables) to learn more.\",\n ].join(\"\\n\"),\n )\n .addCommand(envSetCmd)\n .addCommand(envGetCmd)\n .addCommand(envRemoveCmd)\n .addCommand(envListCmd)\n .addCommand(envDefault)\n .helpCommand(false)\n .addDeploymentSelectionOptions(\n actionDescription(\"Set and view environment variables on\"),\n );\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -116,20 +116,24 @@ const envDefaultRemove = addEnvDefaultOptions(
116
116
  await (0, import_env.envRemove)(ctx, backend, name);
117
117
  });
118
118
  const envDefaultList = addEnvDefaultOptions(
119
- new import_extra_typings.Command("list").summary("List all default variables").description(
119
+ new import_extra_typings.Command("list").summary("List all default environment variables and their values").description(
120
120
  [
121
- "List all default variables.",
122
- "",
123
- "\u2022 `npx convex env default list`",
121
+ "\u2022 List all default variables and their values: `npx convex env default list`",
122
+ "\u2022 List only default variable names (no values): `npx convex env default list --names-only`",
124
123
  "",
125
124
  "The deployment type is determined by the current deployment (local maps to dev), or by --type if provided."
126
125
  ].join("\n")
126
+ ).option(
127
+ "--names-only",
128
+ "List only the names of environment variables, without their values"
127
129
  ).configureHelp({ showGlobalOptions: true }).allowExcessArguments(false)
128
- ).action(async (_options, cmd) => {
130
+ ).action(async (cmdOptions, cmd) => {
129
131
  const options = cmd.optsWithGlobals();
130
132
  const { ctx, backend } = await resolveEnvDefaultBackend(options);
131
133
  await (0, import_utils.ensureHasConvexDependency)(ctx, "env default list");
132
- await (0, import_env.envList)(ctx, backend);
134
+ await (0, import_env.envList)(ctx, backend, {
135
+ namesOnly: cmdOptions.namesOnly ?? false
136
+ });
133
137
  });
134
138
  const envDefault = new import_extra_typings.Command("default").summary("Manage project-level default environment variables").description(
135
139
  [
@@ -139,7 +143,8 @@ const envDefault = new import_extra_typings.Command("default").summary("Manage p
139
143
  "",
140
144
  "\u2022 Set a default variable: `npx convex env default set NAME 'value'`",
141
145
  "\u2022 Unset a default variable: `npx convex env default remove NAME`",
142
- "\u2022 List all default variables: `npx convex env default list`",
146
+ "\u2022 List all default variables and their values: `npx convex env default list`",
147
+ "\u2022 List only default variable names (no values): `npx convex env default list --names-only`",
143
148
  "\u2022 Print a default variable's value: `npx convex env default get NAME`"
144
149
  ].join("\n")
145
150
  ).addCommand(envDefaultSet).addCommand(envDefaultGet).addCommand(envDefaultRemove).addCommand(envDefaultList).helpCommand(false);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/envDefault.ts"],
4
- "sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n envGet,\n envList,\n envRemove,\n envSet,\n EnvVarBackend,\n} from \"./lib/env.js\";\nimport { ensureHasConvexDependency } from \"./lib/utils/utils.js\";\nimport { defaultEnvBackend } from \"./lib/defaultEnv.js\";\nimport {\n CloudDeploymentType,\n DeploymentSelectionOptions,\n DeploymentType,\n fetchTeamAndProject,\n} from \"./lib/api.js\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport { selectEnvDeployment } from \"./env.js\";\nimport { getProjectDetails } from \"./lib/deploymentSelection.js\";\n\ntype EnvDefaultExtraOptions = {\n type?: string;\n project?: string;\n};\n\nfunction addEnvDefaultOptions<T extends Command<any, any>>(cmd: T): T {\n return cmd\n .addOption(\n new Option(\n \"--type <type>\",\n \"Manage default env vars for the given deployment type (dev, preview, prod) instead of inferring from the current deployment.\",\n ),\n )\n .addOption(\n new Option(\n \"--project <project>\",\n \"Select a project manually. Accepts `team-slug:project-slug` or just `project-slug` (team inferred from your current project). Requires --type.\",\n ),\n ) as T;\n}\n\nconst envDefaultSet = addEnvDefaultOptions(\n new Command(\"set\")\n .usage(\"[options] <name> <value>\")\n .argument(\"[name]\", \"The name of the default environment variable to set.\")\n .argument(\n \"[value]\",\n \"The value to set the variable to. Omit to set it interactively.\",\n )\n .summary(\"Set a default variable\")\n .description(\n [\n \"Set default environment variables for your project's deployment type.\",\n \"\",\n \"\u2022 `npx convex env default set NAME 'value'`\",\n \"\u2022 `npx convex env default set NAME # omit a value to set one interactively`\",\n \"\u2022 `npx convex env default set NAME --from-file value.txt`\",\n \"\u2022 `npx convex env default set --from-file .env.defaults`\",\n \"\",\n \"When setting multiple values, it will refuse all changes if any variables are already set to different values by default. Pass --force to overwrite the provided values.\",\n \"\",\n \"The deployment type is determined by the current deployment (local maps to dev), or by --type if provided.\",\n ].join(\"\\n\"),\n )\n .option(\n \"--from-file <file>\",\n \"Read environment variables from a .env file. Without --force, fails if any existing variable has a different value.\",\n )\n .option(\n \"--force\",\n \"When setting multiple variables, overwrite existing environment variable values instead of failing on mismatch.\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false),\n).action(async (name, value, cmdOptions, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions &\n EnvDefaultExtraOptions;\n const { ctx, backend } = await resolveEnvDefaultBackend(options);\n await ensureHasConvexDependency(ctx, \"env default set\");\n const didAnything = await envSet(ctx, backend, name, value, cmdOptions);\n if (didAnything === false) {\n cmd.outputHelp({ error: true });\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"error: No environment variables specified to be set.\",\n });\n }\n});\n\nconst envDefaultGet = addEnvDefaultOptions(\n new Command(\"get\")\n .argument(\n \"<name>\",\n \"The name of the default environment variable to print.\",\n )\n .summary(\"Print a default variable's value\")\n .description(\n \"Print a default variable's value: `npx convex env default get NAME`\\n\" +\n \"The deployment type is determined by the current deployment (local maps to dev), or by --type if provided.\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false),\n).action(async (envVarName, _options, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions &\n EnvDefaultExtraOptions;\n const { ctx, backend } = await resolveEnvDefaultBackend(options);\n await ensureHasConvexDependency(ctx, \"env default get\");\n await envGet(ctx, backend, envVarName);\n});\n\nconst envDefaultRemove = addEnvDefaultOptions(\n new Command(\"remove\")\n .alias(\"rm\")\n .alias(\"unset\")\n .argument(\n \"<name>\",\n \"The name of the default environment variable to unset.\",\n )\n .summary(\"Unset a default variable\")\n .description(\n [\n \"Unset a default variable.\",\n \"\",\n \"\u2022 `npx convex env default remove NAME`\",\n \"\",\n \"If the variable doesn't exist, the command doesn't do anything and succeeds.\",\n \"\",\n \"The deployment type is determined by the current deployment (local maps to dev), or by --type if provided.\",\n ].join(\"\\n\"),\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false),\n).action(async (name, _options, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions &\n EnvDefaultExtraOptions;\n const { ctx, backend } = await resolveEnvDefaultBackend(options);\n await ensureHasConvexDependency(ctx, \"env default remove\");\n await envRemove(ctx, backend, name);\n});\n\nconst envDefaultList = addEnvDefaultOptions(\n new Command(\"list\")\n .summary(\"List all default variables\")\n .description(\n [\n \"List all default variables.\",\n \"\",\n \"\u2022 `npx convex env default list`\",\n \"\",\n \"The deployment type is determined by the current deployment (local maps to dev), or by --type if provided.\",\n ].join(\"\\n\"),\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false),\n).action(async (_options, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions &\n EnvDefaultExtraOptions;\n const { ctx, backend } = await resolveEnvDefaultBackend(options);\n await ensureHasConvexDependency(ctx, \"env default list\");\n await envList(ctx, backend);\n});\n\nexport const envDefault = new Command(\"default\")\n .summary(\"Manage project-level default environment variables\")\n .description(\n [\n \"Manage default environment variables for your project.\",\n \"\",\n \"The default environment variables read and written to by this command are the ones for the deployment type of the current deployment (i.e. dev in most cases), unless --type is provided.\",\n \"\",\n \"\u2022 Set a default variable: `npx convex env default set NAME 'value'`\",\n \"\u2022 Unset a default variable: `npx convex env default remove NAME`\",\n \"\u2022 List all default variables: `npx convex env default list`\",\n \"\u2022 Print a default variable's value: `npx convex env default get NAME`\",\n ].join(\"\\n\"),\n )\n .addCommand(envDefaultSet)\n .addCommand(envDefaultGet)\n .addCommand(envDefaultRemove)\n .addCommand(envDefaultList)\n .helpCommand(false);\n\ntype ParsedProjectOption =\n | { kind: \"teamAndProject\"; teamSlug: string; projectSlug: string }\n | { kind: \"projectOnly\"; projectSlug: string };\n\nasync function resolveEnvDefaultBackend(\n options: DeploymentSelectionOptions & EnvDefaultExtraOptions,\n): Promise<{ ctx: Context; backend: EnvVarBackend }> {\n const dtypeOverride = normalizeTypeOption(options.type);\n\n if (options.project !== undefined) {\n const parsedProject = parseProjectOption(options.project);\n if (parsedProject === null) {\n const ctx = await oneoffContext(options);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"error: --project must be `team-slug:project-slug` or `project-slug`.\",\n });\n }\n if (dtypeOverride === undefined) {\n const ctx = await oneoffContext(options);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"error: --project requires --type to also be set.\",\n });\n }\n\n let ctx: Context;\n let resolved: { teamSlug: string; projectSlug: string };\n if (parsedProject.kind === \"teamAndProject\") {\n ctx = await oneoffContext(options);\n resolved = {\n teamSlug: parsedProject.teamSlug,\n projectSlug: parsedProject.projectSlug,\n };\n } else {\n const selected = await selectEnvDeployment(options);\n ctx = selected.ctx;\n if (selected.deployment.deploymentFields === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"error: --project <project-slug> requires a current cloud deployment to infer the team from. Use `team-slug:project-slug` to specify the team explicitly.\",\n });\n }\n const { team } = await fetchTeamAndProject(\n ctx,\n selected.deployment.deploymentFields.deploymentName,\n );\n resolved = { teamSlug: team, projectSlug: parsedProject.projectSlug };\n }\n\n const details = await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: resolved.teamSlug,\n projectSlug: resolved.projectSlug,\n });\n return {\n ctx,\n backend: defaultEnvBackend(ctx, details.id, dtypeOverride),\n };\n }\n\n const { ctx, deployment } = await selectEnvDeployment(options);\n const backend = await resolveDefaultEnvBackend(\n ctx,\n deployment.deploymentFields,\n dtypeOverride,\n );\n return { ctx, backend };\n}\n\nfunction normalizeTypeOption(\n type: string | undefined,\n): CloudDeploymentType | undefined {\n if (type === undefined) return undefined;\n if (type === \"development\") return \"dev\";\n if (type === \"production\") return \"prod\";\n return type as CloudDeploymentType;\n}\n\nfunction parseProjectOption(value: string): ParsedProjectOption | null {\n const parts = value.split(\":\");\n if (parts.length === 1 && parts[0].length > 0) {\n return { kind: \"projectOnly\", projectSlug: parts[0] };\n }\n if (parts.length === 2 && parts[0].length > 0 && parts[1].length > 0) {\n return {\n kind: \"teamAndProject\",\n teamSlug: parts[0],\n projectSlug: parts[1],\n };\n }\n return null;\n}\n\nexport async function resolveDefaultEnvBackend(\n ctx: Context,\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n } | null,\n dtypeOverride?: CloudDeploymentType,\n): Promise<EnvVarBackend> {\n if (deploymentFields === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Default environment variables are only available for cloud projects.\",\n });\n }\n if (deploymentFields.deploymentType === \"anonymous\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Default environment variables are not available for anonymous deployments.\",\n });\n }\n const dtype =\n dtypeOverride ?? resolveDefaultEnvDtype(deploymentFields.deploymentType);\n const { projectId } = await fetchTeamAndProject(\n ctx,\n deploymentFields.deploymentName,\n );\n return defaultEnvBackend(ctx, projectId, dtype);\n}\n\nfunction resolveDefaultEnvDtype(\n deploymentType: Exclude<DeploymentType, \"anonymous\">,\n): CloudDeploymentType {\n if (deploymentType === \"local\") return \"dev\";\n return deploymentType;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Command, Option } from \"@commander-js/extra-typings\";\nimport {\n envGet,\n envList,\n envRemove,\n envSet,\n EnvVarBackend,\n} from \"./lib/env.js\";\nimport { ensureHasConvexDependency } from \"./lib/utils/utils.js\";\nimport { defaultEnvBackend } from \"./lib/defaultEnv.js\";\nimport {\n CloudDeploymentType,\n DeploymentSelectionOptions,\n DeploymentType,\n fetchTeamAndProject,\n} from \"./lib/api.js\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport { selectEnvDeployment } from \"./env.js\";\nimport { getProjectDetails } from \"./lib/deploymentSelection.js\";\n\ntype EnvDefaultExtraOptions = {\n type?: string;\n project?: string;\n};\n\nfunction addEnvDefaultOptions<T extends Command<any, any>>(cmd: T): T {\n return cmd\n .addOption(\n new Option(\n \"--type <type>\",\n \"Manage default env vars for the given deployment type (dev, preview, prod) instead of inferring from the current deployment.\",\n ),\n )\n .addOption(\n new Option(\n \"--project <project>\",\n \"Select a project manually. Accepts `team-slug:project-slug` or just `project-slug` (team inferred from your current project). Requires --type.\",\n ),\n ) as T;\n}\n\nconst envDefaultSet = addEnvDefaultOptions(\n new Command(\"set\")\n .usage(\"[options] <name> <value>\")\n .argument(\"[name]\", \"The name of the default environment variable to set.\")\n .argument(\n \"[value]\",\n \"The value to set the variable to. Omit to set it interactively.\",\n )\n .summary(\"Set a default variable\")\n .description(\n [\n \"Set default environment variables for your project's deployment type.\",\n \"\",\n \"\u2022 `npx convex env default set NAME 'value'`\",\n \"\u2022 `npx convex env default set NAME # omit a value to set one interactively`\",\n \"\u2022 `npx convex env default set NAME --from-file value.txt`\",\n \"\u2022 `npx convex env default set --from-file .env.defaults`\",\n \"\",\n \"When setting multiple values, it will refuse all changes if any variables are already set to different values by default. Pass --force to overwrite the provided values.\",\n \"\",\n \"The deployment type is determined by the current deployment (local maps to dev), or by --type if provided.\",\n ].join(\"\\n\"),\n )\n .option(\n \"--from-file <file>\",\n \"Read environment variables from a .env file. Without --force, fails if any existing variable has a different value.\",\n )\n .option(\n \"--force\",\n \"When setting multiple variables, overwrite existing environment variable values instead of failing on mismatch.\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false),\n).action(async (name, value, cmdOptions, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions &\n EnvDefaultExtraOptions;\n const { ctx, backend } = await resolveEnvDefaultBackend(options);\n await ensureHasConvexDependency(ctx, \"env default set\");\n const didAnything = await envSet(ctx, backend, name, value, cmdOptions);\n if (didAnything === false) {\n cmd.outputHelp({ error: true });\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"error: No environment variables specified to be set.\",\n });\n }\n});\n\nconst envDefaultGet = addEnvDefaultOptions(\n new Command(\"get\")\n .argument(\n \"<name>\",\n \"The name of the default environment variable to print.\",\n )\n .summary(\"Print a default variable's value\")\n .description(\n \"Print a default variable's value: `npx convex env default get NAME`\\n\" +\n \"The deployment type is determined by the current deployment (local maps to dev), or by --type if provided.\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false),\n).action(async (envVarName, _options, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions &\n EnvDefaultExtraOptions;\n const { ctx, backend } = await resolveEnvDefaultBackend(options);\n await ensureHasConvexDependency(ctx, \"env default get\");\n await envGet(ctx, backend, envVarName);\n});\n\nconst envDefaultRemove = addEnvDefaultOptions(\n new Command(\"remove\")\n .alias(\"rm\")\n .alias(\"unset\")\n .argument(\n \"<name>\",\n \"The name of the default environment variable to unset.\",\n )\n .summary(\"Unset a default variable\")\n .description(\n [\n \"Unset a default variable.\",\n \"\",\n \"\u2022 `npx convex env default remove NAME`\",\n \"\",\n \"If the variable doesn't exist, the command doesn't do anything and succeeds.\",\n \"\",\n \"The deployment type is determined by the current deployment (local maps to dev), or by --type if provided.\",\n ].join(\"\\n\"),\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false),\n).action(async (name, _options, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions &\n EnvDefaultExtraOptions;\n const { ctx, backend } = await resolveEnvDefaultBackend(options);\n await ensureHasConvexDependency(ctx, \"env default remove\");\n await envRemove(ctx, backend, name);\n});\n\nconst envDefaultList = addEnvDefaultOptions(\n new Command(\"list\")\n .summary(\"List all default environment variables and their values\")\n .description(\n [\n \"\u2022 List all default variables and their values: `npx convex env default list`\",\n \"\u2022 List only default variable names (no values): `npx convex env default list --names-only`\",\n \"\",\n \"The deployment type is determined by the current deployment (local maps to dev), or by --type if provided.\",\n ].join(\"\\n\"),\n )\n .option(\n \"--names-only\",\n \"List only the names of environment variables, without their values\",\n )\n .configureHelp({ showGlobalOptions: true })\n .allowExcessArguments(false),\n).action(async (cmdOptions, cmd) => {\n const options = cmd.optsWithGlobals() as DeploymentSelectionOptions &\n EnvDefaultExtraOptions;\n const { ctx, backend } = await resolveEnvDefaultBackend(options);\n await ensureHasConvexDependency(ctx, \"env default list\");\n await envList(ctx, backend, {\n namesOnly: cmdOptions.namesOnly ?? false,\n });\n});\n\nexport const envDefault = new Command(\"default\")\n .summary(\"Manage project-level default environment variables\")\n .description(\n [\n \"Manage default environment variables for your project.\",\n \"\",\n \"The default environment variables read and written to by this command are the ones for the deployment type of the current deployment (i.e. dev in most cases), unless --type is provided.\",\n \"\",\n \"\u2022 Set a default variable: `npx convex env default set NAME 'value'`\",\n \"\u2022 Unset a default variable: `npx convex env default remove NAME`\",\n \"\u2022 List all default variables and their values: `npx convex env default list`\",\n \"\u2022 List only default variable names (no values): `npx convex env default list --names-only`\",\n \"\u2022 Print a default variable's value: `npx convex env default get NAME`\",\n ].join(\"\\n\"),\n )\n .addCommand(envDefaultSet)\n .addCommand(envDefaultGet)\n .addCommand(envDefaultRemove)\n .addCommand(envDefaultList)\n .helpCommand(false);\n\ntype ParsedProjectOption =\n | { kind: \"teamAndProject\"; teamSlug: string; projectSlug: string }\n | { kind: \"projectOnly\"; projectSlug: string };\n\nasync function resolveEnvDefaultBackend(\n options: DeploymentSelectionOptions & EnvDefaultExtraOptions,\n): Promise<{ ctx: Context; backend: EnvVarBackend }> {\n const dtypeOverride = normalizeTypeOption(options.type);\n\n if (options.project !== undefined) {\n const parsedProject = parseProjectOption(options.project);\n if (parsedProject === null) {\n const ctx = await oneoffContext(options);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"error: --project must be `team-slug:project-slug` or `project-slug`.\",\n });\n }\n if (dtypeOverride === undefined) {\n const ctx = await oneoffContext(options);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"error: --project requires --type to also be set.\",\n });\n }\n\n let ctx: Context;\n let resolved: { teamSlug: string; projectSlug: string };\n if (parsedProject.kind === \"teamAndProject\") {\n ctx = await oneoffContext(options);\n resolved = {\n teamSlug: parsedProject.teamSlug,\n projectSlug: parsedProject.projectSlug,\n };\n } else {\n const selected = await selectEnvDeployment(options);\n ctx = selected.ctx;\n if (selected.deployment.deploymentFields === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"error: --project <project-slug> requires a current cloud deployment to infer the team from. Use `team-slug:project-slug` to specify the team explicitly.\",\n });\n }\n const { team } = await fetchTeamAndProject(\n ctx,\n selected.deployment.deploymentFields.deploymentName,\n );\n resolved = { teamSlug: team, projectSlug: parsedProject.projectSlug };\n }\n\n const details = await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: resolved.teamSlug,\n projectSlug: resolved.projectSlug,\n });\n return {\n ctx,\n backend: defaultEnvBackend(ctx, details.id, dtypeOverride),\n };\n }\n\n const { ctx, deployment } = await selectEnvDeployment(options);\n const backend = await resolveDefaultEnvBackend(\n ctx,\n deployment.deploymentFields,\n dtypeOverride,\n );\n return { ctx, backend };\n}\n\nfunction normalizeTypeOption(\n type: string | undefined,\n): CloudDeploymentType | undefined {\n if (type === undefined) return undefined;\n if (type === \"development\") return \"dev\";\n if (type === \"production\") return \"prod\";\n return type as CloudDeploymentType;\n}\n\nfunction parseProjectOption(value: string): ParsedProjectOption | null {\n const parts = value.split(\":\");\n if (parts.length === 1 && parts[0].length > 0) {\n return { kind: \"projectOnly\", projectSlug: parts[0] };\n }\n if (parts.length === 2 && parts[0].length > 0 && parts[1].length > 0) {\n return {\n kind: \"teamAndProject\",\n teamSlug: parts[0],\n projectSlug: parts[1],\n };\n }\n return null;\n}\n\nexport async function resolveDefaultEnvBackend(\n ctx: Context,\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n } | null,\n dtypeOverride?: CloudDeploymentType,\n): Promise<EnvVarBackend> {\n if (deploymentFields === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Default environment variables are only available for cloud projects.\",\n });\n }\n if (deploymentFields.deploymentType === \"anonymous\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Default environment variables are not available for anonymous deployments.\",\n });\n }\n const dtype =\n dtypeOverride ?? resolveDefaultEnvDtype(deploymentFields.deploymentType);\n const { projectId } = await fetchTeamAndProject(\n ctx,\n deploymentFields.deploymentName,\n );\n return defaultEnvBackend(ctx, projectId, dtype);\n}\n\nfunction resolveDefaultEnvDtype(\n deploymentType: Exclude<DeploymentType, \"anonymous\">,\n): CloudDeploymentType {\n if (deploymentType === \"local\") return \"dev\";\n return deploymentType;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_env", "ctx"]
7
7
  }
@@ -109,7 +109,7 @@ const insights = new import_extra_typings.Command("insights").summary("Show heal
109
109
  "",
110
110
  "This command is only available for Convex cloud deployments when logged in as a user."
111
111
  ].join("\n")
112
- ).allowExcessArguments(false).option("--details", "Show recent events for each insight", false).addDeploymentSelectionOptions((0, import_command.actionDescription)("Show insights for")).showHelpAfterError().action(async (cmdOptions) => {
112
+ ).allowExcessArguments(false).option("--details", "Show recent events for each insight", false).option("--json", "Output insights as JSON", false).addDeploymentSelectionOptions((0, import_command.actionDescription)("Show insights for")).showHelpAfterError().action(async (cmdOptions) => {
113
113
  const ctx = await (0, import_context.oneoffContext)(cmdOptions);
114
114
  const deploymentSelection = await (0, import_deploymentSelection.getDeploymentSelection)(ctx, cmdOptions);
115
115
  const credentials = await (0, import_api.loadSelectedDeploymentCredentials)(
@@ -139,6 +139,16 @@ const insights = new import_extra_typings.Command("insights").summary("Show heal
139
139
  deploymentName,
140
140
  "?view=insights"
141
141
  );
142
+ if (cmdOptions.json) {
143
+ (0, import_log.logOutput)(
144
+ JSON.stringify(
145
+ { deploymentName, dashboardUrl, insights: insightsList },
146
+ null,
147
+ 2
148
+ )
149
+ );
150
+ return;
151
+ }
142
152
  if (insightsList.length === 0) {
143
153
  (0, import_log.logOutput)(
144
154
  import_chalk.default.green(
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/cli/insights.ts"],
4
- "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\n// eslint-disable-next-line no-restricted-imports -- stdout output uses default chalk\nimport chalk from \"chalk\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logOutput } from \"../bundler/log.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport { deploymentDashboardUrlPage } from \"./lib/dashboard.js\";\nimport { getDeploymentSelection } from \"./lib/deploymentSelection.js\";\nimport { type Insight, fetchInsights } from \"./lib/insights.js\";\n\nfunction formatInsightKind(kind: string): string {\n switch (kind) {\n case \"occRetried\":\n return \"OCC Retried\";\n case \"occFailedPermanently\":\n return \"OCC Failed Permanently\";\n case \"bytesReadLimit\":\n return \"Bytes Read Limit Exceeded\";\n case \"bytesReadThreshold\":\n return \"Bytes Read Near Limit\";\n case \"documentsReadLimit\":\n return \"Documents Read Limit Exceeded\";\n case \"documentsReadThreshold\":\n return \"Documents Read Near Limit\";\n default:\n return kind;\n }\n}\n\nfunction formatFunctionName(insight: Insight): string {\n if (insight.componentPath) {\n return `${insight.componentPath}:${insight.functionId}`;\n }\n return insight.functionId;\n}\n\nfunction formatInsight(insight: Insight, details: boolean): string {\n const severity =\n insight.severity === \"error\"\n ? chalk.red(`[ERROR]`)\n : chalk.yellow(`[WARNING]`);\n const kind = formatInsightKind(insight.kind);\n const fn = chalk.bold(formatFunctionName(insight));\n\n let detail: string;\n if (\"occCalls\" in insight) {\n const table = insight.occTableName\n ? ` on table ${chalk.cyan(insight.occTableName)}`\n : \"\";\n detail = `${insight.occCalls} OCC conflict${insight.occCalls !== 1 ? \"s\" : \"\"}${table}`;\n } else {\n detail = `${insight.count} occurrence${insight.count !== 1 ? \"s\" : \"\"}`;\n }\n\n let output = `${severity} ${kind}: ${fn} \u2014 ${detail}`;\n\n if (details && insight.recentEvents && insight.recentEvents.length > 0) {\n output += \"\\n\";\n for (const event of insight.recentEvents) {\n const time = chalk.dim(new Date(event.timestamp).toLocaleString());\n const reqId = chalk.dim(`req:${event.request_id}`);\n\n if (\"occ_retry_count\" in event) {\n const docId = event.occ_document_id\n ? ` doc:${event.occ_document_id}`\n : \"\";\n const source = event.occ_write_source\n ? ` source:${event.occ_write_source}`\n : \"\";\n output += ` ${time} ${reqId} retries:${event.occ_retry_count}${docId}${source}\\n`;\n } else {\n const status = event.success ? chalk.green(\"ok\") : chalk.red(\"fail\");\n const calls = event.calls\n .map(\n (c) =>\n `${c.table_name}(${c.documents_read} docs, ${c.bytes_read} bytes)`,\n )\n .join(\", \");\n output += ` ${time} ${reqId} ${status} ${calls}\\n`;\n }\n }\n }\n\n return output;\n}\n\nexport const insights = new Command(\"insights\")\n .summary(\"Show health insights for your deployment\")\n .description(\n [\n \"Show health insights for a Convex deployment over the last 72 hours.\",\n \"Displays OCC conflicts and resource limit issues that may indicate performance problems.\",\n \"\",\n \"\u2022 Show insights: `npx convex insights`\",\n \"\u2022 Include recent events for each insight: `npx convex insights --details`\",\n \"\u2022 Check the production deployment: `npx convex insights --prod`\",\n \"\",\n \"This command is only available for Convex cloud deployments when logged in as a user.\",\n ].join(\"\\n\"),\n )\n .allowExcessArguments(false)\n .option(\"--details\", \"Show recent events for each insight\", false)\n .addDeploymentSelectionOptions(actionDescription(\"Show insights for\"))\n .showHelpAfterError()\n .action(async (cmdOptions) => {\n const ctx = await oneoffContext(cmdOptions);\n\n const deploymentSelection = await getDeploymentSelection(ctx, cmdOptions);\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n\n const deploymentName = credentials.deploymentFields?.deploymentName ?? null;\n if (deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Insights are only available for cloud deployments. Local deployments do not have insights data.\",\n });\n }\n\n const auth = ctx.bigBrainAuth();\n if (\n auth === null ||\n auth.kind === \"deploymentKey\" ||\n auth.kind === \"projectKey\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Insights require to be logged in as a user. Deploy keys and project keys cannot access team usage data.\",\n });\n }\n\n const insightsList = await fetchInsights(ctx, deploymentName, {\n includeRecentEvents: cmdOptions.details,\n });\n\n const dashboardUrl = deploymentDashboardUrlPage(\n deploymentName,\n \"?view=insights\",\n );\n\n if (insightsList.length === 0) {\n logOutput(\n chalk.green(\n \"No issues found. The deployment is healthy over the last 72 hours.\",\n ),\n );\n } else {\n const errorCount = insightsList.filter(\n (i) => i.severity === \"error\",\n ).length;\n const warningCount = insightsList.filter(\n (i) => i.severity === \"warning\",\n ).length;\n\n const parts: string[] = [];\n if (errorCount > 0)\n parts.push(\n chalk.red(`${errorCount} error${errorCount > 1 ? \"s\" : \"\"}`),\n );\n if (warningCount > 0)\n parts.push(\n chalk.yellow(`${warningCount} warning${warningCount > 1 ? \"s\" : \"\"}`),\n );\n logOutput(`Found ${parts.join(\" and \")} in the last 72 hours:\\n`);\n\n for (const insight of insightsList) {\n logOutput(formatInsight(insight, cmdOptions.details));\n }\n }\n\n logOutput(`\\nDashboard: ${chalk.cyan(dashboardUrl)}`);\n });\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\n// eslint-disable-next-line no-restricted-imports -- stdout output uses default chalk\nimport chalk from \"chalk\";\nimport { oneoffContext } from \"../bundler/context.js\";\nimport { logOutput } from \"../bundler/log.js\";\nimport { loadSelectedDeploymentCredentials } from \"./lib/api.js\";\nimport { actionDescription } from \"./lib/command.js\";\nimport { deploymentDashboardUrlPage } from \"./lib/dashboard.js\";\nimport { getDeploymentSelection } from \"./lib/deploymentSelection.js\";\nimport { type Insight, fetchInsights } from \"./lib/insights.js\";\n\nfunction formatInsightKind(kind: string): string {\n switch (kind) {\n case \"occRetried\":\n return \"OCC Retried\";\n case \"occFailedPermanently\":\n return \"OCC Failed Permanently\";\n case \"bytesReadLimit\":\n return \"Bytes Read Limit Exceeded\";\n case \"bytesReadThreshold\":\n return \"Bytes Read Near Limit\";\n case \"documentsReadLimit\":\n return \"Documents Read Limit Exceeded\";\n case \"documentsReadThreshold\":\n return \"Documents Read Near Limit\";\n default:\n return kind;\n }\n}\n\nfunction formatFunctionName(insight: Insight): string {\n if (insight.componentPath) {\n return `${insight.componentPath}:${insight.functionId}`;\n }\n return insight.functionId;\n}\n\nfunction formatInsight(insight: Insight, details: boolean): string {\n const severity =\n insight.severity === \"error\"\n ? chalk.red(`[ERROR]`)\n : chalk.yellow(`[WARNING]`);\n const kind = formatInsightKind(insight.kind);\n const fn = chalk.bold(formatFunctionName(insight));\n\n let detail: string;\n if (\"occCalls\" in insight) {\n const table = insight.occTableName\n ? ` on table ${chalk.cyan(insight.occTableName)}`\n : \"\";\n detail = `${insight.occCalls} OCC conflict${insight.occCalls !== 1 ? \"s\" : \"\"}${table}`;\n } else {\n detail = `${insight.count} occurrence${insight.count !== 1 ? \"s\" : \"\"}`;\n }\n\n let output = `${severity} ${kind}: ${fn} \u2014 ${detail}`;\n\n if (details && insight.recentEvents && insight.recentEvents.length > 0) {\n output += \"\\n\";\n for (const event of insight.recentEvents) {\n const time = chalk.dim(new Date(event.timestamp).toLocaleString());\n const reqId = chalk.dim(`req:${event.request_id}`);\n\n if (\"occ_retry_count\" in event) {\n const docId = event.occ_document_id\n ? ` doc:${event.occ_document_id}`\n : \"\";\n const source = event.occ_write_source\n ? ` source:${event.occ_write_source}`\n : \"\";\n output += ` ${time} ${reqId} retries:${event.occ_retry_count}${docId}${source}\\n`;\n } else {\n const status = event.success ? chalk.green(\"ok\") : chalk.red(\"fail\");\n const calls = event.calls\n .map(\n (c) =>\n `${c.table_name}(${c.documents_read} docs, ${c.bytes_read} bytes)`,\n )\n .join(\", \");\n output += ` ${time} ${reqId} ${status} ${calls}\\n`;\n }\n }\n }\n\n return output;\n}\n\nexport const insights = new Command(\"insights\")\n .summary(\"Show health insights for your deployment\")\n .description(\n [\n \"Show health insights for a Convex deployment over the last 72 hours.\",\n \"Displays OCC conflicts and resource limit issues that may indicate performance problems.\",\n \"\",\n \"\u2022 Show insights: `npx convex insights`\",\n \"\u2022 Include recent events for each insight: `npx convex insights --details`\",\n \"\u2022 Check the production deployment: `npx convex insights --prod`\",\n \"\",\n \"This command is only available for Convex cloud deployments when logged in as a user.\",\n ].join(\"\\n\"),\n )\n .allowExcessArguments(false)\n .option(\"--details\", \"Show recent events for each insight\", false)\n .option(\"--json\", \"Output insights as JSON\", false)\n .addDeploymentSelectionOptions(actionDescription(\"Show insights for\"))\n .showHelpAfterError()\n .action(async (cmdOptions) => {\n const ctx = await oneoffContext(cmdOptions);\n\n const deploymentSelection = await getDeploymentSelection(ctx, cmdOptions);\n const credentials = await loadSelectedDeploymentCredentials(\n ctx,\n deploymentSelection,\n );\n\n const deploymentName = credentials.deploymentFields?.deploymentName ?? null;\n if (deploymentName === null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Insights are only available for cloud deployments. Local deployments do not have insights data.\",\n });\n }\n\n const auth = ctx.bigBrainAuth();\n if (\n auth === null ||\n auth.kind === \"deploymentKey\" ||\n auth.kind === \"projectKey\"\n ) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Insights require to be logged in as a user. Deploy keys and project keys cannot access team usage data.\",\n });\n }\n\n const insightsList = await fetchInsights(ctx, deploymentName, {\n includeRecentEvents: cmdOptions.details,\n });\n\n const dashboardUrl = deploymentDashboardUrlPage(\n deploymentName,\n \"?view=insights\",\n );\n\n if (cmdOptions.json) {\n logOutput(\n JSON.stringify(\n { deploymentName, dashboardUrl, insights: insightsList },\n null,\n 2,\n ),\n );\n return;\n }\n\n if (insightsList.length === 0) {\n logOutput(\n chalk.green(\n \"No issues found. The deployment is healthy over the last 72 hours.\",\n ),\n );\n } else {\n const errorCount = insightsList.filter(\n (i) => i.severity === \"error\",\n ).length;\n const warningCount = insightsList.filter(\n (i) => i.severity === \"warning\",\n ).length;\n\n const parts: string[] = [];\n if (errorCount > 0)\n parts.push(\n chalk.red(`${errorCount} error${errorCount > 1 ? \"s\" : \"\"}`),\n );\n if (warningCount > 0)\n parts.push(\n chalk.yellow(`${warningCount} warning${warningCount > 1 ? \"s\" : \"\"}`),\n );\n logOutput(`Found ${parts.join(\" and \")} in the last 72 hours:\\n`);\n\n for (const insight of insightsList) {\n logOutput(formatInsight(insight, cmdOptions.details));\n }\n }\n\n logOutput(`\\nDashboard: ${chalk.cyan(dashboardUrl)}`);\n });\n"],
5
+ "mappings": "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",
6
6
  "names": ["chalk"]
7
7
  }
@@ -144,13 +144,17 @@ async function envRemove(ctx, backend, name) {
144
144
  `Successfully unset ${import_chalk.chalkStderr.bold(name)}${backend.notice}`
145
145
  );
146
146
  }
147
- async function envList(ctx, backend) {
147
+ async function envList(ctx, backend, options) {
148
148
  const envs = await backend.list();
149
149
  if (envs.length === 0) {
150
150
  (0, import_log.logMessage)(`No environment variables set${backend.notice}`);
151
151
  return;
152
152
  }
153
153
  for (const { name, value } of envs) {
154
+ if (options?.namesOnly) {
155
+ (0, import_log.logOutput)(name);
156
+ continue;
157
+ }
154
158
  const { formatted, warning } = (0, import_formatEnvValueForDotfile.formatEnvValueForDotfile)(value);
155
159
  if (warning) {
156
160
  (0, import_log.logMessage)(`Warning (${name}): ${warning}`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/env.ts"],
4
- "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport * as dotenv from \"dotenv\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n logOutput,\n} from \"../../bundler/log.js\";\nimport { runSystemQuery } from \"./run.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"./utils/utils.js\";\nimport { readFromStdin } from \"./utils/stdin.js\";\nimport { promptSecret } from \"./utils/prompts.js\";\nimport {\n EXPECTED_CONVEX_URL_NAMES,\n EXPECTED_SITE_URL_NAMES,\n} from \"./envvars.js\";\nimport { formatEnvValueForDotfile } from \"./formatEnvValueForDotfile.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n} from \"./utils/utils.js\";\n\nfunction formatList(items: string[]): string {\n if (items.length === 0) return \"\";\n if (items.length === 1) return items[0];\n if (items.length === 2) return `${items[0]} and ${items[1]}`;\n return `${items.slice(0, -1).join(\", \")}, and ${items[items.length - 1]}`;\n}\n\nexport type EnvVarChange = {\n name: string;\n value: string | null; // null = delete\n};\n\nexport type EnvVar = {\n name: string;\n value: string;\n};\n\nexport interface EnvVarBackend {\n get(name: string): Promise<EnvVar | null>;\n list(): Promise<EnvVar[]>;\n update(changes: EnvVarChange[]): Promise<void>;\n notice: string;\n}\n\nexport function deploymentEnvBackend(\n ctx: Context,\n deployment: {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice?: string;\n },\n): EnvVarBackend {\n return {\n async get(name) {\n const envVar = (await runSystemQuery(ctx, {\n ...deployment,\n functionName: \"_system/cli/queryEnvironmentVariables:get\",\n componentPath: undefined,\n args: { name },\n })) as EnvVar | null;\n return envVar;\n },\n async list() {\n return (await runSystemQuery(ctx, {\n ...deployment,\n functionName: \"_system/cli/queryEnvironmentVariables\",\n componentPath: undefined,\n args: {},\n })) as EnvVar[];\n },\n async update(changes) {\n const fetch = deploymentFetch(ctx, deployment);\n try {\n await fetch(\"/api/update_environment_variables\", {\n body: JSON.stringify({ changes }),\n method: \"POST\",\n });\n } catch (e) {\n return await logAndHandleFetchError(ctx, e);\n }\n },\n notice: deployment.deploymentNotice ?? \"\",\n };\n}\n\nexport async function envSet(\n ctx: Context,\n backend: EnvVarBackend,\n originalName: string | undefined,\n originalValue: string | undefined,\n options?: {\n fromFile?: string;\n force?: boolean;\n secret?: boolean;\n },\n) {\n const { fromFile, force = false } = options ?? {};\n if (originalName) {\n let name = originalName,\n value: string;\n const parsed = await allowEqualsSyntax(ctx, originalName, originalValue);\n if (parsed) {\n [name, value] = parsed;\n } else if (fromFile) {\n value = await getFileContents(ctx, fromFile);\n } else if (!process.stdin.isTTY) {\n value = await getStdIn(ctx);\n } else {\n value = await promptSecret(ctx, {\n message: `Enter value for ${name}:`,\n });\n }\n await backend.update([{ name, value }]);\n if (options?.secret) {\n const formatted = /\\s/.test(value) ? `\"${value}\"` : value;\n logFinishedStep(\n `Successfully set ${chalkStderr.bold(name)} to ${chalkStderr.bold(formatted)}${backend.notice}`,\n );\n } else {\n logFinishedStep(\n `Successfully set ${chalkStderr.bold(name)}${backend.notice}`,\n );\n }\n return true;\n }\n let content: string, source: string;\n if (fromFile) {\n content = await getFileContents(ctx, fromFile);\n source = fromFile;\n } else if (!process.stdin.isTTY) {\n content = await getStdIn(ctx);\n source = \"stdin\";\n } else {\n return false;\n }\n await envSetFromContent(ctx, backend, {\n content,\n source,\n force,\n });\n return true;\n}\n\nexport async function envGet(\n ctx: Context,\n backend: EnvVarBackend,\n name: string,\n) {\n const envVar = await backend.get(name);\n if (envVar === null) {\n logFailure(`Environment variable \"${name}\" not found${backend.notice}`);\n return;\n }\n logOutput(`${envVar.value}`);\n}\n\nexport async function envRemove(\n ctx: Context,\n backend: EnvVarBackend,\n name: string,\n) {\n await backend.update([{ name, value: null }]);\n logFinishedStep(\n `Successfully unset ${chalkStderr.bold(name)}${backend.notice}`,\n );\n}\n\nexport async function envList(ctx: Context, backend: EnvVarBackend) {\n const envs = await backend.list();\n if (envs.length === 0) {\n logMessage(`No environment variables set${backend.notice}`);\n return;\n }\n for (const { name, value } of envs) {\n const { formatted, warning } = formatEnvValueForDotfile(value);\n if (warning) {\n logMessage(`Warning (${name}): ${warning}`);\n }\n logOutput(`${name}=${formatted}`);\n }\n}\n\nasync function getFileContents(\n ctx: Context,\n filePath: string,\n): Promise<string> {\n if (!ctx.fs.exists(filePath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: file not found: ${filePath}`,\n });\n }\n return ctx.fs.readUtf8File(filePath);\n}\n\nasync function getStdIn(ctx: Context): Promise<string> {\n try {\n return await readFromStdin();\n } catch (error) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: failed to read from stdin: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n}\n\nasync function envSetFromContent(\n ctx: Context,\n backend: EnvVarBackend,\n options: {\n content: string;\n source: string;\n force: boolean;\n },\n) {\n const { content, source, force } = options;\n const parsedEnv = dotenv.parse(content);\n\n // Filter out CLI-managed environment variables\n const envVars = Object.entries(parsedEnv);\n const filteredVars: string[] = [];\n\n const envVarsToSet: [string, string][] = [];\n const managedVars = new Set<string>([\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n ...EXPECTED_CONVEX_URL_NAMES,\n ...EXPECTED_SITE_URL_NAMES,\n ]);\n for (const [name, value] of envVars) {\n if (managedVars.has(name)) {\n filteredVars.push(name);\n } else {\n envVarsToSet.push([name, value]);\n }\n }\n\n if (filteredVars.length > 0) {\n const varNames = filteredVars.map((n) => chalkStderr.bold(n));\n const formattedNames = formatList(varNames);\n logMessage(\n `Skipping ${filteredVars.length} CLI-managed environment variable${filteredVars.length === 1 ? \"\" : \"s\"}: ${formattedNames}`,\n );\n }\n\n if (envVarsToSet.length === 0) {\n if (envVars.length === 0) {\n logMessage(`No environment variables found in ${source}.`);\n }\n return;\n }\n\n // Fetch existing environment variables\n const existingEnvVars = await backend.list();\n\n const existingEnvMap = new Map(\n existingEnvVars.map((env) => [env.name, env.value]),\n );\n\n // Categorize the environment variables\n const newVars: [string, string][] = [];\n const updatedVars: [string, string][] = [];\n const unchangedVars: [string, string][] = [];\n const conflicts: { name: string; existing: string; new: string }[] = [];\n\n for (const [name, value] of envVarsToSet) {\n const existingValue = existingEnvMap.get(name);\n if (existingValue === undefined) {\n newVars.push([name, value]);\n } else if (existingValue === value) {\n unchangedVars.push([name, value]);\n } else if (force) {\n updatedVars.push([name, value]);\n } else {\n conflicts.push({ name, existing: existingValue, new: value });\n }\n }\n\n // Check for conflicts if not replacing\n if (conflicts.length > 0) {\n const varNames = conflicts.map((c) => chalkStderr.bold(c.name));\n const formattedNames = formatList(varNames);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `error: environment variable${conflicts.length === 1 ? \"\" : \"s\"} ${formattedNames} already exist${conflicts.length === 1 ? \"s\" : \"\"} with different value${conflicts.length === 1 ? \"\" : \"s\"}.\\n\\n` +\n `Use ${chalkStderr.bold(\"--force\")} to overwrite existing values.`,\n });\n }\n\n // Build the changes: only new vars when not replacing, new + updated when replacing\n const varsToUpdate = force ? [...newVars, ...updatedVars] : newVars;\n const changes: EnvVarChange[] = varsToUpdate.map(([name, value]) => ({\n name,\n value,\n }));\n\n if (changes.length > 0) {\n await backend.update(changes);\n }\n\n const newCount = newVars.length;\n const updatedCount = updatedVars.length;\n const unchangedCount = unchangedVars.length;\n\n const parts = [];\n if (newCount > 0) parts.push(`${newCount} new`);\n if (updatedCount > 0) parts.push(`${updatedCount} updated`);\n if (unchangedCount > 0) parts.push(`${unchangedCount} unchanged`);\n\n const totalProcessed = newCount + updatedCount + unchangedCount;\n if (changes.length === 0) {\n logMessage(\n `All ${totalProcessed} environment variable${totalProcessed === 1 ? \"\" : \"s\"} from ${chalkStderr.bold(source)} already set${backend.notice}`,\n );\n } else {\n logFinishedStep(\n `Successfully set ${changes.length} environment variable${changes.length === 1 ? \"\" : \"s\"} from ${chalkStderr.bold(source)} (${parts.join(\", \")})${backend.notice}`,\n );\n }\n}\n\nasync function allowEqualsSyntax(\n ctx: Context,\n name: string,\n value: string | undefined,\n): Promise<[string, string] | null> {\n if (/^[a-zA-Z][a-zA-Z0-9_]*=/.test(name)) {\n const [n, ...values] = name.split(\"=\");\n if (value === undefined) {\n return [n, values.join(\"=\")];\n } else {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `When setting an environment variable, you can either set a value with 'NAME=value', or with NAME value, but not both. Are you missing quotes around the CLI argument? Try: \\n npx convex env set '${name} ${value}'`,\n });\n }\n }\n if (value === undefined) return null;\n return [name, value];\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport * as dotenv from \"dotenv\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n logOutput,\n} from \"../../bundler/log.js\";\nimport { runSystemQuery } from \"./run.js\";\nimport { deploymentFetch, logAndHandleFetchError } from \"./utils/utils.js\";\nimport { readFromStdin } from \"./utils/stdin.js\";\nimport { promptSecret } from \"./utils/prompts.js\";\nimport {\n EXPECTED_CONVEX_URL_NAMES,\n EXPECTED_SITE_URL_NAMES,\n} from \"./envvars.js\";\nimport { formatEnvValueForDotfile } from \"./formatEnvValueForDotfile.js\";\nimport {\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n} from \"./utils/utils.js\";\n\nfunction formatList(items: string[]): string {\n if (items.length === 0) return \"\";\n if (items.length === 1) return items[0];\n if (items.length === 2) return `${items[0]} and ${items[1]}`;\n return `${items.slice(0, -1).join(\", \")}, and ${items[items.length - 1]}`;\n}\n\nexport type EnvVarChange = {\n name: string;\n value: string | null; // null = delete\n};\n\nexport type EnvVar = {\n name: string;\n value: string;\n};\n\nexport interface EnvVarBackend {\n get(name: string): Promise<EnvVar | null>;\n list(): Promise<EnvVar[]>;\n update(changes: EnvVarChange[]): Promise<void>;\n notice: string;\n}\n\nexport function deploymentEnvBackend(\n ctx: Context,\n deployment: {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice?: string;\n },\n): EnvVarBackend {\n return {\n async get(name) {\n const envVar = (await runSystemQuery(ctx, {\n ...deployment,\n functionName: \"_system/cli/queryEnvironmentVariables:get\",\n componentPath: undefined,\n args: { name },\n })) as EnvVar | null;\n return envVar;\n },\n async list() {\n return (await runSystemQuery(ctx, {\n ...deployment,\n functionName: \"_system/cli/queryEnvironmentVariables\",\n componentPath: undefined,\n args: {},\n })) as EnvVar[];\n },\n async update(changes) {\n const fetch = deploymentFetch(ctx, deployment);\n try {\n await fetch(\"/api/update_environment_variables\", {\n body: JSON.stringify({ changes }),\n method: \"POST\",\n });\n } catch (e) {\n return await logAndHandleFetchError(ctx, e);\n }\n },\n notice: deployment.deploymentNotice ?? \"\",\n };\n}\n\nexport async function envSet(\n ctx: Context,\n backend: EnvVarBackend,\n originalName: string | undefined,\n originalValue: string | undefined,\n options?: {\n fromFile?: string;\n force?: boolean;\n secret?: boolean;\n },\n) {\n const { fromFile, force = false } = options ?? {};\n if (originalName) {\n let name = originalName,\n value: string;\n const parsed = await allowEqualsSyntax(ctx, originalName, originalValue);\n if (parsed) {\n [name, value] = parsed;\n } else if (fromFile) {\n value = await getFileContents(ctx, fromFile);\n } else if (!process.stdin.isTTY) {\n value = await getStdIn(ctx);\n } else {\n value = await promptSecret(ctx, {\n message: `Enter value for ${name}:`,\n });\n }\n await backend.update([{ name, value }]);\n if (options?.secret) {\n const formatted = /\\s/.test(value) ? `\"${value}\"` : value;\n logFinishedStep(\n `Successfully set ${chalkStderr.bold(name)} to ${chalkStderr.bold(formatted)}${backend.notice}`,\n );\n } else {\n logFinishedStep(\n `Successfully set ${chalkStderr.bold(name)}${backend.notice}`,\n );\n }\n return true;\n }\n let content: string, source: string;\n if (fromFile) {\n content = await getFileContents(ctx, fromFile);\n source = fromFile;\n } else if (!process.stdin.isTTY) {\n content = await getStdIn(ctx);\n source = \"stdin\";\n } else {\n return false;\n }\n await envSetFromContent(ctx, backend, {\n content,\n source,\n force,\n });\n return true;\n}\n\nexport async function envGet(\n ctx: Context,\n backend: EnvVarBackend,\n name: string,\n) {\n const envVar = await backend.get(name);\n if (envVar === null) {\n logFailure(`Environment variable \"${name}\" not found${backend.notice}`);\n return;\n }\n logOutput(`${envVar.value}`);\n}\n\nexport async function envRemove(\n ctx: Context,\n backend: EnvVarBackend,\n name: string,\n) {\n await backend.update([{ name, value: null }]);\n logFinishedStep(\n `Successfully unset ${chalkStderr.bold(name)}${backend.notice}`,\n );\n}\n\nexport async function envList(\n ctx: Context,\n backend: EnvVarBackend,\n options?: { namesOnly?: boolean },\n) {\n const envs = await backend.list();\n if (envs.length === 0) {\n logMessage(`No environment variables set${backend.notice}`);\n return;\n }\n for (const { name, value } of envs) {\n if (options?.namesOnly) {\n logOutput(name);\n continue;\n }\n const { formatted, warning } = formatEnvValueForDotfile(value);\n if (warning) {\n logMessage(`Warning (${name}): ${warning}`);\n }\n logOutput(`${name}=${formatted}`);\n }\n}\n\nasync function getFileContents(\n ctx: Context,\n filePath: string,\n): Promise<string> {\n if (!ctx.fs.exists(filePath)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: file not found: ${filePath}`,\n });\n }\n return ctx.fs.readUtf8File(filePath);\n}\n\nasync function getStdIn(ctx: Context): Promise<string> {\n try {\n return await readFromStdin();\n } catch (error) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `error: failed to read from stdin: ${error instanceof Error ? error.message : String(error)}`,\n });\n }\n}\n\nasync function envSetFromContent(\n ctx: Context,\n backend: EnvVarBackend,\n options: {\n content: string;\n source: string;\n force: boolean;\n },\n) {\n const { content, source, force } = options;\n const parsedEnv = dotenv.parse(content);\n\n // Filter out CLI-managed environment variables\n const envVars = Object.entries(parsedEnv);\n const filteredVars: string[] = [];\n\n const envVarsToSet: [string, string][] = [];\n const managedVars = new Set<string>([\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n ...EXPECTED_CONVEX_URL_NAMES,\n ...EXPECTED_SITE_URL_NAMES,\n ]);\n for (const [name, value] of envVars) {\n if (managedVars.has(name)) {\n filteredVars.push(name);\n } else {\n envVarsToSet.push([name, value]);\n }\n }\n\n if (filteredVars.length > 0) {\n const varNames = filteredVars.map((n) => chalkStderr.bold(n));\n const formattedNames = formatList(varNames);\n logMessage(\n `Skipping ${filteredVars.length} CLI-managed environment variable${filteredVars.length === 1 ? \"\" : \"s\"}: ${formattedNames}`,\n );\n }\n\n if (envVarsToSet.length === 0) {\n if (envVars.length === 0) {\n logMessage(`No environment variables found in ${source}.`);\n }\n return;\n }\n\n // Fetch existing environment variables\n const existingEnvVars = await backend.list();\n\n const existingEnvMap = new Map(\n existingEnvVars.map((env) => [env.name, env.value]),\n );\n\n // Categorize the environment variables\n const newVars: [string, string][] = [];\n const updatedVars: [string, string][] = [];\n const unchangedVars: [string, string][] = [];\n const conflicts: { name: string; existing: string; new: string }[] = [];\n\n for (const [name, value] of envVarsToSet) {\n const existingValue = existingEnvMap.get(name);\n if (existingValue === undefined) {\n newVars.push([name, value]);\n } else if (existingValue === value) {\n unchangedVars.push([name, value]);\n } else if (force) {\n updatedVars.push([name, value]);\n } else {\n conflicts.push({ name, existing: existingValue, new: value });\n }\n }\n\n // Check for conflicts if not replacing\n if (conflicts.length > 0) {\n const varNames = conflicts.map((c) => chalkStderr.bold(c.name));\n const formattedNames = formatList(varNames);\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `error: environment variable${conflicts.length === 1 ? \"\" : \"s\"} ${formattedNames} already exist${conflicts.length === 1 ? \"s\" : \"\"} with different value${conflicts.length === 1 ? \"\" : \"s\"}.\\n\\n` +\n `Use ${chalkStderr.bold(\"--force\")} to overwrite existing values.`,\n });\n }\n\n // Build the changes: only new vars when not replacing, new + updated when replacing\n const varsToUpdate = force ? [...newVars, ...updatedVars] : newVars;\n const changes: EnvVarChange[] = varsToUpdate.map(([name, value]) => ({\n name,\n value,\n }));\n\n if (changes.length > 0) {\n await backend.update(changes);\n }\n\n const newCount = newVars.length;\n const updatedCount = updatedVars.length;\n const unchangedCount = unchangedVars.length;\n\n const parts = [];\n if (newCount > 0) parts.push(`${newCount} new`);\n if (updatedCount > 0) parts.push(`${updatedCount} updated`);\n if (unchangedCount > 0) parts.push(`${unchangedCount} unchanged`);\n\n const totalProcessed = newCount + updatedCount + unchangedCount;\n if (changes.length === 0) {\n logMessage(\n `All ${totalProcessed} environment variable${totalProcessed === 1 ? \"\" : \"s\"} from ${chalkStderr.bold(source)} already set${backend.notice}`,\n );\n } else {\n logFinishedStep(\n `Successfully set ${changes.length} environment variable${changes.length === 1 ? \"\" : \"s\"} from ${chalkStderr.bold(source)} (${parts.join(\", \")})${backend.notice}`,\n );\n }\n}\n\nasync function allowEqualsSyntax(\n ctx: Context,\n name: string,\n value: string | undefined,\n): Promise<[string, string] | null> {\n if (/^[a-zA-Z][a-zA-Z0-9_]*=/.test(name)) {\n const [n, ...values] = name.split(\"=\");\n if (value === undefined) {\n return [n, values.join(\"=\")];\n } else {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `When setting an environment variable, you can either set a value with 'NAME=value', or with NAME value, but not both. Are you missing quotes around the CLI argument? Try: \\n npx convex env set '${name} ${value}'`,\n });\n }\n }\n if (value === undefined) return null;\n return [name, value];\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_utils"]
7
7
  }
@@ -283,18 +283,22 @@ async function performLogin(ctx, {
283
283
  printedMessage: null
284
284
  });
285
285
  }
286
- const authorizeArgs = {
287
- authnToken: accessToken,
288
- deviceName,
289
- anonymousId
290
- };
291
- const data = await (0, import_utils.bigBrainAPI)({
292
- ctx,
293
- method: "POST",
294
- path: "authorize",
295
- data: authorizeArgs
286
+ ctx._updateBigBrainAuth({
287
+ accessToken,
288
+ kind: "accessToken",
289
+ header: `Bearer ${accessToken}`
296
290
  });
297
- const globalConfig = { accessToken: data.accessToken };
291
+ const response = await (0, import_utils.typedPlatformClient)(ctx).POST(
292
+ "/create_personal_access_token",
293
+ {
294
+ // `anonymousId` links a prior anonymous session to this account. It's
295
+ // intentionally absent from the generated platform API types,
296
+ // so cast to pass it through.
297
+ body: { name: deviceName, anonymousId }
298
+ }
299
+ );
300
+ const newAccessToken = response.data.accessToken;
301
+ const globalConfig = { accessToken: newAccessToken };
298
302
  try {
299
303
  await (0, import_globalConfig.modifyGlobalConfig)(ctx, globalConfig);
300
304
  const path = (0, import_globalConfig.globalConfigPath)();
@@ -308,7 +312,7 @@ async function performLogin(ctx, {
308
312
  });
309
313
  }
310
314
  (0, import_log.logVerbose)(`performLogin: updating big brain auth after login`);
311
- await (0, import_deploymentSelection.updateBigBrainAuthAfterLogin)(ctx, data.accessToken);
315
+ await (0, import_deploymentSelection.updateBigBrainAuthAfterLogin)(ctx, newAccessToken);
312
316
  (0, import_log.logVerbose)(`performLogin: checking opt ins, acceptOptIns: ${acceptOptIns}`);
313
317
  const shouldContinue = await optins(ctx, acceptOptIns ?? false);
314
318
  if (!shouldContinue) {