convex 1.37.0 → 1.38.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 (218) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +1 -1
  4. package/dist/cjs/bundler/debugBundle.js +2 -1
  5. package/dist/cjs/bundler/debugBundle.js.map +2 -2
  6. package/dist/cjs/bundler/index.js +6 -3
  7. package/dist/cjs/bundler/index.js.map +2 -2
  8. package/dist/cjs/bundler/serverOnly.js +37 -0
  9. package/dist/cjs/bundler/serverOnly.js.map +7 -0
  10. package/dist/cjs/cli/configure.js +5 -32
  11. package/dist/cjs/cli/configure.js.map +2 -2
  12. package/dist/cjs/cli/deploy.js +1 -1
  13. package/dist/cjs/cli/deploy.js.map +1 -1
  14. package/dist/cjs/cli/deploymentCreate.js +21 -9
  15. package/dist/cjs/cli/deploymentCreate.js.map +2 -2
  16. package/dist/cjs/cli/deploymentSelect.js +25 -0
  17. package/dist/cjs/cli/deploymentSelect.js.map +2 -2
  18. package/dist/cjs/cli/deploymentTokenCreate.js +1 -1
  19. package/dist/cjs/cli/deploymentTokenCreate.js.map +2 -2
  20. package/dist/cjs/cli/deploymentTokenDelete.js +1 -1
  21. package/dist/cjs/cli/deploymentTokenDelete.js.map +2 -2
  22. package/dist/cjs/cli/index.js +5 -2
  23. package/dist/cjs/cli/index.js.map +2 -2
  24. package/dist/cjs/cli/lib/deploymentSelection.js +4 -7
  25. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  26. package/dist/cjs/cli/lib/env.js +1 -0
  27. package/dist/cjs/cli/lib/env.js.map +2 -2
  28. package/dist/cjs/cli/lib/localDeployment/anonymous.js +4 -4
  29. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  30. package/dist/cjs/cli/lib/localDeployment/errors.js +1 -1
  31. package/dist/cjs/cli/lib/localDeployment/errors.js.map +2 -2
  32. package/dist/cjs/cli/lib/localDeployment/localDeployment.js +64 -9
  33. package/dist/cjs/cli/lib/localDeployment/localDeployment.js.map +2 -2
  34. package/dist/cjs/cli/lib/localDeployment/utils.js +19 -7
  35. package/dist/cjs/cli/lib/localDeployment/utils.js.map +3 -3
  36. package/dist/cjs/cli/lib/utils/globalConfig.js +1 -2
  37. package/dist/cjs/cli/lib/utils/globalConfig.js.map +2 -2
  38. package/dist/cjs/cli/lib/utils/utils.js +8 -0
  39. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  40. package/dist/cjs/index.js +1 -1
  41. package/dist/cjs/index.js.map +1 -1
  42. package/dist/cjs/server/audit_logging.js +3 -1
  43. package/dist/cjs/server/audit_logging.js.map +2 -2
  44. package/dist/cjs/server/components/index.js +1 -12
  45. package/dist/cjs/server/components/index.js.map +2 -2
  46. package/dist/cjs/server/impl/registration_impl.js +8 -5
  47. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  48. package/dist/cjs/server/index.js.map +2 -2
  49. package/dist/cjs/server/log.js.map +2 -2
  50. package/dist/cjs/server/logVars.js.map +2 -2
  51. package/dist/cjs/server/meta.js.map +1 -1
  52. package/dist/cjs-types/bundler/debugBundle.d.ts.map +1 -1
  53. package/dist/cjs-types/bundler/index.d.ts.map +1 -1
  54. package/dist/cjs-types/bundler/serverOnly.d.ts +3 -0
  55. package/dist/cjs-types/bundler/serverOnly.d.ts.map +1 -0
  56. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  57. package/dist/cjs-types/cli/deploymentCreate.d.ts +4 -0
  58. package/dist/cjs-types/cli/deploymentCreate.d.ts.map +1 -1
  59. package/dist/cjs-types/cli/deploymentSelect.d.ts.map +1 -1
  60. package/dist/cjs-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  61. package/dist/cjs-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  62. package/dist/cjs-types/cli/lib/deployApi/componentDefinition.d.ts +6 -6
  63. package/dist/cjs-types/cli/lib/deployApi/modules.d.ts +6 -6
  64. package/dist/cjs-types/cli/lib/deployApi/startPush.d.ts +8 -8
  65. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  66. package/dist/cjs-types/cli/lib/env.d.ts.map +1 -1
  67. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  68. package/dist/cjs-types/cli/lib/localDeployment/errors.d.ts.map +1 -1
  69. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts +8 -0
  70. package/dist/cjs-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  71. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +13 -4
  72. package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  73. package/dist/cjs-types/cli/lib/utils/globalConfig.d.ts +0 -1
  74. package/dist/cjs-types/cli/lib/utils/globalConfig.d.ts.map +1 -1
  75. package/dist/cjs-types/cli/lib/utils/utils.d.ts +7 -0
  76. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  77. package/dist/cjs-types/index.d.ts +1 -1
  78. package/dist/cjs-types/server/audit_logging.d.ts +1 -0
  79. package/dist/cjs-types/server/audit_logging.d.ts.map +1 -1
  80. package/dist/cjs-types/server/components/index.d.ts.map +1 -1
  81. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  82. package/dist/cjs-types/server/index.d.ts +2 -0
  83. package/dist/cjs-types/server/index.d.ts.map +1 -1
  84. package/dist/cjs-types/server/log.d.ts +28 -0
  85. package/dist/cjs-types/server/log.d.ts.map +1 -1
  86. package/dist/cjs-types/server/logVars.d.ts +1 -0
  87. package/dist/cjs-types/server/logVars.d.ts.map +1 -1
  88. package/dist/cjs-types/server/meta.d.ts +2 -0
  89. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  90. package/dist/cli.bundle.cjs +1583 -1520
  91. package/dist/cli.bundle.cjs.map +4 -4
  92. package/dist/esm/bundler/debugBundle.js +2 -1
  93. package/dist/esm/bundler/debugBundle.js.map +2 -2
  94. package/dist/esm/bundler/index.js +6 -3
  95. package/dist/esm/bundler/index.js.map +2 -2
  96. package/dist/esm/bundler/serverOnly.js +15 -0
  97. package/dist/esm/bundler/serverOnly.js.map +7 -0
  98. package/dist/esm/cli/configure.js +5 -32
  99. package/dist/esm/cli/configure.js.map +2 -2
  100. package/dist/esm/cli/deploy.js +1 -1
  101. package/dist/esm/cli/deploy.js.map +1 -1
  102. package/dist/esm/cli/deploymentCreate.js +21 -10
  103. package/dist/esm/cli/deploymentCreate.js.map +2 -2
  104. package/dist/esm/cli/deploymentSelect.js +25 -0
  105. package/dist/esm/cli/deploymentSelect.js.map +2 -2
  106. package/dist/esm/cli/deploymentTokenCreate.js +2 -1
  107. package/dist/esm/cli/deploymentTokenCreate.js.map +2 -2
  108. package/dist/esm/cli/deploymentTokenDelete.js +2 -1
  109. package/dist/esm/cli/deploymentTokenDelete.js.map +2 -2
  110. package/dist/esm/cli/index.js +5 -2
  111. package/dist/esm/cli/index.js.map +2 -2
  112. package/dist/esm/cli/lib/deploymentSelection.js +5 -7
  113. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  114. package/dist/esm/cli/lib/env.js +2 -0
  115. package/dist/esm/cli/lib/env.js.map +2 -2
  116. package/dist/esm/cli/lib/localDeployment/anonymous.js +4 -4
  117. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  118. package/dist/esm/cli/lib/localDeployment/errors.js +1 -1
  119. package/dist/esm/cli/lib/localDeployment/errors.js.map +2 -2
  120. package/dist/esm/cli/lib/localDeployment/localDeployment.js +70 -11
  121. package/dist/esm/cli/lib/localDeployment/localDeployment.js.map +2 -2
  122. package/dist/esm/cli/lib/localDeployment/utils.js +19 -7
  123. package/dist/esm/cli/lib/localDeployment/utils.js.map +3 -3
  124. package/dist/esm/cli/lib/utils/globalConfig.js +1 -2
  125. package/dist/esm/cli/lib/utils/globalConfig.js.map +2 -2
  126. package/dist/esm/cli/lib/utils/utils.js +6 -0
  127. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  128. package/dist/esm/index.js +1 -1
  129. package/dist/esm/index.js.map +1 -1
  130. package/dist/esm/server/audit_logging.js +3 -1
  131. package/dist/esm/server/audit_logging.js.map +2 -2
  132. package/dist/esm/server/components/index.js +1 -12
  133. package/dist/esm/server/components/index.js.map +2 -2
  134. package/dist/esm/server/impl/registration_impl.js +8 -5
  135. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  136. package/dist/esm/server/index.js.map +2 -2
  137. package/dist/esm/server/log.js.map +2 -2
  138. package/dist/esm/server/logVars.js.map +2 -2
  139. package/dist/esm-types/bundler/debugBundle.d.ts.map +1 -1
  140. package/dist/esm-types/bundler/index.d.ts.map +1 -1
  141. package/dist/esm-types/bundler/serverOnly.d.ts +3 -0
  142. package/dist/esm-types/bundler/serverOnly.d.ts.map +1 -0
  143. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  144. package/dist/esm-types/cli/deploymentCreate.d.ts +4 -0
  145. package/dist/esm-types/cli/deploymentCreate.d.ts.map +1 -1
  146. package/dist/esm-types/cli/deploymentSelect.d.ts.map +1 -1
  147. package/dist/esm-types/cli/deploymentTokenCreate.d.ts.map +1 -1
  148. package/dist/esm-types/cli/deploymentTokenDelete.d.ts.map +1 -1
  149. package/dist/esm-types/cli/lib/deployApi/componentDefinition.d.ts +6 -6
  150. package/dist/esm-types/cli/lib/deployApi/modules.d.ts +6 -6
  151. package/dist/esm-types/cli/lib/deployApi/startPush.d.ts +8 -8
  152. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  153. package/dist/esm-types/cli/lib/env.d.ts.map +1 -1
  154. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  155. package/dist/esm-types/cli/lib/localDeployment/errors.d.ts.map +1 -1
  156. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts +8 -0
  157. package/dist/esm-types/cli/lib/localDeployment/localDeployment.d.ts.map +1 -1
  158. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +13 -4
  159. package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
  160. package/dist/esm-types/cli/lib/utils/globalConfig.d.ts +0 -1
  161. package/dist/esm-types/cli/lib/utils/globalConfig.d.ts.map +1 -1
  162. package/dist/esm-types/cli/lib/utils/utils.d.ts +7 -0
  163. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  164. package/dist/esm-types/index.d.ts +1 -1
  165. package/dist/esm-types/server/audit_logging.d.ts +1 -0
  166. package/dist/esm-types/server/audit_logging.d.ts.map +1 -1
  167. package/dist/esm-types/server/components/index.d.ts.map +1 -1
  168. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  169. package/dist/esm-types/server/index.d.ts +2 -0
  170. package/dist/esm-types/server/index.d.ts.map +1 -1
  171. package/dist/esm-types/server/log.d.ts +28 -0
  172. package/dist/esm-types/server/log.d.ts.map +1 -1
  173. package/dist/esm-types/server/logVars.d.ts +1 -0
  174. package/dist/esm-types/server/logVars.d.ts.map +1 -1
  175. package/dist/esm-types/server/meta.d.ts +2 -0
  176. package/dist/esm-types/server/meta.d.ts.map +1 -1
  177. package/dist/react.bundle.js +1 -1
  178. package/dist/react.bundle.js.map +1 -1
  179. package/package.json +1 -1
  180. package/schemas/convex.schema.json +1 -1
  181. package/src/bundler/debugBundle.ts +2 -1
  182. package/src/bundler/index.ts +7 -3
  183. package/src/bundler/serverOnly.ts +18 -0
  184. package/src/cli/configure.ts +2 -35
  185. package/src/cli/deploy.ts +1 -1
  186. package/src/cli/deploymentCreate.test.ts +4 -0
  187. package/src/cli/deploymentCreate.ts +23 -9
  188. package/src/cli/deploymentSelect.test.ts +60 -6
  189. package/src/cli/deploymentSelect.ts +34 -0
  190. package/src/cli/deploymentSelection.test.ts +72 -19
  191. package/src/cli/deploymentTokenCreate.ts +4 -1
  192. package/src/cli/deploymentTokenDelete.ts +9 -1
  193. package/src/cli/index.ts +6 -2
  194. package/src/cli/lib/deploymentSelection.ts +5 -7
  195. package/src/cli/lib/env.ts +2 -0
  196. package/src/cli/lib/localDeployment/anonymous.ts +5 -4
  197. package/src/cli/lib/localDeployment/errors.ts +1 -3
  198. package/src/cli/lib/localDeployment/localDeployment.ts +85 -10
  199. package/src/cli/lib/localDeployment/utils.ts +31 -7
  200. package/src/cli/lib/utils/globalConfig.ts +0 -3
  201. package/src/cli/lib/utils/utils.ts +15 -0
  202. package/src/index.ts +1 -1
  203. package/src/server/audit_logging.ts +2 -3
  204. package/src/server/components/index.ts +3 -15
  205. package/src/server/impl/registration_impl.ts +13 -7
  206. package/src/server/index.ts +0 -6
  207. package/src/server/log.ts +21 -3
  208. package/src/server/logVars.ts +0 -3
  209. package/src/server/meta.ts +0 -7
  210. package/dist/cjs/cli/disableLocalDev.js +0 -121
  211. package/dist/cjs/cli/disableLocalDev.js.map +0 -7
  212. package/dist/cjs-types/cli/disableLocalDev.d.ts +0 -6
  213. package/dist/cjs-types/cli/disableLocalDev.d.ts.map +0 -1
  214. package/dist/esm/cli/disableLocalDev.js +0 -105
  215. package/dist/esm/cli/disableLocalDev.js.map +0 -7
  216. package/dist/esm-types/cli/disableLocalDev.d.ts +0 -6
  217. package/dist/esm-types/cli/disableLocalDev.d.ts.map +0 -1
  218. package/src/cli/disableLocalDev.ts +0 -134
