convex 1.26.0-alpha.2 → 1.26.0-alpha.4

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 (252) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/dist/browser.bundle.js +102 -25
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/browser/http_client.js +2 -0
  5. package/dist/cjs/browser/http_client.js.map +2 -2
  6. package/dist/cjs/browser/logging.js +4 -4
  7. package/dist/cjs/browser/logging.js.map +2 -2
  8. package/dist/cjs/browser/simple_client.js +25 -0
  9. package/dist/cjs/browser/simple_client.js.map +2 -2
  10. package/dist/cjs/browser/sync/client.js +41 -2
  11. package/dist/cjs/browser/sync/client.js.map +2 -2
  12. package/dist/cjs/browser/sync/remote_query_set.js.map +2 -2
  13. package/dist/cjs/browser/sync/request_manager.js +8 -1
  14. package/dist/cjs/browser/sync/request_manager.js.map +2 -2
  15. package/dist/cjs/browser/sync/web_socket_manager.js +5 -1
  16. package/dist/cjs/browser/sync/web_socket_manager.js.map +2 -2
  17. package/dist/cjs/bundler/context.js.map +1 -1
  18. package/dist/cjs/bundler/debugBundle.js +31 -6
  19. package/dist/cjs/bundler/debugBundle.js.map +2 -2
  20. package/dist/cjs/bundler/depgraph.js +24 -26
  21. package/dist/cjs/bundler/depgraph.js.map +3 -3
  22. package/dist/cjs/cli/codegen_templates/api.js +51 -0
  23. package/dist/cjs/cli/codegen_templates/api.js.map +2 -2
  24. package/dist/cjs/cli/codegen_templates/readme.js +4 -4
  25. package/dist/cjs/cli/codegen_templates/readme.js.map +1 -1
  26. package/dist/cjs/cli/configure.js +11 -6
  27. package/dist/cjs/cli/configure.js.map +2 -2
  28. package/dist/cjs/cli/dev.js +5 -0
  29. package/dist/cjs/cli/dev.js.map +2 -2
  30. package/dist/cjs/cli/index.js +7 -3
  31. package/dist/cjs/cli/index.js.map +3 -3
  32. package/dist/cjs/cli/lib/codegen.js +33 -24
  33. package/dist/cjs/cli/lib/codegen.js.map +3 -3
  34. package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
  35. package/dist/cjs/cli/lib/envvars.js +29 -0
  36. package/dist/cjs/cli/lib/envvars.js.map +2 -2
  37. package/dist/cjs/cli/lib/localDeployment/anonymous.js +21 -7
  38. package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
  39. package/dist/cjs/cli/lib/mcp/tools/run.js +1 -1
  40. package/dist/cjs/cli/lib/mcp/tools/run.js.map +2 -2
  41. package/dist/cjs/cli/lib/networkTest.js +8 -2
  42. package/dist/cjs/cli/lib/networkTest.js.map +2 -2
  43. package/dist/cjs/cli/lib/usage.js +4 -4
  44. package/dist/cjs/cli/lib/usage.js.map +1 -1
  45. package/dist/cjs/cli/lib/utils/prompts.js +4 -4
  46. package/dist/cjs/cli/lib/utils/prompts.js.map +2 -2
  47. package/dist/cjs/index.js +1 -1
  48. package/dist/cjs/index.js.map +1 -1
  49. package/dist/cjs/nextjs/index.js +9 -1
  50. package/dist/cjs/nextjs/index.js.map +2 -2
  51. package/dist/cjs/react/client.js +37 -0
  52. package/dist/cjs/react/client.js.map +2 -2
  53. package/dist/cjs/react/index.js +1 -0
  54. package/dist/cjs/react/index.js.map +2 -2
  55. package/dist/cjs/server/database.js.map +1 -1
  56. package/dist/cjs/server/impl/database_impl.js +26 -20
  57. package/dist/cjs/server/impl/database_impl.js.map +2 -2
  58. package/dist/cjs/server/impl/registration_impl.js +10 -2
  59. package/dist/cjs/server/impl/registration_impl.js.map +2 -2
  60. package/dist/cjs/values/validators.js +19 -0
  61. package/dist/cjs/values/validators.js.map +2 -2
  62. package/dist/cjs-types/browser/http_client.d.ts +2 -0
  63. package/dist/cjs-types/browser/http_client.d.ts.map +1 -1
  64. package/dist/cjs-types/browser/logging.d.ts +7 -1
  65. package/dist/cjs-types/browser/logging.d.ts.map +1 -1
  66. package/dist/cjs-types/browser/simple_client.d.ts +19 -0
  67. package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
  68. package/dist/cjs-types/browser/sync/client.d.ts +21 -0
  69. package/dist/cjs-types/browser/sync/client.d.ts.map +1 -1
  70. package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts +5 -0
  71. package/dist/cjs-types/browser/sync/client_node_test_helpers.d.ts.map +1 -1
  72. package/dist/cjs-types/browser/sync/remote_query_set.d.ts +2 -0
  73. package/dist/cjs-types/browser/sync/remote_query_set.d.ts.map +1 -1
  74. package/dist/cjs-types/browser/sync/request_manager.d.ts +2 -1
  75. package/dist/cjs-types/browser/sync/request_manager.d.ts.map +1 -1
  76. package/dist/cjs-types/browser/sync/web_socket_manager.d.ts +2 -1
  77. package/dist/cjs-types/browser/sync/web_socket_manager.d.ts.map +1 -1
  78. package/dist/cjs-types/bundler/debugBundle.d.ts +4 -2
  79. package/dist/cjs-types/bundler/debugBundle.d.ts.map +1 -1
  80. package/dist/cjs-types/bundler/depgraph.d.ts +5 -4
  81. package/dist/cjs-types/bundler/depgraph.d.ts.map +1 -1
  82. package/dist/cjs-types/cli/codegen.d.ts +1 -1
  83. package/dist/cjs-types/cli/codegen_templates/api.d.ts.map +1 -1
  84. package/dist/cjs-types/cli/configure.d.ts.map +1 -1
  85. package/dist/cjs-types/cli/deploy.d.ts +1 -1
  86. package/dist/cjs-types/cli/dev.d.ts +1 -1
  87. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  88. package/dist/cjs-types/cli/lib/codegen.d.ts +1 -0
  89. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  90. package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  91. package/dist/cjs-types/cli/lib/envvars.d.ts +1 -0
  92. package/dist/cjs-types/cli/lib/envvars.d.ts.map +1 -1
  93. package/dist/cjs-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  94. package/dist/cjs-types/cli/lib/networkTest.d.ts.map +1 -1
  95. package/dist/cjs-types/cli/run.d.ts +1 -1
  96. package/dist/cjs-types/index.d.ts +1 -1
  97. package/dist/cjs-types/nextjs/index.d.ts +2 -2
  98. package/dist/cjs-types/react/client.d.ts +30 -0
  99. package/dist/cjs-types/react/client.d.ts.map +1 -1
  100. package/dist/cjs-types/react/index.d.ts +1 -1
  101. package/dist/cjs-types/react/index.d.ts.map +1 -1
  102. package/dist/cjs-types/server/database.d.ts.map +1 -1
  103. package/dist/cjs-types/server/database_api.test.d.ts +2 -0
  104. package/dist/cjs-types/server/database_api.test.d.ts.map +1 -0
  105. package/dist/cjs-types/server/impl/database_impl.d.ts.map +1 -1
  106. package/dist/cjs-types/server/impl/registration_impl.d.ts.map +1 -1
  107. package/dist/cjs-types/values/validators.d.ts.map +1 -1
  108. package/dist/cli.bundle.cjs +291 -97
  109. package/dist/cli.bundle.cjs.map +3 -3
  110. package/dist/esm/browser/http_client.js +2 -0
  111. package/dist/esm/browser/http_client.js.map +2 -2
  112. package/dist/esm/browser/logging.js +3 -3
  113. package/dist/esm/browser/logging.js.map +2 -2
  114. package/dist/esm/browser/simple_client.js +25 -0
  115. package/dist/esm/browser/simple_client.js.map +2 -2
  116. package/dist/esm/browser/sync/client.js +41 -2
  117. package/dist/esm/browser/sync/client.js.map +2 -2
  118. package/dist/esm/browser/sync/remote_query_set.js.map +2 -2
  119. package/dist/esm/browser/sync/request_manager.js +8 -1
  120. package/dist/esm/browser/sync/request_manager.js.map +2 -2
  121. package/dist/esm/browser/sync/web_socket_manager.js +5 -1
  122. package/dist/esm/browser/sync/web_socket_manager.js.map +2 -2
  123. package/dist/esm/bundler/context.js.map +1 -1
  124. package/dist/esm/bundler/debugBundle.js +33 -7
  125. package/dist/esm/bundler/debugBundle.js.map +2 -2
  126. package/dist/esm/bundler/depgraph.js +24 -26
  127. package/dist/esm/bundler/depgraph.js.map +3 -3
  128. package/dist/esm/cli/codegen_templates/api.js +51 -0
  129. package/dist/esm/cli/codegen_templates/api.js.map +2 -2
  130. package/dist/esm/cli/codegen_templates/readme.js +4 -4
  131. package/dist/esm/cli/codegen_templates/readme.js.map +1 -1
  132. package/dist/esm/cli/configure.js +12 -8
  133. package/dist/esm/cli/configure.js.map +2 -2
  134. package/dist/esm/cli/dev.js +5 -0
  135. package/dist/esm/cli/dev.js.map +2 -2
  136. package/dist/esm/cli/index.js +7 -3
  137. package/dist/esm/cli/index.js.map +2 -2
  138. package/dist/esm/cli/lib/codegen.js +33 -25
  139. package/dist/esm/cli/lib/codegen.js.map +3 -3
  140. package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
  141. package/dist/esm/cli/lib/envvars.js +28 -0
  142. package/dist/esm/cli/lib/envvars.js.map +2 -2
  143. package/dist/esm/cli/lib/localDeployment/anonymous.js +21 -7
  144. package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
  145. package/dist/esm/cli/lib/mcp/tools/run.js +2 -2
  146. package/dist/esm/cli/lib/mcp/tools/run.js.map +2 -2
  147. package/dist/esm/cli/lib/networkTest.js +9 -3
  148. package/dist/esm/cli/lib/networkTest.js.map +2 -2
  149. package/dist/esm/cli/lib/usage.js +4 -4
  150. package/dist/esm/cli/lib/usage.js.map +1 -1
  151. package/dist/esm/cli/lib/utils/prompts.js +4 -4
  152. package/dist/esm/cli/lib/utils/prompts.js.map +2 -2
  153. package/dist/esm/index.js +1 -1
  154. package/dist/esm/index.js.map +1 -1
  155. package/dist/esm/nextjs/index.js +9 -1
  156. package/dist/esm/nextjs/index.js.map +2 -2
  157. package/dist/esm/react/client.js +37 -1
  158. package/dist/esm/react/client.js.map +2 -2
  159. package/dist/esm/react/index.js +2 -1
  160. package/dist/esm/react/index.js.map +2 -2
  161. package/dist/esm/server/impl/database_impl.js +26 -20
  162. package/dist/esm/server/impl/database_impl.js.map +2 -2
  163. package/dist/esm/server/impl/registration_impl.js +10 -2
  164. package/dist/esm/server/impl/registration_impl.js.map +2 -2
  165. package/dist/esm/values/validators.js +19 -0
  166. package/dist/esm/values/validators.js.map +2 -2
  167. package/dist/esm-types/browser/http_client.d.ts +2 -0
  168. package/dist/esm-types/browser/http_client.d.ts.map +1 -1
  169. package/dist/esm-types/browser/logging.d.ts +7 -1
  170. package/dist/esm-types/browser/logging.d.ts.map +1 -1
  171. package/dist/esm-types/browser/simple_client.d.ts +19 -0
  172. package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
  173. package/dist/esm-types/browser/sync/client.d.ts +21 -0
  174. package/dist/esm-types/browser/sync/client.d.ts.map +1 -1
  175. package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts +5 -0
  176. package/dist/esm-types/browser/sync/client_node_test_helpers.d.ts.map +1 -1
  177. package/dist/esm-types/browser/sync/remote_query_set.d.ts +2 -0
  178. package/dist/esm-types/browser/sync/remote_query_set.d.ts.map +1 -1
  179. package/dist/esm-types/browser/sync/request_manager.d.ts +2 -1
  180. package/dist/esm-types/browser/sync/request_manager.d.ts.map +1 -1
  181. package/dist/esm-types/browser/sync/web_socket_manager.d.ts +2 -1
  182. package/dist/esm-types/browser/sync/web_socket_manager.d.ts.map +1 -1
  183. package/dist/esm-types/bundler/debugBundle.d.ts +4 -2
  184. package/dist/esm-types/bundler/debugBundle.d.ts.map +1 -1
  185. package/dist/esm-types/bundler/depgraph.d.ts +5 -4
  186. package/dist/esm-types/bundler/depgraph.d.ts.map +1 -1
  187. package/dist/esm-types/cli/codegen.d.ts +1 -1
  188. package/dist/esm-types/cli/codegen_templates/api.d.ts.map +1 -1
  189. package/dist/esm-types/cli/configure.d.ts.map +1 -1
  190. package/dist/esm-types/cli/deploy.d.ts +1 -1
  191. package/dist/esm-types/cli/dev.d.ts +1 -1
  192. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  193. package/dist/esm-types/cli/lib/codegen.d.ts +1 -0
  194. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  195. package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
  196. package/dist/esm-types/cli/lib/envvars.d.ts +1 -0
  197. package/dist/esm-types/cli/lib/envvars.d.ts.map +1 -1
  198. package/dist/esm-types/cli/lib/localDeployment/anonymous.d.ts.map +1 -1
  199. package/dist/esm-types/cli/lib/networkTest.d.ts.map +1 -1
  200. package/dist/esm-types/cli/run.d.ts +1 -1
  201. package/dist/esm-types/index.d.ts +1 -1
  202. package/dist/esm-types/nextjs/index.d.ts +2 -2
  203. package/dist/esm-types/react/client.d.ts +30 -0
  204. package/dist/esm-types/react/client.d.ts.map +1 -1
  205. package/dist/esm-types/react/index.d.ts +1 -1
  206. package/dist/esm-types/react/index.d.ts.map +1 -1
  207. package/dist/esm-types/server/database.d.ts.map +1 -1
  208. package/dist/esm-types/server/database_api.test.d.ts +2 -0
  209. package/dist/esm-types/server/database_api.test.d.ts.map +1 -0
  210. package/dist/esm-types/server/impl/database_impl.d.ts.map +1 -1
  211. package/dist/esm-types/server/impl/registration_impl.d.ts.map +1 -1
  212. package/dist/esm-types/values/validators.d.ts.map +1 -1
  213. package/dist/react.bundle.js +172 -84
  214. package/dist/react.bundle.js.map +4 -4
  215. package/package.json +3 -3
  216. package/src/browser/.claude/settings.local.json +1 -1
  217. package/src/browser/http_client.ts +2 -0
  218. package/src/browser/logging.ts +10 -3
  219. package/src/browser/simple_client.ts +29 -0
  220. package/src/browser/sync/client.ts +54 -1
  221. package/src/browser/sync/client_node.test.ts +415 -0
  222. package/src/browser/sync/client_node_test_helpers.ts +19 -0
  223. package/src/browser/sync/remote_query_set.ts +2 -0
  224. package/src/browser/sync/request_manager.test.ts +59 -1
  225. package/src/browser/sync/request_manager.ts +10 -1
  226. package/src/browser/sync/web_socket_manager.ts +4 -0
  227. package/src/bundler/context.ts +1 -1
  228. package/src/bundler/debugBundle.ts +32 -4
  229. package/src/bundler/depgraph.ts +39 -41
  230. package/src/cli/codegen_templates/api.ts +54 -0
  231. package/src/cli/codegen_templates/readme.ts +4 -4
  232. package/src/cli/configure.ts +27 -21
  233. package/src/cli/dev.ts +6 -0
  234. package/src/cli/index.ts +12 -3
  235. package/src/cli/lib/codegen.ts +11 -1
  236. package/src/cli/lib/deploymentSelection.ts +2 -0
  237. package/src/cli/lib/envvars.ts +42 -0
  238. package/src/cli/lib/localDeployment/anonymous.ts +25 -7
  239. package/src/cli/lib/mcp/tools/run.ts +2 -2
  240. package/src/cli/lib/networkTest.ts +10 -3
  241. package/src/cli/lib/usage.ts +4 -4
  242. package/src/cli/lib/utils/prompts.ts +4 -4
  243. package/src/index.ts +1 -1
  244. package/src/nextjs/index.ts +21 -3
  245. package/src/react/client.ts +62 -1
  246. package/src/react/index.ts +1 -0
  247. package/src/server/database.ts +71 -0
  248. package/src/server/database_api.test.ts +360 -0
  249. package/src/server/impl/database_impl.ts +37 -17
  250. package/src/server/impl/registration_impl.ts +10 -2
  251. package/src/values/validator.test.ts +71 -0
  252. package/src/values/validators.ts +24 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/codegen.ts"],
