convex 1.45.0 → 1.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +48 -6
- package/dist/browser.bundle.js +1 -1
- package/dist/browser.bundle.js.map +2 -2
- package/dist/cjs/browser/http_client.js.map +2 -2
- package/dist/cjs/browser/query_options.js.map +2 -2
- package/dist/cjs/browser/simple_client.js.map +2 -2
- package/dist/cjs/browser/sync/optimistic_updates.js.map +1 -1
- package/dist/cjs/browser/sync/optimistic_updates_impl.js.map +2 -2
- package/dist/cjs/cli/codegen.js +2 -0
- package/dist/cjs/cli/codegen.js.map +2 -2
- package/dist/cjs/cli/deploy.js +1 -0
- package/dist/cjs/cli/deploy.js.map +2 -2
- package/dist/cjs/cli/docs.js +3 -36
- package/dist/cjs/cli/docs.js.map +2 -2
- package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js +101 -60
- package/dist/cjs/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
- package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js +107 -0
- package/dist/cjs/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
- package/dist/cjs/cli/lib/codegen.js.map +2 -2
- package/dist/cjs/cli/lib/components.js +12 -0
- package/dist/cjs/cli/lib/components.js.map +2 -2
- package/dist/cjs/cli/lib/deploy2.js +29 -2
- package/dist/cjs/cli/lib/deploy2.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/evaluateSchema.js +73 -0
- package/dist/cjs/cli/lib/deployApi/evaluateSchema.js.map +7 -0
- package/dist/cjs/cli/lib/deployApi/finishPush.js +1 -0
- package/dist/cjs/cli/lib/deployApi/finishPush.js.map +2 -2
- package/dist/cjs/cli/lib/deployApi/startPush.js +1 -1
- package/dist/cjs/cli/lib/deployApi/startPush.js.map +2 -2
- package/dist/cjs/cli/lib/dev.js +1 -0
- package/dist/cjs/cli/lib/dev.js.map +2 -2
- package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/localDeployment/run.js +30 -1
- package/dist/cjs/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/upgrade.js +6 -5
- package/dist/cjs/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/cjs/cli/lib/localDeployment/utils.js +5 -1
- package/dist/cjs/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/cjs/cli/lib/run.js +1 -0
- package/dist/cjs/cli/lib/run.js.map +2 -2
- package/dist/cjs/cli/lib/utils/utils.js +36 -29
- package/dist/cjs/cli/lib/utils/utils.js.map +2 -2
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/nextjs/index.js.map +2 -2
- package/dist/cjs/react/client.js.map +2 -2
- package/dist/cjs/react/hydration.js.map +2 -2
- package/dist/cjs/react/queries_observer.js.map +2 -2
- package/dist/cjs/react/use_paginated_query2.js.map +2 -2
- package/dist/cjs/react/use_queries.js.map +2 -2
- package/dist/cjs/server/api.js.map +2 -2
- package/dist/cjs/server/components/index.js.map +2 -2
- package/dist/cjs/server/cron.js +10 -10
- package/dist/cjs/server/cron.js.map +2 -2
- package/dist/cjs/server/impl/actions_impl.js.map +2 -2
- package/dist/cjs/server/impl/meta_impl.js +8 -2
- package/dist/cjs/server/impl/meta_impl.js.map +2 -2
- package/dist/cjs/server/impl/scheduler_impl.js.map +2 -2
- package/dist/cjs/server/index.js.map +2 -2
- package/dist/cjs/server/meta.js.map +1 -1
- package/dist/cjs/server/registration.js.map +1 -1
- package/dist/cjs/server/scheduler.js.map +1 -1
- package/dist/cjs/server/schema.js +50 -3
- package/dist/cjs/server/schema.js.map +2 -2
- package/dist/cjs/values/validator.js +1 -1
- package/dist/cjs/values/validator.js.map +2 -2
- package/dist/cjs/values/validators.js +81 -25
- package/dist/cjs/values/validators.js.map +2 -2
- package/dist/cjs-types/browser/http_client.d.ts +5 -5
- package/dist/cjs-types/browser/http_client.d.ts.map +1 -1
- package/dist/cjs-types/browser/query_options.d.ts +2 -2
- package/dist/cjs-types/browser/query_options.d.ts.map +1 -1
- package/dist/cjs-types/browser/simple_client.d.ts +6 -6
- package/dist/cjs-types/browser/simple_client.d.ts.map +1 -1
- package/dist/cjs-types/browser/sync/optimistic_updates.d.ts +4 -4
- package/dist/cjs-types/browser/sync/optimistic_updates.d.ts.map +1 -1
- package/dist/cjs-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen.d.ts.map +1 -1
- package/dist/cjs-types/cli/docs.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts +26 -5
- package/dist/cjs-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts +14 -0
- package/dist/cjs-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/codegen.d.ts +1 -0
- package/dist/cjs-types/cli/lib/codegen.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/components.d.ts +1 -0
- package/dist/cjs-types/cli/lib/components.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploy2.d.ts +6 -0
- package/dist/cjs-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts +453 -0
- package/dist/cjs-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts +1 -2
- package/dist/cjs-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts +2 -0
- package/dist/cjs-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts +1 -0
- package/dist/cjs-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/run.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/utils/utils.d.ts +5 -5
- package/dist/cjs-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/nextjs/index.d.ts +6 -6
- package/dist/cjs-types/nextjs/index.d.ts.map +1 -1
- package/dist/cjs-types/react/client.d.ts +15 -15
- package/dist/cjs-types/react/client.d.ts.map +1 -1
- package/dist/cjs-types/react/hydration.d.ts +3 -3
- package/dist/cjs-types/react/hydration.d.ts.map +1 -1
- package/dist/cjs-types/react/queries_observer.d.ts +9 -9
- package/dist/cjs-types/react/queries_observer.d.ts.map +1 -1
- package/dist/cjs-types/react/use_paginated_query2.d.ts.map +1 -1
- package/dist/cjs-types/react/use_queries.d.ts +14 -6
- package/dist/cjs-types/react/use_queries.d.ts.map +1 -1
- package/dist/cjs-types/server/api.d.ts +157 -7
- package/dist/cjs-types/server/api.d.ts.map +1 -1
- package/dist/cjs-types/server/components/index.d.ts +2 -2
- package/dist/cjs-types/server/components/index.d.ts.map +1 -1
- package/dist/cjs-types/server/cron.d.ts +21 -20
- package/dist/cjs-types/server/cron.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/actions_impl.d.ts +4 -4
- package/dist/cjs-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/meta_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/scheduler_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/index.d.ts +1 -1
- package/dist/cjs-types/server/index.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cjs-types/server/registration.d.ts +7 -7
- package/dist/cjs-types/server/registration.d.ts.map +1 -1
- package/dist/cjs-types/server/scheduler.d.ts +9 -7
- package/dist/cjs-types/server/scheduler.d.ts.map +1 -1
- package/dist/cjs-types/server/schema.d.ts +1 -0
- package/dist/cjs-types/server/schema.d.ts.map +1 -1
- package/dist/cjs-types/values/validator.d.ts.map +1 -1
- package/dist/cjs-types/values/validators.d.ts +30 -0
- package/dist/cjs-types/values/validators.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +347 -133
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/browser/http_client.js.map +2 -2
- package/dist/esm/browser/query_options.js.map +2 -2
- package/dist/esm/browser/simple_client.js.map +2 -2
- package/dist/esm/browser/sync/optimistic_updates_impl.js.map +2 -2
- package/dist/esm/cli/codegen.js +2 -0
- package/dist/esm/cli/codegen.js.map +2 -2
- package/dist/esm/cli/deploy.js +1 -0
- package/dist/esm/cli/deploy.js.map +2 -2
- package/dist/esm/cli/docs.js +3 -43
- package/dist/esm/cli/docs.js.map +2 -2
- package/dist/esm/cli/lib/checkForLargeIndexDeletion.js +100 -60
- package/dist/esm/cli/lib/checkForLargeIndexDeletion.js.map +2 -2
- package/dist/esm/cli/lib/checkForSlowSchemaValidation.js +85 -0
- package/dist/esm/cli/lib/checkForSlowSchemaValidation.js.map +7 -0
- package/dist/esm/cli/lib/codegen.js.map +2 -2
- package/dist/esm/cli/lib/components.js +12 -0
- package/dist/esm/cli/lib/components.js.map +2 -2
- package/dist/esm/cli/lib/deploy2.js +30 -2
- package/dist/esm/cli/lib/deploy2.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/evaluateSchema.js +46 -0
- package/dist/esm/cli/lib/deployApi/evaluateSchema.js.map +7 -0
- package/dist/esm/cli/lib/deployApi/finishPush.js +1 -1
- package/dist/esm/cli/lib/deployApi/finishPush.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/startPush.js +1 -1
- package/dist/esm/cli/lib/deployApi/startPush.js.map +2 -2
- package/dist/esm/cli/lib/dev.js +1 -0
- package/dist/esm/cli/lib/dev.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/run.js +30 -2
- package/dist/esm/cli/lib/localDeployment/run.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/upgrade.js +4 -3
- package/dist/esm/cli/lib/localDeployment/upgrade.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/utils.js +3 -0
- package/dist/esm/cli/lib/localDeployment/utils.js.map +2 -2
- package/dist/esm/cli/lib/run.js +1 -0
- package/dist/esm/cli/lib/run.js.map +2 -2
- package/dist/esm/cli/lib/utils/utils.js +36 -30
- package/dist/esm/cli/lib/utils/utils.js.map +2 -2
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/nextjs/index.js.map +2 -2
- package/dist/esm/react/client.js.map +2 -2
- package/dist/esm/react/hydration.js +3 -1
- package/dist/esm/react/hydration.js.map +2 -2
- package/dist/esm/react/queries_observer.js +3 -1
- package/dist/esm/react/queries_observer.js.map +2 -2
- package/dist/esm/react/use_paginated_query2.js +3 -1
- package/dist/esm/react/use_paginated_query2.js.map +2 -2
- package/dist/esm/react/use_queries.js.map +2 -2
- package/dist/esm/server/api.js.map +2 -2
- package/dist/esm/server/components/index.js.map +2 -2
- package/dist/esm/server/cron.js +13 -11
- package/dist/esm/server/cron.js.map +2 -2
- package/dist/esm/server/impl/actions_impl.js.map +2 -2
- package/dist/esm/server/impl/meta_impl.js +9 -3
- package/dist/esm/server/impl/meta_impl.js.map +2 -2
- package/dist/esm/server/impl/scheduler_impl.js.map +2 -2
- package/dist/esm/server/index.js.map +2 -2
- package/dist/esm/server/schema.js +50 -3
- package/dist/esm/server/schema.js.map +2 -2
- package/dist/esm/values/validator.js +1 -1
- package/dist/esm/values/validator.js.map +2 -2
- package/dist/esm/values/validators.js +81 -25
- package/dist/esm/values/validators.js.map +2 -2
- package/dist/esm-types/browser/http_client.d.ts +5 -5
- package/dist/esm-types/browser/http_client.d.ts.map +1 -1
- package/dist/esm-types/browser/query_options.d.ts +2 -2
- package/dist/esm-types/browser/query_options.d.ts.map +1 -1
- package/dist/esm-types/browser/simple_client.d.ts +6 -6
- package/dist/esm-types/browser/simple_client.d.ts.map +1 -1
- package/dist/esm-types/browser/sync/optimistic_updates.d.ts +4 -4
- package/dist/esm-types/browser/sync/optimistic_updates.d.ts.map +1 -1
- package/dist/esm-types/browser/sync/optimistic_updates_impl.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen.d.ts.map +1 -1
- package/dist/esm-types/cli/docs.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts +26 -5
- package/dist/esm-types/cli/lib/checkForLargeIndexDeletion.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts +14 -0
- package/dist/esm-types/cli/lib/checkForSlowSchemaValidation.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/codegen.d.ts +1 -0
- package/dist/esm-types/cli/lib/codegen.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/components.d.ts +1 -0
- package/dist/esm-types/cli/lib/components.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploy2.d.ts +6 -0
- package/dist/esm-types/cli/lib/deploy2.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts +453 -0
- package/dist/esm-types/cli/lib/deployApi/evaluateSchema.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts +1 -2
- package/dist/esm-types/cli/lib/deployApi/finishPush.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/dev.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +2 -0
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts +2 -0
- package/dist/esm-types/cli/lib/localDeployment/run.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/upgrade.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts +1 -0
- package/dist/esm-types/cli/lib/localDeployment/utils.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/run.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/utils/utils.d.ts +5 -5
- package/dist/esm-types/cli/lib/utils/utils.d.ts.map +1 -1
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/nextjs/index.d.ts +6 -6
- package/dist/esm-types/nextjs/index.d.ts.map +1 -1
- package/dist/esm-types/react/client.d.ts +15 -15
- package/dist/esm-types/react/client.d.ts.map +1 -1
- package/dist/esm-types/react/hydration.d.ts +3 -3
- package/dist/esm-types/react/hydration.d.ts.map +1 -1
- package/dist/esm-types/react/queries_observer.d.ts +9 -9
- package/dist/esm-types/react/queries_observer.d.ts.map +1 -1
- package/dist/esm-types/react/use_paginated_query2.d.ts.map +1 -1
- package/dist/esm-types/react/use_queries.d.ts +14 -6
- package/dist/esm-types/react/use_queries.d.ts.map +1 -1
- package/dist/esm-types/server/api.d.ts +157 -7
- package/dist/esm-types/server/api.d.ts.map +1 -1
- package/dist/esm-types/server/components/index.d.ts +2 -2
- package/dist/esm-types/server/components/index.d.ts.map +1 -1
- package/dist/esm-types/server/cron.d.ts +21 -20
- package/dist/esm-types/server/cron.d.ts.map +1 -1
- package/dist/esm-types/server/impl/actions_impl.d.ts +4 -4
- package/dist/esm-types/server/impl/actions_impl.d.ts.map +1 -1
- package/dist/esm-types/server/impl/meta_impl.d.ts.map +1 -1
- package/dist/esm-types/server/impl/scheduler_impl.d.ts.map +1 -1
- package/dist/esm-types/server/index.d.ts +1 -1
- package/dist/esm-types/server/index.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/esm-types/server/registration.d.ts +7 -7
- package/dist/esm-types/server/registration.d.ts.map +1 -1
- package/dist/esm-types/server/scheduler.d.ts +9 -7
- package/dist/esm-types/server/scheduler.d.ts.map +1 -1
- package/dist/esm-types/server/schema.d.ts +1 -0
- package/dist/esm-types/server/schema.d.ts.map +1 -1
- package/dist/esm-types/values/validator.d.ts.map +1 -1
- package/dist/esm-types/values/validators.d.ts +30 -0
- package/dist/esm-types/values/validators.d.ts.map +1 -1
- package/dist/react.bundle.js +1 -1
- package/dist/react.bundle.js.map +2 -2
- package/package.json +5 -5
- package/src/browser/http_client.ts +43 -10
- package/src/browser/query_options.ts +11 -5
- package/src/browser/simple_client.ts +35 -14
- package/src/browser/sync/optimistic_updates.ts +17 -4
- package/src/browser/sync/optimistic_updates_impl.ts +17 -4
- package/src/cli/codegen.ts +1 -0
- package/src/cli/deploy.ts +1 -0
- package/src/cli/docs.ts +3 -44
- package/src/cli/lib/checkForLargeIndexDeletion.ts +154 -82
- package/src/cli/lib/checkForSlowSchemaValidation.ts +130 -0
- package/src/cli/lib/codegen.ts +1 -0
- package/src/cli/lib/components.ts +17 -0
- package/src/cli/lib/deploy2.ts +56 -1
- package/src/cli/lib/deployApi/evaluateSchema.ts +62 -0
- package/src/cli/lib/deployApi/finishPush.ts +1 -1
- package/src/cli/lib/deployApi/startPush.ts +1 -1
- package/src/cli/lib/dev.ts +1 -0
- package/src/cli/lib/generatedFunctionLogsApi.ts +2 -0
- package/src/cli/lib/localDeployment/run.ts +44 -2
- package/src/cli/lib/localDeployment/upgrade.ts +4 -6
- package/src/cli/lib/localDeployment/utils.ts +6 -0
- package/src/cli/lib/run.ts +1 -0
- package/src/cli/lib/utils/utils.ts +63 -35
- package/src/index.ts +1 -1
- package/src/nextjs/index.ts +19 -8
- package/src/react/client.ts +73 -30
- package/src/react/hydration.tsx +14 -6
- package/src/react/queries_observer.ts +19 -16
- package/src/react/use_paginated_query2.ts +10 -6
- package/src/react/use_queries.ts +23 -7
- package/src/server/api.ts +220 -14
- package/src/server/components/index.ts +4 -6
- package/src/server/cron.ts +34 -24
- package/src/server/impl/actions_impl.ts +13 -4
- package/src/server/impl/meta_impl.ts +8 -1
- package/src/server/impl/scheduler_impl.ts +13 -6
- package/src/server/index.ts +1 -0
- package/src/server/meta.ts +25 -0
- package/src/server/registration.ts +28 -7
- package/src/server/scheduler.ts +22 -7
- package/src/server/schema.ts +55 -0
- package/src/values/validator.ts +3 -1
- package/src/values/validators.ts +84 -26
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/localDeployment/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n suggestedPorts,\n startPort,\n }: {\n count: number;\n /** Ports that must mandatorily be used when provided. */\n requestedPorts?: Array<number | null>;\n /** Ports that will be tried preferentially when provided, but are not required. */\n suggestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const suggestedPort = suggestedPorts?.[ports.length] ?? null;\n if (suggestedPort !== null) {\n const port = await detect(suggestedPort);\n if (port === suggestedPort) {\n ports.push(suggestedPort);\n continue;\n }\n }\n\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function chooseLocalBackendPorts(\n ctx: Context,\n options?: {\n suggestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n requestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n },\n): Promise<{ cloudPort: number; sitePort: number }> {\n const { suggestedPorts, requestedPorts } = options ?? {};\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [\n requestedPorts?.cloud ?? null,\n requestedPorts?.site ?? null,\n ],\n suggestedPorts: [\n suggestedPorts?.cloud ?? null,\n suggestedPorts?.site ?? null,\n ],\n });\n return { cloudPort, sitePort };\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n"],
|
|
5
|
-
"mappings": ";AACA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAE5B,sBAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,MAAM,OAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,gBAAgB,iBAAiB,MAAM,MAAM,KAAK;AACxD,UAAI,kBAAkB,MAAM;AAC1B,cAAMA,QAAO,MAAM,OAAO,aAAa;AACvC,YAAIA,UAAS,eAAe;AAC1B,gBAAM,KAAK,aAAa;AACxB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,MAAM,OAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,sBAAsB,wBACpB,KACA,SAQkD;AAClD,QAAM,EAAE,gBAAgB,eAAe,IAAI,WAAW,CAAC;AAEvD,QAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,YAAY,KAAK;AAAA,IACnD,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,IACA,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AACD,SAAO,EAAE,WAAW,SAAS;AAC/B;AAEO,gBAAS,qCAAqC;AACnD;AAAA,IACE,YAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,aAAM,gCACX;",
|
|
4
|
+
"sourcesContent": ["import { Context } from \"../../../bundler/context.js\";\nimport { logMessage } from \"../../../bundler/log.js\";\nimport { detect } from \"detect-port\";\nimport { chalkStderr } from \"chalk\";\n\nexport async function choosePorts(\n ctx: Context,\n {\n count,\n requestedPorts,\n suggestedPorts,\n startPort,\n }: {\n count: number;\n /** Ports that must mandatorily be used when provided. */\n requestedPorts?: Array<number | null>;\n /** Ports that will be tried preferentially when provided, but are not required. */\n suggestedPorts?: Array<number | null>;\n startPort: number;\n },\n): Promise<Array<number>> {\n const ports: Array<number> = [];\n for (let i = 0; i < count; i++) {\n const requestedPort = requestedPorts?.[i];\n if (requestedPort !== null) {\n const port = await detect(requestedPort);\n if (port !== requestedPort) {\n return ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Requested port ${requestedPort} is not available`,\n });\n }\n ports.push(port);\n } else {\n const suggestedPort = suggestedPorts?.[ports.length] ?? null;\n if (suggestedPort !== null) {\n const port = await detect(suggestedPort);\n if (port === suggestedPort) {\n ports.push(suggestedPort);\n continue;\n }\n }\n\n const portToTry =\n ports.length > 0 ? ports[ports.length - 1] + 1 : startPort;\n const port = await detect(portToTry);\n ports.push(port);\n }\n }\n return ports;\n}\n\nexport async function chooseLocalBackendPorts(\n ctx: Context,\n options?: {\n suggestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n requestedPorts?:\n | { cloud?: number | undefined; site?: number | undefined }\n | undefined;\n },\n): Promise<{ cloudPort: number; sitePort: number }> {\n const { suggestedPorts, requestedPorts } = options ?? {};\n\n const [cloudPort, sitePort] = await choosePorts(ctx, {\n count: 2,\n startPort: 3210,\n requestedPorts: [\n requestedPorts?.cloud ?? null,\n requestedPorts?.site ?? null,\n ],\n suggestedPorts: [\n suggestedPorts?.cloud ?? null,\n suggestedPorts?.site ?? null,\n ],\n });\n return { cloudPort, sitePort };\n}\n\nexport function printLocalDeploymentWelcomeMessage() {\n logMessage(\n chalkStderr.cyan(\"You're trying out the beta local deployment feature!\"),\n );\n logMessage(\n chalkStderr.cyan(\n \"To learn more, read the docs: https://docs.convex.dev/cli/local-deployments\",\n ),\n );\n}\n\nexport const LOCAL_BACKEND_INSTANCE_SECRET =\n \"4361726e697461732c206c69746572616c6c79206d65616e696e6720226c6974\";\n\n// Backend releases are tagged `precompiled-YYYY-MM-DD-<commit>`, so the dates\n// sort lexicographically.\nexport function releaseDate(version: string): string | null {\n return /^precompiled-(\\d{4}-\\d{2}-\\d{2})-/.exec(version)?.[1] ?? null;\n}\n"],
|
|
5
|
+
"mappings": ";AACA,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAE5B,sBAAsB,YACpB,KACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQwB;AACxB,QAAM,QAAuB,CAAC;AAC9B,WAAS,IAAI,GAAG,IAAI,OAAO,KAAK;AAC9B,UAAM,gBAAgB,iBAAiB,CAAC;AACxC,QAAI,kBAAkB,MAAM;AAC1B,YAAM,OAAO,MAAM,OAAO,aAAa;AACvC,UAAI,SAAS,eAAe;AAC1B,eAAO,IAAI,MAAM;AAAA,UACf,UAAU;AAAA,UACV,WAAW;AAAA,UACX,gBAAgB,kBAAkB,aAAa;AAAA,QACjD,CAAC;AAAA,MACH;AACA,YAAM,KAAK,IAAI;AAAA,IACjB,OAAO;AACL,YAAM,gBAAgB,iBAAiB,MAAM,MAAM,KAAK;AACxD,UAAI,kBAAkB,MAAM;AAC1B,cAAMA,QAAO,MAAM,OAAO,aAAa;AACvC,YAAIA,UAAS,eAAe;AAC1B,gBAAM,KAAK,aAAa;AACxB;AAAA,QACF;AAAA,MACF;AAEA,YAAM,YACJ,MAAM,SAAS,IAAI,MAAM,MAAM,SAAS,CAAC,IAAI,IAAI;AACnD,YAAM,OAAO,MAAM,OAAO,SAAS;AACnC,YAAM,KAAK,IAAI;AAAA,IACjB;AAAA,EACF;AACA,SAAO;AACT;AAEA,sBAAsB,wBACpB,KACA,SAQkD;AAClD,QAAM,EAAE,gBAAgB,eAAe,IAAI,WAAW,CAAC;AAEvD,QAAM,CAAC,WAAW,QAAQ,IAAI,MAAM,YAAY,KAAK;AAAA,IACnD,OAAO;AAAA,IACP,WAAW;AAAA,IACX,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,IACA,gBAAgB;AAAA,MACd,gBAAgB,SAAS;AAAA,MACzB,gBAAgB,QAAQ;AAAA,IAC1B;AAAA,EACF,CAAC;AACD,SAAO,EAAE,WAAW,SAAS;AAC/B;AAEO,gBAAS,qCAAqC;AACnD;AAAA,IACE,YAAY,KAAK,sDAAsD;AAAA,EACzE;AACA;AAAA,IACE,YAAY;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEO,aAAM,gCACX;AAIK,gBAAS,YAAY,SAAgC;AAC1D,SAAO,oCAAoC,KAAK,OAAO,IAAI,CAAC,KAAK;AACnE;",
|
|
6
6
|
"names": ["port"]
|
|
7
7
|
}
|
package/dist/esm/cli/lib/run.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/lib/run.ts"],
|
|
4
|
-
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport util from \"util\";\nimport ws from \"ws\";\nimport { ConvexHttpClient } from \"../../browser/http_client.js\";\nimport { BaseConvexClient } from \"../../browser/index.js\";\nimport {\n PaginationResult,\n UserIdentityAttributes,\n makeFunctionReference,\n} from \"../../server/index.js\";\nimport { Value, convexToJson, jsonToConvex } from \"../../values/value.js\";\nimport { Context, OneoffCtx } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage, logOutput } from \"../../bundler/log.js\";\nimport {\n permissionDeniedErrorMessage,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport JSON5 from \"json5\";\nimport path from \"path\";\nimport { readProjectConfig } from \"./config.js\";\nimport { watchAndPush } from \"./dev.js\";\nimport { Logger, DefaultLogger } from \"../../browser/logging.js\";\n\nexport async function runFunctionAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath?: string | undefined;\n callbacks?:\n | {\n onSuccess?: () => void | undefined;\n }\n | undefined;\n },\n) {\n const client = new ConvexHttpClient(args.deploymentUrl, {\n logger: instantiateStderrLogger(),\n });\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n client.setAdminAuth(args.adminKey, identity);\n\n const functionArgs = await parseArgs(ctx, args.argsString);\n const { projectConfig } = await readProjectConfig(ctx);\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n let result: Value;\n try {\n result = await client.function(\n makeFunctionReference(parsedFunctionName),\n args.componentPath,\n functionArgs,\n );\n } catch (err) {\n const errorMessage = (err as Error).toString().trim();\n\n const permissionError = permissionDeniedErrorMessage(errorMessage);\n if (permissionError !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(permissionError),\n });\n }\n\n if (errorMessage.includes(\"Could not find function\")) {\n const functions = (await runSystemQuery(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n functionName: \"_system/cli/modules:apiSpec\",\n componentPath: args.componentPath,\n args: {},\n })) as (\n | {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n }\n | {\n functionType: \"HttpAction\";\n }\n )[];\n\n const functionNames = functions\n .filter(\n (\n fn,\n ): fn is {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n } => fn.functionType !== \"HttpAction\",\n )\n .map(({ identifier }) => {\n const separatorPos = identifier.indexOf(\":\");\n\n const path =\n separatorPos === -1\n ? \"\"\n : identifier.substring(0, separatorPos).replace(/\\.js$/, \"\");\n const name =\n separatorPos === -1\n ? identifier\n : identifier.substring(separatorPos + 1);\n\n return `\u2022 ${chalkStderr.gray(`${path}:`)}${name}`;\n });\n\n const availableFunctionsMessage =\n functionNames.length > 0\n ? `Available functions:\\n${functionNames.join(\"\\n\")}`\n : \"No functions found.\";\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}\\n\\n${availableFunctionsMessage}`,\n });\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}`,\n });\n }\n\n args.callbacks?.onSuccess?.();\n\n // `null` is the default return type\n if (result !== null) {\n logOutput(formatValue(result));\n }\n}\n\nasync function getFakeIdentity(ctx: Context, identityString: string) {\n let identity: UserIdentityAttributes;\n try {\n identity = JSON5.parse(identityString);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Failed to parse identity as JSON: \"${identityString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n const subject = identity.subject ?? \"\" + simpleHash(JSON.stringify(identity));\n const issuer = identity.issuer ?? \"https://convex.test\";\n const tokenIdentifier =\n identity.tokenIdentifier ?? `${issuer.toString()}|${subject.toString()}`;\n return {\n ...identity,\n subject,\n issuer,\n tokenIdentifier,\n };\n}\n\nexport async function parseArgs(ctx: Context, argsString: string) {\n try {\n const argsJson = JSON5.parse(argsString);\n return jsonToConvex(argsJson) as Record<string, Value>;\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to parse arguments as JSON: \"${argsString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n}\n\nexport async function parseFunctionName(\n ctx: Context,\n functionName: string,\n // Usually `convex/` -- should contain trailing slash\n functionDirName: string,\n) {\n // api.foo.bar -> foo:bar\n // foo/bar -> foo/bar:default\n // foo/bar:baz -> foo/bar:baz\n // convex/foo/bar -> foo/bar:default\n\n // This is the `api.foo.bar` format\n if (functionName.startsWith(\"api.\") || functionName.startsWith(\"internal.\")) {\n const parts = functionName.split(\".\");\n if (parts.length < 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function name has too few parts: \"${functionName}\"`,\n });\n }\n const exportName = parts.pop();\n const parsedName = `${parts.slice(1).join(\"/\")}:${exportName}`;\n return parsedName;\n }\n\n // This is the `foo/bar:baz` format\n\n // This is something like `convex/foo/bar`, which could either be addressing `foo/bar:default` or `convex/foo/bar:default`\n // if there's a directory with the same name as the functions directory nested directly underneath.\n // We'll prefer the `convex/foo/bar:default` version, and check if the file exists, and otherwise treat this as a relative path from the project root.\n const filePath = functionName.split(\":\")[0];\n const possibleExtensions = [\n \".ts\",\n \".js\",\n \".tsx\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n ];\n let hasExtension = false;\n let normalizedFilePath: string = filePath;\n for (const extension of possibleExtensions) {\n if (filePath.endsWith(extension)) {\n normalizedFilePath = filePath.slice(0, -extension.length);\n hasExtension = true;\n break;\n }\n }\n\n const exportName = functionName.split(\":\")[1] ?? \"default\";\n const normalizedName = `${normalizedFilePath}:${exportName}`;\n\n // This isn't a relative path from the project root\n if (!filePath.startsWith(functionDirName)) {\n return normalizedName;\n }\n\n const filePathWithoutPrefix = normalizedFilePath.slice(\n functionDirName.length,\n );\n const functionNameWithoutPrefix = `${filePathWithoutPrefix}:${exportName}`;\n\n if (hasExtension) {\n if (ctx.fs.exists(path.join(functionDirName, filePath))) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n } else {\n const exists = possibleExtensions.some((extension) =>\n ctx.fs.exists(path.join(functionDirName, filePath + extension)),\n );\n if (exists) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n }\n}\n\nfunction simpleHash(string: string) {\n let hash = 0;\n for (let i = 0; i < string.length; i++) {\n const char = string.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\nexport async function runSystemPaginatedQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n limit?: number;\n },\n) {\n const results = [];\n let cursor = null;\n let isDone = false;\n while (!isDone && (args.limit === undefined || results.length < args.limit)) {\n const paginationResult = (await runSystemQuery(ctx, {\n ...args,\n args: {\n ...args.args,\n paginationOpts: {\n cursor,\n numItems:\n args.limit === undefined ? 10000 : args.limit - results.length,\n },\n },\n })) as unknown as PaginationResult<Record<string, Value>>;\n isDone = paginationResult.isDone;\n cursor = paginationResult.continueCursor;\n results.push(...paginationResult.page);\n }\n return results;\n}\n\nexport async function runSystemQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n },\n): Promise<Value> {\n let onResult: (result: Value) => void;\n const resultPromise = new Promise<Value>((resolve) => {\n onResult = resolve;\n });\n const [donePromise, onDone] = waitUntilCalled();\n await subscribe(ctx, {\n ...args,\n parsedFunctionName: args.functionName,\n parsedFunctionArgs: args.args,\n until: donePromise,\n callbacks: {\n onChange: (result) => {\n onDone();\n onResult(result);\n },\n },\n });\n return resultPromise;\n}\n\nexport function formatValue(value: Value) {\n const json = convexToJson(value);\n if (process.stdout.isTTY) {\n // TODO (Tom) add JSON syntax highlighting like https://stackoverflow.com/a/51319962/398212\n // until then, just spit out something that isn't quite JSON because it's easy\n return util.inspect(value, { colors: true, depth: null });\n } else {\n return JSON.stringify(json, null, 2);\n }\n}\n\nexport async function subscribeAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath: string | undefined;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n const functionArgs = await parseArgs(ctx, args.argsString);\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n identity,\n parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: waitForever(),\n callbacks: {\n onStart() {\n logFinishedStep(\n `Watching query ${args.functionName} on ${args.deploymentUrl}...`,\n );\n },\n onChange(result) {\n logOutput(formatValue(result));\n },\n onStop() {\n logMessage(`Closing connection to ${args.deploymentUrl}...`);\n },\n },\n });\n}\n\nexport async function subscribe(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n identity?: UserIdentityAttributes | undefined;\n parsedFunctionName: string;\n parsedFunctionArgs: Record<string, Value>;\n componentPath: string | undefined;\n until: Promise<unknown>;\n callbacks?:\n | {\n onStart?: () => void;\n onChange?: (result: Value) => void;\n onStop?: () => void;\n }\n | undefined;\n },\n) {\n const client = new BaseConvexClient(\n args.deploymentUrl,\n (updatedQueries) => {\n for (const queryToken of updatedQueries) {\n let result: Value;\n try {\n result = client.localQueryResultByToken(queryToken)!;\n } catch (err) {\n // A failed query (e.g. a permission error) throws here. Surface\n // permission errors cleanly instead of an uncaught stack trace, and\n // let any other error propagate as before.\n const permissionError = permissionDeniedErrorMessage(\n (err as Error).toString(),\n );\n if (permissionError !== null) {\n void ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(permissionError),\n });\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n args.callbacks?.onChange?.(result);\n }\n },\n {\n // pretend that a Node.js 'ws' library WebSocket is a browser WebSocket\n webSocketConstructor: ws as unknown as typeof WebSocket,\n unsavedChangesWarning: false,\n },\n );\n client.setAdminAuth(args.adminKey, args.identity);\n const { unsubscribe } = client.subscribe(\n args.parsedFunctionName,\n args.parsedFunctionArgs,\n {\n componentPath: args.componentPath,\n },\n );\n\n args.callbacks?.onStart?.();\n\n let done = false;\n const [donePromise, onDone] = waitUntilCalled();\n const stopWatching = () => {\n if (done) {\n return;\n }\n done = true;\n unsubscribe();\n void client.close();\n process.off(\"SIGINT\", sigintListener);\n onDone();\n args.callbacks?.onStop?.();\n };\n function sigintListener() {\n stopWatching();\n }\n process.on(\"SIGINT\", sigintListener);\n void args.until.finally(stopWatching);\n while (!done) {\n // loops once per day (any large value < 2**31 would work)\n const oneDay = 24 * 60 * 60 * 1000;\n await Promise.race([\n donePromise,\n new Promise((resolve) => setTimeout(resolve, oneDay)),\n ]);\n }\n}\n\nexport async function runInDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n push: boolean;\n watch: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n componentPath: string | undefined;\n liveComponentSources: boolean;\n },\n) {\n if (args.push) await pushToDeployment(ctx, args);\n\n if (args.watch) {\n return await subscribeAndLog(ctx, args);\n }\n return await runFunctionAndLog(ctx, args);\n}\n\nexport async function pushToDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n liveComponentSources: boolean;\n },\n) {\n await watchAndPush(\n ctx,\n {\n url: args.deploymentUrl,\n adminKey: args.adminKey,\n deploymentName: args.deploymentName,\n verbose: false,\n dryRun: false,\n typecheck: args.typecheck,\n typecheckComponents: args.typecheckComponents,\n debug: false,\n debugNodeApis: false,\n codegen: args.codegen,\n liveComponentSources: args.liveComponentSources,\n pushAllModules: false,\n largeIndexDeletionCheck: \"no verification\", // `convex run` can\u2019t push to prod\n message: null,\n },\n {\n once: true,\n traceEvents: false,\n untilSuccess: true,\n },\n );\n}\n\nfunction instantiateStderrLogger(): Logger {\n const logger = new DefaultLogger({ verbose: false });\n logger.addLogLineListener((_level, ...args) => {\n // eslint-disable-next-line no-console\n console.error(...args);\n });\n return logger;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { chalkStderr } from \"chalk\";\nimport util from \"util\";\nimport ws from \"ws\";\nimport { ConvexHttpClient } from \"../../browser/http_client.js\";\nimport { BaseConvexClient } from \"../../browser/index.js\";\nimport {\n PaginationResult,\n UserIdentityAttributes,\n makeFunctionReference,\n} from \"../../server/index.js\";\nimport { Value, convexToJson, jsonToConvex } from \"../../values/value.js\";\nimport { Context, OneoffCtx } from \"../../bundler/context.js\";\nimport { logFinishedStep, logMessage, logOutput } from \"../../bundler/log.js\";\nimport {\n permissionDeniedErrorMessage,\n waitForever,\n waitUntilCalled,\n} from \"./utils/utils.js\";\nimport JSON5 from \"json5\";\nimport path from \"path\";\nimport { readProjectConfig } from \"./config.js\";\nimport { watchAndPush } from \"./dev.js\";\nimport { Logger, DefaultLogger } from \"../../browser/logging.js\";\n\nexport async function runFunctionAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath?: string | undefined;\n callbacks?:\n | {\n onSuccess?: () => void | undefined;\n }\n | undefined;\n },\n) {\n const client = new ConvexHttpClient(args.deploymentUrl, {\n logger: instantiateStderrLogger(),\n });\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n client.setAdminAuth(args.adminKey, identity);\n\n const functionArgs = await parseArgs(ctx, args.argsString);\n const { projectConfig } = await readProjectConfig(ctx);\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n let result: Value;\n try {\n result = await client.function(\n makeFunctionReference(parsedFunctionName),\n args.componentPath,\n functionArgs,\n );\n } catch (err) {\n const errorMessage = (err as Error).toString().trim();\n\n const permissionError = permissionDeniedErrorMessage(errorMessage);\n if (permissionError !== null) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(permissionError),\n });\n }\n\n if (errorMessage.includes(\"Could not find function\")) {\n const functions = (await runSystemQuery(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n functionName: \"_system/cli/modules:apiSpec\",\n componentPath: args.componentPath,\n args: {},\n })) as (\n | {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n }\n | {\n functionType: \"HttpAction\";\n }\n )[];\n\n const functionNames = functions\n .filter(\n (\n fn,\n ): fn is {\n functionType: \"Query\" | \"Mutation\" | \"Action\";\n identifier: string;\n } => fn.functionType !== \"HttpAction\",\n )\n .map(({ identifier }) => {\n const separatorPos = identifier.indexOf(\":\");\n\n const path =\n separatorPos === -1\n ? \"\"\n : identifier.substring(0, separatorPos).replace(/\\.js$/, \"\");\n const name =\n separatorPos === -1\n ? identifier\n : identifier.substring(separatorPos + 1);\n\n return `\u2022 ${chalkStderr.gray(`${path}:`)}${name}`;\n });\n\n const availableFunctionsMessage =\n functionNames.length > 0\n ? `Available functions:\\n${functionNames.join(\"\\n\")}`\n : \"No functions found.\";\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}\\n\\n${availableFunctionsMessage}`,\n });\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to run function \"${args.functionName}\":\\n${chalkStderr.red(errorMessage)}`,\n });\n }\n\n args.callbacks?.onSuccess?.();\n\n // `null` is the default return type\n if (result !== null) {\n logOutput(formatValue(result));\n }\n}\n\nasync function getFakeIdentity(ctx: Context, identityString: string) {\n let identity: UserIdentityAttributes;\n try {\n identity = JSON5.parse(identityString);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Failed to parse identity as JSON: \"${identityString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n const subject = identity.subject ?? \"\" + simpleHash(JSON.stringify(identity));\n const issuer = identity.issuer ?? \"https://convex.test\";\n const tokenIdentifier =\n identity.tokenIdentifier ?? `${issuer.toString()}|${subject.toString()}`;\n return {\n ...identity,\n subject,\n issuer,\n tokenIdentifier,\n };\n}\n\nexport async function parseArgs(ctx: Context, argsString: string) {\n try {\n const argsJson = JSON5.parse(argsString);\n return jsonToConvex(argsJson) as Record<string, Value>;\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem or env vars\",\n printedMessage: `Failed to parse arguments as JSON: \"${argsString}\"\\n${chalkStderr.red((err as Error).toString().trim())}`,\n });\n }\n}\n\nexport async function parseFunctionName(\n ctx: Context,\n functionName: string,\n // Usually `convex/` -- should contain trailing slash\n functionDirName: string,\n) {\n // api.foo.bar -> foo:bar\n // foo/bar -> foo/bar:default\n // foo/bar:baz -> foo/bar:baz\n // convex/foo/bar -> foo/bar:default\n\n // This is the `api.foo.bar` format\n if (functionName.startsWith(\"api.\") || functionName.startsWith(\"internal.\")) {\n const parts = functionName.split(\".\");\n if (parts.length < 3) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function name has too few parts: \"${functionName}\"`,\n });\n }\n const exportName = parts.pop();\n const parsedName = `${parts.slice(1).join(\"/\")}:${exportName}`;\n return parsedName;\n }\n\n // This is the `foo/bar:baz` format\n\n // This is something like `convex/foo/bar`, which could either be addressing `foo/bar:default` or `convex/foo/bar:default`\n // if there's a directory with the same name as the functions directory nested directly underneath.\n // We'll prefer the `convex/foo/bar:default` version, and check if the file exists, and otherwise treat this as a relative path from the project root.\n const filePath = functionName.split(\":\")[0];\n const possibleExtensions = [\n \".ts\",\n \".js\",\n \".tsx\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n ];\n let hasExtension = false;\n let normalizedFilePath: string = filePath;\n for (const extension of possibleExtensions) {\n if (filePath.endsWith(extension)) {\n normalizedFilePath = filePath.slice(0, -extension.length);\n hasExtension = true;\n break;\n }\n }\n\n const exportName = functionName.split(\":\")[1] ?? \"default\";\n const normalizedName = `${normalizedFilePath}:${exportName}`;\n\n // This isn't a relative path from the project root\n if (!filePath.startsWith(functionDirName)) {\n return normalizedName;\n }\n\n const filePathWithoutPrefix = normalizedFilePath.slice(\n functionDirName.length,\n );\n const functionNameWithoutPrefix = `${filePathWithoutPrefix}:${exportName}`;\n\n if (hasExtension) {\n if (ctx.fs.exists(path.join(functionDirName, filePath))) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n } else {\n const exists = possibleExtensions.some((extension) =>\n ctx.fs.exists(path.join(functionDirName, filePath + extension)),\n );\n if (exists) {\n return normalizedName;\n } else {\n return functionNameWithoutPrefix;\n }\n }\n}\n\nfunction simpleHash(string: string) {\n let hash = 0;\n for (let i = 0; i < string.length; i++) {\n const char = string.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n}\n\nexport async function runSystemPaginatedQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n limit?: number;\n },\n) {\n const results = [];\n let cursor = null;\n let isDone = false;\n while (!isDone && (args.limit === undefined || results.length < args.limit)) {\n const paginationResult = (await runSystemQuery(ctx, {\n ...args,\n args: {\n ...args.args,\n paginationOpts: {\n cursor,\n numItems:\n args.limit === undefined ? 10000 : args.limit - results.length,\n },\n },\n })) as unknown as PaginationResult<Record<string, Value>>;\n isDone = paginationResult.isDone;\n cursor = paginationResult.continueCursor;\n results.push(...paginationResult.page);\n }\n return results;\n}\n\nexport async function runSystemQuery(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n componentPath: string | undefined;\n args: Record<string, Value>;\n },\n): Promise<Value> {\n let onResult: (result: Value) => void;\n const resultPromise = new Promise<Value>((resolve) => {\n onResult = resolve;\n });\n const [donePromise, onDone] = waitUntilCalled();\n await subscribe(ctx, {\n ...args,\n parsedFunctionName: args.functionName,\n parsedFunctionArgs: args.args,\n until: donePromise,\n callbacks: {\n onChange: (result) => {\n onDone();\n onResult(result);\n },\n },\n });\n return resultPromise;\n}\n\nexport function formatValue(value: Value) {\n const json = convexToJson(value);\n if (process.stdout.isTTY) {\n // TODO (Tom) add JSON syntax highlighting like https://stackoverflow.com/a/51319962/398212\n // until then, just spit out something that isn't quite JSON because it's easy\n return util.inspect(value, { colors: true, depth: null });\n } else {\n return JSON.stringify(json, null, 2);\n }\n}\n\nexport async function subscribeAndLog(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n componentPath: string | undefined;\n },\n) {\n const { projectConfig } = await readProjectConfig(ctx);\n\n const parsedFunctionName = await parseFunctionName(\n ctx,\n args.functionName,\n projectConfig.functions,\n );\n const identity = args.identityString\n ? await getFakeIdentity(ctx, args.identityString)\n : undefined;\n const functionArgs = await parseArgs(ctx, args.argsString);\n return subscribe(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n identity,\n parsedFunctionName,\n parsedFunctionArgs: functionArgs,\n componentPath: args.componentPath,\n until: waitForever(),\n callbacks: {\n onStart() {\n logFinishedStep(\n `Watching query ${args.functionName} on ${args.deploymentUrl}...`,\n );\n },\n onChange(result) {\n logOutput(formatValue(result));\n },\n onStop() {\n logMessage(`Closing connection to ${args.deploymentUrl}...`);\n },\n },\n });\n}\n\nexport async function subscribe(\n ctx: Context,\n args: {\n deploymentUrl: string;\n adminKey: string;\n identity?: UserIdentityAttributes | undefined;\n parsedFunctionName: string;\n parsedFunctionArgs: Record<string, Value>;\n componentPath: string | undefined;\n until: Promise<unknown>;\n callbacks?:\n | {\n onStart?: () => void;\n onChange?: (result: Value) => void;\n onStop?: () => void;\n }\n | undefined;\n },\n) {\n const client = new BaseConvexClient(\n args.deploymentUrl,\n (updatedQueries) => {\n for (const queryToken of updatedQueries) {\n let result: Value;\n try {\n result = client.localQueryResultByToken(queryToken)!;\n } catch (err) {\n // A failed query (e.g. a permission error) throws here. Surface\n // permission errors cleanly instead of an uncaught stack trace, and\n // let any other error propagate as before.\n const permissionError = permissionDeniedErrorMessage(\n (err as Error).toString(),\n );\n if (permissionError !== null) {\n void ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(permissionError),\n });\n return;\n }\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n args.callbacks?.onChange?.(result);\n }\n },\n {\n // pretend that a Node.js 'ws' library WebSocket is a browser WebSocket\n webSocketConstructor: ws as unknown as typeof WebSocket,\n unsavedChangesWarning: false,\n },\n );\n client.setAdminAuth(args.adminKey, args.identity);\n const { unsubscribe } = client.subscribe(\n args.parsedFunctionName,\n args.parsedFunctionArgs,\n {\n componentPath: args.componentPath,\n },\n );\n\n args.callbacks?.onStart?.();\n\n let done = false;\n const [donePromise, onDone] = waitUntilCalled();\n const stopWatching = () => {\n if (done) {\n return;\n }\n done = true;\n unsubscribe();\n void client.close();\n process.off(\"SIGINT\", sigintListener);\n onDone();\n args.callbacks?.onStop?.();\n };\n function sigintListener() {\n stopWatching();\n }\n process.on(\"SIGINT\", sigintListener);\n void args.until.finally(stopWatching);\n while (!done) {\n // loops once per day (any large value < 2**31 would work)\n const oneDay = 24 * 60 * 60 * 1000;\n await Promise.race([\n donePromise,\n new Promise((resolve) => setTimeout(resolve, oneDay)),\n ]);\n }\n}\n\nexport async function runInDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n functionName: string;\n argsString: string;\n identityString?: string | undefined;\n push: boolean;\n watch: boolean;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n componentPath: string | undefined;\n liveComponentSources: boolean;\n },\n) {\n if (args.push) await pushToDeployment(ctx, args);\n\n if (args.watch) {\n return await subscribeAndLog(ctx, args);\n }\n return await runFunctionAndLog(ctx, args);\n}\n\nexport async function pushToDeployment(\n ctx: OneoffCtx,\n args: {\n deploymentUrl: string;\n adminKey: string;\n deploymentName: string | null;\n typecheck: \"enable\" | \"try\" | \"disable\";\n typecheckComponents: boolean;\n codegen: boolean;\n liveComponentSources: boolean;\n },\n) {\n await watchAndPush(\n ctx,\n {\n url: args.deploymentUrl,\n adminKey: args.adminKey,\n deploymentName: args.deploymentName,\n verbose: false,\n dryRun: false,\n typecheck: args.typecheck,\n typecheckComponents: args.typecheckComponents,\n debug: false,\n debugNodeApis: false,\n codegen: args.codegen,\n liveComponentSources: args.liveComponentSources,\n pushAllModules: false,\n largeIndexDeletionCheck: \"no verification\", // `convex run` can\u2019t push to prod\n warnOnSlowSchemaValidation: true,\n message: null,\n },\n {\n once: true,\n traceEvents: false,\n untilSuccess: true,\n },\n );\n}\n\nfunction instantiateStderrLogger(): Logger {\n const logger = new DefaultLogger({ verbose: false });\n logger.addLogLineListener((_level, ...args) => {\n // eslint-disable-next-line no-console\n console.error(...args);\n });\n return logger;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path", "exportName"]
|
|
7
7
|
}
|
|
@@ -631,32 +631,21 @@ export function waitUntilCalled() {
|
|
|
631
631
|
const waitPromise = new Promise((resolve) => onCalled = resolve);
|
|
632
632
|
return [waitPromise, () => onCalled(null)];
|
|
633
633
|
}
|
|
634
|
-
const BYTE_UNITS = [
|
|
635
|
-
[1 << 30, "GiB"],
|
|
636
|
-
[1e9, "GB"],
|
|
637
|
-
[1 << 20, "MiB"],
|
|
638
|
-
[1e6, "MB"],
|
|
639
|
-
[1 << 10, "KiB"],
|
|
640
|
-
[1e3, "KB"]
|
|
641
|
-
];
|
|
634
|
+
const BYTE_UNITS = ["bytes", "KiB", "MiB", "GiB", "TiB", "PiB"];
|
|
642
635
|
export function formatSize(n) {
|
|
643
|
-
|
|
644
|
-
|
|
636
|
+
let value = n;
|
|
637
|
+
let unitIndex = 0;
|
|
638
|
+
while (value >= 1024 && unitIndex < BYTE_UNITS.length - 1) {
|
|
639
|
+
value /= 1024;
|
|
640
|
+
unitIndex++;
|
|
645
641
|
}
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
if (n % unitSize === 0) {
|
|
651
|
-
return `${n / unitSize} ${unitName}`;
|
|
652
|
-
}
|
|
653
|
-
if (n * 10 % unitSize === 0) {
|
|
654
|
-
const whole = Math.floor(n / unitSize);
|
|
655
|
-
const frac = Math.floor(n * 10 / unitSize) % 10;
|
|
656
|
-
return `${whole}.${frac} ${unitName}`;
|
|
657
|
-
}
|
|
642
|
+
const roundedValue = Number(value.toFixed(1));
|
|
643
|
+
if (roundedValue >= 1024 && unitIndex < BYTE_UNITS.length - 1) {
|
|
644
|
+
value /= 1024;
|
|
645
|
+
unitIndex++;
|
|
658
646
|
}
|
|
659
|
-
|
|
647
|
+
const formatted = value.toFixed(1).replace(/\.0$/, "");
|
|
648
|
+
return `${formatted} ${BYTE_UNITS[unitIndex]}`;
|
|
660
649
|
}
|
|
661
650
|
export function formatDuration(ms) {
|
|
662
651
|
const twoDigits = (n, unit) => `${n.toLocaleString("en-US", { maximumFractionDigits: 2 })}${unit}`;
|
|
@@ -780,13 +769,13 @@ export function spawnAsync(_ctx, command, args, options) {
|
|
|
780
769
|
});
|
|
781
770
|
}
|
|
782
771
|
const IDEMPOTENT_METHODS = ["GET", "HEAD", "PUT", "DELETE", "OPTIONS", "TRACE"];
|
|
783
|
-
function retryDelay(attempt, _error, _response) {
|
|
772
|
+
export function retryDelay(attempt, _error, _response) {
|
|
784
773
|
const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1e3;
|
|
785
774
|
const randomSum = delay * 0.2 * Math.random();
|
|
786
775
|
return delay + randomSum;
|
|
787
776
|
}
|
|
788
|
-
function deploymentFetchRetryOn(onError, method) {
|
|
789
|
-
const
|
|
777
|
+
function deploymentFetchRetryOn(onError, method, maxRetries = MAX_RETRIES, shouldRetryOverride) {
|
|
778
|
+
const defaultShouldRetry = function(_attempt, error, response) {
|
|
790
779
|
if (error !== null) {
|
|
791
780
|
return { kind: "retry", error };
|
|
792
781
|
}
|
|
@@ -832,12 +821,18 @@ function deploymentFetchRetryOn(onError, method) {
|
|
|
832
821
|
}
|
|
833
822
|
return { kind: "stop" };
|
|
834
823
|
};
|
|
824
|
+
const shouldRetry = shouldRetryOverride ? function(_attempt, error, response) {
|
|
825
|
+
return shouldRetryOverride(error, response) ? {
|
|
826
|
+
kind: "retry",
|
|
827
|
+
error: error ?? `Received response with status ${response?.status}`
|
|
828
|
+
} : { kind: "stop" };
|
|
829
|
+
} : defaultShouldRetry;
|
|
835
830
|
return function(attempt, error, response) {
|
|
836
831
|
const result = shouldRetry(attempt, error, response);
|
|
837
832
|
if (result.kind === "retry") {
|
|
838
833
|
onError?.(result.error, attempt);
|
|
839
834
|
}
|
|
840
|
-
if (attempt >=
|
|
835
|
+
if (attempt >= maxRetries) {
|
|
841
836
|
return false;
|
|
842
837
|
}
|
|
843
838
|
return result.kind === "retry";
|
|
@@ -866,13 +861,19 @@ export function bareDeploymentFetch(_ctx, options) {
|
|
|
866
861
|
};
|
|
867
862
|
}
|
|
868
863
|
export function deploymentFetch(_ctx, options) {
|
|
869
|
-
const {
|
|
864
|
+
const {
|
|
865
|
+
deploymentUrl,
|
|
866
|
+
adminKey,
|
|
867
|
+
onError,
|
|
868
|
+
maxRetries = MAX_RETRIES,
|
|
869
|
+
shouldRetry
|
|
870
|
+
} = options;
|
|
870
871
|
const onErrorWithAttempt = (err, attempt) => {
|
|
871
872
|
onError?.(err);
|
|
872
873
|
if (attempt >= RETRY_LOG_THRESHOLD) {
|
|
873
874
|
logMessage(
|
|
874
875
|
chalkStderr.gray(
|
|
875
|
-
`Retrying request (attempt ${attempt}/${
|
|
876
|
+
`Retrying request (attempt ${attempt}/${maxRetries})...`
|
|
876
877
|
)
|
|
877
878
|
);
|
|
878
879
|
}
|
|
@@ -891,7 +892,12 @@ export function deploymentFetch(_ctx, options) {
|
|
|
891
892
|
}
|
|
892
893
|
const func = throwingFetch(url, {
|
|
893
894
|
retryDelay,
|
|
894
|
-
retryOn: deploymentFetchRetryOn(
|
|
895
|
+
retryOn: deploymentFetchRetryOn(
|
|
896
|
+
onErrorWithAttempt,
|
|
897
|
+
options2?.method,
|
|
898
|
+
maxRetries,
|
|
899
|
+
shouldRetry
|
|
900
|
+
),
|
|
895
901
|
...options2,
|
|
896
902
|
headers
|
|
897
903
|
});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/utils/utils.ts"],
|
|
4
|
-
"sourcesContent": ["import { paths as PlatformDeploymentPaths } from \"@convex-dev/platform/deploymentApi\";\nimport { paths as PlatformManagementPaths } from \"@convex-dev/platform/managementApi\";\nimport { chalkStderr } from \"chalk\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { ProjectConfig } from \"../config.js\";\n\nimport { spawn } from \"child_process\";\nimport { InvalidArgumentError } from \"commander\";\nimport fetchRetryFactory, { RequestInitRetryParams } from \"fetch-retry\";\nimport { Context, ErrorType } from \"../../../bundler/context.js\";\nimport {\n failExistingSpinner,\n logError,\n logMessage,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { version } from \"../../version.js\";\nimport type { CloudDeploymentType, Project } from \"../api.js\";\nimport { promptOptions, promptSearch, promptYesNo } from \"./prompts.js\";\nimport {\n bigBrainEnableFeatureMetadata,\n projectHasExistingCloudDev,\n} from \"../localDeployment/bigBrain.js\";\nimport type {\n paths as CliManagementPaths,\n RegionName,\n TeamResponse,\n} from \"../../generatedApi.js\";\nimport createClient from \"openapi-fetch\";\n\nconst retryingFetch = fetchRetryFactory(fetch);\n\nexport const productionProvisionHost = \"https://api.convex.dev\";\nexport const provisionHost =\n process.env.CONVEX_PROVISION_HOST || productionProvisionHost;\nexport const BIG_BRAIN_URL = `${provisionHost}/api/`;\nconst PLATFORM_MANAGEMENT_API_URL = `${provisionHost}/v1/`;\nexport const ENV_VAR_FILE_PATH = \".env.local\";\nexport const CONVEX_DEPLOY_KEY_ENV_VAR_NAME = \"CONVEX_DEPLOY_KEY\";\n// Alias for CONVEX_DEPLOY_KEY. Accepted anywhere CONVEX_DEPLOY_KEY is.\nexport const CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT_TOKEN\";\nexport const CONVEX_DEPLOYMENT_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT\";\nexport const CONVEX_SELF_HOSTED_URL_VAR_NAME = \"CONVEX_SELF_HOSTED_URL\";\nexport const CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME =\n \"CONVEX_SELF_HOSTED_ADMIN_KEY\";\nconst MAX_RETRIES = 6;\n// After 3 retries, log a progress message that we're retrying the request\nconst RETRY_LOG_THRESHOLD = 3;\n\n/**\n * Processes the CONVEX_DEPLOY_KEY value to handle special sentinel values.\n *\n * - If the value is `<ignore_deploy_key>`, treats it as if the env var isn't set (returns undefined)\n * - If the value matches `<missing_deploy_key:$STRING>`, crashes with the message in $STRING\n * - Otherwise returns the value as-is\n *\n * @param ctx Context for crashing if needed\n * @param deployKey The raw deploy key value from environment or config\n * @returns The processed deploy key value or undefined\n */\nexport async function processDeployKeyValue(\n ctx: Context,\n deployKey: string | undefined,\n): Promise<string | undefined> {\n if (deployKey === undefined) {\n return undefined;\n }\n\n // Check for <ignore_deploy_key> sentinel\n if (deployKey === \"<ignore_deploy_key>\") {\n return undefined;\n }\n\n // Check for <missing_deploy_key:$STRING> sentinel\n const missingKeyPattern = /^<missing_deploy_key:(.+)>$/;\n const match = deployKey.match(missingKeyPattern);\n if (match) {\n const errorMessage = match[1];\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: errorMessage,\n });\n }\n\n return deployKey;\n}\n\n/**\n * Reads the deploy key from environment variables, accepting either\n * CONVEX_DEPLOY_KEY or its alias CONVEX_DEPLOYMENT_TOKEN. CONVEX_DEPLOY_KEY\n * takes precedence when both are set.\n */\nexport function readDeployKeyFromEnv(\n getEnv: (name: string) => string | undefined | null,\n): string | undefined {\n const fromDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n const fromToken = getEnv(CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME);\n return fromDeployKey || fromToken || undefined;\n}\n\n// The prefix the backend's `require_operation` checks use when an identity\n// lacks a permission. The full message names the missing permission, e.g.\n// `You do not have permission to perform this operation (deployment:data:view).`\nconst PERMISSION_DENIED_MESSAGE_PREFIX =\n \"You do not have permission to perform this operation\";\n\nfunction deployKeyPermissionAdvice(): string | null {\n // Name whichever env var is actually set. `CONVEX_DEPLOY_KEY` takes\n // precedence over `CONVEX_DEPLOYMENT_TOKEN` when both are present.\n const envVarName = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME]\n ? CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME\n : null;\n if (envVarName === null) {\n return null;\n }\n return `This is determined by the permissions granted to ${envVarName}.`;\n}\n\n/**\n * Detects a server-side authorization failure (a `require_operation` error,\n * surfaced both as an HTTP 403 and as an error from a system UDF query) and\n * produces a clean, single-line message naming the missing permission. When a\n * deploy key is in use, appends advice for configuring its permissions.\n *\n * Returns `null` if `errorMessage` is not a permission error, so callers can\n * fall back to their normal error handling.\n */\nexport function permissionDeniedErrorMessage(\n errorMessage: string,\n): string | null {\n const index = errorMessage.indexOf(PERMISSION_DENIED_MESSAGE_PREFIX);\n if (index === -1) {\n return null;\n }\n // Drop any wrapping context (e.g. the `[CONVEX Q(...)]` prefix) and stack\n // trace, keeping just the permission sentence.\n let msg = errorMessage.slice(index).split(\"\\n\")[0].trim();\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n return msg;\n}\n\nexport function parsePositiveInteger(value: string) {\n const parsedValue = parseInteger(value);\n if (parsedValue <= 0) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a positive number.\");\n }\n return parsedValue;\n}\n\nexport function parseInteger(value: string) {\n const parsedValue = +value;\n if (isNaN(parsedValue)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a number.\");\n }\n return parsedValue;\n}\n\nexport type ErrorData = {\n code: string;\n message: string;\n};\n\n/**\n * Error thrown on non-2XX reponse codes to make most `fetch()` error handling\n * follow a single code path.\n */\nexport class ThrowingFetchError extends Error {\n response: Response;\n serverErrorData?: ErrorData;\n\n constructor(\n msg: string,\n {\n code,\n message,\n response,\n }: { cause?: Error; code?: string; message?: string; response: Response },\n ) {\n if (code !== undefined && message !== undefined) {\n super(`${msg}: ${code}: ${message}`);\n this.serverErrorData = { code, message };\n } else {\n super(msg);\n }\n\n Object.setPrototypeOf(this, ThrowingFetchError.prototype);\n\n this.response = response;\n }\n\n public static async fromResponse(\n response: Response,\n msg?: string,\n ): Promise<ThrowingFetchError> {\n msg = `${msg ? `${msg} ` : \"\"}${response.status} ${response.statusText}`;\n let code, message;\n try {\n ({ code, message } = await response.json());\n } catch {\n // Do nothing because the non-2XX response code is the primary error here.\n }\n return new ThrowingFetchError(msg, { code, message, response });\n }\n\n async handle(ctx: Context): Promise<never> {\n let error_type: ErrorType = \"transient\";\n await checkFetchErrorForDeprecation(ctx, this.response);\n\n let msg = this.message;\n\n if (this.response.status === 400) {\n error_type = \"invalid filesystem or env vars\";\n } else if (this.response.status === 401) {\n error_type = \"fatal\";\n msg = `${msg}\\nAuthenticate with \\`npx convex dev\\``;\n } else if (this.response.status === 403) {\n error_type = \"fatal\";\n // Surface the missing permission cleanly (e.g. the server includes the\n // required action like `deployment:data:view`) instead of the noisy\n // \"Error fetching ...\" wrapper.\n msg = this.serverErrorData?.message ?? msg;\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n } else if (this.response.status === 404) {\n error_type = \"fatal\";\n msg = `${msg}: ${this.response.url}`;\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: error_type,\n errForSentry: this,\n printedMessage: chalkStderr.red(msg.trim()),\n });\n }\n}\n\n/**\n * Thin wrapper around `fetch()` which throws a FetchDataError on non-2XX\n * responses which includes error code and message from the response JSON.\n * (Axios-style)\n *\n * It also accepts retry options from fetch-retry.\n */\nexport async function throwingFetch(\n resource: RequestInfo | URL,\n options: (RequestInit & RequestInitRetryParams<typeof fetch>) | undefined,\n): Promise<Response> {\n const response = await retryingFetch(resource, options);\n if (!response.ok) {\n // This error must always be handled manually.\n // eslint-disable-next-line no-restricted-syntax\n throw await ThrowingFetchError.fromResponse(\n response,\n `Error fetching ${options?.method ? options.method + \" \" : \"\"} ${\n typeof resource === \"string\"\n ? resource\n : \"url\" in resource\n ? resource.url\n : resource.toString()\n }`,\n );\n }\n return response;\n}\n\n/**\n * Handle an error a fetch error or non-2xx response.\n */\nexport async function logAndHandleFetchError(\n ctx: Context,\n err: unknown,\n): Promise<never> {\n // Fail the spinner so the stderr lines appear\n failExistingSpinner();\n\n if (err instanceof ThrowingFetchError) {\n return await err.handle(ctx);\n } else {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: err,\n printedMessage: chalkStderr.red(err),\n });\n }\n}\n\nfunction logDeprecationWarning(ctx: Context, deprecationMessage: string) {\n if (ctx.deprecationMessagePrinted) {\n return;\n }\n ctx.deprecationMessagePrinted = true;\n logWarning(chalkStderr.yellow(deprecationMessage));\n}\n\nasync function checkFetchErrorForDeprecation(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This version is deprecated. Print a warning and crash.\n\n // Gotcha:\n // 1. Don't use `logDeprecationWarning` because we should always print\n // why this we crashed (even if we printed a warning earlier).\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(deprecationMessage),\n });\n default:\n // The error included a deprecation warning. Print, but handle the\n // error normally (it was for another reason).\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\n/// Call this method after a successful API response to conditionally print the\n/// \"please upgrade\" message.\nexport function deprecationCheckWarning(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This should never happen because such states are errors, not warnings.\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n \"Called deprecationCheckWarning on a fatal error. This is a bug.\",\n );\n default:\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\nexport async function hasTeam(ctx: Context, teamSlug: string) {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n return teams.some((team) => team.slug === teamSlug);\n}\n\nexport async function validateOrSelectTeam(\n ctx: Context,\n teamSlug: string | undefined,\n promptMessage: string,\n): Promise<{ team: TeamResponse; chosen: boolean }> {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n if (teams.length === 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"No teams found\",\n printedMessage: chalkStderr.red(\"Error: No teams found\"),\n });\n }\n if (!teamSlug) {\n // Prompt the user to select if they belong to more than one team.\n switch (teams.length) {\n case 1:\n return { team: teams[0], chosen: false };\n default: {\n const teamSlug = await promptSearch(ctx, {\n message: promptMessage,\n choices: teams.map((team) => ({\n name: `${team.name} (${team.slug})`,\n value: team.slug,\n })),\n });\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Failed to select team`,\n });\n }\n return { team, chosen: true };\n }\n }\n } else {\n // Validate the chosen team.\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${teamSlug} not found, fix the --team option or remove it`,\n });\n }\n return { team, chosen: false };\n }\n}\n\nexport async function selectDevDeploymentType(\n ctx: Context,\n {\n chosenConfiguration,\n newOrExisting,\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively,\n // from `--configure --dev-deployment local|cloud`\n devDeploymentFromFlag,\n }:\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"existing\";\n teamSlug: string;\n projectSlug: string;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n }\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"new\";\n teamSlug: string;\n // For new projects we don't know the project slug yet.\n projectSlug: undefined;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{ devDeployment: \"cloud\" | \"local\" }> {\n if (devDeploymentFromFlag) return { devDeployment: devDeploymentFromFlag };\n\n if (newOrExisting === \"existing\" && chosenConfiguration === null) {\n // Don't suggest local dev if developer already has a cloud deployment.\n if (await projectHasExistingCloudDev(ctx, { projectSlug, teamSlug })) {\n // TODO Expand rollout to offer local dev in this case. ENG-8307\n return { devDeployment: \"cloud\" };\n }\n }\n\n // To avoid breaking previously non-interactive flows, don't prompt if enough\n // flags were specified for configure not to already have needed input.\n if (chosenConfiguration !== \"ask\" && !userHasChosenSomethingInteractively) {\n return { devDeployment: \"cloud\" };\n }\n\n // For creating a first project (no projects exist) or joining a first project\n // (one project exists), always use cloud since it's a smoother experience.\n const isFirstProject =\n (await bigBrainEnableFeatureMetadata(ctx)).totalProjects.kind !==\n \"multiple\";\n if (isFirstProject) {\n return { devDeployment: \"cloud\" };\n }\n\n // For now default is always cloud.\n const devDeployment: \"cloud\" | \"local\" = await promptOptions(ctx, {\n message:\n \"Use cloud or local dev deployment? For more see https://docs.convex.dev/cli/local-deployments\",\n default: \"cloud\",\n choices: [\n { name: \"cloud deployment\", value: \"cloud\" },\n { name: \"local deployment (BETA)\", value: \"local\" },\n ],\n });\n return { devDeployment };\n}\n\nexport async function logNoDefaultRegionMessage(teamSlug: string) {\n const { teamDashboardUrl } = await import(\"../dashboard.js\");\n const noDefaultRegionMessage = chalkStderr.gray(\n `Tip: you can configure a default region for your team at ${chalkStderr.underline(`${teamDashboardUrl(teamSlug)}/settings`)}`,\n );\n logMessage(noDefaultRegionMessage);\n}\n\nexport async function selectRegionOrUseDefault(\n ctx: Context,\n selectedTeam: TeamResponse,\n deploymentType: CloudDeploymentType,\n) {\n if (!process.stdin.isTTY) {\n // Use the team default in non-interactive terminals\n if (!selectedTeam.defaultRegion) {\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedTeam.defaultRegion ?? null;\n }\n const selectedRegionName =\n selectedTeam.defaultRegion ??\n (await selectRegion(ctx, selectedTeam.id, deploymentType));\n if (!selectedTeam.defaultRegion) {\n // Log after the user chooses a region\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedRegionName;\n}\n\nexport async function selectRegion(\n ctx: Context,\n teamId: number,\n deploymentType: CloudDeploymentType,\n): Promise<RegionName> {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n const choices = regionsResponse.items\n .filter((item) => Boolean(item.available))\n .map((item) => ({\n name: item.displayName,\n value: item.name,\n }))\n .sort((a, b) => {\n // Show US region first if it exists\n if (a.value === \"aws-us-east-1\") return -1;\n if (b.value === \"aws-us-east-1\") return 1;\n return 0;\n });\n return await promptOptions(ctx, {\n message: `Where should this ${deploymentType} deployment run?`,\n suffix: `\\n${chalkStderr.gray(\n \"See https://www.convex.dev/pricing for pricing\",\n )}`,\n choices,\n });\n}\n\nexport async function hasProject(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n) {\n try {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n return !!projects.find((project) => project.slug === projectSlug);\n } catch {\n return false;\n }\n}\n\nexport async function hasProjects(ctx: Context) {\n return !!(await bigBrainAPI({ ctx, method: \"GET\", path: `has_projects` }));\n}\n\nexport async function validateOrSelectProject(\n ctx: Context,\n projectSlug: string | undefined,\n teamSlug: string,\n singleProjectPrompt: string,\n multiProjectPrompt: string,\n): Promise<string | null> {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n if (projects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n if (!projectSlug) {\n // Prompt the user to select project.\n switch (projects.length) {\n case 1: {\n const project = projects[0];\n const confirmed = await promptYesNo(ctx, {\n message: `${singleProjectPrompt} ${project.name} (${project.slug})?`,\n });\n\n if (!confirmed) {\n return null;\n }\n return projects[0].slug;\n }\n default:\n return await promptSearch(ctx, {\n message: multiProjectPrompt,\n choices: projects.map((project: Project) => ({\n name: `${project.name} (${project.slug})`,\n value: project.slug,\n })),\n });\n }\n } else {\n // Validate the chosen project.\n if (!projects.find((project) => project.slug === projectSlug)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Project ${projectSlug} not found, fix the --project option or remove it`,\n });\n }\n return projectSlug;\n }\n}\n\n/**\n * @param ctx\n * @returns a Record of dependency name to dependency version for dependencies\n * and devDependencies\n */\nexport async function loadPackageJson(\n ctx: Context,\n includePeerDeps = false,\n): Promise<Record<string, string>> {\n let packageJson;\n try {\n packageJson = ctx.fs.readUtf8File(\"package.json\");\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Unable to read your package.json: ${\n err as any\n }. Make sure you're running this command from the root directory of a Convex app that contains the package.json`,\n });\n }\n let obj;\n try {\n obj = JSON.parse(packageJson);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n printedMessage: `Unable to parse package.json: ${err as any}`,\n });\n }\n if (typeof obj !== \"object\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected to parse an object from package.json\",\n });\n }\n const packages = {\n ...(includePeerDeps ? (obj.peerDependencies ?? {}) : {}),\n ...(obj.dependencies ?? {}),\n ...(obj.devDependencies ?? {}),\n };\n return packages;\n}\n\nexport async function ensureHasConvexDependency(ctx: Context, cmd: string) {\n const packages = await loadPackageJson(ctx, true);\n const hasConvexDependency = \"convex\" in packages;\n if (!hasConvexDependency) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `In order to ${cmd}, add \\`convex\\` to your package.json dependencies.`,\n });\n }\n}\n\n/** Return a new array with elements of the passed in array sorted by a key lambda */\nexport const sorted = <T>(arr: T[], key: (el: T) => any): T[] => {\n const newArr = [...arr];\n const cmp = (a: T, b: T) => {\n if (key(a) < key(b)) return -1;\n if (key(a) > key(b)) return 1;\n return 0;\n };\n return newArr.sort(cmp);\n};\n\nexport function functionsDir(\n configPath: string,\n projectConfig: ProjectConfig,\n): string {\n return path.join(path.dirname(configPath), projectConfig.functions);\n}\n\nfunction convexName() {\n // Use a different directory for config files generated for tests\n if (process.env.CONVEX_PROVISION_HOST) {\n const port = process.env.CONVEX_PROVISION_HOST.split(\":\")[2];\n if (port === undefined || port === \"8050\") {\n return `convex-test`;\n } else {\n return `convex-test-${port}`;\n }\n }\n return \"convex\";\n}\n\nexport function rootDirectory(): string {\n return path.join(os.homedir(), `.${convexName()}`);\n}\n\nexport function cacheDir() {\n const name = convexName();\n const platform = process.platform;\n if (platform === \"win32\") {\n // On Windows, `LOCALAPPDATA` is usually set, but fall back to\n // `USERPROFILE` if not, and fall back to homedir if all else fails.\n if (process.env.LOCALAPPDATA) {\n return path.join(process.env.LOCALAPPDATA, name);\n }\n if (process.env.USERPROFILE) {\n return path.join(process.env.USERPROFILE, \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \".cache\", name);\n}\n\n/**\n * Fetch with appropriate headers for the Convex Management API.\n *\n * This fetch() also has retries and throws if the response is not ok.\n */\nexport function bigBrainFetch(ctx: Context): typeof fetch {\n const authHeader = ctx.bigBrainAuth()?.header;\n const bigBrainHeaders: Record<string, string> = authHeader\n ? {\n Authorization: authHeader,\n \"Convex-Client\": `npm-cli-${version}`,\n }\n : {\n \"Convex-Client\": `npm-cli-${version}`,\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const { headers: optionsHeaders, ...rest } = options || {};\n // Use the options headers if they exist. Otherwise, use the request headers\n const headers = {\n ...bigBrainHeaders,\n ...(optionsHeaders ??\n (resource instanceof Request\n ? Object.fromEntries(resource.headers.entries())\n : {})),\n };\n const opts = {\n retries: MAX_RETRIES,\n retryDelay,\n headers,\n ...rest,\n };\n\n return throwingFetch(resource, opts);\n };\n}\n\nexport async function bigBrainAPI<T = any>({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<T> {\n const dataString =\n data === undefined\n ? undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n try {\n return await bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data: dataString,\n });\n } catch (err: unknown) {\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\n/**\n * Typed API client with a fetch() implemention that includes retries and crashes on errors.\n * It is always safe to call `.data!` on the response: any error would throw or crash.\n *\n * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.\n */\nfunction typedApiClientFactory<T>(\n baseUrl: string,\n fetchBuilder: (ctx: Context) => typeof fetch,\n) {\n return (ctx: Context, options: { throw?: boolean } = {}) => {\n type Paths = T extends CliManagementPaths\n ? CliManagementPaths\n : T extends PlatformManagementPaths\n ? PlatformManagementPaths\n : T extends PlatformDeploymentPaths\n ? PlatformDeploymentPaths\n : never;\n const client = createClient<Paths>({\n baseUrl,\n fetch: fetchBuilder(ctx),\n });\n\n // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors\n return new Proxy(client, {\n get(target, prop) {\n const originalMethod = target[prop as keyof typeof target];\n\n if (\n prop === \"GET\" ||\n prop === \"POST\" ||\n prop === \"HEAD\" ||\n prop === \"OPTIONS\" ||\n prop === \"PUT\" ||\n prop === \"DELETE\" ||\n prop === \"PATCH\" ||\n prop === \"TRACE\"\n ) {\n return async (...args: any[]) => {\n try {\n return await (originalMethod as Function).apply(target, args);\n } catch (err: unknown) {\n if (options.throw) {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n };\n }\n\n return originalMethod;\n },\n });\n };\n}\n\nexport const typedBigBrainClient = typedApiClientFactory<CliManagementPaths>(\n BIG_BRAIN_URL,\n bigBrainFetch,\n);\nexport const typedPlatformClient =\n typedApiClientFactory<PlatformManagementPaths>(\n PLATFORM_MANAGEMENT_API_URL,\n bigBrainFetch,\n );\n\nexport function typedDeploymentClient(\n ctx: Context,\n args: { deploymentUrl: string; adminKey: string },\n options: { throw?: boolean } = {},\n) {\n return typedApiClientFactory<PlatformDeploymentPaths>(\n `${args.deploymentUrl}/api/v1`,\n (ctx) =>\n deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n }),\n )(ctx, options);\n}\n\nexport async function bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<any> {\n const fetch = bigBrainFetch(ctx);\n const dataString =\n data === undefined\n ? method === \"POST\"\n ? JSON.stringify({})\n : undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n const res = await fetch(new URL(path, BIG_BRAIN_URL), {\n method,\n ...(dataString ? { body: dataString } : {}),\n headers:\n method === \"POST\"\n ? {\n \"Content-Type\": \"application/json\",\n }\n : {},\n });\n deprecationCheckWarning(ctx, res);\n if (res.status === 200) {\n return await res.json();\n }\n}\n\n/**\n * Polls an arbitrary function until a condition is met.\n *\n * @param fetch Function performing a fetch, returning resulting data.\n * @param condition This function will terminate polling when it returns `true`.\n * @param waitMs How long to wait in between fetches.\n * @returns The resulting data from `fetch`.\n */\nexport const poll = async function <Result>(\n fetch: () => Promise<Result>,\n condition: (data: Result) => boolean,\n waitMs = 1000,\n) {\n let result = await fetch();\n while (!condition(result)) {\n await wait(waitMs);\n result = await fetch();\n }\n return result;\n};\n\nconst wait = function (waitMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, waitMs);\n });\n};\n\nexport function waitForever() {\n // This never resolves\n return new Promise((_) => {\n // ignore\n });\n}\n\n// Returns a promise and a function that resolves the promise.\nexport function waitUntilCalled(): [Promise<unknown>, () => void] {\n let onCalled: (v: unknown) => void;\n const waitPromise = new Promise((resolve) => (onCalled = resolve));\n return [waitPromise, () => onCalled(null)];\n}\n\nconst BYTE_UNITS: [number, string][] = [\n [1 << 30, \"GiB\"],\n [1_000_000_000, \"GB\"],\n [1 << 20, \"MiB\"],\n [1_000_000, \"MB\"],\n [1 << 10, \"KiB\"],\n [1_000, \"KB\"],\n];\n\n/**\n * Format a byte count into a human-friendly string.\n *\n * Picks the unit (binary or decimal) that divides most cleanly.\n * Shows one decimal place only when it divides exactly (e.g. \"4.1 MiB\").\n * Falls back to raw bytes when no unit divides cleanly.\n */\nexport function formatSize(n: number): string {\n if (n === 0) {\n return \"0 bytes\";\n }\n for (const [unitSize, unitName] of BYTE_UNITS) {\n if (n < unitSize) {\n continue;\n }\n if (n % unitSize === 0) {\n return `${n / unitSize} ${unitName}`;\n }\n if ((n * 10) % unitSize === 0) {\n const whole = Math.floor(n / unitSize);\n const frac = Math.floor((n * 10) / unitSize) % 10;\n return `${whole}.${frac} ${unitName}`;\n }\n }\n return `${n} bytes`;\n}\n\nexport function formatDuration(ms: number): string {\n const twoDigits = (n: number, unit: string) =>\n `${n.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}${unit}`;\n\n if (ms < 1e-3) {\n return twoDigits(ms * 1e9, \"ns\");\n }\n if (ms < 1) {\n return twoDigits(ms * 1e3, \"\u00B5s\");\n }\n if (ms < 1e3) {\n return twoDigits(ms, \"ms\");\n }\n const s = ms / 1e3;\n if (s < 60) {\n return twoDigits(ms / 1e3, \"s\");\n }\n return twoDigits(s / 60, \"m\");\n}\n\nexport function getCurrentTimeString() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n const seconds = String(now.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n// We don't allow running commands in project subdirectories yet,\n// but we can provide better errors if we look around.\nexport async function findParentConfigs(ctx: Context): Promise<{\n parentPackageJson: string;\n parentConvexJson?: string | undefined;\n}> {\n const parentPackageJson = findUp(ctx, \"package.json\");\n if (!parentPackageJson) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage:\n \"No package.json found. To create a new project using Convex, see https://docs.convex.dev/home#quickstarts\",\n });\n }\n const candidateConvexJson =\n parentPackageJson &&\n path.join(path.dirname(parentPackageJson), \"convex.json\");\n const parentConvexJson =\n candidateConvexJson && ctx.fs.exists(candidateConvexJson)\n ? candidateConvexJson\n : undefined;\n return {\n parentPackageJson,\n parentConvexJson,\n };\n}\n\n/**\n * Finds a file in the current working directory or a parent.\n *\n * @returns The absolute path of the first file found or undefined.\n */\nfunction findUp(ctx: Context, filename: string): string | undefined {\n let curDir = path.resolve(\".\");\n let parentDir = curDir;\n do {\n const candidate = path.join(curDir, filename);\n if (ctx.fs.exists(candidate)) {\n return candidate;\n }\n curDir = parentDir;\n parentDir = path.dirname(curDir);\n } while (parentDir !== curDir);\n return;\n}\n\n/**\n * Returns whether there's an existing project config. Throws\n * if this is not a valid directory for a project config.\n */\nexport async function isInExistingProject(ctx: Context) {\n const { parentPackageJson, parentConvexJson } = await findParentConfigs(ctx);\n if (parentPackageJson !== path.resolve(\"package.json\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Run this command from the root directory of a project.\",\n });\n }\n return !!parentConvexJson;\n}\n\n// `spawnAsync` is the async version of Node's `spawnSync` (and `spawn`).\n//\n// By default, this returns the produced `stdout` and `stderror` and\n// an error if one was encountered (to mirror `spawnSync`).\n//\n// If `stdio` is set to `\"inherit\"`, pipes `stdout` and `stderror` (\n// pausing the spinner if one is running) and rejects the promise\n// on errors (to mirror `execFileSync`).\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n): Promise<{\n stdout: string;\n stderr: string;\n status: null | number;\n error?: Error | undefined;\n}>;\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options: { stdio: \"inherit\"; shell?: boolean },\n): Promise<void>;\nexport function spawnAsync(\n _ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options?: { stdio: \"inherit\"; shell?: boolean },\n) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { shell: options?.shell });\n let stdout = \"\";\n let stderr = \"\";\n\n const pipeOutput = options?.stdio === \"inherit\";\n\n if (pipeOutput) {\n child.stdout.on(\"data\", (text) =>\n logMessage(text.toString(\"utf-8\").trimEnd()),\n );\n child.stderr.on(\"data\", (text) =>\n logError(text.toString(\"utf-8\").trimEnd()),\n );\n } else {\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString(\"utf-8\");\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString(\"utf-8\");\n });\n }\n\n const completionListener = (code: number | null) => {\n child.removeListener(\"error\", errorListener);\n const result = pipeOutput\n ? { status: code }\n : { stdout, stderr, status: code };\n if (code !== 0) {\n const argumentString =\n args && args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n const error = new Error(\n `\\`${command}${argumentString}\\` exited with non-zero code: ${code}`,\n );\n if (pipeOutput) {\n reject({ ...result, error });\n } else {\n resolve({ ...result, error });\n }\n } else {\n resolve(result);\n }\n };\n\n const errorListener = (error: Error) => {\n child.removeListener(\"exit\", completionListener);\n child.removeListener(\"close\", completionListener);\n if (pipeOutput) {\n reject({ error, status: null });\n } else {\n resolve({ error, status: null });\n }\n };\n\n if (pipeOutput) {\n child.once(\"exit\", completionListener);\n } else {\n child.once(\"close\", completionListener);\n }\n child.once(\"error\", errorListener);\n });\n}\n\nconst IDEMPOTENT_METHODS = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\", \"TRACE\"];\n\nfunction retryDelay(\n attempt: number,\n _error: Error | null,\n _response: Response | null,\n): number {\n // immediate, 1s delay, 2s delay, 4s delay, etc.\n const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1000;\n const randomSum = delay * 0.2 * Math.random();\n return delay + randomSum;\n}\n\nfunction deploymentFetchRetryOn(\n onError?: (err: any, attempt: number) => void,\n method?: string,\n) {\n const shouldRetry = function (\n _attempt: number,\n error: Error | null,\n response: Response | null,\n ): { kind: \"retry\"; error: any } | { kind: \"stop\" } {\n // Retry on network errors.\n if (error !== null) {\n // TODO filter out all SSL errors\n // https://github.com/nodejs/node/blob/8a41d9b636be86350cd32847c3f89d327c4f6ff7/src/crypto/crypto_common.cc#L218-L245\n return { kind: \"retry\", error: error };\n }\n // Retry on 404s since these can sometimes happen with newly created\n // deployments for POSTs.\n if (response?.status === 404) {\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n // Whatever the error code it doesn't hurt to retry idempotent requests.\n if (\n response &&\n !response.ok &&\n method &&\n IDEMPOTENT_METHODS.includes(method.toUpperCase())\n ) {\n // ...but it's a bit annoying to wait for things we know won't succced\n if (\n [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // PaymentRequired\n 403, // Forbidden\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 412, // Precondition Failed\n 413, // Payload Too Large\n 414, // URI Too Long\n 415, // Unsupported Media Type\n 416, // Range Not Satisfiable\n ].includes(response.status)\n ) {\n return {\n kind: \"stop\",\n };\n }\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n return { kind: \"stop\" };\n };\n\n return function (\n attempt: number,\n error: Error | null,\n response: Response | null,\n ) {\n const result = shouldRetry(attempt, error, response);\n if (result.kind === \"retry\") {\n onError?.(result.error, attempt);\n }\n if (attempt >= MAX_RETRIES) {\n // Stop retrying if we've exhausted all retries, but do this after we've\n // called `onError` so that the caller can still log the error.\n return false;\n }\n return result.kind === \"retry\";\n };\n}\n\n/**\n * Unlike `deploymentFetch`, this does not add on any headers, so the caller\n * must supply any headers.\n */\nexport function bareDeploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n onError?: (err: any) => void;\n },\n): typeof throwingFetch {\n const { deploymentUrl, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n });\n return func;\n };\n}\n\n/**\n * This returns a `fetch` function that will fetch against `deploymentUrl`.\n *\n * It will also set the `Authorization` header, `Content-Type` header, and\n * the `Convex-Client` header if they are not set in the `fetch`.\n */\nexport function deploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n onError?: (err: any) => void;\n },\n): typeof fetch {\n const { deploymentUrl, adminKey, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n\n const headers = new Headers(options?.headers || {});\n if (!headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", `Convex ${adminKey}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (!headers.has(\"Convex-Client\")) {\n headers.set(\"Convex-Client\", `npm-cli-${version}`);\n }\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n headers,\n });\n return func;\n };\n}\n\n/**\n * Whether this is likely to be a WebContainer,\n * WebContainers can't complete the WorkOS login but where that login flow\n * fails has changed with the environment.\n */\nexport function isWebContainer(): boolean {\n // Dynamic require as used here doesn't work with tsx\n if (process.env.CONVEX_RUNNING_LIVE_IN_MONOREPO) {\n return false;\n }\n const dynamicRequire = require;\n if (process.versions.webcontainer === undefined) {\n return false;\n }\n let blitzInternalEnv: unknown;\n try {\n blitzInternalEnv = dynamicRequire(\"@blitz/internal/env\");\n // totally fine for this require to fail\n // eslint-disable-next-line no-empty\n } catch {}\n return blitzInternalEnv !== null && blitzInternalEnv !== undefined;\n}\n\n// For (rare) special behaviors based on package.json details.\nexport async function currentPackageHomepage(\n ctx: Context,\n): Promise<string | null> {\n const { parentPackageJson: packageJsonPath } = await findParentConfigs(ctx);\n let packageJson: any;\n try {\n const packageJsonString = ctx.fs.readUtf8File(packageJsonPath);\n packageJson = JSON.parse(packageJsonString);\n } catch (error: any) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Couldn't parse \"${packageJsonPath}\". Make sure it's a valid JSON. Error: ${error}`,\n });\n }\n const name = packageJson[\"homepage\"];\n if (typeof name !== \"string\") {\n // wrong type or missing\n return null;\n }\n return name;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { paths as PlatformDeploymentPaths } from \"@convex-dev/platform/deploymentApi\";\nimport { paths as PlatformManagementPaths } from \"@convex-dev/platform/managementApi\";\nimport { chalkStderr } from \"chalk\";\nimport os from \"os\";\nimport path from \"path\";\n\nimport { ProjectConfig } from \"../config.js\";\n\nimport { spawn } from \"child_process\";\nimport { InvalidArgumentError } from \"commander\";\nimport fetchRetryFactory, { RequestInitRetryParams } from \"fetch-retry\";\nimport { Context, ErrorType } from \"../../../bundler/context.js\";\nimport {\n failExistingSpinner,\n logError,\n logMessage,\n logWarning,\n} from \"../../../bundler/log.js\";\nimport { version } from \"../../version.js\";\nimport type { CloudDeploymentType, Project } from \"../api.js\";\nimport { promptOptions, promptSearch, promptYesNo } from \"./prompts.js\";\nimport {\n bigBrainEnableFeatureMetadata,\n projectHasExistingCloudDev,\n} from \"../localDeployment/bigBrain.js\";\nimport type {\n paths as CliManagementPaths,\n RegionName,\n TeamResponse,\n} from \"../../generatedApi.js\";\nimport createClient from \"openapi-fetch\";\n\nconst retryingFetch = fetchRetryFactory(fetch);\n\nexport const productionProvisionHost = \"https://api.convex.dev\";\nexport const provisionHost =\n process.env.CONVEX_PROVISION_HOST || productionProvisionHost;\nexport const BIG_BRAIN_URL = `${provisionHost}/api/`;\nconst PLATFORM_MANAGEMENT_API_URL = `${provisionHost}/v1/`;\nexport const ENV_VAR_FILE_PATH = \".env.local\";\nexport const CONVEX_DEPLOY_KEY_ENV_VAR_NAME = \"CONVEX_DEPLOY_KEY\";\n// Alias for CONVEX_DEPLOY_KEY. Accepted anywhere CONVEX_DEPLOY_KEY is.\nexport const CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT_TOKEN\";\nexport const CONVEX_DEPLOYMENT_ENV_VAR_NAME = \"CONVEX_DEPLOYMENT\";\nexport const CONVEX_SELF_HOSTED_URL_VAR_NAME = \"CONVEX_SELF_HOSTED_URL\";\nexport const CONVEX_SELF_HOSTED_ADMIN_KEY_VAR_NAME =\n \"CONVEX_SELF_HOSTED_ADMIN_KEY\";\nconst MAX_RETRIES = 6;\n// After 3 retries, log a progress message that we're retrying the request\nconst RETRY_LOG_THRESHOLD = 3;\n\n/**\n * Processes the CONVEX_DEPLOY_KEY value to handle special sentinel values.\n *\n * - If the value is `<ignore_deploy_key>`, treats it as if the env var isn't set (returns undefined)\n * - If the value matches `<missing_deploy_key:$STRING>`, crashes with the message in $STRING\n * - Otherwise returns the value as-is\n *\n * @param ctx Context for crashing if needed\n * @param deployKey The raw deploy key value from environment or config\n * @returns The processed deploy key value or undefined\n */\nexport async function processDeployKeyValue(\n ctx: Context,\n deployKey: string | undefined,\n): Promise<string | undefined> {\n if (deployKey === undefined) {\n return undefined;\n }\n\n // Check for <ignore_deploy_key> sentinel\n if (deployKey === \"<ignore_deploy_key>\") {\n return undefined;\n }\n\n // Check for <missing_deploy_key:$STRING> sentinel\n const missingKeyPattern = /^<missing_deploy_key:(.+)>$/;\n const match = deployKey.match(missingKeyPattern);\n if (match) {\n const errorMessage = match[1];\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: errorMessage,\n });\n }\n\n return deployKey;\n}\n\n/**\n * Reads the deploy key from environment variables, accepting either\n * CONVEX_DEPLOY_KEY or its alias CONVEX_DEPLOYMENT_TOKEN. CONVEX_DEPLOY_KEY\n * takes precedence when both are set.\n */\nexport function readDeployKeyFromEnv(\n getEnv: (name: string) => string | undefined | null,\n): string | undefined {\n const fromDeployKey = getEnv(CONVEX_DEPLOY_KEY_ENV_VAR_NAME);\n const fromToken = getEnv(CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME);\n return fromDeployKey || fromToken || undefined;\n}\n\n// The prefix the backend's `require_operation` checks use when an identity\n// lacks a permission. The full message names the missing permission, e.g.\n// `You do not have permission to perform this operation (deployment:data:view).`\nconst PERMISSION_DENIED_MESSAGE_PREFIX =\n \"You do not have permission to perform this operation\";\n\nfunction deployKeyPermissionAdvice(): string | null {\n // Name whichever env var is actually set. `CONVEX_DEPLOY_KEY` takes\n // precedence over `CONVEX_DEPLOYMENT_TOKEN` when both are present.\n const envVarName = process.env[CONVEX_DEPLOY_KEY_ENV_VAR_NAME]\n ? CONVEX_DEPLOY_KEY_ENV_VAR_NAME\n : process.env[CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME]\n ? CONVEX_DEPLOYMENT_TOKEN_ENV_VAR_NAME\n : null;\n if (envVarName === null) {\n return null;\n }\n return `This is determined by the permissions granted to ${envVarName}.`;\n}\n\n/**\n * Detects a server-side authorization failure (a `require_operation` error,\n * surfaced both as an HTTP 403 and as an error from a system UDF query) and\n * produces a clean, single-line message naming the missing permission. When a\n * deploy key is in use, appends advice for configuring its permissions.\n *\n * Returns `null` if `errorMessage` is not a permission error, so callers can\n * fall back to their normal error handling.\n */\nexport function permissionDeniedErrorMessage(\n errorMessage: string,\n): string | null {\n const index = errorMessage.indexOf(PERMISSION_DENIED_MESSAGE_PREFIX);\n if (index === -1) {\n return null;\n }\n // Drop any wrapping context (e.g. the `[CONVEX Q(...)]` prefix) and stack\n // trace, keeping just the permission sentence.\n let msg = errorMessage.slice(index).split(\"\\n\")[0].trim();\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n return msg;\n}\n\nexport function parsePositiveInteger(value: string) {\n const parsedValue = parseInteger(value);\n if (parsedValue <= 0) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a positive number.\");\n }\n return parsedValue;\n}\n\nexport function parseInteger(value: string) {\n const parsedValue = +value;\n if (isNaN(parsedValue)) {\n // eslint-disable-next-line no-restricted-syntax\n throw new InvalidArgumentError(\"Not a number.\");\n }\n return parsedValue;\n}\n\nexport type ErrorData = {\n code: string;\n message: string;\n};\n\n/**\n * Error thrown on non-2XX reponse codes to make most `fetch()` error handling\n * follow a single code path.\n */\nexport class ThrowingFetchError extends Error {\n response: Response;\n serverErrorData?: ErrorData;\n\n constructor(\n msg: string,\n {\n code,\n message,\n response,\n }: { cause?: Error; code?: string; message?: string; response: Response },\n ) {\n if (code !== undefined && message !== undefined) {\n super(`${msg}: ${code}: ${message}`);\n this.serverErrorData = { code, message };\n } else {\n super(msg);\n }\n\n Object.setPrototypeOf(this, ThrowingFetchError.prototype);\n\n this.response = response;\n }\n\n public static async fromResponse(\n response: Response,\n msg?: string,\n ): Promise<ThrowingFetchError> {\n msg = `${msg ? `${msg} ` : \"\"}${response.status} ${response.statusText}`;\n let code, message;\n try {\n ({ code, message } = await response.json());\n } catch {\n // Do nothing because the non-2XX response code is the primary error here.\n }\n return new ThrowingFetchError(msg, { code, message, response });\n }\n\n async handle(ctx: Context): Promise<never> {\n let error_type: ErrorType = \"transient\";\n await checkFetchErrorForDeprecation(ctx, this.response);\n\n let msg = this.message;\n\n if (this.response.status === 400) {\n error_type = \"invalid filesystem or env vars\";\n } else if (this.response.status === 401) {\n error_type = \"fatal\";\n msg = `${msg}\\nAuthenticate with \\`npx convex dev\\``;\n } else if (this.response.status === 403) {\n error_type = \"fatal\";\n // Surface the missing permission cleanly (e.g. the server includes the\n // required action like `deployment:data:view`) instead of the noisy\n // \"Error fetching ...\" wrapper.\n msg = this.serverErrorData?.message ?? msg;\n const advice = deployKeyPermissionAdvice();\n if (advice) {\n msg = `${msg}\\n${advice}`;\n }\n } else if (this.response.status === 404) {\n error_type = \"fatal\";\n msg = `${msg}: ${this.response.url}`;\n }\n\n return await ctx.crash({\n exitCode: 1,\n errorType: error_type,\n errForSentry: this,\n printedMessage: chalkStderr.red(msg.trim()),\n });\n }\n}\n\n/**\n * Thin wrapper around `fetch()` which throws a FetchDataError on non-2XX\n * responses which includes error code and message from the response JSON.\n * (Axios-style)\n *\n * It also accepts retry options from fetch-retry.\n */\nexport async function throwingFetch(\n resource: RequestInfo | URL,\n options: (RequestInit & RequestInitRetryParams<typeof fetch>) | undefined,\n): Promise<Response> {\n const response = await retryingFetch(resource, options);\n if (!response.ok) {\n // This error must always be handled manually.\n // eslint-disable-next-line no-restricted-syntax\n throw await ThrowingFetchError.fromResponse(\n response,\n `Error fetching ${options?.method ? options.method + \" \" : \"\"} ${\n typeof resource === \"string\"\n ? resource\n : \"url\" in resource\n ? resource.url\n : resource.toString()\n }`,\n );\n }\n return response;\n}\n\n/**\n * Handle an error a fetch error or non-2xx response.\n */\nexport async function logAndHandleFetchError(\n ctx: Context,\n err: unknown,\n): Promise<never> {\n // Fail the spinner so the stderr lines appear\n failExistingSpinner();\n\n if (err instanceof ThrowingFetchError) {\n return await err.handle(ctx);\n } else {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"transient\",\n errForSentry: err,\n printedMessage: chalkStderr.red(err),\n });\n }\n}\n\nfunction logDeprecationWarning(ctx: Context, deprecationMessage: string) {\n if (ctx.deprecationMessagePrinted) {\n return;\n }\n ctx.deprecationMessagePrinted = true;\n logWarning(chalkStderr.yellow(deprecationMessage));\n}\n\nasync function checkFetchErrorForDeprecation(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This version is deprecated. Print a warning and crash.\n\n // Gotcha:\n // 1. Don't use `logDeprecationWarning` because we should always print\n // why this we crashed (even if we printed a warning earlier).\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: chalkStderr.red(deprecationMessage),\n });\n default:\n // The error included a deprecation warning. Print, but handle the\n // error normally (it was for another reason).\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\n/// Call this method after a successful API response to conditionally print the\n/// \"please upgrade\" message.\nexport function deprecationCheckWarning(ctx: Context, resp: Response) {\n const headers = resp.headers;\n if (headers) {\n const deprecationState = headers.get(\"x-convex-deprecation-state\");\n const deprecationMessage = headers.get(\"x-convex-deprecation-message\");\n switch (deprecationState) {\n case null:\n break;\n case \"Deprecated\":\n // This should never happen because such states are errors, not warnings.\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n \"Called deprecationCheckWarning on a fatal error. This is a bug.\",\n );\n default:\n logDeprecationWarning(\n ctx,\n deprecationMessage || \"(no deprecation message included)\",\n );\n break;\n }\n }\n}\n\nexport async function hasTeam(ctx: Context, teamSlug: string) {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n return teams.some((team) => team.slug === teamSlug);\n}\n\nexport async function validateOrSelectTeam(\n ctx: Context,\n teamSlug: string | undefined,\n promptMessage: string,\n): Promise<{ team: TeamResponse; chosen: boolean }> {\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n if (teams.length === 0) {\n await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n errForSentry: \"No teams found\",\n printedMessage: chalkStderr.red(\"Error: No teams found\"),\n });\n }\n if (!teamSlug) {\n // Prompt the user to select if they belong to more than one team.\n switch (teams.length) {\n case 1:\n return { team: teams[0], chosen: false };\n default: {\n const teamSlug = await promptSearch(ctx, {\n message: promptMessage,\n choices: teams.map((team) => ({\n name: `${team.name} (${team.slug})`,\n value: team.slug,\n })),\n });\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Failed to select team`,\n });\n }\n return { team, chosen: true };\n }\n }\n } else {\n // Validate the chosen team.\n const team = teams.find((team) => team.slug === teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${teamSlug} not found, fix the --team option or remove it`,\n });\n }\n return { team, chosen: false };\n }\n}\n\nexport async function selectDevDeploymentType(\n ctx: Context,\n {\n chosenConfiguration,\n newOrExisting,\n teamSlug,\n projectSlug,\n userHasChosenSomethingInteractively,\n // from `--configure --dev-deployment local|cloud`\n devDeploymentFromFlag,\n }:\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"existing\";\n teamSlug: string;\n projectSlug: string;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n }\n | {\n chosenConfiguration: \"new\" | \"existing\" | \"ask\" | null;\n newOrExisting: \"new\";\n teamSlug: string;\n // For new projects we don't know the project slug yet.\n projectSlug: undefined;\n userHasChosenSomethingInteractively: boolean;\n devDeploymentFromFlag: \"cloud\" | \"local\" | undefined;\n },\n): Promise<{ devDeployment: \"cloud\" | \"local\" }> {\n if (devDeploymentFromFlag) return { devDeployment: devDeploymentFromFlag };\n\n if (newOrExisting === \"existing\" && chosenConfiguration === null) {\n // Don't suggest local dev if developer already has a cloud deployment.\n if (await projectHasExistingCloudDev(ctx, { projectSlug, teamSlug })) {\n // TODO Expand rollout to offer local dev in this case. ENG-8307\n return { devDeployment: \"cloud\" };\n }\n }\n\n // To avoid breaking previously non-interactive flows, don't prompt if enough\n // flags were specified for configure not to already have needed input.\n if (chosenConfiguration !== \"ask\" && !userHasChosenSomethingInteractively) {\n return { devDeployment: \"cloud\" };\n }\n\n // For creating a first project (no projects exist) or joining a first project\n // (one project exists), always use cloud since it's a smoother experience.\n const isFirstProject =\n (await bigBrainEnableFeatureMetadata(ctx)).totalProjects.kind !==\n \"multiple\";\n if (isFirstProject) {\n return { devDeployment: \"cloud\" };\n }\n\n // For now default is always cloud.\n const devDeployment: \"cloud\" | \"local\" = await promptOptions(ctx, {\n message:\n \"Use cloud or local dev deployment? For more see https://docs.convex.dev/cli/local-deployments\",\n default: \"cloud\",\n choices: [\n { name: \"cloud deployment\", value: \"cloud\" },\n { name: \"local deployment (BETA)\", value: \"local\" },\n ],\n });\n return { devDeployment };\n}\n\nexport async function logNoDefaultRegionMessage(teamSlug: string) {\n const { teamDashboardUrl } = await import(\"../dashboard.js\");\n const noDefaultRegionMessage = chalkStderr.gray(\n `Tip: you can configure a default region for your team at ${chalkStderr.underline(`${teamDashboardUrl(teamSlug)}/settings`)}`,\n );\n logMessage(noDefaultRegionMessage);\n}\n\nexport async function selectRegionOrUseDefault(\n ctx: Context,\n selectedTeam: TeamResponse,\n deploymentType: CloudDeploymentType,\n) {\n if (!process.stdin.isTTY) {\n // Use the team default in non-interactive terminals\n if (!selectedTeam.defaultRegion) {\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedTeam.defaultRegion ?? null;\n }\n const selectedRegionName =\n selectedTeam.defaultRegion ??\n (await selectRegion(ctx, selectedTeam.id, deploymentType));\n if (!selectedTeam.defaultRegion) {\n // Log after the user chooses a region\n await logNoDefaultRegionMessage(selectedTeam.slug);\n }\n return selectedRegionName;\n}\n\nexport async function selectRegion(\n ctx: Context,\n teamId: number,\n deploymentType: CloudDeploymentType,\n): Promise<RegionName> {\n const regionsResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_regions\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n const choices = regionsResponse.items\n .filter((item) => Boolean(item.available))\n .map((item) => ({\n name: item.displayName,\n value: item.name,\n }))\n .sort((a, b) => {\n // Show US region first if it exists\n if (a.value === \"aws-us-east-1\") return -1;\n if (b.value === \"aws-us-east-1\") return 1;\n return 0;\n });\n return await promptOptions(ctx, {\n message: `Where should this ${deploymentType} deployment run?`,\n suffix: `\\n${chalkStderr.gray(\n \"See https://www.convex.dev/pricing for pricing\",\n )}`,\n choices,\n });\n}\n\nexport async function hasProject(\n ctx: Context,\n teamSlug: string,\n projectSlug: string,\n) {\n try {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n return !!projects.find((project) => project.slug === projectSlug);\n } catch {\n return false;\n }\n}\n\nexport async function hasProjects(ctx: Context) {\n return !!(await bigBrainAPI({ ctx, method: \"GET\", path: `has_projects` }));\n}\n\nexport async function validateOrSelectProject(\n ctx: Context,\n projectSlug: string | undefined,\n teamSlug: string,\n singleProjectPrompt: string,\n multiProjectPrompt: string,\n): Promise<string | null> {\n const projects: Project[] = (\n await typedBigBrainClient(ctx).GET(\"/teams/{team_slug}/projects\", {\n params: {\n path: {\n team_slug: teamSlug,\n },\n },\n })\n ).data!;\n if (projects.length === 0) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No existing projects! Run this command again and choose \"create a new project.\"`,\n });\n }\n if (!projectSlug) {\n // Prompt the user to select project.\n switch (projects.length) {\n case 1: {\n const project = projects[0];\n const confirmed = await promptYesNo(ctx, {\n message: `${singleProjectPrompt} ${project.name} (${project.slug})?`,\n });\n\n if (!confirmed) {\n return null;\n }\n return projects[0].slug;\n }\n default:\n return await promptSearch(ctx, {\n message: multiProjectPrompt,\n choices: projects.map((project: Project) => ({\n name: `${project.name} (${project.slug})`,\n value: project.slug,\n })),\n });\n }\n } else {\n // Validate the chosen project.\n if (!projects.find((project) => project.slug === projectSlug)) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Project ${projectSlug} not found, fix the --project option or remove it`,\n });\n }\n return projectSlug;\n }\n}\n\n/**\n * @param ctx\n * @returns a Record of dependency name to dependency version for dependencies\n * and devDependencies\n */\nexport async function loadPackageJson(\n ctx: Context,\n includePeerDeps = false,\n): Promise<Record<string, string>> {\n let packageJson;\n try {\n packageJson = ctx.fs.readUtf8File(\"package.json\");\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Unable to read your package.json: ${\n err as any\n }. Make sure you're running this command from the root directory of a Convex app that contains the package.json`,\n });\n }\n let obj;\n try {\n obj = JSON.parse(packageJson);\n } catch (err) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n errForSentry: err,\n printedMessage: `Unable to parse package.json: ${err as any}`,\n });\n }\n if (typeof obj !== \"object\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Expected to parse an object from package.json\",\n });\n }\n const packages = {\n ...(includePeerDeps ? (obj.peerDependencies ?? {}) : {}),\n ...(obj.dependencies ?? {}),\n ...(obj.devDependencies ?? {}),\n };\n return packages;\n}\n\nexport async function ensureHasConvexDependency(ctx: Context, cmd: string) {\n const packages = await loadPackageJson(ctx, true);\n const hasConvexDependency = \"convex\" in packages;\n if (!hasConvexDependency) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `In order to ${cmd}, add \\`convex\\` to your package.json dependencies.`,\n });\n }\n}\n\n/** Return a new array with elements of the passed in array sorted by a key lambda */\nexport const sorted = <T>(arr: T[], key: (el: T) => any): T[] => {\n const newArr = [...arr];\n const cmp = (a: T, b: T) => {\n if (key(a) < key(b)) return -1;\n if (key(a) > key(b)) return 1;\n return 0;\n };\n return newArr.sort(cmp);\n};\n\nexport function functionsDir(\n configPath: string,\n projectConfig: ProjectConfig,\n): string {\n return path.join(path.dirname(configPath), projectConfig.functions);\n}\n\nfunction convexName() {\n // Use a different directory for config files generated for tests\n if (process.env.CONVEX_PROVISION_HOST) {\n const port = process.env.CONVEX_PROVISION_HOST.split(\":\")[2];\n if (port === undefined || port === \"8050\") {\n return `convex-test`;\n } else {\n return `convex-test-${port}`;\n }\n }\n return \"convex\";\n}\n\nexport function rootDirectory(): string {\n return path.join(os.homedir(), `.${convexName()}`);\n}\n\nexport function cacheDir() {\n const name = convexName();\n const platform = process.platform;\n if (platform === \"win32\") {\n // On Windows, `LOCALAPPDATA` is usually set, but fall back to\n // `USERPROFILE` if not, and fall back to homedir if all else fails.\n if (process.env.LOCALAPPDATA) {\n return path.join(process.env.LOCALAPPDATA, name);\n }\n if (process.env.USERPROFILE) {\n return path.join(process.env.USERPROFILE, \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \"AppData\", \"Local\", name);\n }\n return path.join(os.homedir(), \".cache\", name);\n}\n\n/**\n * Fetch with appropriate headers for the Convex Management API.\n *\n * This fetch() also has retries and throws if the response is not ok.\n */\nexport function bigBrainFetch(ctx: Context): typeof fetch {\n const authHeader = ctx.bigBrainAuth()?.header;\n const bigBrainHeaders: Record<string, string> = authHeader\n ? {\n Authorization: authHeader,\n \"Convex-Client\": `npm-cli-${version}`,\n }\n : {\n \"Convex-Client\": `npm-cli-${version}`,\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const { headers: optionsHeaders, ...rest } = options || {};\n // Use the options headers if they exist. Otherwise, use the request headers\n const headers = {\n ...bigBrainHeaders,\n ...(optionsHeaders ??\n (resource instanceof Request\n ? Object.fromEntries(resource.headers.entries())\n : {})),\n };\n const opts = {\n retries: MAX_RETRIES,\n retryDelay,\n headers,\n ...rest,\n };\n\n return throwingFetch(resource, opts);\n };\n}\n\nexport async function bigBrainAPI<T = any>({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<T> {\n const dataString =\n data === undefined\n ? undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n try {\n return await bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data: dataString,\n });\n } catch (err: unknown) {\n return await logAndHandleFetchError(ctx, err);\n }\n}\n\n/**\n * Typed API client with a fetch() implemention that includes retries and crashes on errors.\n * It is always safe to call `.data!` on the response: any error would throw or crash.\n *\n * Pass { throw: true } to throw ThrowingFetchErrors instead of exiting the process.\n */\nfunction typedApiClientFactory<T>(\n baseUrl: string,\n fetchBuilder: (ctx: Context) => typeof fetch,\n) {\n return (ctx: Context, options: { throw?: boolean } = {}) => {\n type Paths = T extends CliManagementPaths\n ? CliManagementPaths\n : T extends PlatformManagementPaths\n ? PlatformManagementPaths\n : T extends PlatformDeploymentPaths\n ? PlatformDeploymentPaths\n : never;\n const client = createClient<Paths>({\n baseUrl,\n fetch: fetchBuilder(ctx),\n });\n\n // Wrap the client with error handling - go back to proxy since middleware doesn't catch parsing errors\n return new Proxy(client, {\n get(target, prop) {\n const originalMethod = target[prop as keyof typeof target];\n\n if (\n prop === \"GET\" ||\n prop === \"POST\" ||\n prop === \"HEAD\" ||\n prop === \"OPTIONS\" ||\n prop === \"PUT\" ||\n prop === \"DELETE\" ||\n prop === \"PATCH\" ||\n prop === \"TRACE\"\n ) {\n return async (...args: any[]) => {\n try {\n return await (originalMethod as Function).apply(target, args);\n } catch (err: unknown) {\n if (options.throw) {\n // eslint-disable-next-line no-restricted-syntax\n throw err;\n }\n return await logAndHandleFetchError(ctx, err);\n }\n };\n }\n\n return originalMethod;\n },\n });\n };\n}\n\nexport const typedBigBrainClient = typedApiClientFactory<CliManagementPaths>(\n BIG_BRAIN_URL,\n bigBrainFetch,\n);\nexport const typedPlatformClient =\n typedApiClientFactory<PlatformManagementPaths>(\n PLATFORM_MANAGEMENT_API_URL,\n bigBrainFetch,\n );\n\nexport function typedDeploymentClient(\n ctx: Context,\n args: { deploymentUrl: string; adminKey: string },\n options: { throw?: boolean } = {},\n) {\n return typedApiClientFactory<PlatformDeploymentPaths>(\n `${args.deploymentUrl}/api/v1`,\n (ctx) =>\n deploymentFetch(ctx, {\n deploymentUrl: args.deploymentUrl,\n adminKey: args.adminKey,\n }),\n )(ctx, options);\n}\n\nexport async function bigBrainAPIMaybeThrows({\n ctx,\n method,\n path,\n data,\n}: {\n ctx: Context;\n method: \"GET\" | \"POST\" | \"HEAD\";\n path: string;\n data?: any;\n}): Promise<any> {\n const fetch = bigBrainFetch(ctx);\n const dataString =\n data === undefined\n ? method === \"POST\"\n ? JSON.stringify({})\n : undefined\n : typeof data === \"string\"\n ? data\n : JSON.stringify(data);\n const res = await fetch(new URL(path, BIG_BRAIN_URL), {\n method,\n ...(dataString ? { body: dataString } : {}),\n headers:\n method === \"POST\"\n ? {\n \"Content-Type\": \"application/json\",\n }\n : {},\n });\n deprecationCheckWarning(ctx, res);\n if (res.status === 200) {\n return await res.json();\n }\n}\n\n/**\n * Polls an arbitrary function until a condition is met.\n *\n * @param fetch Function performing a fetch, returning resulting data.\n * @param condition This function will terminate polling when it returns `true`.\n * @param waitMs How long to wait in between fetches.\n * @returns The resulting data from `fetch`.\n */\nexport const poll = async function <Result>(\n fetch: () => Promise<Result>,\n condition: (data: Result) => boolean,\n waitMs = 1000,\n) {\n let result = await fetch();\n while (!condition(result)) {\n await wait(waitMs);\n result = await fetch();\n }\n return result;\n};\n\nconst wait = function (waitMs: number) {\n return new Promise((resolve) => {\n setTimeout(resolve, waitMs);\n });\n};\n\nexport function waitForever() {\n // This never resolves\n return new Promise((_) => {\n // ignore\n });\n}\n\n// Returns a promise and a function that resolves the promise.\nexport function waitUntilCalled(): [Promise<unknown>, () => void] {\n let onCalled: (v: unknown) => void;\n const waitPromise = new Promise((resolve) => (onCalled = resolve));\n return [waitPromise, () => onCalled(null)];\n}\n\nconst BYTE_UNITS = [\"bytes\", \"KiB\", \"MiB\", \"GiB\", \"TiB\", \"PiB\"];\n\n/**\n * Format a byte count into a human-friendly string, rounded to one decimal\n * place (dropped when it would be \".0\"), e.g. \"4.1 MiB\" or \"128 MiB\".\n */\nexport function formatSize(n: number): string {\n let value = n;\n let unitIndex = 0;\n while (value >= 1024 && unitIndex < BYTE_UNITS.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n // Rounding to one decimal place can itself reach the next unit's\n // boundary (e.g. 1023.999 KiB -> \"1024.0 KiB\" instead of \"1.0 MiB\").\n const roundedValue = Number(value.toFixed(1));\n if (roundedValue >= 1024 && unitIndex < BYTE_UNITS.length - 1) {\n value /= 1024;\n unitIndex++;\n }\n const formatted = value.toFixed(1).replace(/\\.0$/, \"\");\n return `${formatted} ${BYTE_UNITS[unitIndex]}`;\n}\n\nexport function formatDuration(ms: number): string {\n const twoDigits = (n: number, unit: string) =>\n `${n.toLocaleString(\"en-US\", { maximumFractionDigits: 2 })}${unit}`;\n\n if (ms < 1e-3) {\n return twoDigits(ms * 1e9, \"ns\");\n }\n if (ms < 1) {\n return twoDigits(ms * 1e3, \"\u00B5s\");\n }\n if (ms < 1e3) {\n return twoDigits(ms, \"ms\");\n }\n const s = ms / 1e3;\n if (s < 60) {\n return twoDigits(ms / 1e3, \"s\");\n }\n return twoDigits(s / 60, \"m\");\n}\n\nexport function getCurrentTimeString() {\n const now = new Date();\n const hours = String(now.getHours()).padStart(2, \"0\");\n const minutes = String(now.getMinutes()).padStart(2, \"0\");\n const seconds = String(now.getSeconds()).padStart(2, \"0\");\n return `${hours}:${minutes}:${seconds}`;\n}\n\n// We don't allow running commands in project subdirectories yet,\n// but we can provide better errors if we look around.\nexport async function findParentConfigs(ctx: Context): Promise<{\n parentPackageJson: string;\n parentConvexJson?: string | undefined;\n}> {\n const parentPackageJson = findUp(ctx, \"package.json\");\n if (!parentPackageJson) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage:\n \"No package.json found. To create a new project using Convex, see https://docs.convex.dev/home#quickstarts\",\n });\n }\n const candidateConvexJson =\n parentPackageJson &&\n path.join(path.dirname(parentPackageJson), \"convex.json\");\n const parentConvexJson =\n candidateConvexJson && ctx.fs.exists(candidateConvexJson)\n ? candidateConvexJson\n : undefined;\n return {\n parentPackageJson,\n parentConvexJson,\n };\n}\n\n/**\n * Finds a file in the current working directory or a parent.\n *\n * @returns The absolute path of the first file found or undefined.\n */\nfunction findUp(ctx: Context, filename: string): string | undefined {\n let curDir = path.resolve(\".\");\n let parentDir = curDir;\n do {\n const candidate = path.join(curDir, filename);\n if (ctx.fs.exists(candidate)) {\n return candidate;\n }\n curDir = parentDir;\n parentDir = path.dirname(curDir);\n } while (parentDir !== curDir);\n return;\n}\n\n/**\n * Returns whether there's an existing project config. Throws\n * if this is not a valid directory for a project config.\n */\nexport async function isInExistingProject(ctx: Context) {\n const { parentPackageJson, parentConvexJson } = await findParentConfigs(ctx);\n if (parentPackageJson !== path.resolve(\"package.json\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: \"Run this command from the root directory of a project.\",\n });\n }\n return !!parentConvexJson;\n}\n\n// `spawnAsync` is the async version of Node's `spawnSync` (and `spawn`).\n//\n// By default, this returns the produced `stdout` and `stderror` and\n// an error if one was encountered (to mirror `spawnSync`).\n//\n// If `stdio` is set to `\"inherit\"`, pipes `stdout` and `stderror` (\n// pausing the spinner if one is running) and rejects the promise\n// on errors (to mirror `execFileSync`).\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n): Promise<{\n stdout: string;\n stderr: string;\n status: null | number;\n error?: Error | undefined;\n}>;\nexport function spawnAsync(\n ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options: { stdio: \"inherit\"; shell?: boolean },\n): Promise<void>;\nexport function spawnAsync(\n _ctx: Context,\n command: string,\n args: ReadonlyArray<string>,\n options?: { stdio: \"inherit\"; shell?: boolean },\n) {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, { shell: options?.shell });\n let stdout = \"\";\n let stderr = \"\";\n\n const pipeOutput = options?.stdio === \"inherit\";\n\n if (pipeOutput) {\n child.stdout.on(\"data\", (text) =>\n logMessage(text.toString(\"utf-8\").trimEnd()),\n );\n child.stderr.on(\"data\", (text) =>\n logError(text.toString(\"utf-8\").trimEnd()),\n );\n } else {\n child.stdout.on(\"data\", (data) => {\n stdout += data.toString(\"utf-8\");\n });\n\n child.stderr.on(\"data\", (data) => {\n stderr += data.toString(\"utf-8\");\n });\n }\n\n const completionListener = (code: number | null) => {\n child.removeListener(\"error\", errorListener);\n const result = pipeOutput\n ? { status: code }\n : { stdout, stderr, status: code };\n if (code !== 0) {\n const argumentString =\n args && args.length > 0 ? ` ${args.join(\" \")}` : \"\";\n const error = new Error(\n `\\`${command}${argumentString}\\` exited with non-zero code: ${code}`,\n );\n if (pipeOutput) {\n reject({ ...result, error });\n } else {\n resolve({ ...result, error });\n }\n } else {\n resolve(result);\n }\n };\n\n const errorListener = (error: Error) => {\n child.removeListener(\"exit\", completionListener);\n child.removeListener(\"close\", completionListener);\n if (pipeOutput) {\n reject({ error, status: null });\n } else {\n resolve({ error, status: null });\n }\n };\n\n if (pipeOutput) {\n child.once(\"exit\", completionListener);\n } else {\n child.once(\"close\", completionListener);\n }\n child.once(\"error\", errorListener);\n });\n}\n\nconst IDEMPOTENT_METHODS = [\"GET\", \"HEAD\", \"PUT\", \"DELETE\", \"OPTIONS\", \"TRACE\"];\n\n// immediate, 1s delay, 2s delay, 4s delay, etc.\nexport function retryDelay(\n attempt: number,\n _error: Error | null,\n _response: Response | null,\n): number {\n const delay = attempt === 0 ? 1 : 2 ** (attempt - 1) * 1000;\n const randomSum = delay * 0.2 * Math.random();\n return delay + randomSum;\n}\n\nfunction deploymentFetchRetryOn(\n onError?: (err: any, attempt: number) => void,\n method?: string,\n maxRetries: number = MAX_RETRIES,\n shouldRetryOverride?: (\n error: Error | null,\n response: Response | null,\n ) => boolean,\n) {\n const defaultShouldRetry = function (\n _attempt: number,\n error: Error | null,\n response: Response | null,\n ): { kind: \"retry\"; error: any } | { kind: \"stop\" } {\n // Retry on network errors.\n if (error !== null) {\n // TODO filter out all SSL errors\n // https://github.com/nodejs/node/blob/8a41d9b636be86350cd32847c3f89d327c4f6ff7/src/crypto/crypto_common.cc#L218-L245\n return { kind: \"retry\", error: error };\n }\n // Retry on 404s since these can sometimes happen with newly created\n // deployments for POSTs.\n if (response?.status === 404) {\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n // Whatever the error code it doesn't hurt to retry idempotent requests.\n if (\n response &&\n !response.ok &&\n method &&\n IDEMPOTENT_METHODS.includes(method.toUpperCase())\n ) {\n // ...but it's a bit annoying to wait for things we know won't succced\n if (\n [\n 400, // Bad Request\n 401, // Unauthorized\n 402, // PaymentRequired\n 403, // Forbidden\n 405, // Method Not Allowed\n 406, // Not Acceptable\n 412, // Precondition Failed\n 413, // Payload Too Large\n 414, // URI Too Long\n 415, // Unsupported Media Type\n 416, // Range Not Satisfiable\n ].includes(response.status)\n ) {\n return {\n kind: \"stop\",\n };\n }\n return {\n kind: \"retry\",\n error: `Received response with status ${response.status}`,\n };\n }\n\n return { kind: \"stop\" };\n };\n\n const shouldRetry = shouldRetryOverride\n ? function (\n _attempt: number,\n error: Error | null,\n response: Response | null,\n ): { kind: \"retry\"; error: any } | { kind: \"stop\" } {\n return shouldRetryOverride(error, response)\n ? {\n kind: \"retry\",\n error:\n error ?? `Received response with status ${response?.status}`,\n }\n : { kind: \"stop\" };\n }\n : defaultShouldRetry;\n return function (\n attempt: number,\n error: Error | null,\n response: Response | null,\n ) {\n const result = shouldRetry(attempt, error, response);\n if (result.kind === \"retry\") {\n onError?.(result.error, attempt);\n }\n if (attempt >= maxRetries) {\n // Stop retrying if we've exhausted all retries, but do this after we've\n // called `onError` so that the caller can still log the error.\n return false;\n }\n return result.kind === \"retry\";\n };\n}\n\n/**\n * Unlike `deploymentFetch`, this does not add on any headers, so the caller\n * must supply any headers.\n */\nexport function bareDeploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n onError?: (err: any) => void;\n },\n): typeof throwingFetch {\n const { deploymentUrl, onError } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${MAX_RETRIES})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(onErrorWithAttempt, options?.method),\n ...options,\n });\n return func;\n };\n}\n\n/**\n * This returns a `fetch` function that will fetch against `deploymentUrl`.\n *\n * It will also set the `Authorization` header, `Content-Type` header, and\n * the `Convex-Client` header if they are not set in the `fetch`.\n */\nexport function deploymentFetch(\n _ctx: Context,\n options: {\n deploymentUrl: string;\n adminKey: string;\n onError?: (err: any) => void;\n // Defaults to MAX_RETRIES. Lower this for best-effort requests (e.g.\n // advisory checks) where a slow retry loop against an unsupported or\n // unhealthy endpoint shouldn't hold up the surrounding command.\n maxRetries?: number | undefined;\n // Replaces the default retry policy (which is tuned for pushes: network\n // errors, 404s on fresh deployments, retries of idempotent methods).\n // Return true to retry the request. Backoff and retry logging are\n // shared either way.\n shouldRetry?: (error: Error | null, response: Response | null) => boolean;\n },\n): typeof fetch {\n const {\n deploymentUrl,\n adminKey,\n onError,\n maxRetries = MAX_RETRIES,\n shouldRetry,\n } = options;\n const onErrorWithAttempt = (err: any, attempt: number) => {\n onError?.(err);\n if (attempt >= RETRY_LOG_THRESHOLD) {\n logMessage(\n chalkStderr.gray(\n `Retrying request (attempt ${attempt}/${maxRetries})...`,\n ),\n );\n }\n };\n return (resource: RequestInfo | URL, options: RequestInit | undefined) => {\n const url =\n resource instanceof URL\n ? resource.pathname\n : typeof resource === \"string\"\n ? new URL(resource, deploymentUrl)\n : new URL(resource.url, deploymentUrl);\n\n const headers = new Headers(options?.headers || {});\n if (!headers.has(\"Authorization\")) {\n headers.set(\"Authorization\", `Convex ${adminKey}`);\n }\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json\");\n }\n if (!headers.has(\"Convex-Client\")) {\n headers.set(\"Convex-Client\", `npm-cli-${version}`);\n }\n const func = throwingFetch(url, {\n retryDelay,\n retryOn: deploymentFetchRetryOn(\n onErrorWithAttempt,\n options?.method,\n maxRetries,\n shouldRetry,\n ),\n ...options,\n headers,\n });\n return func;\n };\n}\n\n/**\n * Whether this is likely to be a WebContainer,\n * WebContainers can't complete the WorkOS login but where that login flow\n * fails has changed with the environment.\n */\nexport function isWebContainer(): boolean {\n // Dynamic require as used here doesn't work with tsx\n if (process.env.CONVEX_RUNNING_LIVE_IN_MONOREPO) {\n return false;\n }\n const dynamicRequire = require;\n if (process.versions.webcontainer === undefined) {\n return false;\n }\n let blitzInternalEnv: unknown;\n try {\n blitzInternalEnv = dynamicRequire(\"@blitz/internal/env\");\n // totally fine for this require to fail\n // eslint-disable-next-line no-empty\n } catch {}\n return blitzInternalEnv !== null && blitzInternalEnv !== undefined;\n}\n\n// For (rare) special behaviors based on package.json details.\nexport async function currentPackageHomepage(\n ctx: Context,\n): Promise<string | null> {\n const { parentPackageJson: packageJsonPath } = await findParentConfigs(ctx);\n let packageJson: any;\n try {\n const packageJsonString = ctx.fs.readUtf8File(packageJsonPath);\n packageJson = JSON.parse(packageJsonString);\n } catch (error: any) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"invalid filesystem data\",\n printedMessage: `Couldn't parse \"${packageJsonPath}\". Make sure it's a valid JSON. Error: ${error}`,\n });\n }\n const name = packageJson[\"homepage\"];\n if (typeof name !== \"string\") {\n // wrong type or missing\n return null;\n }\n return name;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["teamSlug", "team", "path", "ctx", "fetch", "options"]
|
|
7
7
|
}
|
package/dist/esm/index.js
CHANGED