convex 1.42.1 → 1.42.2

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 (132) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/browser.bundle.js +1 -1
  3. package/dist/browser.bundle.js.map +2 -2
  4. package/dist/cjs/browser/simple_client.js +2 -2
  5. package/dist/cjs/browser/simple_client.js.map +2 -2
  6. package/dist/cjs/cli/codegen_templates/common.js +6 -0
  7. package/dist/cjs/cli/codegen_templates/common.js.map +2 -2
  8. package/dist/cjs/cli/dev.js +1 -0
  9. package/dist/cjs/cli/dev.js.map +2 -2
  10. package/dist/cjs/cli/generatedApi.js.map +1 -1
  11. package/dist/cjs/cli/lib/api.js.map +2 -2
  12. package/dist/cjs/cli/lib/codegen.js +2 -1
  13. package/dist/cjs/cli/lib/codegen.js.map +2 -2
  14. package/dist/cjs/cli/lib/utils/utils.js +4 -12
  15. package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
  16. package/dist/cjs/index.js +1 -1
  17. package/dist/cjs/index.js.map +1 -1
  18. package/dist/cjs/react/client.js +1 -1
  19. package/dist/cjs/react/client.js.map +2 -2
  20. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js +2 -1
  21. package/dist/cjs/react-clerk/ConvexProviderWithClerk.js.map +2 -2
  22. package/dist/cjs/server/database.js.map +1 -1
  23. package/dist/cjs/server/impl/meta_impl.js +2 -2
  24. package/dist/cjs/server/impl/meta_impl.js.map +2 -2
  25. package/dist/cjs/server/impl/query_impl.js.map +2 -2
  26. package/dist/cjs/server/meta.js.map +1 -1
  27. package/dist/cjs/server/query.js.map +1 -1
  28. package/dist/cjs/server/registration.js.map +1 -1
  29. package/dist/cjs/server/schema.js.map +1 -1
  30. package/dist/cjs-types/browser/simple_client.d.ts +1 -2
  31. package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
  32. package/dist/cjs-types/cli/codegen_templates/common.d.ts +12 -0
  33. package/dist/cjs-types/cli/codegen_templates/common.d.ts.map +1 -1
  34. package/dist/cjs-types/cli/codegen_templates/common.test.d.ts +2 -0
  35. package/dist/cjs-types/cli/codegen_templates/common.test.d.ts.map +1 -0
  36. package/dist/cjs-types/cli/dev.d.ts.map +1 -1
  37. package/dist/cjs-types/cli/dev.test.d.ts +2 -0
  38. package/dist/cjs-types/cli/dev.test.d.ts.map +1 -0
  39. package/dist/cjs-types/cli/generatedApi.d.ts +0 -1
  40. package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
  41. package/dist/cjs-types/cli/lib/api.d.ts +0 -1
  42. package/dist/cjs-types/cli/lib/api.d.ts.map +1 -1
  43. package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
  44. package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
  45. package/dist/cjs-types/index.d.ts +1 -1
  46. package/dist/cjs-types/react/client.d.ts.map +1 -1
  47. package/dist/cjs-types/react/client_provided_base_client.test.d.ts +2 -0
  48. package/dist/cjs-types/react/client_provided_base_client.test.d.ts.map +1 -0
  49. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -0
  50. package/dist/cjs-types/react-clerk/ConvexProviderWithClerk.d.ts.map +1 -1
  51. package/dist/cjs-types/server/database.d.ts.map +1 -1
  52. package/dist/cjs-types/server/impl/query_impl.d.ts.map +1 -1
  53. package/dist/cjs-types/server/meta.d.ts +8 -0
  54. package/dist/cjs-types/server/meta.d.ts.map +1 -1
  55. package/dist/cjs-types/server/query.d.ts.map +1 -1
  56. package/dist/cjs-types/server/registration.d.ts.map +1 -1
  57. package/dist/cjs-types/server/schema.d.ts.map +1 -1
  58. package/dist/cli.bundle.cjs +12 -14
  59. package/dist/cli.bundle.cjs.map +2 -2
  60. package/dist/esm/browser/simple_client.js +5 -3
  61. package/dist/esm/browser/simple_client.js.map +2 -2
  62. package/dist/esm/cli/codegen_templates/common.js +5 -0
  63. package/dist/esm/cli/codegen_templates/common.js.map +2 -2
  64. package/dist/esm/cli/dev.js +3 -1
  65. package/dist/esm/cli/dev.js.map +2 -2
  66. package/dist/esm/cli/lib/api.js.map +2 -2
  67. package/dist/esm/cli/lib/codegen.js +2 -1
  68. package/dist/esm/cli/lib/codegen.js.map +2 -2
  69. package/dist/esm/cli/lib/utils/utils.js +4 -12
  70. package/dist/esm/cli/lib/utils/utils.js.map +2 -2
  71. package/dist/esm/index.js +1 -1
  72. package/dist/esm/index.js.map +1 -1
  73. package/dist/esm/react/client.js +1 -1
  74. package/dist/esm/react/client.js.map +2 -2
  75. package/dist/esm/react-clerk/ConvexProviderWithClerk.js +2 -1
  76. package/dist/esm/react-clerk/ConvexProviderWithClerk.js.map +2 -2
  77. package/dist/esm/server/impl/meta_impl.js +2 -2
  78. package/dist/esm/server/impl/meta_impl.js.map +2 -2
  79. package/dist/esm/server/impl/query_impl.js.map +2 -2
  80. package/dist/esm/server/schema.js.map +1 -1
  81. package/dist/esm-types/browser/simple_client.d.ts +1 -2
  82. package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
  83. package/dist/esm-types/cli/codegen_templates/common.d.ts +12 -0
  84. package/dist/esm-types/cli/codegen_templates/common.d.ts.map +1 -1
  85. package/dist/esm-types/cli/codegen_templates/common.test.d.ts +2 -0
  86. package/dist/esm-types/cli/codegen_templates/common.test.d.ts.map +1 -0
  87. package/dist/esm-types/cli/dev.d.ts.map +1 -1
  88. package/dist/esm-types/cli/dev.test.d.ts +2 -0
  89. package/dist/esm-types/cli/dev.test.d.ts.map +1 -0
  90. package/dist/esm-types/cli/generatedApi.d.ts +0 -1
  91. package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
  92. package/dist/esm-types/cli/lib/api.d.ts +0 -1
  93. package/dist/esm-types/cli/lib/api.d.ts.map +1 -1
  94. package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
  95. package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
  96. package/dist/esm-types/index.d.ts +1 -1
  97. package/dist/esm-types/react/client.d.ts.map +1 -1
  98. package/dist/esm-types/react/client_provided_base_client.test.d.ts +2 -0
  99. package/dist/esm-types/react/client_provided_base_client.test.d.ts.map +1 -0
  100. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts +1 -0
  101. package/dist/esm-types/react-clerk/ConvexProviderWithClerk.d.ts.map +1 -1
  102. package/dist/esm-types/server/database.d.ts.map +1 -1
  103. package/dist/esm-types/server/impl/query_impl.d.ts.map +1 -1
  104. package/dist/esm-types/server/meta.d.ts +8 -0
  105. package/dist/esm-types/server/meta.d.ts.map +1 -1
  106. package/dist/esm-types/server/query.d.ts.map +1 -1
  107. package/dist/esm-types/server/registration.d.ts.map +1 -1
  108. package/dist/esm-types/server/schema.d.ts.map +1 -1
  109. package/dist/react.bundle.js +2 -2
  110. package/dist/react.bundle.js.map +2 -2
  111. package/package.json +2 -2
  112. package/src/browser/simple_client.ts +12 -10
  113. package/src/cli/codegen_templates/common.test.ts +52 -0
  114. package/src/cli/codegen_templates/common.ts +17 -0
  115. package/src/cli/dev.test.ts +157 -0
  116. package/src/cli/dev.ts +7 -0
  117. package/src/cli/generatedApi.ts +0 -1
  118. package/src/cli/lib/api.ts +0 -1
  119. package/src/cli/lib/codegen.ts +2 -1
  120. package/src/cli/lib/config.test.ts +1 -4
  121. package/src/cli/lib/utils/utils.ts +4 -12
  122. package/src/index.ts +1 -1
  123. package/src/react/client.ts +23 -6
  124. package/src/react/client_provided_base_client.test.tsx +56 -0
  125. package/src/react-clerk/ConvexProviderWithClerk.tsx +3 -1
  126. package/src/server/database.ts +6 -4
  127. package/src/server/impl/meta_impl.ts +2 -2
  128. package/src/server/impl/query_impl.ts +1 -3
  129. package/src/server/meta.ts +8 -0
  130. package/src/server/query.ts +9 -6
  131. package/src/server/registration.ts +10 -10
  132. package/src/server/schema.ts +3 -2