4
- "sourcesContent": ["import path from \"path\";\nimport prettier from \"prettier\";\nimport { withTmpDir, TempDir } from \"../../bundler/fs.js\";\nimport { entryPoints } from \"../../bundler/index.js\";\nimport { apiCodegen } from \"../codegen_templates/api.js\";\nimport { apiCjsCodegen } from \"../codegen_templates/api_cjs.js\";\nimport {\n dynamicDataModelDTS,\n noSchemaDataModelDTS,\n staticDataModelDTS,\n} from \"../codegen_templates/dataModel.js\";\nimport { readmeCodegen } from \"../codegen_templates/readme.js\";\nimport { serverCodegen } from \"../codegen_templates/server.js\";\nimport { tsconfigCodegen } from \"../codegen_templates/tsconfig.js\";\nimport {\n Context,\n logError,\n logMessage,\n logOutput,\n logVerbose,\n} from \"../../bundler/context.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport {\n componentServerDTS,\n componentServerJS,\n componentServerStubDTS,\n} from \"../codegen_templates/component_server.js\";\nimport { ComponentDirectory } from \"./components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"./deployApi/startPush.js\";\nimport {\n componentApiDTS,\n componentApiJs,\n componentApiStubDTS,\n rootComponentApiCJS,\n} from \"../codegen_templates/component_api.js\";\n\nexport type CodegenOptions = {\n url?: string;\n adminKey?: string;\n dryRun: boolean;\n debug: boolean;\n typecheck: TypeCheckMode;\n init: boolean;\n commonjs: boolean;\n liveComponentSources: boolean;\n debugNodeApis: boolean;\n};\n\nexport async function doInitCodegen(\n ctx: Context,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<void> {\n await prepareForCodegen(ctx, functionsDir, opts);\n await withTmpDir(async (tmpDir) => {\n await doReadmeCodegen(ctx, tmpDir, functionsDir, skipIfExists, opts);\n await doTsconfigCodegen(ctx, tmpDir, functionsDir, skipIfExists, opts);\n });\n}\n\nasync function prepareForCodegen(\n ctx: Context,\n functionsDir: string,\n opts?: { dryRun?: boolean },\n) {\n // Delete the old _generated.ts because v0.1.2 used to put the react generated\n // code there\n const legacyCodegenPath = path.join(functionsDir, \"_generated.ts\");\n if (ctx.fs.exists(legacyCodegenPath)) {\n if (opts?.dryRun) {\n logError(\n ctx,\n `Command would delete legacy codegen file: ${legacyCodegenPath}}`,\n );\n } else {\n logError(ctx, `Deleting legacy codegen file: ${legacyCodegenPath}}`);\n ctx.fs.unlink(legacyCodegenPath);\n }\n }\n\n // Create the codegen dir if it doesn't already exist.\n const codegenDir = path.join(functionsDir, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n return codegenDir;\n}\n\nexport async function doCodegen(\n ctx: Context,\n functionsDir: string,\n typeCheckMode: TypeCheckMode,\n opts?: { dryRun?: boolean; generateCommonJSApi?: boolean; debug?: boolean },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n const codegenDir = await prepareForCodegen(ctx, functionsDir, opts);\n\n await withTmpDir(async (tmpDir) => {\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const schemaFiles = await doDataModelCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n opts,\n );\n writtenFiles.push(...schemaFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await doServerCodegen(ctx, tmpDir, codegenDir, opts);\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doApiCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n\n // Generated code is updated, typecheck the query and mutation functions.\n await typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir);\n });\n}\n\nexport async function doInitialComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n opts?: {\n dryRun?: boolean;\n generateCommonJSApi?: boolean;\n debug?: boolean;\n verbose?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n // This component defined in a dist directory; it is probably in a node_module\n // directory, installed from a package. It is stuck with the files it has.\n // Heuristics for this:\n // - component definition has a dist/ directory as an ancestor\n // - component definition is a .js file\n // - presence of .js.map files\n // We may improve this heuristic.\n const isPublishedPackage =\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot;\n if (isPublishedPackage) {\n if (opts?.verbose) {\n logMessage(\n ctx,\n `skipping initial codegen for installed package ${componentDirectory.path}`,\n );\n }\n return;\n }\n\n const codegenDir = await prepareForCodegen(\n ctx,\n componentDirectory.path,\n opts,\n );\n\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const dataModelFiles = await doInitialComponentDataModelCodegen(\n ctx,\n tmpDir,\n componentDirectory,\n codegenDir,\n opts,\n );\n writtenFiles.push(...dataModelFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await doInitialComponentServerCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doInitialComponentApiCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n}\n\nexport async function doFinalComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n startPushResponse: StartPushResponse,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n generateCommonJSApi?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const isPublishedPackage =\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot;\n if (isPublishedPackage) {\n return;\n }\n\n const codegenDir = path.join(componentDirectory.path, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n\n // `dataModel.d.ts`, `server.d.ts` and `api.d.ts` depend on analyze results, where we\n // replace the stub generated during initial codegen with a more precise type.\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n let dataModelContents: string;\n if (hasSchemaFile) {\n if (projectConfig.codegen.staticDataModel) {\n dataModelContents = await staticDataModelDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n } else {\n dataModelContents = dynamicDataModelDTS();\n }\n } else {\n dataModelContents = noSchemaDataModelDTS();\n }\n const dataModelDTSPath = path.join(codegenDir, \"dataModel.d.ts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContents,\n \"typescript\",\n dataModelDTSPath,\n opts,\n );\n\n const serverDTSPath = path.join(codegenDir, \"server.d.ts\");\n const serverContents = await componentServerDTS(componentDirectory);\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContents,\n \"typescript\",\n serverDTSPath,\n opts,\n );\n\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiContents = await componentApiDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n { staticApi: projectConfig.codegen.staticApi },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n\n if (opts?.generateCommonJSApi || projectConfig.generateCommonJSApi) {\n const apiCjsDTSPath = path.join(codegenDir, \"api_cjs.d.ts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiCjsDTSPath,\n opts,\n );\n }\n}\n\nasync function doReadmeCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const readmePath = path.join(functionsDir, \"README.md\");\n if (skipIfExists && ctx.fs.exists(readmePath)) {\n logVerbose(ctx, `Not overwriting README.md.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n readmeCodegen(),\n \"markdown\",\n readmePath,\n opts,\n );\n}\n\nasync function doTsconfigCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const tsconfigPath = path.join(functionsDir, \"tsconfig.json\");\n if (skipIfExists && ctx.fs.exists(tsconfigPath)) {\n logVerbose(ctx, `Not overwriting tsconfig.json.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n tsconfigCodegen(),\n \"json\",\n tsconfigPath,\n opts,\n );\n}\n\nfunction schemaFileExists(ctx: Context, functionsDir: string) {\n let schemaPath = path.join(functionsDir, \"schema.ts\");\n let hasSchemaFile = ctx.fs.exists(schemaPath);\n if (!hasSchemaFile) {\n schemaPath = path.join(functionsDir, \"schema.js\");\n hasSchemaFile = ctx.fs.exists(schemaPath);\n }\n return hasSchemaFile;\n}\n\nasync function doDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, functionsDir);\n const schemaContent = hasSchemaFile\n ? dynamicDataModelDTS()\n : noSchemaDataModelDTS();\n\n await writeFormattedFile(\n ctx,\n tmpDir,\n schemaContent,\n \"typescript\",\n path.join(codegenDir, \"dataModel.d.ts\"),\n opts,\n );\n return [\"dataModel.d.ts\"];\n}\n\nasync function doServerCodegen(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const serverContent = serverCodegen();\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.JS,\n \"typescript\",\n path.join(codegenDir, \"server.js\"),\n opts,\n );\n\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.DTS,\n \"typescript\",\n path.join(codegenDir, \"server.d.ts\"),\n opts,\n );\n\n return [\"server.js\", \"server.d.ts\"];\n}\n\nasync function doInitialComponentServerCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentServerJS(),\n \"typescript\",\n path.join(codegenDir, \"server.js\"),\n opts,\n );\n\n // Don't write our stub if the file already exists: It probably\n // has better type information than this stub.\n const serverDTSPath = path.join(codegenDir, \"server.d.ts\");\n if (!ctx.fs.exists(serverDTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentServerStubDTS(isRoot),\n \"typescript\",\n path.join(codegenDir, \"server.d.ts\"),\n opts,\n );\n }\n\n return [\"server.js\", \"server.d.ts\"];\n}\n\nasync function doInitialComponentDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n codegenDir: string,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n const dataModelContext = hasSchemaFile\n ? dynamicDataModelDTS()\n : noSchemaDataModelDTS();\n const dataModelPath = path.join(codegenDir, \"dataModel.d.ts\");\n\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentDataModelCodegen`.\n if (!ctx.fs.exists(dataModelPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContext,\n \"typescript\",\n dataModelPath,\n opts,\n );\n }\n return [\"dataModel.d.ts\"];\n}\n\nasync function doInitialComponentApiCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const apiJS = componentApiJs();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiJS,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n\n // Don't write the `.d.ts` stub if it already exists.\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiStubDTS = componentApiStubDTS();\n if (!ctx.fs.exists(apiDTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n }\n\n const writtenFiles = [\"api.js\", \"api.d.ts\"];\n\n if (generateCommonJSApi && isRoot) {\n const apiCjsJS = rootComponentApiCJS();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsJS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n\n const cjsStubPath = path.join(codegenDir, \"api_cjs.d.cts\");\n if (!ctx.fs.exists(cjsStubPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n cjsStubPath,\n opts,\n );\n }\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n\n return writtenFiles;\n}\n\nasync function doApiCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const absModulePaths = await entryPoints(ctx, functionsDir);\n const modulePaths = absModulePaths.map((p) => path.relative(functionsDir, p));\n\n const apiContent = apiCodegen(modulePaths);\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.JS,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.DTS,\n \"typescript\",\n path.join(codegenDir, \"api.d.ts\"),\n opts,\n );\n const writtenFiles = [\"api.js\", \"api.d.ts\"];\n\n if (generateCommonJSApi) {\n const apiCjsContent = apiCjsCodegen(modulePaths);\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.JS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.DTS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.d.cts\"),\n opts,\n );\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n\n return writtenFiles;\n}\n\nasync function writeFormattedFile(\n ctx: Context,\n tmpDir: TempDir,\n contents: string,\n filetype: string,\n destination: string,\n options?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n // Run prettier so we don't have to think about formatting!\n //\n // This is a little sketchy because we are using the default prettier config\n // (not our user's one) but it's better than nothing.\n const formattedContents = await prettier.format(contents, {\n parser: filetype,\n pluginSearchDirs: false,\n });\n if (options?.debug) {\n // NB: The `test_codegen_projects_are_up_to_date` smoke test depends\n // on this output format.\n logOutput(ctx, `# ${path.resolve(destination)}`);\n logOutput(ctx, formattedContents);\n return;\n }\n try {\n const existing = ctx.fs.readUtf8File(destination);\n if (existing === formattedContents) {\n return;\n }\n } catch (err: any) {\n if (err.code !== \"ENOENT\") {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n }\n if (options?.dryRun) {\n logOutput(ctx, `Command would write file: ${destination}`);\n return;\n }\n const tmpPath = tmpDir.writeUtf8File(formattedContents);\n ctx.fs.swapTmpFile(tmpPath, destination);\n}\n"],
5
- "mappings": "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",
6
- "names": ["path", "prettier"]
4
+ "sourcesContent": ["import path from \"path\";\nimport prettier from \"prettier\";\nimport { withTmpDir, TempDir } from \"../../bundler/fs.js\";\nimport { entryPoints } from \"../../bundler/index.js\";\nimport { apiCodegen } from \"../codegen_templates/api.js\";\nimport { apiCjsCodegen } from \"../codegen_templates/api_cjs.js\";\nimport {\n dynamicDataModelDTS,\n noSchemaDataModelDTS,\n staticDataModelDTS,\n} from \"../codegen_templates/dataModel.js\";\nimport { readmeCodegen } from \"../codegen_templates/readme.js\";\nimport { serverCodegen } from \"../codegen_templates/server.js\";\nimport { tsconfigCodegen } from \"../codegen_templates/tsconfig.js\";\nimport {\n Context,\n logError,\n logMessage,\n logOutput,\n logVerbose,\n} from \"../../bundler/context.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport { configFilepath, readProjectConfig } from \"./config.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport {\n componentServerDTS,\n componentServerJS,\n componentServerStubDTS,\n} from \"../codegen_templates/component_server.js\";\nimport { ComponentDirectory } from \"./components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"./deployApi/startPush.js\";\nimport {\n componentApiDTS,\n componentApiJs,\n componentApiStubDTS,\n rootComponentApiCJS,\n} from \"../codegen_templates/component_api.js\";\nimport { functionsDir } from \"./utils/utils.js\";\n\nexport type CodegenOptions = {\n url?: string;\n adminKey?: string;\n dryRun: boolean;\n debug: boolean;\n typecheck: TypeCheckMode;\n init: boolean;\n commonjs: boolean;\n liveComponentSources: boolean;\n debugNodeApis: boolean;\n};\n\nexport async function doCodegenForNewProject(ctx: Context) {\n const { projectConfig: existingProjectConfig } = await readProjectConfig(ctx);\n const configPath = await configFilepath(ctx);\n const functionsPath = functionsDir(configPath, existingProjectConfig);\n await doInitCodegen(ctx, functionsPath, true);\n // Disable typechecking since there isn't any code yet.\n await doCodegen(ctx, functionsPath, \"disable\");\n}\n\nexport async function doInitCodegen(\n ctx: Context,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<void> {\n await prepareForCodegen(ctx, functionsDir, opts);\n await withTmpDir(async (tmpDir) => {\n await doReadmeCodegen(ctx, tmpDir, functionsDir, skipIfExists, opts);\n await doTsconfigCodegen(ctx, tmpDir, functionsDir, skipIfExists, opts);\n });\n}\n\nasync function prepareForCodegen(\n ctx: Context,\n functionsDir: string,\n opts?: { dryRun?: boolean },\n) {\n // Delete the old _generated.ts because v0.1.2 used to put the react generated\n // code there\n const legacyCodegenPath = path.join(functionsDir, \"_generated.ts\");\n if (ctx.fs.exists(legacyCodegenPath)) {\n if (opts?.dryRun) {\n logError(\n ctx,\n `Command would delete legacy codegen file: ${legacyCodegenPath}}`,\n );\n } else {\n logError(ctx, `Deleting legacy codegen file: ${legacyCodegenPath}}`);\n ctx.fs.unlink(legacyCodegenPath);\n }\n }\n\n // Create the codegen dir if it doesn't already exist.\n const codegenDir = path.join(functionsDir, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n return codegenDir;\n}\n\nexport async function doCodegen(\n ctx: Context,\n functionsDir: string,\n typeCheckMode: TypeCheckMode,\n opts?: { dryRun?: boolean; generateCommonJSApi?: boolean; debug?: boolean },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n const codegenDir = await prepareForCodegen(ctx, functionsDir, opts);\n\n await withTmpDir(async (tmpDir) => {\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const schemaFiles = await doDataModelCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n opts,\n );\n writtenFiles.push(...schemaFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await doServerCodegen(ctx, tmpDir, codegenDir, opts);\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doApiCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n\n // Generated code is updated, typecheck the query and mutation functions.\n await typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir);\n });\n}\n\nexport async function doInitialComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n opts?: {\n dryRun?: boolean;\n generateCommonJSApi?: boolean;\n debug?: boolean;\n verbose?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n // This component defined in a dist directory; it is probably in a node_module\n // directory, installed from a package. It is stuck with the files it has.\n // Heuristics for this:\n // - component definition has a dist/ directory as an ancestor\n // - component definition is a .js file\n // - presence of .js.map files\n // We may improve this heuristic.\n const isPublishedPackage =\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot;\n if (isPublishedPackage) {\n if (opts?.verbose) {\n logMessage(\n ctx,\n `skipping initial codegen for installed package ${componentDirectory.path}`,\n );\n }\n return;\n }\n\n const codegenDir = await prepareForCodegen(\n ctx,\n componentDirectory.path,\n opts,\n );\n\n // Write files in dependency order so a watching dev server doesn't\n // see inconsistent results where a file we write imports from a\n // file that doesn't exist yet. We'll collect all the paths we write\n // and then delete any remaining paths at the end.\n const writtenFiles = [];\n\n // First, `dataModel.d.ts` imports from the developer's `schema.js` file.\n const dataModelFiles = await doInitialComponentDataModelCodegen(\n ctx,\n tmpDir,\n componentDirectory,\n codegenDir,\n opts,\n );\n writtenFiles.push(...dataModelFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await doInitialComponentServerCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n opts,\n );\n writtenFiles.push(...serverFiles);\n\n // The `api.d.ts` file imports from the developer's modules, which then\n // import from `server.d.ts`. Note that there's a cycle here, since the\n // developer's modules could also import from the `api.{js,d.ts}` files.\n const apiFiles = await doInitialComponentApiCodegen(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n}\n\nexport async function doFinalComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n startPushResponse: StartPushResponse,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n generateCommonJSApi?: boolean;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const isPublishedPackage =\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot;\n if (isPublishedPackage) {\n return;\n }\n\n const codegenDir = path.join(componentDirectory.path, \"_generated\");\n ctx.fs.mkdir(codegenDir, { allowExisting: true, recursive: true });\n\n // `dataModel.d.ts`, `server.d.ts` and `api.d.ts` depend on analyze results, where we\n // replace the stub generated during initial codegen with a more precise type.\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n let dataModelContents: string;\n if (hasSchemaFile) {\n if (projectConfig.codegen.staticDataModel) {\n dataModelContents = await staticDataModelDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n } else {\n dataModelContents = dynamicDataModelDTS();\n }\n } else {\n dataModelContents = noSchemaDataModelDTS();\n }\n const dataModelDTSPath = path.join(codegenDir, \"dataModel.d.ts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContents,\n \"typescript\",\n dataModelDTSPath,\n opts,\n );\n\n const serverDTSPath = path.join(codegenDir, \"server.d.ts\");\n const serverContents = await componentServerDTS(componentDirectory);\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContents,\n \"typescript\",\n serverDTSPath,\n opts,\n );\n\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiContents = await componentApiDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n { staticApi: projectConfig.codegen.staticApi },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n\n if (opts?.generateCommonJSApi || projectConfig.generateCommonJSApi) {\n const apiCjsDTSPath = path.join(codegenDir, \"api_cjs.d.ts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiCjsDTSPath,\n opts,\n );\n }\n}\n\nasync function doReadmeCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const readmePath = path.join(functionsDir, \"README.md\");\n if (skipIfExists && ctx.fs.exists(readmePath)) {\n logVerbose(ctx, `Not overwriting README.md.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n readmeCodegen(),\n \"markdown\",\n readmePath,\n opts,\n );\n}\n\nasync function doTsconfigCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skipIfExists: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const tsconfigPath = path.join(functionsDir, \"tsconfig.json\");\n if (skipIfExists && ctx.fs.exists(tsconfigPath)) {\n logVerbose(ctx, `Not overwriting tsconfig.json.`);\n return;\n }\n await writeFormattedFile(\n ctx,\n tmpDir,\n tsconfigCodegen(),\n \"json\",\n tsconfigPath,\n opts,\n );\n}\n\nfunction schemaFileExists(ctx: Context, functionsDir: string) {\n let schemaPath = path.join(functionsDir, \"schema.ts\");\n let hasSchemaFile = ctx.fs.exists(schemaPath);\n if (!hasSchemaFile) {\n schemaPath = path.join(functionsDir, \"schema.js\");\n hasSchemaFile = ctx.fs.exists(schemaPath);\n }\n return hasSchemaFile;\n}\n\nasync function doDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, functionsDir);\n const schemaContent = hasSchemaFile\n ? dynamicDataModelDTS()\n : noSchemaDataModelDTS();\n\n await writeFormattedFile(\n ctx,\n tmpDir,\n schemaContent,\n \"typescript\",\n path.join(codegenDir, \"dataModel.d.ts\"),\n opts,\n );\n return [\"dataModel.d.ts\"];\n}\n\nasync function doServerCodegen(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const serverContent = serverCodegen();\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.JS,\n \"typescript\",\n path.join(codegenDir, \"server.js\"),\n opts,\n );\n\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.DTS,\n \"typescript\",\n path.join(codegenDir, \"server.d.ts\"),\n opts,\n );\n\n return [\"server.js\", \"server.d.ts\"];\n}\n\nasync function doInitialComponentServerCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentServerJS(),\n \"typescript\",\n path.join(codegenDir, \"server.js\"),\n opts,\n );\n\n // Don't write our stub if the file already exists: It probably\n // has better type information than this stub.\n const serverDTSPath = path.join(codegenDir, \"server.d.ts\");\n if (!ctx.fs.exists(serverDTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentServerStubDTS(isRoot),\n \"typescript\",\n path.join(codegenDir, \"server.d.ts\"),\n opts,\n );\n }\n\n return [\"server.js\", \"server.d.ts\"];\n}\n\nasync function doInitialComponentDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n codegenDir: string,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n const dataModelContext = hasSchemaFile\n ? dynamicDataModelDTS()\n : noSchemaDataModelDTS();\n const dataModelPath = path.join(codegenDir, \"dataModel.d.ts\");\n\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentDataModelCodegen`.\n if (!ctx.fs.exists(dataModelPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContext,\n \"typescript\",\n dataModelPath,\n opts,\n );\n }\n return [\"dataModel.d.ts\"];\n}\n\nasync function doInitialComponentApiCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const apiJS = componentApiJs();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiJS,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n\n // Don't write the `.d.ts` stub if it already exists.\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiStubDTS = componentApiStubDTS();\n if (!ctx.fs.exists(apiDTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n apiDTSPath,\n opts,\n );\n }\n\n const writtenFiles = [\"api.js\", \"api.d.ts\"];\n\n if (generateCommonJSApi && isRoot) {\n const apiCjsJS = rootComponentApiCJS();\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsJS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n\n const cjsStubPath = path.join(codegenDir, \"api_cjs.d.cts\");\n if (!ctx.fs.exists(cjsStubPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiStubDTS,\n \"typescript\",\n cjsStubPath,\n opts,\n );\n }\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n\n return writtenFiles;\n}\n\nasync function doApiCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const absModulePaths = await entryPoints(ctx, functionsDir);\n const modulePaths = absModulePaths.map((p) => path.relative(functionsDir, p));\n\n const apiContent = apiCodegen(modulePaths);\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.JS,\n \"typescript\",\n path.join(codegenDir, \"api.js\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.DTS,\n \"typescript\",\n path.join(codegenDir, \"api.d.ts\"),\n opts,\n );\n const writtenFiles = [\"api.js\", \"api.d.ts\"];\n\n if (generateCommonJSApi) {\n const apiCjsContent = apiCjsCodegen(modulePaths);\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.JS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.cjs\"),\n opts,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiCjsContent.DTS,\n \"typescript\",\n path.join(codegenDir, \"api_cjs.d.cts\"),\n opts,\n );\n writtenFiles.push(\"api_cjs.cjs\", \"api_cjs.d.cts\");\n }\n\n return writtenFiles;\n}\n\nasync function writeFormattedFile(\n ctx: Context,\n tmpDir: TempDir,\n contents: string,\n filetype: string,\n destination: string,\n options?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n // Run prettier so we don't have to think about formatting!\n //\n // This is a little sketchy because we are using the default prettier config\n // (not our user's one) but it's better than nothing.\n const formattedContents = await prettier.format(contents, {\n parser: filetype,\n pluginSearchDirs: false,\n });\n if (options?.debug) {\n // NB: The `test_codegen_projects_are_up_to_date` smoke test depends\n // on this output format.\n logOutput(ctx, `# ${path.resolve(destination)}`);\n logOutput(ctx, formattedContents);\n return;\n }\n try {\n const existing = ctx.fs.readUtf8File(destination);\n if (existing === formattedContents) {\n return;\n }\n } catch (err: any) {\n if (err.code !== \"ENOENT\") {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n }\n if (options?.dryRun) {\n logOutput(ctx, `Command would write file: ${destination}`);\n return;\n }\n const tmpPath = tmpDir.writeUtf8File(formattedContents);\n ctx.fs.swapTmpFile(tmpPath, destination);\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["functionsDir", "path", "prettier"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/deploymentSelection.ts"],
4
- "sourcesContent": ["import { BigBrainAuth, Context, logVerbose } from \"../../bundler/context.js\";\nimport {\n AccountRequiredDeploymentType,\n DeploymentType,\n fetchTeamAndProjectForKey,\n} from \"./api.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport {\n deploymentNameFromAdminKeyOrCrash,\n deploymentTypeFromAdminKey,\n getDeploymentTypeFromConfiguredDeployment,\n isAnonymousDeployment,\n isPreviewDeployKey,\n isProjectKey,\n stripDeploymentTypePrefix,\n} from \"./deployment.js\";\nimport { buildEnvironment } from \"./envvars.js\";\nimport { readGlobalConfig } from \"./utils/globalConfig.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n ENV_VAR_FILE_PATH,\n bigBrainAPI,\n} from \"./utils/utils.js\";\nimport * as dotenv from \"dotenv\";\n\n// ----------------------------------------------------------------------------\n// Big Brain Auth\n// ----------------------------------------------------------------------------\n\n/**\n * The auth header can be a few different things:\n * * An access token (corresponds to device authorization, usually stored in `~/.convex/config.json`)\n * * A preview deploy key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A project key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n *\n * Project keys take precedence over the the access token.\n *\n * We check for the `CONVEX_DEPLOY_KEY` in the `--env-file` if it's provided.\n * Otherwise, we check in the `.env` and `.env.local` files.\n *\n * If we later prompt for log in, we need to call `ctx.setBigBrainAuthHeader` to\n * update the value.\n *\n * @param ctx\n * @param envFile\n * @returns\n */\nexport async function initializeBigBrainAuth(\n ctx: Context,\n initialArgs: {\n url?: string;\n adminKey?: string;\n envFile?: string;\n },\n): Promise<void> {\n if (initialArgs.url !== undefined && initialArgs.adminKey !== undefined) {\n // Do not check any env vars if `url` and `adminKey` are specified via CLI\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n }),\n );\n return;\n }\n if (initialArgs.envFile !== undefined) {\n const existingFile = ctx.fs.exists(initialArgs.envFile)\n ? ctx.fs.readUtf8File(initialArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const deployKey = config[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n }\n return;\n }\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n dotenv.config();\n const deployKey = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n }),\n );\n return;\n}\n\nexport async function updateBigBrainAuthAfterLogin(\n ctx: Context,\n accessToken: string,\n) {\n const existingAuth = ctx.bigBrainAuth();\n if (existingAuth !== null && existingAuth.kind === \"projectKey\") {\n logVerbose(\n ctx,\n `Ignoring update to big brain auth since project key takes precedence`,\n );\n return;\n }\n ctx._updateBigBrainAuth({\n accessToken: accessToken,\n kind: \"accessToken\",\n header: `Bearer ${accessToken}`,\n });\n}\n\nexport async function clearBigBrainAuth(ctx: Context) {\n ctx._updateBigBrainAuth(null);\n}\n\nfunction getBigBrainAuth(\n ctx: Context,\n opts: {\n previewDeployKey: string | null;\n projectKey: string | null;\n },\n): BigBrainAuth | null {\n if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n return {\n accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,\n kind: \"accessToken\",\n header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,\n };\n }\n if (opts.projectKey !== null) {\n // Project keys take precedence over global config.\n return {\n header: `Bearer ${opts.projectKey}`,\n kind: \"projectKey\",\n projectKey: opts.projectKey,\n };\n }\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig) {\n return {\n kind: \"accessToken\",\n header: `Bearer ${globalConfig.accessToken}`,\n accessToken: globalConfig.accessToken,\n };\n }\n if (opts.previewDeployKey !== null) {\n return {\n header: `Bearer ${opts.previewDeployKey}`,\n kind: \"previewDeployKey\",\n previewDeployKey: opts.previewDeployKey,\n };\n }\n return null;\n}\n\n// ----------------------------------------------------------------------------\n// Deployment Selection\n// ----------------------------------------------------------------------------\n/**\n * Our CLI has logic to select which deployment to act on.\n *\n * We first check whether we're targeting a deployment within a project, or if we\n * know exactly which deployment to act on (e.g. in the case of self-hosting).\n *\n * We also special case preview deploys since the presence of a preview deploy key\n * triggers different behavior in `npx convex deploy`.\n *\n * Most commands will immediately compute the deployment selection, and then combine\n * that with any relevant CLI flags to figure out which deployment to talk to.\n *\n * Different commands do different things (e.g. `dev` will allow you to create a new project,\n * `deploy` has different behavior for preview deploys)\n *\n * This should be kept in sync with `initializeBigBrainAuth` since environment variables\n * like `CONVEX_DEPLOY_KEY` are used for both deployment selection and auth.\n */\nexport type DeploymentSelection =\n | {\n kind: \"existingDeployment\";\n deploymentToActOn: {\n url: string;\n adminKey: string;\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n } | null;\n source: \"selfHosted\" | \"deployKey\" | \"cliArgs\";\n };\n }\n | {\n kind: \"deploymentWithinProject\";\n targetProject: ProjectSelection;\n }\n | {\n kind: \"preview\";\n previewDeployKey: string;\n }\n | {\n kind: \"chooseProject\";\n }\n | {\n kind: \"anonymous\";\n deploymentName: string | null;\n };\n\nexport type ProjectSelection =\n | {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n }\n | {\n kind: \"deploymentName\";\n deploymentName: string;\n deploymentType: AccountRequiredDeploymentType | null;\n }\n | {\n kind: \"projectDeployKey\";\n projectDeployKey: string;\n };\n\nexport async function getDeploymentSelection(\n ctx: Context,\n cliArgs: {\n url?: string;\n adminKey?: string;\n envFile?: string;\n },\n): Promise<DeploymentSelection> {\n const metadata = await _getDeploymentSelection(ctx, cliArgs);\n logDeploymentSelection(ctx, metadata);\n return metadata;\n}\n\nfunction logDeploymentSelection(ctx: Context, selection: DeploymentSelection) {\n switch (selection.kind) {\n case \"existingDeployment\": {\n logVerbose(\n ctx,\n `Existing deployment: ${selection.deploymentToActOn.url} ${selection.deploymentToActOn.source}`,\n );\n break;\n }\n case \"deploymentWithinProject\": {\n logVerbose(\n ctx,\n `Deployment within project: ${prettyProjectSelection(selection.targetProject)}`,\n );\n break;\n }\n case \"preview\": {\n logVerbose(ctx, `Preview deploy key`);\n break;\n }\n case \"chooseProject\": {\n logVerbose(ctx, `Choose project`);\n break;\n }\n case \"anonymous\": {\n logVerbose(\n ctx,\n `Anonymous, has selected deployment?: ${selection.deploymentName !== null}`,\n );\n break;\n }\n default: {\n const _exhaustivenessCheck: never = selection;\n logVerbose(ctx, `Unknown deployment selection`);\n }\n }\n return null;\n}\n\nfunction prettyProjectSelection(selection: ProjectSelection) {\n switch (selection.kind) {\n case \"teamAndProjectSlugs\": {\n return `Team and project slugs: ${selection.teamSlug} ${selection.projectSlug}`;\n }\n case \"deploymentName\": {\n return `Deployment name: ${selection.deploymentName}`;\n }\n case \"projectDeployKey\": {\n return `Project deploy key`;\n }\n default: {\n const _exhaustivenessCheck: never = selection;\n return `Unknown`;\n }\n }\n}\n\nasync function _getDeploymentSelection(\n ctx: Context,\n cliArgs: {\n url?: string;\n adminKey?: string;\n envFile?: string;\n },\n): Promise<DeploymentSelection> {\n /*\n - url + adminKey specified via CLI\n - Do not check any env vars (including ones relevant for auth)\n */\n if (cliArgs.url && cliArgs.adminKey) {\n return {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: cliArgs.url,\n adminKey: cliArgs.adminKey,\n deploymentFields: null,\n source: \"cliArgs\",\n },\n };\n }\n\n if (cliArgs.envFile) {\n // If an `--env-file` is specified, it must contain enough information for both auth and deployment selection.\n logVerbose(ctx, `Checking env file: ${cliArgs.envFile}`);\n const existingFile = ctx.fs.exists(cliArgs.envFile)\n ? ctx.fs.readUtf8File(cliArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const result = await getDeploymentSelectionFromEnv(ctx, (name) =>\n config[name] === undefined || config[name] === \"\" ? null : config[name],\n );\n if (result.kind === \"unknown\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage:\n `env file \\`${cliArgs.envFile}\\` did not contain environment variables for a Convex deployment. ` +\n `Expected \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\`, \\`${CONVEX_DEPLOYMENT_ENV_VAR_NAME}\\`, or both \\`${CONVEX_SELF_HOSTED_URL_VAR_NAME}\\` and \\`${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME}\\` to be set.`,\n });\n }\n return result.metadata;\n }\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n dotenv.config();\n const result = await getDeploymentSelectionFromEnv(ctx, (name) => {\n const value = process.env[name];\n if (value === undefined || value === \"\") {\n return null;\n }\n return value;\n });\n if (result.kind !== \"unknown\") {\n return result.metadata;\n }\n // none of these?\n\n // Check the `convex.json` for a configured team and project\n const { projectConfig } = await readProjectConfig(ctx);\n if (projectConfig.team !== undefined && projectConfig.project !== undefined) {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: projectConfig.team,\n projectSlug: projectConfig.project,\n },\n };\n }\n\n // Check if they're logged in\n const isLoggedIn = ctx.bigBrainAuth() !== null;\n if (!isLoggedIn && shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"anonymous\",\n deploymentName: null,\n };\n }\n\n // Choose a project interactively later\n return {\n kind: \"chooseProject\",\n };\n}\n\nasync function getDeploymentSelectionFromEnv(\n ctx: Context,\n getEnv: (name: string) => string | null,\n): Promise<\n { kind: \"success\"; metadata: DeploymentSelection } | { kind: \"unknown\" }\n> {\n const deployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n if (deployKey !== null) {\n const deployKeyType = isPreviewDeployKey(deployKey)\n ? \"preview\"\n : isProjectKey(deployKey)\n ? \"project\"\n : \"deployment\";\n switch (deployKeyType) {\n case \"preview\": {\n // `CONVEX_DEPLOY_KEY` is set to a preview deploy key so this takes precedence over anything else.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"preview\",\n previewDeployKey: deployKey,\n },\n };\n }\n case \"project\": {\n // `CONVEX_DEPLOY_KEY` is set to a project deploy key.\n // Commands can select any deployment within the project. At the moment we don't check for other env vars (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"projectDeployKey\",\n projectDeployKey: deployKey,\n },\n },\n };\n }\n case \"deployment\": {\n // `CONVEX_DEPLOY_KEY` is set to a deployment's deploy key.\n // Deploy to this deployment -- selectors like `--prod` / `--preview-name` will be ignored.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n const deploymentName = await deploymentNameFromAdminKeyOrCrash(\n ctx,\n deployKey,\n );\n const deploymentType = deploymentTypeFromAdminKey(deployKey);\n // We cannot derive the deployment URL from the deploy key, because it\n // might be a custom domain. Ask big brain for the URL.\n const url = await bigBrainAPI({\n ctx,\n method: \"POST\",\n url: \"deployment/url_for_key\",\n data: {\n deployKey: deployKey,\n },\n });\n const slugs = await fetchTeamAndProjectForKey(ctx, deployKey);\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: url,\n adminKey: deployKey,\n deploymentFields: {\n deploymentName: deploymentName,\n deploymentType: deploymentType,\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n source: \"deployKey\",\n },\n },\n };\n }\n default: {\n const _exhaustivenessCheck: never = deployKeyType;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deploy key type: ${deployKeyType as any}`,\n });\n }\n }\n }\n // Throw a nice error if we're in something like a CI environment where we need a `CONVEX_DEPLOY_KEY`\n await checkIfBuildEnvironmentExpectsConvexDeployKey(ctx);\n\n const convexDeployment = getEnv(CONVEX_DEPLOYMENT_ENV_VAR_NAME);\n const selfHostedUrl = getEnv(CONVEX_SELF_HOSTED_URL_VAR_NAME);\n const selfHostedAdminKey = getEnv(CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME);\n\n if (selfHostedUrl !== null && selfHostedAdminKey !== null) {\n if (convexDeployment !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} must not be set when ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} are set`,\n });\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: selfHostedUrl,\n adminKey: selfHostedAdminKey,\n deploymentFields: null,\n source: \"selfHosted\",\n },\n },\n };\n }\n\n if (convexDeployment !== null) {\n if (selfHostedUrl !== null || selfHostedAdminKey !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} must not be set when ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is set`,\n });\n }\n const targetDeploymentType =\n getDeploymentTypeFromConfiguredDeployment(convexDeployment);\n const targetDeploymentName = stripDeploymentTypePrefix(convexDeployment);\n const isAnonymous = isAnonymousDeployment(targetDeploymentName);\n if (isAnonymous) {\n if (!shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"unknown\",\n };\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"anonymous\",\n deploymentName: targetDeploymentName,\n },\n };\n }\n // Commands can select a deployment within the project that this deployment belongs to.\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: targetDeploymentName,\n deploymentType: targetDeploymentType,\n },\n },\n };\n }\n\n return { kind: \"unknown\" };\n}\n\nasync function checkIfBuildEnvironmentExpectsConvexDeployKey(ctx: Context) {\n const buildEnvironmentExpectsConvexDeployKey = buildEnvironment();\n if (buildEnvironmentExpectsConvexDeployKey) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `${buildEnvironmentExpectsConvexDeployKey} build environment detected but ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} is not set. ` +\n `Set this environment variable to deploy from this environment. See https://docs.convex.dev/production/hosting`,\n });\n }\n}\n\n/**\n * Used for things like `npx convex docs` where we want to best effort extract a deployment name\n * but don't do the full deployment selection logic.\n */\nexport const deploymentNameFromSelection = (\n selection: DeploymentSelection,\n): string | null => {\n return deploymentNameAndTypeFromSelection(selection)?.name ?? null;\n};\n\nexport const deploymentNameAndTypeFromSelection = (\n selection: DeploymentSelection,\n): { name: string | null; type: string | null } | null => {\n switch (selection.kind) {\n case \"existingDeployment\": {\n return {\n name:\n selection.deploymentToActOn.deploymentFields?.deploymentName ?? null,\n type:\n selection.deploymentToActOn.deploymentFields?.deploymentType ?? null,\n };\n }\n case \"deploymentWithinProject\": {\n return selection.targetProject.kind === \"deploymentName\"\n ? {\n name: selection.targetProject.deploymentName,\n type: selection.targetProject.deploymentType,\n }\n : null;\n }\n case \"preview\": {\n return null;\n }\n case \"chooseProject\": {\n return null;\n }\n case \"anonymous\": {\n return null;\n }\n }\n const _exhaustivenessCheck: never = selection;\n return null;\n};\n\nexport const shouldAllowAnonymousDevelopment = (): boolean => {\n // Kill switch / temporary opt out\n if (process.env.CONVEX_ALLOW_ANONYMOUS === \"false\") {\n return false;\n }\n return true;\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { BigBrainAuth, Context, logVerbose } from \"../../bundler/context.js\";\nimport {\n AccountRequiredDeploymentType,\n DeploymentType,\n fetchTeamAndProjectForKey,\n} from \"./api.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport {\n deploymentNameFromAdminKeyOrCrash,\n deploymentTypeFromAdminKey,\n getDeploymentTypeFromConfiguredDeployment,\n isAnonymousDeployment,\n isPreviewDeployKey,\n isProjectKey,\n stripDeploymentTypePrefix,\n} from \"./deployment.js\";\nimport { buildEnvironment } from \"./envvars.js\";\nimport { readGlobalConfig } from \"./utils/globalConfig.js\";\nimport {\n CONVEX_DEPLOYMENT_ENV_VAR_NAME,\n CONVEX_DEPLOY_KEY_ENV_VAR_NAME,\n CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME,\n CONVEX_SELF_HOSTED_URL_VAR_NAME,\n ENV_VAR_FILE_PATH,\n bigBrainAPI,\n} from \"./utils/utils.js\";\nimport * as dotenv from \"dotenv\";\n\n// ----------------------------------------------------------------------------\n// Big Brain Auth\n// ----------------------------------------------------------------------------\n\n/**\n * The auth header can be a few different things:\n * * An access token (corresponds to device authorization, usually stored in `~/.convex/config.json`)\n * * A preview deploy key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n * * A project key (set via the `CONVEX_DEPLOY_KEY` environment variable)\n *\n * Project keys take precedence over the the access token.\n *\n * We check for the `CONVEX_DEPLOY_KEY` in the `--env-file` if it's provided.\n * Otherwise, we check in the `.env` and `.env.local` files.\n *\n * If we later prompt for log in, we need to call `ctx.setBigBrainAuthHeader` to\n * update the value.\n *\n * @param ctx\n * @param envFile\n * @returns\n */\nexport async function initializeBigBrainAuth(\n ctx: Context,\n initialArgs: {\n url?: string;\n adminKey?: string;\n envFile?: string;\n },\n): Promise<void> {\n if (initialArgs.url !== undefined && initialArgs.adminKey !== undefined) {\n // Do not check any env vars if `url` and `adminKey` are specified via CLI\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n }),\n );\n return;\n }\n if (initialArgs.envFile !== undefined) {\n const existingFile = ctx.fs.exists(initialArgs.envFile)\n ? ctx.fs.readUtf8File(initialArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const deployKey = config[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n }\n return;\n }\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n dotenv.config();\n const deployKey = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME];\n if (deployKey !== undefined) {\n const bigBrainAuth = getBigBrainAuth(ctx, {\n previewDeployKey: isPreviewDeployKey(deployKey) ? deployKey : null,\n projectKey: isProjectKey(deployKey) ? deployKey : null,\n });\n ctx._updateBigBrainAuth(bigBrainAuth);\n return;\n }\n ctx._updateBigBrainAuth(\n getBigBrainAuth(ctx, {\n previewDeployKey: null,\n projectKey: null,\n }),\n );\n return;\n}\n\nexport async function updateBigBrainAuthAfterLogin(\n ctx: Context,\n accessToken: string,\n) {\n const existingAuth = ctx.bigBrainAuth();\n if (existingAuth !== null && existingAuth.kind === \"projectKey\") {\n logVerbose(\n ctx,\n `Ignoring update to big brain auth since project key takes precedence`,\n );\n return;\n }\n ctx._updateBigBrainAuth({\n accessToken: accessToken,\n kind: \"accessToken\",\n header: `Bearer ${accessToken}`,\n });\n}\n\nexport async function clearBigBrainAuth(ctx: Context) {\n ctx._updateBigBrainAuth(null);\n}\n\nfunction getBigBrainAuth(\n ctx: Context,\n opts: {\n previewDeployKey: string | null;\n projectKey: string | null;\n },\n): BigBrainAuth | null {\n if (process.env.CONVEX_OVERRIDE_ACCESS_TOKEN) {\n return {\n accessToken: process.env.CONVEX_OVERRIDE_ACCESS_TOKEN,\n kind: \"accessToken\",\n header: `Bearer ${process.env.CONVEX_OVERRIDE_ACCESS_TOKEN}`,\n };\n }\n if (opts.projectKey !== null) {\n // Project keys take precedence over global config.\n return {\n header: `Bearer ${opts.projectKey}`,\n kind: \"projectKey\",\n projectKey: opts.projectKey,\n };\n }\n const globalConfig = readGlobalConfig(ctx);\n if (globalConfig) {\n return {\n kind: \"accessToken\",\n header: `Bearer ${globalConfig.accessToken}`,\n accessToken: globalConfig.accessToken,\n };\n }\n if (opts.previewDeployKey !== null) {\n return {\n header: `Bearer ${opts.previewDeployKey}`,\n kind: \"previewDeployKey\",\n previewDeployKey: opts.previewDeployKey,\n };\n }\n return null;\n}\n\n// ----------------------------------------------------------------------------\n// Deployment Selection\n// ----------------------------------------------------------------------------\n/**\n * Our CLI has logic to select which deployment to act on.\n *\n * We first check whether we're targeting a deployment within a project, or if we\n * know exactly which deployment to act on (e.g. in the case of self-hosting).\n *\n * We also special case preview deploys since the presence of a preview deploy key\n * triggers different behavior in `npx convex deploy`.\n *\n * Most commands will immediately compute the deployment selection, and then combine\n * that with any relevant CLI flags to figure out which deployment to talk to.\n *\n * Different commands do different things (e.g. `dev` will allow you to create a new project,\n * `deploy` has different behavior for preview deploys)\n *\n * This should be kept in sync with `initializeBigBrainAuth` since environment variables\n * like `CONVEX_DEPLOY_KEY` are used for both deployment selection and auth.\n */\nexport type DeploymentSelection =\n | {\n kind: \"existingDeployment\";\n deploymentToActOn: {\n url: string;\n adminKey: string;\n deploymentFields: {\n deploymentName: string;\n deploymentType: DeploymentType;\n projectSlug: string;\n teamSlug: string;\n } | null;\n source: \"selfHosted\" | \"deployKey\" | \"cliArgs\";\n };\n }\n | {\n kind: \"deploymentWithinProject\";\n targetProject: ProjectSelection;\n }\n | {\n kind: \"preview\";\n previewDeployKey: string;\n }\n | {\n kind: \"chooseProject\";\n }\n | {\n kind: \"anonymous\";\n deploymentName: string | null;\n };\n\nexport type ProjectSelection =\n | {\n kind: \"teamAndProjectSlugs\";\n teamSlug: string;\n projectSlug: string;\n }\n | {\n kind: \"deploymentName\";\n deploymentName: string;\n deploymentType: AccountRequiredDeploymentType | null;\n }\n | {\n kind: \"projectDeployKey\";\n projectDeployKey: string;\n };\n\nexport async function getDeploymentSelection(\n ctx: Context,\n cliArgs: {\n url?: string;\n adminKey?: string;\n envFile?: string;\n },\n): Promise<DeploymentSelection> {\n const metadata = await _getDeploymentSelection(ctx, cliArgs);\n logDeploymentSelection(ctx, metadata);\n return metadata;\n}\n\nfunction logDeploymentSelection(ctx: Context, selection: DeploymentSelection) {\n switch (selection.kind) {\n case \"existingDeployment\": {\n logVerbose(\n ctx,\n `Existing deployment: ${selection.deploymentToActOn.url} ${selection.deploymentToActOn.source}`,\n );\n break;\n }\n case \"deploymentWithinProject\": {\n logVerbose(\n ctx,\n `Deployment within project: ${prettyProjectSelection(selection.targetProject)}`,\n );\n break;\n }\n case \"preview\": {\n logVerbose(ctx, `Preview deploy key`);\n break;\n }\n case \"chooseProject\": {\n logVerbose(ctx, `Choose project`);\n break;\n }\n case \"anonymous\": {\n logVerbose(\n ctx,\n `Anonymous, has selected deployment?: ${selection.deploymentName !== null}`,\n );\n break;\n }\n default: {\n const _exhaustivenessCheck: never = selection;\n logVerbose(ctx, `Unknown deployment selection`);\n }\n }\n return null;\n}\n\nfunction prettyProjectSelection(selection: ProjectSelection) {\n switch (selection.kind) {\n case \"teamAndProjectSlugs\": {\n return `Team and project slugs: ${selection.teamSlug} ${selection.projectSlug}`;\n }\n case \"deploymentName\": {\n return `Deployment name: ${selection.deploymentName}`;\n }\n case \"projectDeployKey\": {\n return `Project deploy key`;\n }\n default: {\n const _exhaustivenessCheck: never = selection;\n return `Unknown`;\n }\n }\n}\n\nasync function _getDeploymentSelection(\n ctx: Context,\n cliArgs: {\n url?: string;\n adminKey?: string;\n envFile?: string;\n },\n): Promise<DeploymentSelection> {\n /*\n - url + adminKey specified via CLI\n - Do not check any env vars (including ones relevant for auth)\n */\n if (cliArgs.url && cliArgs.adminKey) {\n return {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: cliArgs.url,\n adminKey: cliArgs.adminKey,\n deploymentFields: null,\n source: \"cliArgs\",\n },\n };\n }\n\n if (cliArgs.envFile) {\n // If an `--env-file` is specified, it must contain enough information for both auth and deployment selection.\n logVerbose(ctx, `Checking env file: ${cliArgs.envFile}`);\n const existingFile = ctx.fs.exists(cliArgs.envFile)\n ? ctx.fs.readUtf8File(cliArgs.envFile)\n : null;\n if (existingFile === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: \"env file does not exist\",\n });\n }\n const config = dotenv.parse(existingFile);\n const result = await getDeploymentSelectionFromEnv(ctx, (name) =>\n config[name] === undefined || config[name] === \"\" ? null : config[name],\n );\n if (result.kind === \"unknown\") {\n return ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage:\n `env file \\`${cliArgs.envFile}\\` did not contain environment variables for a Convex deployment. ` +\n `Expected \\`${CONVEX_DEPLOY_KEY_ENV_VAR_NAME}\\`, \\`${CONVEX_DEPLOYMENT_ENV_VAR_NAME}\\`, or both \\`${CONVEX_SELF_HOSTED_URL_VAR_NAME}\\` and \\`${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME}\\` to be set.`,\n });\n }\n return result.metadata;\n }\n // start with .env.local (but doesn't override existing)\n dotenv.config({ path: ENV_VAR_FILE_PATH });\n // for variables not already set, use .env values\n dotenv.config();\n const result = await getDeploymentSelectionFromEnv(ctx, (name) => {\n const value = process.env[name];\n if (value === undefined || value === \"\") {\n return null;\n }\n return value;\n });\n if (result.kind !== \"unknown\") {\n return result.metadata;\n }\n // none of these?\n\n // Check the `convex.json` for a configured team and project\n const { projectConfig } = await readProjectConfig(ctx);\n if (projectConfig.team !== undefined && projectConfig.project !== undefined) {\n return {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug: projectConfig.team,\n projectSlug: projectConfig.project,\n },\n };\n }\n\n // Check if they're logged in\n const isLoggedIn = ctx.bigBrainAuth() !== null;\n if (!isLoggedIn && shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"anonymous\",\n deploymentName: null,\n };\n }\n\n // Choose a project interactively later\n return {\n kind: \"chooseProject\",\n };\n}\n\nasync function getDeploymentSelectionFromEnv(\n ctx: Context,\n getEnv: (name: string) => string | null,\n): Promise<\n { kind: \"success\"; metadata: DeploymentSelection } | { kind: \"unknown\" }\n> {\n const deployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n if (deployKey !== null) {\n const deployKeyType = isPreviewDeployKey(deployKey)\n ? \"preview\"\n : isProjectKey(deployKey)\n ? \"project\"\n : \"deployment\";\n switch (deployKeyType) {\n case \"preview\": {\n // `CONVEX_DEPLOY_KEY` is set to a preview deploy key so this takes precedence over anything else.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"preview\",\n previewDeployKey: deployKey,\n },\n };\n }\n case \"project\": {\n // `CONVEX_DEPLOY_KEY` is set to a project deploy key.\n // Commands can select any deployment within the project. At the moment we don't check for other env vars (e.g. `CONVEX_DEPLOYMENT`)\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"projectDeployKey\",\n projectDeployKey: deployKey,\n },\n },\n };\n }\n case \"deployment\": {\n // `CONVEX_DEPLOY_KEY` is set to a deployment's deploy key.\n // Deploy to this deployment -- selectors like `--prod` / `--preview-name` will be ignored.\n // At the moment, we don't verify that there aren't other env vars that would also be used for deployment selection (e.g. `CONVEX_DEPLOYMENT`)\n const deploymentName = await deploymentNameFromAdminKeyOrCrash(\n ctx,\n deployKey,\n );\n const deploymentType = deploymentTypeFromAdminKey(deployKey);\n // We cannot derive the deployment URL from the deploy key, because it\n // might be a custom domain. Ask big brain for the URL.\n const url = await bigBrainAPI({\n ctx,\n method: \"POST\",\n url: \"deployment/url_for_key\",\n data: {\n deployKey: deployKey,\n },\n });\n const slugs = await fetchTeamAndProjectForKey(ctx, deployKey);\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: url,\n adminKey: deployKey,\n deploymentFields: {\n deploymentName: deploymentName,\n deploymentType: deploymentType,\n teamSlug: slugs.team,\n projectSlug: slugs.project,\n },\n source: \"deployKey\",\n },\n },\n };\n }\n default: {\n const _exhaustivenessCheck: never = deployKeyType;\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deploy key type: ${deployKeyType as any}`,\n });\n }\n }\n }\n // Throw a nice error if we're in something like a CI environment where we need a `CONVEX_DEPLOY_KEY`\n await checkIfBuildEnvironmentExpectsConvexDeployKey(ctx);\n\n const convexDeployment = getEnv(CONVEX_DEPLOYMENT_ENV_VAR_NAME);\n const selfHostedUrl = getEnv(CONVEX_SELF_HOSTED_URL_VAR_NAME);\n const selfHostedAdminKey = getEnv(CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME);\n\n if (selfHostedUrl !== null && selfHostedAdminKey !== null) {\n if (convexDeployment !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_DEPLOYMENT_ENV_VAR_NAME} must not be set when ${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} are set`,\n });\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"existingDeployment\",\n deploymentToActOn: {\n url: selfHostedUrl,\n adminKey: selfHostedAdminKey,\n deploymentFields: null,\n source: \"selfHosted\",\n },\n },\n };\n }\n\n if (convexDeployment !== null) {\n if (selfHostedUrl !== null || selfHostedAdminKey !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `${CONVEX_SELF_HOSTED_URL_VAR_NAME} and ${CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME} must not be set when ${CONVEX_DEPLOYMENT_ENV_VAR_NAME} is set`,\n });\n }\n const targetDeploymentType =\n getDeploymentTypeFromConfiguredDeployment(convexDeployment);\n const targetDeploymentName = stripDeploymentTypePrefix(convexDeployment);\n const isAnonymous = isAnonymousDeployment(targetDeploymentName);\n if (isAnonymous) {\n if (!shouldAllowAnonymousDevelopment()) {\n return {\n kind: \"unknown\",\n };\n }\n return {\n kind: \"success\",\n metadata: {\n kind: \"anonymous\",\n deploymentName: targetDeploymentName,\n },\n };\n }\n // Commands can select a deployment within the project that this deployment belongs to.\n return {\n kind: \"success\",\n metadata: {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName: targetDeploymentName,\n deploymentType: targetDeploymentType,\n },\n },\n };\n }\n\n return { kind: \"unknown\" };\n}\n\nasync function checkIfBuildEnvironmentExpectsConvexDeployKey(ctx: Context) {\n const buildEnvironmentExpectsConvexDeployKey = buildEnvironment();\n if (buildEnvironmentExpectsConvexDeployKey) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n `${buildEnvironmentExpectsConvexDeployKey} build environment detected but ${CONVEX_DEPLOY_KEY_ENV_VAR_NAME} is not set. ` +\n `Set this environment variable to deploy from this environment. See https://docs.convex.dev/production/hosting`,\n });\n }\n}\n\n/**\n * Used for things like `npx convex docs` where we want to best effort extract a deployment name\n * but don't do the full deployment selection logic.\n */\nexport const deploymentNameFromSelection = (\n selection: DeploymentSelection,\n): string | null => {\n return deploymentNameAndTypeFromSelection(selection)?.name ?? null;\n};\n\nexport const deploymentNameAndTypeFromSelection = (\n selection: DeploymentSelection,\n): { name: string | null; type: string | null } | null => {\n switch (selection.kind) {\n case \"existingDeployment\": {\n return {\n name:\n selection.deploymentToActOn.deploymentFields?.deploymentName ?? null,\n type:\n selection.deploymentToActOn.deploymentFields?.deploymentType ?? null,\n };\n }\n case \"deploymentWithinProject\": {\n return selection.targetProject.kind === \"deploymentName\"\n ? {\n name: selection.targetProject.deploymentName,\n type: selection.targetProject.deploymentType,\n }\n : null;\n }\n case \"preview\": {\n return null;\n }\n case \"chooseProject\": {\n return null;\n }\n case \"anonymous\": {\n return null;\n }\n }\n const _exhaustivenessCheck: never = selection;\n return null;\n};\n\nexport const shouldAllowAnonymousDevelopment = (): boolean => {\n // Kill switch / temporary opt out\n if (process.env.CONVEX_ALLOW_ANONYMOUS === \"false\") {\n return false;\n }\n return true;\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,qBAAkD;AAClD,iBAIO;AACP,oBAAkC;AAClC,wBAQO;AACP,qBAAiC;AACjC,0BAAiC;AACjC,mBAOO;AACP,aAAwB;AAwBxB,eAAsB,uBACpB,KACA,aAKe;AACf,MAAI,YAAY,QAAQ,UAAa,YAAY,aAAa,QAAW;AAEvE,QAAI;AAAA,MACF,gBAAgB,KAAK;AAAA,QACnB,kBAAkB;AAAA,QAClB,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AACA;AAAA,EACF;AACA,MAAI,YAAY,YAAY,QAAW;AACrC,UAAM,eAAe,IAAI,GAAG,OAAO,YAAY,OAAO,IAClD,IAAI,GAAG,aAAa,YAAY,OAAO,IACvC;AACJ,QAAI,iBAAiB,MAAM;AACzB,aAAO,IAAI,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AACA,UAAM,SAAS,OAAO,MAAM,YAAY;AACxC,UAAMA,aAAY,OAAO,2CAA8B;AACvD,QAAIA,eAAc,QAAW;AAC3B,YAAM,eAAe,gBAAgB,KAAK;AAAA,QACxC,sBAAkB,sCAAmBA,UAAS,IAAIA,aAAY;AAAA,QAC9D,gBAAY,gCAAaA,UAAS,IAAIA,aAAY;AAAA,MACpD,CAAC;AACD,UAAI,oBAAoB,YAAY;AAAA,IACtC;AACA;AAAA,EACF;AACA,SAAO,OAAO,EAAE,MAAM,+BAAkB,CAAC;AACzC,SAAO,OAAO;AACd,QAAM,YAAY,QAAQ,IAAI,2CAA8B;AAC5D,MAAI,cAAc,QAAW;AAC3B,UAAM,eAAe,gBAAgB,KAAK;AAAA,MACxC,sBAAkB,sCAAmB,SAAS,IAAI,YAAY;AAAA,MAC9D,gBAAY,gCAAa,SAAS,IAAI,YAAY;AAAA,IACpD,CAAC;AACD,QAAI,oBAAoB,YAAY;AACpC;AAAA,EACF;AACA,MAAI;AAAA,IACF,gBAAgB,KAAK;AAAA,MACnB,kBAAkB;AAAA,MAClB,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACA;AACF;AAEA,eAAsB,6BACpB,KACA,aACA;AACA,QAAM,eAAe,IAAI,aAAa;AACtC,MAAI,iBAAiB,QAAQ,aAAa,SAAS,cAAc;AAC/D;AAAA,MACE;AAAA,MACA;AAAA,IACF;AACA;AAAA,EACF;AACA,MAAI,oBAAoB;AAAA,IACtB;AAAA,IACA,MAAM;AAAA,IACN,QAAQ,UAAU,WAAW;AAAA,EAC/B,CAAC;AACH;AAEA,eAAsB,kBAAkB,KAAc;AACpD,MAAI,oBAAoB,IAAI;AAC9B;AAEA,SAAS,gBACP,KACA,MAIqB;AACrB,MAAI,QAAQ,IAAI,8BAA8B;AAC5C,WAAO;AAAA,MACL,aAAa,QAAQ,IAAI;AAAA,MACzB,MAAM;AAAA,MACN,QAAQ,UAAU,QAAQ,IAAI,4BAA4B;AAAA,IAC5D;AAAA,EACF;AACA,MAAI,KAAK,eAAe,MAAM;AAE5B,WAAO;AAAA,MACL,QAAQ,UAAU,KAAK,UAAU;AAAA,MACjC,MAAM;AAAA,MACN,YAAY,KAAK;AAAA,IACnB;AAAA,EACF;AACA,QAAM,mBAAe,sCAAiB,GAAG;AACzC,MAAI,cAAc;AAChB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,UAAU,aAAa,WAAW;AAAA,MAC1C,aAAa,aAAa;AAAA,IAC5B;AAAA,EACF;AACA,MAAI,KAAK,qBAAqB,MAAM;AAClC,WAAO;AAAA,MACL,QAAQ,UAAU,KAAK,gBAAgB;AAAA,MACvC,MAAM;AAAA,MACN,kBAAkB,KAAK;AAAA,IACzB;AAAA,EACF;AACA,SAAO;AACT;AAsEA,eAAsB,uBACpB,KACA,SAK8B;AAC9B,QAAM,WAAW,MAAM,wBAAwB,KAAK,OAAO;AAC3D,yBAAuB,KAAK,QAAQ;AACpC,SAAO;AACT;AAEA,SAAS,uBAAuB,KAAc,WAAgC;AAC5E,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK,sBAAsB;AACzB;AAAA,QACE;AAAA,QACA,wBAAwB,UAAU,kBAAkB,GAAG,IAAI,UAAU,kBAAkB,MAAM;AAAA,MAC/F;AACA;AAAA,IACF;AAAA,IACA,KAAK,2BAA2B;AAC9B;AAAA,QACE;AAAA,QACA,8BAA8B,uBAAuB,UAAU,aAAa,CAAC;AAAA,MAC/E;AACA;AAAA,IACF;AAAA,IACA,KAAK,WAAW;AACd,qCAAW,KAAK,oBAAoB;AACpC;AAAA,IACF;AAAA,IACA,KAAK,iBAAiB;AACpB,qCAAW,KAAK,gBAAgB;AAChC;AAAA,IACF;AAAA,IACA,KAAK,aAAa;AAChB;AAAA,QACE;AAAA,QACA,wCAAwC,UAAU,mBAAmB,IAAI;AAAA,MAC3E;AACA;AAAA,IACF;AAAA,IACA,SAAS;AACP,YAAM,uBAA8B;AACpC,qCAAW,KAAK,8BAA8B;AAAA,IAChD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,uBAAuB,WAA6B;AAC3D,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK,uBAAuB;AAC1B,aAAO,2BAA2B,UAAU,QAAQ,IAAI,UAAU,WAAW;AAAA,IAC/E;AAAA,IACA,KAAK,kBAAkB;AACrB,aAAO,oBAAoB,UAAU,cAAc;AAAA,IACrD;AAAA,IACA,KAAK,oBAAoB;AACvB,aAAO;AAAA,IACT;AAAA,IACA,SAAS;AACP,YAAM,uBAA8B;AACpC,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,eAAe,wBACb,KACA,SAK8B;AAK9B,MAAI,QAAQ,OAAO,QAAQ,UAAU;AACnC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,mBAAmB;AAAA,QACjB,KAAK,QAAQ;AAAA,QACb,UAAU,QAAQ;AAAA,QAClB,kBAAkB;AAAA,QAClB,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,SAAS;AAEnB,mCAAW,KAAK,sBAAsB,QAAQ,OAAO,EAAE;AACvD,UAAM,eAAe,IAAI,GAAG,OAAO,QAAQ,OAAO,IAC9C,IAAI,GAAG,aAAa,QAAQ,OAAO,IACnC;AACJ,QAAI,iBAAiB,MAAM;AACzB,aAAO,IAAI,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB;AAAA,MAClB,CAAC;AAAA,IACH;AACA,UAAM,SAAS,OAAO,MAAM,YAAY;AACxC,UAAMC,UAAS,MAAM;AAAA,MAA8B;AAAA,MAAK,CAAC,SACvD,OAAO,IAAI,MAAM,UAAa,OAAO,IAAI,MAAM,KAAK,OAAO,OAAO,IAAI;AAAA,IACxE;AACA,QAAIA,QAAO,SAAS,WAAW;AAC7B,aAAO,IAAI,MAAM;AAAA,QACf,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBACE,cAAc,QAAQ,OAAO,gFACf,2CAA8B,SAAS,2CAA8B,iBAAiB,4CAA+B,YAAY,kDAAqC;AAAA,MACxL,CAAC;AAAA,IACH;AACA,WAAOA,QAAO;AAAA,EAChB;AAEA,SAAO,OAAO,EAAE,MAAM,+BAAkB,CAAC;AAEzC,SAAO,OAAO;AACd,QAAM,SAAS,MAAM,8BAA8B,KAAK,CAAC,SAAS;AAChE,UAAM,QAAQ,QAAQ,IAAI,IAAI;AAC9B,QAAI,UAAU,UAAa,UAAU,IAAI;AACvC,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT,CAAC;AACD,MAAI,OAAO,SAAS,WAAW;AAC7B,WAAO,OAAO;AAAA,EAChB;AAIA,QAAM,EAAE,cAAc,IAAI,UAAM,iCAAkB,GAAG;AACrD,MAAI,cAAc,SAAS,UAAa,cAAc,YAAY,QAAW;AAC3E,WAAO;AAAA,MACL,MAAM;AAAA,MACN,eAAe;AAAA,QACb,MAAM;AAAA,QACN,UAAU,cAAc;AAAA,QACxB,aAAa,cAAc;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAGA,QAAM,aAAa,IAAI,aAAa,MAAM;AAC1C,MAAI,CAAC,cAAc,gCAAgC,GAAG;AACpD,WAAO;AAAA,MACL,MAAM;AAAA,MACN,gBAAgB;AAAA,IAClB;AAAA,EACF;AAGA,SAAO;AAAA,IACL,MAAM;AAAA,EACR;AACF;AAEA,eAAe,8BACb,KACA,QAGA;AACA,QAAM,YAAY,OAAO,2CAA8B;AACvD,MAAI,cAAc,MAAM;AACtB,UAAM,oBAAgB,sCAAmB,SAAS,IAC9C,gBACA,gCAAa,SAAS,IACpB,YACA;AACN,YAAQ,eAAe;AAAA,MACrB,KAAK,WAAW;AAGd,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM;AAAA,YACN,kBAAkB;AAAA,UACpB;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,WAAW;AAGd,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM;AAAA,YACN,eAAe;AAAA,cACb,MAAM;AAAA,cACN,kBAAkB;AAAA,YACpB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,KAAK,cAAc;AAIjB,cAAM,iBAAiB,UAAM;AAAA,UAC3B;AAAA,UACA;AAAA,QACF;AACA,cAAM,qBAAiB,8CAA2B,SAAS;AAG3D,cAAM,MAAM,UAAM,0BAAY;AAAA,UAC5B;AAAA,UACA,QAAQ;AAAA,UACR,KAAK;AAAA,UACL,MAAM;AAAA,YACJ;AAAA,UACF;AAAA,QACF,CAAC;AACD,cAAM,QAAQ,UAAM,sCAA0B,KAAK,SAAS;AAC5D,eAAO;AAAA,UACL,MAAM;AAAA,UACN,UAAU;AAAA,YACR,MAAM;AAAA,YACN,mBAAmB;AAAA,cACjB;AAAA,cACA,UAAU;AAAA,cACV,kBAAkB;AAAA,gBAChB;AAAA,gBACA;AAAA,gBACA,UAAU,MAAM;AAAA,gBAChB,aAAa,MAAM;AAAA,cACrB;AAAA,cACA,QAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,MACA,SAAS;AACP,cAAM,uBAA8B;AACpC,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,+BAA+B,aAAoB;AAAA,QACrE,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,QAAM,8CAA8C,GAAG;AAEvD,QAAM,mBAAmB,OAAO,2CAA8B;AAC9D,QAAM,gBAAgB,OAAO,4CAA+B;AAC5D,QAAM,qBAAqB,OAAO,kDAAqC;AAEvE,MAAI,kBAAkB,QAAQ,uBAAuB,MAAM;AACzD,QAAI,qBAAqB,MAAM;AAC7B,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,GAAG,2CAA8B,yBAAyB,4CAA+B,QAAQ,kDAAqC;AAAA,MACxJ,CAAC;AAAA,IACH;AACA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM;AAAA,QACN,mBAAmB;AAAA,UACjB,KAAK;AAAA,UACL,UAAU;AAAA,UACV,kBAAkB;AAAA,UAClB,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,qBAAqB,MAAM;AAC7B,QAAI,kBAAkB,QAAQ,uBAAuB,MAAM;AACzD,aAAO,MAAM,IAAI,MAAM;AAAA,QACrB,UAAU;AAAA,QACV,WAAW;AAAA,QACX,gBAAgB,GAAG,4CAA+B,QAAQ,kDAAqC,yBAAyB,2CAA8B;AAAA,MACxJ,CAAC;AAAA,IACH;AACA,UAAM,2BACJ,6DAA0C,gBAAgB;AAC5D,UAAM,2BAAuB,6CAA0B,gBAAgB;AACvE,UAAM,kBAAc,yCAAsB,oBAAoB;AAC9D,QAAI,aAAa;AACf,UAAI,CAAC,gCAAgC,GAAG;AACtC,eAAO;AAAA,UACL,MAAM;AAAA,QACR;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,UAAU;AAAA,UACR,MAAM;AAAA,UACN,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM;AAAA,QACN,eAAe;AAAA,UACb,MAAM;AAAA,UACN,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,UAAU;AAC3B;AAEA,eAAe,8CAA8C,KAAc;AACzE,QAAM,6CAAyC,iCAAiB;AAChE,MAAI,wCAAwC;AAC1C,WAAO,MAAM,IAAI,MAAM;AAAA,MACrB,UAAU;AAAA,MACV,WAAW;AAAA,MACX,gBACE,GAAG,sCAAsC,mCAAmC,2CAA8B;AAAA,IAE9G,CAAC;AAAA,EACH;AACF;AAMO,MAAM,8BAA8B,CACzC,cACkB;AAClB,SAAO,mCAAmC,SAAS,GAAG,QAAQ;AAChE;AAEO,MAAM,qCAAqC,CAChD,cACwD;AACxD,UAAQ,UAAU,MAAM;AAAA,IACtB,KAAK,sBAAsB;AACzB,aAAO;AAAA,QACL,MACE,UAAU,kBAAkB,kBAAkB,kBAAkB;AAAA,QAClE,MACE,UAAU,kBAAkB,kBAAkB,kBAAkB;AAAA,MACpE;AAAA,IACF;AAAA,IACA,KAAK,2BAA2B;AAC9B,aAAO,UAAU,cAAc,SAAS,mBACpC;AAAA,QACE,MAAM,UAAU,cAAc;AAAA,QAC9B,MAAM,UAAU,cAAc;AAAA,MAChC,IACA;AAAA,IACN;AAAA,IACA,KAAK,WAAW;AACd,aAAO;AAAA,IACT;AAAA,IACA,KAAK,iBAAiB;AACpB,aAAO;AAAA,IACT;AAAA,IACA,KAAK,aAAa;AAChB,aAAO;AAAA,IACT;AAAA,EACF;AACA,QAAM,uBAA8B;AACpC,SAAO;AACT;AAEO,MAAM,kCAAkC,MAAe;AAE5D,MAAI,QAAQ,IAAI,2BAA2B,SAAS;AAClD,WAAO;AAAA,EACT;AACA,SAAO;AACT;",
6
6
  "names": ["deployKey", "result"]
7
7
  }