@@ -34,6 +34,7 @@ import {
34
34
  ENV_VAR_FILE_PATH,
35
35
  bigBrainAPI,
36
36
  processDeployKeyValue,
37
+ readDeployKeyFromEnv,
37
38
  typedPlatformClient,
38
39
  } from "./utils/utils.js";
39
40
  import * as dotenv from "dotenv";
@@ -94,7 +95,7 @@ export async function initializeBigBrainAuth(
94
95
  });
95
96
  }
96
97
  const config = dotenv.parse(existingFile);
97
- const rawDeployKey = config[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];
98
+ const rawDeployKey = readDeployKeyFromEnv((name) => config[name]);
98
99
  const deployKey = await processDeployKeyValue(ctx, rawDeployKey);
99
100
  if (deployKey !== undefined) {
100
101
  const bigBrainAuth = getBigBrainAuth(ctx, {
@@ -117,7 +118,7 @@ export async function initializeBigBrainAuth(
117
118
  }
118
119
  dotenv.config({ path: ENV_VAR_FILE_PATH });
119
120
  dotenv.config();
120
- const rawDeployKey = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];
121
+ const rawDeployKey = readDeployKeyFromEnv((name) => process.env[name]);
121
122
  const deployKey = await processDeployKeyValue(ctx, rawDeployKey);
122
123
  if (deployKey !== undefined) {
123
124
  const bigBrainAuth = getBigBrainAuth(ctx, {
@@ -518,11 +519,8 @@ async function getDeploymentSelectionFromEnv(
518
519
  ): Promise<
519
520
  { kind: "success"; metadata: DeploymentSelection } | { kind: "unknown" }
520
521
  > {
521
- const rawDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);
522
- const deployKey = await processDeployKeyValue(
523
- ctx,
524
- rawDeployKey === null ? undefined : rawDeployKey,
525
- );
522
+ const rawDeployKey = readDeployKeyFromEnv(getEnv);
523
+ const deployKey = await processDeployKeyValue(ctx, rawDeployKey);
526
524
  if (deployKey !== undefined) {
527
525
  const deployKeyType = isPreviewDeployKey(deployKey)
528
526
  ? "preview"
@@ -19,6 +19,7 @@ import { formatEnvValueForDotfile } from "./formatEnvValueForDotfile.js";
19
19
  import {
20
20
  CONVEX_DEPLOY_KEY_ENV_VAR_NAME,
21
21
  CONVEX_DEPLOYMENT_ENV_VAR_NAME,
22
+ CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,
22
23
  CONVEX_SELF_HOSTED_URL_VAR_NAME,
23
24
  CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,
24
25
  } from "./utils/utils.js";
@@ -230,6 +231,7 @@ async function envSetFromContent(
230
231
  const envVarsToSet: [string, string][] = [];
231
232
  const managedVars = new Set<string>([
232
233
  CONVEX_DEPLOY_KEY_ENV_VAR_NAME,
234
+ CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME,
233
235
  CONVEX_DEPLOYMENT_ENV_VAR_NAME,
234
236
  CONVEX_SELF_HOSTED_URL_VAR_NAME,
235
237
  CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,
@@ -147,10 +147,11 @@ export async function handleAnonymousDeployment(
147
147
  adminKey = data.adminKey;
148
148
  }
149
149
 
150
- const { cloudPort, sitePort } = await chooseLocalBackendPorts(
151
- ctx,
152
- options.ports,
153
- );
150
+ const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx, {
151
+ requestedPorts: options.ports,
152
+ suggestedPorts:
153
+ deployment.kind === "existing" ? deployment.config.ports : undefined,
154
+ });
154
155
  const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {
155
156
  await ensureBackendRunning(ctx, {
156
157
  cloudPort,
@@ -7,8 +7,6 @@ export function printLocalDeploymentOnError() {
7
7
  // ctx.crash.
8
8
  logFailure(`Hit an error while running local deployment.`);
9
9
  logMessage(
10
- "Your error has been reported to our team, and we'll be working on it. " +
11
- "To opt out, run `npx convex disable-local-deployments`. " +
12
- "Then re-run your original command.",
10
+ "Your error has been reported to our team, and we'll be working on it.",
13
11
  );
14
12
  }
@@ -1,5 +1,9 @@
1
1
  import { Context } from "../../../bundler/context.js";
2
- import { logVerbose } from "../../../bundler/log.js";
2
+ import {
3
+ logFinishedStep,
4
+ logVerbose,
5
+ showSpinner,
6
+ } from "../../../bundler/log.js";
3
7
  import {
4
8
  bigBrainPause,
5
9
  bigBrainRecordActivity,
@@ -19,6 +23,7 @@ import {
19
23
  ensureBackendStopped,
20
24
  localDeploymentUrl,
21
25
  runLocalBackend,
26
+ withRunningBackend,
22
27
  } from "./run.js";
23
28
  import { handlePotentialUpgrade } from "./upgrade.js";
24
29
  import { OnDeploymentActivityFunc } from "../deployment.js";
@@ -31,6 +36,10 @@ import {
31
36
  LOCAL_BACKEND_INSTANCE_SECRET,
32
37
  } from "./utils.js";
33
38
  import { ensureBackendBinaryDownloaded } from "./download.js";
39
+ import { defaultEnvBackend } from "../defaultEnv.js";
40
+ import { deploymentEnvBackend } from "../env.js";
41
+ import { getProjectDetails } from "../deploymentSelection.js";
42
+
34
43
  export type DeploymentDetails = {
35
44
  deploymentName: string;
36
45
  deploymentUrl: string;
@@ -61,7 +70,8 @@ export async function handleLocalDeployment(
61
70
  projectSlug: options.projectSlug,
62
71
  teamSlug: options.teamSlug,
63
72
  });
64
- if (existingDeploymentForProject === null) {
73
+ const isFirstTime = existingDeploymentForProject === null;
74
+ if (isFirstTime) {
65
75
  printLocalDeploymentWelcomeMessage();
66
76
  }
67
77
  ctx.registerCleanup(async (_exitCode, err) => {
@@ -93,10 +103,10 @@ export async function handleLocalDeployment(
93
103
  }
94
104
  : { kind: "version", version: options.backendVersion },
95
105
  );
96
- const { cloudPort, sitePort } = await chooseLocalBackendPorts(
97
- ctx,
98
- options.ports,
99
- );
106
+ const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx, {
107
+ requestedPorts: options.ports,
108
+ suggestedPorts: existingDeploymentForProject?.config.ports,
109
+ });
100
110
  const { deploymentName, adminKey } = await bigBrainStart(ctx, {
101
111
  port: cloudPort,
102
112
  projectSlug: options.projectSlug,
@@ -129,6 +139,16 @@ export async function handleLocalDeployment(
129
139
  forceUpgrade: options.forceUpgrade,
130
140
  });
131
141
 
142
+ if (isFirstTime) {
143
+ await importDefaultEnvVars(ctx, {
144
+ teamSlug: options.teamSlug,
145
+ projectSlug: options.projectSlug,
146
+ deploymentName,
147
+ deploymentUrl: localDeploymentUrl(cloudPort),
148
+ adminKey,
149
+ });
150
+ }
151
+
132
152
  // Periodically report activity to BigBrain every 60 seconds.
133
153
  // Uses self-scheduling setTimeout to avoid overlapping requests.
134
154
  let activityTimeout: ReturnType<typeof setTimeout> | null = null;
@@ -206,10 +226,11 @@ async function handleOffline(
206
226
  kind: "version",
207
227
  version: config.backendVersion,
208
228
  });
209
- const { cloudPort, sitePort } = await chooseLocalBackendPorts(
210
- ctx,
211
- options.ports,
212
- );
229
+ const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx, {
230
+ requestedPorts: options.ports,
231
+ // FIXME: This doesn’t try to reuse the ports already assigned in the config.
232
+ // Please update this if we ever support offline mode (currently this is dead code).
233
+ });
213
234
  saveDeploymentConfig(ctx, "local", deploymentName, config);
214
235
  await runLocalBackend(ctx, {
215
236
  binaryPath,
@@ -378,3 +399,57 @@ async function chooseFromExistingLocalDeployments(ctx: Context): Promise<{
378
399
  })),
379
400
  });
380
401
  }
402
+
403
+ /** Copies the default dev env vars from big brain the first time the local dev backend is started */
404
+ export async function importDefaultEnvVars(
405
+ ctx: Context,
406
+ {
407
+ teamSlug,
408
+ projectSlug,
409
+ deploymentName,
410
+ deploymentUrl,
411
+ adminKey,
412
+ }: {
413
+ teamSlug: string;
414
+ projectSlug: string;
415
+ deploymentName: string;
416
+ deploymentUrl: string;
417
+ adminKey: string;
418
+ },
419
+ ) {
420
+ showSpinner("Importing default env vars...");
421
+
422
+ const project = await getProjectDetails(ctx, {
423
+ kind: "teamAndProjectSlugs",
424
+ teamSlug,
425
+ projectSlug,
426
+ });
427
+ const defaults = await defaultEnvBackend(ctx, project.id, "dev").list();
428
+ if (defaults.length === 0) {
429
+ logFinishedStep("No default env vars to import.");
430
+ return;
431
+ }
432
+
433
+ const deployment = {
434
+ deploymentUrl,
435
+ deploymentFields: {
436
+ deploymentName,
437
+ deploymentType: "local" as const,
438
+ projectSlug,
439
+ teamSlug,
440
+ },
441
+ };
442
+
443
+ await withRunningBackend({
444
+ ctx,
445
+ deployment,
446
+ action: async () => {
447
+ await deploymentEnvBackend(ctx, { deploymentUrl, adminKey }).update(
448
+ defaults.map((v) => ({ name: v.name, value: v.value })),
449
+ );
450
+ logFinishedStep(
451
+ `Imported ${defaults.length} environment ${defaults.length === 1 ? "variable" : "variables"} from default environment variables: ${defaults.map((v) => v.name).join(", ")}`,
452
+ );
453
+ },
454
+ });
455
+ }
@@ -9,10 +9,14 @@ export async function choosePorts(
9
9
  {
10
10
  count,
11
11
  requestedPorts,
12
+ suggestedPorts,
12
13
  startPort,
13
14
  }: {
14
15
  count: number;
16
+ /** Ports that must mandatorily be used when provided. */
15
17
  requestedPorts?: Array<number | null>;
18
+ /** Ports that will be tried preferentially when provided, but are not required. */
19
+ suggestedPorts?: Array<number | null>;
16
20
  startPort: number;
17
21
  },
18
22
  ): Promise<Array<number>> {
@@ -30,6 +34,15 @@ export async function choosePorts(
30
34
  }
31
35
  ports.push(port);
32
36
  } else {
37
+ const suggestedPort = suggestedPorts?.[ports.length] ?? null;
38
+ if (suggestedPort !== null) {
39
+ const port = await detect(suggestedPort);
40
+ if (port === suggestedPort) {
41
+ ports.push(suggestedPort);
42
+ continue;
43
+ }
44
+ }
45
+
33
46
  const portToTry =
34
47
  ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;
35
48
  const port = await detect(portToTry);
@@ -41,12 +54,28 @@ export async function choosePorts(
41
54
 
42
55
  export async function chooseLocalBackendPorts(
43
56
  ctx: Context,
44
- ports?: { cloud?: number | null; site?: number | null },
57
+ options?: {
58
+ suggestedPorts?:
59
+ | { cloud?: number | null; site?: number | null }
60
+ | undefined;
61
+ requestedPorts?:
62
+ | { cloud?: number | null; site?: number | null }
63
+ | undefined;
64
+ },
45
65
  ): Promise<{ cloudPort: number; sitePort: number }> {
66
+ const { suggestedPorts, requestedPorts } = options ?? {};
67
+
46
68
  const [cloudPort, sitePort] = await choosePorts(ctx, {
47
69
  count: 2,
48
70
  startPort: 3210,
49
- requestedPorts: [ports?.cloud ?? null, ports?.site ?? null],
71
+ requestedPorts: [
72
+ requestedPorts?.cloud ?? null,
73
+ requestedPorts?.site ?? null,
74
+ ],
75
+ suggestedPorts: [
76
+ suggestedPorts?.cloud ?? null,
77
+ suggestedPorts?.site ?? null,
78
+ ],
50
79
  });
51
80
  return { cloudPort, sitePort };
52
81
  }
@@ -65,11 +94,6 @@ export function printLocalDeploymentWelcomeMessage() {
65
94
  "To learn more, read the docs: https://docs.convex.dev/cli/local-deployments",
66
95
  ),
67
96
  );
68
- logMessage(
69
- chalkStderr.cyan(
70
- "To opt out at any time, run `npx convex disable-local-deployments`",
71
- ),
72
- );
73
97
  }
74
98
 
75
99
  export function generateInstanceSecret(): string {
@@ -15,13 +15,10 @@ export function globalConfigPath(): string {
15
15
  // GlobalConfig is deleted on logout. It is primarily used for the accessToken.
16
16
  export type GlobalConfig = {
17
17
  accessToken: string;
18
- // Means "Don't use local dev unless CLI version is at least 1.19" (actual version TBD)
19
- optOutOfLocalDevDeploymentsUntilBetaOver?: boolean | undefined;
20
18
  };
21
19
 
22
20
  const schema = z.object({
23
21
  accessToken: z.string().min(1),
24
- optOutOfLocalDevDeploymentsUntilBetaOver: z.boolean().optional(),
25
22
  });
26
23
 
27
24
  export function readGlobalConfig(ctx: Context): GlobalConfig | null {
@@ -38,6 +38,8 @@ export const BIG_BRAIN_URL = `${provisionHost}/api/`;
38
38
  const PLATFORM_MANAGEMENT_API_URL = `${provisionHost}/v1/`;
39
39
  export const ENV_VAR_FILE_PATH = ".env.local";
40
40
  export const CONVEX_DEPLOY_KEY_ENV_VAR_NAME = "CONVEX_DEPLOY_KEY";
41
+ // Alias for CONVEX_DEPLOY_KEY. Accepted anywhere CONVEX_DEPLOY_KEY is.
42
+ export const CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME = "CONVEX_DEPLOYMENT_TOKEN";
41
43
  export const CONVEX_DEPLOYMENT_ENV_VAR_NAME = "CONVEX_DEPLOYMENT";
42
44
  export const CONVEX_SELF_HOSTED_URL_VAR_NAME = "CONVEX_SELF_HOSTED_URL";
43
45
  export const CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME =
@@ -85,6 +87,19 @@ export async function processDeployKeyValue(
85
87
  return deployKey;
86
88
  }
87
89
 
90
+ /**
91
+ * Reads the deploy key from environment variables, accepting either
92
+ * CONVEX_DEPLOY_KEY or its alias CONVEX_DEPLOYMENT_TOKEN. CONVEX_DEPLOY_KEY
93
+ * takes precedence when both are set.
94
+ */
95
+ export function readDeployKeyFromEnv(
96
+ getEnv: (name: string) => string | undefined | null,
97
+ ): string | undefined {
98
+ const fromDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);
99
+ const fromToken = getEnv(CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME);
100
+ return fromDeployKey || fromToken || undefined;
101
+ }
102
+
88
103
  export function parsePositiveInteger(value: string) {
89
104
  const parsedValue = parseInteger(value);
90
105
  if (parsedValue <= 0) {
package/src/index.ts CHANGED
@@ -1 +1 @@
1
- export const version = "1.37.0";
1
+ export const version = "1.38.0";
@@ -1,3 +1,4 @@
1
+ import { version } from "../index.js";
1
2
  import { performAsyncSyscall } from "./impl/syscall.js";
2
3
  import { LogVar, varNames } from "./logVars.js";
3
4
 
@@ -65,11 +66,9 @@ export function cloneWithSentinels(body: AuditLogBody): {
65
66
  return result;
66
67
  }
67
68
 
68
- /**
69
- * @internal
70
- */
71
69
  export const audit = async (body: AuditLogBody): Promise<void> => {
72
70
  await performAsyncSyscall("1.0/auditLog", {
73
71
  body: cloneWithSentinels(body),
72
+ version,
74
73
  });
75
74
  };
@@ -1,4 +1,4 @@
1
- import { PropertyValidators, convexToJson } from "../../values/index.js";
1
+ import { convexToJson } from "../../values/index.js";
2
2
  import { version } from "../../index.js";
3
3
  import {
4
4
  AnyFunctionReference,
@@ -151,7 +151,6 @@ type CommonDefinitionData = {
151
151
  };
152
152
 
153
153
  type ComponentDefinitionData = CommonDefinitionData & {
154
- _args: PropertyValidators;
155
154
  _name: string;
156
155
  _onInitCallbacks: Record<string, (argsStr: string) => string>;
157
156
  };
@@ -369,19 +368,10 @@ function serializeChildComponents(
369
368
  function exportComponentForAnalysis(
370
369
  this: ComponentDefinition<any> & ComponentDefinitionData,
371
370
  ): ComponentDefinitionAnalysis {
372
- const args: [string, { type: "value"; value: string }][] = Object.entries(
373
- this._args,
374
- ).map(([name, validator]) => [
375
- name,
376
- {
377
- type: "value",
378
- value: JSON.stringify(validator.json),
379
- },
380
- ]);
381
371
  const definitionType: ComponentDefinitionType = {
382
372
  type: "childComponent" as const,
383
373
  name: this._name,
384
- args,
374
+ args: [],
385
375
  };
386
376
  const childComponents = serializeChildComponents(this._childComponents);
387
377
  const httpMounts = buildHttpMounts(this._childComponents);
@@ -424,7 +414,6 @@ export function defineComponent<Exports extends ComponentExports = any>(
424
414
  const ret: RuntimeComponentDefinition = {
425
415
  _isRoot: false,
426
416
  _name: name,
427
- _args: {},
428
417
  _childComponents: [],
429
418
  _exportTree: {},
430
419
  _onInitCallbacks: {},
@@ -432,8 +421,7 @@ export function defineComponent<Exports extends ComponentExports = any>(
432
421
  export: exportComponentForAnalysis,
433
422
  use,
434
423
 
435
- // pretend to conform to ComponentDefinition, which temporarily expects __args
436
- ...({} as { __args: any; __exports: any }),
424
+ ...({} as { __exports: any }),
437
425
  };
438
426
  return ret as any as ComponentDefinition<Exports>;
439
427
  }
@@ -60,11 +60,12 @@ async function invokeMutation<
60
60
  scheduler: setupMutationScheduler(),
61
61
  meta: setupMutationMeta(visibility),
62
62
 
63
- runQuery: (reference: any, args?: any) => runUdf("query", reference, args),
64
- runSnapshotQuery: (reference: any, args?: any) =>
65
- runUdf("snapshotQuery", reference, args),
66
- runMutation: (reference: any, args?: any) =>
67
- runUdf("mutation", reference, args),
63
+ runQuery: (reference: any, args?: any, options?: any) =>
64
+ runUdf("query", reference, args, options?.transactionLimits),
65
+ runSnapshotQuery: (reference: any, args?: any, options?: any) =>
66
+ runUdf("snapshotQuery", reference, args, options?.transactionLimits),
67
+ runMutation: (reference: any, args?: any, options?: any) =>
68
+ runUdf("mutation", reference, args, options?.transactionLimits),
68
69
  };
69
70
  const result = await invokeFunction(func, mutationCtx, args as any);
70
71
  validateReturnValue(result);
@@ -337,7 +338,8 @@ async function invokeQuery<
337
338
  auth: setupAuth(requestId),
338
339
  storage: setupStorageReader(requestId),
339
340
  meta: setupQueryMeta(visibility),
340
- runQuery: (reference: any, args?: any) => runUdf("query", reference, args),
341
+ runQuery: (reference: any, args?: any, options?: any) =>
342
+ runUdf("query", reference, args, options?.transactionLimits),
341
343
  };
342
344
  const result = await invokeFunction(func, queryCtx, args as any);
343
345
  validateReturnValue(result);
@@ -750,13 +752,17 @@ async function runUdf(
750
752
  udfType: "query" | "mutation" | "snapshotQuery",
751
753
  f: any,
752
754
  args?: Record<string, Value>,
755
+ transactionLimits?: Record<string, number>,
753
756
  ): Promise<any> {
754
757
  const queryArgs = parseArgs(args);
755
- const syscallArgs = {
758
+ const syscallArgs: Record<string, any> = {
756
759
  udfType,
757
760
  args: convexToJson(queryArgs),
758
761
  ...getFunctionAddress(f),
759
762
  };
763
+ if (transactionLimits) {
764
+ syscallArgs.transactionLimits = transactionLimits;
765
+ }
760
766
  const result = await performAsyncSyscall("1.0/runUdf", syscallArgs);
761
767
  return jsonToConvex(result);
762
768
  }
@@ -204,13 +204,7 @@ export type {
204
204
  */
205
205
  export type { Index, SearchIndex, VectorIndex } from "./schema.js";
206
206
 
207
- /**
208
- * @internal
209
- */
210
207
  export { log } from "./log.js";
211
- /**
212
- * @internal
213
- */
214
208
  export type { AuditLogBody, AuditLogValue } from "./audit_logging.js";
215
209
 
216
210
  export type {
package/src/server/log.ts CHANGED
@@ -3,13 +3,31 @@ import { vars } from "./logVars.js";
3
3
 
4
4
  // Type annotations are needed for the `unique symbol` types in `vars` to typecheck correctly
5
5
  interface Log {
6
+ /**
7
+ * Emit a durable audit log. This functionality is only available for Convex
8
+ * Enterprise (see https://www.convex.dev/enterprise/pricing).
9
+ *
10
+ * Use dynamic variables from `log.vars` to include deferred values that will
11
+ * be resolved when emitting the log. Cached query hits will replay audit logs
12
+ * with updated values.
13
+ * ```ts
14
+ * await log.audit({
15
+ * action: "document.viewed",
16
+ * actor: { userId },
17
+ * source: {
18
+ * ip: log.vars.ip,
19
+ * userAgent: log.vars.userAgent,
20
+ * },
21
+ * timestamp: log.vars.now,
22
+ * });
23
+ * ```
24
+ *
25
+ * The log body must be JSON-serializable.
26
+ */
6
27
  audit: typeof audit;
7
28
  vars: typeof vars;
8
29
  }
9
30
 
10
- /**
11
- * @internal
12
- */
13
31
  export const log: Log = {
14
32
  audit,
15
33
  vars,
@@ -9,9 +9,6 @@ export type LogVar =
9
9
  | typeof USER_AGENT
10
10
  | typeof NOW;
11
11
 
12
- /**
13
- * @internal
14
- */
15
12
  export const varNames: Record<symbol, string> = {
16
13
  [REQUEST_ID]: "requestId",
17
14
  [IP]: "ip",
@@ -106,9 +106,6 @@ export interface QueryMeta {
106
106
  * @public
107
107
  */
108
108
  export interface MutationMeta extends QueryMeta {
109
- /**
110
- * @internal
111
- */
112
109
  getRequestMetadata(): Promise<RequestMetadata>;
113
110
  }
114
111
 
@@ -120,9 +117,5 @@ export interface MutationMeta extends QueryMeta {
120
117
  export interface ActionMeta {
121
118
  getFunctionMetadata(): Promise<FunctionMetadata>;
122
119
  getDeploymentMetadata(): Promise<DeploymentMetadata>;
123
-
124
- /**
125
- * @internal
126
- */
127
120
  getRequestMetadata(): Promise<RequestMetadata>;
128
121
  }
@@ -1,121 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
- var disableLocalDev_exports = {};
20
- __export(disableLocalDev_exports, {
21
- disableLocalDeployments: () => disableLocalDeployments
22
- });
23
- module.exports = __toCommonJS(disableLocalDev_exports);
24
- var import_extra_typings = require("@commander-js/extra-typings");
25
- var import_context = require("../bundler/context.js");
26
- var import_log = require("../bundler/log.js");
27
- var import_configure = require("./configure.js");
28
- var import_globalConfig = require("./lib/utils/globalConfig.js");
29
- var import_deploymentSelection = require("./lib/deploymentSelection.js");
30
- const disableLocalDeployments = new import_extra_typings.Command("disable-local-deployments").description(
31
- "Stop using a local deployment for the current project, or globally disable local depoyments with --global"
32
- ).option(
33
- "--global",
34
- "Disable local deployments on this machine until a future release when this feature is more stable."
35
- ).option("--undo-global", "Re-enable local deployments on this machine.").allowExcessArguments(false).action(async (cmdOptions) => {
36
- const ctx = await (0, import_context.oneoffContext)({
37
- url: void 0,
38
- adminKey: void 0,
39
- envFile: void 0
40
- });
41
- if (cmdOptions.undoGlobal) {
42
- return disableLocalDeploymentsGloballyUntilBetaOver(true);
43
- }
44
- if (cmdOptions.global) {
45
- return disableLocalDeploymentsGloballyUntilBetaOver(
46
- !!cmdOptions.undoGlobal
47
- );
48
- }
49
- const deploymentSelection = await (0, import_deploymentSelection.getDeploymentSelection)(ctx, {
50
- url: void 0,
51
- adminKey: void 0,
52
- envFile: void 0
53
- });
54
- const configuredDeployment = (0, import_deploymentSelection.deploymentNameAndTypeFromSelection)(deploymentSelection);
55
- if (configuredDeployment?.type !== null && configuredDeployment?.type !== "local") {
56
- (0, import_log.logFinishedStep)("Local development is already not being used.");
57
- return;
58
- }
59
- await (0, import_configure.deploymentCredentialsOrConfigure)(ctx, deploymentSelection, "ask", {
60
- prod: false,
61
- localOptions: {
62
- forceUpgrade: false
63
- },
64
- cloud: true
65
- });
66
- (0, import_log.logFinishedStep)(
67
- "You are no longer using a local deployment for development."
68
- );
69
- });
70
- async function disableLocalDeploymentsGloballyUntilBetaOver(reenable) {
71
- const ctx = await (0, import_context.oneoffContext)({
72
- url: void 0,
73
- adminKey: void 0,
74
- envFile: void 0
75
- });
76
- if (!process.stdin.isTTY) {
77
- return ctx.crash({
78
- exitCode: 1,
79
- errorType: "fatal",
80
- printedMessage: "`disable-local-deployments --global` is not for scripting, it is temporary and only for interactive use."
81
- });
82
- }
83
- const config = (0, import_globalConfig.readGlobalConfig)(ctx);
84
- if (config === null) {
85
- return ctx.crash({
86
- exitCode: 1,
87
- errorType: "fatal",
88
- printedMessage: "Log in first with `npx convex login"
89
- });
90
- }
91
- if (reenable) {
92
- if (!("optOutOfLocalDevDeploymentsUntilBetaOver" in config) || !config.optOutOfLocalDevDeploymentsUntilBetaOver) {
93
- (0, import_log.logFinishedStep)(
94
- "You are already opted into allowing local deployents on this machine."
95
- );
96
- return;
97
- }
98
- await (0, import_globalConfig.modifyGlobalConfig)(ctx, {
99
- ...config,
100
- optOutOfLocalDevDeploymentsUntilBetaOver: false
101
- });
102
- (0, import_log.logFinishedStep)(
103
- "You have been opted back into allowing local deployents on this machine."
104
- );
105
- return;
106
- }
107
- if ("optOutOfLocalDevDeploymentsUntilBetaOver" in config && config.optOutOfLocalDevDeploymentsUntilBetaOver) {
108
- (0, import_log.logFinishedStep)(
109
- "You are already opted out of local deployents on this machine."
110
- );
111
- return;
112
- }
113
- await (0, import_globalConfig.modifyGlobalConfig)(ctx, {
114
- ...config,
115
- optOutOfLocalDevDeploymentsUntilBetaOver: true
116
- });
117
- (0, import_log.logFinishedStep)(
118
- "You have been opted out of local deployents on this machine until the beta is over. Run `npx convex disable-local-deployments --undo-global` to opt back in."
119
- );
120
- }
121
- //# sourceMappingURL=disableLocalDev.js.map