@@ -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 dynamicDataModelTS,\n noSchemaDataModelDTS,\n noSchemaDataModelTS,\n staticDataModelDTS,\n staticDataModelTS,\n} from \"../codegen_templates/dataModel.js\";\nimport { readmeCodegen } from \"../codegen_templates/readme.js\";\nimport { serverCodegen, EnvVarMeta } from \"../codegen_templates/server.js\";\nimport { tsconfigCodegen } from \"../codegen_templates/tsconfig.js\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logError,\n logMessage,\n logOutput,\n logVerbose,\n} from \"../../bundler/log.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport {\n readProjectConfig,\n usesTypeScriptCodegen,\n usesComponentApiImports,\n} from \"./config.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { componentServerTS } from \"../codegen_templates/component_server.js\";\nimport {\n ComponentDirectory,\n toComponentDefinitionPath,\n} from \"./components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"./deployApi/startPush.js\";\nimport {\n componentApiDTS,\n componentApiJs,\n componentApiStubDTS,\n componentApiStubTS,\n componentApiTSWithTypes,\n componentTS,\n rootComponentApiCJS,\n} from \"../codegen_templates/component_api.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { LargeIndexDeletionCheck } from \"./indexes.js\";\n\nconst PRESERVED_GENERATED_ENTRIES = new Set([\"ai\"]);\n\nexport function cleanupStaleGeneratedEntries(\n ctx: Context,\n codegenDir: string,\n writtenFiles: string[],\n opts?: { debug?: boolean; force?: boolean; dryRun?: boolean },\n) {\n // Skip cleanup in debug mode since we don't actually write files in that mode.\n if (opts?.debug) {\n return;\n }\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (PRESERVED_GENERATED_ENTRIES.has(file.name)) {\n continue;\n }\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n}\n\nexport type CodegenOptions = {\n url?: string | undefined;\n adminKey?: string | undefined;\n dryRun: boolean;\n debug: boolean;\n typecheck: TypeCheckMode;\n init: boolean;\n commonjs: boolean;\n liveComponentSources: boolean;\n debugNodeApis: boolean;\n systemUdfs: boolean;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n codegenOnlyThisComponent?: string | undefined;\n};\n\nexport async function doInitConvexFolder(\n ctx: Context,\n functionsFolder?: string,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n const skipIfExists = true;\n let folder: string;\n if (functionsFolder) {\n folder = functionsFolder;\n } else {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n folder = functionsDir(configPath, projectConfig);\n }\n const { functionsDirExistedBeforeCodegen } = await prepareForCodegen(\n ctx,\n folder,\n opts,\n );\n await withTmpDir(async (tmpDir) => {\n await doReadmeCodegen(\n ctx,\n tmpDir,\n folder,\n skipIfExists && functionsDirExistedBeforeCodegen,\n opts,\n );\n await doTsconfigCodegen(ctx, tmpDir, folder, skipIfExists, opts);\n });\n}\n\nasync function prepareForCodegen(\n ctx: Context,\n functionsDir: string,\n opts?: { dryRun?: boolean },\n) {\n const functionsDirExistedBeforeCodegen = ctx.fs.exists(functionsDir);\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 `Command would delete legacy codegen file: ${legacyCodegenPath}}`,\n );\n } else {\n logError(`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, functionsDirExistedBeforeCodegen };\n}\n\n/** Codegen only for an application (a root component) */\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 const useTypeScript = usesTypeScriptCodegen(projectConfig);\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\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 useTypeScript,\n opts,\n );\n writtenFiles.push(...schemaFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\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 doApiCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n\n // Generated code is updated, typecheck the query and mutation functions.\n await typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir);\n });\n}\n\n// Just enough to be able to bundle code for analysis: we need an api proxy object\n// so that imports aren't broken, we need basics in server, we need something in\n// data model.\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 if (isPublishedPackage(componentDirectory)) {\n if (opts?.verbose) {\n logMessage(\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 // Non-root components always use .ts files; root components respect the config\n // But for initial (placeholder, stub) codegen we don't care, just use .d.ts and .js.\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\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 useTypeScript,\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 useTypeScript,\n undefined,\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 useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // component.ts is generated in doFinalComponentCodegen, but don't delete\n // if it already exists from a previous full codegen run.\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n if (ctx.fs.exists(componentTSPath)) {\n writtenFiles.push(\"component.ts\");\n }\n }\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n}\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 */\nexport function isPublishedPackage(componentDirectory: ComponentDirectory) {\n return (\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot\n );\n}\n\n// Handles root and non-root components; it's \"component\" codegen because\n// it's not the old legacy path.\nexport async function doFinalComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n startPushResponse: StartPushResponse,\n componentsMap: Map<string, ComponentDirectory>,\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 // We never codegen for a published package (you need to link to the convex.config.ts file instead).\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 // Non-root components always use .ts files; root components respect the config\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n // `dataModel` and `api` files depend on analyze results so will get replaced\n // in the later post-analysis codegen phase, but `server` files don't need\n // analysis info so the stubs from initial codegen are sufficient.\n\n // dataModel\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n let dataModelContents: string;\n if (hasSchemaFile) {\n if (projectConfig.codegen.staticDataModel) {\n dataModelContents = useTypeScript\n ? await staticDataModelTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n )\n : await staticDataModelDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n } else {\n dataModelContents = useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS();\n }\n } else {\n dataModelContents = useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n }\n const dataModelPath = path.join(\n codegenDir,\n useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\",\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContents,\n \"typescript\",\n dataModelPath,\n opts,\n );\n\n // component.ts\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n const componentTSContents = await componentTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentTSContents,\n \"typescript\",\n componentTSPath,\n opts,\n );\n }\n\n // server.ts - regenerate it in final codegen so we can emit typed env vars.\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n const analysis = startPushResponse.analysis[definitionPath];\n const envVars: EnvVarMeta[] =\n analysis?.definition.envVars && analysis.definition.envVars.length > 0\n ? analysis.definition.envVars\n : [];\n await writeServerFilesForComponent(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n\n // api\n if (!useTypeScript) {\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiContents = await componentApiDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\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.cts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiCjsDTSPath,\n opts,\n );\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiContents = await componentApiTSWithTypes(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n}\n\nasync function doReadmeCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skip: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const readmePath = path.join(functionsDir, \"README.md\");\n if (skip) {\n logVerbose(`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(`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 useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, functionsDir);\n const schemaContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n await writeFormattedFile(\n ctx,\n tmpDir,\n schemaContent,\n \"typescript\",\n path.join(codegenDir, filename),\n opts,\n );\n return [filename];\n}\n\n/**\n * Write server.ts/.js/.d.ts files for root components.\n * Returns list of filenames written.\n */\nasync function writeServerFiles(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (!useTypeScript) {\n const serverContent = serverCodegen({\n useTypeScript: false,\n envVars,\n });\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 } else {\n const serverContent = serverCodegen({\n useTypeScript: true,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"server.ts\"),\n opts,\n );\n\n return [\"server.ts\"];\n }\n}\n\n/**\n * Write server.ts file for non-root components.\n * Returns list of filenames written.\n */\nasync function writeComponentServerFile(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n const serverTSPath = path.join(codegenDir, \"server.ts\");\n const serverTSContents = componentServerTS(false, envVars);\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverTSContents,\n \"typescript\",\n serverTSPath,\n opts,\n );\n return [\"server.ts\"];\n}\n\n/**\n * Write server files for either root or non-root components.\n * Root components get server.ts/server.js/server.d.ts based on useTypeScript.\n * Non-root components always get server.ts.\n * Returns list of filenames written.\n */\nasync function writeServerFilesForComponent(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (isRoot) {\n return await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n } else {\n return await writeComponentServerFile(\n ctx,\n tmpDir,\n codegenDir,\n envVars,\n opts,\n );\n }\n}\n\nasync function doInitialComponentServerCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentCodegen` (e.g. env vars).\n const serverFilename = useTypeScript ? \"server.ts\" : \"server.js\";\n if (ctx.fs.exists(path.join(codegenDir, serverFilename))) {\n const filenames = [serverFilename];\n if (!useTypeScript) {\n filenames.push(\"server.d.ts\");\n }\n return filenames;\n }\n return await writeServerFilesForComponent(\n ctx,\n isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n}\n\nasync function doInitialComponentDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n const dataModelContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n const dataModelPath = path.join(codegenDir, filename);\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 dataModelContent,\n \"typescript\",\n dataModelPath,\n opts,\n );\n }\n return [filename];\n}\n\nasync function doInitialComponentApiCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\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 writtenFiles.push(\"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 } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiTS = componentApiStubTS();\n // Don't write the `.ts` stub if it already exists.\n if (!ctx.fs.exists(apiTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiTS,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function doApiCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const absModulePaths = await entryPoints(ctx, functionsDir);\n const modulePaths = absModulePaths\n .map((p) => path.relative(functionsDir, p))\n .sort();\n\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: false });\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 writtenFiles.push(\"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 } else {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: true });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"api.ts\"),\n opts,\n );\n writtenFiles.push(\"api.ts\");\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(`# ${path.resolve(destination)}`);\n logOutput(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(`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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",
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 { compareModulePaths } from \"../codegen_templates/common.js\";\nimport {\n dynamicDataModelDTS,\n dynamicDataModelTS,\n noSchemaDataModelDTS,\n noSchemaDataModelTS,\n staticDataModelDTS,\n staticDataModelTS,\n} from \"../codegen_templates/dataModel.js\";\nimport { readmeCodegen } from \"../codegen_templates/readme.js\";\nimport { serverCodegen, EnvVarMeta } from \"../codegen_templates/server.js\";\nimport { tsconfigCodegen } from \"../codegen_templates/tsconfig.js\";\nimport { Context } from \"../../bundler/context.js\";\nimport {\n logError,\n logMessage,\n logOutput,\n logVerbose,\n} from \"../../bundler/log.js\";\nimport { typeCheckFunctionsInMode, TypeCheckMode } from \"./typecheck.js\";\nimport {\n readProjectConfig,\n usesTypeScriptCodegen,\n usesComponentApiImports,\n} from \"./config.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { componentServerTS } from \"../codegen_templates/component_server.js\";\nimport {\n ComponentDirectory,\n toComponentDefinitionPath,\n} from \"./components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"./deployApi/startPush.js\";\nimport {\n componentApiDTS,\n componentApiJs,\n componentApiStubDTS,\n componentApiStubTS,\n componentApiTSWithTypes,\n componentTS,\n rootComponentApiCJS,\n} from \"../codegen_templates/component_api.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { LargeIndexDeletionCheck } from \"./indexes.js\";\n\nconst PRESERVED_GENERATED_ENTRIES = new Set([\"ai\"]);\n\nexport function cleanupStaleGeneratedEntries(\n ctx: Context,\n codegenDir: string,\n writtenFiles: string[],\n opts?: { debug?: boolean; force?: boolean; dryRun?: boolean },\n) {\n // Skip cleanup in debug mode since we don't actually write files in that mode.\n if (opts?.debug) {\n return;\n }\n for (const file of ctx.fs.listDir(codegenDir)) {\n if (PRESERVED_GENERATED_ENTRIES.has(file.name)) {\n continue;\n }\n if (!writtenFiles.includes(file.name)) {\n recursivelyDelete(ctx, path.join(codegenDir, file.name), opts);\n }\n }\n}\n\nexport type CodegenOptions = {\n url?: string | undefined;\n adminKey?: string | undefined;\n dryRun: boolean;\n debug: boolean;\n typecheck: TypeCheckMode;\n init: boolean;\n commonjs: boolean;\n liveComponentSources: boolean;\n debugNodeApis: boolean;\n systemUdfs: boolean;\n largeIndexDeletionCheck: LargeIndexDeletionCheck;\n codegenOnlyThisComponent?: string | undefined;\n};\n\nexport async function doInitConvexFolder(\n ctx: Context,\n functionsFolder?: string,\n opts?: {\n dryRun?: boolean;\n debug?: boolean;\n },\n) {\n const skipIfExists = true;\n let folder: string;\n if (functionsFolder) {\n folder = functionsFolder;\n } else {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n folder = functionsDir(configPath, projectConfig);\n }\n const { functionsDirExistedBeforeCodegen } = await prepareForCodegen(\n ctx,\n folder,\n opts,\n );\n await withTmpDir(async (tmpDir) => {\n await doReadmeCodegen(\n ctx,\n tmpDir,\n folder,\n skipIfExists && functionsDirExistedBeforeCodegen,\n opts,\n );\n await doTsconfigCodegen(ctx, tmpDir, folder, skipIfExists, opts);\n });\n}\n\nasync function prepareForCodegen(\n ctx: Context,\n functionsDir: string,\n opts?: { dryRun?: boolean },\n) {\n const functionsDirExistedBeforeCodegen = ctx.fs.exists(functionsDir);\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 `Command would delete legacy codegen file: ${legacyCodegenPath}}`,\n );\n } else {\n logError(`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, functionsDirExistedBeforeCodegen };\n}\n\n/** Codegen only for an application (a root component) */\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 const useTypeScript = usesTypeScriptCodegen(projectConfig);\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\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 useTypeScript,\n opts,\n );\n writtenFiles.push(...schemaFiles);\n\n // Next, the `server.d.ts` file imports from `dataModel.d.ts`.\n const serverFiles = await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n undefined,\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 doApiCodegen(\n ctx,\n tmpDir,\n functionsDir,\n codegenDir,\n useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n\n // Generated code is updated, typecheck the query and mutation functions.\n await typeCheckFunctionsInMode(ctx, typeCheckMode, functionsDir);\n });\n}\n\n// Just enough to be able to bundle code for analysis: we need an api proxy object\n// so that imports aren't broken, we need basics in server, we need something in\n// data model.\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 if (isPublishedPackage(componentDirectory)) {\n if (opts?.verbose) {\n logMessage(\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 // Non-root components always use .ts files; root components respect the config\n // But for initial (placeholder, stub) codegen we don't care, just use .d.ts and .js.\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n const generateCommonJSApi =\n opts?.generateCommonJSApi || projectConfig.generateCommonJSApi;\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 useTypeScript,\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 useTypeScript,\n undefined,\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 useTypeScript,\n generateCommonJSApi,\n opts,\n );\n writtenFiles.push(...apiFiles);\n\n // component.ts is generated in doFinalComponentCodegen, but don't delete\n // if it already exists from a previous full codegen run.\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n if (ctx.fs.exists(componentTSPath)) {\n writtenFiles.push(\"component.ts\");\n }\n }\n\n // Cleanup any files that weren't written in this run.\n cleanupStaleGeneratedEntries(ctx, codegenDir, writtenFiles, opts);\n}\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 */\nexport function isPublishedPackage(componentDirectory: ComponentDirectory) {\n return (\n componentDirectory.definitionPath.endsWith(\".js\") &&\n !componentDirectory.isRoot\n );\n}\n\n// Handles root and non-root components; it's \"component\" codegen because\n// it's not the old legacy path.\nexport async function doFinalComponentCodegen(\n ctx: Context,\n tmpDir: TempDir,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n startPushResponse: StartPushResponse,\n componentsMap: Map<string, ComponentDirectory>,\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 // We never codegen for a published package (you need to link to the convex.config.ts file instead).\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 // Non-root components always use .ts files; root components respect the config\n const useTypeScript =\n !componentDirectory.isRoot || usesTypeScriptCodegen(projectConfig);\n\n // `dataModel` and `api` files depend on analyze results so will get replaced\n // in the later post-analysis codegen phase, but `server` files don't need\n // analysis info so the stubs from initial codegen are sufficient.\n\n // dataModel\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n let dataModelContents: string;\n if (hasSchemaFile) {\n if (projectConfig.codegen.staticDataModel) {\n dataModelContents = useTypeScript\n ? await staticDataModelTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n )\n : await staticDataModelDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n } else {\n dataModelContents = useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS();\n }\n } else {\n dataModelContents = useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n }\n const dataModelPath = path.join(\n codegenDir,\n useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\",\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n dataModelContents,\n \"typescript\",\n dataModelPath,\n opts,\n );\n\n // component.ts\n if (!componentDirectory.isRoot) {\n const componentTSPath = path.join(codegenDir, \"component.ts\");\n const componentTSContents = await componentTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n componentTSContents,\n \"typescript\",\n componentTSPath,\n opts,\n );\n }\n\n // server.ts - regenerate it in final codegen so we can emit typed env vars.\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n const analysis = startPushResponse.analysis[definitionPath];\n const envVars: EnvVarMeta[] =\n analysis?.definition.envVars && analysis.definition.envVars.length > 0\n ? analysis.definition.envVars\n : [];\n await writeServerFilesForComponent(\n ctx,\n componentDirectory.isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n\n // api\n if (!useTypeScript) {\n const apiDTSPath = path.join(codegenDir, \"api.d.ts\");\n const apiContents = await componentApiDTS(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\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.cts\");\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiCjsDTSPath,\n opts,\n );\n }\n } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiContents = await componentApiTSWithTypes(\n ctx,\n startPushResponse,\n rootComponent,\n componentDirectory,\n componentsMap,\n {\n staticApi: projectConfig.codegen.staticApi,\n useComponentApiImports: usesComponentApiImports(projectConfig),\n },\n );\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContents,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n}\n\nasync function doReadmeCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n skip: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const readmePath = path.join(functionsDir, \"README.md\");\n if (skip) {\n logVerbose(`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(`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 useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, functionsDir);\n const schemaContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n await writeFormattedFile(\n ctx,\n tmpDir,\n schemaContent,\n \"typescript\",\n path.join(codegenDir, filename),\n opts,\n );\n return [filename];\n}\n\n/**\n * Write server.ts/.js/.d.ts files for root components.\n * Returns list of filenames written.\n */\nasync function writeServerFiles(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (!useTypeScript) {\n const serverContent = serverCodegen({\n useTypeScript: false,\n envVars,\n });\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 } else {\n const serverContent = serverCodegen({\n useTypeScript: true,\n envVars,\n });\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"server.ts\"),\n opts,\n );\n\n return [\"server.ts\"];\n }\n}\n\n/**\n * Write server.ts file for non-root components.\n * Returns list of filenames written.\n */\nasync function writeComponentServerFile(\n ctx: Context,\n tmpDir: TempDir,\n codegenDir: string,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n const serverTSPath = path.join(codegenDir, \"server.ts\");\n const serverTSContents = componentServerTS(false, envVars);\n await writeFormattedFile(\n ctx,\n tmpDir,\n serverTSContents,\n \"typescript\",\n serverTSPath,\n opts,\n );\n return [\"server.ts\"];\n}\n\n/**\n * Write server files for either root or non-root components.\n * Root components get server.ts/server.js/server.d.ts based on useTypeScript.\n * Non-root components always get server.ts.\n * Returns list of filenames written.\n */\nasync function writeServerFilesForComponent(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n): Promise<string[]> {\n if (isRoot) {\n return await writeServerFiles(\n ctx,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n } else {\n return await writeComponentServerFile(\n ctx,\n tmpDir,\n codegenDir,\n envVars,\n opts,\n );\n }\n}\n\nasync function doInitialComponentServerCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n envVars: EnvVarMeta[] | undefined,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n // Don't write our stub if the file already exists, since it may have\n // better type information from `doFinalComponentCodegen` (e.g. env vars).\n const serverFilename = useTypeScript ? \"server.ts\" : \"server.js\";\n if (ctx.fs.exists(path.join(codegenDir, serverFilename))) {\n const filenames = [serverFilename];\n if (!useTypeScript) {\n filenames.push(\"server.d.ts\");\n }\n return filenames;\n }\n return await writeServerFilesForComponent(\n ctx,\n isRoot,\n tmpDir,\n codegenDir,\n useTypeScript,\n envVars,\n opts,\n );\n}\n\nasync function doInitialComponentDataModelCodegen(\n ctx: Context,\n tmpDir: TempDir,\n componentDirectory: ComponentDirectory,\n codegenDir: string,\n useTypeScript: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const hasSchemaFile = schemaFileExists(ctx, componentDirectory.path);\n const dataModelContent = hasSchemaFile\n ? useTypeScript\n ? dynamicDataModelTS()\n : dynamicDataModelDTS()\n : useTypeScript\n ? noSchemaDataModelTS()\n : noSchemaDataModelDTS();\n const filename = useTypeScript ? \"dataModel.ts\" : \"dataModel.d.ts\";\n const dataModelPath = path.join(codegenDir, filename);\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 dataModelContent,\n \"typescript\",\n dataModelPath,\n opts,\n );\n }\n return [filename];\n}\n\nasync function doInitialComponentApiCodegen(\n ctx: Context,\n isRoot: boolean,\n tmpDir: TempDir,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\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 writtenFiles.push(\"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 } else {\n const apiTSPath = path.join(codegenDir, \"api.ts\");\n const apiTS = componentApiStubTS();\n // Don't write the `.ts` stub if it already exists.\n if (!ctx.fs.exists(apiTSPath)) {\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiTS,\n \"typescript\",\n apiTSPath,\n opts,\n );\n }\n writtenFiles.push(\"api.ts\");\n }\n\n return writtenFiles;\n}\n\nasync function doApiCodegen(\n ctx: Context,\n tmpDir: TempDir,\n functionsDir: string,\n codegenDir: string,\n useTypeScript: boolean,\n generateCommonJSApi: boolean,\n opts?: { dryRun?: boolean; debug?: boolean },\n) {\n const absModulePaths = await entryPoints(ctx, functionsDir);\n const modulePaths = absModulePaths\n .map((p) => path.relative(functionsDir, p))\n .sort(compareModulePaths);\n\n const writtenFiles: string[] = [];\n\n if (!useTypeScript) {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: false });\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 writtenFiles.push(\"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 } else {\n const apiContent = apiCodegen(modulePaths, { useTypeScript: true });\n await writeFormattedFile(\n ctx,\n tmpDir,\n apiContent.TS!,\n \"typescript\",\n path.join(codegenDir, \"api.ts\"),\n opts,\n );\n writtenFiles.push(\"api.ts\");\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(`# ${path.resolve(destination)}`);\n logOutput(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(`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
6
  "names": ["functionsDir", "isPublishedPackage"]
