convex 1.34.0 → 1.34.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/dist/browser.bundle.js +6 -9
- package/dist/browser.bundle.js.map +2 -2
- package/dist/cjs/browser/sync/authentication_manager.js +4 -1
- package/dist/cjs/browser/sync/authentication_manager.js.map +2 -2
- package/dist/cjs/browser/sync/web_socket_manager.js +1 -7
- package/dist/cjs/browser/sync/web_socket_manager.js.map +2 -2
- package/dist/cjs/cli/aiFiles.js +15 -14
- package/dist/cjs/cli/aiFiles.js.map +2 -2
- package/dist/cjs/cli/configure.js +15 -10
- package/dist/cjs/cli/configure.js.map +2 -2
- package/dist/cjs/cli/lib/aiFiles/agentsmd.js +69 -0
- package/dist/cjs/cli/lib/aiFiles/agentsmd.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/claudemd.js +69 -0
- package/dist/cjs/cli/lib/aiFiles/claudemd.js.map +7 -0
- package/dist/cjs/cli/lib/{ai → aiFiles}/config.js +73 -46
- package/dist/cjs/cli/lib/aiFiles/config.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/cursorrules.js +48 -0
- package/dist/cjs/cli/lib/aiFiles/cursorrules.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js +51 -0
- package/dist/cjs/cli/lib/aiFiles/guidelinesmd.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/index.js +231 -0
- package/dist/cjs/cli/lib/aiFiles/index.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/paths.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/skills.js +180 -0
- package/dist/cjs/cli/lib/aiFiles/skills.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/status.js +195 -0
- package/dist/cjs/cli/lib/aiFiles/status.js.map +7 -0
- package/dist/cjs/cli/lib/aiFiles/utils.js +111 -0
- package/dist/cjs/cli/lib/aiFiles/utils.js.map +7 -0
- package/dist/cjs/cli/lib/command.js +6 -1
- package/dist/cjs/cli/lib/command.js.map +2 -2
- package/dist/cjs/cli/lib/config.js +3 -4
- package/dist/cjs/cli/lib/config.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/anonymous.js +2 -2
- package/dist/cjs/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/cjs/cli/lib/updates.js +8 -8
- package/dist/cjs/cli/lib/updates.js.map +2 -2
- package/dist/cjs/cli/lib/versionApi.js +7 -4
- package/dist/cjs/cli/lib/versionApi.js.map +2 -2
- package/dist/cjs/cli/lib/workos/workos.js +4 -6
- package/dist/cjs/cli/lib/workos/workos.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs-types/browser/sync/authentication_manager.d.ts.map +1 -1
- package/dist/cjs-types/browser/sync/web_socket_manager.d.ts.map +1 -1
- package/dist/cjs-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/cjs-types/cli/configure.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts +19 -0
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts +19 -0
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/claudemd.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/config.d.ts +46 -0
- package/dist/cjs-types/cli/lib/aiFiles/config.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/config.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/cursorrules.d.ts +10 -0
- package/dist/cjs-types/cli/lib/aiFiles/cursorrules.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts +12 -0
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts +40 -0
- package/dist/cjs-types/cli/lib/aiFiles/index.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/index.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/integration.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/{ai → aiFiles}/paths.d.ts +4 -0
- package/dist/cjs-types/cli/lib/aiFiles/paths.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/prompt.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts +18 -0
- package/dist/cjs-types/cli/lib/aiFiles/skills.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/status.d.ts +3 -0
- package/dist/cjs-types/cli/lib/aiFiles/status.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts +46 -0
- package/dist/cjs-types/cli/lib/aiFiles/utils.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/config.d.ts +1 -0
- package/dist/cjs-types/cli/lib/config.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/versionApi.d.ts +7 -1
- package/dist/cjs-types/cli/lib/versionApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/workos/workos.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cli.bundle.cjs +1605 -1548
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/browser/sync/authentication_manager.js +4 -1
- package/dist/esm/browser/sync/authentication_manager.js.map +2 -2
- package/dist/esm/browser/sync/web_socket_manager.js +1 -7
- package/dist/esm/browser/sync/web_socket_manager.js.map +2 -2
- package/dist/esm/cli/aiFiles.js +17 -17
- package/dist/esm/cli/aiFiles.js.map +2 -2
- package/dist/esm/cli/configure.js +15 -10
- package/dist/esm/cli/configure.js.map +2 -2
- package/dist/esm/cli/lib/aiFiles/agentsmd.js +52 -0
- package/dist/esm/cli/lib/aiFiles/agentsmd.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/claudemd.js +52 -0
- package/dist/esm/cli/lib/aiFiles/claudemd.js.map +7 -0
- package/dist/esm/cli/lib/{ai → aiFiles}/config.js +71 -45
- package/dist/esm/cli/lib/aiFiles/config.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/cursorrules.js +16 -0
- package/dist/esm/cli/lib/aiFiles/cursorrules.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js +28 -0
- package/dist/esm/cli/lib/aiFiles/guidelinesmd.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/index.js +210 -0
- package/dist/esm/cli/lib/aiFiles/index.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/paths.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/skills.js +147 -0
- package/dist/esm/cli/lib/aiFiles/skills.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/status.js +175 -0
- package/dist/esm/cli/lib/aiFiles/status.js.map +7 -0
- package/dist/esm/cli/lib/aiFiles/utils.js +82 -0
- package/dist/esm/cli/lib/aiFiles/utils.js.map +7 -0
- package/dist/esm/cli/lib/command.js +6 -1
- package/dist/esm/cli/lib/command.js.map +2 -2
- package/dist/esm/cli/lib/config.js +3 -4
- package/dist/esm/cli/lib/config.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/anonymous.js +2 -2
- package/dist/esm/cli/lib/localDeployment/anonymous.js.map +2 -2
- package/dist/esm/cli/lib/updates.js +8 -8
- package/dist/esm/cli/lib/updates.js.map +2 -2
- package/dist/esm/cli/lib/versionApi.js +7 -4
- package/dist/esm/cli/lib/versionApi.js.map +2 -2
- package/dist/esm/cli/lib/workos/workos.js +4 -6
- package/dist/esm/cli/lib/workos/workos.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm-types/browser/sync/authentication_manager.d.ts.map +1 -1
- package/dist/esm-types/browser/sync/web_socket_manager.d.ts.map +1 -1
- package/dist/esm-types/cli/aiFiles.d.ts.map +1 -1
- package/dist/esm-types/cli/configure.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts +19 -0
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/agentsmd.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts +19 -0
- package/dist/esm-types/cli/lib/aiFiles/claudemd.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/claudemd.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/config.d.ts +46 -0
- package/dist/esm-types/cli/lib/aiFiles/config.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/config.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/cursorrules.d.ts +10 -0
- package/dist/esm-types/cli/lib/aiFiles/cursorrules.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts +12 -0
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/aiFiles/guidelinesmd.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts +40 -0
- package/dist/esm-types/cli/lib/aiFiles/index.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/index.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/integration.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/{ai → aiFiles}/paths.d.ts +4 -0
- package/dist/esm-types/cli/lib/aiFiles/paths.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/prompt.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts +18 -0
- package/dist/esm-types/cli/lib/aiFiles/skills.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/status.d.ts +3 -0
- package/dist/esm-types/cli/lib/aiFiles/status.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts +46 -0
- package/dist/esm-types/cli/lib/aiFiles/utils.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/config.d.ts +1 -0
- package/dist/esm-types/cli/lib/config.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/versionApi.d.ts +7 -1
- package/dist/esm-types/cli/lib/versionApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/workos/workos.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/react.bundle.js +6 -9
- package/dist/react.bundle.js.map +2 -2
- package/package.json +1 -1
- package/schemas/convex.schema.json +7 -1
- package/src/browser/sync/authentication_manager.ts +9 -4
- package/src/browser/sync/client_node.test.ts +125 -0
- package/src/browser/sync/web_socket_manager.ts +1 -7
- package/src/cli/aiFiles.ts +20 -27
- package/src/cli/configure.ts +17 -11
- package/src/cli/deploymentSelection.test.ts +56 -2
- package/src/cli/lib/{ai → aiFiles}/MANUAL_TESTING.md +6 -2
- package/src/cli/lib/aiFiles/agentsmd.test.ts +133 -0
- package/src/cli/lib/aiFiles/agentsmd.ts +77 -0
- package/src/cli/lib/aiFiles/claudemd.test.ts +92 -0
- package/src/cli/lib/aiFiles/claudemd.ts +77 -0
- package/src/cli/lib/{ai → aiFiles}/config.test.ts +181 -59
- package/src/cli/lib/{ai → aiFiles}/config.ts +92 -63
- package/src/cli/lib/aiFiles/cursorrules.ts +25 -0
- package/src/cli/lib/aiFiles/guidelinesmd.test.ts +40 -0
- package/src/cli/lib/aiFiles/guidelinesmd.ts +41 -0
- package/src/cli/lib/{ai → aiFiles}/index.test.ts +200 -339
- package/src/cli/lib/aiFiles/index.ts +303 -0
- package/src/cli/lib/{ai → aiFiles}/integration.test.ts +117 -147
- package/src/cli/lib/{ai → aiFiles}/paths.ts +5 -0
- package/src/cli/lib/{ai → aiFiles}/prompt.test.ts +78 -30
- package/src/cli/lib/aiFiles/skills.ts +213 -0
- package/src/cli/lib/aiFiles/status.ts +240 -0
- package/src/cli/lib/aiFiles/utils.ts +163 -0
- package/src/cli/lib/command.ts +6 -1
- package/src/cli/lib/config.test.ts +1 -1
- package/src/cli/lib/config.ts +6 -5
- package/src/cli/lib/localDeployment/anonymous.ts +2 -2
- package/src/cli/lib/updates.test.ts +40 -30
- package/src/cli/lib/updates.ts +8 -8
- package/src/cli/lib/versionApi.test.ts +13 -10
- package/src/cli/lib/versionApi.ts +13 -5
- package/src/cli/lib/workos/workos.ts +4 -5
- package/src/index.ts +1 -1
- package/src/values/.claude/settings.local.json +10 -0
- package/dist/cjs/cli/lib/ai/config.js.map +0 -7
- package/dist/cjs/cli/lib/ai/index.js +0 -704
- package/dist/cjs/cli/lib/ai/index.js.map +0 -7
- package/dist/cjs/cli/lib/ai/paths.js.map +0 -7
- package/dist/cjs-types/cli/lib/ai/config.d.ts +0 -50
- package/dist/cjs-types/cli/lib/ai/config.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/config.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/index.d.ts +0 -56
- package/dist/cjs-types/cli/lib/ai/index.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/index.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/integration.test.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/paths.d.ts.map +0 -1
- package/dist/cjs-types/cli/lib/ai/prompt.test.d.ts.map +0 -1
- package/dist/esm/cli/lib/ai/config.js.map +0 -7
- package/dist/esm/cli/lib/ai/index.js +0 -684
- package/dist/esm/cli/lib/ai/index.js.map +0 -7
- package/dist/esm/cli/lib/ai/paths.js.map +0 -7
- package/dist/esm-types/cli/lib/ai/config.d.ts +0 -50
- package/dist/esm-types/cli/lib/ai/config.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/config.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/index.d.ts +0 -56
- package/dist/esm-types/cli/lib/ai/index.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/index.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/integration.test.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/paths.d.ts.map +0 -1
- package/dist/esm-types/cli/lib/ai/prompt.test.d.ts.map +0 -1
- package/src/cli/lib/ai/index.ts +0 -1006
- /package/dist/cjs/cli/lib/{ai → aiFiles}/paths.js +0 -0
- /package/dist/cjs-types/cli/lib/{ai → aiFiles}/config.test.d.ts +0 -0
- /package/dist/cjs-types/cli/lib/{ai → aiFiles}/index.test.d.ts +0 -0
- /package/dist/cjs-types/cli/lib/{ai → aiFiles}/integration.test.d.ts +0 -0
- /package/dist/cjs-types/cli/lib/{ai → aiFiles}/prompt.test.d.ts +0 -0
- /package/dist/esm/cli/lib/{ai → aiFiles}/paths.js +0 -0
- /package/dist/esm-types/cli/lib/{ai → aiFiles}/config.test.d.ts +0 -0
- /package/dist/esm-types/cli/lib/{ai → aiFiles}/index.test.d.ts +0 -0
- /package/dist/esm-types/cli/lib/{ai → aiFiles}/integration.test.d.ts +0 -0
- /package/dist/esm-types/cli/lib/{ai → aiFiles}/prompt.test.d.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/config.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport path from \"path\";\nimport { z } from \"zod\";\nimport { Context } from \"../../bundler/context.js\";\nimport { TypescriptCompiler } from \"./typecheck.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport {\n Bundle,\n BundleHash,\n bundle,\n bundleAuthConfig,\n entryPointsByEnvironment,\n} from \"../../bundler/index.js\";\nimport { version } from \"../version.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport {\n functionsDir,\n ErrorData,\n loadPackageJson,\n deploymentFetch,\n deprecationCheckWarning,\n logAndHandleFetchError,\n ThrowingFetchError,\n currentPackageHomepage,\n} from \"./utils/utils.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { NodeDependency } from \"./deployApi/modules.js\";\nimport { ComponentDefinitionPath } from \"./components/definition/directoryStructure.js\";\nimport {\n LocalDeploymentError,\n printLocalDeploymentOnError,\n} from \"./localDeployment/errors.js\";\nimport { debugIsolateBundlesSerially } from \"../../bundler/debugBundle.js\";\nimport { DeploymentType } from \"./api.js\";\nexport { productionProvisionHost, provisionHost } from \"./utils/utils.js\";\n\n/** Type representing WorkOS AuthKit integration configuration. */\nexport interface AuthKitConfigureSettings {\n redirectUris?: string[];\n appHomepageUrl?: string;\n corsOrigins?: string[];\n}\n\nexport interface AuthKitEnvironmentConfig {\n environmentType?: \"development\" | \"staging\" | \"production\";\n configure?: false | AuthKitConfigureSettings;\n localEnvVars?: false | Record<string, string>;\n}\n\nexport interface AuthKitConfig {\n dev?: AuthKitEnvironmentConfig;\n preview?: AuthKitEnvironmentConfig;\n prod?: AuthKitEnvironmentConfig;\n}\n/**\n * convex.json file parsing notes\n *\n * - Unknown fields at the top level and in node and codegen are preserved\n * so that older CLI versions can deploy new projects (this functionality\n * will be removed in the future).\n * - convex.json does not allow comments, but this could change in the future.\n * Previously it contained automatically set values like productionUrl\n * but it's more like a config file now.\n */\n\n/** Type representing Convex project configuration. */\nexport interface ProjectConfig {\n // \u26A0\uFE0F When updating this, please also update the file used by IDEs for autocompletion and validation:\n // -> npm-packages/convex/schemas/convex.schema.json\n\n functions: string;\n node: {\n externalPackages: string[];\n // nodeVersion has no default value, its presence/absence is meaningful\n nodeVersion?: string | undefined;\n };\n generateCommonJSApi: boolean;\n\n codegen: {\n staticApi: boolean;\n staticDataModel: boolean;\n legacyComponentApi?: boolean;\n fileType?: \"ts\" | \"js/dts\";\n };\n\n bundler?: {\n includeSourcesContent?: boolean;\n };\n\n typescriptCompiler?: TypescriptCompiler;\n\n // WorkOS AuthKit integration configuration\n authKit?: AuthKitConfig | undefined;\n\n // Convex AI files user preferences.\n aiFiles?: {\n // When true, suppresses AI files install/staleness nags.\n disableStalenessMessage?: boolean;\n };\n}\n\nexport interface Config {\n projectConfig: ProjectConfig;\n modules: Bundle[];\n nodeDependencies: NodeDependency[];\n schemaId?: string;\n udfServerVersion?: string;\n nodeVersion?: string | undefined;\n}\n\nexport interface ConfigWithModuleHashes {\n projectConfig: ProjectConfig;\n moduleHashes: BundleHash[];\n nodeDependencies: NodeDependency[];\n schemaId?: string;\n udfServerVersion?: string;\n}\n\nconst DEFAULT_FUNCTIONS_PATH = \"convex/\";\n\n/** Whether .ts file extensions should be used for generated code (default is false). */\nexport function usesTypeScriptCodegen(projectConfig: ProjectConfig): boolean {\n return projectConfig.codegen.fileType === \"ts\";\n}\n\n/** Whether the new component API import style should be used (default is false) */\nexport function usesComponentApiImports(projectConfig: ProjectConfig): boolean {\n return projectConfig.codegen.legacyComponentApi === false;\n}\n\n/**\n * Get the authKit configuration from convex.json.\n */\nexport async function getAuthKitConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n): Promise<AuthKitConfig | undefined> {\n // If there's an explicit authKit config, use it\n if (\"authKit\" in projectConfig) {\n return projectConfig.authKit;\n }\n\n // TODO remove this after a few versions\n // Migration help: is this one of the hardcoded templates that has special\n // behavior without a convex.json? Encourage them to upgrade the template.\n const homepage = await currentPackageHomepage(ctx);\n const isOldWorkOSTemplate = !!(\n homepage &&\n [\n \"https://github.com/workos/template-convex-nextjs-authkit/#readme\",\n \"https://github.com/workos/template-convex-react-vite-authkit/#readme\",\n \"https://github.com:workos/template-convex-react-vite-authkit/#readme\",\n \"https://github.com/workos/template-convex-tanstack-start-authkit/#readme\",\n ].includes(homepage)\n );\n\n if (isOldWorkOSTemplate) {\n logWarning(\n \"The template this project is based on has been updated to work with this version of Convex.\",\n );\n logWarning(\n \"Please copy the convex.json from the latest template version or add an 'authKit' section.\",\n );\n logMessage(\"Learn more at https://docs.convex.dev/auth/authkit\");\n }\n}\n\nexport async function getAuthKitEnvironmentConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n deploymentType: \"dev\" | \"preview\" | \"prod\",\n): Promise<AuthKitEnvironmentConfig | undefined> {\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n return authKitConfig?.[deploymentType];\n}\n\n/** Error parsing ProjectConfig representation. */\nclass ParseError extends Error {}\n\n// WorkOS AuthKit configuration schemas\nconst AuthKitConfigureSchema = z.union([\n z.literal(false),\n z.object({\n redirectUris: z.array(z.string()).optional(),\n appHomepageUrl: z.string().optional(),\n corsOrigins: z.array(z.string()).optional(),\n }),\n]);\n\nconst AuthKitLocalEnvVarsSchema = z.union([\n z.literal(false),\n z.record(z.string()),\n]);\n\nconst AuthKitEnvironmentConfigSchema = z.object({\n environmentType: z.enum([\"development\", \"staging\", \"production\"]).optional(),\n configure: AuthKitConfigureSchema.optional(),\n localEnvVars: AuthKitLocalEnvVarsSchema.optional(),\n});\n\nconst AuthKitConfigSchema = z\n .object({\n dev: AuthKitEnvironmentConfigSchema.optional(),\n preview: AuthKitEnvironmentConfigSchema.optional(),\n prod: AuthKitEnvironmentConfigSchema.optional(),\n })\n .refine(\n (data) => {\n // Validation: environmentType only allowed in prod\n const devEnvType = data.dev?.environmentType;\n const previewEnvType = data.preview?.environmentType;\n if (devEnvType || previewEnvType) {\n return false;\n }\n return true;\n },\n {\n message: \"authKit.environmentType is only allowed in the prod section\",\n path: [\"environmentType\"],\n },\n )\n .refine(\n (data) => {\n // Validation: localEnvVars only allowed for dev\n // Check preview doesn't have localEnvVars\n if (\n data.preview?.localEnvVars !== undefined &&\n data.preview?.localEnvVars !== false\n ) {\n return false;\n }\n // Check prod doesn't have localEnvVars\n if (\n data.prod?.localEnvVars !== undefined &&\n data.prod?.localEnvVars !== false\n ) {\n return false;\n }\n return true;\n },\n {\n message:\n \"authKit.localEnvVars is only supported for dev deployments. Preview and prod deployments must configure environment variables directly in the deployment platform.\",\n path: [\"localEnvVars\"],\n },\n );\n// Separate Node and Codegen schemas so we can parse these loose or strict\nconst NodeSchema = z.object({\n externalPackages: z\n .array(z.string())\n .default([])\n .describe(\n \"list of npm packages to install at deploy time instead of bundling. Packages with binaries should be added here.\",\n ),\n nodeVersion: z\n .string()\n .optional()\n .describe(\"The Node.js version to use for Node.js functions\"),\n});\n\nconst CodegenSchema = z.object({\n staticApi: z\n .boolean()\n .default(false)\n .describe(\n \"Use Convex function argument validators and return value validators to generate a typed API object\",\n ),\n staticDataModel: z.boolean().default(false),\n // These optional fields have no defaults - their presence/absence is meaningful\n legacyComponentApi: z.boolean().optional(),\n fileType: z.enum([\"ts\", \"js/dts\"]).optional(),\n});\n\nconst BundlerSchema = z.object({\n includeSourcesContent: z\n .boolean()\n .default(false)\n .describe(\n \"Whether to include original source code in source maps. Set to false to reduce bundle size.\",\n ),\n});\n\nconst AiFilesSchema = z.object({\n disableStalenessMessage: z.boolean().default(false),\n});\n\nconst refineToObject = <T extends z.ZodTypeAny>(schema: T) =>\n schema.refine((val) => val !== null && !Array.isArray(val), {\n message: \"Expected `convex.json` to contain an object\",\n });\n\n// Factory function to create schema with strict or passthrough behavior\nconst createProjectConfigSchema = (strict: boolean) => {\n const nodeSchema = strict ? NodeSchema.strict() : NodeSchema.passthrough();\n const codegenSchema = strict\n ? CodegenSchema.strict()\n : CodegenSchema.passthrough();\n const bundlerSchema = strict\n ? BundlerSchema.strict()\n : BundlerSchema.passthrough();\n\n const baseObject = z.object({\n functions: z\n .string()\n .default(DEFAULT_FUNCTIONS_PATH)\n .describe(\"Relative file path to the convex directory\"),\n node: nodeSchema.default({ externalPackages: [] }),\n codegen: codegenSchema.default({\n staticApi: false,\n staticDataModel: false,\n }),\n bundler: bundlerSchema.default({ includeSourcesContent: false }).optional(),\n generateCommonJSApi: z.boolean().default(false),\n typescriptCompiler: z\n .enum([\"tsc\", \"tsgo\"])\n .optional()\n .describe(\n \"TypeScript compiler to use for typechecking (`@typescript/native-preview` must be installed to use `tsgo`)\",\n ),\n\n // Optional $schema field for JSON schema validation in editors\n $schema: z.string().optional(),\n // WorkOS AuthKit integration configuration\n authKit: AuthKitConfigSchema.optional(),\n aiFiles: AiFilesSchema.optional(),\n\n // Deprecated fields that have been deprecated for years, only here so we\n // know it's safe to delete them.\n project: z.string().optional(),\n team: z.string().optional(),\n prodUrl: z.string().optional(),\n });\n\n // Apply strict or passthrough BEFORE refine\n const withStrictness = strict\n ? baseObject.strict()\n : baseObject.passthrough();\n\n // Now apply the refinement\n return withStrictness.refine(\n (data) => {\n // Validate that generateCommonJSApi is not true when using TypeScript codegen\n if (data.generateCommonJSApi && data.codegen.fileType === \"ts\") {\n return false;\n }\n return true;\n },\n {\n message:\n 'Cannot use `generateCommonJSApi: true` with `codegen.fileType: \"ts\"`. ' +\n \"CommonJS modules require JavaScript generation. \" +\n 'Either set `codegen.fileType: \"js/dts\"` or remove `generateCommonJSApi`.',\n path: [\"generateCommonJSApi\"],\n },\n );\n};\n\n// Parse allowing extra fields (for forward compatibility)\nconst ProjectConfigSchema = refineToObject(createProjectConfigSchema(false));\n\n// Strict schema warn about extra keys\nconst ProjectConfigSchemaStrict = refineToObject(\n createProjectConfigSchema(true),\n);\n\nconst warnedUnknownKeys = new Set<string>();\nexport function resetUnknownKeyWarnings() {\n warnedUnknownKeys.clear();\n}\n\n/** Parse object to ProjectConfig. */\nexport async function parseProjectConfig(\n ctx: Context,\n obj: any,\n): Promise<ProjectConfig> {\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected `convex.json` to contain an object\",\n });\n }\n\n try {\n // Try strict parse first to detect unknown keys\n return ProjectConfigSchemaStrict.parse(obj);\n } catch (error) {\n if (error instanceof z.ZodError) {\n // Check if all issues are unrecognized_keys issues\n const unknownKeyIssues = error.issues.filter(\n (issue) => issue.code === \"unrecognized_keys\",\n );\n\n if (\n unknownKeyIssues.length > 0 &&\n unknownKeyIssues.length === error.issues.length\n ) {\n // All errors are just unknown keys - warn about them\n for (const issue of unknownKeyIssues) {\n if (issue.code === \"unrecognized_keys\") {\n const pathPrefix =\n issue.path.length > 0 ? issue.path.join(\".\") + \".\" : \"\";\n const unknownKeys = issue.keys as string[];\n const newUnknownKeys = unknownKeys.filter(\n (key) => !warnedUnknownKeys.has(pathPrefix + key),\n );\n\n if (newUnknownKeys.length > 0) {\n const fullPath =\n issue.path.length > 0\n ? `\\`${issue.path.join(\".\")}\\``\n : \"`convex.json`\";\n logMessage(\n chalkStderr.yellow(\n `Warning: Unknown ${newUnknownKeys.length === 1 ? \"property\" : \"properties\"} in ${fullPath}: ${newUnknownKeys.map((k) => `\\`${k}\\``).join(\", \")}`,\n ),\n );\n logMessage(\n chalkStderr.gray(\n \" These properties will be preserved but are not recognized by this version of Convex.\",\n ),\n );\n\n // Track that we've warned about these keys\n newUnknownKeys.forEach((key) =>\n warnedUnknownKeys.add(pathPrefix + key),\n );\n }\n }\n }\n // Re-parse with passthrough schema to preserve unknown keys\n return ProjectConfigSchema.parse(obj);\n }\n\n // Handle validation errors we won't ignore\n if (error instanceof z.ZodError) {\n const issue = error.issues[0];\n const pathStr = issue.path.join(\".\");\n const message = pathStr\n ? `\\`${pathStr}\\` in \\`convex.json\\`: ${issue.message}`\n : `\\`convex.json\\`: ${issue.message}`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: message,\n });\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: (error as any).toString(),\n });\n }\n}\n\n// Parse a deployment config returned by the backend, picking out\n// the fields we care about.\nfunction parseBackendConfig(obj: any): {\n functions: string;\n nodeVersion?: string;\n} {\n function throwParseError(message: string) {\n // Unexpected error\n // eslint-disable-next-line no-restricted-syntax\n throw new ParseError(message);\n }\n if (typeof obj !== \"object\") {\n throwParseError(\"Expected an object\");\n }\n const { functions, nodeVersion } = obj;\n if (typeof functions !== \"string\") {\n throwParseError(\"Expected functions to be a string\");\n }\n\n if (typeof nodeVersion !== \"undefined\" && typeof nodeVersion !== \"string\") {\n throwParseError(\"Expected nodeVersion to be a string\");\n }\n\n return {\n functions,\n ...((nodeVersion ?? null) !== null ? { nodeVersion: nodeVersion } : {}),\n };\n}\n\nexport function configName(): string {\n return \"convex.json\";\n}\n\nexport async function configFilepath(ctx: Context): Promise<string> {\n const configFn = configName();\n // We used to allow src/convex.json, but no longer (as of 10/7/2022).\n // Leave an error message around to help people out. We can remove this\n // error message after a couple months.\n const preferredLocation = configFn;\n const wrongLocation = path.join(\"src\", configFn);\n\n // Allow either location, but not both.\n const preferredLocationExists = ctx.fs.exists(preferredLocation);\n const wrongLocationExists = ctx.fs.exists(wrongLocation);\n if (preferredLocationExists && wrongLocationExists) {\n const message = `${chalkStderr.red(`Error: both ${preferredLocation} and ${wrongLocation} files exist!`)}\\nConsolidate these and remove ${wrongLocation}.`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: message,\n });\n }\n if (!preferredLocationExists && wrongLocationExists) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Error: Please move ${wrongLocation} to the root of your project`,\n });\n }\n\n return preferredLocation;\n}\n\nexport async function getFunctionsDirectoryPath(ctx: Context): Promise<string> {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n return functionsDir(configPath, projectConfig);\n}\n\n/** Read configuration from a local `convex.json` file. */\nexport async function readProjectConfig(ctx: Context): Promise<{\n projectConfig: ProjectConfig;\n configPath: string;\n}> {\n if (!ctx.fs.exists(\"convex.json\")) {\n // create-react-app bans imports from outside of src, so we can just\n // put the functions directory inside of src/ to work around this issue.\n const packages = await loadPackageJson(ctx);\n const isCreateReactApp = \"react-scripts\" in packages;\n return {\n projectConfig: {\n functions: isCreateReactApp\n ? `src/${DEFAULT_FUNCTIONS_PATH}`\n : DEFAULT_FUNCTIONS_PATH,\n node: {\n externalPackages: [],\n },\n generateCommonJSApi: false,\n codegen: {\n staticApi: false,\n staticDataModel: false,\n },\n aiFiles: {\n disableStalenessMessage: false,\n },\n },\n configPath: configName(),\n };\n }\n let projectConfig;\n const configPath = await configFilepath(ctx);\n try {\n projectConfig = await parseProjectConfig(\n ctx,\n JSON.parse(ctx.fs.readUtf8File(configPath)),\n );\n } catch (err) {\n if (err instanceof ParseError || err instanceof SyntaxError) {\n logError(chalkStderr.red(`Error: Parsing \"${configPath}\" failed`));\n logMessage(chalkStderr.gray(err.toString()));\n } else {\n logFailure(\n `Error: Unable to read project config file \"${configPath}\"\\n` +\n \" Are you running this command from the root directory of a Convex project? If so, run `npx convex dev` first.\",\n );\n if (err instanceof Error) {\n logError(chalkStderr.red(err.message));\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n // TODO -- move the logging above in here\n printedMessage: null,\n });\n }\n return {\n projectConfig,\n configPath,\n };\n}\n\n/**\n * Given a {@link ProjectConfig}, add in the bundled modules to produce the\n * complete config.\n */\nexport async function configFromProjectConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n configPath: string,\n verbose: boolean,\n): Promise<{\n config: Config;\n bundledModuleInfos: BundledModuleInfo[];\n}> {\n const baseDir = functionsDir(configPath, projectConfig);\n // We bundle Node.js and Convex JS runtime functions entry points separately\n // since they execute on different platforms.\n const entryPoints = await entryPointsByEnvironment(ctx, baseDir);\n // es-build prints errors to console which would clobber our spinner.\n if (verbose) {\n showSpinner(\"Bundling modules for Convex's runtime...\");\n }\n const convexResult = await bundle({\n ctx,\n dir: baseDir,\n entryPoints: entryPoints.isolate,\n generateSourceMaps: true,\n platform: \"browser\",\n });\n if (verbose) {\n logMessage(\n \"Convex's runtime modules: \",\n convexResult.modules.map((m) => m.path),\n );\n }\n\n // Bundle node modules.\n if (verbose && entryPoints.node.length !== 0) {\n showSpinner(\"Bundling modules for Node.js runtime...\");\n }\n const nodeResult = await bundle({\n ctx,\n dir: baseDir,\n entryPoints: entryPoints.node,\n generateSourceMaps: true,\n platform: \"node\",\n chunksFolder: path.join(\"_deps\", \"node\"),\n externalPackagesAllowList: projectConfig.node.externalPackages,\n });\n if (verbose && entryPoints.node.length !== 0) {\n logMessage(\n \"Node.js runtime modules: \",\n nodeResult.modules.map((m) => m.path),\n );\n if (projectConfig.node.externalPackages.length > 0) {\n logMessage(\n \"Node.js runtime external dependencies (to be installed on the server): \",\n [...nodeResult.externalDependencies.entries()].map(\n (a) => `${a[0]}: ${a[1]}`,\n ),\n );\n }\n }\n const modules = convexResult.modules;\n modules.push(...nodeResult.modules);\n modules.push(...(await bundleAuthConfig(ctx, baseDir)));\n\n const nodeDependencies: NodeDependency[] = [];\n for (const [moduleName, moduleVersion] of nodeResult.externalDependencies) {\n nodeDependencies.push({ name: moduleName, version: moduleVersion });\n }\n\n const bundledModuleInfos: BundledModuleInfo[] = Array.from(\n convexResult.bundledModuleNames.keys(),\n ).map((moduleName) => {\n return {\n name: moduleName,\n platform: \"convex\",\n };\n });\n bundledModuleInfos.push(\n ...Array.from(nodeResult.bundledModuleNames.keys()).map(\n (moduleName): BundledModuleInfo => {\n return {\n name: moduleName,\n platform: \"node\",\n };\n },\n ),\n );\n\n return {\n config: {\n projectConfig: projectConfig,\n modules: modules,\n nodeDependencies: nodeDependencies,\n // We're just using the version this CLI is running with for now.\n // This could be different than the version of `convex` the app runs with\n // if the CLI is installed globally.\n udfServerVersion: version,\n nodeVersion: projectConfig.node.nodeVersion,\n },\n bundledModuleInfos,\n };\n}\n\n/**\n * Bundle modules one by one for good bundler errors.\n */\nexport async function debugIsolateEndpointBundles(\n ctx: Context,\n projectConfig: ProjectConfig,\n configPath: string,\n): Promise<void> {\n const baseDir = functionsDir(configPath, projectConfig);\n const entryPoints = await entryPointsByEnvironment(ctx, baseDir);\n if (entryPoints.isolate.length === 0) {\n logFinishedStep(\"No non-'use node' modules found.\");\n }\n await debugIsolateBundlesSerially(ctx, {\n entryPoints: entryPoints.isolate,\n extraConditions: [],\n dir: baseDir,\n });\n}\n\n/**\n * Read the config from `convex.json` and bundle all the modules.\n */\nexport async function readConfig(\n ctx: Context,\n verbose: boolean,\n): Promise<{\n config: Config;\n configPath: string;\n bundledModuleInfos: BundledModuleInfo[];\n}> {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n const { config, bundledModuleInfos } = await configFromProjectConfig(\n ctx,\n projectConfig,\n configPath,\n verbose,\n );\n return { config, configPath, bundledModuleInfos };\n}\n\n/**\n * Ensure the functions directory exists.\n *\n * Note: This function no longer writes to or deletes `convex.json`. The config\n * file is now treated as user-owned and is not modified by the CLI. This allows\n * users to maintain their preferred formatting and any comments they may add\n * (if we later support JSONC parsing).\n */\nexport async function writeProjectConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n) {\n const configPath = await configFilepath(ctx);\n ctx.fs.mkdir(functionsDir(configPath, projectConfig), {\n allowExisting: true,\n });\n}\n\nexport function removedExistingConfig(\n ctx: Context,\n configPath: string,\n options: { allowExistingConfig?: boolean },\n) {\n if (!options.allowExistingConfig) {\n return false;\n }\n recursivelyDelete(ctx, configPath);\n logFinishedStep(`Removed existing ${configPath}`);\n return true;\n}\n\n/** Pull configuration for the root app component from the given remote origin. */\nexport async function pullConfig(\n ctx: Context,\n project: string | undefined,\n team: string | undefined,\n origin: string,\n adminKey: string,\n): Promise<ConfigWithModuleHashes> {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: origin,\n adminKey,\n });\n\n changeSpinner(\"Downloading current deployment state...\");\n try {\n const res = await fetch(\"/api/get_config_hashes\", {\n method: \"POST\",\n body: JSON.stringify({ version, adminKey }),\n });\n deprecationCheckWarning(ctx, res);\n const data = await res.json();\n const backendConfig = parseBackendConfig(data.config);\n const projectConfig = {\n ...backendConfig,\n node: {\n // This field is not stored in the backend, which is ok since it is also\n // not used to diff configs.\n externalPackages: [],\n nodeVersion: data.nodeVersion,\n },\n // This field is not stored in the backend, it only affects the client.\n generateCommonJSApi: false,\n // This field is also not stored in the backend, it only affects the client.\n codegen: {\n staticApi: false,\n staticDataModel: false,\n },\n project,\n team,\n prodUrl: origin,\n };\n return {\n projectConfig,\n moduleHashes: data.moduleHashes,\n // TODO(presley): Add this to diffConfig().\n nodeDependencies: data.nodeDependencies,\n udfServerVersion: data.udfServerVersion,\n };\n } catch (err: unknown) {\n logFailure(`Error: Unable to pull deployment config from ${origin}`);\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\ninterface BundledModuleInfo {\n name: string;\n platform: \"node\" | \"convex\";\n}\n\n/**\n * A component definition spec contains enough information to create bundles\n * of code that must be analyzed in order to construct a ComponentDefinition.\n *\n * Most paths are relative to the directory of the definitionPath.\n */\nexport type ComponentDefinitionSpec = {\n /** This path is relative to the app (root component) directory. */\n definitionPath: ComponentDefinitionPath;\n\n /** Dependencies are paths to the directory of the dependency component definition from the app (root component) directory */\n dependencies: ComponentDefinitionPath[];\n\n // All other paths are relative to the directory of the definitionPath above.\n definition: Bundle;\n schema: Bundle;\n functions: Bundle[];\n};\n\nexport type AppDefinitionSpec = Omit<\n ComponentDefinitionSpec,\n \"definitionPath\"\n> & {\n // Only app (root) component specs contain an auth bundle.\n auth: Bundle | null;\n};\n\nexport type ComponentDefinitionSpecWithoutImpls = Omit<\n ComponentDefinitionSpec,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionSpecWithoutImpls = Omit<\n AppDefinitionSpec,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\n/** Generate a human-readable diff between the two configs. */\nexport function diffConfig(\n oldConfig: ConfigWithModuleHashes,\n newConfig: Config,\n): { diffString: string } {\n let diff = \"\";\n\n let versionMessage = \"\";\n const matches = oldConfig.udfServerVersion === newConfig.udfServerVersion;\n if (oldConfig.udfServerVersion && (!newConfig.udfServerVersion || !matches)) {\n versionMessage += `[-] ${oldConfig.udfServerVersion}\\n`;\n }\n if (newConfig.udfServerVersion && (!oldConfig.udfServerVersion || !matches)) {\n versionMessage += `[+] ${newConfig.udfServerVersion}\\n`;\n }\n if (versionMessage) {\n diff += \"Change the server's function version:\\n\";\n diff += versionMessage;\n }\n\n if (oldConfig.projectConfig.node.nodeVersion !== newConfig.nodeVersion) {\n diff += \"Change the server's version for Node.js actions:\\n\";\n if (oldConfig.projectConfig.node.nodeVersion) {\n diff += `[-] ${oldConfig.projectConfig.node.nodeVersion}\\n`;\n }\n if (newConfig.nodeVersion) {\n diff += `[+] ${newConfig.nodeVersion}\\n`;\n }\n }\n\n return { diffString: diff };\n}\n\n/** Handle an error from\n * legacy push path:\n * - /api/push_config\n * modern push paths:\n * - /api/deploy2/evaluate_push\n * - /api/deploy2/start_push\n * - /api/deploy2/finish_push\n *\n * finish_push errors are different from start_push errors and in theory could\n * be handled differently, but starting over works for all of them.\n */\nexport async function handlePushConfigError(\n ctx: Context,\n error: unknown,\n defaultMessage: string,\n deploymentName: string | null,\n deployment:\n | {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice: string;\n }\n | undefined,\n _deploymentType: DeploymentType | undefined,\n): Promise<never> {\n const data: ErrorData | undefined =\n error instanceof ThrowingFetchError ? error.serverErrorData : undefined;\n if (data?.code === \"AuthConfigMissingEnvironmentVariable\") {\n const errorMessage = data.message || \"(no error message given)\";\n const [, variableName] =\n errorMessage.match(/Environment variable (\\S+)/i) ?? [];\n\n // DEPRECATED: This error path provisioning is being phased out in favor of\n // pre-flight provisioning that happens before the client bundle build.\n // We keep minimal logic here for backwards compatibility with older templates\n // that may still rely on this path.\n if (variableName === \"WORKOS_CLIENT_ID\" && deploymentName && deployment) {\n // For backwards compatibility with templates that haven't been updated,\n // we'll still show a helpful error message directing users to configure WorkOS.\n // But we no longer do automatic provisioning here since it happens too late\n // (after the client bundle has already been built with missing env vars).\n logWarning(\n \"WORKOS_CLIENT_ID is not set; you can set it manually on the deployment or for hosted Convex deployments, use auto-provisioning.\",\n );\n logMessage(\n \"Learn more at https://docs.convex.dev/auth/authkit/auto-provision\",\n );\n logMessage(\"\");\n }\n\n const envVarMessage =\n `Environment variable ${chalkStderr.bold(\n variableName,\n )} is used in auth config file but ` + `its value was not set.`;\n let setEnvVarInstructions =\n \"Go set it in the dashboard or using `npx convex env set`\";\n\n // If `npx convex dev` is running using --url there might not be a configured deployment\n if (deploymentName !== null) {\n const variableQuery =\n variableName !== undefined ? `?var=${variableName}` : \"\";\n const dashboardUrl = deploymentDashboardUrlPage(\n deploymentName,\n `/settings/environment-variables${variableQuery}`,\n );\n setEnvVarInstructions = `Go to:\\n\\n ${chalkStderr.bold(\n dashboardUrl,\n )}\\n\\n to set it up. `;\n }\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n errForSentry: error,\n printedMessage: envVarMessage + \"\\n\" + setEnvVarInstructions,\n });\n }\n\n if (data?.code === \"RaceDetected\") {\n // Environment variables or schema changed during push. This is a transient\n // error that should be retried immediately with exponential backoff.\n const message =\n data.message || \"Schema or environment variables changed during push\";\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: chalkStderr.yellow(message),\n });\n }\n\n if (data?.code === \"InternalServerError\") {\n if (deploymentName?.startsWith(\"local-\")) {\n printLocalDeploymentOnError();\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new LocalDeploymentError(\n \"InternalServerError while pushing to local deployment\",\n ),\n printedMessage: defaultMessage,\n });\n }\n }\n\n logFailure(defaultMessage);\n return await logAndHandleFetchError(ctx, error);\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport path from \"path\";\nimport { z } from \"zod\";\nimport { Context } from \"../../bundler/context.js\";\nimport { TypescriptCompiler } from \"./typecheck.js\";\nimport {\n changeSpinner,\n logError,\n logFailure,\n logFinishedStep,\n logMessage,\n logWarning,\n showSpinner,\n} from \"../../bundler/log.js\";\nimport {\n Bundle,\n BundleHash,\n bundle,\n bundleAuthConfig,\n entryPointsByEnvironment,\n} from \"../../bundler/index.js\";\nimport { version } from \"../version.js\";\nimport { deploymentDashboardUrlPage } from \"./dashboard.js\";\nimport {\n functionsDir,\n ErrorData,\n loadPackageJson,\n deploymentFetch,\n deprecationCheckWarning,\n logAndHandleFetchError,\n ThrowingFetchError,\n currentPackageHomepage,\n} from \"./utils/utils.js\";\nimport { recursivelyDelete } from \"./fsUtils.js\";\nimport { NodeDependency } from \"./deployApi/modules.js\";\nimport { ComponentDefinitionPath } from \"./components/definition/directoryStructure.js\";\nimport {\n LocalDeploymentError,\n printLocalDeploymentOnError,\n} from \"./localDeployment/errors.js\";\nimport { debugIsolateBundlesSerially } from \"../../bundler/debugBundle.js\";\nimport { DeploymentType } from \"./api.js\";\nexport { productionProvisionHost, provisionHost } from \"./utils/utils.js\";\n\n/** Type representing WorkOS AuthKit integration configuration. */\nexport interface AuthKitConfigureSettings {\n redirectUris?: string[];\n appHomepageUrl?: string;\n corsOrigins?: string[];\n}\n\nexport interface AuthKitEnvironmentConfig {\n environmentType?: \"development\" | \"staging\" | \"production\";\n configure?: false | AuthKitConfigureSettings;\n localEnvVars?: false | Record<string, string>;\n}\n\nexport interface AuthKitConfig {\n dev?: AuthKitEnvironmentConfig;\n preview?: AuthKitEnvironmentConfig;\n prod?: AuthKitEnvironmentConfig;\n}\n/**\n * convex.json file parsing notes\n *\n * - Unknown fields at the top level and in node and codegen are preserved\n * so that older CLI versions can deploy new projects (this functionality\n * will be removed in the future).\n * - convex.json does not allow comments, but this could change in the future.\n * Previously it contained automatically set values like productionUrl\n * but it's more like a config file now.\n */\n\n/** Type representing Convex project configuration. */\nexport interface ProjectConfig {\n // \u26A0\uFE0F When updating this, please also update the file used by IDEs for autocompletion and validation:\n // -> npm-packages/convex/schemas/convex.schema.json\n\n functions: string;\n node: {\n externalPackages: string[];\n // nodeVersion has no default value, its presence/absence is meaningful\n nodeVersion?: string | undefined;\n };\n generateCommonJSApi: boolean;\n\n codegen: {\n staticApi: boolean;\n staticDataModel: boolean;\n legacyComponentApi?: boolean;\n fileType?: \"ts\" | \"js/dts\";\n };\n\n bundler?: {\n includeSourcesContent?: boolean;\n };\n\n typescriptCompiler?: TypescriptCompiler;\n\n // WorkOS AuthKit integration configuration\n authKit?: AuthKitConfig | undefined;\n\n // Convex AI files user preferences.\n aiFiles?: {\n // When false, disables all AI files prompts and staleness messages.\n enabled?: boolean;\n // @deprecated use `enabled` instead.\n disableStalenessMessage?: boolean;\n };\n}\n\nexport interface Config {\n projectConfig: ProjectConfig;\n modules: Bundle[];\n nodeDependencies: NodeDependency[];\n schemaId?: string;\n udfServerVersion?: string;\n nodeVersion?: string | undefined;\n}\n\nexport interface ConfigWithModuleHashes {\n projectConfig: ProjectConfig;\n moduleHashes: BundleHash[];\n nodeDependencies: NodeDependency[];\n schemaId?: string;\n udfServerVersion?: string;\n}\n\nconst DEFAULT_FUNCTIONS_PATH = \"convex/\";\n\n/** Whether .ts file extensions should be used for generated code (default is false). */\nexport function usesTypeScriptCodegen(projectConfig: ProjectConfig): boolean {\n return projectConfig.codegen.fileType === \"ts\";\n}\n\n/** Whether the new component API import style should be used (default is false) */\nexport function usesComponentApiImports(projectConfig: ProjectConfig): boolean {\n return projectConfig.codegen.legacyComponentApi === false;\n}\n\n/**\n * Get the authKit configuration from convex.json.\n */\nexport async function getAuthKitConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n): Promise<AuthKitConfig | undefined> {\n // If there's an explicit authKit config, use it\n if (\"authKit\" in projectConfig) {\n return projectConfig.authKit;\n }\n\n // TODO remove this after a few versions\n // Migration help: is this one of the hardcoded templates that has special\n // behavior without a convex.json? Encourage them to upgrade the template.\n const homepage = await currentPackageHomepage(ctx);\n const isOldWorkOSTemplate = !!(\n homepage &&\n [\n \"https://github.com/workos/template-convex-nextjs-authkit/#readme\",\n \"https://github.com/workos/template-convex-react-vite-authkit/#readme\",\n \"https://github.com:workos/template-convex-react-vite-authkit/#readme\",\n \"https://github.com/workos/template-convex-tanstack-start-authkit/#readme\",\n ].includes(homepage)\n );\n\n if (isOldWorkOSTemplate) {\n logWarning(\n \"The template this project is based on has been updated to work with this version of Convex.\",\n );\n logWarning(\n \"Please copy the convex.json from the latest template version or add an 'authKit' section.\",\n );\n logMessage(\"Learn more at https://docs.convex.dev/auth/authkit\");\n }\n}\n\nexport async function getAuthKitEnvironmentConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n deploymentType: \"dev\" | \"preview\" | \"prod\",\n): Promise<AuthKitEnvironmentConfig | undefined> {\n const authKitConfig = await getAuthKitConfig(ctx, projectConfig);\n return authKitConfig?.[deploymentType];\n}\n\n/** Error parsing ProjectConfig representation. */\nclass ParseError extends Error {}\n\n// WorkOS AuthKit configuration schemas\nconst AuthKitConfigureSchema = z.union([\n z.literal(false),\n z.object({\n redirectUris: z.array(z.string()).optional(),\n appHomepageUrl: z.string().optional(),\n corsOrigins: z.array(z.string()).optional(),\n }),\n]);\n\nconst AuthKitLocalEnvVarsSchema = z.union([\n z.literal(false),\n z.record(z.string()),\n]);\n\nconst AuthKitEnvironmentConfigSchema = z.object({\n environmentType: z.enum([\"development\", \"staging\", \"production\"]).optional(),\n configure: AuthKitConfigureSchema.optional(),\n localEnvVars: AuthKitLocalEnvVarsSchema.optional(),\n});\n\nconst AuthKitConfigSchema = z\n .object({\n dev: AuthKitEnvironmentConfigSchema.optional(),\n preview: AuthKitEnvironmentConfigSchema.optional(),\n prod: AuthKitEnvironmentConfigSchema.optional(),\n })\n .refine(\n (data) => {\n // Validation: environmentType only allowed in prod\n const devEnvType = data.dev?.environmentType;\n const previewEnvType = data.preview?.environmentType;\n if (devEnvType || previewEnvType) {\n return false;\n }\n return true;\n },\n {\n message: \"authKit.environmentType is only allowed in the prod section\",\n path: [\"environmentType\"],\n },\n )\n .refine(\n (data) => {\n // Validation: localEnvVars only allowed for dev\n // Check preview doesn't have localEnvVars\n if (\n data.preview?.localEnvVars !== undefined &&\n data.preview?.localEnvVars !== false\n ) {\n return false;\n }\n // Check prod doesn't have localEnvVars\n if (\n data.prod?.localEnvVars !== undefined &&\n data.prod?.localEnvVars !== false\n ) {\n return false;\n }\n return true;\n },\n {\n message:\n \"authKit.localEnvVars is only supported for dev deployments. Preview and prod deployments must configure environment variables directly in the deployment platform.\",\n path: [\"localEnvVars\"],\n },\n );\n// Separate Node and Codegen schemas so we can parse these loose or strict\nconst NodeSchema = z.object({\n externalPackages: z\n .array(z.string())\n .default([])\n .describe(\n \"list of npm packages to install at deploy time instead of bundling. Packages with binaries should be added here.\",\n ),\n nodeVersion: z\n .string()\n .optional()\n .describe(\"The Node.js version to use for Node.js functions\"),\n});\n\nconst CodegenSchema = z.object({\n staticApi: z\n .boolean()\n .default(false)\n .describe(\n \"Use Convex function argument validators and return value validators to generate a typed API object\",\n ),\n staticDataModel: z.boolean().default(false),\n // These optional fields have no defaults - their presence/absence is meaningful\n legacyComponentApi: z.boolean().optional(),\n fileType: z.enum([\"ts\", \"js/dts\"]).optional(),\n});\n\nconst BundlerSchema = z.object({\n includeSourcesContent: z\n .boolean()\n .default(false)\n .describe(\n \"Whether to include original source code in source maps. Set to false to reduce bundle size.\",\n ),\n});\n\nconst AiFilesSchema = z.object({\n enabled: z.boolean().optional(),\n disableStalenessMessage: z.boolean().optional(),\n});\n\nconst refineToObject = <T extends z.ZodTypeAny>(schema: T) =>\n schema.refine((val) => val !== null && !Array.isArray(val), {\n message: \"Expected `convex.json` to contain an object\",\n });\n\n// Factory function to create schema with strict or passthrough behavior\nconst createProjectConfigSchema = (strict: boolean) => {\n const nodeSchema = strict ? NodeSchema.strict() : NodeSchema.passthrough();\n const codegenSchema = strict\n ? CodegenSchema.strict()\n : CodegenSchema.passthrough();\n const bundlerSchema = strict\n ? BundlerSchema.strict()\n : BundlerSchema.passthrough();\n\n const baseObject = z.object({\n functions: z\n .string()\n .default(DEFAULT_FUNCTIONS_PATH)\n .describe(\"Relative file path to the convex directory\"),\n node: nodeSchema.default({ externalPackages: [] }),\n codegen: codegenSchema.default({\n staticApi: false,\n staticDataModel: false,\n }),\n bundler: bundlerSchema.default({ includeSourcesContent: false }).optional(),\n generateCommonJSApi: z.boolean().default(false),\n typescriptCompiler: z\n .enum([\"tsc\", \"tsgo\"])\n .optional()\n .describe(\n \"TypeScript compiler to use for typechecking (`@typescript/native-preview` must be installed to use `tsgo`)\",\n ),\n\n // Optional $schema field for JSON schema validation in editors\n $schema: z.string().optional(),\n // WorkOS AuthKit integration configuration\n authKit: AuthKitConfigSchema.optional(),\n aiFiles: AiFilesSchema.optional(),\n\n // Deprecated fields that have been deprecated for years, only here so we\n // know it's safe to delete them.\n project: z.string().optional(),\n team: z.string().optional(),\n prodUrl: z.string().optional(),\n });\n\n // Apply strict or passthrough BEFORE refine\n const withStrictness = strict\n ? baseObject.strict()\n : baseObject.passthrough();\n\n // Now apply the refinement\n return withStrictness.refine(\n (data) => {\n // Validate that generateCommonJSApi is not true when using TypeScript codegen\n if (data.generateCommonJSApi && data.codegen.fileType === \"ts\") {\n return false;\n }\n return true;\n },\n {\n message:\n 'Cannot use `generateCommonJSApi: true` with `codegen.fileType: \"ts\"`. ' +\n \"CommonJS modules require JavaScript generation. \" +\n 'Either set `codegen.fileType: \"js/dts\"` or remove `generateCommonJSApi`.',\n path: [\"generateCommonJSApi\"],\n },\n );\n};\n\n// Parse allowing extra fields (for forward compatibility)\nconst ProjectConfigSchema = refineToObject(createProjectConfigSchema(false));\n\n// Strict schema warn about extra keys\nconst ProjectConfigSchemaStrict = refineToObject(\n createProjectConfigSchema(true),\n);\n\nconst warnedUnknownKeys = new Set<string>();\nexport function resetUnknownKeyWarnings() {\n warnedUnknownKeys.clear();\n}\n\n/** Parse object to ProjectConfig. */\nexport async function parseProjectConfig(\n ctx: Context,\n obj: any,\n): Promise<ProjectConfig> {\n if (typeof obj !== \"object\" || obj === null || Array.isArray(obj)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected `convex.json` to contain an object\",\n });\n }\n\n try {\n // Try strict parse first to detect unknown keys\n return ProjectConfigSchemaStrict.parse(obj);\n } catch (error) {\n if (error instanceof z.ZodError) {\n // Check if all issues are unrecognized_keys issues\n const unknownKeyIssues = error.issues.filter(\n (issue) => issue.code === \"unrecognized_keys\",\n );\n\n if (\n unknownKeyIssues.length > 0 &&\n unknownKeyIssues.length === error.issues.length\n ) {\n // All errors are just unknown keys - warn about them\n for (const issue of unknownKeyIssues) {\n if (issue.code === \"unrecognized_keys\") {\n const pathPrefix =\n issue.path.length > 0 ? issue.path.join(\".\") + \".\" : \"\";\n const unknownKeys = issue.keys as string[];\n const newUnknownKeys = unknownKeys.filter(\n (key) => !warnedUnknownKeys.has(pathPrefix + key),\n );\n\n if (newUnknownKeys.length > 0) {\n const fullPath =\n issue.path.length > 0\n ? `\\`${issue.path.join(\".\")}\\``\n : \"`convex.json`\";\n logMessage(\n chalkStderr.yellow(\n `Warning: Unknown ${newUnknownKeys.length === 1 ? \"property\" : \"properties\"} in ${fullPath}: ${newUnknownKeys.map((k) => `\\`${k}\\``).join(\", \")}`,\n ),\n );\n logMessage(\n chalkStderr.gray(\n \" These properties will be preserved but are not recognized by this version of Convex.\",\n ),\n );\n\n // Track that we've warned about these keys\n newUnknownKeys.forEach((key) =>\n warnedUnknownKeys.add(pathPrefix + key),\n );\n }\n }\n }\n // Re-parse with passthrough schema to preserve unknown keys\n return ProjectConfigSchema.parse(obj);\n }\n\n // Handle validation errors we won't ignore\n if (error instanceof z.ZodError) {\n const issue = error.issues[0];\n const pathStr = issue.path.join(\".\");\n const message = pathStr\n ? `\\`${pathStr}\\` in \\`convex.json\\`: ${issue.message}`\n : `\\`convex.json\\`: ${issue.message}`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: message,\n });\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: (error as any).toString(),\n });\n }\n}\n\n// Parse a deployment config returned by the backend, picking out\n// the fields we care about.\nfunction parseBackendConfig(obj: any): {\n functions: string;\n nodeVersion?: string;\n} {\n function throwParseError(message: string) {\n // Unexpected error\n // eslint-disable-next-line no-restricted-syntax\n throw new ParseError(message);\n }\n if (typeof obj !== \"object\") {\n throwParseError(\"Expected an object\");\n }\n const { functions, nodeVersion } = obj;\n if (typeof functions !== \"string\") {\n throwParseError(\"Expected functions to be a string\");\n }\n\n if (typeof nodeVersion !== \"undefined\" && typeof nodeVersion !== \"string\") {\n throwParseError(\"Expected nodeVersion to be a string\");\n }\n\n return {\n functions,\n ...((nodeVersion ?? null) !== null ? { nodeVersion: nodeVersion } : {}),\n };\n}\n\nexport function configName(): string {\n return \"convex.json\";\n}\n\nexport async function configFilepath(ctx: Context): Promise<string> {\n const configFn = configName();\n // We used to allow src/convex.json, but no longer (as of 10/7/2022).\n // Leave an error message around to help people out. We can remove this\n // error message after a couple months.\n const preferredLocation = configFn;\n const wrongLocation = path.join(\"src\", configFn);\n\n // Allow either location, but not both.\n const preferredLocationExists = ctx.fs.exists(preferredLocation);\n const wrongLocationExists = ctx.fs.exists(wrongLocation);\n if (preferredLocationExists && wrongLocationExists) {\n const message = `${chalkStderr.red(`Error: both ${preferredLocation} and ${wrongLocation} files exist!`)}\\nConsolidate these and remove ${wrongLocation}.`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: message,\n });\n }\n if (!preferredLocationExists && wrongLocationExists) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Error: Please move ${wrongLocation} to the root of your project`,\n });\n }\n\n return preferredLocation;\n}\n\nexport async function getFunctionsDirectoryPath(ctx: Context): Promise<string> {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n return functionsDir(configPath, projectConfig);\n}\n\n/** Read configuration from a local `convex.json` file. */\nexport async function readProjectConfig(ctx: Context): Promise<{\n projectConfig: ProjectConfig;\n configPath: string;\n}> {\n if (!ctx.fs.exists(\"convex.json\")) {\n // create-react-app bans imports from outside of src, so we can just\n // put the functions directory inside of src/ to work around this issue.\n const packages = await loadPackageJson(ctx);\n const isCreateReactApp = \"react-scripts\" in packages;\n return {\n projectConfig: {\n functions: isCreateReactApp\n ? `src/${DEFAULT_FUNCTIONS_PATH}`\n : DEFAULT_FUNCTIONS_PATH,\n node: {\n externalPackages: [],\n },\n generateCommonJSApi: false,\n codegen: {\n staticApi: false,\n staticDataModel: false,\n },\n aiFiles: {},\n },\n configPath: configName(),\n };\n }\n let projectConfig;\n const configPath = await configFilepath(ctx);\n try {\n projectConfig = await parseProjectConfig(\n ctx,\n JSON.parse(ctx.fs.readUtf8File(configPath)),\n );\n } catch (err) {\n if (err instanceof ParseError || err instanceof SyntaxError) {\n logError(chalkStderr.red(`Error: Parsing \"${configPath}\" failed`));\n logMessage(chalkStderr.gray(err.toString()));\n } else {\n logFailure(\n `Error: Unable to read project config file \"${configPath}\"\\n` +\n \" Are you running this command from the root directory of a Convex project? If so, run `npx convex dev` first.\",\n );\n if (err instanceof Error) {\n logError(chalkStderr.red(err.message));\n }\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n // TODO -- move the logging above in here\n printedMessage: null,\n });\n }\n return {\n projectConfig,\n configPath,\n };\n}\n\n/**\n * Given a {@link ProjectConfig}, add in the bundled modules to produce the\n * complete config.\n */\nexport async function configFromProjectConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n configPath: string,\n verbose: boolean,\n): Promise<{\n config: Config;\n bundledModuleInfos: BundledModuleInfo[];\n}> {\n const baseDir = functionsDir(configPath, projectConfig);\n // We bundle Node.js and Convex JS runtime functions entry points separately\n // since they execute on different platforms.\n const entryPoints = await entryPointsByEnvironment(ctx, baseDir);\n // es-build prints errors to console which would clobber our spinner.\n if (verbose) {\n showSpinner(\"Bundling modules for Convex's runtime...\");\n }\n const convexResult = await bundle({\n ctx,\n dir: baseDir,\n entryPoints: entryPoints.isolate,\n generateSourceMaps: true,\n platform: \"browser\",\n });\n if (verbose) {\n logMessage(\n \"Convex's runtime modules: \",\n convexResult.modules.map((m) => m.path),\n );\n }\n\n // Bundle node modules.\n if (verbose && entryPoints.node.length !== 0) {\n showSpinner(\"Bundling modules for Node.js runtime...\");\n }\n const nodeResult = await bundle({\n ctx,\n dir: baseDir,\n entryPoints: entryPoints.node,\n generateSourceMaps: true,\n platform: \"node\",\n chunksFolder: path.join(\"_deps\", \"node\"),\n externalPackagesAllowList: projectConfig.node.externalPackages,\n });\n if (verbose && entryPoints.node.length !== 0) {\n logMessage(\n \"Node.js runtime modules: \",\n nodeResult.modules.map((m) => m.path),\n );\n if (projectConfig.node.externalPackages.length > 0) {\n logMessage(\n \"Node.js runtime external dependencies (to be installed on the server): \",\n [...nodeResult.externalDependencies.entries()].map(\n (a) => `${a[0]}: ${a[1]}`,\n ),\n );\n }\n }\n const modules = convexResult.modules;\n modules.push(...nodeResult.modules);\n modules.push(...(await bundleAuthConfig(ctx, baseDir)));\n\n const nodeDependencies: NodeDependency[] = [];\n for (const [moduleName, moduleVersion] of nodeResult.externalDependencies) {\n nodeDependencies.push({ name: moduleName, version: moduleVersion });\n }\n\n const bundledModuleInfos: BundledModuleInfo[] = Array.from(\n convexResult.bundledModuleNames.keys(),\n ).map((moduleName) => {\n return {\n name: moduleName,\n platform: \"convex\",\n };\n });\n bundledModuleInfos.push(\n ...Array.from(nodeResult.bundledModuleNames.keys()).map(\n (moduleName): BundledModuleInfo => {\n return {\n name: moduleName,\n platform: \"node\",\n };\n },\n ),\n );\n\n return {\n config: {\n projectConfig: projectConfig,\n modules: modules,\n nodeDependencies: nodeDependencies,\n // We're just using the version this CLI is running with for now.\n // This could be different than the version of `convex` the app runs with\n // if the CLI is installed globally.\n udfServerVersion: version,\n nodeVersion: projectConfig.node.nodeVersion,\n },\n bundledModuleInfos,\n };\n}\n\n/**\n * Bundle modules one by one for good bundler errors.\n */\nexport async function debugIsolateEndpointBundles(\n ctx: Context,\n projectConfig: ProjectConfig,\n configPath: string,\n): Promise<void> {\n const baseDir = functionsDir(configPath, projectConfig);\n const entryPoints = await entryPointsByEnvironment(ctx, baseDir);\n if (entryPoints.isolate.length === 0) {\n logFinishedStep(\"No non-'use node' modules found.\");\n }\n await debugIsolateBundlesSerially(ctx, {\n entryPoints: entryPoints.isolate,\n extraConditions: [],\n dir: baseDir,\n });\n}\n\n/**\n * Read the config from `convex.json` and bundle all the modules.\n */\nexport async function readConfig(\n ctx: Context,\n verbose: boolean,\n): Promise<{\n config: Config;\n configPath: string;\n bundledModuleInfos: BundledModuleInfo[];\n}> {\n const { projectConfig, configPath } = await readProjectConfig(ctx);\n const { config, bundledModuleInfos } = await configFromProjectConfig(\n ctx,\n projectConfig,\n configPath,\n verbose,\n );\n return { config, configPath, bundledModuleInfos };\n}\n\n/**\n * Ensure the functions directory exists.\n *\n * Note: This function no longer writes to or deletes `convex.json`. The config\n * file is now treated as user-owned and is not modified by the CLI. This allows\n * users to maintain their preferred formatting and any comments they may add\n * (if we later support JSONC parsing).\n */\nexport async function writeProjectConfig(\n ctx: Context,\n projectConfig: ProjectConfig,\n) {\n const configPath = await configFilepath(ctx);\n ctx.fs.mkdir(functionsDir(configPath, projectConfig), {\n allowExisting: true,\n });\n}\n\nexport function removedExistingConfig(\n ctx: Context,\n configPath: string,\n options: { allowExistingConfig?: boolean },\n) {\n if (!options.allowExistingConfig) {\n return false;\n }\n recursivelyDelete(ctx, configPath);\n logFinishedStep(`Removed existing ${configPath}`);\n return true;\n}\n\n/** Pull configuration for the root app component from the given remote origin. */\nexport async function pullConfig(\n ctx: Context,\n project: string | undefined,\n team: string | undefined,\n origin: string,\n adminKey: string,\n): Promise<ConfigWithModuleHashes> {\n const fetch = deploymentFetch(ctx, {\n deploymentUrl: origin,\n adminKey,\n });\n\n changeSpinner(\"Downloading current deployment state...\");\n try {\n const res = await fetch(\"/api/get_config_hashes\", {\n method: \"POST\",\n body: JSON.stringify({ version, adminKey }),\n });\n deprecationCheckWarning(ctx, res);\n const data = await res.json();\n const backendConfig = parseBackendConfig(data.config);\n const projectConfig = {\n ...backendConfig,\n node: {\n // This field is not stored in the backend, which is ok since it is also\n // not used to diff configs.\n externalPackages: [],\n nodeVersion: data.nodeVersion,\n },\n // This field is not stored in the backend, it only affects the client.\n generateCommonJSApi: false,\n // This field is also not stored in the backend, it only affects the client.\n codegen: {\n staticApi: false,\n staticDataModel: false,\n },\n project,\n team,\n prodUrl: origin,\n };\n return {\n projectConfig,\n moduleHashes: data.moduleHashes,\n // TODO(presley): Add this to diffConfig().\n nodeDependencies: data.nodeDependencies,\n udfServerVersion: data.udfServerVersion,\n };\n } catch (err: unknown) {\n logFailure(`Error: Unable to pull deployment config from ${origin}`);\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\ninterface BundledModuleInfo {\n name: string;\n platform: \"node\" | \"convex\";\n}\n\n/**\n * A component definition spec contains enough information to create bundles\n * of code that must be analyzed in order to construct a ComponentDefinition.\n *\n * Most paths are relative to the directory of the definitionPath.\n */\nexport type ComponentDefinitionSpec = {\n /** This path is relative to the app (root component) directory. */\n definitionPath: ComponentDefinitionPath;\n\n /** Dependencies are paths to the directory of the dependency component definition from the app (root component) directory */\n dependencies: ComponentDefinitionPath[];\n\n // All other paths are relative to the directory of the definitionPath above.\n definition: Bundle;\n schema: Bundle;\n functions: Bundle[];\n};\n\nexport type AppDefinitionSpec = Omit<\n ComponentDefinitionSpec,\n \"definitionPath\"\n> & {\n // Only app (root) component specs contain an auth bundle.\n auth: Bundle | null;\n};\n\nexport type ComponentDefinitionSpecWithoutImpls = Omit<\n ComponentDefinitionSpec,\n \"schema\" | \"functions\"\n>;\nexport type AppDefinitionSpecWithoutImpls = Omit<\n AppDefinitionSpec,\n \"schema\" | \"functions\" | \"auth\"\n>;\n\n/** Generate a human-readable diff between the two configs. */\nexport function diffConfig(\n oldConfig: ConfigWithModuleHashes,\n newConfig: Config,\n): { diffString: string } {\n let diff = \"\";\n\n let versionMessage = \"\";\n const matches = oldConfig.udfServerVersion === newConfig.udfServerVersion;\n if (oldConfig.udfServerVersion && (!newConfig.udfServerVersion || !matches)) {\n versionMessage += `[-] ${oldConfig.udfServerVersion}\\n`;\n }\n if (newConfig.udfServerVersion && (!oldConfig.udfServerVersion || !matches)) {\n versionMessage += `[+] ${newConfig.udfServerVersion}\\n`;\n }\n if (versionMessage) {\n diff += \"Change the server's function version:\\n\";\n diff += versionMessage;\n }\n\n if (oldConfig.projectConfig.node.nodeVersion !== newConfig.nodeVersion) {\n diff += \"Change the server's version for Node.js actions:\\n\";\n if (oldConfig.projectConfig.node.nodeVersion) {\n diff += `[-] ${oldConfig.projectConfig.node.nodeVersion}\\n`;\n }\n if (newConfig.nodeVersion) {\n diff += `[+] ${newConfig.nodeVersion}\\n`;\n }\n }\n\n return { diffString: diff };\n}\n\n/** Handle an error from\n * legacy push path:\n * - /api/push_config\n * modern push paths:\n * - /api/deploy2/evaluate_push\n * - /api/deploy2/start_push\n * - /api/deploy2/finish_push\n *\n * finish_push errors are different from start_push errors and in theory could\n * be handled differently, but starting over works for all of them.\n */\nexport async function handlePushConfigError(\n ctx: Context,\n error: unknown,\n defaultMessage: string,\n deploymentName: string | null,\n deployment:\n | {\n deploymentUrl: string;\n adminKey: string;\n deploymentNotice: string;\n }\n | undefined,\n _deploymentType: DeploymentType | undefined,\n): Promise<never> {\n const data: ErrorData | undefined =\n error instanceof ThrowingFetchError ? error.serverErrorData : undefined;\n if (data?.code === \"AuthConfigMissingEnvironmentVariable\") {\n const errorMessage = data.message || \"(no error message given)\";\n const [, variableName] =\n errorMessage.match(/Environment variable (\\S+)/i) ?? [];\n\n // DEPRECATED: This error path provisioning is being phased out in favor of\n // pre-flight provisioning that happens before the client bundle build.\n // We keep minimal logic here for backwards compatibility with older templates\n // that may still rely on this path.\n if (variableName === \"WORKOS_CLIENT_ID\" && deploymentName && deployment) {\n // For backwards compatibility with templates that haven't been updated,\n // we'll still show a helpful error message directing users to configure WorkOS.\n // But we no longer do automatic provisioning here since it happens too late\n // (after the client bundle has already been built with missing env vars).\n logWarning(\n \"WORKOS_CLIENT_ID is not set; you can set it manually on the deployment or for hosted Convex deployments, use auto-provisioning.\",\n );\n logMessage(\n \"Learn more at https://docs.convex.dev/auth/authkit/auto-provision\",\n );\n logMessage(\"\");\n }\n\n const envVarMessage =\n `Environment variable ${chalkStderr.bold(\n variableName,\n )} is used in auth config file but ` + `its value was not set.`;\n let setEnvVarInstructions =\n \"Go set it in the dashboard or using `npx convex env set`\";\n\n // If `npx convex dev` is running using --url there might not be a configured deployment\n if (deploymentName !== null) {\n const variableQuery =\n variableName !== undefined ? `?var=${variableName}` : \"\";\n const dashboardUrl = deploymentDashboardUrlPage(\n deploymentName,\n `/settings/environment-variables${variableQuery}`,\n );\n setEnvVarInstructions = `Go to:\\n\\n ${chalkStderr.bold(\n dashboardUrl,\n )}\\n\\n to set it up. `;\n }\n await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n errForSentry: error,\n printedMessage: envVarMessage + \"\\n\" + setEnvVarInstructions,\n });\n }\n\n if (data?.code === \"RaceDetected\") {\n // Environment variables or schema changed during push. This is a transient\n // error that should be retried immediately with exponential backoff.\n const message =\n data.message || \"Schema or environment variables changed during push\";\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: error,\n printedMessage: chalkStderr.yellow(message),\n });\n }\n\n if (data?.code === \"InternalServerError\") {\n if (deploymentName?.startsWith(\"local-\")) {\n printLocalDeploymentOnError();\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: new LocalDeploymentError(\n \"InternalServerError while pushing to local deployment\",\n ),\n printedMessage: defaultMessage,\n });\n }\n }\n\n logFailure(defaultMessage);\n return await logAndHandleFetchError(ctx, error);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_utils", "path"]
|
|
7
7
|
}
|
|
@@ -57,7 +57,7 @@ var import_fs = require("../../../bundler/fs.js");
|
|
|
57
57
|
var import_codegen = require("../codegen.js");
|
|
58
58
|
var import_config = require("../config.js");
|
|
59
59
|
var import_utils2 = require("../utils/utils.js");
|
|
60
|
-
var
|
|
60
|
+
var import_aiFiles = require("../aiFiles/index.js");
|
|
61
61
|
async function handleAnonymousDeployment(ctx, options) {
|
|
62
62
|
if (await (0, import_utils.isOffline)()) {
|
|
63
63
|
return await ctx.crash({
|
|
@@ -165,7 +165,7 @@ async function handleAnonymousDeployment(ctx, options) {
|
|
|
165
165
|
const { configPath, projectConfig } = await (0, import_config.readProjectConfig)(ctx);
|
|
166
166
|
const convexDir = import_path.default.resolve((0, import_utils2.functionsDir)(configPath, projectConfig));
|
|
167
167
|
const projectDir = import_path.default.resolve(import_path.default.dirname(configPath));
|
|
168
|
-
await (0,
|
|
168
|
+
await (0, import_aiFiles.maybeSetupAiFiles)({ ctx, convexDir, projectDir });
|
|
169
169
|
}
|
|
170
170
|
return {
|
|
171
171
|
adminKey,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/anonymous.ts"],
|
|
4
|
-
"sourcesContent": ["// ----------------------------------------------------------------------------\n// Anonymous (No account)\n\nimport path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logMessage,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { promptSearch, promptYesNo } from \"../utils/prompts.js\";\nimport {\n bigBrainGenerateAdminKeyForAnonymousDeployment,\n bigBrainPause,\n bigBrainStart,\n} from \"./bigBrain.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n ensureUuidForAnonymousUser,\n legacyDeploymentStateDir,\n loadDeploymentConfig,\n loadDeploymentConfigFromDir,\n loadProjectLocalConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { rootDeploymentStateDir } from \"./filePaths.js\";\nimport { LocalDeploymentConfig } from \"./filePaths.js\";\nimport { DeploymentDetails } from \"./localDeployment.js\";\nimport { ensureBackendStopped, localDeploymentUrl } from \"./run.js\";\nimport { ensureBackendRunning } from \"./run.js\";\nimport { handlePotentialUpgrade } from \"./upgrade.js\";\nimport {\n isOffline,\n generateInstanceSecret,\n choosePorts,\n LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./utils.js\";\nimport { handleDashboard } from \"./dashboard.js\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { isAnonymousDeployment } from \"../deployment.js\";\nimport { createProject } from \"../api.js\";\nimport { removeAnonymousPrefix } from \"../deployment.js\";\nimport { nodeFs } from \"../../../bundler/fs.js\";\nimport { doInitConvexFolder } from \"../codegen.js\";\nimport { readProjectConfig } from \"../config.js\";\nimport { functionsDir } from \"../utils/utils.js\";\nimport { maybeSetupAiFiles } from \"../ai/index.js\";\n\nexport async function handleAnonymousDeployment(\n ctx: Context,\n options: {\n ports?:\n | {\n cloud: number;\n site: number;\n }\n | undefined;\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<DeploymentDetails> {\n if (await isOffline()) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Cannot run a local deployment while offline\",\n });\n }\n\n const deployment = await chooseDeployment(ctx, {\n deploymentName: options.deploymentName,\n chosenConfiguration: options.chosenConfiguration,\n });\n if (\n deployment.kind === \"first\" &&\n process.env.CONVEX_AGENT_MODE !== \"anonymous\"\n ) {\n logMessage(\n \"This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.\",\n );\n logMessage(\n \"Use `npx convex dashboard` to view and interact with your project from a web UI.\",\n );\n logMessage(\n \"Use `npx convex docs` to read the docs and `npx convex help` to see other commands.\",\n );\n ensureUuidForAnonymousUser(ctx);\n if (process.stdin.isTTY) {\n const result = await promptYesNo(ctx, {\n message: \"Continue?\",\n default: true,\n });\n if (!result) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Exiting\",\n });\n }\n }\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError();\n }\n });\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n await handleDashboard(ctx, version);\n let adminKey: string;\n let instanceSecret: string;\n if (deployment.kind === \"existing\") {\n adminKey = deployment.config.adminKey;\n instanceSecret =\n deployment.config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: deployment.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: deployment.deploymentName,\n allowOtherDeployments: true,\n });\n } else {\n instanceSecret = generateInstanceSecret();\n const data = await bigBrainGenerateAdminKeyForAnonymousDeployment(ctx, {\n instanceName: deployment.deploymentName,\n instanceSecret,\n });\n adminKey = data.adminKey;\n }\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [options.ports?.cloud ?? null, options.ports?.site ?? null],\n });\n const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {\n await ensureBackendRunning(ctx, {\n cloudPort,\n deploymentName: deployment.deploymentName,\n maxTimeSecs: 5,\n });\n if (isOffline) {\n return;\n }\n };\n\n const { cleanupHandle } = await handlePotentialUpgrade(ctx, {\n deploymentName: deployment.deploymentName,\n deploymentKind: \"anonymous\",\n oldVersion:\n deployment.kind === \"existing\" ? deployment.config.backendVersion : null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n forceUpgrade: options.forceUpgrade,\n });\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n });\n\n if (deployment.kind === \"new\") {\n await doInitConvexFolder(ctx);\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await maybeSetupAiFiles(ctx, convexDir, projectDir);\n }\n return {\n adminKey,\n deploymentName: deployment.deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n onActivity,\n };\n}\n\nexport async function loadAnonymousDeployment(\n ctx: Context,\n deploymentName: string,\n): Promise<LocalDeploymentConfig> {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find deployment with name ${deploymentName}!`,\n });\n }\n return config;\n}\n\n/**\n * List legacy anonymous deployments from the home directory.\n * These are deployments stored in ~/.convex/anonymous-convex-backend-state/\n */\nexport function listLegacyAnonymousDeployments(ctx: Context): Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n}> {\n const deployments: Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }> = [];\n\n const dir = rootDeploymentStateDir(\"anonymous\");\n if (ctx.fs.exists(dir)) {\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => isAnonymousDeployment(d));\n for (const deploymentName of deploymentNames) {\n const legacyDir = legacyDeploymentStateDir(\"anonymous\", deploymentName);\n const config = loadDeploymentConfigFromDir(ctx, legacyDir);\n if (config !== null) {\n deployments.push({ deploymentName, config });\n }\n }\n }\n\n return deployments;\n}\n\nexport async function listExistingAnonymousDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const deployments: Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }> = [];\n\n // Check project-local storage first\n const projectLocal = loadProjectLocalConfig(ctx);\n if (\n projectLocal !== null &&\n isAnonymousDeployment(projectLocal.deploymentName)\n ) {\n deployments.push(projectLocal);\n }\n\n // Check legacy home directory, avoiding duplicates\n for (const legacy of listLegacyAnonymousDeployments(ctx)) {\n if (!deployments.some((d) => d.deploymentName === legacy.deploymentName)) {\n deployments.push(legacy);\n }\n }\n\n return deployments;\n}\n\nasync function chooseDeployment(\n ctx: Context,\n options: {\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<\n | {\n kind: \"existing\";\n deploymentName: string;\n config: LocalDeploymentConfig;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n | {\n kind: \"first\";\n deploymentName: string;\n }\n> {\n // Check for existing project-local deployment first - use it if it exists\n const projectLocal = loadProjectLocalConfig(ctx);\n if (projectLocal !== null) {\n if (isAnonymousDeployment(projectLocal.deploymentName)) {\n // Already an anonymous deployment - use it as-is\n return {\n kind: \"existing\",\n deploymentName: projectLocal.deploymentName,\n config: projectLocal.config,\n };\n }\n // Project-local has data from a different deployment type (e.g., \"local-*\")\n // Create a new anonymous deployment that will reuse this data and update the config\n logVerbose(\n `Project-local has ${projectLocal.deploymentName}, switching to anonymous`,\n );\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Check if a specific deployment name was requested (legacy support)\n if (options.deploymentName !== null && options.chosenConfiguration === null) {\n const deployments = await listExistingAnonymousDeployments(ctx);\n const existing = deployments.find(\n (d) => d.deploymentName === options.deploymentName,\n );\n if (existing === undefined) {\n logWarning(`Could not find project with name ${options.deploymentName}!`);\n } else {\n return {\n kind: \"existing\",\n deploymentName: existing.deploymentName,\n config: existing.config,\n };\n }\n }\n\n // Handle agent mode - use fixed name since there's one deployment per project\n if (process.env.CONVEX_AGENT_MODE === \"anonymous\") {\n const deploymentName = \"anonymous-agent\";\n logVerbose(`Deployment name: ${deploymentName}`);\n return {\n kind: \"new\",\n deploymentName,\n };\n }\n\n // No project-local data - check for legacy deployments in home directory\n const legacyDeployments = listLegacyAnonymousDeployments(ctx);\n\n // No legacy deployments - auto-create a new project without prompting\n if (legacyDeployments.length === 0) {\n logMessage(\"Setting up a new project...\");\n return { deploymentName: generateDeploymentName(), kind: \"first\" };\n }\n\n // User explicitly wants a new deployment - create without prompting for name\n if (options.chosenConfiguration === \"new\") {\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Legacy deployments exist - prompt user to choose\n const newOrExisting = await promptSearch(ctx, {\n message: \"Which project would you like to use?\",\n choices: [\n ...(options.chosenConfiguration === \"existing\"\n ? []\n : [\n {\n name: \"Create a new one\",\n value: \"new\",\n },\n ]),\n ...legacyDeployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n ],\n });\n\n if (newOrExisting !== \"new\") {\n const existingDeployment = legacyDeployments.find(\n (d) => d.deploymentName === newOrExisting,\n );\n if (existingDeployment === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find project with name ${newOrExisting}!`,\n });\n }\n return {\n kind: \"existing\",\n deploymentName: existingDeployment.deploymentName,\n config: existingDeployment.config,\n };\n }\n\n // User chose to create a new one - no name prompt needed\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n}\n\n/**\n * Returns a name for a new anonymous deployment.\n */\nfunction generateDeploymentName() {\n const baseName = path.basename(process.cwd());\n const deploymentName = `anonymous-${baseName}`;\n logVerbose(`Deployment name: ${deploymentName}`);\n return deploymentName;\n}\n\n/**\n * This takes an \"anonymous\" deployment and makes it a \"local\" deployment\n * that is associated with a project in the given team.\n */\nexport async function handleLinkToProject(\n ctx: Context,\n args: {\n deploymentName: string;\n teamSlug: string;\n projectSlug: string | null;\n },\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n projectSlug: string;\n}> {\n logVerbose(\n `Linking ${args.deploymentName} to a project in team ${args.teamSlug}`,\n );\n const config = loadDeploymentConfig(ctx, \"anonymous\", args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Failed to load deployment config - try running `npx convex dev --configure`\",\n });\n }\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: config.ports.cloud,\n },\n deploymentName: args.deploymentName,\n allowOtherDeployments: true,\n maxTimeSecs: 5,\n });\n const projectName = removeAnonymousPrefix(args.deploymentName);\n let projectSlug: string;\n if (args.projectSlug !== null) {\n projectSlug = args.projectSlug;\n } else {\n const { projectSlug: newProjectSlug } = await createProject(ctx, {\n teamSlug: args.teamSlug,\n projectName,\n deploymentToProvision: null,\n });\n projectSlug = newProjectSlug;\n }\n logVerbose(`Creating local deployment in project ${projectSlug}`);\n // Register it in big brain\n const { deploymentName: localDeploymentName, adminKey } = await bigBrainStart(\n ctx,\n {\n port: config.ports.cloud,\n projectSlug,\n teamSlug: args.teamSlug,\n instanceName: null,\n },\n );\n const localConfig = loadDeploymentConfig(ctx, \"local\", localDeploymentName);\n if (localConfig !== null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Project ${projectSlug} already has a local deployment, so we cannot link this anonymous local deployment to it.`,\n });\n }\n logVerbose(`Moving ${args.deploymentName} to ${localDeploymentName}`);\n await moveDeployment(\n ctx,\n {\n deploymentKind: \"anonymous\",\n deploymentName: args.deploymentName,\n },\n {\n deploymentKind: \"local\",\n deploymentName: localDeploymentName,\n },\n );\n logVerbose(`Saving deployment config for ${localDeploymentName}`);\n saveDeploymentConfig(ctx, \"local\", localDeploymentName, {\n adminKey,\n backendVersion: config.backendVersion,\n ports: config.ports,\n });\n await bigBrainPause(ctx, {\n projectSlug,\n teamSlug: args.teamSlug,\n });\n logFinishedStep(`Linked ${args.deploymentName} to project ${projectSlug}`);\n return {\n projectSlug,\n deploymentName: localDeploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n };\n}\n\nexport async function moveDeployment(\n ctx: Context,\n oldDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n newDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n) {\n const oldPath = deploymentStateDir(\n ctx,\n oldDeployment.deploymentKind,\n oldDeployment.deploymentName,\n );\n const newPath = deploymentStateDir(\n ctx,\n newDeployment.deploymentKind,\n newDeployment.deploymentName,\n );\n\n // If both paths are the same (project-local storage), no file movement needed.\n // The config will be updated separately by saveDeploymentConfig.\n if (oldPath === newPath) {\n logVerbose(\n `Source and destination are the same (${oldPath}), skipping file copy`,\n );\n return;\n }\n\n await recursivelyCopy(ctx, nodeFs, oldPath, newPath);\n recursivelyDelete(ctx, oldPath);\n}\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAGA,kBAAiB;AAEjB,iBAKO;AACP,qBAA0C;AAC1C,sBAIO;AACP,oBAAkE;AAClE,uBASO;AACP,IAAAA,oBAAuC;AAGvC,iBAAyD;AACzD,IAAAC,cAAqC;AACrC,qBAAuC;AACvC,mBAKO;AACP,uBAAgC;AAChC,qBAAmD;AACnD,sBAA8C;AAC9C,wBAAsC;AACtC,iBAA8B;AAC9B,IAAAC,qBAAsC;AACtC,gBAAuB;AACvB,qBAAmC;AACnC,oBAAkC;AAClC,IAAAC,gBAA6B;AAC7B,
|
|
4
|
+
"sourcesContent": ["// ----------------------------------------------------------------------------\n// Anonymous (No account)\n\nimport path from \"path\";\nimport { Context } from \"../../../bundler/context.js\";\nimport {\n logFinishedStep,\n logMessage,\n logVerbose,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { promptSearch, promptYesNo } from \"../utils/prompts.js\";\nimport {\n bigBrainGenerateAdminKeyForAnonymousDeployment,\n bigBrainPause,\n bigBrainStart,\n} from \"./bigBrain.js\";\nimport { LocalDeploymentError, printLocalDeploymentOnError } from \"./errors.js\";\nimport {\n LocalDeploymentKind,\n deploymentStateDir,\n ensureUuidForAnonymousUser,\n legacyDeploymentStateDir,\n loadDeploymentConfig,\n loadDeploymentConfigFromDir,\n loadProjectLocalConfig,\n saveDeploymentConfig,\n} from \"./filePaths.js\";\nimport { rootDeploymentStateDir } from \"./filePaths.js\";\nimport { LocalDeploymentConfig } from \"./filePaths.js\";\nimport { DeploymentDetails } from \"./localDeployment.js\";\nimport { ensureBackendStopped, localDeploymentUrl } from \"./run.js\";\nimport { ensureBackendRunning } from \"./run.js\";\nimport { handlePotentialUpgrade } from \"./upgrade.js\";\nimport {\n isOffline,\n generateInstanceSecret,\n choosePorts,\n LOCAL_BACKEND_INSTANCE_SECRET,\n} from \"./utils.js\";\nimport { handleDashboard } from \"./dashboard.js\";\nimport { recursivelyDelete, recursivelyCopy } from \"../fsUtils.js\";\nimport { ensureBackendBinaryDownloaded } from \"./download.js\";\nimport { isAnonymousDeployment } from \"../deployment.js\";\nimport { createProject } from \"../api.js\";\nimport { removeAnonymousPrefix } from \"../deployment.js\";\nimport { nodeFs } from \"../../../bundler/fs.js\";\nimport { doInitConvexFolder } from \"../codegen.js\";\nimport { readProjectConfig } from \"../config.js\";\nimport { functionsDir } from \"../utils/utils.js\";\nimport { maybeSetupAiFiles } from \"../aiFiles/index.js\";\n\nexport async function handleAnonymousDeployment(\n ctx: Context,\n options: {\n ports?:\n | {\n cloud: number;\n site: number;\n }\n | undefined;\n backendVersion?: string | undefined;\n dashboardVersion?: string | undefined;\n forceUpgrade: boolean;\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<DeploymentDetails> {\n if (await isOffline()) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Cannot run a local deployment while offline\",\n });\n }\n\n const deployment = await chooseDeployment(ctx, {\n deploymentName: options.deploymentName,\n chosenConfiguration: options.chosenConfiguration,\n });\n if (\n deployment.kind === \"first\" &&\n process.env.CONVEX_AGENT_MODE !== \"anonymous\"\n ) {\n logMessage(\n \"This command, `npx convex dev`, will run your Convex backend locally and update it with the function you write in the `convex/` directory.\",\n );\n logMessage(\n \"Use `npx convex dashboard` to view and interact with your project from a web UI.\",\n );\n logMessage(\n \"Use `npx convex docs` to read the docs and `npx convex help` to see other commands.\",\n );\n ensureUuidForAnonymousUser(ctx);\n if (process.stdin.isTTY) {\n const result = await promptYesNo(ctx, {\n message: \"Continue?\",\n default: true,\n });\n if (!result) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"Exiting\",\n });\n }\n }\n }\n ctx.registerCleanup(async (_exitCode, err) => {\n if (err instanceof LocalDeploymentError) {\n printLocalDeploymentOnError();\n }\n });\n const { binaryPath, version } = await ensureBackendBinaryDownloaded(\n ctx,\n options.backendVersion === undefined\n ? {\n kind: \"latest\",\n }\n : { kind: \"version\", version: options.backendVersion },\n );\n await handleDashboard(ctx, version);\n let adminKey: string;\n let instanceSecret: string;\n if (deployment.kind === \"existing\") {\n adminKey = deployment.config.adminKey;\n instanceSecret =\n deployment.config.instanceSecret ?? LOCAL_BACKEND_INSTANCE_SECRET;\n // If it's still running for some reason, exit and tell the user to kill it.\n // It's fine if a different backend is running on these ports though since we'll\n // pick new ones.\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: deployment.config.ports.cloud,\n },\n maxTimeSecs: 5,\n deploymentName: deployment.deploymentName,\n allowOtherDeployments: true,\n });\n } else {\n instanceSecret = generateInstanceSecret();\n const data = await bigBrainGenerateAdminKeyForAnonymousDeployment(ctx, {\n instanceName: deployment.deploymentName,\n instanceSecret,\n });\n adminKey = data.adminKey;\n }\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [options.ports?.cloud ?? null, options.ports?.site ?? null],\n });\n const onActivity = async (isOffline: boolean, _wasOffline: boolean) => {\n await ensureBackendRunning(ctx, {\n cloudPort,\n deploymentName: deployment.deploymentName,\n maxTimeSecs: 5,\n });\n if (isOffline) {\n return;\n }\n };\n\n const { cleanupHandle } = await handlePotentialUpgrade(ctx, {\n deploymentName: deployment.deploymentName,\n deploymentKind: \"anonymous\",\n oldVersion:\n deployment.kind === \"existing\" ? deployment.config.backendVersion : null,\n newBinaryPath: binaryPath,\n newVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n forceUpgrade: options.forceUpgrade,\n });\n\n const cleanupFunc = ctx.removeCleanup(cleanupHandle);\n ctx.registerCleanup(async (exitCode, err) => {\n if (cleanupFunc !== null) {\n await cleanupFunc(exitCode, err);\n }\n });\n\n if (deployment.kind === \"new\") {\n await doInitConvexFolder(ctx);\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await maybeSetupAiFiles({ ctx, convexDir, projectDir });\n }\n return {\n adminKey,\n deploymentName: deployment.deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n onActivity,\n };\n}\n\nexport async function loadAnonymousDeployment(\n ctx: Context,\n deploymentName: string,\n): Promise<LocalDeploymentConfig> {\n const config = loadDeploymentConfig(ctx, \"anonymous\", deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find deployment with name ${deploymentName}!`,\n });\n }\n return config;\n}\n\n/**\n * List legacy anonymous deployments from the home directory.\n * These are deployments stored in ~/.convex/anonymous-convex-backend-state/\n */\nexport function listLegacyAnonymousDeployments(ctx: Context): Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n}> {\n const deployments: Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }> = [];\n\n const dir = rootDeploymentStateDir(\"anonymous\");\n if (ctx.fs.exists(dir)) {\n const deploymentNames = ctx.fs\n .listDir(dir)\n .map((d) => d.name)\n .filter((d) => isAnonymousDeployment(d));\n for (const deploymentName of deploymentNames) {\n const legacyDir = legacyDeploymentStateDir(\"anonymous\", deploymentName);\n const config = loadDeploymentConfigFromDir(ctx, legacyDir);\n if (config !== null) {\n deployments.push({ deploymentName, config });\n }\n }\n }\n\n return deployments;\n}\n\nexport async function listExistingAnonymousDeployments(ctx: Context): Promise<\n Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }>\n> {\n const deployments: Array<{\n deploymentName: string;\n config: LocalDeploymentConfig;\n }> = [];\n\n // Check project-local storage first\n const projectLocal = loadProjectLocalConfig(ctx);\n if (\n projectLocal !== null &&\n isAnonymousDeployment(projectLocal.deploymentName)\n ) {\n deployments.push(projectLocal);\n }\n\n // Check legacy home directory, avoiding duplicates\n for (const legacy of listLegacyAnonymousDeployments(ctx)) {\n if (!deployments.some((d) => d.deploymentName === legacy.deploymentName)) {\n deployments.push(legacy);\n }\n }\n\n return deployments;\n}\n\nasync function chooseDeployment(\n ctx: Context,\n options: {\n deploymentName: string | null;\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n },\n): Promise<\n | {\n kind: \"existing\";\n deploymentName: string;\n config: LocalDeploymentConfig;\n }\n | {\n kind: \"new\";\n deploymentName: string;\n }\n | {\n kind: \"first\";\n deploymentName: string;\n }\n> {\n // Check for existing project-local deployment first - use it if it exists\n const projectLocal = loadProjectLocalConfig(ctx);\n if (projectLocal !== null) {\n if (isAnonymousDeployment(projectLocal.deploymentName)) {\n // Already an anonymous deployment - use it as-is\n return {\n kind: \"existing\",\n deploymentName: projectLocal.deploymentName,\n config: projectLocal.config,\n };\n }\n // Project-local has data from a different deployment type (e.g., \"local-*\")\n // Create a new anonymous deployment that will reuse this data and update the config\n logVerbose(\n `Project-local has ${projectLocal.deploymentName}, switching to anonymous`,\n );\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Check if a specific deployment name was requested (legacy support)\n if (options.deploymentName !== null && options.chosenConfiguration === null) {\n const deployments = await listExistingAnonymousDeployments(ctx);\n const existing = deployments.find(\n (d) => d.deploymentName === options.deploymentName,\n );\n if (existing === undefined) {\n logWarning(`Could not find project with name ${options.deploymentName}!`);\n } else {\n return {\n kind: \"existing\",\n deploymentName: existing.deploymentName,\n config: existing.config,\n };\n }\n }\n\n // Handle agent mode - use fixed name since there's one deployment per project\n if (process.env.CONVEX_AGENT_MODE === \"anonymous\") {\n const deploymentName = \"anonymous-agent\";\n logVerbose(`Deployment name: ${deploymentName}`);\n return {\n kind: \"new\",\n deploymentName,\n };\n }\n\n // No project-local data - check for legacy deployments in home directory\n const legacyDeployments = listLegacyAnonymousDeployments(ctx);\n\n // No legacy deployments - auto-create a new project without prompting\n if (legacyDeployments.length === 0) {\n logMessage(\"Setting up a new project...\");\n return { deploymentName: generateDeploymentName(), kind: \"first\" };\n }\n\n // User explicitly wants a new deployment - create without prompting for name\n if (options.chosenConfiguration === \"new\") {\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n }\n\n // Legacy deployments exist - prompt user to choose\n const newOrExisting = await promptSearch(ctx, {\n message: \"Which project would you like to use?\",\n choices: [\n ...(options.chosenConfiguration === \"existing\"\n ? []\n : [\n {\n name: \"Create a new one\",\n value: \"new\",\n },\n ]),\n ...legacyDeployments.map((d) => ({\n name: d.deploymentName,\n value: d.deploymentName,\n })),\n ],\n });\n\n if (newOrExisting !== \"new\") {\n const existingDeployment = legacyDeployments.find(\n (d) => d.deploymentName === newOrExisting,\n );\n if (existingDeployment === undefined) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Could not find project with name ${newOrExisting}!`,\n });\n }\n return {\n kind: \"existing\",\n deploymentName: existingDeployment.deploymentName,\n config: existingDeployment.config,\n };\n }\n\n // User chose to create a new one - no name prompt needed\n return { deploymentName: generateDeploymentName(), kind: \"new\" };\n}\n\n/**\n * Returns a name for a new anonymous deployment.\n */\nfunction generateDeploymentName() {\n const baseName = path.basename(process.cwd());\n const deploymentName = `anonymous-${baseName}`;\n logVerbose(`Deployment name: ${deploymentName}`);\n return deploymentName;\n}\n\n/**\n * This takes an \"anonymous\" deployment and makes it a \"local\" deployment\n * that is associated with a project in the given team.\n */\nexport async function handleLinkToProject(\n ctx: Context,\n args: {\n deploymentName: string;\n teamSlug: string;\n projectSlug: string | null;\n },\n): Promise<{\n deploymentName: string;\n deploymentUrl: string;\n projectSlug: string;\n}> {\n logVerbose(\n `Linking ${args.deploymentName} to a project in team ${args.teamSlug}`,\n );\n const config = loadDeploymentConfig(ctx, \"anonymous\", args.deploymentName);\n if (config === null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Failed to load deployment config - try running `npx convex dev --configure`\",\n });\n }\n await ensureBackendStopped(ctx, {\n ports: {\n cloud: config.ports.cloud,\n },\n deploymentName: args.deploymentName,\n allowOtherDeployments: true,\n maxTimeSecs: 5,\n });\n const projectName = removeAnonymousPrefix(args.deploymentName);\n let projectSlug: string;\n if (args.projectSlug !== null) {\n projectSlug = args.projectSlug;\n } else {\n const { projectSlug: newProjectSlug } = await createProject(ctx, {\n teamSlug: args.teamSlug,\n projectName,\n deploymentToProvision: null,\n });\n projectSlug = newProjectSlug;\n }\n logVerbose(`Creating local deployment in project ${projectSlug}`);\n // Register it in big brain\n const { deploymentName: localDeploymentName, adminKey } = await bigBrainStart(\n ctx,\n {\n port: config.ports.cloud,\n projectSlug,\n teamSlug: args.teamSlug,\n instanceName: null,\n },\n );\n const localConfig = loadDeploymentConfig(ctx, \"local\", localDeploymentName);\n if (localConfig !== null) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Project ${projectSlug} already has a local deployment, so we cannot link this anonymous local deployment to it.`,\n });\n }\n logVerbose(`Moving ${args.deploymentName} to ${localDeploymentName}`);\n await moveDeployment(\n ctx,\n {\n deploymentKind: \"anonymous\",\n deploymentName: args.deploymentName,\n },\n {\n deploymentKind: \"local\",\n deploymentName: localDeploymentName,\n },\n );\n logVerbose(`Saving deployment config for ${localDeploymentName}`);\n saveDeploymentConfig(ctx, \"local\", localDeploymentName, {\n adminKey,\n backendVersion: config.backendVersion,\n ports: config.ports,\n });\n await bigBrainPause(ctx, {\n projectSlug,\n teamSlug: args.teamSlug,\n });\n logFinishedStep(`Linked ${args.deploymentName} to project ${projectSlug}`);\n return {\n projectSlug,\n deploymentName: localDeploymentName,\n deploymentUrl: localDeploymentUrl(config.ports.cloud),\n };\n}\n\nexport async function moveDeployment(\n ctx: Context,\n oldDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n newDeployment: {\n deploymentKind: LocalDeploymentKind;\n deploymentName: string;\n },\n) {\n const oldPath = deploymentStateDir(\n ctx,\n oldDeployment.deploymentKind,\n oldDeployment.deploymentName,\n );\n const newPath = deploymentStateDir(\n ctx,\n newDeployment.deploymentKind,\n newDeployment.deploymentName,\n );\n\n // If both paths are the same (project-local storage), no file movement needed.\n // The config will be updated separately by saveDeploymentConfig.\n if (oldPath === newPath) {\n logVerbose(\n `Source and destination are the same (${oldPath}), skipping file copy`,\n );\n return;\n }\n\n await recursivelyCopy(ctx, nodeFs, oldPath, newPath);\n recursivelyDelete(ctx, oldPath);\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["import_filePaths", "import_run", "import_deployment", "import_utils", "isOffline", "path"]
|
|
7
7
|
}
|
|
@@ -35,26 +35,26 @@ var import_path = __toESM(require("path"), 1);
|
|
|
35
35
|
var import_log = require("../../bundler/log.js");
|
|
36
36
|
var import_config = require("./config.js");
|
|
37
37
|
var import_utils = require("./utils/utils.js");
|
|
38
|
-
var
|
|
38
|
+
var import_aiFiles = require("./aiFiles/index.js");
|
|
39
39
|
var import_versionApi = require("./versionApi.js");
|
|
40
40
|
async function checkVersion(ctx) {
|
|
41
41
|
const version = await (0, import_versionApi.getVersion)();
|
|
42
|
-
if (version ===
|
|
42
|
+
if (version.kind === "error") {
|
|
43
43
|
return;
|
|
44
44
|
}
|
|
45
|
-
if (version.message) {
|
|
46
|
-
(0, import_log.logMessage)(version.message);
|
|
45
|
+
if (version.data.message) {
|
|
46
|
+
(0, import_log.logMessage)(version.data.message);
|
|
47
47
|
}
|
|
48
48
|
try {
|
|
49
49
|
const { configPath, projectConfig } = await (0, import_config.readProjectConfig)(ctx);
|
|
50
50
|
const convexDir = import_path.default.resolve((0, import_utils.functionsDir)(configPath, projectConfig));
|
|
51
51
|
const projectDir = import_path.default.resolve(import_path.default.dirname(configPath));
|
|
52
|
-
await (0,
|
|
53
|
-
version.guidelinesHash,
|
|
54
|
-
version.agentSkillsSha,
|
|
52
|
+
await (0, import_aiFiles.checkAiFilesStaleness)({
|
|
53
|
+
canonicalGuidelinesHash: version.data.guidelinesHash,
|
|
54
|
+
canonicalAgentSkillsSha: version.data.agentSkillsSha,
|
|
55
55
|
projectDir,
|
|
56
56
|
convexDir
|
|
57
|
-
);
|
|
57
|
+
});
|
|
58
58
|
} catch {
|
|
59
59
|
}
|
|
60
60
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/updates.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport type { Context } from \"../../bundler/context.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { checkAiFilesStaleness } from \"./
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,iBAA2B;AAE3B,oBAAkC;AAClC,mBAA6B;AAC7B,
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\nimport { logMessage } from \"../../bundler/log.js\";\nimport type { Context } from \"../../bundler/context.js\";\nimport { readProjectConfig } from \"./config.js\";\nimport { functionsDir } from \"./utils/utils.js\";\nimport { checkAiFilesStaleness } from \"./aiFiles/index.js\";\nimport { getVersion } from \"./versionApi.js\";\n\n/**\n * Check the version of the `convex` NPM package and nag if Convex AI files\n * are out of date.\n */\nexport async function checkVersion(ctx: Context) {\n const version = await getVersion();\n\n if (version.kind === \"error\") {\n return;\n }\n\n if (version.data.message) {\n logMessage(version.data.message);\n }\n\n try {\n const { configPath, projectConfig } = await readProjectConfig(ctx);\n const convexDir = path.resolve(functionsDir(configPath, projectConfig));\n const projectDir = path.resolve(path.dirname(configPath));\n await checkAiFilesStaleness({\n canonicalGuidelinesHash: version.data.guidelinesHash,\n canonicalAgentSkillsSha: version.data.agentSkillsSha,\n projectDir,\n convexDir,\n });\n } catch {\n // Non-fatal: skip staleness check if project config can't be resolved.\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,iBAA2B;AAE3B,oBAAkC;AAClC,mBAA6B;AAC7B,qBAAsC;AACtC,wBAA2B;AAM3B,eAAsB,aAAa,KAAc;AAC/C,QAAM,UAAU,UAAM,8BAAW;AAEjC,MAAI,QAAQ,SAAS,SAAS;AAC5B;AAAA,EACF;AAEA,MAAI,QAAQ,KAAK,SAAS;AACxB,+BAAW,QAAQ,KAAK,OAAO;AAAA,EACjC;AAEA,MAAI;AACF,UAAM,EAAE,YAAY,cAAc,IAAI,UAAM,iCAAkB,GAAG;AACjE,UAAM,YAAY,YAAAA,QAAK,YAAQ,2BAAa,YAAY,aAAa,CAAC;AACtE,UAAM,aAAa,YAAAA,QAAK,QAAQ,YAAAA,QAAK,QAAQ,UAAU,CAAC;AACxD,cAAM,sCAAsB;AAAA,MAC1B,yBAAyB,QAAQ,KAAK;AAAA,MACtC,yBAAyB,QAAQ,KAAK;AAAA,MACtC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,QAAQ;AAAA,EAER;AACF;",
|
|
6
6
|
"names": ["path"]
|
|
7
7
|
}
|
|
@@ -55,13 +55,15 @@ async function getVersion() {
|
|
|
55
55
|
Sentry.captureException(
|
|
56
56
|
new Error(`Failed to fetch version: status = ${req.status}`)
|
|
57
57
|
);
|
|
58
|
-
return
|
|
58
|
+
return { kind: "error" };
|
|
59
59
|
}
|
|
60
60
|
const json = await req.json();
|
|
61
|
-
|
|
61
|
+
const result = validateVersionResult(json);
|
|
62
|
+
if (result === null) return { kind: "error" };
|
|
63
|
+
return { kind: "ok", data: result };
|
|
62
64
|
} catch (error) {
|
|
63
65
|
Sentry.captureException(error);
|
|
64
|
-
return
|
|
66
|
+
return { kind: "error" };
|
|
65
67
|
}
|
|
66
68
|
}
|
|
67
69
|
function validateVersionResult(json) {
|
|
@@ -85,7 +87,8 @@ function validateVersionResult(json) {
|
|
|
85
87
|
}
|
|
86
88
|
async function fetchAgentSkillsSha() {
|
|
87
89
|
const versionData = await getVersion();
|
|
88
|
-
|
|
90
|
+
if (versionData.kind === "error") return null;
|
|
91
|
+
return versionData.data.agentSkillsSha;
|
|
89
92
|
}
|
|
90
93
|
async function downloadGuidelines() {
|
|
91
94
|
try {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/versionApi.ts"],
|
|
4
|
-
"sourcesContent": ["import * as Sentry from \"@sentry/node\";\nimport { version } from \"../version.js\";\n\nconst VERSION_ENDPOINT = \"https://version.convex.dev/v1/version\";\nconst GUIDELINES_ENDPOINT = \"https://version.convex.dev/v1/guidelines\";\n\nconst HEADERS: Record<string, string> = {\n \"Convex-Client\": `npm-cli-${version}`,\n // Useful telemetry proxy for \"human at a terminal\" vs automated/background execution.\n \"Convex-Interactive\": process.stdin.isTTY === true ? \"true\" : \"false\",\n};\nif (process.env.CONVEX_AGENT_MODE) {\n HEADERS[\"Convex-Agent-Mode\"] = process.env.CONVEX_AGENT_MODE;\n}\n\nexport type VersionResult = {\n message: string | null;\n guidelinesHash: string | null;\n agentSkillsSha: string | null;\n disableSkillsCli: boolean;\n};\n\nexport async function getVersion(): Promise<
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAwB;AACxB,qBAAwB;AAExB,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAE5B,MAAM,UAAkC;AAAA,EACtC,iBAAiB,WAAW,sBAAO;AAAA;AAAA,EAEnC,sBAAsB,QAAQ,MAAM,UAAU,OAAO,SAAS;AAChE;AACA,IAAI,QAAQ,IAAI,mBAAmB;AACjC,UAAQ,mBAAmB,IAAI,QAAQ,IAAI;AAC7C;
|
|
4
|
+
"sourcesContent": ["import * as Sentry from \"@sentry/node\";\nimport { version } from \"../version.js\";\n\nconst VERSION_ENDPOINT = \"https://version.convex.dev/v1/version\";\nconst GUIDELINES_ENDPOINT = \"https://version.convex.dev/v1/guidelines\";\n\nconst HEADERS: Record<string, string> = {\n \"Convex-Client\": `npm-cli-${version}`,\n // Useful telemetry proxy for \"human at a terminal\" vs automated/background execution.\n \"Convex-Interactive\": process.stdin.isTTY === true ? \"true\" : \"false\",\n};\nif (process.env.CONVEX_AGENT_MODE) {\n HEADERS[\"Convex-Agent-Mode\"] = process.env.CONVEX_AGENT_MODE;\n}\n\nexport type VersionResult = {\n message: string | null;\n guidelinesHash: string | null;\n agentSkillsSha: string | null;\n disableSkillsCli: boolean;\n};\n\nexport type VersionFetchResult =\n | { kind: \"ok\"; data: VersionResult }\n | { kind: \"error\" };\n\nexport async function getVersion(): Promise<VersionFetchResult> {\n try {\n const req = await fetch(VERSION_ENDPOINT, {\n headers: HEADERS,\n });\n\n if (!req.ok) {\n Sentry.captureException(\n new Error(`Failed to fetch version: status = ${req.status}`),\n );\n return { kind: \"error\" };\n }\n\n const json = await req.json();\n const result = validateVersionResult(json);\n\n if (result === null) return { kind: \"error\" };\n return { kind: \"ok\", data: result };\n } catch (error) {\n Sentry.captureException(error);\n return { kind: \"error\" };\n }\n}\n\nexport function validateVersionResult(json: any): VersionResult | null {\n if (typeof json !== \"object\" || json === null) {\n Sentry.captureMessage(\"Invalid version result\", \"error\");\n return null;\n }\n\n if (typeof json.message !== \"string\" && json.message !== null) {\n Sentry.captureMessage(\"Invalid version.message result\", \"error\");\n return null;\n }\n\n // Treat missing optional hashes as null.\n const agentSkillsSha =\n typeof json.agentSkillsSha === \"string\" ? json.agentSkillsSha : null;\n\n const guidelinesHash =\n typeof json.guidelinesHash === \"string\" ? json.guidelinesHash : null;\n const disableSkillsCli = json.disableSkillsCli === true;\n\n return {\n message: json.message,\n guidelinesHash,\n agentSkillsSha,\n disableSkillsCli,\n };\n}\n\n/** Fetch the latest agent skills SHA from version.convex.dev. */\nexport async function fetchAgentSkillsSha(): Promise<string | null> {\n const versionData = await getVersion();\n if (versionData.kind === \"error\") return null;\n return versionData.data.agentSkillsSha;\n}\n\nexport async function downloadGuidelines(): Promise<string | null> {\n try {\n const req = await fetch(GUIDELINES_ENDPOINT, { headers: HEADERS });\n\n if (!req.ok) {\n Sentry.captureMessage(\n `Failed to fetch Convex guidelines: status = ${req.status}`,\n );\n return null;\n }\n\n const text = await req.text();\n return text;\n } catch (error) {\n Sentry.captureException(error);\n return null;\n }\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAAwB;AACxB,qBAAwB;AAExB,MAAM,mBAAmB;AACzB,MAAM,sBAAsB;AAE5B,MAAM,UAAkC;AAAA,EACtC,iBAAiB,WAAW,sBAAO;AAAA;AAAA,EAEnC,sBAAsB,QAAQ,MAAM,UAAU,OAAO,SAAS;AAChE;AACA,IAAI,QAAQ,IAAI,mBAAmB;AACjC,UAAQ,mBAAmB,IAAI,QAAQ,IAAI;AAC7C;AAaA,eAAsB,aAA0C;AAC9D,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,kBAAkB;AAAA,MACxC,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,IAAI,IAAI;AACX,aAAO;AAAA,QACL,IAAI,MAAM,qCAAqC,IAAI,MAAM,EAAE;AAAA,MAC7D;AACA,aAAO,EAAE,MAAM,QAAQ;AAAA,IACzB;AAEA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,UAAM,SAAS,sBAAsB,IAAI;AAEzC,QAAI,WAAW,KAAM,QAAO,EAAE,MAAM,QAAQ;AAC5C,WAAO,EAAE,MAAM,MAAM,MAAM,OAAO;AAAA,EACpC,SAAS,OAAO;AACd,WAAO,iBAAiB,KAAK;AAC7B,WAAO,EAAE,MAAM,QAAQ;AAAA,EACzB;AACF;AAEO,SAAS,sBAAsB,MAAiC;AACrE,MAAI,OAAO,SAAS,YAAY,SAAS,MAAM;AAC7C,WAAO,eAAe,0BAA0B,OAAO;AACvD,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,KAAK,YAAY,YAAY,KAAK,YAAY,MAAM;AAC7D,WAAO,eAAe,kCAAkC,OAAO;AAC/D,WAAO;AAAA,EACT;AAGA,QAAM,iBACJ,OAAO,KAAK,mBAAmB,WAAW,KAAK,iBAAiB;AAElE,QAAM,iBACJ,OAAO,KAAK,mBAAmB,WAAW,KAAK,iBAAiB;AAClE,QAAM,mBAAmB,KAAK,qBAAqB;AAEnD,SAAO;AAAA,IACL,SAAS,KAAK;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAGA,eAAsB,sBAA8C;AAClE,QAAM,cAAc,MAAM,WAAW;AACrC,MAAI,YAAY,SAAS,QAAS,QAAO;AACzC,SAAO,YAAY,KAAK;AAC1B;AAEA,eAAsB,qBAA6C;AACjE,MAAI;AACF,UAAM,MAAM,MAAM,MAAM,qBAAqB,EAAE,SAAS,QAAQ,CAAC;AAEjE,QAAI,CAAC,IAAI,IAAI;AACX,aAAO;AAAA,QACL,+CAA+C,IAAI,MAAM;AAAA,MAC3D;AACA,aAAO;AAAA,IACT;AAEA,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,WAAO;AAAA,EACT,SAAS,OAAO;AACd,WAAO,iBAAiB,KAAK;AAC7B,WAAO;AAAA,EACT;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -427,13 +427,11 @@ async function tryToCreateAssociatedWorkosTeam(ctx, deploymentName, teamId, depl
|
|
|
427
427
|
deploymentType
|
|
428
428
|
);
|
|
429
429
|
if (!result.success) {
|
|
430
|
-
const dashboardUrl = (0, import_dashboard.deploymentDashboardUrlPage)(
|
|
431
|
-
deploymentName,
|
|
432
|
-
`/settings/environment-variables?var=WORKOS_CLIENT_ID`
|
|
433
|
-
);
|
|
434
430
|
(0, import_log.logMessage)(
|
|
435
|
-
`To provide your own WorkOS environment credentials instead, set environment variables manually
|
|
436
|
-
|
|
431
|
+
`To provide your own WorkOS environment credentials instead, set environment variables manually:
|
|
432
|
+
|
|
433
|
+
npx convex env set WORKOS_CLIENT_ID $YOUR_CLIENT_ID_HERE
|
|
434
|
+
npx convex env set WORKOS_API_KEY $YOUR_API_KEY_HERE`
|
|
437
435
|
);
|
|
438
436
|
return "choseNotToAssociatedTeam";
|
|
439
437
|
}
|