convex 1.42.2 → 1.43.0-alpha.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 +8 -1
- package/bin/main-dev +6 -1
- package/dist/browser.bundle.js +49 -10
- package/dist/browser.bundle.js.map +2 -2
- package/dist/cjs/browser/index.js.map +2 -2
- package/dist/cjs/browser/simple_client-node.js +35 -35
- package/dist/cjs/browser/simple_client-node.js.map +2 -2
- package/dist/cjs/browser/sync/client.js.map +1 -1
- package/dist/cjs/browser/sync/paginated_query_client.js +20 -9
- package/dist/cjs/browser/sync/paginated_query_client.js.map +2 -2
- package/dist/cjs/cli/codegen_templates/component_api.js +2 -2
- package/dist/cjs/cli/codegen_templates/component_api.js.map +2 -2
- package/dist/cjs/cli/codegen_templates/validator_helpers.js +2 -0
- package/dist/cjs/cli/codegen_templates/validator_helpers.js.map +2 -2
- package/dist/cjs/cli/deployment.js +2 -1
- package/dist/cjs/cli/deployment.js.map +2 -2
- package/dist/cjs/cli/deploymentCreate.js.map +2 -2
- package/dist/cjs/cli/generatedApi.js.map +1 -1
- package/dist/cjs/cli/lib/deployApi/validator.js +1 -0
- package/dist/cjs/cli/lib/deployApi/validator.js.map +2 -2
- package/dist/cjs/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/cjs/cli/lib/generateDocs.js +1 -1
- package/dist/cjs/cli/lib/generateDocs.js.map +2 -2
- package/dist/cjs/cli/lib/generatedFunctionLogsApi.js.map +1 -1
- package/dist/cjs/cli/lib/localDeployment/projectMismatch.js.map +2 -2
- package/dist/cjs/cli/lib/login.js +23 -23
- package/dist/cjs/cli/lib/login.js.map +2 -2
- package/dist/cjs/cli/lib/typecheck.js +28 -25
- package/dist/cjs/cli/lib/typecheck.js.map +2 -2
- package/dist/cjs/cli/lib/usageLimits.js +164 -0
- package/dist/cjs/cli/lib/usageLimits.js.map +7 -0
- package/dist/cjs/cli/usageLimits.js +326 -0
- package/dist/cjs/cli/usageLimits.js.map +7 -0
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/react/client.js.map +2 -2
- package/dist/cjs/server/components/index.js.map +2 -2
- package/dist/cjs/server/cron.js +33 -29
- package/dist/cjs/server/cron.js.map +2 -2
- package/dist/cjs/server/database.js.map +1 -1
- package/dist/cjs/server/impl/database_impl.js +3 -0
- package/dist/cjs/server/impl/database_impl.js.map +2 -2
- package/dist/cjs/server/log.js +2 -1
- package/dist/cjs/server/log.js.map +2 -2
- package/dist/cjs/server/logVars.js +12 -1
- package/dist/cjs/server/logVars.js.map +2 -2
- package/dist/cjs/server/meta.js.map +1 -1
- package/dist/cjs/values/compare.js +5 -1
- package/dist/cjs/values/compare.js.map +2 -2
- package/dist/cjs/values/index.js +1 -0
- package/dist/cjs/values/index.js.map +2 -2
- package/dist/cjs/values/size.js +4 -0
- package/dist/cjs/values/size.js.map +2 -2
- package/dist/cjs/values/validator.js +11 -0
- package/dist/cjs/values/validator.js.map +2 -2
- package/dist/cjs/values/validators.js +20 -0
- package/dist/cjs/values/validators.js.map +2 -2
- package/dist/cjs/values/value.js +31 -0
- package/dist/cjs/values/value.js.map +2 -2
- package/dist/cjs-types/browser/index.d.ts.map +1 -1
- package/dist/cjs-types/browser/sync/paginated_query_client.d.ts +1 -38
- package/dist/cjs-types/browser/sync/paginated_query_client.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/component_api.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.d.ts.map +1 -1
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts +2 -0
- package/dist/cjs-types/cli/codegen_templates/validator_helpers.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/deployment.d.ts.map +1 -1
- package/dist/cjs-types/cli/deploymentCreate.d.ts +2 -2
- package/dist/cjs-types/cli/generatedApi.d.ts +43 -43
- package/dist/cjs-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deployApi/validator.d.ts +6 -0
- package/dist/cjs-types/cli/lib/deployApi/validator.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts +2 -2
- package/dist/cjs-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts +45 -45
- package/dist/cjs-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/localDeployment/projectMismatch.d.ts +2 -2
- package/dist/cjs-types/cli/lib/localDeployment/projectMismatch.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/login.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/mcp/tools/insights.d.ts +24 -24
- package/dist/cjs-types/cli/lib/typecheck.d.ts +2 -0
- package/dist/cjs-types/cli/lib/typecheck.d.ts.map +1 -1
- package/dist/cjs-types/cli/lib/typecheck.test.d.ts +2 -0
- package/dist/cjs-types/cli/lib/typecheck.test.d.ts.map +1 -0
- package/dist/cjs-types/cli/lib/usageLimits.d.ts +46 -0
- package/dist/cjs-types/cli/lib/usageLimits.d.ts.map +1 -0
- package/dist/cjs-types/cli/usageLimits.d.ts +22 -0
- package/dist/cjs-types/cli/usageLimits.d.ts.map +1 -0
- package/dist/cjs-types/index.d.ts +1 -1
- package/dist/cjs-types/index.d.ts.map +1 -1
- package/dist/cjs-types/react/client.d.ts.map +1 -1
- package/dist/cjs-types/server/components/index.d.ts +26 -8
- package/dist/cjs-types/server/components/index.d.ts.map +1 -1
- package/dist/cjs-types/server/cron.d.ts +20 -11
- package/dist/cjs-types/server/cron.d.ts.map +1 -1
- package/dist/cjs-types/server/cron.test.d.ts +2 -0
- package/dist/cjs-types/server/cron.test.d.ts.map +1 -0
- package/dist/cjs-types/server/database.d.ts.map +1 -1
- package/dist/cjs-types/server/impl/database_impl.d.ts.map +1 -1
- package/dist/cjs-types/server/log.d.ts.map +1 -1
- package/dist/cjs-types/server/logVars.d.ts +14 -1
- package/dist/cjs-types/server/logVars.d.ts.map +1 -1
- package/dist/cjs-types/server/meta.d.ts +2 -2
- package/dist/cjs-types/server/meta.d.ts.map +1 -1
- package/dist/cjs-types/values/compare.d.ts.map +1 -1
- package/dist/cjs-types/values/index.d.ts +2 -2
- package/dist/cjs-types/values/index.d.ts.map +1 -1
- package/dist/cjs-types/values/size.d.ts +1 -1
- package/dist/cjs-types/values/size.d.ts.map +1 -1
- package/dist/cjs-types/values/validator.d.ts +10 -1
- package/dist/cjs-types/values/validator.d.ts.map +1 -1
- package/dist/cjs-types/values/validators.d.ts +14 -3
- package/dist/cjs-types/values/validators.d.ts.map +1 -1
- package/dist/cjs-types/values/value.d.ts +18 -1
- package/dist/cjs-types/values/value.d.ts.map +1 -1
- package/dist/cli.bundle.cjs +2327 -1866
- package/dist/cli.bundle.cjs.map +4 -4
- package/dist/esm/browser/index.js.map +2 -2
- package/dist/esm/browser/simple_client-node.js +35 -35
- package/dist/esm/browser/simple_client-node.js.map +1 -1
- package/dist/esm/browser/sync/client.js.map +1 -1
- package/dist/esm/browser/sync/paginated_query_client.js +20 -9
- package/dist/esm/browser/sync/paginated_query_client.js.map +2 -2
- package/dist/esm/cli/codegen_templates/component_api.js +8 -3
- package/dist/esm/cli/codegen_templates/component_api.js.map +2 -2
- package/dist/esm/cli/codegen_templates/validator_helpers.js +2 -0
- package/dist/esm/cli/codegen_templates/validator_helpers.js.map +2 -2
- package/dist/esm/cli/deployment.js +2 -1
- package/dist/esm/cli/deployment.js.map +2 -2
- package/dist/esm/cli/deploymentCreate.js.map +2 -2
- package/dist/esm/cli/lib/deployApi/validator.js +1 -0
- package/dist/esm/cli/lib/deployApi/validator.js.map +2 -2
- package/dist/esm/cli/lib/deploymentSelection.js.map +2 -2
- package/dist/esm/cli/lib/generateDocs.js +1 -1
- package/dist/esm/cli/lib/generateDocs.js.map +2 -2
- package/dist/esm/cli/lib/localDeployment/projectMismatch.js.map +2 -2
- package/dist/esm/cli/lib/login.js +23 -23
- package/dist/esm/cli/lib/login.js.map +2 -2
- package/dist/esm/cli/lib/typecheck.js +27 -25
- package/dist/esm/cli/lib/typecheck.js.map +2 -2
- package/dist/esm/cli/lib/usageLimits.js +129 -0
- package/dist/esm/cli/lib/usageLimits.js.map +7 -0
- package/dist/esm/cli/usageLimits.js +316 -0
- package/dist/esm/cli/usageLimits.js.map +7 -0
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/react/client.js.map +2 -2
- package/dist/esm/server/components/index.js.map +2 -2
- package/dist/esm/server/cron.js +33 -29
- package/dist/esm/server/cron.js.map +2 -2
- package/dist/esm/server/impl/database_impl.js +4 -1
- package/dist/esm/server/impl/database_impl.js.map +2 -2
- package/dist/esm/server/log.js +3 -2
- package/dist/esm/server/log.js.map +2 -2
- package/dist/esm/server/logVars.js +11 -1
- package/dist/esm/server/logVars.js.map +2 -2
- package/dist/esm/values/compare.js +5 -1
- package/dist/esm/values/compare.js.map +2 -2
- package/dist/esm/values/index.js +1 -1
- package/dist/esm/values/index.js.map +2 -2
- package/dist/esm/values/size.js +4 -0
- package/dist/esm/values/size.js.map +2 -2
- package/dist/esm/values/validator.js +12 -0
- package/dist/esm/values/validator.js.map +2 -2
- package/dist/esm/values/validators.js +19 -0
- package/dist/esm/values/validators.js.map +2 -2
- package/dist/esm/values/value.js +29 -1
- package/dist/esm/values/value.js.map +2 -2
- package/dist/esm-types/browser/index.d.ts.map +1 -1
- package/dist/esm-types/browser/sync/paginated_query_client.d.ts +1 -38
- package/dist/esm-types/browser/sync/paginated_query_client.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen_templates/component_api.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen_templates/validator_helpers.d.ts.map +1 -1
- package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts +2 -0
- package/dist/esm-types/cli/codegen_templates/validator_helpers.test.d.ts.map +1 -0
- package/dist/esm-types/cli/deployment.d.ts.map +1 -1
- package/dist/esm-types/cli/deploymentCreate.d.ts +2 -2
- package/dist/esm-types/cli/generatedApi.d.ts +43 -43
- package/dist/esm-types/cli/generatedApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deployApi/validator.d.ts +6 -0
- package/dist/esm-types/cli/lib/deployApi/validator.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts +2 -2
- package/dist/esm-types/cli/lib/deploymentSelection.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts +45 -45
- package/dist/esm-types/cli/lib/generatedFunctionLogsApi.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/localDeployment/projectMismatch.d.ts +2 -2
- package/dist/esm-types/cli/lib/localDeployment/projectMismatch.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/login.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/mcp/tools/insights.d.ts +24 -24
- package/dist/esm-types/cli/lib/typecheck.d.ts +2 -0
- package/dist/esm-types/cli/lib/typecheck.d.ts.map +1 -1
- package/dist/esm-types/cli/lib/typecheck.test.d.ts +2 -0
- package/dist/esm-types/cli/lib/typecheck.test.d.ts.map +1 -0
- package/dist/esm-types/cli/lib/usageLimits.d.ts +46 -0
- package/dist/esm-types/cli/lib/usageLimits.d.ts.map +1 -0
- package/dist/esm-types/cli/usageLimits.d.ts +22 -0
- package/dist/esm-types/cli/usageLimits.d.ts.map +1 -0
- package/dist/esm-types/index.d.ts +1 -1
- package/dist/esm-types/index.d.ts.map +1 -1
- package/dist/esm-types/react/client.d.ts.map +1 -1
- package/dist/esm-types/server/components/index.d.ts +26 -8
- package/dist/esm-types/server/components/index.d.ts.map +1 -1
- package/dist/esm-types/server/cron.d.ts +20 -11
- package/dist/esm-types/server/cron.d.ts.map +1 -1
- package/dist/esm-types/server/cron.test.d.ts +2 -0
- package/dist/esm-types/server/cron.test.d.ts.map +1 -0
- package/dist/esm-types/server/database.d.ts.map +1 -1
- package/dist/esm-types/server/impl/database_impl.d.ts.map +1 -1
- package/dist/esm-types/server/log.d.ts.map +1 -1
- package/dist/esm-types/server/logVars.d.ts +14 -1
- package/dist/esm-types/server/logVars.d.ts.map +1 -1
- package/dist/esm-types/server/meta.d.ts +2 -2
- package/dist/esm-types/server/meta.d.ts.map +1 -1
- package/dist/esm-types/values/compare.d.ts.map +1 -1
- package/dist/esm-types/values/index.d.ts +2 -2
- package/dist/esm-types/values/index.d.ts.map +1 -1
- package/dist/esm-types/values/size.d.ts +1 -1
- package/dist/esm-types/values/size.d.ts.map +1 -1
- package/dist/esm-types/values/validator.d.ts +10 -1
- package/dist/esm-types/values/validator.d.ts.map +1 -1
- package/dist/esm-types/values/validators.d.ts +14 -3
- package/dist/esm-types/values/validators.d.ts.map +1 -1
- package/dist/esm-types/values/value.d.ts +18 -1
- package/dist/esm-types/values/value.d.ts.map +1 -1
- package/dist/react.bundle.js +53 -11
- package/dist/react.bundle.js.map +2 -2
- package/package.json +8 -8
- package/schemas/convex.schema.json +2 -1
- package/src/browser/index.ts +2 -0
- package/src/browser/sync/client.test.ts +8 -1
- package/src/browser/sync/client.ts +63 -0
- package/src/browser/sync/paginated_query_client.test.ts +209 -1
- package/src/browser/sync/paginated_query_client.ts +29 -11
- package/src/cli/codegen_templates/component_api.ts +8 -3
- package/src/cli/codegen_templates/validator_helpers.test.ts +31 -0
- package/src/cli/codegen_templates/validator_helpers.ts +6 -0
- package/src/cli/deployment.ts +4 -1
- package/src/cli/deploymentCreate.test.ts +2 -2
- package/src/cli/deploymentCreate.ts +2 -2
- package/src/cli/generatedApi.ts +43 -43
- package/src/cli/lib/deployApi/validator.ts +1 -0
- package/src/cli/lib/deploymentSelection.ts +2 -2
- package/src/cli/lib/generateDocs.test.ts +1 -1
- package/src/cli/lib/generateDocs.ts +3 -3
- package/src/cli/lib/generatedFunctionLogsApi.ts +45 -45
- package/src/cli/lib/localDeployment/projectMismatch.ts +2 -2
- package/src/cli/lib/login.ts +33 -30
- package/src/cli/lib/typecheck.test.ts +71 -0
- package/src/cli/lib/typecheck.ts +33 -27
- package/src/cli/lib/usageLimits.ts +242 -0
- package/src/cli/usageLimits.ts +420 -0
- package/src/index.ts +1 -1
- package/src/react/ConvexAuthState.test.tsx +24 -8
- package/src/react/auth_websocket.test.tsx +39 -29
- package/src/react/client.ts +3 -2
- package/src/react/client_provided_base_client.test.tsx +154 -36
- package/src/server/audit_logging.test.ts +2 -0
- package/src/server/components/index.test.ts +33 -1
- package/src/server/components/index.ts +41 -14
- package/src/server/cron.test.ts +58 -0
- package/src/server/cron.ts +82 -21
- package/src/server/database.ts +17 -0
- package/src/server/impl/database_impl.ts +4 -1
- package/src/server/log.ts +4 -1
- package/src/server/logVars.ts +17 -1
- package/src/server/meta.ts +2 -2
- package/src/server/schema.test.ts +6 -1
- package/src/values/compare.ts +5 -2
- package/src/values/index.ts +2 -1
- package/src/values/size.test.ts +5 -0
- package/src/values/size.ts +5 -1
- package/src/values/validator.test.ts +16 -1
- package/src/values/validator.ts +13 -0
- package/src/values/validators.ts +29 -1
- package/src/values/value.test.ts +35 -0
- package/src/values/value.ts +56 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/codegen_templates/component_api.ts"],
|
|
4
|
-
"sourcesContent": ["import path from \"path\";\nimport { Context } from \"../../bundler/context.js\";\nimport { entryPoints } from \"../../bundler/index.js\";\nimport {\n ComponentDirectory,\n toAbsolutePath,\n toComponentDefinitionPath,\n ComponentDefinitionPath,\n} from \"../lib/components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"../lib/deployApi/startPush.js\";\nimport { importPath, moduleIdentifier } from \"./api.js\";\nimport { apiComment, compareStrings, header } from \"./common.js\";\nimport {\n ComponentExports,\n EvaluatedComponentDefinition,\n} from \"../lib/deployApi/componentDefinition.js\";\nimport { Identifier, Reference } from \"../lib/deployApi/types.js\";\nimport { CanonicalizedModulePath } from \"../lib/deployApi/paths.js\";\nimport {\n AnalyzedFunction,\n AnalyzedModule,\n Visibility,\n} from \"../lib/deployApi/modules.js\";\nimport { parseValidator, validatorToType } from \"./validator_helpers.js\";\n\nexport function componentApiJs() {\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n lines.push(`\n import { anyApi, componentsGeneric } from \"convex/server\";\n\n ${apiComment(\"api\", undefined)}\n export const api = anyApi;\n export const internal = anyApi;\n export const components = componentsGeneric();\n `);\n return lines.join(\"\\n\");\n}\n\nexport function rootComponentApiCJS() {\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n lines.push(`const { anyApi } = require(\"convex/server\");`);\n lines.push(`module.exports = {\n api: anyApi,\n internal: anyApi,\n };`);\n return lines.join(\"\\n\");\n}\n\nexport function componentApiStubDTS() {\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n lines.push(`import type { AnyApi, AnyComponents } from \"convex/server\";`);\n lines.push(`\n export declare const api: AnyApi;\n export declare const internal: AnyApi;\n export declare const components: AnyComponents;\n `);\n\n return lines.join(\"\\n\");\n}\n\n// This is also used for root components\nexport function componentApiStubTS() {\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n lines.push(`\n import type { AnyApi, AnyComponents } from \"convex/server\";\n import { anyApi, componentsGeneric } from \"convex/server\";\n\n export const api: AnyApi = anyApi;\n export const internal: AnyApi = anyApi;\n export const components: AnyComponents = componentsGeneric();\n `);\n return lines.join(\"\\n\");\n}\n\nexport async function componentApiDTS(\n ctx: Context,\n startPush: StartPushResponse,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n componentsMap: Map<string, ComponentDirectory>,\n opts: { staticApi: boolean; useComponentApiImports: boolean },\n) {\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n\n const analysis = startPush.analysis[definitionPath];\n if (!analysis) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No analysis found for component ${definitionPath} orig: ${definitionPath}\\nin\\n${Object.keys(startPush.analysis).toString()}`,\n });\n }\n\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n let apiLines: AsyncGenerator<string>;\n if (opts.staticApi) {\n apiLines = codegenStaticApiObjects(ctx, analysis);\n } else {\n apiLines = codegenDynamicApiObjects(ctx, componentDirectory);\n }\n for await (const line of apiLines) {\n lines.push(line);\n }\n\n lines.push(`\n export declare const components: {`);\n lines.push(\n ...(await componentApiLines(\n ctx,\n startPush,\n analysis,\n rootComponent,\n componentsMap,\n opts,\n )),\n );\n lines.push(\"};\");\n return lines.join(\"\\n\");\n}\n\nasync function componentApiLines(\n ctx: Context,\n startPush: StartPushResponse,\n analysis: EvaluatedComponentDefinition,\n rootComponent: ComponentDirectory,\n componentsMap: Map<string, ComponentDirectory>,\n opts: { useComponentApiImports: boolean },\n): Promise<string[]> {\n const lines: string[] = [];\n for (const childComponent of analysis.definition.childComponents) {\n if (opts.useComponentApiImports) {\n const absolutePath = toAbsolutePath(\n rootComponent,\n childComponent.path as ComponentDefinitionPath,\n );\n\n let childComponentWithRelativePath = componentsMap?.get(absolutePath);\n if (!childComponentWithRelativePath) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid child component directory: ${childComponent.path}`,\n });\n }\n\n // If the user uses a different import specifier than the absolute path of the child component, use the import specifier.\n const importSpecifier = childComponentWithRelativePath.importSpecifier;\n let importPath;\n // Don't trust relative specifiers\n if (\n importSpecifier &&\n !importSpecifier.startsWith(\".\") &&\n importSpecifier !== childComponent.path\n ) {\n importPath = importSpecifier;\n } else {\n importPath = `../${childComponent.path}`;\n }\n lines.push(\n ` \"${childComponent.name}\": import(\"${importPath}/_generated/component.js\").ComponentApi<\"${childComponent.name}\">,`,\n );\n } else {\n const childComponentAnalysis = startPush.analysis[childComponent.path];\n if (!childComponentAnalysis) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No analysis found for child component ${childComponent.path}`,\n });\n }\n for await (const line of codegenExports(\n ctx,\n childComponent.name,\n childComponentAnalysis,\n )) {\n lines.push(line);\n }\n }\n }\n return lines;\n}\n\nexport async function componentTS(\n ctx: Context,\n startPush: StartPushResponse,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n) {\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n const analysis = startPush.analysis[definitionPath];\n if (!analysis) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No analysis found for component ${definitionPath} orig: ${definitionPath}\\nin\\n${Object.keys(startPush.analysis).toString()}`,\n });\n }\n\n const lines = [];\n lines.push(header(\"Generated `ComponentApi` utility.\"));\n lines.push(`\n import type { FunctionReference } from \"convex/server\";\n\n /**\n * A utility for referencing a Convex component's exposed API.\n *\n * Useful when expecting a parameter like \\`components.myComponent\\`.\n * Usage:\n * \\`\\`\\`ts\n * async function myFunction(ctx: QueryCtx, component: ComponentApi) {\n * return ctx.runQuery(component.someFile.someQuery, { ...args });\n * }\n * \\`\\`\\`\n */`);\n lines.push(\n `export type ComponentApi<Name extends string | undefined = string | undefined> = `,\n );\n for await (const line of codegenExport(\n ctx,\n analysis,\n analysis.definition.exports,\n \"Name\",\n )) {\n lines.push(line);\n }\n lines.push(`;`);\n return lines.join(\"\\n\");\n}\n\nexport async function componentApiTSWithTypes(\n ctx: Context,\n startPush: StartPushResponse,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n componentsMap: Map<string, ComponentDirectory>,\n opts: { staticApi: boolean; useComponentApiImports: boolean },\n) {\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n\n const analysis = startPush.analysis[definitionPath];\n if (!analysis) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No analysis found for component ${definitionPath} orig: ${definitionPath}\\nin\\n${Object.keys(startPush.analysis).toString()}`,\n });\n }\n\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n let apiLines: AsyncGenerator<string>;\n if (opts.staticApi) {\n apiLines = codegenStaticApiObjectsTS(ctx, analysis);\n } else {\n apiLines = codegenDynamicApiObjectsTS(ctx, componentDirectory);\n }\n for await (const line of apiLines) {\n lines.push(line);\n }\n\n // Generate components section\n lines.push(`\n export const components = componentsGeneric() as unknown as {`);\n lines.push(\n ...(await componentApiLines(\n ctx,\n startPush,\n analysis,\n rootComponent,\n componentsMap,\n opts,\n )),\n );\n lines.push(\"};\");\n\n return lines.join(\"\\n\");\n}\n\nasync function* codegenStaticApiObjects(\n ctx: Context,\n analysis: EvaluatedComponentDefinition,\n) {\n yield `import type { FunctionReference } from \"convex/server\";`;\n yield `import type { GenericId as Id } from \"convex/values\";`;\n\n const apiTree = await buildApiTree(ctx, analysis.functions, {\n kind: \"public\",\n });\n yield apiComment(\"api\", \"public\");\n yield `export declare const api:`;\n yield* codegenApiTree(ctx, apiTree);\n yield \";\";\n\n yield apiComment(\"internal\", \"internal\");\n const internalTree = await buildApiTree(ctx, analysis.functions, {\n kind: \"internal\",\n });\n yield `export declare const internal:`;\n yield* codegenApiTree(ctx, internalTree);\n yield \";\";\n}\n\nasync function* codegenStaticApiObjectsTS(\n ctx: Context,\n analysis: EvaluatedComponentDefinition,\n) {\n yield `import type { FunctionReference } from \"convex/server\";`;\n yield `import type { GenericId as Id } from \"convex/values\";`;\n yield `import { anyApi, componentsGeneric } from \"convex/server\";`;\n\n const apiTree = await buildApiTree(ctx, analysis.functions, {\n kind: \"public\",\n });\n yield apiComment(\"api\", \"public\");\n yield `export const api:`;\n yield* codegenApiTree(ctx, apiTree);\n yield \"= anyApi as any;\";\n\n yield apiComment(\"internal\", \"internal\");\n const internalTree = await buildApiTree(ctx, analysis.functions, {\n kind: \"internal\",\n });\n yield `export const internal:`;\n yield* codegenApiTree(ctx, internalTree);\n yield \"= anyApi as any;\";\n}\n\nasync function* codegenDynamicApiObjects(\n ctx: Context,\n componentDirectory: ComponentDirectory,\n) {\n const absModulePaths = await entryPoints(ctx, componentDirectory.path);\n const modulePaths = absModulePaths\n .map((p) => path.relative(componentDirectory.path, p))\n .sort();\n for (const modulePath of modulePaths) {\n const ident = moduleIdentifier(modulePath);\n const path = importPath(modulePath);\n yield `import type * as ${ident} from \"../${path}.js\";`;\n }\n yield `\n import type {\n ApiFromModules,\n FilterApi,\n FunctionReference,\n } from \"convex/server\";\n\n declare const fullApi: ApiFromModules<{\n `;\n for (const modulePath of modulePaths) {\n const ident = moduleIdentifier(modulePath);\n const path = importPath(modulePath);\n yield ` \"${path}\": typeof ${ident},`;\n }\n yield `}>;`;\n yield `\n ${apiComment(\"api\", \"public\")}\n export declare const api: FilterApi<typeof fullApi, FunctionReference<any, \"public\">>;\n ${apiComment(\"internal\", \"internal\")}\n export declare const internal: FilterApi<typeof fullApi, FunctionReference<any, \"internal\">>;\n `;\n}\n\nasync function* codegenDynamicApiObjectsTS(\n ctx: Context,\n componentDirectory: ComponentDirectory,\n) {\n const absModulePaths = await entryPoints(ctx, componentDirectory.path);\n const modulePaths = absModulePaths\n .map((p) => path.relative(componentDirectory.path, p))\n .sort();\n for (const modulePath of modulePaths) {\n const ident = moduleIdentifier(modulePath);\n const path = importPath(modulePath);\n yield `import type * as ${ident} from \"../${path}.js\";`;\n }\n yield `\n import type {\n ApiFromModules,\n FilterApi,\n FunctionReference,\n } from \"convex/server\";\n import { anyApi, componentsGeneric } from \"convex/server\";\n\n const fullApi: ApiFromModules<{\n `;\n for (const modulePath of modulePaths) {\n const ident = moduleIdentifier(modulePath);\n const path = importPath(modulePath);\n yield ` \"${path}\": typeof ${ident},`;\n }\n yield `}> = anyApi as any;`;\n yield `\n ${apiComment(\"api\", \"public\")}\n export const api: FilterApi<typeof fullApi, FunctionReference<any, \"public\">> = anyApi as any;\n ${apiComment(\"internal\", \"internal\")}\n export const internal: FilterApi<typeof fullApi, FunctionReference<any, \"internal\">> = anyApi as any;\n `;\n}\n\ninterface ApiTree {\n [identifier: string]:\n | { type: \"branch\"; branch: ApiTree }\n | { type: \"leaf\"; leaf: AnalyzedFunction };\n}\n\nasync function buildApiTree(\n ctx: Context,\n functions: Record<CanonicalizedModulePath, AnalyzedModule>,\n visibility: Visibility,\n): Promise<ApiTree> {\n const root: ApiTree = {};\n for (const [modulePath, module] of Object.entries(functions)) {\n const p = importPath(modulePath);\n if (p.startsWith(\"_deps/\")) {\n continue;\n }\n for (const f of module.functions) {\n if (f.visibility?.kind !== visibility.kind) {\n continue;\n }\n let current = root;\n for (const pathComponent of p.split(\"/\")) {\n let next = current[pathComponent];\n if (!next) {\n next = { type: \"branch\", branch: {} };\n current[pathComponent] = next;\n }\n if (next.type === \"leaf\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Ambiguous function name: ${f.name} in ${modulePath}`,\n });\n }\n current = next.branch;\n }\n if (current[f.name]) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Duplicate function name: ${f.name} in ${modulePath}`,\n });\n }\n current[f.name] = { type: \"leaf\", leaf: f };\n }\n }\n return root;\n}\n\nasync function* codegenApiTree(\n ctx: Context,\n tree: ApiTree,\n): AsyncGenerator<string> {\n yield \"{\";\n // Sort entries alphabetically for stable output\n const sortedEntries = Object.entries(tree).sort(([a], [b]) =>\n compareStrings(a, b),\n );\n for (const [identifier, subtree] of sortedEntries) {\n if (subtree.type === \"branch\") {\n yield `\"${identifier}\":`;\n yield* codegenApiTree(ctx, subtree.branch);\n yield \",\";\n } else {\n const visibility = subtree.leaf.visibility?.kind;\n if (!visibility) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function ${subtree.leaf.name} has no visibility`,\n });\n }\n const ref = await codegenFunctionReference(\n ctx,\n subtree.leaf,\n visibility,\n true,\n undefined,\n );\n yield `\"${identifier}\": ${ref},`;\n }\n }\n yield \"}\";\n}\n\nasync function* codegenExports(\n ctx: Context,\n name: Identifier,\n analysis: EvaluatedComponentDefinition,\n): AsyncGenerator<string> {\n yield `${name}: {`;\n const exports = analysis.definition.exports.branch;\n const entries = Array.from(exports).sort(([a], [b]) => compareStrings(a, b));\n for (const [name, componentExport] of entries) {\n yield `${name}:`;\n yield* codegenExport(ctx, analysis, componentExport, undefined);\n yield \",\";\n }\n yield \"},\";\n}\n\nasync function* codegenExport(\n ctx: Context,\n analysis: EvaluatedComponentDefinition,\n componentExport: ComponentExports,\n componentPath: string | undefined,\n): AsyncGenerator<string> {\n if (componentExport.type === \"leaf\") {\n yield await resolveFunctionReference(\n ctx,\n analysis,\n componentExport.leaf,\n \"internal\",\n componentPath,\n );\n } else if (componentExport.type === \"branch\") {\n yield \"{\";\n const entries = Array.from(componentExport.branch).sort(([a], [b]) =>\n compareStrings(a, b),\n );\n for (const [name, childExport] of entries) {\n yield `${name}:`;\n yield* codegenExport(ctx, analysis, childExport, componentPath);\n yield \",\";\n }\n yield \"}\";\n }\n}\n\nexport async function resolveFunctionReference(\n ctx: Context,\n analysis: EvaluatedComponentDefinition,\n reference: Reference,\n visibility: \"public\" | \"internal\",\n componentPath: string | undefined,\n) {\n if (!reference.startsWith(\"_reference/function/\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid function reference: ${reference}`,\n });\n }\n const udfPath = reference.slice(\"_reference/function/\".length);\n\n const [modulePath, functionName] = udfPath.split(\":\");\n const canonicalizedModulePath = canonicalizeModulePath(modulePath);\n\n const analyzedModule = analysis.functions[canonicalizedModulePath];\n if (!analyzedModule) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Module not found: ${modulePath}`,\n });\n }\n const analyzedFunction = analyzedModule.functions.find(\n (f) => f.name === functionName,\n );\n if (!analyzedFunction) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function not found: ${functionName}`,\n });\n }\n return await codegenFunctionReference(\n ctx,\n analyzedFunction,\n visibility,\n false,\n componentPath,\n );\n}\n\nasync function codegenFunctionReference(\n ctx: Context,\n analyzedFunction: AnalyzedFunction,\n visibility: \"public\" | \"internal\",\n useIdType: boolean,\n componentPath: string | undefined,\n): Promise<string> {\n // The server sends down `udfType` capitalized.\n const udfType = analyzedFunction.udfType.toLowerCase();\n\n let argsType = \"any\";\n try {\n const argsValidator = parseValidator(analyzedFunction.args);\n if (argsValidator) {\n if (argsValidator.type === \"object\" || argsValidator.type === \"any\") {\n argsType = validatorToType(argsValidator, useIdType);\n } else {\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n `Unexpected argument validator type: ${argsValidator.type}`,\n );\n }\n }\n } catch (e) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid function args: ${analyzedFunction.args}`,\n errForSentry: e,\n });\n }\n\n let returnsType = \"any\";\n try {\n const returnsValidator = parseValidator(analyzedFunction.returns);\n if (returnsValidator) {\n returnsType = validatorToType(returnsValidator, useIdType);\n }\n } catch (e) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid function returns: ${analyzedFunction.returns}`,\n errForSentry: e,\n });\n }\n\n return `FunctionReference<\"${udfType}\", \"${visibility}\", ${argsType}, ${returnsType}${componentPath ? `, ${componentPath}` : \"\"}>`;\n}\n\nfunction canonicalizeModulePath(modulePath: string): CanonicalizedModulePath {\n if (!modulePath.endsWith(\".js\")) {\n return modulePath + \".js\";\n }\n return modulePath;\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,OAAO,UAAU;AAEjB,SAAS,mBAAmB;AAC5B;AAAA,EAEE;AAAA,EACA;AAAA,OAEK;AAEP,SAAS,YAAY,wBAAwB;AAC7C,
|
|
4
|
+
"sourcesContent": ["import path from \"path\";\nimport { Context } from \"../../bundler/context.js\";\nimport { entryPoints } from \"../../bundler/index.js\";\nimport {\n ComponentDirectory,\n toAbsolutePath,\n toComponentDefinitionPath,\n ComponentDefinitionPath,\n} from \"../lib/components/definition/directoryStructure.js\";\nimport { StartPushResponse } from \"../lib/deployApi/startPush.js\";\nimport { importPath, moduleIdentifier } from \"./api.js\";\nimport {\n apiComment,\n compareModulePaths,\n compareStrings,\n header,\n} from \"./common.js\";\nimport {\n ComponentExports,\n EvaluatedComponentDefinition,\n} from \"../lib/deployApi/componentDefinition.js\";\nimport { Identifier, Reference } from \"../lib/deployApi/types.js\";\nimport { CanonicalizedModulePath } from \"../lib/deployApi/paths.js\";\nimport {\n AnalyzedFunction,\n AnalyzedModule,\n Visibility,\n} from \"../lib/deployApi/modules.js\";\nimport { parseValidator, validatorToType } from \"./validator_helpers.js\";\n\nexport function componentApiJs() {\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n lines.push(`\n import { anyApi, componentsGeneric } from \"convex/server\";\n\n ${apiComment(\"api\", undefined)}\n export const api = anyApi;\n export const internal = anyApi;\n export const components = componentsGeneric();\n `);\n return lines.join(\"\\n\");\n}\n\nexport function rootComponentApiCJS() {\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n lines.push(`const { anyApi } = require(\"convex/server\");`);\n lines.push(`module.exports = {\n api: anyApi,\n internal: anyApi,\n };`);\n return lines.join(\"\\n\");\n}\n\nexport function componentApiStubDTS() {\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n lines.push(`import type { AnyApi, AnyComponents } from \"convex/server\";`);\n lines.push(`\n export declare const api: AnyApi;\n export declare const internal: AnyApi;\n export declare const components: AnyComponents;\n `);\n\n return lines.join(\"\\n\");\n}\n\n// This is also used for root components\nexport function componentApiStubTS() {\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n lines.push(`\n import type { AnyApi, AnyComponents } from \"convex/server\";\n import { anyApi, componentsGeneric } from \"convex/server\";\n\n export const api: AnyApi = anyApi;\n export const internal: AnyApi = anyApi;\n export const components: AnyComponents = componentsGeneric();\n `);\n return lines.join(\"\\n\");\n}\n\nexport async function componentApiDTS(\n ctx: Context,\n startPush: StartPushResponse,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n componentsMap: Map<string, ComponentDirectory>,\n opts: { staticApi: boolean; useComponentApiImports: boolean },\n) {\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n\n const analysis = startPush.analysis[definitionPath];\n if (!analysis) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No analysis found for component ${definitionPath} orig: ${definitionPath}\\nin\\n${Object.keys(startPush.analysis).toString()}`,\n });\n }\n\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n let apiLines: AsyncGenerator<string>;\n if (opts.staticApi) {\n apiLines = codegenStaticApiObjects(ctx, analysis);\n } else {\n apiLines = codegenDynamicApiObjects(ctx, componentDirectory);\n }\n for await (const line of apiLines) {\n lines.push(line);\n }\n\n lines.push(`\n export declare const components: {`);\n lines.push(\n ...(await componentApiLines(\n ctx,\n startPush,\n analysis,\n rootComponent,\n componentsMap,\n opts,\n )),\n );\n lines.push(\"};\");\n return lines.join(\"\\n\");\n}\n\nasync function componentApiLines(\n ctx: Context,\n startPush: StartPushResponse,\n analysis: EvaluatedComponentDefinition,\n rootComponent: ComponentDirectory,\n componentsMap: Map<string, ComponentDirectory>,\n opts: { useComponentApiImports: boolean },\n): Promise<string[]> {\n const lines: string[] = [];\n for (const childComponent of analysis.definition.childComponents) {\n if (opts.useComponentApiImports) {\n const absolutePath = toAbsolutePath(\n rootComponent,\n childComponent.path as ComponentDefinitionPath,\n );\n\n let childComponentWithRelativePath = componentsMap?.get(absolutePath);\n if (!childComponentWithRelativePath) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid child component directory: ${childComponent.path}`,\n });\n }\n\n // If the user uses a different import specifier than the absolute path of the child component, use the import specifier.\n const importSpecifier = childComponentWithRelativePath.importSpecifier;\n let importPath;\n // Don't trust relative specifiers\n if (\n importSpecifier &&\n !importSpecifier.startsWith(\".\") &&\n importSpecifier !== childComponent.path\n ) {\n importPath = importSpecifier;\n } else {\n importPath = `../${childComponent.path}`;\n }\n lines.push(\n ` \"${childComponent.name}\": import(\"${importPath}/_generated/component.js\").ComponentApi<\"${childComponent.name}\">,`,\n );\n } else {\n const childComponentAnalysis = startPush.analysis[childComponent.path];\n if (!childComponentAnalysis) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No analysis found for child component ${childComponent.path}`,\n });\n }\n for await (const line of codegenExports(\n ctx,\n childComponent.name,\n childComponentAnalysis,\n )) {\n lines.push(line);\n }\n }\n }\n return lines;\n}\n\nexport async function componentTS(\n ctx: Context,\n startPush: StartPushResponse,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n) {\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n const analysis = startPush.analysis[definitionPath];\n if (!analysis) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No analysis found for component ${definitionPath} orig: ${definitionPath}\\nin\\n${Object.keys(startPush.analysis).toString()}`,\n });\n }\n\n const lines = [];\n lines.push(header(\"Generated `ComponentApi` utility.\"));\n lines.push(`\n import type { FunctionReference } from \"convex/server\";\n\n /**\n * A utility for referencing a Convex component's exposed API.\n *\n * Useful when expecting a parameter like \\`components.myComponent\\`.\n * Usage:\n * \\`\\`\\`ts\n * async function myFunction(ctx: QueryCtx, component: ComponentApi) {\n * return ctx.runQuery(component.someFile.someQuery, { ...args });\n * }\n * \\`\\`\\`\n */`);\n lines.push(\n `export type ComponentApi<Name extends string | undefined = string | undefined> = `,\n );\n for await (const line of codegenExport(\n ctx,\n analysis,\n analysis.definition.exports,\n \"Name\",\n )) {\n lines.push(line);\n }\n lines.push(`;`);\n return lines.join(\"\\n\");\n}\n\nexport async function componentApiTSWithTypes(\n ctx: Context,\n startPush: StartPushResponse,\n rootComponent: ComponentDirectory,\n componentDirectory: ComponentDirectory,\n componentsMap: Map<string, ComponentDirectory>,\n opts: { staticApi: boolean; useComponentApiImports: boolean },\n) {\n const definitionPath = toComponentDefinitionPath(\n rootComponent,\n componentDirectory,\n );\n\n const analysis = startPush.analysis[definitionPath];\n if (!analysis) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `No analysis found for component ${definitionPath} orig: ${definitionPath}\\nin\\n${Object.keys(startPush.analysis).toString()}`,\n });\n }\n\n const lines = [];\n lines.push(header(\"Generated `api` utility.\"));\n let apiLines: AsyncGenerator<string>;\n if (opts.staticApi) {\n apiLines = codegenStaticApiObjectsTS(ctx, analysis);\n } else {\n apiLines = codegenDynamicApiObjectsTS(ctx, componentDirectory);\n }\n for await (const line of apiLines) {\n lines.push(line);\n }\n\n // Generate components section\n lines.push(`\n export const components = componentsGeneric() as unknown as {`);\n lines.push(\n ...(await componentApiLines(\n ctx,\n startPush,\n analysis,\n rootComponent,\n componentsMap,\n opts,\n )),\n );\n lines.push(\"};\");\n\n return lines.join(\"\\n\");\n}\n\nasync function* codegenStaticApiObjects(\n ctx: Context,\n analysis: EvaluatedComponentDefinition,\n) {\n yield `import type { FunctionReference } from \"convex/server\";`;\n yield `import type { GenericId as Id } from \"convex/values\";`;\n\n const apiTree = await buildApiTree(ctx, analysis.functions, {\n kind: \"public\",\n });\n yield apiComment(\"api\", \"public\");\n yield `export declare const api:`;\n yield* codegenApiTree(ctx, apiTree);\n yield \";\";\n\n yield apiComment(\"internal\", \"internal\");\n const internalTree = await buildApiTree(ctx, analysis.functions, {\n kind: \"internal\",\n });\n yield `export declare const internal:`;\n yield* codegenApiTree(ctx, internalTree);\n yield \";\";\n}\n\nasync function* codegenStaticApiObjectsTS(\n ctx: Context,\n analysis: EvaluatedComponentDefinition,\n) {\n yield `import type { FunctionReference } from \"convex/server\";`;\n yield `import type { GenericId as Id } from \"convex/values\";`;\n yield `import { anyApi, componentsGeneric } from \"convex/server\";`;\n\n const apiTree = await buildApiTree(ctx, analysis.functions, {\n kind: \"public\",\n });\n yield apiComment(\"api\", \"public\");\n yield `export const api:`;\n yield* codegenApiTree(ctx, apiTree);\n yield \"= anyApi as any;\";\n\n yield apiComment(\"internal\", \"internal\");\n const internalTree = await buildApiTree(ctx, analysis.functions, {\n kind: \"internal\",\n });\n yield `export const internal:`;\n yield* codegenApiTree(ctx, internalTree);\n yield \"= anyApi as any;\";\n}\n\nasync function* codegenDynamicApiObjects(\n ctx: Context,\n componentDirectory: ComponentDirectory,\n) {\n const absModulePaths = await entryPoints(ctx, componentDirectory.path);\n const modulePaths = absModulePaths\n .map((p) => path.relative(componentDirectory.path, p))\n .sort(compareModulePaths);\n for (const modulePath of modulePaths) {\n const ident = moduleIdentifier(modulePath);\n const path = importPath(modulePath);\n yield `import type * as ${ident} from \"../${path}.js\";`;\n }\n yield `\n import type {\n ApiFromModules,\n FilterApi,\n FunctionReference,\n } from \"convex/server\";\n\n declare const fullApi: ApiFromModules<{\n `;\n for (const modulePath of modulePaths) {\n const ident = moduleIdentifier(modulePath);\n const path = importPath(modulePath);\n yield ` \"${path}\": typeof ${ident},`;\n }\n yield `}>;`;\n yield `\n ${apiComment(\"api\", \"public\")}\n export declare const api: FilterApi<typeof fullApi, FunctionReference<any, \"public\">>;\n ${apiComment(\"internal\", \"internal\")}\n export declare const internal: FilterApi<typeof fullApi, FunctionReference<any, \"internal\">>;\n `;\n}\n\nasync function* codegenDynamicApiObjectsTS(\n ctx: Context,\n componentDirectory: ComponentDirectory,\n) {\n const absModulePaths = await entryPoints(ctx, componentDirectory.path);\n const modulePaths = absModulePaths\n .map((p) => path.relative(componentDirectory.path, p))\n .sort(compareModulePaths);\n for (const modulePath of modulePaths) {\n const ident = moduleIdentifier(modulePath);\n const path = importPath(modulePath);\n yield `import type * as ${ident} from \"../${path}.js\";`;\n }\n yield `\n import type {\n ApiFromModules,\n FilterApi,\n FunctionReference,\n } from \"convex/server\";\n import { anyApi, componentsGeneric } from \"convex/server\";\n\n const fullApi: ApiFromModules<{\n `;\n for (const modulePath of modulePaths) {\n const ident = moduleIdentifier(modulePath);\n const path = importPath(modulePath);\n yield ` \"${path}\": typeof ${ident},`;\n }\n yield `}> = anyApi as any;`;\n yield `\n ${apiComment(\"api\", \"public\")}\n export const api: FilterApi<typeof fullApi, FunctionReference<any, \"public\">> = anyApi as any;\n ${apiComment(\"internal\", \"internal\")}\n export const internal: FilterApi<typeof fullApi, FunctionReference<any, \"internal\">> = anyApi as any;\n `;\n}\n\ninterface ApiTree {\n [identifier: string]:\n | { type: \"branch\"; branch: ApiTree }\n | { type: \"leaf\"; leaf: AnalyzedFunction };\n}\n\nasync function buildApiTree(\n ctx: Context,\n functions: Record<CanonicalizedModulePath, AnalyzedModule>,\n visibility: Visibility,\n): Promise<ApiTree> {\n const root: ApiTree = {};\n for (const [modulePath, module] of Object.entries(functions)) {\n const p = importPath(modulePath);\n if (p.startsWith(\"_deps/\")) {\n continue;\n }\n for (const f of module.functions) {\n if (f.visibility?.kind !== visibility.kind) {\n continue;\n }\n let current = root;\n for (const pathComponent of p.split(\"/\")) {\n let next = current[pathComponent];\n if (!next) {\n next = { type: \"branch\", branch: {} };\n current[pathComponent] = next;\n }\n if (next.type === \"leaf\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Ambiguous function name: ${f.name} in ${modulePath}`,\n });\n }\n current = next.branch;\n }\n if (current[f.name]) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Duplicate function name: ${f.name} in ${modulePath}`,\n });\n }\n current[f.name] = { type: \"leaf\", leaf: f };\n }\n }\n return root;\n}\n\nasync function* codegenApiTree(\n ctx: Context,\n tree: ApiTree,\n): AsyncGenerator<string> {\n yield \"{\";\n // Sort entries alphabetically for stable output\n const sortedEntries = Object.entries(tree).sort(([a], [b]) =>\n compareStrings(a, b),\n );\n for (const [identifier, subtree] of sortedEntries) {\n if (subtree.type === \"branch\") {\n yield `\"${identifier}\":`;\n yield* codegenApiTree(ctx, subtree.branch);\n yield \",\";\n } else {\n const visibility = subtree.leaf.visibility?.kind;\n if (!visibility) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function ${subtree.leaf.name} has no visibility`,\n });\n }\n const ref = await codegenFunctionReference(\n ctx,\n subtree.leaf,\n visibility,\n true,\n undefined,\n );\n yield `\"${identifier}\": ${ref},`;\n }\n }\n yield \"}\";\n}\n\nasync function* codegenExports(\n ctx: Context,\n name: Identifier,\n analysis: EvaluatedComponentDefinition,\n): AsyncGenerator<string> {\n yield `${name}: {`;\n const exports = analysis.definition.exports.branch;\n const entries = Array.from(exports).sort(([a], [b]) => compareStrings(a, b));\n for (const [name, componentExport] of entries) {\n yield `${name}:`;\n yield* codegenExport(ctx, analysis, componentExport, undefined);\n yield \",\";\n }\n yield \"},\";\n}\n\nasync function* codegenExport(\n ctx: Context,\n analysis: EvaluatedComponentDefinition,\n componentExport: ComponentExports,\n componentPath: string | undefined,\n): AsyncGenerator<string> {\n if (componentExport.type === \"leaf\") {\n yield await resolveFunctionReference(\n ctx,\n analysis,\n componentExport.leaf,\n \"internal\",\n componentPath,\n );\n } else if (componentExport.type === \"branch\") {\n yield \"{\";\n const entries = Array.from(componentExport.branch).sort(([a], [b]) =>\n compareStrings(a, b),\n );\n for (const [name, childExport] of entries) {\n yield `${name}:`;\n yield* codegenExport(ctx, analysis, childExport, componentPath);\n yield \",\";\n }\n yield \"}\";\n }\n}\n\nexport async function resolveFunctionReference(\n ctx: Context,\n analysis: EvaluatedComponentDefinition,\n reference: Reference,\n visibility: \"public\" | \"internal\",\n componentPath: string | undefined,\n) {\n if (!reference.startsWith(\"_reference/function/\")) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid function reference: ${reference}`,\n });\n }\n const udfPath = reference.slice(\"_reference/function/\".length);\n\n const [modulePath, functionName] = udfPath.split(\":\");\n const canonicalizedModulePath = canonicalizeModulePath(modulePath);\n\n const analyzedModule = analysis.functions[canonicalizedModulePath];\n if (!analyzedModule) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Module not found: ${modulePath}`,\n });\n }\n const analyzedFunction = analyzedModule.functions.find(\n (f) => f.name === functionName,\n );\n if (!analyzedFunction) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Function not found: ${functionName}`,\n });\n }\n return await codegenFunctionReference(\n ctx,\n analyzedFunction,\n visibility,\n false,\n componentPath,\n );\n}\n\nasync function codegenFunctionReference(\n ctx: Context,\n analyzedFunction: AnalyzedFunction,\n visibility: \"public\" | \"internal\",\n useIdType: boolean,\n componentPath: string | undefined,\n): Promise<string> {\n // The server sends down `udfType` capitalized.\n const udfType = analyzedFunction.udfType.toLowerCase();\n\n let argsType = \"any\";\n try {\n const argsValidator = parseValidator(analyzedFunction.args);\n if (argsValidator) {\n if (argsValidator.type === \"object\" || argsValidator.type === \"any\") {\n argsType = validatorToType(argsValidator, useIdType);\n } else {\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(\n `Unexpected argument validator type: ${argsValidator.type}`,\n );\n }\n }\n } catch (e) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid function args: ${analyzedFunction.args}`,\n errForSentry: e,\n });\n }\n\n let returnsType = \"any\";\n try {\n const returnsValidator = parseValidator(analyzedFunction.returns);\n if (returnsValidator) {\n returnsType = validatorToType(returnsValidator, useIdType);\n }\n } catch (e) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Invalid function returns: ${analyzedFunction.returns}`,\n errForSentry: e,\n });\n }\n\n return `FunctionReference<\"${udfType}\", \"${visibility}\", ${argsType}, ${returnsType}${componentPath ? `, ${componentPath}` : \"\"}>`;\n}\n\nfunction canonicalizeModulePath(modulePath: string): CanonicalizedModulePath {\n if (!modulePath.endsWith(\".js\")) {\n return modulePath + \".js\";\n }\n return modulePath;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["importPath", "path", "name"]
|
|
7
7
|
}
|
|
@@ -13,6 +13,8 @@ export function validatorToType(validator, useIdType) {
|
|
|
13
13
|
return "number";
|
|
14
14
|
} else if (validator.type === "bigint") {
|
|
15
15
|
return "bigint";
|
|
16
|
+
} else if (validator.type === "commitTs") {
|
|
17
|
+
return 'bigint | import("convex/values").CommitTsPlaceholder';
|
|
16
18
|
} else if (validator.type === "boolean") {
|
|
17
19
|
return "boolean";
|
|
18
20
|
} else if (validator.type === "string") {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/cli/codegen_templates/validator_helpers.ts"],
|
|
4
|
-
"sourcesContent": ["import { jsonToConvex, Value } from \"../../values/index.js\";\nimport { ConvexValidator } from \"../lib/deployApi/validator.js\";\n\nexport function parseValidator(\n validator: string | null,\n): ConvexValidator | null {\n if (!validator) {\n return null;\n }\n // This is code returned from the server, so we can skip validation\n return JSON.parse(validator) as ConvexValidator;\n}\n\nexport function validatorToType(\n validator: ConvexValidator,\n useIdType: boolean,\n): string {\n if (validator.type === \"null\") {\n return \"null\";\n } else if (validator.type === \"number\") {\n return \"number\";\n } else if (validator.type === \"bigint\") {\n return \"bigint\";\n } else if (validator.type === \"boolean\") {\n return \"boolean\";\n } else if (validator.type === \"string\") {\n return \"string\";\n } else if (validator.type === \"bytes\") {\n return \"ArrayBuffer\";\n } else if (validator.type === \"any\") {\n return \"any\";\n } else if (validator.type === \"literal\") {\n const convexValue = jsonToConvex(validator.value);\n return convexValueToLiteral(convexValue);\n } else if (validator.type === \"id\") {\n return useIdType ? `Id<\"${validator.tableName}\">` : \"string\";\n } else if (validator.type === \"array\") {\n return `Array<${validatorToType(validator.value, useIdType)}>`;\n } else if (validator.type === \"record\") {\n return `Record<${validatorToType(validator.keys, useIdType)}, ${validatorToType(validator.values.fieldType, useIdType)}>`;\n } else if (validator.type === \"union\") {\n return validator.value\n .map((v) => validatorToType(v, useIdType))\n .join(\" | \");\n } else if (validator.type === \"object\") {\n return objectValidatorToType(validator.value, useIdType);\n } else {\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(`Unsupported validator type`);\n }\n}\n\nfunction objectValidatorToType(\n fields: Record<string, { fieldType: ConvexValidator; optional: boolean }>,\n useIdType: boolean,\n): string {\n const fieldStrings: string[] = [];\n for (const [fieldName, field] of Object.entries(fields)) {\n const fieldType = validatorToType(field.fieldType, useIdType);\n fieldStrings.push(`${fieldName}${field.optional ? \"?\" : \"\"}: ${fieldType}`);\n }\n return `{ ${fieldStrings.join(\", \")} }`;\n}\n\nfunction convexValueToLiteral(value: Value): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"bigint\") {\n return `${value}n`;\n }\n if (typeof value === \"number\") {\n return `${value}`;\n }\n if (typeof value === \"boolean\") {\n return `${value}`;\n }\n if (typeof value === \"string\") {\n return `\"${value}\"`;\n }\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(`Unsupported literal type`);\n}\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,oBAA2B;AAG7B,gBAAS,eACd,WACwB;AACxB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,SAAS;AAC7B;AAEO,gBAAS,gBACd,WACA,WACQ;AACR,MAAI,UAAU,SAAS,QAAQ;AAC7B,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,WAAW;AACvC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,SAAS;AACrC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,OAAO;AACnC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,WAAW;AACvC,UAAM,cAAc,aAAa,UAAU,KAAK;AAChD,WAAO,qBAAqB,WAAW;AAAA,EACzC,WAAW,UAAU,SAAS,MAAM;AAClC,WAAO,YAAY,OAAO,UAAU,SAAS,OAAO;AAAA,EACtD,WAAW,UAAU,SAAS,SAAS;AACrC,WAAO,SAAS,gBAAgB,UAAU,OAAO,SAAS,CAAC;AAAA,EAC7D,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO,UAAU,gBAAgB,UAAU,MAAM,SAAS,CAAC,KAAK,gBAAgB,UAAU,OAAO,WAAW,SAAS,CAAC;AAAA,EACxH,WAAW,UAAU,SAAS,SAAS;AACrC,WAAO,UAAU,MACd,IAAI,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC,EACxC,KAAK,KAAK;AAAA,EACf,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO,sBAAsB,UAAU,OAAO,SAAS;AAAA,EACzD,OAAO;AAEL,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AACF;AAEA,SAAS,sBACP,QACA,WACQ;AACR,QAAM,eAAyB,CAAC;AAChC,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,UAAM,YAAY,gBAAgB,MAAM,WAAW,SAAS;AAC5D,iBAAa,KAAK,GAAG,SAAS,GAAG,MAAM,WAAW,MAAM,EAAE,KAAK,SAAS,EAAE;AAAA,EAC5E;AACA,SAAO,KAAK,aAAa,KAAK,IAAI,CAAC;AACrC;AAEA,SAAS,qBAAqB,OAAsB;AAClD,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,QAAM,IAAI,MAAM,0BAA0B;AAC5C;",
|
|
4
|
+
"sourcesContent": ["import { jsonToConvex, Value } from \"../../values/index.js\";\nimport { ConvexValidator } from \"../lib/deployApi/validator.js\";\n\nexport function parseValidator(\n validator: string | null,\n): ConvexValidator | null {\n if (!validator) {\n return null;\n }\n // This is code returned from the server, so we can skip validation\n return JSON.parse(validator) as ConvexValidator;\n}\n\nexport function validatorToType(\n validator: ConvexValidator,\n useIdType: boolean,\n): string {\n if (validator.type === \"null\") {\n return \"null\";\n } else if (validator.type === \"number\") {\n return \"number\";\n } else if (validator.type === \"bigint\") {\n return \"bigint\";\n } else if (validator.type === \"commitTs\") {\n // Match `Infer<v.commitTs()>`: the field holds a bigint once committed,\n // but writes go through `db.vars.commitTs` (a `CommitTsPlaceholder`) and\n // same-mutation read-backs yield the placeholder. The inline import keeps\n // this valid in every generated file regardless of its header imports.\n return 'bigint | import(\"convex/values\").CommitTsPlaceholder';\n } else if (validator.type === \"boolean\") {\n return \"boolean\";\n } else if (validator.type === \"string\") {\n return \"string\";\n } else if (validator.type === \"bytes\") {\n return \"ArrayBuffer\";\n } else if (validator.type === \"any\") {\n return \"any\";\n } else if (validator.type === \"literal\") {\n const convexValue = jsonToConvex(validator.value);\n return convexValueToLiteral(convexValue);\n } else if (validator.type === \"id\") {\n return useIdType ? `Id<\"${validator.tableName}\">` : \"string\";\n } else if (validator.type === \"array\") {\n return `Array<${validatorToType(validator.value, useIdType)}>`;\n } else if (validator.type === \"record\") {\n return `Record<${validatorToType(validator.keys, useIdType)}, ${validatorToType(validator.values.fieldType, useIdType)}>`;\n } else if (validator.type === \"union\") {\n return validator.value\n .map((v) => validatorToType(v, useIdType))\n .join(\" | \");\n } else if (validator.type === \"object\") {\n return objectValidatorToType(validator.value, useIdType);\n } else {\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(`Unsupported validator type`);\n }\n}\n\nfunction objectValidatorToType(\n fields: Record<string, { fieldType: ConvexValidator; optional: boolean }>,\n useIdType: boolean,\n): string {\n const fieldStrings: string[] = [];\n for (const [fieldName, field] of Object.entries(fields)) {\n const fieldType = validatorToType(field.fieldType, useIdType);\n fieldStrings.push(`${fieldName}${field.optional ? \"?\" : \"\"}: ${fieldType}`);\n }\n return `{ ${fieldStrings.join(\", \")} }`;\n}\n\nfunction convexValueToLiteral(value: Value): string {\n if (value === null) {\n return \"null\";\n }\n if (typeof value === \"bigint\") {\n return `${value}n`;\n }\n if (typeof value === \"number\") {\n return `${value}`;\n }\n if (typeof value === \"boolean\") {\n return `${value}`;\n }\n if (typeof value === \"string\") {\n return `\"${value}\"`;\n }\n // eslint-disable-next-line no-restricted-syntax\n throw new Error(`Unsupported literal type`);\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,oBAA2B;AAG7B,gBAAS,eACd,WACwB;AACxB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,SAAS;AAC7B;AAEO,gBAAS,gBACd,WACA,WACQ;AACR,MAAI,UAAU,SAAS,QAAQ;AAC7B,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,YAAY;AAKxC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,WAAW;AACvC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,SAAS;AACrC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,OAAO;AACnC,WAAO;AAAA,EACT,WAAW,UAAU,SAAS,WAAW;AACvC,UAAM,cAAc,aAAa,UAAU,KAAK;AAChD,WAAO,qBAAqB,WAAW;AAAA,EACzC,WAAW,UAAU,SAAS,MAAM;AAClC,WAAO,YAAY,OAAO,UAAU,SAAS,OAAO;AAAA,EACtD,WAAW,UAAU,SAAS,SAAS;AACrC,WAAO,SAAS,gBAAgB,UAAU,OAAO,SAAS,CAAC;AAAA,EAC7D,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO,UAAU,gBAAgB,UAAU,MAAM,SAAS,CAAC,KAAK,gBAAgB,UAAU,OAAO,WAAW,SAAS,CAAC;AAAA,EACxH,WAAW,UAAU,SAAS,SAAS;AACrC,WAAO,UAAU,MACd,IAAI,CAAC,MAAM,gBAAgB,GAAG,SAAS,CAAC,EACxC,KAAK,KAAK;AAAA,EACf,WAAW,UAAU,SAAS,UAAU;AACtC,WAAO,sBAAsB,UAAU,OAAO,SAAS;AAAA,EACzD,OAAO;AAEL,UAAM,IAAI,MAAM,4BAA4B;AAAA,EAC9C;AACF;AAEA,SAAS,sBACP,QACA,WACQ;AACR,QAAM,eAAyB,CAAC;AAChC,aAAW,CAAC,WAAW,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACvD,UAAM,YAAY,gBAAgB,MAAM,WAAW,SAAS;AAC5D,iBAAa,KAAK,GAAG,SAAS,GAAG,MAAM,WAAW,MAAM,EAAE,KAAK,SAAS,EAAE;AAAA,EAC5E;AACA,SAAO,KAAK,aAAa,KAAK,IAAI,CAAC;AACrC;AAEA,SAAS,qBAAqB,OAAsB;AAClD,MAAI,UAAU,MAAM;AAClB,WAAO;AAAA,EACT;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,OAAO,UAAU,WAAW;AAC9B,WAAO,GAAG,KAAK;AAAA,EACjB;AACA,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO,IAAI,KAAK;AAAA,EAClB;AAEA,QAAM,IAAI,MAAM,0BAA0B;AAC5C;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -3,5 +3,6 @@ import { Command } from "@commander-js/extra-typings";
|
|
|
3
3
|
import { deploymentSelect } from "./deploymentSelect.js";
|
|
4
4
|
import { deploymentCreate } from "./deploymentCreate.js";
|
|
5
5
|
import { deploymentToken } from "./deploymentToken.js";
|
|
6
|
-
|
|
6
|
+
import { usage, usageLimits } from "./usageLimits.js";
|
|
7
|
+
export const deployment = new Command("deployment").summary("Manage deployments").description("Manage deployments in your project.").addCommand(deploymentSelect).addCommand(deploymentCreate).addCommand(deploymentToken).addCommand(usage).addCommand(usageLimits);
|
|
7
8
|
//# sourceMappingURL=deployment.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/deployment.ts"],
|
|
4
|
-
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { deploymentSelect } from \"./deploymentSelect.js\";\nimport { deploymentCreate } from \"./deploymentCreate.js\";\nimport { deploymentToken } from \"./deploymentToken.js\";\n\nexport const deployment = new Command(\"deployment\")\n .summary(\"Manage deployments\")\n .description(\"Manage deployments in your project.\")\n .addCommand(deploymentSelect)\n .addCommand(deploymentCreate)\n .addCommand(deploymentToken);\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,eAAe;AACxB,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;
|
|
4
|
+
"sourcesContent": ["import { Command } from \"@commander-js/extra-typings\";\nimport { deploymentSelect } from \"./deploymentSelect.js\";\nimport { deploymentCreate } from \"./deploymentCreate.js\";\nimport { deploymentToken } from \"./deploymentToken.js\";\nimport { usage, usageLimits } from \"./usageLimits.js\";\n\nexport const deployment = new Command(\"deployment\")\n .summary(\"Manage deployments\")\n .description(\"Manage deployments in your project.\")\n .addCommand(deploymentSelect)\n .addCommand(deploymentCreate)\n .addCommand(deploymentToken)\n .addCommand(usage)\n .addCommand(usageLimits);\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,eAAe;AACxB,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAChC,SAAS,OAAO,mBAAmB;AAE5B,aAAM,aAAa,IAAI,QAAQ,YAAY,EAC/C,QAAQ,oBAAoB,EAC5B,YAAY,qCAAqC,EACjD,WAAW,gBAAgB,EAC3B,WAAW,gBAAgB,EAC3B,WAAW,eAAe,EAC1B,WAAW,KAAK,EAChB,WAAW,WAAW;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/cli/deploymentCreate.ts"],
|
|
4
|
-
"sourcesContent": ["import { execSync } from \"child_process\";\nimport { Command, Option } from \"@commander-js/extra-typings\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n showSpinner,\n} from \"../bundler/log.js\";\nimport {\n DeploymentSelection,\n ensureAuthCanCreateDeployment,\n getDeploymentSelection,\n getProjectDetails,\n deploymentNameFromSelection,\n} from \"./lib/deploymentSelection.js\";\nimport {\n logNoDefaultRegionMessage,\n selectRegion,\n typedBigBrainClient,\n typedPlatformClient,\n} from \"./lib/utils/utils.js\";\nimport { PlatformProjectDetails } from \"@convex-dev/platform/managementApi\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./lib/deployment.js\";\nimport { saveSelectedDeployment } from \"./deploymentSelect.js\";\nimport { promptOptions, promptString } from \"./lib/utils/prompts.js\";\nimport { chalkStderr } from \"chalk\";\nimport { parseDeploymentSelector } from \"./lib/deploymentSelector.js\";\nimport {\n parseExpiration,\n resolveExpiration,\n validateExpiration,\n} from \"./lib/expiration.js\";\nimport { ensureBackendBinaryDownloaded } from \"./lib/localDeployment/download.js\";\nimport {\n loadProjectLocalConfig,\n saveDeploymentConfig,\n} from \"./lib/localDeployment/filePaths.js\";\nimport { chooseLocalBackendPorts } from \"./lib/localDeployment/utils.js\";\nimport { bigBrainStart } from \"./lib/localDeployment/bigBrain.js\";\nimport { importDefaultEnvVars } from \"./lib/localDeployment/localDeployment.js\";\nimport { localDeploymentUrl } from \"./lib/localDeployment/run.js\";\nimport { announceDeploymentTarget } from \"./lib/announceDeploymentTarget.js\";\nimport { generateLocalDevSecrets } from \"./lib/localDeployment/secrets.js\";\n\nconst SUPPORTED_TYPES = [\"dev\", \"prod\", \"preview\"] as const;\n\nexport const deploymentCreate = new Command(\"create\")\n .summary(\"Create a new deployment for a project\")\n .description(\n [\n \"Create a new deployment for a project.\",\n \"\",\n \"\u2022 Create a dev deployment and select it: `npx convex deployment create dev/my-new-feature --type dev --select`\",\n \"\u2022 Create a prod deployment named \u201Cstaging\u201D: `npx convex deployment create staging --type prod`\",\n ].join(\"\\n\"),\n )\n .argument(\n \"[reference]\",\n \"The reference for the new deployment, e.g. `staging` or `dev/my-feature`. \\n\" +\n \"Use `local` to create a local deployment. \\n\" +\n \"You can specify a team and project with `team-slug:project-slug:ref` (e.g. `my-team:my-project:staging` or `my-team:my-project:local`). \\n\" +\n \"Can be omitted when using `--default`.\",\n )\n .allowExcessArguments(false)\n .addOption(\n new Option(\"--type <type>\", \"Deployment type\").choices(SUPPORTED_TYPES),\n )\n .option(\"--region <region>\", \"Deployment region\")\n .addOption(new Option(\"--class <class>\", \"Deployment class\").hideHelp())\n .option(\n \"--select\",\n \"Select the new deployment. This will update the Convex environment variables in .env.local. Subsequent `npx convex` commands will run against this deployment.\",\n )\n .option(\n \"--default\",\n \"Make the new deployment your default production deployment (used by `npx convex deploy`) or your personal dev deployment.\",\n )\n .option(\n \"--expiration <value>\",\n 'When the deployment expires (e.g. \"none\", \"in 7 days\", \"2026-04-01T00:00:00Z\", or a UNIX timestamp in seconds or milliseconds)',\n )\n .addOption(new Option(\"--expiry <value>\").hideHelp())\n .addOption(new Option(\"--expires <value>\").hideHelp())\n .action(async (refParam, options) => {\n const expiration = options.expiration ?? options.expiry ?? options.expires;\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Creating a deployment goes through the platform API, which accepts\n // personal access tokens and project keys but not deployment/preview deploy\n // keys. Fail fast (and clearly) for the unsupported keys rather than\n // surfacing an opaque 401 from the lookup below.\n await ensureAuthCanCreateDeployment(ctx);\n\n const currentDeployment = await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Handle `deployment create [team:project:]local`\n if (refParam !== undefined) {\n const localTarget = parseLocalCreateTarget(refParam);\n if (localTarget !== null) {\n const cloudOnlyFlags = [\"type\", \"region\", \"class\", \"default\"] as const;\n for (const flag of cloudOnlyFlags) {\n if (options[flag]) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--${flag} cannot be used when creating a local deployment`,\n });\n }\n }\n if (expiration !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--expiration cannot be used when creating a local deployment`,\n });\n }\n if (localTarget.kind === \"needsTeam\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Please use `team:project:local` to specify the team when creating a local deployment in a different project.\",\n });\n }\n await createLocalDeployment(\n ctx,\n currentDeployment,\n options.select ?? false,\n localTarget.kind === \"inTeamProject\"\n ? {\n teamSlug: localTarget.teamSlug,\n projectSlug: localTarget.projectSlug,\n }\n : null,\n );\n return;\n }\n }\n\n const expiresAt = await resolveExpiresAtOrCrash(ctx, expiration);\n\n const {\n ref,\n regionDetails,\n classDetails,\n projectId,\n type,\n isDefault,\n teamSlug,\n projectSlug,\n } = process.stdin.isTTY\n ? await resolveOptionsInteractively(\n ctx,\n currentDeployment,\n refParam,\n options,\n )\n : await resolveOptionsNoninteractively(\n ctx,\n currentDeployment,\n refParam,\n options,\n );\n\n showSpinner(\n `Creating ${type} deployment` +\n (regionDetails ? ` in region ${regionDetails.displayName}` : \"\") +\n (classDetails ? ` with class ${classDetails.type}` : \"\") +\n \"...\",\n );\n\n const created = (\n await typedPlatformClient(ctx).POST(\n \"/projects/{project_id}/create_deployment\",\n {\n params: {\n path: { project_id: projectId },\n },\n body: {\n type,\n region: regionDetails?.name ?? null,\n reference: ref ?? null,\n isDefault,\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n ...(classDetails ? { class: classDetails.type } : {}),\n },\n },\n )\n ).data!;\n\n if (created.kind !== \"cloud\") {\n // This should be impossible\n const err = `Expected cloud deployment to be created but got ${created.kind}`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: err,\n errForSentry: err,\n });\n }\n\n logFinishedStep(\n options.select\n ? `Created and selected new ${created.deploymentType} deployment:`\n : `Created new ${created.isDefault ? \"default \" : \"\"}${created.deploymentType} deployment:`,\n );\n announceDeploymentTarget(null, {\n url: created.deploymentUrl,\n deploymentFields: {\n deploymentName: created.name,\n deploymentType: created.deploymentType,\n teamSlug,\n projectSlug,\n reference: created.reference,\n isDefault: created.isDefault,\n },\n });\n\n if (!options.select) {\n if (type !== \"prod\") {\n const selectRef = `${teamSlug}:${projectSlug}:${created.reference}`;\n logMessage(\n `\\nTo make \\`npx convex\\` use this deployment, run ${chalkStderr.bold(`npx convex deployment select ${selectRef}`)}`,\n );\n logMessage(\n chalkStderr.gray(\n \"Hint: use `--select` to immediately select the newly created deployment.\",\n ),\n );\n }\n } else {\n const selection: DeploymentSelection = {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug,\n projectSlug,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: created.reference,\n },\n };\n await saveSelectedDeployment(\n ctx,\n created.reference,\n selection,\n deploymentNameFromSelection(currentDeployment),\n );\n }\n });\n\nexport async function createLocalDeployment(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n select: boolean,\n baseDeployment: { teamSlug: string; projectSlug: string } | null,\n): Promise<void> {\n const existing = loadProjectLocalConfig(ctx);\n if (existing) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"A local deployment already exists.\",\n });\n }\n\n const {\n teamSlug,\n slug: projectSlug,\n id: cloudProjectId,\n } = baseDeployment\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: baseDeployment.teamSlug,\n projectSlug: baseDeployment.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\n\n showSpinner(\"Downloading local backend...\");\n const { version, binaryPath: latestBinaryPath } =\n await ensureBackendBinaryDownloaded(ctx, {\n kind: \"latest\",\n });\n\n const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx);\n\n showSpinner(\"Registering local deployment...\");\n const { deploymentName } = await bigBrainStart(ctx, {\n port: cloudPort,\n projectSlug,\n teamSlug,\n instanceName: null,\n });\n const { instanceSecret, adminKey } = await generateLocalDevSecrets(ctx, {\n deploymentName,\n latestBinaryPath,\n });\n\n saveDeploymentConfig(ctx, \"local\", deploymentName, {\n backendVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n cloudProjectId,\n });\n\n logFinishedStep(\n select\n ? \"Created and selected local deployment:\"\n : \"Created local deployment:\",\n );\n\n announceDeploymentTarget(null, {\n url: `http://127.0.0.1:${cloudPort}`,\n deploymentFields: {\n deploymentName,\n deploymentType: \"local\",\n teamSlug,\n projectSlug,\n reference: null,\n isDefault: false,\n },\n });\n\n await importDefaultEnvVars(ctx, {\n teamSlug,\n projectSlug,\n deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n adminKey,\n });\n\n if (select) {\n const selection: DeploymentSelection = {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: \"local\",\n },\n };\n await saveSelectedDeployment(\n ctx,\n \"local\",\n selection,\n deploymentNameFromSelection(currentDeployment),\n );\n }\n\n const devCommand = \"npx convex dev\";\n if (select) {\n logMessage(`\\nRun ${chalkStderr.bold(devCommand)} to start it.`);\n } else {\n logMessage(\n `\\nTo use this deployment, run:\\n` +\n chalkStderr.bold(` npx convex deployment select local\\n`) +\n ` Then, run ${chalkStderr.bold(devCommand)} to start it.`,\n );\n }\n}\n\ntype RefParam = Parameters<Parameters<typeof deploymentCreate.action>[0]>[0];\ntype OptionsParam = Parameters<\n Parameters<typeof deploymentCreate.action>[0]\n>[1];\n\nasync function resolveOptionsNoninteractively(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n refParam: RefParam,\n options: OptionsParam,\n) {\n let ref: string | undefined;\n let teamAndProject: { teamSlug: string; projectSlug: string } | undefined;\n if (refParam) {\n const result = parseSelectorForNewDeployment(refParam);\n if (result.kind === \"invalid\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: result.message,\n });\n }\n ref = result.ref;\n teamAndProject = result.teamAndProject;\n }\n\n if (!ref && !options.default) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Specify a deployment ref or use --default:\\n\" +\n \" `npx convex deployment create my-deployment-ref --type dev`\\n\" +\n \" `npx convex deployment create --type prod --default`\",\n });\n }\n\n if (!options.type) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--type is required (supported values: ${SUPPORTED_TYPES.join(\", \")})`,\n });\n }\n\n const project = teamAndProject\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProject.teamSlug,\n projectSlug: teamAndProject.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\n const projectId = project.id;\n\n // If no region is passed in, the team's default region will be used\n let regionDetails: AvailableRegion | null = null;\n if (options.region) {\n const availableRegions = await fetchAvailableRegions(ctx, project.teamId);\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n options.region,\n );\n }\n\n // If no class is passed in, the team's default class will be used\n let classDetails: AvailableClass | null = null;\n if (options.class) {\n const availableClasses = await fetchAvailableClasses(ctx, project.teamId);\n classDetails = await resolveClassDetailsOrCrash(\n ctx,\n availableClasses,\n options.class,\n );\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId,\n regionDetails,\n classDetails,\n type: options.type,\n teamSlug: project.teamSlug,\n projectSlug: project.slug,\n };\n}\n\nasync function resolveOptionsInteractively(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n refParam: RefParam,\n options: OptionsParam,\n) {\n let deploymentType: \"dev\" | \"prod\" | \"preview\";\n if (options.type) {\n deploymentType = logAndUse(\"type\", options.type);\n } else {\n const dtypeChoices = [\n {\n name: \"dev\",\n value: \"dev\" as const,\n },\n {\n name: \"preview\",\n value: \"preview\" as const,\n },\n {\n name: \"prod\",\n value: \"prod\" as const,\n },\n ];\n deploymentType = await promptOptions(ctx, {\n message: \"Deployment type?\",\n choices: dtypeChoices,\n });\n }\n\n let ref: string | undefined;\n let teamAndProject: { teamSlug: string; projectSlug: string } | undefined;\n if (refParam) {\n const result = parseSelectorForNewDeployment(refParam);\n if (result.kind === \"invalid\") {\n logFailure(result.message);\n } else {\n ref = logAndUse(\"ref\", result.ref);\n teamAndProject = result.teamAndProject;\n }\n }\n while (ref === undefined) {\n const gitDefault = defaultRef(localGitBranch(), deploymentType);\n const input = await promptString(ctx, {\n message:\n \"What do you want to call this deployment?\\n\" +\n chalkStderr.reset.dim(\n \"The deployment reference will be used to identify your deployment on the dashboard and in CLI commands.\\nExamples: staging, dev/james/feature\",\n ) +\n \"\\n>\",\n ...(gitDefault !== undefined ? { default: gitDefault } : {}),\n validate: validateTentativeReference,\n });\n const result = parseSelectorForNewDeployment(input);\n if (result.kind === \"invalid\") {\n logFailure(result.message);\n continue;\n }\n ref = result.ref;\n teamAndProject = result.teamAndProject;\n }\n\n const project = teamAndProject\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProject.teamSlug,\n projectSlug: teamAndProject.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\n\n const availableRegions = await fetchAvailableRegions(ctx, project.teamId);\n let regionDetails: AvailableRegion;\n if (options.region) {\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n options.region,\n );\n logAndUse(\"region\", regionDetails.displayName);\n } else {\n // Use the team's default region if set, or prompt the user to pick\n // TODO: this duplicates some of the logic in selectRegionOrUseDefault (npm-packages/convex/src/cli/lib/utils/utils.ts)\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n const team = teams.find((team) => team.slug === project.teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${project.teamSlug} not found.`,\n });\n }\n const regionName =\n team.defaultRegion ?? (await selectRegion(ctx, team.id, deploymentType));\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n regionName,\n );\n if (team.defaultRegion) {\n logFinishedStep(\n `Using team default region of ${regionDetails.displayName}`,\n );\n } else {\n await logNoDefaultRegionMessage(team.slug);\n }\n }\n\n let classDetails: AvailableClass | null = null;\n if (options.class) {\n const availableClasses = await fetchAvailableClasses(ctx, project.teamId);\n classDetails = await resolveClassDetailsOrCrash(\n ctx,\n availableClasses,\n options.class,\n );\n logAndUse(\"class\", classDetails.type);\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId: project.id,\n regionDetails,\n classDetails,\n type: deploymentType,\n teamSlug: project.teamSlug,\n projectSlug: project.slug,\n };\n}\n\ntype NewDeploymentSelectorResult =\n | {\n kind: \"valid\";\n ref: string;\n teamAndProject?: { teamSlug: string; projectSlug: string };\n }\n | { kind: \"invalid\"; message: string };\n\nfunction parseSelectorForNewDeployment(\n selectorString: string,\n): NewDeploymentSelectorResult {\n const selector = parseDeploymentSelector(selectorString);\n switch (selector.kind) {\n case \"deploymentName\":\n return {\n kind: \"invalid\",\n message: `\"${selector.deploymentName}\" is not a valid deployment reference. References can't look like \"word-word-123\" \u2014 that format is reserved for automatically-generated deployment names.`,\n };\n case \"inCurrentProject\": {\n const inner = selector.selector;\n if (inner.kind === \"dev\") {\n return {\n kind: \"invalid\",\n message: `\"dev\" is reserved as an alias for your default dev deployment.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is reserved as an alias for your default production deployment.`,\n };\n }\n if (inner.kind === \"local\") {\n return {\n kind: \"invalid\",\n message: `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(\"npx convex deployment create local\")}`,\n };\n }\n return { kind: \"valid\", ref: inner.reference };\n }\n case \"inProject\": {\n return {\n kind: \"invalid\",\n message: `Please use \"team:project:ref\" to specify the team when creating a new deployment in a different project.`,\n };\n }\n case \"inTeamProject\": {\n const inner = selector.selector;\n if (inner.kind === \"dev\") {\n return {\n kind: \"invalid\",\n message: `\"dev\" is reserved as an alias for your default dev deployment.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is reserved as an alias for your default production deployment.`,\n };\n }\n if (inner.kind === \"local\") {\n return {\n kind: \"invalid\",\n message: `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(`npx convex deployment create ${selector.teamSlug}:${selector.projectSlug}:local`)}`,\n };\n }\n return {\n kind: \"valid\",\n ref: inner.reference,\n teamAndProject: {\n teamSlug: selector.teamSlug,\n projectSlug: selector.projectSlug,\n },\n };\n }\n default:\n selector satisfies never;\n return {\n kind: \"invalid\",\n message: \"Unknown state. This is a bug in Convex.\",\n };\n }\n}\n\n/**\n * Detect whether the user is creating a local deployment.\n * Returns:\n * - `null` if `refParam` is not a local-deployment selector\n * - `inCurrentProject` for plain `local`\n * - `needsTeam` for `project:local` (which we reject \u2014 same rule as cloud)\n * - `inTeamProject` for `team:project:local`\n */\nfunction parseLocalCreateTarget(\n refParam: string,\n):\n | null\n | { kind: \"inCurrentProject\" }\n | { kind: \"needsTeam\" }\n | { kind: \"inTeamProject\"; teamSlug: string; projectSlug: string } {\n const parsed = parseDeploymentSelector(refParam);\n if (parsed.kind === \"inCurrentProject\" && parsed.selector.kind === \"local\") {\n return { kind: \"inCurrentProject\" };\n }\n if (parsed.kind === \"inProject\" && parsed.selector.kind === \"local\") {\n return { kind: \"needsTeam\" };\n }\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind === \"local\") {\n return {\n kind: \"inTeamProject\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n };\n }\n return null;\n}\n\nasync function resolveProject(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n): Promise<PlatformProjectDetails> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\": {\n const { deploymentFields } = deploymentSelection.deploymentToActOn;\n if (deploymentFields) {\n return await getProjectDetails(ctx, {\n kind: \"deploymentName\",\n deploymentName: deploymentFields.deploymentName,\n deploymentType: null,\n });\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot infer project from the current deployment configuration. Use `team:project:ref` to specify team and project slugs.\",\n });\n }\n case \"deploymentWithinProject\": {\n return await getProjectDetails(ctx, deploymentSelection.targetProject);\n }\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n });\n }\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No project configured yet. Use `team:project:ref` to specify team and project slugs.\",\n });\n case \"anonymous\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot create a deployment in anonymous mode. \" +\n \"Run `npx convex login` and configure a project first.\",\n });\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deployment selection kind.`,\n });\n }\n }\n}\n\nconst REGION_NAME_TO_ALIAS: Record<string, string> = {\n \"aws-us-east-1\": \"us\",\n \"aws-eu-west-1\": \"eu\",\n};\n\nconst REGION_ALIAS_TO_NAME = Object.fromEntries(\n Object.entries(REGION_NAME_TO_ALIAS).map(([name, alias]) => [alias, name]),\n);\n\nexport async function fetchAvailableRegions(ctx: Context, teamId: number) {\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 return regionsResponse.items.filter((item) => item.available);\n}\n\ntype AvailableRegion = Awaited<\n ReturnType<typeof fetchAvailableRegions>\n>[number];\n\nexport function resolveRegionDetails(\n availableRegions: AvailableRegion[],\n region: string,\n) {\n const resolvedRegion = REGION_ALIAS_TO_NAME[region] ?? region;\n return availableRegions.find((item) => item.name === resolvedRegion) ?? null;\n}\n\nasync function resolveRegionDetailsOrCrash(\n ctx: Context,\n availableRegions: AvailableRegion[],\n region: string,\n) {\n const regionDetails = resolveRegionDetails(availableRegions, region);\n if (!regionDetails) {\n return await crashInvalidRegion(ctx, availableRegions, region);\n }\n return regionDetails;\n}\n\nfunction invalidRegionMessage(\n availableRegions: AvailableRegion[],\n region: string,\n): string {\n const formatted = availableRegions\n .map(\n (item) =>\n ` Use \\`--region ${REGION_NAME_TO_ALIAS[item.name] ?? item.name}\\` for ${item.displayName}`,\n )\n .join(\"\\n\");\n return `Invalid region \"${region}\".\\n\\n` + formatted;\n}\n\nasync function crashInvalidRegion(\n ctx: Context,\n availableRegions: AvailableRegion[],\n region: string,\n): Promise<never> {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: invalidRegionMessage(availableRegions, region),\n });\n}\n\nexport async function fetchAvailableClasses(ctx: Context, teamId: number) {\n const classesResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_classes\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n return classesResponse.items.filter((item) => item.available);\n}\n\ntype AvailableClass = Awaited<ReturnType<typeof fetchAvailableClasses>>[number];\n\nexport function resolveClassDetails(\n availableClasses: AvailableClass[],\n className: string,\n) {\n return availableClasses.find((item) => item.type === className) ?? null;\n}\n\nasync function resolveClassDetailsOrCrash(\n ctx: Context,\n availableClasses: AvailableClass[],\n className: string,\n) {\n const classDetails = resolveClassDetails(availableClasses, className);\n if (!classDetails) {\n return await crashInvalidClass(ctx, availableClasses, className);\n }\n return classDetails;\n}\n\nfunction invalidClassMessage(\n availableClasses: AvailableClass[],\n className: string,\n): string {\n const formatted = availableClasses\n .map((item) => ` \\`--class ${item.type}\\``)\n .join(\"\\n\");\n return `Invalid class \"${className}\".\\n\\nAvailable classes:\\n` + formatted;\n}\n\nasync function crashInvalidClass(\n ctx: Context,\n availableClasses: AvailableClass[],\n className: string,\n): Promise<never> {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: invalidClassMessage(availableClasses, className),\n });\n}\n\nasync function resolveExpiresAtOrCrash(\n ctx: Context,\n expiration: string | undefined,\n): Promise<number | null | undefined> {\n if (!expiration) {\n return undefined;\n }\n const parsed = parseExpiration(expiration);\n if (parsed.kind === \"error\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: parsed.message,\n });\n }\n const now = Date.now();\n const resolved = resolveExpiration(parsed, now);\n if (resolved !== null) {\n const validation = validateExpiration(resolved, now);\n if (validation.kind === \"error\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: validation.message,\n });\n }\n }\n return resolved;\n}\n\n/**\n * Helper to log a value passed in as a CLI argument in the interactive flow.\n */\nfunction logAndUse<T extends string | boolean>(label: string, value: T): T {\n logFinishedStep(`Using ${label}: ${chalkStderr.bold(value)}`);\n return value;\n}\n\n// This is an oversimplification, it\u2019s fine if it fails later\nfunction validateTentativeReference(tentativeReference: string): true | string {\n if (tentativeReference.length < 3) {\n return \"References must be at least 3 characters\";\n }\n if (tentativeReference.length > 100) {\n return \"References must be at most 100 characters\";\n }\n if (!/^[a-z0-9/-]+$/.test(tentativeReference)) {\n return \"References can only contain lowercase letters, numbers, `-`, and `/`\";\n }\n if (tentativeReference === \"dev\") {\n return '\"dev\" is reserved as an alias for your default dev deployment.';\n }\n if (tentativeReference === \"prod\") {\n return '\"prod\" is reserved as an alias for your default production deployment.';\n }\n if (tentativeReference === \"local\") {\n return `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(\"npx convex deployment create local\")}`;\n }\n if (/^[a-z]+-[a-z]+-\\d+$/.test(tentativeReference)) {\n return 'References can\\'t look like \"word-word-123\" \u2014 that format is reserved for automatically-generated deployment names. Try something like dev/my-feature or staging instead.';\n }\n\n return true;\n}\n\n/**\n * Get the current local git branch name by shelling out to git.\n * Returns null if git is unavailable, the repo is in detached HEAD state,\n * or the branch is main/master.\n */\nfunction localGitBranch(): string | null {\n try {\n const branch = (\n execSync(\"git rev-parse --abbrev-ref HEAD\", {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n }) as Buffer\n )\n .toString()\n .trim();\n if (\n !branch ||\n branch === \"HEAD\" ||\n branch === \"main\" ||\n branch === \"master\"\n ) {\n return null;\n }\n return branch;\n } catch {\n return null;\n }\n}\n\n/**\n * Slugify a git branch name into a valid deployment reference.\n * Returns undefined if the result would fail validation.\n */\nfunction defaultRef(\n branch: string | null,\n deploymentType: \"dev\" | \"prod\" | \"preview\",\n): string | undefined {\n if (deploymentType !== \"dev\" && deploymentType !== \"preview\") {\n return undefined;\n }\n if (!branch) return undefined;\n const slug = branch\n .replace(/[^a-z0-9/-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n if (!slug) return undefined;\n const ref = `${deploymentType}/${slug}`;\n const valid = validateTentativeReference(ref);\n if (valid !== true) return undefined;\n return ref;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import { execSync } from \"child_process\";\nimport { Command, Option } from \"@commander-js/extra-typings\";\nimport { Context, oneoffContext } from \"../bundler/context.js\";\nimport {\n logFailure,\n logFinishedStep,\n logMessage,\n showSpinner,\n} from \"../bundler/log.js\";\nimport {\n DeploymentSelection,\n ensureAuthCanCreateDeployment,\n getDeploymentSelection,\n getProjectDetails,\n deploymentNameFromSelection,\n} from \"./lib/deploymentSelection.js\";\nimport {\n logNoDefaultRegionMessage,\n selectRegion,\n typedBigBrainClient,\n typedPlatformClient,\n} from \"./lib/utils/utils.js\";\nimport { ProjectResponse } from \"@convex-dev/platform/managementApi\";\nimport { getTeamAndProjectFromPreviewAdminKey } from \"./lib/deployment.js\";\nimport { saveSelectedDeployment } from \"./deploymentSelect.js\";\nimport { promptOptions, promptString } from \"./lib/utils/prompts.js\";\nimport { chalkStderr } from \"chalk\";\nimport { parseDeploymentSelector } from \"./lib/deploymentSelector.js\";\nimport {\n parseExpiration,\n resolveExpiration,\n validateExpiration,\n} from \"./lib/expiration.js\";\nimport { ensureBackendBinaryDownloaded } from \"./lib/localDeployment/download.js\";\nimport {\n loadProjectLocalConfig,\n saveDeploymentConfig,\n} from \"./lib/localDeployment/filePaths.js\";\nimport { chooseLocalBackendPorts } from \"./lib/localDeployment/utils.js\";\nimport { bigBrainStart } from \"./lib/localDeployment/bigBrain.js\";\nimport { importDefaultEnvVars } from \"./lib/localDeployment/localDeployment.js\";\nimport { localDeploymentUrl } from \"./lib/localDeployment/run.js\";\nimport { announceDeploymentTarget } from \"./lib/announceDeploymentTarget.js\";\nimport { generateLocalDevSecrets } from \"./lib/localDeployment/secrets.js\";\n\nconst SUPPORTED_TYPES = [\"dev\", \"prod\", \"preview\"] as const;\n\nexport const deploymentCreate = new Command(\"create\")\n .summary(\"Create a new deployment for a project\")\n .description(\n [\n \"Create a new deployment for a project.\",\n \"\",\n \"\u2022 Create a dev deployment and select it: `npx convex deployment create dev/my-new-feature --type dev --select`\",\n \"\u2022 Create a prod deployment named \u201Cstaging\u201D: `npx convex deployment create staging --type prod`\",\n ].join(\"\\n\"),\n )\n .argument(\n \"[reference]\",\n \"The reference for the new deployment, e.g. `staging` or `dev/my-feature`. \\n\" +\n \"Use `local` to create a local deployment. \\n\" +\n \"You can specify a team and project with `team-slug:project-slug:ref` (e.g. `my-team:my-project:staging` or `my-team:my-project:local`). \\n\" +\n \"Can be omitted when using `--default`.\",\n )\n .allowExcessArguments(false)\n .addOption(\n new Option(\"--type <type>\", \"Deployment type\").choices(SUPPORTED_TYPES),\n )\n .option(\"--region <region>\", \"Deployment region\")\n .addOption(new Option(\"--class <class>\", \"Deployment class\").hideHelp())\n .option(\n \"--select\",\n \"Select the new deployment. This will update the Convex environment variables in .env.local. Subsequent `npx convex` commands will run against this deployment.\",\n )\n .option(\n \"--default\",\n \"Make the new deployment your default production deployment (used by `npx convex deploy`) or your personal dev deployment.\",\n )\n .option(\n \"--expiration <value>\",\n 'When the deployment expires (e.g. \"none\", \"in 7 days\", \"2026-04-01T00:00:00Z\", or a UNIX timestamp in seconds or milliseconds)',\n )\n .addOption(new Option(\"--expiry <value>\").hideHelp())\n .addOption(new Option(\"--expires <value>\").hideHelp())\n .action(async (refParam, options) => {\n const expiration = options.expiration ?? options.expiry ?? options.expires;\n const ctx = await oneoffContext({\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Creating a deployment goes through the platform API, which accepts\n // personal access tokens and project keys but not deployment/preview deploy\n // keys. Fail fast (and clearly) for the unsupported keys rather than\n // surfacing an opaque 401 from the lookup below.\n await ensureAuthCanCreateDeployment(ctx);\n\n const currentDeployment = await getDeploymentSelection(ctx, {\n url: undefined,\n adminKey: undefined,\n envFile: undefined,\n });\n\n // Handle `deployment create [team:project:]local`\n if (refParam !== undefined) {\n const localTarget = parseLocalCreateTarget(refParam);\n if (localTarget !== null) {\n const cloudOnlyFlags = [\"type\", \"region\", \"class\", \"default\"] as const;\n for (const flag of cloudOnlyFlags) {\n if (options[flag]) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--${flag} cannot be used when creating a local deployment`,\n });\n }\n }\n if (expiration !== undefined) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--expiration cannot be used when creating a local deployment`,\n });\n }\n if (localTarget.kind === \"needsTeam\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Please use `team:project:local` to specify the team when creating a local deployment in a different project.\",\n });\n }\n await createLocalDeployment(\n ctx,\n currentDeployment,\n options.select ?? false,\n localTarget.kind === \"inTeamProject\"\n ? {\n teamSlug: localTarget.teamSlug,\n projectSlug: localTarget.projectSlug,\n }\n : null,\n );\n return;\n }\n }\n\n const expiresAt = await resolveExpiresAtOrCrash(ctx, expiration);\n\n const {\n ref,\n regionDetails,\n classDetails,\n projectId,\n type,\n isDefault,\n teamSlug,\n projectSlug,\n } = process.stdin.isTTY\n ? await resolveOptionsInteractively(\n ctx,\n currentDeployment,\n refParam,\n options,\n )\n : await resolveOptionsNoninteractively(\n ctx,\n currentDeployment,\n refParam,\n options,\n );\n\n showSpinner(\n `Creating ${type} deployment` +\n (regionDetails ? ` in region ${regionDetails.displayName}` : \"\") +\n (classDetails ? ` with class ${classDetails.type}` : \"\") +\n \"...\",\n );\n\n const created = (\n await typedPlatformClient(ctx).POST(\n \"/projects/{project_id}/create_deployment\",\n {\n params: {\n path: { project_id: projectId },\n },\n body: {\n type,\n region: regionDetails?.name ?? null,\n reference: ref ?? null,\n isDefault,\n ...(expiresAt !== undefined ? { expiresAt } : {}),\n ...(classDetails ? { class: classDetails.type } : {}),\n },\n },\n )\n ).data!;\n\n if (created.kind !== \"cloud\") {\n // This should be impossible\n const err = `Expected cloud deployment to be created but got ${created.kind}`;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: err,\n errForSentry: err,\n });\n }\n\n logFinishedStep(\n options.select\n ? `Created and selected new ${created.deploymentType} deployment:`\n : `Created new ${created.isDefault ? \"default \" : \"\"}${created.deploymentType} deployment:`,\n );\n announceDeploymentTarget(null, {\n url: created.deploymentUrl,\n deploymentFields: {\n deploymentName: created.name,\n deploymentType: created.deploymentType,\n teamSlug,\n projectSlug,\n reference: created.reference,\n isDefault: created.isDefault,\n },\n });\n\n if (!options.select) {\n if (type !== \"prod\") {\n const selectRef = `${teamSlug}:${projectSlug}:${created.reference}`;\n logMessage(\n `\\nTo make \\`npx convex\\` use this deployment, run ${chalkStderr.bold(`npx convex deployment select ${selectRef}`)}`,\n );\n logMessage(\n chalkStderr.gray(\n \"Hint: use `--select` to immediately select the newly created deployment.\",\n ),\n );\n }\n } else {\n const selection: DeploymentSelection = {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"teamAndProjectSlugs\",\n teamSlug,\n projectSlug,\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: created.reference,\n },\n };\n await saveSelectedDeployment(\n ctx,\n created.reference,\n selection,\n deploymentNameFromSelection(currentDeployment),\n );\n }\n });\n\nexport async function createLocalDeployment(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n select: boolean,\n baseDeployment: { teamSlug: string; projectSlug: string } | null,\n): Promise<void> {\n const existing = loadProjectLocalConfig(ctx);\n if (existing) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: \"A local deployment already exists.\",\n });\n }\n\n const {\n teamSlug,\n slug: projectSlug,\n id: cloudProjectId,\n } = baseDeployment\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: baseDeployment.teamSlug,\n projectSlug: baseDeployment.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\n\n showSpinner(\"Downloading local backend...\");\n const { version, binaryPath: latestBinaryPath } =\n await ensureBackendBinaryDownloaded(ctx, {\n kind: \"latest\",\n });\n\n const { cloudPort, sitePort } = await chooseLocalBackendPorts(ctx);\n\n showSpinner(\"Registering local deployment...\");\n const { deploymentName } = await bigBrainStart(ctx, {\n port: cloudPort,\n projectSlug,\n teamSlug,\n instanceName: null,\n });\n const { instanceSecret, adminKey } = await generateLocalDevSecrets(ctx, {\n deploymentName,\n latestBinaryPath,\n });\n\n saveDeploymentConfig(ctx, \"local\", deploymentName, {\n backendVersion: version,\n ports: { cloud: cloudPort, site: sitePort },\n adminKey,\n instanceSecret,\n cloudProjectId,\n });\n\n logFinishedStep(\n select\n ? \"Created and selected local deployment:\"\n : \"Created local deployment:\",\n );\n\n announceDeploymentTarget(null, {\n url: `http://127.0.0.1:${cloudPort}`,\n deploymentFields: {\n deploymentName,\n deploymentType: \"local\",\n teamSlug,\n projectSlug,\n reference: null,\n isDefault: false,\n },\n });\n\n await importDefaultEnvVars(ctx, {\n teamSlug,\n projectSlug,\n deploymentName,\n deploymentUrl: localDeploymentUrl(cloudPort),\n adminKey,\n });\n\n if (select) {\n const selection: DeploymentSelection = {\n kind: \"deploymentWithinProject\",\n targetProject: {\n kind: \"deploymentName\",\n deploymentName,\n deploymentType: \"local\",\n },\n selectionWithinProject: {\n kind: \"deploymentSelector\",\n selector: \"local\",\n },\n };\n await saveSelectedDeployment(\n ctx,\n \"local\",\n selection,\n deploymentNameFromSelection(currentDeployment),\n );\n }\n\n const devCommand = \"npx convex dev\";\n if (select) {\n logMessage(`\\nRun ${chalkStderr.bold(devCommand)} to start it.`);\n } else {\n logMessage(\n `\\nTo use this deployment, run:\\n` +\n chalkStderr.bold(` npx convex deployment select local\\n`) +\n ` Then, run ${chalkStderr.bold(devCommand)} to start it.`,\n );\n }\n}\n\ntype RefParam = Parameters<Parameters<typeof deploymentCreate.action>[0]>[0];\ntype OptionsParam = Parameters<\n Parameters<typeof deploymentCreate.action>[0]\n>[1];\n\nasync function resolveOptionsNoninteractively(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n refParam: RefParam,\n options: OptionsParam,\n) {\n let ref: string | undefined;\n let teamAndProject: { teamSlug: string; projectSlug: string } | undefined;\n if (refParam) {\n const result = parseSelectorForNewDeployment(refParam);\n if (result.kind === \"invalid\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: result.message,\n });\n }\n ref = result.ref;\n teamAndProject = result.teamAndProject;\n }\n\n if (!ref && !options.default) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Specify a deployment ref or use --default:\\n\" +\n \" `npx convex deployment create my-deployment-ref --type dev`\\n\" +\n \" `npx convex deployment create --type prod --default`\",\n });\n }\n\n if (!options.type) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `--type is required (supported values: ${SUPPORTED_TYPES.join(\", \")})`,\n });\n }\n\n const project = teamAndProject\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProject.teamSlug,\n projectSlug: teamAndProject.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\n const projectId = project.id;\n\n // If no region is passed in, the team's default region will be used\n let regionDetails: AvailableRegion | null = null;\n if (options.region) {\n const availableRegions = await fetchAvailableRegions(ctx, project.teamId);\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n options.region,\n );\n }\n\n // If no class is passed in, the team's default class will be used\n let classDetails: AvailableClass | null = null;\n if (options.class) {\n const availableClasses = await fetchAvailableClasses(ctx, project.teamId);\n classDetails = await resolveClassDetailsOrCrash(\n ctx,\n availableClasses,\n options.class,\n );\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId,\n regionDetails,\n classDetails,\n type: options.type,\n teamSlug: project.teamSlug,\n projectSlug: project.slug,\n };\n}\n\nasync function resolveOptionsInteractively(\n ctx: Context,\n currentDeployment: DeploymentSelection,\n refParam: RefParam,\n options: OptionsParam,\n) {\n let deploymentType: \"dev\" | \"prod\" | \"preview\";\n if (options.type) {\n deploymentType = logAndUse(\"type\", options.type);\n } else {\n const dtypeChoices = [\n {\n name: \"dev\",\n value: \"dev\" as const,\n },\n {\n name: \"preview\",\n value: \"preview\" as const,\n },\n {\n name: \"prod\",\n value: \"prod\" as const,\n },\n ];\n deploymentType = await promptOptions(ctx, {\n message: \"Deployment type?\",\n choices: dtypeChoices,\n });\n }\n\n let ref: string | undefined;\n let teamAndProject: { teamSlug: string; projectSlug: string } | undefined;\n if (refParam) {\n const result = parseSelectorForNewDeployment(refParam);\n if (result.kind === \"invalid\") {\n logFailure(result.message);\n } else {\n ref = logAndUse(\"ref\", result.ref);\n teamAndProject = result.teamAndProject;\n }\n }\n while (ref === undefined) {\n const gitDefault = defaultRef(localGitBranch(), deploymentType);\n const input = await promptString(ctx, {\n message:\n \"What do you want to call this deployment?\\n\" +\n chalkStderr.reset.dim(\n \"The deployment reference will be used to identify your deployment on the dashboard and in CLI commands.\\nExamples: staging, dev/james/feature\",\n ) +\n \"\\n>\",\n ...(gitDefault !== undefined ? { default: gitDefault } : {}),\n validate: validateTentativeReference,\n });\n const result = parseSelectorForNewDeployment(input);\n if (result.kind === \"invalid\") {\n logFailure(result.message);\n continue;\n }\n ref = result.ref;\n teamAndProject = result.teamAndProject;\n }\n\n const project = teamAndProject\n ? await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: teamAndProject.teamSlug,\n projectSlug: teamAndProject.projectSlug,\n })\n : await resolveProject(ctx, currentDeployment);\n\n const availableRegions = await fetchAvailableRegions(ctx, project.teamId);\n let regionDetails: AvailableRegion;\n if (options.region) {\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n options.region,\n );\n logAndUse(\"region\", regionDetails.displayName);\n } else {\n // Use the team's default region if set, or prompt the user to pick\n // TODO: this duplicates some of the logic in selectRegionOrUseDefault (npm-packages/convex/src/cli/lib/utils/utils.ts)\n const teams = (await typedBigBrainClient(ctx).GET(\"/teams\")).data!;\n const team = teams.find((team) => team.slug === project.teamSlug);\n if (!team) {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Error: Team ${project.teamSlug} not found.`,\n });\n }\n const regionName =\n team.defaultRegion ?? (await selectRegion(ctx, team.id, deploymentType));\n regionDetails = await resolveRegionDetailsOrCrash(\n ctx,\n availableRegions,\n regionName,\n );\n if (team.defaultRegion) {\n logFinishedStep(\n `Using team default region of ${regionDetails.displayName}`,\n );\n } else {\n await logNoDefaultRegionMessage(team.slug);\n }\n }\n\n let classDetails: AvailableClass | null = null;\n if (options.class) {\n const availableClasses = await fetchAvailableClasses(ctx, project.teamId);\n classDetails = await resolveClassDetailsOrCrash(\n ctx,\n availableClasses,\n options.class,\n );\n logAndUse(\"class\", classDetails.type);\n }\n\n return {\n ref,\n isDefault: options.default ?? null,\n projectId: project.id,\n regionDetails,\n classDetails,\n type: deploymentType,\n teamSlug: project.teamSlug,\n projectSlug: project.slug,\n };\n}\n\ntype NewDeploymentSelectorResult =\n | {\n kind: \"valid\";\n ref: string;\n teamAndProject?: { teamSlug: string; projectSlug: string };\n }\n | { kind: \"invalid\"; message: string };\n\nfunction parseSelectorForNewDeployment(\n selectorString: string,\n): NewDeploymentSelectorResult {\n const selector = parseDeploymentSelector(selectorString);\n switch (selector.kind) {\n case \"deploymentName\":\n return {\n kind: \"invalid\",\n message: `\"${selector.deploymentName}\" is not a valid deployment reference. References can't look like \"word-word-123\" \u2014 that format is reserved for automatically-generated deployment names.`,\n };\n case \"inCurrentProject\": {\n const inner = selector.selector;\n if (inner.kind === \"dev\") {\n return {\n kind: \"invalid\",\n message: `\"dev\" is reserved as an alias for your default dev deployment.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is reserved as an alias for your default production deployment.`,\n };\n }\n if (inner.kind === \"local\") {\n return {\n kind: \"invalid\",\n message: `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(\"npx convex deployment create local\")}`,\n };\n }\n return { kind: \"valid\", ref: inner.reference };\n }\n case \"inProject\": {\n return {\n kind: \"invalid\",\n message: `Please use \"team:project:ref\" to specify the team when creating a new deployment in a different project.`,\n };\n }\n case \"inTeamProject\": {\n const inner = selector.selector;\n if (inner.kind === \"dev\") {\n return {\n kind: \"invalid\",\n message: `\"dev\" is reserved as an alias for your default dev deployment.`,\n };\n }\n if (inner.kind === \"prod\") {\n return {\n kind: \"invalid\",\n message: `\"prod\" is reserved as an alias for your default production deployment.`,\n };\n }\n if (inner.kind === \"local\") {\n return {\n kind: \"invalid\",\n message: `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(`npx convex deployment create ${selector.teamSlug}:${selector.projectSlug}:local`)}`,\n };\n }\n return {\n kind: \"valid\",\n ref: inner.reference,\n teamAndProject: {\n teamSlug: selector.teamSlug,\n projectSlug: selector.projectSlug,\n },\n };\n }\n default:\n selector satisfies never;\n return {\n kind: \"invalid\",\n message: \"Unknown state. This is a bug in Convex.\",\n };\n }\n}\n\n/**\n * Detect whether the user is creating a local deployment.\n * Returns:\n * - `null` if `refParam` is not a local-deployment selector\n * - `inCurrentProject` for plain `local`\n * - `needsTeam` for `project:local` (which we reject \u2014 same rule as cloud)\n * - `inTeamProject` for `team:project:local`\n */\nfunction parseLocalCreateTarget(\n refParam: string,\n):\n | null\n | { kind: \"inCurrentProject\" }\n | { kind: \"needsTeam\" }\n | { kind: \"inTeamProject\"; teamSlug: string; projectSlug: string } {\n const parsed = parseDeploymentSelector(refParam);\n if (parsed.kind === \"inCurrentProject\" && parsed.selector.kind === \"local\") {\n return { kind: \"inCurrentProject\" };\n }\n if (parsed.kind === \"inProject\" && parsed.selector.kind === \"local\") {\n return { kind: \"needsTeam\" };\n }\n if (parsed.kind === \"inTeamProject\" && parsed.selector.kind === \"local\") {\n return {\n kind: \"inTeamProject\",\n teamSlug: parsed.teamSlug,\n projectSlug: parsed.projectSlug,\n };\n }\n return null;\n}\n\nasync function resolveProject(\n ctx: Context,\n deploymentSelection: DeploymentSelection,\n): Promise<ProjectResponse> {\n switch (deploymentSelection.kind) {\n case \"existingDeployment\": {\n const { deploymentFields } = deploymentSelection.deploymentToActOn;\n if (deploymentFields) {\n return await getProjectDetails(ctx, {\n kind: \"deploymentName\",\n deploymentName: deploymentFields.deploymentName,\n deploymentType: null,\n });\n }\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot infer project from the current deployment configuration. Use `team:project:ref` to specify team and project slugs.\",\n });\n }\n case \"deploymentWithinProject\": {\n return await getProjectDetails(ctx, deploymentSelection.targetProject);\n }\n case \"preview\": {\n const slugs = await getTeamAndProjectFromPreviewAdminKey(\n ctx,\n deploymentSelection.previewDeployKey,\n );\n return await getProjectDetails(ctx, {\n kind: \"teamAndProjectSlugs\",\n teamSlug: slugs.teamSlug,\n projectSlug: slugs.projectSlug,\n });\n }\n case \"chooseProject\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"No project configured yet. Use `team:project:ref` to specify team and project slugs.\",\n });\n case \"anonymous\":\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage:\n \"Cannot create a deployment in anonymous mode. \" +\n \"Run `npx convex login` and configure a project first.\",\n });\n default: {\n deploymentSelection satisfies never;\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: `Unexpected deployment selection kind.`,\n });\n }\n }\n}\n\nconst REGION_NAME_TO_ALIAS: Record<string, string> = {\n \"aws-us-east-1\": \"us\",\n \"aws-eu-west-1\": \"eu\",\n};\n\nconst REGION_ALIAS_TO_NAME = Object.fromEntries(\n Object.entries(REGION_NAME_TO_ALIAS).map(([name, alias]) => [alias, name]),\n);\n\nexport async function fetchAvailableRegions(ctx: Context, teamId: number) {\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 return regionsResponse.items.filter((item) => item.available);\n}\n\ntype AvailableRegion = Awaited<\n ReturnType<typeof fetchAvailableRegions>\n>[number];\n\nexport function resolveRegionDetails(\n availableRegions: AvailableRegion[],\n region: string,\n) {\n const resolvedRegion = REGION_ALIAS_TO_NAME[region] ?? region;\n return availableRegions.find((item) => item.name === resolvedRegion) ?? null;\n}\n\nasync function resolveRegionDetailsOrCrash(\n ctx: Context,\n availableRegions: AvailableRegion[],\n region: string,\n) {\n const regionDetails = resolveRegionDetails(availableRegions, region);\n if (!regionDetails) {\n return await crashInvalidRegion(ctx, availableRegions, region);\n }\n return regionDetails;\n}\n\nfunction invalidRegionMessage(\n availableRegions: AvailableRegion[],\n region: string,\n): string {\n const formatted = availableRegions\n .map(\n (item) =>\n ` Use \\`--region ${REGION_NAME_TO_ALIAS[item.name] ?? item.name}\\` for ${item.displayName}`,\n )\n .join(\"\\n\");\n return `Invalid region \"${region}\".\\n\\n` + formatted;\n}\n\nasync function crashInvalidRegion(\n ctx: Context,\n availableRegions: AvailableRegion[],\n region: string,\n): Promise<never> {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: invalidRegionMessage(availableRegions, region),\n });\n}\n\nexport async function fetchAvailableClasses(ctx: Context, teamId: number) {\n const classesResponse = (\n await typedPlatformClient(ctx).GET(\n \"/teams/{team_id}/list_deployment_classes\",\n {\n params: {\n path: { team_id: `${teamId}` },\n },\n },\n )\n ).data!;\n return classesResponse.items.filter((item) => item.available);\n}\n\ntype AvailableClass = Awaited<ReturnType<typeof fetchAvailableClasses>>[number];\n\nexport function resolveClassDetails(\n availableClasses: AvailableClass[],\n className: string,\n) {\n return availableClasses.find((item) => item.type === className) ?? null;\n}\n\nasync function resolveClassDetailsOrCrash(\n ctx: Context,\n availableClasses: AvailableClass[],\n className: string,\n) {\n const classDetails = resolveClassDetails(availableClasses, className);\n if (!classDetails) {\n return await crashInvalidClass(ctx, availableClasses, className);\n }\n return classDetails;\n}\n\nfunction invalidClassMessage(\n availableClasses: AvailableClass[],\n className: string,\n): string {\n const formatted = availableClasses\n .map((item) => ` \\`--class ${item.type}\\``)\n .join(\"\\n\");\n return `Invalid class \"${className}\".\\n\\nAvailable classes:\\n` + formatted;\n}\n\nasync function crashInvalidClass(\n ctx: Context,\n availableClasses: AvailableClass[],\n className: string,\n): Promise<never> {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: invalidClassMessage(availableClasses, className),\n });\n}\n\nasync function resolveExpiresAtOrCrash(\n ctx: Context,\n expiration: string | undefined,\n): Promise<number | null | undefined> {\n if (!expiration) {\n return undefined;\n }\n const parsed = parseExpiration(expiration);\n if (parsed.kind === \"error\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: parsed.message,\n });\n }\n const now = Date.now();\n const resolved = resolveExpiration(parsed, now);\n if (resolved !== null) {\n const validation = validateExpiration(resolved, now);\n if (validation.kind === \"error\") {\n return await ctx.crash({\n exitCode: 1,\n errorType: \"fatal\",\n printedMessage: validation.message,\n });\n }\n }\n return resolved;\n}\n\n/**\n * Helper to log a value passed in as a CLI argument in the interactive flow.\n */\nfunction logAndUse<T extends string | boolean>(label: string, value: T): T {\n logFinishedStep(`Using ${label}: ${chalkStderr.bold(value)}`);\n return value;\n}\n\n// This is an oversimplification, it\u2019s fine if it fails later\nfunction validateTentativeReference(tentativeReference: string): true | string {\n if (tentativeReference.length < 3) {\n return \"References must be at least 3 characters\";\n }\n if (tentativeReference.length > 100) {\n return \"References must be at most 100 characters\";\n }\n if (!/^[a-z0-9/-]+$/.test(tentativeReference)) {\n return \"References can only contain lowercase letters, numbers, `-`, and `/`\";\n }\n if (tentativeReference === \"dev\") {\n return '\"dev\" is reserved as an alias for your default dev deployment.';\n }\n if (tentativeReference === \"prod\") {\n return '\"prod\" is reserved as an alias for your default production deployment.';\n }\n if (tentativeReference === \"local\") {\n return `\"local\" is reserved as an alias for your local deployment. To create one, run ${chalkStderr.bold(\"npx convex deployment create local\")}`;\n }\n if (/^[a-z]+-[a-z]+-\\d+$/.test(tentativeReference)) {\n return 'References can\\'t look like \"word-word-123\" \u2014 that format is reserved for automatically-generated deployment names. Try something like dev/my-feature or staging instead.';\n }\n\n return true;\n}\n\n/**\n * Get the current local git branch name by shelling out to git.\n * Returns null if git is unavailable, the repo is in detached HEAD state,\n * or the branch is main/master.\n */\nfunction localGitBranch(): string | null {\n try {\n const branch = (\n execSync(\"git rev-parse --abbrev-ref HEAD\", {\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 5000,\n }) as Buffer\n )\n .toString()\n .trim();\n if (\n !branch ||\n branch === \"HEAD\" ||\n branch === \"main\" ||\n branch === \"master\"\n ) {\n return null;\n }\n return branch;\n } catch {\n return null;\n }\n}\n\n/**\n * Slugify a git branch name into a valid deployment reference.\n * Returns undefined if the result would fail validation.\n */\nfunction defaultRef(\n branch: string | null,\n deploymentType: \"dev\" | \"prod\" | \"preview\",\n): string | undefined {\n if (deploymentType !== \"dev\" && deploymentType !== \"preview\") {\n return undefined;\n }\n if (!branch) return undefined;\n const slug = branch\n .replace(/[^a-z0-9/-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\");\n if (!slug) return undefined;\n const ref = `${deploymentType}/${slug}`;\n const valid = validateTentativeReference(ref);\n if (valid !== true) return undefined;\n return ref;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["team"]
|
|
7
7
|
}
|
|
@@ -5,6 +5,7 @@ const baseConvexValidator = z.discriminatedUnion("type", [
|
|
|
5
5
|
looseObject({ type: z.literal("null") }),
|
|
6
6
|
looseObject({ type: z.literal("number") }),
|
|
7
7
|
looseObject({ type: z.literal("bigint") }),
|
|
8
|
+
looseObject({ type: z.literal("commitTs") }),
|
|
8
9
|
looseObject({ type: z.literal("boolean") }),
|
|
9
10
|
looseObject({ type: z.literal("string") }),
|
|
10
11
|
looseObject({ type: z.literal("bytes") }),
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/cli/lib/deployApi/validator.ts"],
|
|
4
|
-
"sourcesContent": ["import { z } from \"zod\";\nimport { looseObject } from \"./utils.js\";\n\nconst baseConvexValidator = z.discriminatedUnion(\"type\", [\n looseObject({ type: z.literal(\"null\") }),\n looseObject({ type: z.literal(\"number\") }),\n looseObject({ type: z.literal(\"bigint\") }),\n looseObject({ type: z.literal(\"boolean\") }),\n looseObject({ type: z.literal(\"string\") }),\n looseObject({ type: z.literal(\"bytes\") }),\n looseObject({ type: z.literal(\"any\") }),\n looseObject({ type: z.literal(\"literal\"), value: z.any() }),\n looseObject({ type: z.literal(\"id\"), tableName: z.string() }),\n]);\nexport type ConvexValidator =\n | z.infer<typeof baseConvexValidator>\n | { type: \"array\"; value: ConvexValidator }\n | {\n type: \"record\";\n keys: ConvexValidator;\n values: { fieldType: ConvexValidator; optional: false };\n }\n | { type: \"union\"; value: ConvexValidator[] }\n | {\n type: \"object\";\n value: Record<string, { fieldType: ConvexValidator; optional: boolean }>;\n };\nexport const convexValidator: z.ZodType<ConvexValidator> = z.lazy(() =>\n z.union([\n baseConvexValidator,\n looseObject({ type: z.literal(\"array\"), value: convexValidator }),\n looseObject({\n type: z.literal(\"record\"),\n keys: convexValidator,\n values: z.object({\n fieldType: convexValidator,\n optional: z.literal(false),\n }),\n }),\n looseObject({\n type: z.literal(\"union\"),\n value: z.array(convexValidator),\n }),\n looseObject({\n type: z.literal(\"object\"),\n value: z.record(\n looseObject({\n fieldType: convexValidator,\n optional: z.boolean(),\n }),\n ),\n }),\n ]),\n);\n"],
|
|
5
|
-
"mappings": ";AAAA,SAAS,SAAS;AAClB,SAAS,mBAAmB;AAE5B,MAAM,sBAAsB,EAAE,mBAAmB,QAAQ;AAAA,EACvD,YAAY,EAAE,MAAM,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,EACvC,YAAY,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,EACzC,YAAY,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,EACzC,YAAY,EAAE,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,EAC1C,YAAY,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,EACzC,YAAY,EAAE,MAAM,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,EACxC,YAAY,EAAE,MAAM,EAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,EACtC,YAAY,EAAE,MAAM,EAAE,QAAQ,SAAS,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;AAAA,EAC1D,YAAY,EAAE,MAAM,EAAE,QAAQ,IAAI,GAAG,WAAW,EAAE,OAAO,EAAE,CAAC;AAC9D,CAAC;AAcM,aAAM,kBAA8C,EAAE;AAAA,EAAK,MAChE,EAAE,MAAM;AAAA,IACN;AAAA,IACA,YAAY,EAAE,MAAM,EAAE,QAAQ,OAAO,GAAG,OAAO,gBAAgB,CAAC;AAAA,IAChE,YAAY;AAAA,MACV,MAAM,EAAE,QAAQ,QAAQ;AAAA,MACxB,MAAM;AAAA,MACN,QAAQ,EAAE,OAAO;AAAA,QACf,WAAW;AAAA,QACX,UAAU,EAAE,QAAQ,KAAK;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAAA,IACD,YAAY;AAAA,MACV,MAAM,EAAE,QAAQ,OAAO;AAAA,MACvB,OAAO,EAAE,MAAM,eAAe;AAAA,IAChC,CAAC;AAAA,IACD,YAAY;AAAA,MACV,MAAM,EAAE,QAAQ,QAAQ;AAAA,MACxB,OAAO,EAAE;AAAA,QACP,YAAY;AAAA,UACV,WAAW;AAAA,UACX,UAAU,EAAE,QAAQ;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
|
|
4
|
+
"sourcesContent": ["import { z } from \"zod\";\nimport { looseObject } from \"./utils.js\";\n\nconst baseConvexValidator = z.discriminatedUnion(\"type\", [\n looseObject({ type: z.literal(\"null\") }),\n looseObject({ type: z.literal(\"number\") }),\n looseObject({ type: z.literal(\"bigint\") }),\n looseObject({ type: z.literal(\"commitTs\") }),\n looseObject({ type: z.literal(\"boolean\") }),\n looseObject({ type: z.literal(\"string\") }),\n looseObject({ type: z.literal(\"bytes\") }),\n looseObject({ type: z.literal(\"any\") }),\n looseObject({ type: z.literal(\"literal\"), value: z.any() }),\n looseObject({ type: z.literal(\"id\"), tableName: z.string() }),\n]);\nexport type ConvexValidator =\n | z.infer<typeof baseConvexValidator>\n | { type: \"array\"; value: ConvexValidator }\n | {\n type: \"record\";\n keys: ConvexValidator;\n values: { fieldType: ConvexValidator; optional: false };\n }\n | { type: \"union\"; value: ConvexValidator[] }\n | {\n type: \"object\";\n value: Record<string, { fieldType: ConvexValidator; optional: boolean }>;\n };\nexport const convexValidator: z.ZodType<ConvexValidator> = z.lazy(() =>\n z.union([\n baseConvexValidator,\n looseObject({ type: z.literal(\"array\"), value: convexValidator }),\n looseObject({\n type: z.literal(\"record\"),\n keys: convexValidator,\n values: z.object({\n fieldType: convexValidator,\n optional: z.literal(false),\n }),\n }),\n looseObject({\n type: z.literal(\"union\"),\n value: z.array(convexValidator),\n }),\n looseObject({\n type: z.literal(\"object\"),\n value: z.record(\n looseObject({\n fieldType: convexValidator,\n optional: z.boolean(),\n }),\n ),\n }),\n ]),\n);\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,SAAS;AAClB,SAAS,mBAAmB;AAE5B,MAAM,sBAAsB,EAAE,mBAAmB,QAAQ;AAAA,EACvD,YAAY,EAAE,MAAM,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,EACvC,YAAY,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,EACzC,YAAY,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,EACzC,YAAY,EAAE,MAAM,EAAE,QAAQ,UAAU,EAAE,CAAC;AAAA,EAC3C,YAAY,EAAE,MAAM,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,EAC1C,YAAY,EAAE,MAAM,EAAE,QAAQ,QAAQ,EAAE,CAAC;AAAA,EACzC,YAAY,EAAE,MAAM,EAAE,QAAQ,OAAO,EAAE,CAAC;AAAA,EACxC,YAAY,EAAE,MAAM,EAAE,QAAQ,KAAK,EAAE,CAAC;AAAA,EACtC,YAAY,EAAE,MAAM,EAAE,QAAQ,SAAS,GAAG,OAAO,EAAE,IAAI,EAAE,CAAC;AAAA,EAC1D,YAAY,EAAE,MAAM,EAAE,QAAQ,IAAI,GAAG,WAAW,EAAE,OAAO,EAAE,CAAC;AAC9D,CAAC;AAcM,aAAM,kBAA8C,EAAE;AAAA,EAAK,MAChE,EAAE,MAAM;AAAA,IACN;AAAA,IACA,YAAY,EAAE,MAAM,EAAE,QAAQ,OAAO,GAAG,OAAO,gBAAgB,CAAC;AAAA,IAChE,YAAY;AAAA,MACV,MAAM,EAAE,QAAQ,QAAQ;AAAA,MACxB,MAAM;AAAA,MACN,QAAQ,EAAE,OAAO;AAAA,QACf,WAAW;AAAA,QACX,UAAU,EAAE,QAAQ,KAAK;AAAA,MAC3B,CAAC;AAAA,IACH,CAAC;AAAA,IACD,YAAY;AAAA,MACV,MAAM,EAAE,QAAQ,OAAO;AAAA,MACvB,OAAO,EAAE,MAAM,eAAe;AAAA,IAChC,CAAC;AAAA,IACD,YAAY;AAAA,MACV,MAAM,EAAE,QAAQ,QAAQ;AAAA,MACxB,OAAO,EAAE;AAAA,QACP,YAAY;AAAA,UACV,WAAW;AAAA,UACX,UAAU,EAAE,QAAQ;AAAA,QACtB,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AACH;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|