7
7
  }
@@ -387,29 +387,21 @@ export async function validateOrSelectProject(ctx, projectSlug, teamSlug, single
387
387
  });
388
388
  }
389
389
  if (!projectSlug) {
390
- const nonDemoProjects = projects.filter((project) => !project.isDemo);
391
- if (nonDemoProjects.length === 0) {
392
- return await ctx.crash({
393
- exitCode: 1,
394
- errorType: "fatal",
395
- printedMessage: `No existing non-demo projects! Run this command again and choose "create a new project."`
396
- });
397
- }
398
- switch (nonDemoProjects.length) {
390
+ switch (projects.length) {
399
391
  case 1: {
400
- const project = nonDemoProjects[0];
392
+ const project = projects[0];
401
393
  const confirmed = await promptYesNo(ctx, {
402
394
  message: `${singleProjectPrompt} ${project.name} (${project.slug})?`
403
395
  });
404
396
  if (!confirmed) {
405
397
  return null;
406
398
  }
407
- return nonDemoProjects[0].slug;
399
+ return projects[0].slug;
408
400
  }
409
401
  default:
410
402
  return await promptSearch(ctx, {
411
403
  message: multiProjectPrompt,
412
- choices: nonDemoProjects.map((project) => ({
404
+ choices: projects.map((project) => ({
413
405
  name: `${project.name} (${project.slug})`,
414
406
  value: project.slug
415
407
  }))
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/cli/lib/utils/utils.ts"],
4
- "sourcesContent": ["import { paths as PlatformDeploymentPaths } from \"@convex-dev/platform/deploymentApi\";\nimport { paths as PlatformManagementPaths } from \"@convex-dev/platform/managementApi\";\nimport { chalkStderr } from \"chalk\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { ProjectConfig } from \"../config.js\";\n\nimport { spawn } from \"child_process\";\nimport { InvalidArgumentError } from \"commander\";\nimport fetchRetryFactory, { RequestInitRetryParams } from \"fetch-retry\";\nimport { Context, ErrorType } from \"../../../bundler/context.js\";\nimport {\n failExistingSpinner,\n logError,\n logMessage,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { version } from \"../../version.js\";\nimport type { CloudDeploymentType, Project } from \"../api.js\";\nimport { promptOptions, promptSearch, promptYesNo } from \"./prompts.js\";\nimport {\n bigBrainEnableFeatureMetadata,\n projectHasExistingCloudDev,\n} from \"../localDeployment/bigBrain.js\";\nimport type {\n paths as CliManagementPaths,\n RegionName,\n TeamResponse,\n} from \"../../generatedApi.js\";\nimport createClient from \"openapi-fetch\";\n\nconst retryingFetch = fetchRetryFactory(fetch);\n\nexport const productionProvisionHost = \"https://api.convex.dev\";\nexport const provisionHost =\n process.env.CONVEX_PROVISION_HOST || productionProvisionHost;\nexport const BIG_BRAIN_URL = `${provisionHost}/api/`;\nconst PLATFORM_MANAGEMENT_API_URL = `${provisionHost}/v1/`;\nexport const ENV_VAR_FILE_PATH = \".env.local\";\nexport const CONVEX_DEPLOY_KEY_ENV_VAR_NAME = \"CONVEX_DEPLOY_KEY\";\n// Alias for CONVEX_DEPLOY_KEY. Accepted anywhere CONVEX_DEPLOY_KEY is.\nexport const CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT_TOKEN\";\nexport const CONVEX_DEPLOYMENT_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT\";\nexport const CONVEX_SELF_HOSTED_URL_VAR_NAME = \"CONVEX_SELF_HOSTED_URL\";\nexport const CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME =\n \"CONVEX_SELF_HOSTED_ADMIN_KEY\";\nconst MAX_RETRIES = 6;\n// After 3 retries, log a progress message that we're retrying the request\nconst RETRY_LOG_THRESHOLD = 3;\n\n/**\n * Processes the CONVEX_DEPLOY_KEY value to handle special sentinel values.\n *\n * - If the value is `<ignore_deploy_key>`, treats it as if the env var isn't set (returns undefined)\n * - If the value matches `<missing_deploy_key:$STRING>`, crashes with the message in $STRING\n * - Otherwise returns the value as-is\n *\n * @param ctx Context for crashing if needed\n * @param deployKey The raw deploy key value from environment or config\n * @returns The processed deploy key value or undefined\n */\nexport async function processDeployKeyValue(\n ctx: Context,\n deployKey: string | undefined,\n): Promise<string | undefined> {\n if (deployKey === undefined) {\n return undefined;\n }\n\n // Check for <ignore_deploy_key> sentinel\n if (deployKey === \"<ignore_deploy_key>\") {\n return undefined;\n }\n\n // Check for <missing_deploy_key:$STRING> sentinel\n const missingKeyPattern = /^<missing_deploy_key:(.+)>$/;\n const match = deployKey.match(missingKeyPattern);\n if (match) {\n const errorMessage = match[1];\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: errorMessage,\n });\n }\n\n return deployKey;\n}\n\n/**\n * Reads the deploy key from environment variables, accepting either\n * CONVEX_DEPLOY_KEY or its alias CONVEX_DEPLOYMENT_TOKEN. CONVEX_DEPLOY_KEY\n * takes precedence when both are set.\n */\nexport function readDeployKeyFromEnv(\n getEnv: (name: string) => string | undefined | null,\n): string | undefined {\n const fromDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n const fromToken = getEnv(CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME);\n return fromDeployKey || fromToken || undefined;\n}\n\n// The prefix the backend's `require_operation` checks use when an identity\n// lacks a permission. The full message names the missing permission, e.g.\n// `You do not have permission to perform this operation (deployment:data:view).`\nconst PERMISSION_DENIED_MESSAGE_PREFIX =\n \"You do not have permission to perform this operation\";\n\nfunction deployKeyPermissionAdvice(): string | null {\n // Name whichever env var is actually set. `CONVEX_DEPLOY_KEY` takes\n // precedence over `CONVEX_DEPLOYMENT_TOKEN` when both are present.\n const envVarName = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME]\n ? CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME\n : null;\n if (envVarName === null) {\n return null;\n }\n return `This is determined by the permissions granted to ${envVarName}.`;\n}\n\n/**\n * Detects a server-side authorization failure (a `require_operation` error,\n * surfaced both as an HTTP 403 and as an error from a system UDF query) and\n * produces a clean, single-line message naming the missing permission. When a\n * deploy key is in use, appends advice for configuring its permissions.\n *\n * Returns `null` if `errorMessage` is not a permission error, so callers can\n * fall back to their normal error handling.\n */\nexport function permissionDeniedErrorMessage(\n errorMessage: string,\n): string | null {\n const index = errorMessage.indexOf(PERMISSION_DENIED_MESSAGE_PREFIX);\n if (index === -1) {\n return null;\n }\n // Drop any wrapping context (e.g. the `[CONVEX Q(...)]` prefix) and stack\n // trace, keeping just the permission sentence.\n let msg = errorMessage.slice(index).split(\"\\n\")[0].trim();\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n return msg;\n}\n\nexport function parsePositiveInteger(value: string) {\n const parsedValue = parseInteger(value);\n if (parsedValue <= 0) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a positive number.\");\n }\n return parsedValue;\n}\n\nexport function parseInteger(value: string) {\n const parsedValue = +value;\n if (isNaN(parsedValue)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a number.\");\n }\n return parsedValue;\n}\n\nexport type ErrorData = {\n code: string;\n message: string;\n};\n\n/**\n * Error thrown on non-2XX reponse codes to make most `fetch()` error handling\n * follow a single code path.\n */\nexport class ThrowingFetchError extends Error {\n response: Response;\n serverErrorData?: ErrorData;\n\n constructor(\n msg: string,\n {\n code,\n message,\n response,\n }: { cause?: Error; code?: string; message?: string; response: Response },\n ) {\n if (code !== undefined && message !== undefined) {\n super(`${msg}: ${code}: ${message}`);\n this.serverErrorData = { code, message };\n } else {\n super(msg);\n }\n\n Object.setPrototypeOf(this, ThrowingFetchError.prototype);\n\n this.response = response;\n }\n\n public static async fromResponse(\n response: Response,\n msg?: string,\n ): Promise<ThrowingFetchError> {\n msg = `${msg ? `${msg} ` : \"\"}${response.status} ${response.statusText}`;\n let code, message;\n try {\n ({ code, message } = await response.json());\n } catch {\n // Do nothing because the non-2XX response code is the primary error here.\n }\n return new ThrowingFetchError(msg, { code, message, response });\n }\n\n async handle(ctx: Context): Promise<never> {\n let error_type: ErrorType = \"transient\";\n await checkFetchErrorForDeprecation(ctx, this.response);\n\n let msg = this.message;\n\n if (this.response.status === 400) {\n error_type = \"invalid filesystem or env vars\";\n } else if (this.response.status === 401) {\n error_type = \"fatal\";\n msg = `${msg}\\nAuthenticate with \\`npx convex dev\\``;\n } else if (this.response.status === 403) {\n error_type = \"fatal\";\n // Surface the missing permission cleanly (e.g. the server includes the\n // required action like `deployment:data:view`) instead of the noisy\n // \"Error fetching ...\" wrapper.\n msg = this.serverErrorData?.message ?? msg;\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n } else if (this.response.status === 404) {\n error_type = \"fatal\";\n msg = `${msg}: ${this.response.url}`;\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: error_type,\n errForSentry: this,\n printedMessage: chalkStderr.red(msg.trim()),\n });\n }\n}\n\n/**\n * Thin wrapper around `fetch()` which throws a FetchDataError on non-2XX\n * responses which includes error code and message from the response JSON.\n * (Axios-style)\n *\n * It also accepts retry options from fetch-retry.\n */\nexport async function throwingFetch(\n resource: RequestInfo | URL,\n options: (RequestInit & RequestInitRetryParams<typeof fetch>) | undefined,\n): Promise<Response> {\n const response = await retryingFetch(resource, options);\n if (!response.ok) {\n // This error must always be handled manually.\n // eslint-disable-next-line no-restricted-syntax\n throw await ThrowingFetchError.fromResponse(\n response,\n `Error fetching ${options?.method ? options.method + \" \" : \"\"} ${\n typeof resource === \"string\"\n ? resource\n : \"url\" in resource\n ? resource.url\n : resource.toString()\n }`,\n );\n }\n return response;\n}\n\n/**\n * Handle an error a fetch error or non-2xx response.\n */\nexport async function logAndHandleFetchError(\n ctx: Context,\n err: unknown,\n): Promise<never> {\n // Fail the spinner so the stderr lines appear\n failExistingSpinner();\n\n if (err instanceof ThrowingFetchError) {\n return await err.handle(ctx);\n } else {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: err,\n printedMessage: chalkStderr.red(err),\n });\n }\n}\n\nfunction logDeprecationWarning(ctx: Context, deprecationMessage: string) {\n if (ctx.deprecationMessagePrinted) {\n return;\n }\n ctx.deprecationMessagePrinted = true;\n logWarning(chalkStderr.yellow(deprecationMessage));\n}\n\nasync function checkFetchErrorForDeprecation(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This version is deprecated. Print a warning and crash.\n\n // Gotcha:\n // 1. Don't use `logDeprecationWarning` because we should always print\n // why this we crashed (even if we printed a warning earlier).\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(deprecationMessage),\n });\n default:\n // The error included a deprecation warning. Print, but handle the\n // error normally (it was for another reason).\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\n/// Call this method after a successful API response to conditionally print the\n/// \"please upgrade\" message.\nexport function deprecationCheckWarning(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This should never happen because such states are errors, not warnings.\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n \"Called deprecationCheckWarning on a fatal error. This is a bug.\",\n );\n default:\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\nexport async function hasTeam(ctx: Context, teamSlug: string) {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n return teams.some((team) => team.slug === teamSlug);\n}\n\nexport async function validateOrSelectTeam(\n ctx: Context,\n teamSlug: string | undefined,\n promptMessage: string,\n): Promise<{ team: TeamResponse; chosen: boolean }> {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n if (teams.length === 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"No teams found\",\n printedMessage: chalkStderr.red(\"Error: No teams found\"),\n });\n }\n if (!teamSlug) {\n // Prompt the user to select if they belong to more than one team.\n switch (teams.length) {\n case 1:\n return { team: teams[0], chosen: false };\n default: {\n const teamSlug = await promptSearch(ctx, {\n message: promptMessage,\n choices: teams.map((team) => ({\n name: `${team.name} (${team.slug})`,\n value: team.slug,\n })),\n });\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Failed to select team`,\n });\n }\n return { team, chosen: true };\n }\n }\n } else {\n // Validate the chosen team.\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${teamSlug} not found, fix the --team option or remove it`,\n });\n }\n return { team, chosen: false };\n }\n}\n\nexport async function selectDevDeploymentType(\n ctx: Context,\n {\n chosenConfiguration,\n newOrExisting,\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively,\n // from `--configure --dev-deployment local|cloud`\n devDeploymentFromFlag,\n }:\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"existing\";\n teamSlug: string;\n projectSlug: string;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n }\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"new\";\n teamSlug: string;\n // For new projects we don't know the project slug yet.\n projectSlug: undefined;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{ devDeployment: \"cloud\" | \"local\" }> {\n if (devDeploymentFromFlag) return { devDeployment: devDeploymentFromFlag };\n\n if (newOrExisting === \"existing\" && chosenConfiguration === null) {\n // Don't suggest local dev if developer already has a cloud deployment.\n if (await projectHasExistingCloudDev(ctx, { projectSlug, teamSlug })) {\n // TODO Expand rollout to offer local dev in this case. ENG-8307\n return { devDeployment: \"cloud\" };\n }\n }\n\n // To avoid breaking previously non-interactive flows, don't prompt if enough\n // flags were specified for configure not to already have needed input.\n if (chosenConfiguration !== \"ask\" && !userHasChosenSomethingInteractively) {\n return { devDeployment: \"cloud\" };\n }\n\n // For creating a first project (no projects exist) or joining a first project\n // (one project exists), always use cloud since it's a smoother experience.\n const isFirstProject =\n (await bigBrainEnableFeatureMetadata(ctx)).totalProjects.kind !==\n \"multiple\";\n if (isFirstProject) {\n return { devDeployment: \"cloud\" };\n }\n\n // For now default is always cloud.\n const devDeployment: \"cloud\" | \"local\" = await promptOptions(ctx, {\n message:\n \"Use cloud or local dev deployment? For more see https://docs.convex.dev/cli/local-deployments\",\n default: \"cloud\",\n choices: [\n { name: \"cloud deployment\", value: \"cloud\" },\n { name: \"local deployment (BETA)\", value: \"local\" },\n ],\n });\n return { devDeployment };\n}\n\nexport async function logNoDefaultRegionMessage(teamSlug: string) {\n const { teamDashboardUrl } = await import(\"../dashboard.js\");\n const noDefaultRegionMessage = chalkStderr.gray(\n `Tip: you can configure a default region for your team at ${chalkStderr.underline(`${teamDashboardUrl(teamSlug)}/settings`)}`,\n );\n logMessage(noDefaultRegionMessage);\n}\n\nexport async function selectRegionOrUseDefault(\n ctx: Context,\n selectedTeam: TeamResponse,\n deploymentType: CloudDeploymentType,\n) {\n if (!process.stdin.isTTY) {\n // Use the team default in non-interactive terminals\n if (!selectedTeam.defaultRegion) {\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedTeam.defaultRegion ?? null;\n }\n const selectedRegionName =\n selectedTeam.defaultRegion ??\n (await selectRegion(ctx, selectedTeam.id, deploymentType));\n if (!selectedTeam.defaultRegion) {\n // Log after the user chooses a region\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedRegionName;\n}\n\nexport async function selectRegion(\n ctx: Context,\n teamId: number,\n deploymentType: CloudDeploymentType,\n): Promise<RegionName> {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n const choices = regionsResponse.items\n .filter((item) => Boolean(item.available))\n .map((item) => ({\n name: item.displayName,\n value: item.name,\n }))\n .sort((a, b) => {\n // Show US region first if it exists\n if (a.value === \"aws-us-east-1\") return -1;\n if (b.value === \"aws-us-east-1\") return 1;\n return 0;\n });\n return await promptOptions(ctx, {\n message: `Where should this ${deploymentType} deployment run?`,\n suffix: `\\n${chalkStderr.gray(\n \"See https://www.convex.dev/pricing for pricing\",\n )}`,\n choices,\n });\n}\n\nexport async function hasProject(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n) {\n try {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n return !!projects.find((project) => project.slug === projectSlug);\n } catch {\n return false;\n }\n}\n\nexport async function hasProjects(ctx: Context) {\n return !!(await bigBrainAPI({ ctx, method: \"GET\", path: `has_projects` }));\n}\n\nexport async function validateOrSelectProject(\n ctx: Context,\n projectSlug: string | undefined,\n teamSlug: string,\n singleProjectPrompt: string,\n multiProjectPrompt: string,\n): Promise<string | null> {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n if (projects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n if (!projectSlug) {\n const nonDemoProjects = projects.filter((project) => !project.isDemo);\n if (nonDemoProjects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing non-demo projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n // Prompt the user to select project.\n switch (nonDemoProjects.length) {\n case 1: {\n const project = nonDemoProjects[0];\n const confirmed = await promptYesNo(ctx, {\n message: `${singleProjectPrompt} ${project.name} (${project.slug})?`,\n });\n\n if (!confirmed) {\n return null;\n }\n return nonDemoProjects[0].slug;\n }\n default:\n return await promptSearch(ctx, {\n message: multiProjectPrompt,\n choices: nonDemoProjects.map((project: Project) => ({\n name: `${project.name} (${project.slug})`,\n value: project.slug,\n })),\n });\n }\n } else {\n // Validate the chosen project.\n if (!projects.find((project) => project.slug === projectSlug)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Project ${projectSlug} not found, fix the --project option or remove it`,\n });\n }\n return projectSlug;\n }\n}\n\n/**\n * @param ctx\n * @returns a Record of dependency name to dependency version for dependencies\n * and devDependencies\n */\nexport async function loadPackageJson(\n ctx: Context,\n includePeerDeps = false,\n): Promise<Record<string, string>> {\n let packageJson;\n try {\n packageJson = ctx.fs.readUtf8File(\"package.json\");\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Unable to read your package.json: ${\n err as any\n }. Make sure you're running this command from the root directory of a Convex app that contains the package.json`,\n });\n }\n let obj;\n try {\n obj = JSON.parse(packageJson);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n printedMessage: `Unable to parse package.json: ${err as any}`,\n });\n }\n if (typeof obj !== \"object\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected to parse an object from package.json\",\n });\n }\n const packages = {\n ...(includePeerDeps ? (obj.peerDependencies ?? {}) : {}),\n ...(obj.dependencies ?? {}),\n ...(obj.devDependencies ?? {}),\n };\n return packages;\n}\n\nexport async function ensureHasConvexDependency(ctx: Context, cmd: string) {\n const packages = await loadPackageJson(ctx, true);\n const hasConvexDependency = \"convex\" in packages;\n if (!hasConvexDependency) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `In order to ${cmd}, add \\`convex\\` to your package.json dependencies.`,\n });\n }\n}\n\n/** Return a new array with elements of the passed in array sorted by a key lambda */\nexport const sorted = <T>(arr: T[], key: (el: T) => any): T[] => {\n const newArr = [...arr];\n const cmp = (a: T, b: T) => {\n if (key(a) < key(b)) return -1;\n if (key(a) > key(b)) return 1;\n return 0;\n };\n return newArr.sort(cmp);\n};\n\nexport function functionsDir(\n configPath: string,\n projectConfig: ProjectConfig,\n): string {\n return path.join(path.dirname(configPath), projectConfig.functions);\n}\n\nfunction convexName() {\n // Use a different directory for config files generated for tests\n if (process.env.CONVEX_PROVISION_HOST) {\n const port = process.env.CONVEX_PROVISION_HOST.split(\":\")[2];\n if (port === undefined || port === \"8050\") {\n return `convex-test`;\n } else {\n return `convex-test-${port}`;\n }\n }\n return \"convex\";\n}\n\nexport function rootDirectory(): string {\n return path.join(os.homedir(), `.${convexName()}`);\n}\n\nexport function cacheDir() {\n const name = convexName();\n const platform = process.platform;\n if (platform === \"win32\") {\n // On Windows, `LOCALAPPDATA` is usually set, but fall back to\n // `USERPROFILE` if not, and fall back to homedir if all else fails.\n if (process.env.LOCALAPPDATA) {\n return path.join(process.env.LOCALAPPDATA, name);\n }\n if (process.env.USERPROFILE) {\n return path.join(process.env.USERPROFILE, \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \".cache\", name);\n}\n\n/**\n * Fetch with appropriate headers for the Convex Management API.\n *\n * This fetch() also has retries and throws if the response is not ok.\n */\nexport function bigBrainFetch(ctx: Context): typeof fetch {\n const authHeader = ctx.bigBrainAuth()?.header;\n const bigBrainHeaders: Record<string, string> = authHeader\n ? {\n Authorization: authHeader,\n \"Convex-Client\": `npm-cli-${version}`,\n }\n : {\n \"Convex-Client\": `npm-cli-${version}`,\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const { headers: optionsHeaders, ...rest } = options || {};\n // Use the options headers if they exist. Otherwise, use the request headers\n const headers = {\n ...bigBrainHeaders,\n ...(optionsHeaders ??\n (resource instanceof Request\n ? Object.fromEntries(resource.headers.entries())\n : {})),\n };\n const opts = {\n retries: MAX_RETRIES,\n retryDelay,\n headers,\n ...rest,\n };\n\n return throwingFetch(resource, opts);\n };\n}\n\nexport async function bigBrainAPI<T = any>({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<T> {\n const dataString =\n data === undefined\n ? undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n try {\n return await bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data: dataString,\n });\n } catch (err: unknown) {\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\n/**\n * Typed API client with a fetch() implemention that includes retries and crashes on errors.\n * It is always safe to call `.data!` on the response: any error would throw or crash.\n *\n * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.\n */\nfunction typedApiClientFactory<T>(\n baseUrl: string,\n fetchBuilder: (ctx: Context) => typeof fetch,\n) {\n return (ctx: Context, options: { throw?: boolean } = {}) => {\n type Paths = T extends CliManagementPaths\n ? CliManagementPaths\n : T extends PlatformManagementPaths\n ? PlatformManagementPaths\n : T extends PlatformDeploymentPaths\n ? PlatformDeploymentPaths\n : never;\n const client = createClient<Paths>({\n baseUrl,\n fetch: fetchBuilder(ctx),\n });\n\n // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors\n return new Proxy(client, {\n get(target, prop) {\n const originalMethod = target[prop as keyof typeof target];\n\n if (\n prop === \"GET\" ||\n prop === \"POST\" ||\n prop === \"HEAD\" ||\n prop === \"OPTIONS\" ||\n prop === \"PUT\" ||\n prop === \"DELETE\" ||\n prop === \"PATCH\" ||\n prop === \"TRACE\"\n ) {\n return async (...args: any[]) => {\n try {\n return await (originalMethod as Function).apply(target, args);\n } catch (err: unknown) {\n if (options.throw) {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n };\n }\n\n return originalMethod;\n },\n });\n };\n}\n\nexport const typedBigBrainClient = typedApiClientFactory<CliManagementPaths>(\n BIG_BRAIN_URL,\n bigBrainFetch,\n);\nexport const typedPlatformClient =\n typedApiClientFactory<PlatformManagementPaths>(\n PLATFORM_MANAGEMENT_API_URL,\n bigBrainFetch,\n );\n\nexport function typedDeploymentClient(\n ctx: Context,\n args: { deploymentUrl: string; adminKey: string },\n options: { throw?: boolean } = {},\n) {\n return typedApiClientFactory<PlatformDeploymentPaths>(\n `${args.deploymentUrl}/api/v1`,\n (ctx) =>\n deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n }),\n )(ctx, options);\n}\n\nexport async function bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<any> {\n const fetch = bigBrainFetch(ctx);\n const dataString =\n data === undefined\n ? method === \"POST\"\n ? JSON.stringify({})\n : undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n const res = await fetch(new URL(path, BIG_BRAIN_URL), {\n method,\n ...(dataString ? { body: dataString } : {}),\n headers:\n method === \"POST\"\n ? {\n \"Content-Type\": \"application/json\",\n }\n : {},\n });\n deprecationCheckWarning(ctx, res);\n if (res.status === 200) {\n return await res.json();\n }\n}\n\n/**\n * Polls an arbitrary function until a condition is met.\n *\n * @param fetch Function performing a fetch, returning resulting data.\n * @param condition This function will terminate polling when it returns `true`.\n * @param waitMs How long to wait in between fetches.\n * @returns The resulting data from `fetch`.\n */\nexport const poll = async function <Result>(\n fetch: () => Promise<Result>,\n condition: (data: Result) => boolean,\n waitMs = 1000,\n) {\n let result = await fetch();\n while (!condition(result)) {\n await wait(waitMs);\n result = await fetch();\n }\n return result;\n};\n\nconst wait = function (waitMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, waitMs);\n });\n};\n\nexport function waitForever() {\n // This never resolves\n return new Promise((_) => {\n // ignore\n });\n}\n\n// Returns a promise and a function that resolves the promise.\nexport function waitUntilCalled(): [Promise<unknown>, () => void] {\n let onCalled: (v: unknown) => void;\n const waitPromise = new Promise((resolve) => (onCalled = resolve));\n return [waitPromise, () => onCalled(null)];\n}\n\nconst BYTE_UNITS: [number, string][] = [\n [1 << 30, \"GiB\"],\n [1_000_000_000, \"GB\"],\n [1 << 20, \"MiB\"],\n [1_000_000, \"MB\"],\n [1 << 10, \"KiB\"],\n [1_000, \"KB\"],\n];\n\n/**\n * Format a byte count into a human-friendly string.\n *\n * Picks the unit (binary or decimal) that divides most cleanly.\n * Shows one decimal place only when it divides exactly (e.g. \"4.1 MiB\").\n * Falls back to raw bytes when no unit divides cleanly.\n */\nexport function formatSize(n: number): string {\n if (n === 0) {\n return \"0 bytes\";\n }\n for (const [unitSize, unitName] of BYTE_UNITS) {\n if (n < unitSize) {\n continue;\n }\n if (n % unitSize === 0) {\n return `${n / unitSize} ${unitName}`;\n }\n if ((n * 10) % unitSize === 0) {\n const whole = Math.floor(n / unitSize);\n const frac = Math.floor((n * 10) / unitSize) % 10;\n return `${whole}.${frac} ${unitName}`;\n }\n }\n return `${n} bytes`;\n}\n\nexport function formatDuration(ms: number): string {\n const twoDigits = (n: number, unit: string) =>\n `${n.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}${unit}`;\n\n if (ms < 1e-3) {\n return twoDigits(ms * 1e9, \"ns\");\n }\n if (ms < 1) {\n return twoDigits(ms * 1e3, \"\u00B5s\");\n }\n if (ms < 1e3) {\n return twoDigits(ms, \"ms\");\n }\n const s = ms / 1e3;\n if (s < 60) {\n return twoDigits(ms / 1e3, \"s\");\n }\n return twoDigits(s / 60, \"m\");\n}\n\nexport function getCurrentTimeString() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n const seconds = String(now.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n// We don't allow running commands in project subdirectories yet,\n// but we can provide better errors if we look around.\nexport async function findParentConfigs(ctx: Context): Promise<{\n parentPackageJson: string;\n parentConvexJson?: string | undefined;\n}> {\n const parentPackageJson = findUp(ctx, \"package.json\");\n if (!parentPackageJson) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage:\n \"No package.json found. To create a new project using Convex, see https://docs.convex.dev/home#quickstarts\",\n });\n }\n const candidateConvexJson =\n parentPackageJson &&\n path.join(path.dirname(parentPackageJson), \"convex.json\");\n const parentConvexJson =\n candidateConvexJson && ctx.fs.exists(candidateConvexJson)\n ? candidateConvexJson\n : undefined;\n return {\n parentPackageJson,\n parentConvexJson,\n };\n}\n\n/**\n * Finds a file in the current working directory or a parent.\n *\n * @returns The absolute path of the first file found or undefined.\n */\nfunction findUp(ctx: Context, filename: string): string | undefined {\n let curDir = path.resolve(\".\");\n let parentDir = curDir;\n do {\n const candidate = path.join(curDir, filename);\n if (ctx.fs.exists(candidate)) {\n return candidate;\n }\n curDir = parentDir;\n parentDir = path.dirname(curDir);\n } while (parentDir !== curDir);\n return;\n}\n\n/**\n * Returns whether there's an existing project config. Throws\n * if this is not a valid directory for a project config.\n */\nexport async function isInExistingProject(ctx: Context) {\n const { parentPackageJson, parentConvexJson } = await findParentConfigs(ctx);\n if (parentPackageJson !== path.resolve(\"package.json\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Run this command from the root directory of a project.\",\n });\n }\n return !!parentConvexJson;\n}\n\n// `spawnAsync` is the async version of Node's `spawnSync` (and `spawn`).\n//\n// By default, this returns the produced `stdout` and `stderror` and\n// an error if one was encountered (to mirror `spawnSync`).\n//\n// If `stdio` is set to `\"inherit\"`, pipes `stdout` and `stderror` (\n// pausing the spinner if one is running) and rejects the promise\n// on errors (to mirror `execFileSync`).\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n): Promise<{\n stdout: string;\n stderr: string;\n status: null | number;\n error?: Error | undefined;\n}>;\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options: { stdio: \"inherit\"; shell?: boolean },\n): Promise<void>;\nexport function spawnAsync(\n _ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options?: { stdio: \"inherit\"; shell?: boolean },\n) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { shell: options?.shell });\n let stdout = \"\";\n let stderr = \"\";\n\n const pipeOutput = options?.stdio === \"inherit\";\n\n if (pipeOutput) {\n child.stdout.on(\"data\", (text) =>\n logMessage(text.toString(\"utf-8\").trimEnd()),\n );\n child.stderr.on(\"data\", (text) =>\n logError(text.toString(\"utf-8\").trimEnd()),\n );\n } else {\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString(\"utf-8\");\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString(\"utf-8\");\n });\n }\n\n const completionListener = (code: number | null) => {\n child.removeListener(\"error\", errorListener);\n const result = pipeOutput\n ? { status: code }\n : { stdout, stderr, status: code };\n if (code !== 0) {\n const argumentString =\n args && args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n const error = new Error(\n `\\`${command}${argumentString}\\` exited with non-zero code: ${code}`,\n );\n if (pipeOutput) {\n reject({ ...result, error });\n } else {\n resolve({ ...result, error });\n }\n } else {\n resolve(result);\n }\n };\n\n const errorListener = (error: Error) => {\n child.removeListener(\"exit\", completionListener);\n child.removeListener(\"close\", completionListener);\n if (pipeOutput) {\n reject({ error, status: null });\n } else {\n resolve({ error, status: null });\n }\n };\n\n if (pipeOutput) {\n child.once(\"exit\", completionListener);\n } else {\n child.once(\"close\", completionListener);\n }\n child.once(\"error\", errorListener);\n });\n}\n\nconst IDEMPOTENT_METHODS = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\", \"TRACE\"];\n\nfunction retryDelay(\n attempt: number,\n _error: Error | null,\n _response: Response | null,\n): number {\n // immediate, 1s delay, 2s delay, 4s delay, etc.\n const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1000;\n const randomSum = delay * 0.2 * Math.random();\n return delay + randomSum;\n}\n\nfunction deploymentFetchRetryOn(\n onError?: (err: any, attempt: number) => void,\n method?: string,\n) {\n const shouldRetry = function (\n _attempt: number,\n error: Error | null,\n response: Response | null,\n ): { kind: \"retry\"; error: any } | { kind: \"stop\" } {\n // Retry on network errors.\n if (error !== null) {\n // TODO filter out all SSL errors\n // https://github.com/nodejs/node/blob/8a41d9b636be86350cd32847c3f89d327c4f6ff7/src/crypto/crypto_common.cc#L218-L245\n return { kind: \"retry\", error: error };\n }\n // Retry on 404s since these can sometimes happen with newly created\n // deployments for POSTs.\n if (response?.status === 404) {\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n // Whatever the error code it doesn't hurt to retry idempotent requests.\n if (\n response &&\n !response.ok &&\n method &&\n IDEMPOTENT_METHODS.includes(method.toUpperCase())\n ) {\n // ...but it's a bit annoying to wait for things we know won't succced\n if (\n [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // PaymentRequired\n 403, // Forbidden\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 412, // Precondition Failed\n 413, // Payload Too Large\n 414, // URI Too Long\n 415, // Unsupported Media Type\n 416, // Range Not Satisfiable\n ].includes(response.status)\n ) {\n return {\n kind: \"stop\",\n };\n }\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n return { kind: \"stop\" };\n };\n\n return function (\n attempt: number,\n error: Error | null,\n response: Response | null,\n ) {\n const result = shouldRetry(attempt, error, response);\n if (result.kind === \"retry\") {\n onError?.(result.error, attempt);\n }\n if (attempt >= MAX_RETRIES) {\n // Stop retrying if we've exhausted all retries, but do this after we've\n // called `onError` so that the caller can still log the error.\n return false;\n }\n return result.kind === \"retry\";\n };\n}\n\n/**\n * Unlike `deploymentFetch`, this does not add on any headers, so the caller\n * must supply any headers.\n */\nexport function bareDeploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n onError?: (err: any) => void;\n },\n): typeof throwingFetch {\n const { deploymentUrl, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n });\n return func;\n };\n}\n\n/**\n * This returns a `fetch` function that will fetch against `deploymentUrl`.\n *\n * It will also set the `Authorization` header, `Content-Type` header, and\n * the `Convex-Client` header if they are not set in the `fetch`.\n */\nexport function deploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n onError?: (err: any) => void;\n },\n): typeof fetch {\n const { deploymentUrl, adminKey, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n\n const headers = new Headers(options?.headers || {});\n if (!headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", `Convex ${adminKey}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (!headers.has(\"Convex-Client\")) {\n headers.set(\"Convex-Client\", `npm-cli-${version}`);\n }\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n headers,\n });\n return func;\n };\n}\n\n/**\n * Whether this is likely to be a WebContainer,\n * WebContainers can't complete the WorkOS login but where that login flow\n * fails has changed with the environment.\n */\nexport function isWebContainer(): boolean {\n // Dynamic require as used here doesn't work with tsx\n if (process.env.CONVEX_RUNNING_LIVE_IN_MONOREPO) {\n return false;\n }\n const dynamicRequire = require;\n if (process.versions.webcontainer === undefined) {\n return false;\n }\n let blitzInternalEnv: unknown;\n try {\n blitzInternalEnv = dynamicRequire(\"@blitz/internal/env\");\n // totally fine for this require to fail\n // eslint-disable-next-line no-empty\n } catch {}\n return blitzInternalEnv !== null && blitzInternalEnv !== undefined;\n}\n\n// For (rare) special behaviors based on package.json details.\nexport async function currentPackageHomepage(\n ctx: Context,\n): Promise<string | null> {\n const { parentPackageJson: packageJsonPath } = await findParentConfigs(ctx);\n let packageJson: any;\n try {\n const packageJsonString = ctx.fs.readUtf8File(packageJsonPath);\n packageJson = JSON.parse(packageJsonString);\n } catch (error: any) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Couldn't parse \"${packageJsonPath}\". Make sure it's a valid JSON. Error: ${error}`,\n });\n }\n const name = packageJson[\"homepage\"];\n if (typeof name !== \"string\") {\n // wrong type or missing\n return null;\n }\n return name;\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { paths as PlatformDeploymentPaths } from \"@convex-dev/platform/deploymentApi\";\nimport { paths as PlatformManagementPaths } from \"@convex-dev/platform/managementApi\";\nimport { chalkStderr } from \"chalk\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { ProjectConfig } from \"../config.js\";\n\nimport { spawn } from \"child_process\";\nimport { InvalidArgumentError } from \"commander\";\nimport fetchRetryFactory, { RequestInitRetryParams } from \"fetch-retry\";\nimport { Context, ErrorType } from \"../../../bundler/context.js\";\nimport {\n failExistingSpinner,\n logError,\n logMessage,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { version } from \"../../version.js\";\nimport type { CloudDeploymentType, Project } from \"../api.js\";\nimport { promptOptions, promptSearch, promptYesNo } from \"./prompts.js\";\nimport {\n bigBrainEnableFeatureMetadata,\n projectHasExistingCloudDev,\n} from \"../localDeployment/bigBrain.js\";\nimport type {\n paths as CliManagementPaths,\n RegionName,\n TeamResponse,\n} from \"../../generatedApi.js\";\nimport createClient from \"openapi-fetch\";\n\nconst retryingFetch = fetchRetryFactory(fetch);\n\nexport const productionProvisionHost = \"https://api.convex.dev\";\nexport const provisionHost =\n process.env.CONVEX_PROVISION_HOST || productionProvisionHost;\nexport const BIG_BRAIN_URL = `${provisionHost}/api/`;\nconst PLATFORM_MANAGEMENT_API_URL = `${provisionHost}/v1/`;\nexport const ENV_VAR_FILE_PATH = \".env.local\";\nexport const CONVEX_DEPLOY_KEY_ENV_VAR_NAME = \"CONVEX_DEPLOY_KEY\";\n// Alias for CONVEX_DEPLOY_KEY. Accepted anywhere CONVEX_DEPLOY_KEY is.\nexport const CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT_TOKEN\";\nexport const CONVEX_DEPLOYMENT_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT\";\nexport const CONVEX_SELF_HOSTED_URL_VAR_NAME = \"CONVEX_SELF_HOSTED_URL\";\nexport const CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME =\n \"CONVEX_SELF_HOSTED_ADMIN_KEY\";\nconst MAX_RETRIES = 6;\n// After 3 retries, log a progress message that we're retrying the request\nconst RETRY_LOG_THRESHOLD = 3;\n\n/**\n * Processes the CONVEX_DEPLOY_KEY value to handle special sentinel values.\n *\n * - If the value is `<ignore_deploy_key>`, treats it as if the env var isn't set (returns undefined)\n * - If the value matches `<missing_deploy_key:$STRING>`, crashes with the message in $STRING\n * - Otherwise returns the value as-is\n *\n * @param ctx Context for crashing if needed\n * @param deployKey The raw deploy key value from environment or config\n * @returns The processed deploy key value or undefined\n */\nexport async function processDeployKeyValue(\n ctx: Context,\n deployKey: string | undefined,\n): Promise<string | undefined> {\n if (deployKey === undefined) {\n return undefined;\n }\n\n // Check for <ignore_deploy_key> sentinel\n if (deployKey === \"<ignore_deploy_key>\") {\n return undefined;\n }\n\n // Check for <missing_deploy_key:$STRING> sentinel\n const missingKeyPattern = /^<missing_deploy_key:(.+)>$/;\n const match = deployKey.match(missingKeyPattern);\n if (match) {\n const errorMessage = match[1];\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: errorMessage,\n });\n }\n\n return deployKey;\n}\n\n/**\n * Reads the deploy key from environment variables, accepting either\n * CONVEX_DEPLOY_KEY or its alias CONVEX_DEPLOYMENT_TOKEN. CONVEX_DEPLOY_KEY\n * takes precedence when both are set.\n */\nexport function readDeployKeyFromEnv(\n getEnv: (name: string) => string | undefined | null,\n): string | undefined {\n const fromDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n const fromToken = getEnv(CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME);\n return fromDeployKey || fromToken || undefined;\n}\n\n// The prefix the backend's `require_operation` checks use when an identity\n// lacks a permission. The full message names the missing permission, e.g.\n// `You do not have permission to perform this operation (deployment:data:view).`\nconst PERMISSION_DENIED_MESSAGE_PREFIX =\n \"You do not have permission to perform this operation\";\n\nfunction deployKeyPermissionAdvice(): string | null {\n // Name whichever env var is actually set. `CONVEX_DEPLOY_KEY` takes\n // precedence over `CONVEX_DEPLOYMENT_TOKEN` when both are present.\n const envVarName = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME]\n ? CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME\n : null;\n if (envVarName === null) {\n return null;\n }\n return `This is determined by the permissions granted to ${envVarName}.`;\n}\n\n/**\n * Detects a server-side authorization failure (a `require_operation` error,\n * surfaced both as an HTTP 403 and as an error from a system UDF query) and\n * produces a clean, single-line message naming the missing permission. When a\n * deploy key is in use, appends advice for configuring its permissions.\n *\n * Returns `null` if `errorMessage` is not a permission error, so callers can\n * fall back to their normal error handling.\n */\nexport function permissionDeniedErrorMessage(\n errorMessage: string,\n): string | null {\n const index = errorMessage.indexOf(PERMISSION_DENIED_MESSAGE_PREFIX);\n if (index === -1) {\n return null;\n }\n // Drop any wrapping context (e.g. the `[CONVEX Q(...)]` prefix) and stack\n // trace, keeping just the permission sentence.\n let msg = errorMessage.slice(index).split(\"\\n\")[0].trim();\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n return msg;\n}\n\nexport function parsePositiveInteger(value: string) {\n const parsedValue = parseInteger(value);\n if (parsedValue <= 0) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a positive number.\");\n }\n return parsedValue;\n}\n\nexport function parseInteger(value: string) {\n const parsedValue = +value;\n if (isNaN(parsedValue)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a number.\");\n }\n return parsedValue;\n}\n\nexport type ErrorData = {\n code: string;\n message: string;\n};\n\n/**\n * Error thrown on non-2XX reponse codes to make most `fetch()` error handling\n * follow a single code path.\n */\nexport class ThrowingFetchError extends Error {\n response: Response;\n serverErrorData?: ErrorData;\n\n constructor(\n msg: string,\n {\n code,\n message,\n response,\n }: { cause?: Error; code?: string; message?: string; response: Response },\n ) {\n if (code !== undefined && message !== undefined) {\n super(`${msg}: ${code}: ${message}`);\n this.serverErrorData = { code, message };\n } else {\n super(msg);\n }\n\n Object.setPrototypeOf(this, ThrowingFetchError.prototype);\n\n this.response = response;\n }\n\n public static async fromResponse(\n response: Response,\n msg?: string,\n ): Promise<ThrowingFetchError> {\n msg = `${msg ? `${msg} ` : \"\"}${response.status} ${response.statusText}`;\n let code, message;\n try {\n ({ code, message } = await response.json());\n } catch {\n // Do nothing because the non-2XX response code is the primary error here.\n }\n return new ThrowingFetchError(msg, { code, message, response });\n }\n\n async handle(ctx: Context): Promise<never> {\n let error_type: ErrorType = \"transient\";\n await checkFetchErrorForDeprecation(ctx, this.response);\n\n let msg = this.message;\n\n if (this.response.status === 400) {\n error_type = \"invalid filesystem or env vars\";\n } else if (this.response.status === 401) {\n error_type = \"fatal\";\n msg = `${msg}\\nAuthenticate with \\`npx convex dev\\``;\n } else if (this.response.status === 403) {\n error_type = \"fatal\";\n // Surface the missing permission cleanly (e.g. the server includes the\n // required action like `deployment:data:view`) instead of the noisy\n // \"Error fetching ...\" wrapper.\n msg = this.serverErrorData?.message ?? msg;\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n } else if (this.response.status === 404) {\n error_type = \"fatal\";\n msg = `${msg}: ${this.response.url}`;\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: error_type,\n errForSentry: this,\n printedMessage: chalkStderr.red(msg.trim()),\n });\n }\n}\n\n/**\n * Thin wrapper around `fetch()` which throws a FetchDataError on non-2XX\n * responses which includes error code and message from the response JSON.\n * (Axios-style)\n *\n * It also accepts retry options from fetch-retry.\n */\nexport async function throwingFetch(\n resource: RequestInfo | URL,\n options: (RequestInit & RequestInitRetryParams<typeof fetch>) | undefined,\n): Promise<Response> {\n const response = await retryingFetch(resource, options);\n if (!response.ok) {\n // This error must always be handled manually.\n // eslint-disable-next-line no-restricted-syntax\n throw await ThrowingFetchError.fromResponse(\n response,\n `Error fetching ${options?.method ? options.method + \" \" : \"\"} ${\n typeof resource === \"string\"\n ? resource\n : \"url\" in resource\n ? resource.url\n : resource.toString()\n }`,\n );\n }\n return response;\n}\n\n/**\n * Handle an error a fetch error or non-2xx response.\n */\nexport async function logAndHandleFetchError(\n ctx: Context,\n err: unknown,\n): Promise<never> {\n // Fail the spinner so the stderr lines appear\n failExistingSpinner();\n\n if (err instanceof ThrowingFetchError) {\n return await err.handle(ctx);\n } else {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: err,\n printedMessage: chalkStderr.red(err),\n });\n }\n}\n\nfunction logDeprecationWarning(ctx: Context, deprecationMessage: string) {\n if (ctx.deprecationMessagePrinted) {\n return;\n }\n ctx.deprecationMessagePrinted = true;\n logWarning(chalkStderr.yellow(deprecationMessage));\n}\n\nasync function checkFetchErrorForDeprecation(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This version is deprecated. Print a warning and crash.\n\n // Gotcha:\n // 1. Don't use `logDeprecationWarning` because we should always print\n // why this we crashed (even if we printed a warning earlier).\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(deprecationMessage),\n });\n default:\n // The error included a deprecation warning. Print, but handle the\n // error normally (it was for another reason).\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\n/// Call this method after a successful API response to conditionally print the\n/// \"please upgrade\" message.\nexport function deprecationCheckWarning(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This should never happen because such states are errors, not warnings.\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n \"Called deprecationCheckWarning on a fatal error. This is a bug.\",\n );\n default:\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\nexport async function hasTeam(ctx: Context, teamSlug: string) {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n return teams.some((team) => team.slug === teamSlug);\n}\n\nexport async function validateOrSelectTeam(\n ctx: Context,\n teamSlug: string | undefined,\n promptMessage: string,\n): Promise<{ team: TeamResponse; chosen: boolean }> {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n if (teams.length === 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"No teams found\",\n printedMessage: chalkStderr.red(\"Error: No teams found\"),\n });\n }\n if (!teamSlug) {\n // Prompt the user to select if they belong to more than one team.\n switch (teams.length) {\n case 1:\n return { team: teams[0], chosen: false };\n default: {\n const teamSlug = await promptSearch(ctx, {\n message: promptMessage,\n choices: teams.map((team) => ({\n name: `${team.name} (${team.slug})`,\n value: team.slug,\n })),\n });\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Failed to select team`,\n });\n }\n return { team, chosen: true };\n }\n }\n } else {\n // Validate the chosen team.\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${teamSlug} not found, fix the --team option or remove it`,\n });\n }\n return { team, chosen: false };\n }\n}\n\nexport async function selectDevDeploymentType(\n ctx: Context,\n {\n chosenConfiguration,\n newOrExisting,\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively,\n // from `--configure --dev-deployment local|cloud`\n devDeploymentFromFlag,\n }:\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"existing\";\n teamSlug: string;\n projectSlug: string;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n }\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"new\";\n teamSlug: string;\n // For new projects we don't know the project slug yet.\n projectSlug: undefined;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{ devDeployment: \"cloud\" | \"local\" }> {\n if (devDeploymentFromFlag) return { devDeployment: devDeploymentFromFlag };\n\n if (newOrExisting === \"existing\" && chosenConfiguration === null) {\n // Don't suggest local dev if developer already has a cloud deployment.\n if (await projectHasExistingCloudDev(ctx, { projectSlug, teamSlug })) {\n // TODO Expand rollout to offer local dev in this case. ENG-8307\n return { devDeployment: \"cloud\" };\n }\n }\n\n // To avoid breaking previously non-interactive flows, don't prompt if enough\n // flags were specified for configure not to already have needed input.\n if (chosenConfiguration !== \"ask\" && !userHasChosenSomethingInteractively) {\n return { devDeployment: \"cloud\" };\n }\n\n // For creating a first project (no projects exist) or joining a first project\n // (one project exists), always use cloud since it's a smoother experience.\n const isFirstProject =\n (await bigBrainEnableFeatureMetadata(ctx)).totalProjects.kind !==\n \"multiple\";\n if (isFirstProject) {\n return { devDeployment: \"cloud\" };\n }\n\n // For now default is always cloud.\n const devDeployment: \"cloud\" | \"local\" = await promptOptions(ctx, {\n message:\n \"Use cloud or local dev deployment? For more see https://docs.convex.dev/cli/local-deployments\",\n default: \"cloud\",\n choices: [\n { name: \"cloud deployment\", value: \"cloud\" },\n { name: \"local deployment (BETA)\", value: \"local\" },\n ],\n });\n return { devDeployment };\n}\n\nexport async function logNoDefaultRegionMessage(teamSlug: string) {\n const { teamDashboardUrl } = await import(\"../dashboard.js\");\n const noDefaultRegionMessage = chalkStderr.gray(\n `Tip: you can configure a default region for your team at ${chalkStderr.underline(`${teamDashboardUrl(teamSlug)}/settings`)}`,\n );\n logMessage(noDefaultRegionMessage);\n}\n\nexport async function selectRegionOrUseDefault(\n ctx: Context,\n selectedTeam: TeamResponse,\n deploymentType: CloudDeploymentType,\n) {\n if (!process.stdin.isTTY) {\n // Use the team default in non-interactive terminals\n if (!selectedTeam.defaultRegion) {\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedTeam.defaultRegion ?? null;\n }\n const selectedRegionName =\n selectedTeam.defaultRegion ??\n (await selectRegion(ctx, selectedTeam.id, deploymentType));\n if (!selectedTeam.defaultRegion) {\n // Log after the user chooses a region\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedRegionName;\n}\n\nexport async function selectRegion(\n ctx: Context,\n teamId: number,\n deploymentType: CloudDeploymentType,\n): Promise<RegionName> {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n const choices = regionsResponse.items\n .filter((item) => Boolean(item.available))\n .map((item) => ({\n name: item.displayName,\n value: item.name,\n }))\n .sort((a, b) => {\n // Show US region first if it exists\n if (a.value === \"aws-us-east-1\") return -1;\n if (b.value === \"aws-us-east-1\") return 1;\n return 0;\n });\n return await promptOptions(ctx, {\n message: `Where should this ${deploymentType} deployment run?`,\n suffix: `\\n${chalkStderr.gray(\n \"See https://www.convex.dev/pricing for pricing\",\n )}`,\n choices,\n });\n}\n\nexport async function hasProject(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n) {\n try {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n return !!projects.find((project) => project.slug === projectSlug);\n } catch {\n return false;\n }\n}\n\nexport async function hasProjects(ctx: Context) {\n return !!(await bigBrainAPI({ ctx, method: \"GET\", path: `has_projects` }));\n}\n\nexport async function validateOrSelectProject(\n ctx: Context,\n projectSlug: string | undefined,\n teamSlug: string,\n singleProjectPrompt: string,\n multiProjectPrompt: string,\n): Promise<string | null> {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n if (projects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n if (!projectSlug) {\n // Prompt the user to select project.\n switch (projects.length) {\n case 1: {\n const project = projects[0];\n const confirmed = await promptYesNo(ctx, {\n message: `${singleProjectPrompt} ${project.name} (${project.slug})?`,\n });\n\n if (!confirmed) {\n return null;\n }\n return projects[0].slug;\n }\n default:\n return await promptSearch(ctx, {\n message: multiProjectPrompt,\n choices: projects.map((project: Project) => ({\n name: `${project.name} (${project.slug})`,\n value: project.slug,\n })),\n });\n }\n } else {\n // Validate the chosen project.\n if (!projects.find((project) => project.slug === projectSlug)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Project ${projectSlug} not found, fix the --project option or remove it`,\n });\n }\n return projectSlug;\n }\n}\n\n/**\n * @param ctx\n * @returns a Record of dependency name to dependency version for dependencies\n * and devDependencies\n */\nexport async function loadPackageJson(\n ctx: Context,\n includePeerDeps = false,\n): Promise<Record<string, string>> {\n let packageJson;\n try {\n packageJson = ctx.fs.readUtf8File(\"package.json\");\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Unable to read your package.json: ${\n err as any\n }. Make sure you're running this command from the root directory of a Convex app that contains the package.json`,\n });\n }\n let obj;\n try {\n obj = JSON.parse(packageJson);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n printedMessage: `Unable to parse package.json: ${err as any}`,\n });\n }\n if (typeof obj !== \"object\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected to parse an object from package.json\",\n });\n }\n const packages = {\n ...(includePeerDeps ? (obj.peerDependencies ?? {}) : {}),\n ...(obj.dependencies ?? {}),\n ...(obj.devDependencies ?? {}),\n };\n return packages;\n}\n\nexport async function ensureHasConvexDependency(ctx: Context, cmd: string) {\n const packages = await loadPackageJson(ctx, true);\n const hasConvexDependency = \"convex\" in packages;\n if (!hasConvexDependency) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `In order to ${cmd}, add \\`convex\\` to your package.json dependencies.`,\n });\n }\n}\n\n/** Return a new array with elements of the passed in array sorted by a key lambda */\nexport const sorted = <T>(arr: T[], key: (el: T) => any): T[] => {\n const newArr = [...arr];\n const cmp = (a: T, b: T) => {\n if (key(a) < key(b)) return -1;\n if (key(a) > key(b)) return 1;\n return 0;\n };\n return newArr.sort(cmp);\n};\n\nexport function functionsDir(\n configPath: string,\n projectConfig: ProjectConfig,\n): string {\n return path.join(path.dirname(configPath), projectConfig.functions);\n}\n\nfunction convexName() {\n // Use a different directory for config files generated for tests\n if (process.env.CONVEX_PROVISION_HOST) {\n const port = process.env.CONVEX_PROVISION_HOST.split(\":\")[2];\n if (port === undefined || port === \"8050\") {\n return `convex-test`;\n } else {\n return `convex-test-${port}`;\n }\n }\n return \"convex\";\n}\n\nexport function rootDirectory(): string {\n return path.join(os.homedir(), `.${convexName()}`);\n}\n\nexport function cacheDir() {\n const name = convexName();\n const platform = process.platform;\n if (platform === \"win32\") {\n // On Windows, `LOCALAPPDATA` is usually set, but fall back to\n // `USERPROFILE` if not, and fall back to homedir if all else fails.\n if (process.env.LOCALAPPDATA) {\n return path.join(process.env.LOCALAPPDATA, name);\n }\n if (process.env.USERPROFILE) {\n return path.join(process.env.USERPROFILE, \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \".cache\", name);\n}\n\n/**\n * Fetch with appropriate headers for the Convex Management API.\n *\n * This fetch() also has retries and throws if the response is not ok.\n */\nexport function bigBrainFetch(ctx: Context): typeof fetch {\n const authHeader = ctx.bigBrainAuth()?.header;\n const bigBrainHeaders: Record<string, string> = authHeader\n ? {\n Authorization: authHeader,\n \"Convex-Client\": `npm-cli-${version}`,\n }\n : {\n \"Convex-Client\": `npm-cli-${version}`,\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const { headers: optionsHeaders, ...rest } = options || {};\n // Use the options headers if they exist. Otherwise, use the request headers\n const headers = {\n ...bigBrainHeaders,\n ...(optionsHeaders ??\n (resource instanceof Request\n ? Object.fromEntries(resource.headers.entries())\n : {})),\n };\n const opts = {\n retries: MAX_RETRIES,\n retryDelay,\n headers,\n ...rest,\n };\n\n return throwingFetch(resource, opts);\n };\n}\n\nexport async function bigBrainAPI<T = any>({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<T> {\n const dataString =\n data === undefined\n ? undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n try {\n return await bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data: dataString,\n });\n } catch (err: unknown) {\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\n/**\n * Typed API client with a fetch() implemention that includes retries and crashes on errors.\n * It is always safe to call `.data!` on the response: any error would throw or crash.\n *\n * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.\n */\nfunction typedApiClientFactory<T>(\n baseUrl: string,\n fetchBuilder: (ctx: Context) => typeof fetch,\n) {\n return (ctx: Context, options: { throw?: boolean } = {}) => {\n type Paths = T extends CliManagementPaths\n ? CliManagementPaths\n : T extends PlatformManagementPaths\n ? PlatformManagementPaths\n : T extends PlatformDeploymentPaths\n ? PlatformDeploymentPaths\n : never;\n const client = createClient<Paths>({\n baseUrl,\n fetch: fetchBuilder(ctx),\n });\n\n // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors\n return new Proxy(client, {\n get(target, prop) {\n const originalMethod = target[prop as keyof typeof target];\n\n if (\n prop === \"GET\" ||\n prop === \"POST\" ||\n prop === \"HEAD\" ||\n prop === \"OPTIONS\" ||\n prop === \"PUT\" ||\n prop === \"DELETE\" ||\n prop === \"PATCH\" ||\n prop === \"TRACE\"\n ) {\n return async (...args: any[]) => {\n try {\n return await (originalMethod as Function).apply(target, args);\n } catch (err: unknown) {\n if (options.throw) {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n };\n }\n\n return originalMethod;\n },\n });\n };\n}\n\nexport const typedBigBrainClient = typedApiClientFactory<CliManagementPaths>(\n BIG_BRAIN_URL,\n bigBrainFetch,\n);\nexport const typedPlatformClient =\n typedApiClientFactory<PlatformManagementPaths>(\n PLATFORM_MANAGEMENT_API_URL,\n bigBrainFetch,\n );\n\nexport function typedDeploymentClient(\n ctx: Context,\n args: { deploymentUrl: string; adminKey: string },\n options: { throw?: boolean } = {},\n) {\n return typedApiClientFactory<PlatformDeploymentPaths>(\n `${args.deploymentUrl}/api/v1`,\n (ctx) =>\n deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n }),\n )(ctx, options);\n}\n\nexport async function bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<any> {\n const fetch = bigBrainFetch(ctx);\n const dataString =\n data === undefined\n ? method === \"POST\"\n ? JSON.stringify({})\n : undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n const res = await fetch(new URL(path, BIG_BRAIN_URL), {\n method,\n ...(dataString ? { body: dataString } : {}),\n headers:\n method === \"POST\"\n ? {\n \"Content-Type\": \"application/json\",\n }\n : {},\n });\n deprecationCheckWarning(ctx, res);\n if (res.status === 200) {\n return await res.json();\n }\n}\n\n/**\n * Polls an arbitrary function until a condition is met.\n *\n * @param fetch Function performing a fetch, returning resulting data.\n * @param condition This function will terminate polling when it returns `true`.\n * @param waitMs How long to wait in between fetches.\n * @returns The resulting data from `fetch`.\n */\nexport const poll = async function <Result>(\n fetch: () => Promise<Result>,\n condition: (data: Result) => boolean,\n waitMs = 1000,\n) {\n let result = await fetch();\n while (!condition(result)) {\n await wait(waitMs);\n result = await fetch();\n }\n return result;\n};\n\nconst wait = function (waitMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, waitMs);\n });\n};\n\nexport function waitForever() {\n // This never resolves\n return new Promise((_) => {\n // ignore\n });\n}\n\n// Returns a promise and a function that resolves the promise.\nexport function waitUntilCalled(): [Promise<unknown>, () => void] {\n let onCalled: (v: unknown) => void;\n const waitPromise = new Promise((resolve) => (onCalled = resolve));\n return [waitPromise, () => onCalled(null)];\n}\n\nconst BYTE_UNITS: [number, string][] = [\n [1 << 30, \"GiB\"],\n [1_000_000_000, \"GB\"],\n [1 << 20, \"MiB\"],\n [1_000_000, \"MB\"],\n [1 << 10, \"KiB\"],\n [1_000, \"KB\"],\n];\n\n/**\n * Format a byte count into a human-friendly string.\n *\n * Picks the unit (binary or decimal) that divides most cleanly.\n * Shows one decimal place only when it divides exactly (e.g. \"4.1 MiB\").\n * Falls back to raw bytes when no unit divides cleanly.\n */\nexport function formatSize(n: number): string {\n if (n === 0) {\n return \"0 bytes\";\n }\n for (const [unitSize, unitName] of BYTE_UNITS) {\n if (n < unitSize) {\n continue;\n }\n if (n % unitSize === 0) {\n return `${n / unitSize} ${unitName}`;\n }\n if ((n * 10) % unitSize === 0) {\n const whole = Math.floor(n / unitSize);\n const frac = Math.floor((n * 10) / unitSize) % 10;\n return `${whole}.${frac} ${unitName}`;\n }\n }\n return `${n} bytes`;\n}\n\nexport function formatDuration(ms: number): string {\n const twoDigits = (n: number, unit: string) =>\n `${n.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}${unit}`;\n\n if (ms < 1e-3) {\n return twoDigits(ms * 1e9, \"ns\");\n }\n if (ms < 1) {\n return twoDigits(ms * 1e3, \"\u00B5s\");\n }\n if (ms < 1e3) {\n return twoDigits(ms, \"ms\");\n }\n const s = ms / 1e3;\n if (s < 60) {\n return twoDigits(ms / 1e3, \"s\");\n }\n return twoDigits(s / 60, \"m\");\n}\n\nexport function getCurrentTimeString() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n const seconds = String(now.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n// We don't allow running commands in project subdirectories yet,\n// but we can provide better errors if we look around.\nexport async function findParentConfigs(ctx: Context): Promise<{\n parentPackageJson: string;\n parentConvexJson?: string | undefined;\n}> {\n const parentPackageJson = findUp(ctx, \"package.json\");\n if (!parentPackageJson) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage:\n \"No package.json found. To create a new project using Convex, see https://docs.convex.dev/home#quickstarts\",\n });\n }\n const candidateConvexJson =\n parentPackageJson &&\n path.join(path.dirname(parentPackageJson), \"convex.json\");\n const parentConvexJson =\n candidateConvexJson && ctx.fs.exists(candidateConvexJson)\n ? candidateConvexJson\n : undefined;\n return {\n parentPackageJson,\n parentConvexJson,\n };\n}\n\n/**\n * Finds a file in the current working directory or a parent.\n *\n * @returns The absolute path of the first file found or undefined.\n */\nfunction findUp(ctx: Context, filename: string): string | undefined {\n let curDir = path.resolve(\".\");\n let parentDir = curDir;\n do {\n const candidate = path.join(curDir, filename);\n if (ctx.fs.exists(candidate)) {\n return candidate;\n }\n curDir = parentDir;\n parentDir = path.dirname(curDir);\n } while (parentDir !== curDir);\n return;\n}\n\n/**\n * Returns whether there's an existing project config. Throws\n * if this is not a valid directory for a project config.\n */\nexport async function isInExistingProject(ctx: Context) {\n const { parentPackageJson, parentConvexJson } = await findParentConfigs(ctx);\n if (parentPackageJson !== path.resolve(\"package.json\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Run this command from the root directory of a project.\",\n });\n }\n return !!parentConvexJson;\n}\n\n// `spawnAsync` is the async version of Node's `spawnSync` (and `spawn`).\n//\n// By default, this returns the produced `stdout` and `stderror` and\n// an error if one was encountered (to mirror `spawnSync`).\n//\n// If `stdio` is set to `\"inherit\"`, pipes `stdout` and `stderror` (\n// pausing the spinner if one is running) and rejects the promise\n// on errors (to mirror `execFileSync`).\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n): Promise<{\n stdout: string;\n stderr: string;\n status: null | number;\n error?: Error | undefined;\n}>;\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options: { stdio: \"inherit\"; shell?: boolean },\n): Promise<void>;\nexport function spawnAsync(\n _ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options?: { stdio: \"inherit\"; shell?: boolean },\n) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { shell: options?.shell });\n let stdout = \"\";\n let stderr = \"\";\n\n const pipeOutput = options?.stdio === \"inherit\";\n\n if (pipeOutput) {\n child.stdout.on(\"data\", (text) =>\n logMessage(text.toString(\"utf-8\").trimEnd()),\n );\n child.stderr.on(\"data\", (text) =>\n logError(text.toString(\"utf-8\").trimEnd()),\n );\n } else {\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString(\"utf-8\");\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString(\"utf-8\");\n });\n }\n\n const completionListener = (code: number | null) => {\n child.removeListener(\"error\", errorListener);\n const result = pipeOutput\n ? { status: code }\n : { stdout, stderr, status: code };\n if (code !== 0) {\n const argumentString =\n args && args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n const error = new Error(\n `\\`${command}${argumentString}\\` exited with non-zero code: ${code}`,\n );\n if (pipeOutput) {\n reject({ ...result, error });\n } else {\n resolve({ ...result, error });\n }\n } else {\n resolve(result);\n }\n };\n\n const errorListener = (error: Error) => {\n child.removeListener(\"exit\", completionListener);\n child.removeListener(\"close\", completionListener);\n if (pipeOutput) {\n reject({ error, status: null });\n } else {\n resolve({ error, status: null });\n }\n };\n\n if (pipeOutput) {\n child.once(\"exit\", completionListener);\n } else {\n child.once(\"close\", completionListener);\n }\n child.once(\"error\", errorListener);\n });\n}\n\nconst IDEMPOTENT_METHODS = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\", \"TRACE\"];\n\nfunction retryDelay(\n attempt: number,\n _error: Error | null,\n _response: Response | null,\n): number {\n // immediate, 1s delay, 2s delay, 4s delay, etc.\n const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1000;\n const randomSum = delay * 0.2 * Math.random();\n return delay + randomSum;\n}\n\nfunction deploymentFetchRetryOn(\n onError?: (err: any, attempt: number) => void,\n method?: string,\n) {\n const shouldRetry = function (\n _attempt: number,\n error: Error | null,\n response: Response | null,\n ): { kind: \"retry\"; error: any } | { kind: \"stop\" } {\n // Retry on network errors.\n if (error !== null) {\n // TODO filter out all SSL errors\n // https://github.com/nodejs/node/blob/8a41d9b636be86350cd32847c3f89d327c4f6ff7/src/crypto/crypto_common.cc#L218-L245\n return { kind: \"retry\", error: error };\n }\n // Retry on 404s since these can sometimes happen with newly created\n // deployments for POSTs.\n if (response?.status === 404) {\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n // Whatever the error code it doesn't hurt to retry idempotent requests.\n if (\n response &&\n !response.ok &&\n method &&\n IDEMPOTENT_METHODS.includes(method.toUpperCase())\n ) {\n // ...but it's a bit annoying to wait for things we know won't succced\n if (\n [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // PaymentRequired\n 403, // Forbidden\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 412, // Precondition Failed\n 413, // Payload Too Large\n 414, // URI Too Long\n 415, // Unsupported Media Type\n 416, // Range Not Satisfiable\n ].includes(response.status)\n ) {\n return {\n kind: \"stop\",\n };\n }\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n return { kind: \"stop\" };\n };\n\n return function (\n attempt: number,\n error: Error | null,\n response: Response | null,\n ) {\n const result = shouldRetry(attempt, error, response);\n if (result.kind === \"retry\") {\n onError?.(result.error, attempt);\n }\n if (attempt >= MAX_RETRIES) {\n // Stop retrying if we've exhausted all retries, but do this after we've\n // called `onError` so that the caller can still log the error.\n return false;\n }\n return result.kind === \"retry\";\n };\n}\n\n/**\n * Unlike `deploymentFetch`, this does not add on any headers, so the caller\n * must supply any headers.\n */\nexport function bareDeploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n onError?: (err: any) => void;\n },\n): typeof throwingFetch {\n const { deploymentUrl, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n });\n return func;\n };\n}\n\n/**\n * This returns a `fetch` function that will fetch against `deploymentUrl`.\n *\n * It will also set the `Authorization` header, `Content-Type` header, and\n * the `Convex-Client` header if they are not set in the `fetch`.\n */\nexport function deploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n onError?: (err: any) => void;\n },\n): typeof fetch {\n const { deploymentUrl, adminKey, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n\n const headers = new Headers(options?.headers || {});\n if (!headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", `Convex ${adminKey}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (!headers.has(\"Convex-Client\")) {\n headers.set(\"Convex-Client\", `npm-cli-${version}`);\n }\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n headers,\n });\n return func;\n };\n}\n\n/**\n * Whether this is likely to be a WebContainer,\n * WebContainers can't complete the WorkOS login but where that login flow\n * fails has changed with the environment.\n */\nexport function isWebContainer(): boolean {\n // Dynamic require as used here doesn't work with tsx\n if (process.env.CONVEX_RUNNING_LIVE_IN_MONOREPO) {\n return false;\n }\n const dynamicRequire = require;\n if (process.versions.webcontainer === undefined) {\n return false;\n }\n let blitzInternalEnv: unknown;\n try {\n blitzInternalEnv = dynamicRequire(\"@blitz/internal/env\");\n // totally fine for this require to fail\n // eslint-disable-next-line no-empty\n } catch {}\n return blitzInternalEnv !== null && blitzInternalEnv !== undefined;\n}\n\n// For (rare) special behaviors based on package.json details.\nexport async function currentPackageHomepage(\n ctx: Context,\n): Promise<string | null> {\n const { parentPackageJson: packageJsonPath } = await findParentConfigs(ctx);\n let packageJson: any;\n try {\n const packageJsonString = ctx.fs.readUtf8File(packageJsonPath);\n packageJson = JSON.parse(packageJsonString);\n } catch (error: any) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Couldn't parse \"${packageJsonPath}\". Make sure it's a valid JSON. Error: ${error}`,\n });\n }\n const name = packageJson[\"homepage\"];\n if (typeof name !== \"string\") {\n // wrong type or missing\n return null;\n }\n return name;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["teamSlug", "team", "path", "ctx", "fetch", "options"]
7
7
  }
package/dist/esm/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
- export const version = "1.42.1";
2
+ export const version = "1.42.2";
3
3
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.ts"],
4
- "sourcesContent": ["export const version = \"1.42.1\";\n"],
4
+ "sourcesContent": ["export const version = \"1.42.2\";\n"],
5
5
  "mappings": ";AAAO,aAAM,UAAU;",
6
6
  "names": []
7
7
  }
@@ -104,7 +104,7 @@ export class ConvexReactClient {
104
104
  if (this.cachedSync) {
105
105
  return this.cachedSync;
106
106
  }
107
- this.cachedSync = new BaseConvexClient(
107
+ this.cachedSync = this.options.baseClient ?? new BaseConvexClient(
108
108
  this.address,
109
109
  () => {
110
110
  },