@@ -30,6 +30,7 @@ var envvars_exports = {};
30
30
  __export(envvars_exports, {
31
31
  buildEnvironment: () => buildEnvironment,
32
32
  changedEnvVarFile: () => changedEnvVarFile,
33
+ detectSuspiciousEnvironmentVariables: () => detectSuspiciousEnvironmentVariables,
33
34
  getEnvVarRegex: () => getEnvVarRegex,
34
35
  gitBranchFromEnvironment: () => gitBranchFromEnvironment,
35
36
  isNonProdBuildEnvironment: () => isNonProdBuildEnvironment,
@@ -218,6 +219,34 @@ const EXPECTED_NAMES = /* @__PURE__ */ new Set([
218
219
  "REACT_APP_CONVEX_URL",
219
220
  "EXPO_PUBLIC_CONVEX_URL"
220
221
  ]);
222
+ async function detectSuspiciousEnvironmentVariables(ctx, ignoreSuspiciousEnvVars = false) {
223
+ for (const [key, value] of Object.entries(process.env)) {
224
+ if (value === "" && key.startsWith("ey")) {
225
+ try {
226
+ const decoded = JSON.parse(
227
+ Buffer.from(key + "=", "base64").toString("utf8")
228
+ );
229
+ if (!("v2" in decoded)) {
230
+ continue;
231
+ }
232
+ } catch {
233
+ continue;
234
+ }
235
+ if (ignoreSuspiciousEnvVars) {
236
+ (0, import_context.logWarning)(
237
+ ctx,
238
+ `ignoring suspicious environment variable ${key}, did you mean to use quotes like CONVEX_DEPLOY_KEY='...'?`
239
+ );
240
+ } else {
241
+ return await ctx.crash({
242
+ exitCode: 1,
243
+ errorType: "fatal",
244
+ printedMessage: `Quotes are required around environment variable values by your shell: CONVEX_DEPLOY_KEY='project:name:project|${key.slice(0, 4)}...${key.slice(key.length - 4)}=' npx convex dev`
245
+ });
246
+ }
247
+ }
248
+ }
249
+ }
221
250
  function buildEnvironment() {
222
251
  return process.env.VERCEL ? "Vercel" : process.env.NETLIFY ? "Netlify" : false;
223
252
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/cli/lib/envvars.ts"],
4
- "sourcesContent": ["/**\n * Help the developer store the CONVEX_URL environment variable.\n */\nimport chalk from \"chalk\";\nimport * as dotenv from \"dotenv\";\n\nimport { Context, logWarning } from \"../../bundler/context.js\";\nimport { loadPackageJson } from \"./utils/utils.js\";\n\nconst _FRAMEWORKS = [\n \"create-react-app\",\n \"Next.js\",\n \"Vite\",\n \"Remix\",\n \"SvelteKit\",\n \"Expo\",\n \"TanStackStart\",\n] as const;\ntype Framework = (typeof _FRAMEWORKS)[number];\n\ntype ConvexUrlWriteConfig = {\n envFile: string;\n envVar: string;\n existingFileContent: string | null;\n} | null;\n\nexport async function writeConvexUrlToEnvFile(\n ctx: Context,\n value: string,\n): Promise<ConvexUrlWriteConfig> {\n const writeConfig = await envVarWriteConfig(ctx, value);\n\n if (writeConfig === null) {\n return null;\n }\n\n const { envFile, envVar, existingFileContent } = writeConfig;\n const modified = changedEnvVarFile({\n existingFileContent,\n envVarName: envVar,\n envVarValue: value,\n commentAfterValue: null,\n commentOnPreviousLine: null,\n })!;\n ctx.fs.writeUtf8File(envFile, modified);\n return writeConfig;\n}\n\nexport function changedEnvVarFile({\n existingFileContent,\n envVarName,\n envVarValue,\n commentAfterValue,\n commentOnPreviousLine,\n}: {\n existingFileContent: string | null;\n envVarName: string;\n envVarValue: string;\n commentAfterValue: string | null;\n commentOnPreviousLine: string | null;\n}): string | null {\n const varAssignment = `${envVarName}=${envVarValue}${\n commentAfterValue === null ? \"\" : ` # ${commentAfterValue}`\n }`;\n const commentOnPreviousLineWithLineBreak =\n commentOnPreviousLine === null ? \"\" : `${commentOnPreviousLine}\\n`;\n if (existingFileContent === null) {\n return `${commentOnPreviousLineWithLineBreak}${varAssignment}\\n`;\n }\n const config = dotenv.parse(existingFileContent);\n const existing = config[envVarName];\n if (existing === envVarValue) {\n return null;\n }\n if (existing !== undefined) {\n return existingFileContent.replace(\n getEnvVarRegex(envVarName),\n `${varAssignment}`,\n );\n } else {\n const doubleLineBreak = existingFileContent.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n return (\n existingFileContent +\n doubleLineBreak +\n commentOnPreviousLineWithLineBreak +\n varAssignment +\n \"\\n\"\n );\n }\n}\n\nexport function getEnvVarRegex(envVarName: string) {\n return new RegExp(`^${envVarName}.*$`, \"m\");\n}\n\nexport async function suggestedEnvVarName(ctx: Context): Promise<{\n detectedFramework?: Framework;\n envVar: string;\n}> {\n // no package.json, that's fine, just guess\n if (!ctx.fs.exists(\"package.json\")) {\n return {\n envVar: \"CONVEX_URL\",\n };\n }\n\n const packages = await loadPackageJson(ctx);\n\n // Is it create-react-app?\n const isCreateReactApp = \"react-scripts\" in packages;\n if (isCreateReactApp) {\n return {\n detectedFramework: \"create-react-app\",\n envVar: \"REACT_APP_CONVEX_URL\",\n };\n }\n\n const isNextJs = \"next\" in packages;\n if (isNextJs) {\n return {\n detectedFramework: \"Next.js\",\n envVar: \"NEXT_PUBLIC_CONVEX_URL\",\n };\n }\n\n const isExpo = \"expo\" in packages;\n if (isExpo) {\n return {\n detectedFramework: \"Expo\",\n envVar: \"EXPO_PUBLIC_CONVEX_URL\",\n };\n }\n\n const isRemix = \"@remix-run/dev\" in packages;\n if (isRemix) {\n return {\n detectedFramework: \"Remix\",\n envVar: \"CONVEX_URL\",\n };\n }\n\n const isSvelteKit = \"@sveltejs/kit\" in packages;\n if (isSvelteKit) {\n return {\n detectedFramework: \"SvelteKit\",\n envVar: \"PUBLIC_CONVEX_URL\",\n };\n }\n\n // Vite is a dependency of a lot of things; vite appearing in dependencies is not a strong indicator.\n const isVite = \"vite\" in packages;\n\n if (isVite) {\n return {\n detectedFramework: \"Vite\",\n envVar: \"VITE_CONVEX_URL\",\n };\n }\n\n // TanStackStart currently supports VITE_FOO for browser-side envvars.\n const isTanStackStart =\n \"@tanstack/start\" in packages || \"@tanstack/react-start\" in packages;\n\n if (isTanStackStart) {\n return {\n detectedFramework: \"TanStackStart\",\n envVar: \"VITE_CONVEX_URL\",\n };\n }\n\n return {\n envVar: \"CONVEX_URL\",\n };\n}\n\nasync function envVarWriteConfig(\n ctx: Context,\n value: string | null,\n): Promise<ConvexUrlWriteConfig> {\n const { detectedFramework, envVar } = await suggestedEnvVarName(ctx);\n\n const { envFile, existing } = suggestedDevEnvFile(ctx, detectedFramework);\n\n if (!existing) {\n return { envFile, envVar, existingFileContent: null };\n }\n\n const existingFileContent = ctx.fs.readUtf8File(envFile);\n const config = dotenv.parse(existingFileContent);\n\n const matching = Object.keys(config).filter((key) => EXPECTED_NAMES.has(key));\n if (matching.length > 1) {\n logWarning(\n ctx,\n chalk.yellow(\n `Found multiple CONVEX_URL environment variables in ${envFile} so cannot update automatically.`,\n ),\n );\n return null;\n }\n if (matching.length === 1) {\n const [existingEnvVar, oldValue] = [matching[0], config[matching[0]]];\n if (oldValue === value) {\n return null;\n }\n if (\n oldValue !== \"\" &&\n Object.values(config).filter((v) => v === oldValue).length !== 1\n ) {\n logWarning(\n ctx,\n chalk.yellow(`Can't safely modify ${envFile}, please edit manually.`),\n );\n return null;\n }\n return { envFile, envVar: existingEnvVar, existingFileContent };\n }\n return { envFile, envVar, existingFileContent };\n}\n\nfunction suggestedDevEnvFile(\n ctx: Context,\n framework?: Framework,\n): {\n existing: boolean;\n envFile: string;\n} {\n // If a .env.local file exists, that's unequivocally the right file\n if (ctx.fs.exists(\".env.local\")) {\n return {\n existing: true,\n envFile: \".env.local\",\n };\n }\n\n // Remix is on team \"don't commit the .env file,\" so .env is for dev.\n if (framework === \"Remix\") {\n return {\n existing: ctx.fs.exists(\".env\"),\n envFile: \".env\",\n };\n }\n\n // The most dev-looking env file that exists, or .env.local\n return {\n existing: ctx.fs.exists(\".env.local\"),\n envFile: \".env.local\",\n };\n}\n\nconst EXPECTED_NAMES = new Set([\n \"CONVEX_URL\",\n \"PUBLIC_CONVEX_URL\",\n \"NEXT_PUBLIC_CONVEX_URL\",\n \"VITE_CONVEX_URL\",\n \"REACT_APP_CONVEX_URL\",\n \"EXPO_PUBLIC_CONVEX_URL\",\n]);\n\nexport function buildEnvironment(): string | boolean {\n return process.env.VERCEL\n ? \"Vercel\"\n : process.env.NETLIFY\n ? \"Netlify\"\n : false;\n}\n\nexport function gitBranchFromEnvironment(): string | null {\n if (process.env.VERCEL) {\n // https://vercel.com/docs/projects/environment-variables/system-environment-variables\n return process.env.VERCEL_GIT_COMMIT_REF ?? null;\n }\n if (process.env.NETLIFY) {\n // https://docs.netlify.com/configure-builds/environment-variables/\n return process.env.HEAD ?? null;\n }\n\n if (process.env.CI) {\n // https://docs.github.com/en/actions/learn-github-actions/variables\n // https://docs.gitlab.com/ee/ci/variables/predefined_variables.html\n return (\n process.env.GITHUB_HEAD_REF ?? process.env.CI_COMMIT_REF_NAME ?? null\n );\n }\n\n return null;\n}\n\nexport function isNonProdBuildEnvironment(): boolean {\n if (process.env.VERCEL) {\n // https://vercel.com/docs/projects/environment-variables/system-environment-variables\n return process.env.VERCEL_ENV !== \"production\";\n }\n if (process.env.NETLIFY) {\n // https://docs.netlify.com/configure-builds/environment-variables/\n return process.env.CONTEXT !== \"production\";\n }\n return false;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,mBAAkB;AAClB,aAAwB;AAExB,qBAAoC;AACpC,mBAAgC;AAEhC,MAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AASA,eAAsB,wBACpB,KACA,OAC+B;AAC/B,QAAM,cAAc,MAAM,kBAAkB,KAAK,KAAK;AAEtD,MAAI,gBAAgB,MAAM;AACxB,WAAO;AAAA,EACT;AAEA,QAAM,EAAE,SAAS,QAAQ,oBAAoB,IAAI;AACjD,QAAM,WAAW,kBAAkB;AAAA,IACjC;AAAA,IACA,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,uBAAuB;AAAA,EACzB,CAAC;AACD,MAAI,GAAG,cAAc,SAAS,QAAQ;AACtC,SAAO;AACT;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMkB;AAChB,QAAM,gBAAgB,GAAG,UAAU,IAAI,WAAW,GAChD,sBAAsB,OAAO,KAAK,MAAM,iBAAiB,EAC3D;AACA,QAAM,qCACJ,0BAA0B,OAAO,KAAK,GAAG,qBAAqB;AAAA;AAChE,MAAI,wBAAwB,MAAM;AAChC,WAAO,GAAG,kCAAkC,GAAG,aAAa;AAAA;AAAA,EAC9D;AACA,QAAM,SAAS,OAAO,MAAM,mBAAmB;AAC/C,QAAM,WAAW,OAAO,UAAU;AAClC,MAAI,aAAa,aAAa;AAC5B,WAAO;AAAA,EACT;AACA,MAAI,aAAa,QAAW;AAC1B,WAAO,oBAAoB;AAAA,MACzB,eAAe,UAAU;AAAA,MACzB,GAAG,aAAa;AAAA,IAClB;AAAA,EACF,OAAO;AACL,UAAM,kBAAkB,oBAAoB,SAAS,IAAI,IAAI,OAAO;AACpE,WACE,sBACA,kBACA,qCACA,gBACA;AAAA,EAEJ;AACF;AAEO,SAAS,eAAe,YAAoB;AACjD,SAAO,IAAI,OAAO,IAAI,UAAU,OAAO,GAAG;AAC5C;AAEA,eAAsB,oBAAoB,KAGvC;AAED,MAAI,CAAC,IAAI,GAAG,OAAO,cAAc,GAAG;AAClC,WAAO;AAAA,MACL,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,WAAW,UAAM,8BAAgB,GAAG;AAG1C,QAAM,mBAAmB,mBAAmB;AAC5C,MAAI,kBAAkB;AACpB,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,WAAW,UAAU;AAC3B,MAAI,UAAU;AACZ,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,SAAS,UAAU;AACzB,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,UAAU,oBAAoB;AACpC,MAAI,SAAS;AACX,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,QAAM,cAAc,mBAAmB;AACvC,MAAI,aAAa;AACf,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,QAAM,SAAS,UAAU;AAEzB,MAAI,QAAQ;AACV,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,QAAQ;AAAA,IACV;AAAA,EACF;AAGA,QAAM,kBACJ,qBAAqB,YAAY,2BAA2B;AAE9D,MAAI,iBAAiB;AACnB,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,QAAQ;AAAA,IACV;AAAA,EACF;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,EACV;AACF;AAEA,eAAe,kBACb,KACA,OAC+B;AAC/B,QAAM,EAAE,mBAAmB,OAAO,IAAI,MAAM,oBAAoB,GAAG;AAEnE,QAAM,EAAE,SAAS,SAAS,IAAI,oBAAoB,KAAK,iBAAiB;AAExE,MAAI,CAAC,UAAU;AACb,WAAO,EAAE,SAAS,QAAQ,qBAAqB,KAAK;AAAA,EACtD;AAEA,QAAM,sBAAsB,IAAI,GAAG,aAAa,OAAO;AACvD,QAAM,SAAS,OAAO,MAAM,mBAAmB;AAE/C,QAAM,WAAW,OAAO,KAAK,MAAM,EAAE,OAAO,CAAC,QAAQ,eAAe,IAAI,GAAG,CAAC;AAC5E,MAAI,SAAS,SAAS,GAAG;AACvB;AAAA,MACE;AAAA,MACA,aAAAA,QAAM;AAAA,QACJ,sDAAsD,OAAO;AAAA,MAC/D;AAAA,IACF;AACA,WAAO;AAAA,EACT;AACA,MAAI,SAAS,WAAW,GAAG;AACzB,UAAM,CAAC,gBAAgB,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,OAAO,SAAS,CAAC,CAAC,CAAC;AACpE,QAAI,aAAa,OAAO;AACtB,aAAO;AAAA,IACT;AACA,QACE,aAAa,MACb,OAAO,OAAO,MAAM,EAAE,OAAO,CAAC,MAAM,MAAM,QAAQ,EAAE,WAAW,GAC/D;AACA;AAAA,QACE;AAAA,QACA,aAAAA,QAAM,OAAO,uBAAuB,OAAO,yBAAyB;AAAA,MACtE;AACA,aAAO;AAAA,IACT;AACA,WAAO,EAAE,SAAS,QAAQ,gBAAgB,oBAAoB;AAAA,EAChE;AACA,SAAO,EAAE,SAAS,QAAQ,oBAAoB;AAChD;AAEA,SAAS,oBACP,KACA,WAIA;AAEA,MAAI,IAAI,GAAG,OAAO,YAAY,GAAG;AAC/B,WAAO;AAAA,MACL,UAAU;AAAA,MACV,SAAS;AAAA,IACX;AAAA,EACF;AAGA,MAAI,cAAc,SAAS;AACzB,WAAO;AAAA,MACL,UAAU,IAAI,GAAG,OAAO,MAAM;AAAA,MAC9B,SAAS;AAAA,IACX;AAAA,EACF;AAGA,SAAO;AAAA,IACL,UAAU,IAAI,GAAG,OAAO,YAAY;AAAA,IACpC,SAAS;AAAA,EACX;AACF;AAEA,MAAM,iBAAiB,oBAAI,IAAI;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAEM,SAAS,mBAAqC;AACnD,SAAO,QAAQ,IAAI,SACf,WACA,QAAQ,IAAI,UACV,YACA;AACR;AAEO,SAAS,2BAA0C;AACxD,MAAI,QAAQ,IAAI,QAAQ;AAEtB,WAAO,QAAQ,IAAI,yBAAyB;AAAA,EAC9C;AACA,MAAI,QAAQ,IAAI,SAAS;AAEvB,WAAO,QAAQ,IAAI,QAAQ;AAAA,EAC7B;AAEA,MAAI,QAAQ,IAAI,IAAI;AAGlB,WACE,QAAQ,IAAI,mBAAmB,QAAQ,IAAI,sBAAsB;AAAA,EAErE;AAEA,SAAO;AACT;AAEO,SAAS,4BAAqC;AACnD,MAAI,QAAQ,IAAI,QAAQ;AAEtB,WAAO,QAAQ,IAAI,eAAe;AAAA,EACpC;AACA,MAAI,QAAQ,IAAI,SAAS;AAEvB,WAAO,QAAQ,IAAI,YAAY;AAAA,EACjC;AACA,SAAO;AACT;",
4
+ "sourcesContent": ["/**\n * Help the developer store the CONVEX_URL environment variable.\n */\nimport chalk from \"chalk\";\nimport * as dotenv from \"dotenv\";\n\nimport { Context, logWarning } from \"../../bundler/context.js\";\nimport { loadPackageJson } from \"./utils/utils.js\";\n\nconst _FRAMEWORKS = [\n \"create-react-app\",\n \"Next.js\",\n \"Vite\",\n \"Remix\",\n \"SvelteKit\",\n \"Expo\",\n \"TanStackStart\",\n] as const;\ntype Framework = (typeof _FRAMEWORKS)[number];\n\ntype ConvexUrlWriteConfig = {\n envFile: string;\n envVar: string;\n existingFileContent: string | null;\n} | null;\n\nexport async function writeConvexUrlToEnvFile(\n ctx: Context,\n value: string,\n): Promise<ConvexUrlWriteConfig> {\n const writeConfig = await envVarWriteConfig(ctx, value);\n\n if (writeConfig === null) {\n return null;\n }\n\n const { envFile, envVar, existingFileContent } = writeConfig;\n const modified = changedEnvVarFile({\n existingFileContent,\n envVarName: envVar,\n envVarValue: value,\n commentAfterValue: null,\n commentOnPreviousLine: null,\n })!;\n ctx.fs.writeUtf8File(envFile, modified);\n return writeConfig;\n}\n\nexport function changedEnvVarFile({\n existingFileContent,\n envVarName,\n envVarValue,\n commentAfterValue,\n commentOnPreviousLine,\n}: {\n existingFileContent: string | null;\n envVarName: string;\n envVarValue: string;\n commentAfterValue: string | null;\n commentOnPreviousLine: string | null;\n}): string | null {\n const varAssignment = `${envVarName}=${envVarValue}${\n commentAfterValue === null ? \"\" : ` # ${commentAfterValue}`\n }`;\n const commentOnPreviousLineWithLineBreak =\n commentOnPreviousLine === null ? \"\" : `${commentOnPreviousLine}\\n`;\n if (existingFileContent === null) {\n return `${commentOnPreviousLineWithLineBreak}${varAssignment}\\n`;\n }\n const config = dotenv.parse(existingFileContent);\n const existing = config[envVarName];\n if (existing === envVarValue) {\n return null;\n }\n if (existing !== undefined) {\n return existingFileContent.replace(\n getEnvVarRegex(envVarName),\n `${varAssignment}`,\n );\n } else {\n const doubleLineBreak = existingFileContent.endsWith(\"\\n\") ? \"\\n\" : \"\\n\\n\";\n return (\n existingFileContent +\n doubleLineBreak +\n commentOnPreviousLineWithLineBreak +\n varAssignment +\n \"\\n\"\n );\n }\n}\n\nexport function getEnvVarRegex(envVarName: string) {\n return new RegExp(`^${envVarName}.*$`, \"m\");\n}\n\nexport async function suggestedEnvVarName(ctx: Context): Promise<{\n detectedFramework?: Framework;\n envVar: string;\n}> {\n // no package.json, that's fine, just guess\n if (!ctx.fs.exists(\"package.json\")) {\n return {\n envVar: \"CONVEX_URL\",\n };\n }\n\n const packages = await loadPackageJson(ctx);\n\n // Is it create-react-app?\n const isCreateReactApp = \"react-scripts\" in packages;\n if (isCreateReactApp) {\n return {\n detectedFramework: \"create-react-app\",\n envVar: \"REACT_APP_CONVEX_URL\",\n };\n }\n\n const isNextJs = \"next\" in packages;\n if (isNextJs) {\n return {\n detectedFramework: \"Next.js\",\n envVar: \"NEXT_PUBLIC_CONVEX_URL\",\n };\n }\n\n const isExpo = \"expo\" in packages;\n if (isExpo) {\n return {\n detectedFramework: \"Expo\",\n envVar: \"EXPO_PUBLIC_CONVEX_URL\",\n };\n }\n\n const isRemix = \"@remix-run/dev\" in packages;\n if (isRemix) {\n return {\n detectedFramework: \"Remix\",\n envVar: \"CONVEX_URL\",\n };\n }\n\n const isSvelteKit = \"@sveltejs/kit\" in packages;\n if (isSvelteKit) {\n return {\n detectedFramework: \"SvelteKit\",\n envVar: \"PUBLIC_CONVEX_URL\",\n };\n }\n\n // Vite is a dependency of a lot of things; vite appearing in dependencies is not a strong indicator.\n const isVite = \"vite\" in packages;\n\n if (isVite) {\n return {\n detectedFramework: \"Vite\",\n envVar: \"VITE_CONVEX_URL\",\n };\n }\n\n // TanStackStart currently supports VITE_FOO for browser-side envvars.\n const isTanStackStart =\n \"@tanstack/start\" in packages || \"@tanstack/react-start\" in packages;\n\n if (isTanStackStart) {\n return {\n detectedFramework: \"TanStackStart\",\n envVar: \"VITE_CONVEX_URL\",\n };\n }\n\n return {\n envVar: \"CONVEX_URL\",\n };\n}\n\nasync function envVarWriteConfig(\n ctx: Context,\n value: string | null,\n): Promise<ConvexUrlWriteConfig> {\n const { detectedFramework, envVar } = await suggestedEnvVarName(ctx);\n\n const { envFile, existing } = suggestedDevEnvFile(ctx, detectedFramework);\n\n if (!existing) {\n return { envFile, envVar, existingFileContent: null };\n }\n\n const existingFileContent = ctx.fs.readUtf8File(envFile);\n const config = dotenv.parse(existingFileContent);\n\n const matching = Object.keys(config).filter((key) => EXPECTED_NAMES.has(key));\n if (matching.length > 1) {\n logWarning(\n ctx,\n chalk.yellow(\n `Found multiple CONVEX_URL environment variables in ${envFile} so cannot update automatically.`,\n ),\n );\n return null;\n }\n if (matching.length === 1) {\n const [existingEnvVar, oldValue] = [matching[0], config[matching[0]]];\n if (oldValue === value) {\n return null;\n }\n if (\n oldValue !== \"\" &&\n Object.values(config).filter((v) => v === oldValue).length !== 1\n ) {\n logWarning(\n ctx,\n chalk.yellow(`Can't safely modify ${envFile}, please edit manually.`),\n );\n return null;\n }\n return { envFile, envVar: existingEnvVar, existingFileContent };\n }\n return { envFile, envVar, existingFileContent };\n}\n\nfunction suggestedDevEnvFile(\n ctx: Context,\n framework?: Framework,\n): {\n existing: boolean;\n envFile: string;\n} {\n // If a .env.local file exists, that's unequivocally the right file\n if (ctx.fs.exists(\".env.local\")) {\n return {\n existing: true,\n envFile: \".env.local\",\n };\n }\n\n // Remix is on team \"don't commit the .env file,\" so .env is for dev.\n if (framework === \"Remix\") {\n return {\n existing: ctx.fs.exists(\".env\"),\n envFile: \".env\",\n };\n }\n\n // The most dev-looking env file that exists, or .env.local\n return {\n existing: ctx.fs.exists(\".env.local\"),\n envFile: \".env.local\",\n };\n}\n\nconst EXPECTED_NAMES = new Set([\n \"CONVEX_URL\",\n \"PUBLIC_CONVEX_URL\",\n \"NEXT_PUBLIC_CONVEX_URL\",\n \"VITE_CONVEX_URL\",\n \"REACT_APP_CONVEX_URL\",\n \"EXPO_PUBLIC_CONVEX_URL\",\n]);\n\n// Crash or warn on\n// CONVEX_DEPLOY_KEY=project:me:new-project|eyABCD0= npx convex\n// which parses as\n// CONVEX_DEPLOY_KEY=project:me:new-project | eyABCD0='' npx convex\n// when what was intended was\n// CONVEX_DEPLOY_KEY=project:me:new-project|eyABCD0= npx convex\n// This only fails so catastrophically when the key ends with `=`.\nexport async function detectSuspiciousEnvironmentVariables(\n ctx: Context,\n ignoreSuspiciousEnvVars = false,\n) {\n for (const [key, value] of Object.entries(process.env)) {\n if (value === \"\" && key.startsWith(\"ey\")) {\n try {\n // add a \"=\" to the end and try to base64 decode (expected format of Convex keys)\n const decoded = JSON.parse(\n Buffer.from(key + \"=\", \"base64\").toString(\"utf8\"),\n );\n // Only parseable v2 tokens to be sure this is a Convex token before complaining.\n if (!(\"v2\" in decoded)) {\n continue;\n }\n } catch {\n continue;\n }\n\n if (ignoreSuspiciousEnvVars) {\n logWarning(\n ctx,\n `ignoring suspicious environment variable ${key}, did you mean to use quotes like CONVEX_DEPLOY_KEY='...'?`,\n );\n } else {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Quotes are required around environment variable values by your shell: CONVEX_DEPLOY_KEY='project:name:project|${key.slice(0, 4)}...${key.slice(key.length - 4)}=' npx convex dev`,\n });\n }\n }\n }\n}\n\nexport function buildEnvironment(): string | boolean {\n return process.env.VERCEL\n ? \"Vercel\"\n : process.env.NETLIFY\n ? \"Netlify\"\n : false;\n}\n\nexport function gitBranchFromEnvironment(): string | null {\n if (process.env.VERCEL) {\n // https://vercel.com/docs/projects/environment-variables/system-environment-variables\n return process.env.VERCEL_GIT_COMMIT_REF ?? null;\n }\n if (process.env.NETLIFY) {\n // https://docs.netlify.com/configure-builds/environment-variables/\n return process.env.HEAD ?? null;\n }\n\n if (process.env.CI) {\n // https://docs.github.com/en/actions/learn-github-actions/variables\n // https://docs.gitlab.com/ee/ci/variables/predefined_variables.html\n return (\n process.env.GITHUB_HEAD_REF ?? process.env.CI_COMMIT_REF_NAME ?? null\n );\n }\n\n return null;\n}\n\nexport function isNonProdBuildEnvironment(): boolean {\n if (process.env.VERCEL) {\n // https://vercel.com/docs/projects/environment-variables/system-environment-variables\n return process.env.VERCEL_ENV !== \"production\";\n }\n if (process.env.NETLIFY) {\n // https://docs.netlify.com/configure-builds/environment-variables/\n return process.env.CONTEXT !== \"production\";\n }\n return false;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["chalk"]
7
7
  }
@@ -54,6 +54,7 @@ var import_deployment = require("../deployment.js");
54
54
  var import_api = require("../api.js");
55
55
  var import_deployment2 = require("../deployment.js");
56
56
  var import_fs = require("../../../bundler/fs.js");
57
+ var import_codegen = require("../codegen.js");
57
58
  async function handleAnonymousDeployment(ctx, options) {
58
59
  if (await (0, import_utils.isOffline)()) {
59
60
  return await ctx.crash({
@@ -66,7 +67,7 @@ async function handleAnonymousDeployment(ctx, options) {
66
67
  deploymentName: options.deploymentName,
67
68
  chosenConfiguration: options.chosenConfiguration
68
69
  });
69
- if (deployment.kind === "first") {
70
+ if (deployment.kind === "first" && process.env.CONVEX_AGENT_MODE !== "anonymous") {
70
71
  (0, import_context.logMessage)(
71
72
  ctx,
72
73
  "This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory."
@@ -159,6 +160,9 @@ async function handleAnonymousDeployment(ctx, options) {
159
160
  await cleanupFunc(exitCode, err);
160
161
  }
161
162
  });
163
+ if (deployment.kind === "new") {
164
+ await (0, import_codegen.doCodegenForNewProject)(ctx);
165
+ }
162
166
  return {
163
167
  adminKey,
164
168
  deploymentName: deployment.deploymentName,
@@ -214,6 +218,20 @@ async function chooseDeployment(ctx, options) {
214
218
  (0, import_context.logMessage)(ctx, "Let's set up your first project.");
215
219
  return await promptForNewDeployment(ctx, []);
216
220
  }
221
+ if (process.env.CONVEX_AGENT_MODE === "anonymous") {
222
+ const deploymentName = "anonymous-agent";
223
+ (0, import_context.logVerbose)(ctx, `Deployment name: ${deploymentName}`);
224
+ const uniqueName = await getUniqueName(
225
+ ctx,
226
+ deploymentName,
227
+ deployments.map((d) => d.deploymentName)
228
+ );
229
+ (0, import_context.logVerbose)(ctx, `Deployment name: ${uniqueName}`);
230
+ return {
231
+ kind: "new",
232
+ deploymentName: uniqueName
233
+ };
234
+ }
217
235
  if (options.chosenConfiguration === "new") {
218
236
  const deploymentName = await (0, import_prompts.promptString)(ctx, {
219
237
  message: "Choose a name for your new project:",
@@ -313,11 +331,7 @@ async function handleLinkToProject(ctx, args) {
313
331
  ctx,
314
332
  `Linking ${args.deploymentName} to a project in team ${args.teamSlug}`
315
333
  );
316
- const config = await (0, import_filePaths.loadDeploymentConfig)(
317
- ctx,
318
- "anonymous",
319
- args.deploymentName
320
- );
334
+ const config = (0, import_filePaths.loadDeploymentConfig)(ctx, "anonymous", args.deploymentName);
321
335
  if (config === null) {
322
336
  return ctx.crash({
323
337
  exitCode: 1,
@@ -376,7 +390,7 @@ async function handleLinkToProject(ctx, args) {
376
390
  }
377
391
  );
378
392
  (0, import_context.logVerbose)(ctx, `Saving deployment config for ${localDeploymentName}`);
379
- await (0, import_filePaths.saveDeploymentConfig)(ctx, "local", localDeploymentName, {
393
+ (0, import_filePaths.saveDeploymentConfig)(ctx, "local", localDeploymentName, {
380
394
  adminKey,
381
395
  backendVersion: config.backendVersion,
382
396
  ports: config.ports
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/localDeployment/anonymous.ts"],
4
- "sourcesContent": ["// ----------------------------------------------------------------------------\n// Anonymous (No account)\n\nimport path from \"path\";\nimport {\n Context,\n logFinishedStep,\n logMessage,\n logVerbose,\n logWarning,\n} from \"../../../bundler/context.js\";\nimport { promptSearch, promptString, promptYesNo } from \"../utils/prompts.js\";\nimport {\n bigBrainGenerateAdminKeyForAnonymousDeployment,\n bigBrainPause,\n bigBrainStart,\n} from \"./bigBrain.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n ensureUuidForAnonymousUser,\n loadDeploymentConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { rootDeploymentStateDir } from \"./filePaths.js\";\nimport { LocalDeploymentConfig } from \"./filePaths.js\";\nimport { DeploymentDetails } from \"./localDeployment.js\";\nimport { ensureBackendStopped, localDeploymentUrl } from \"./run.js\";\nimport { ensureBackendRunning } from \"./run.js\";\nimport { handlePotentialUpgrade } from \"./upgrade.js\";\nimport {\n isOffline,\n generateInstanceSecret,\n choosePorts,\n LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./utils.js\";\nimport { handleDashboard } from \"./dashboard.js\";\nimport crypto from \"crypto\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { isAnonymousDeployment } from \"../deployment.js\";\nimport { createProject } from \"../api.js\";\nimport { removeAnonymousPrefix } from \"../deployment.js\";\nimport { nodeFs } from \"../../../bundler/fs.js\";\n\nexport async function handleAnonymousDeployment(\n ctx: Context,\n options: {\n ports?: {\n cloud: number;\n site: number;\n };\n backendVersion?: string;\n dashboardVersion?: string;\n forceUpgrade: boolean;\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<DeploymentDetails> {\n if (await isOffline()) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Cannot run a local deployment while offline\",\n });\n }\n\n const deployment = await chooseDeployment(ctx, {\n deploymentName: options.deploymentName,\n chosenConfiguration: options.chosenConfiguration,\n });\n if (deployment.kind === \"first\") {\n logMessage(\n ctx,\n \"This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.\",\n );\n logMessage(\n ctx,\n \"Use `npx convex dashboard` to view and interact with your project from a web UI.\",\n );\n logMessage(\n ctx,\n \"Use `npx convex docs` to read the docs and `npx convex help` to see other commands.\",\n );\n ensureUuidForAnonymousUser(ctx);\n if (process.stdin.isTTY) {\n const result = await promptYesNo(ctx, {\n message: \"Continue?\",\n default: true,\n });\n if (!result) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Exiting\",\n });\n }\n }\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError(ctx);\n }\n });\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n await handleDashboard(ctx, version);\n let adminKey: string;\n let instanceSecret: string;\n if (deployment.kind === \"existing\") {\n adminKey = deployment.config.adminKey;\n instanceSecret =\n deployment.config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: deployment.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: deployment.deploymentName,\n allowOtherDeployments: true,\n });\n } else {\n instanceSecret = generateInstanceSecret();\n const data = await bigBrainGenerateAdminKeyForAnonymousDeployment(ctx, {\n instanceName: deployment.deploymentName,\n instanceSecret,\n });\n adminKey = data.adminKey;\n }\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [options.ports?.cloud ?? null, options.ports?.site ?? null],\n });\n const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {\n await ensureBackendRunning(ctx, {\n cloudPort,\n deploymentName: deployment.deploymentName,\n maxTimeSecs: 5,\n });\n if (isOffline) {\n return;\n }\n };\n\n const { cleanupHandle } = await handlePotentialUpgrade(ctx, {\n deploymentName: deployment.deploymentName,\n deploymentKind: \"anonymous\",\n oldVersion:\n deployment.kind === \"existing\" ? deployment.config.backendVersion : null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n forceUpgrade: options.forceUpgrade,\n });\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n });\n\n return {\n adminKey,\n deploymentName: deployment.deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n onActivity,\n };\n}\n\nexport async function loadAnonymousDeployment(\n ctx: Context,\n deploymentName: string,\n): Promise<LocalDeploymentConfig> {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find deployment with name ${deploymentName}!`,\n });\n }\n return config;\n}\n\nexport async function listExistingAnonymousDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const dir = rootDeploymentStateDir(\"anonymous\");\n if (!ctx.fs.exists(dir)) {\n return [];\n }\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => isAnonymousDeployment(d));\n return deploymentNames.flatMap((deploymentName) => {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config !== null) {\n return [{ deploymentName, config }];\n }\n return [];\n });\n}\n\nasync function chooseDeployment(\n ctx: Context,\n options: {\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<\n | {\n kind: \"existing\";\n deploymentName: string;\n config: LocalDeploymentConfig;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n | {\n kind: \"first\";\n deploymentName: string;\n }\n> {\n const deployments = await listExistingAnonymousDeployments(ctx);\n if (options.deploymentName !== null && options.chosenConfiguration === null) {\n const existing = deployments.find(\n (d) => d.deploymentName === options.deploymentName,\n );\n if (existing === undefined) {\n logWarning(\n ctx,\n `Could not find project with name ${options.deploymentName}!`,\n );\n } else {\n return {\n kind: \"existing\",\n deploymentName: existing.deploymentName,\n config: existing.config,\n };\n }\n }\n if (deployments.length === 0) {\n logMessage(ctx, \"Let's set up your first project.\");\n return await promptForNewDeployment(ctx, []);\n }\n\n if (options.chosenConfiguration === \"new\") {\n const deploymentName = await promptString(ctx, {\n message: \"Choose a name for your new project:\",\n default: path.basename(process.cwd()),\n });\n const uniqueName = await getUniqueName(\n ctx,\n deploymentName,\n deployments.map((d) => d.deploymentName),\n );\n logVerbose(ctx, `Deployment name: ${uniqueName}`);\n return {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n }\n\n const newOrExisting = await promptSearch(ctx, {\n message: \"Which project would you like to use?\",\n choices: [\n ...(options.chosenConfiguration === \"existing\"\n ? []\n : [\n {\n name: \"Create a new one\",\n value: \"new\",\n },\n ]),\n ...deployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n ],\n });\n\n if (newOrExisting !== \"new\") {\n const existingDeployment = deployments.find(\n (d) => d.deploymentName === newOrExisting,\n );\n if (existingDeployment === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find project with name ${newOrExisting}!`,\n });\n }\n return {\n kind: \"existing\",\n deploymentName: existingDeployment.deploymentName,\n config: existingDeployment.config,\n };\n }\n return await promptForNewDeployment(\n ctx,\n deployments.map((d) => d.deploymentName),\n );\n}\n\nasync function promptForNewDeployment(\n ctx: Context,\n existingNames: string[],\n): Promise<\n | {\n kind: \"first\";\n deploymentName: string;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n> {\n const isFirstDeployment = existingNames.length === 0;\n const deploymentName = await promptString(ctx, {\n message: \"Choose a name:\",\n default: path.basename(process.cwd()),\n });\n\n const uniqueName = await getUniqueName(\n ctx,\n `anonymous-${deploymentName}`,\n existingNames,\n );\n logVerbose(ctx, `Deployment name: ${uniqueName}`);\n return isFirstDeployment\n ? {\n kind: \"first\",\n deploymentName: uniqueName,\n }\n : {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n}\n\nasync function getUniqueName(\n ctx: Context,\n name: string,\n existingNames: string[],\n) {\n if (!existingNames.includes(name)) {\n return name;\n }\n for (let i = 1; i <= 5; i++) {\n const uniqueName = `${name}-${i}`;\n if (!existingNames.includes(uniqueName)) {\n return uniqueName;\n }\n }\n const randomSuffix = crypto.randomBytes(4).toString(\"hex\");\n\n const uniqueName = `${name}-${randomSuffix}`;\n if (!existingNames.includes(uniqueName)) {\n return uniqueName;\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not generate a unique name for your project, please choose a different name`,\n });\n}\n/**\n * This takes an \"anonymous\" deployment and makes it a \"local\" deployment\n * that is associated with a project in the given team.\n */\nexport async function handleLinkToProject(\n ctx: Context,\n args: {\n deploymentName: string;\n teamSlug: string;\n projectSlug: string | null;\n },\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n projectSlug: string;\n}> {\n logVerbose(\n ctx,\n `Linking ${args.deploymentName} to a project in team ${args.teamSlug}`,\n );\n const config = await loadDeploymentConfig(\n ctx,\n \"anonymous\",\n args.deploymentName,\n );\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to load deployment config\",\n });\n }\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: config.ports.cloud,\n },\n deploymentName: args.deploymentName,\n allowOtherDeployments: true,\n maxTimeSecs: 5,\n });\n const projectName = removeAnonymousPrefix(args.deploymentName);\n let projectSlug: string;\n if (args.projectSlug !== null) {\n projectSlug = args.projectSlug;\n } else {\n const { projectSlug: newProjectSlug } = await createProject(ctx, {\n teamSlug: args.teamSlug,\n projectName,\n deploymentTypeToProvision: \"prod\",\n });\n projectSlug = newProjectSlug;\n }\n logVerbose(ctx, `Creating local deployment in project ${projectSlug}`);\n // Register it in big brain\n const { deploymentName: localDeploymentName, adminKey } = await bigBrainStart(\n ctx,\n {\n port: config.ports.cloud,\n projectSlug,\n teamSlug: args.teamSlug,\n instanceName: null,\n },\n );\n const localConfig = loadDeploymentConfig(ctx, \"local\", localDeploymentName);\n if (localConfig !== null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Project ${projectSlug} already has a local deployment, so we cannot link this anonymous local deployment to it.`,\n });\n }\n logVerbose(ctx, `Moving ${args.deploymentName} to ${localDeploymentName}`);\n await moveDeployment(\n ctx,\n {\n deploymentKind: \"anonymous\",\n deploymentName: args.deploymentName,\n },\n {\n deploymentKind: \"local\",\n deploymentName: localDeploymentName,\n },\n );\n logVerbose(ctx, `Saving deployment config for ${localDeploymentName}`);\n await saveDeploymentConfig(ctx, \"local\", localDeploymentName, {\n adminKey,\n backendVersion: config.backendVersion,\n ports: config.ports,\n });\n await bigBrainPause(ctx, {\n projectSlug,\n teamSlug: args.teamSlug,\n });\n logFinishedStep(\n ctx,\n `Linked ${args.deploymentName} to project ${projectSlug}`,\n );\n return {\n projectSlug,\n deploymentName: localDeploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n };\n}\n\nexport async function moveDeployment(\n ctx: Context,\n oldDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n newDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n) {\n const oldPath = deploymentStateDir(\n oldDeployment.deploymentKind,\n oldDeployment.deploymentName,\n );\n const newPath = deploymentStateDir(\n newDeployment.deploymentKind,\n newDeployment.deploymentName,\n );\n await recursivelyCopy(ctx, nodeFs, oldPath, newPath);\n recursivelyDelete(ctx, oldPath);\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["// ----------------------------------------------------------------------------\n// Anonymous (No account)\n\nimport path from \"path\";\nimport {\n Context,\n logFinishedStep,\n logMessage,\n logVerbose,\n logWarning,\n} from \"../../../bundler/context.js\";\nimport { promptSearch, promptString, promptYesNo } from \"../utils/prompts.js\";\nimport {\n bigBrainGenerateAdminKeyForAnonymousDeployment,\n bigBrainPause,\n bigBrainStart,\n} from \"./bigBrain.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n ensureUuidForAnonymousUser,\n loadDeploymentConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { rootDeploymentStateDir } from \"./filePaths.js\";\nimport { LocalDeploymentConfig } from \"./filePaths.js\";\nimport { DeploymentDetails } from \"./localDeployment.js\";\nimport { ensureBackendStopped, localDeploymentUrl } from \"./run.js\";\nimport { ensureBackendRunning } from \"./run.js\";\nimport { handlePotentialUpgrade } from \"./upgrade.js\";\nimport {\n isOffline,\n generateInstanceSecret,\n choosePorts,\n LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./utils.js\";\nimport { handleDashboard } from \"./dashboard.js\";\nimport crypto from \"crypto\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { isAnonymousDeployment } from \"../deployment.js\";\nimport { createProject } from \"../api.js\";\nimport { removeAnonymousPrefix } from \"../deployment.js\";\nimport { nodeFs } from \"../../../bundler/fs.js\";\nimport { doCodegenForNewProject } from \"../codegen.js\";\n\nexport async function handleAnonymousDeployment(\n ctx: Context,\n options: {\n ports?: {\n cloud: number;\n site: number;\n };\n backendVersion?: string;\n dashboardVersion?: string;\n forceUpgrade: boolean;\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<DeploymentDetails> {\n if (await isOffline()) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Cannot run a local deployment while offline\",\n });\n }\n\n const deployment = await chooseDeployment(ctx, {\n deploymentName: options.deploymentName,\n chosenConfiguration: options.chosenConfiguration,\n });\n if (\n deployment.kind === \"first\" &&\n process.env.CONVEX_AGENT_MODE !== \"anonymous\"\n ) {\n logMessage(\n ctx,\n \"This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.\",\n );\n logMessage(\n ctx,\n \"Use `npx convex dashboard` to view and interact with your project from a web UI.\",\n );\n logMessage(\n ctx,\n \"Use `npx convex docs` to read the docs and `npx convex help` to see other commands.\",\n );\n ensureUuidForAnonymousUser(ctx);\n if (process.stdin.isTTY) {\n const result = await promptYesNo(ctx, {\n message: \"Continue?\",\n default: true,\n });\n if (!result) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Exiting\",\n });\n }\n }\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError(ctx);\n }\n });\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n await handleDashboard(ctx, version);\n let adminKey: string;\n let instanceSecret: string;\n if (deployment.kind === \"existing\") {\n adminKey = deployment.config.adminKey;\n instanceSecret =\n deployment.config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: deployment.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: deployment.deploymentName,\n allowOtherDeployments: true,\n });\n } else {\n instanceSecret = generateInstanceSecret();\n const data = await bigBrainGenerateAdminKeyForAnonymousDeployment(ctx, {\n instanceName: deployment.deploymentName,\n instanceSecret,\n });\n adminKey = data.adminKey;\n }\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [options.ports?.cloud ?? null, options.ports?.site ?? null],\n });\n const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {\n await ensureBackendRunning(ctx, {\n cloudPort,\n deploymentName: deployment.deploymentName,\n maxTimeSecs: 5,\n });\n if (isOffline) {\n return;\n }\n };\n\n const { cleanupHandle } = await handlePotentialUpgrade(ctx, {\n deploymentName: deployment.deploymentName,\n deploymentKind: \"anonymous\",\n oldVersion:\n deployment.kind === \"existing\" ? deployment.config.backendVersion : null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n forceUpgrade: options.forceUpgrade,\n });\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n });\n\n if (deployment.kind === \"new\") {\n await doCodegenForNewProject(ctx);\n }\n return {\n adminKey,\n deploymentName: deployment.deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n onActivity,\n };\n}\n\nexport async function loadAnonymousDeployment(\n ctx: Context,\n deploymentName: string,\n): Promise<LocalDeploymentConfig> {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find deployment with name ${deploymentName}!`,\n });\n }\n return config;\n}\n\nexport async function listExistingAnonymousDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const dir = rootDeploymentStateDir(\"anonymous\");\n if (!ctx.fs.exists(dir)) {\n return [];\n }\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => isAnonymousDeployment(d));\n return deploymentNames.flatMap((deploymentName) => {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config !== null) {\n return [{ deploymentName, config }];\n }\n return [];\n });\n}\n\nasync function chooseDeployment(\n ctx: Context,\n options: {\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<\n | {\n kind: \"existing\";\n deploymentName: string;\n config: LocalDeploymentConfig;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n | {\n kind: \"first\";\n deploymentName: string;\n }\n> {\n const deployments = await listExistingAnonymousDeployments(ctx);\n if (options.deploymentName !== null && options.chosenConfiguration === null) {\n const existing = deployments.find(\n (d) => d.deploymentName === options.deploymentName,\n );\n if (existing === undefined) {\n logWarning(\n ctx,\n `Could not find project with name ${options.deploymentName}!`,\n );\n } else {\n return {\n kind: \"existing\",\n deploymentName: existing.deploymentName,\n config: existing.config,\n };\n }\n }\n if (deployments.length === 0) {\n logMessage(ctx, \"Let's set up your first project.\");\n return await promptForNewDeployment(ctx, []);\n }\n\n if (process.env.CONVEX_AGENT_MODE === \"anonymous\") {\n const deploymentName = \"anonymous-agent\";\n logVerbose(ctx, `Deployment name: ${deploymentName}`);\n const uniqueName = await getUniqueName(\n ctx,\n deploymentName,\n deployments.map((d) => d.deploymentName),\n );\n logVerbose(ctx, `Deployment name: ${uniqueName}`);\n return {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n }\n\n if (options.chosenConfiguration === \"new\") {\n const deploymentName = await promptString(ctx, {\n message: \"Choose a name for your new project:\",\n default: path.basename(process.cwd()),\n });\n const uniqueName = await getUniqueName(\n ctx,\n deploymentName,\n deployments.map((d) => d.deploymentName),\n );\n logVerbose(ctx, `Deployment name: ${uniqueName}`);\n return {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n }\n\n const newOrExisting = await promptSearch(ctx, {\n message: \"Which project would you like to use?\",\n choices: [\n ...(options.chosenConfiguration === \"existing\"\n ? []\n : [\n {\n name: \"Create a new one\",\n value: \"new\",\n },\n ]),\n ...deployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n ],\n });\n\n if (newOrExisting !== \"new\") {\n const existingDeployment = deployments.find(\n (d) => d.deploymentName === newOrExisting,\n );\n if (existingDeployment === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find project with name ${newOrExisting}!`,\n });\n }\n return {\n kind: \"existing\",\n deploymentName: existingDeployment.deploymentName,\n config: existingDeployment.config,\n };\n }\n return await promptForNewDeployment(\n ctx,\n deployments.map((d) => d.deploymentName),\n );\n}\n\nasync function promptForNewDeployment(\n ctx: Context,\n existingNames: string[],\n): Promise<\n | {\n kind: \"first\";\n deploymentName: string;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n> {\n const isFirstDeployment = existingNames.length === 0;\n const deploymentName = await promptString(ctx, {\n message: \"Choose a name:\",\n default: path.basename(process.cwd()),\n });\n\n const uniqueName = await getUniqueName(\n ctx,\n `anonymous-${deploymentName}`,\n existingNames,\n );\n logVerbose(ctx, `Deployment name: ${uniqueName}`);\n return isFirstDeployment\n ? {\n kind: \"first\",\n deploymentName: uniqueName,\n }\n : {\n kind: \"new\",\n deploymentName: uniqueName,\n };\n}\n\nasync function getUniqueName(\n ctx: Context,\n name: string,\n existingNames: string[],\n) {\n if (!existingNames.includes(name)) {\n return name;\n }\n for (let i = 1; i <= 5; i++) {\n const uniqueName = `${name}-${i}`;\n if (!existingNames.includes(uniqueName)) {\n return uniqueName;\n }\n }\n const randomSuffix = crypto.randomBytes(4).toString(\"hex\");\n\n const uniqueName = `${name}-${randomSuffix}`;\n if (!existingNames.includes(uniqueName)) {\n return uniqueName;\n }\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not generate a unique name for your project, please choose a different name`,\n });\n}\n/**\n * This takes an \"anonymous\" deployment and makes it a \"local\" deployment\n * that is associated with a project in the given team.\n */\nexport async function handleLinkToProject(\n ctx: Context,\n args: {\n deploymentName: string;\n teamSlug: string;\n projectSlug: string | null;\n },\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n projectSlug: string;\n}> {\n logVerbose(\n ctx,\n `Linking ${args.deploymentName} to a project in team ${args.teamSlug}`,\n );\n const config = loadDeploymentConfig(ctx, \"anonymous\", args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Failed to load deployment config\",\n });\n }\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: config.ports.cloud,\n },\n deploymentName: args.deploymentName,\n allowOtherDeployments: true,\n maxTimeSecs: 5,\n });\n const projectName = removeAnonymousPrefix(args.deploymentName);\n let projectSlug: string;\n if (args.projectSlug !== null) {\n projectSlug = args.projectSlug;\n } else {\n const { projectSlug: newProjectSlug } = await createProject(ctx, {\n teamSlug: args.teamSlug,\n projectName,\n deploymentTypeToProvision: \"prod\",\n });\n projectSlug = newProjectSlug;\n }\n logVerbose(ctx, `Creating local deployment in project ${projectSlug}`);\n // Register it in big brain\n const { deploymentName: localDeploymentName, adminKey } = await bigBrainStart(\n ctx,\n {\n port: config.ports.cloud,\n projectSlug,\n teamSlug: args.teamSlug,\n instanceName: null,\n },\n );\n const localConfig = loadDeploymentConfig(ctx, \"local\", localDeploymentName);\n if (localConfig !== null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Project ${projectSlug} already has a local deployment, so we cannot link this anonymous local deployment to it.`,\n });\n }\n logVerbose(ctx, `Moving ${args.deploymentName} to ${localDeploymentName}`);\n await moveDeployment(\n ctx,\n {\n deploymentKind: \"anonymous\",\n deploymentName: args.deploymentName,\n },\n {\n deploymentKind: \"local\",\n deploymentName: localDeploymentName,\n },\n );\n logVerbose(ctx, `Saving deployment config for ${localDeploymentName}`);\n saveDeploymentConfig(ctx, \"local\", localDeploymentName, {\n adminKey,\n backendVersion: config.backendVersion,\n ports: config.ports,\n });\n await bigBrainPause(ctx, {\n projectSlug,\n teamSlug: args.teamSlug,\n });\n logFinishedStep(\n ctx,\n `Linked ${args.deploymentName} to project ${projectSlug}`,\n );\n return {\n projectSlug,\n deploymentName: localDeploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n };\n}\n\nexport async function moveDeployment(\n ctx: Context,\n oldDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n newDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n) {\n const oldPath = deploymentStateDir(\n oldDeployment.deploymentKind,\n oldDeployment.deploymentName,\n );\n const newPath = deploymentStateDir(\n newDeployment.deploymentKind,\n newDeployment.deploymentName,\n );\n await recursivelyCopy(ctx, nodeFs, oldPath, newPath);\n recursivelyDelete(ctx, oldPath);\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_filePaths", "import_run", "import_deployment", "isOffline", "path", "uniqueName", "crypto"]
7
7
  }
@@ -71,7 +71,7 @@ const RunTool = {
71
71
  args.functionName,
72
72
  projectConfig.functions
73
73
  );
74
- const logger = new import_logging.Logger({ verbose: true });
74
+ const logger = new import_logging.DefaultLogger({ verbose: true });
75
75
  const logLines = [];
76
76
  logger.addLogLineListener((level, ...args2) => {
77
77
  logLines.push(`${level}: ${args2.join(" ")}`);