convex 1.42.3 → 1.43.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/main-dev +6 -1
- package/dist/browser.bundle.js +49 -10
- package/dist/browser.bundle.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/paginated_query_client.js +20 -9
- package/dist/cjs/browser/sync/paginated_query_client.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/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/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/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/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 +14 -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/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 +2534 -2009
- package/dist/cli.bundle.cjs.map +4 -4
- 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/paginated_query_client.js +20 -9
- package/dist/esm/browser/sync/paginated_query_client.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/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/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/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 +14 -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/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 +9 -10
- package/schemas/convex.schema.json +2 -1
- package/src/browser/sync/paginated_query_client.test.ts +209 -1
- package/src/browser/sync/paginated_query_client.ts +26 -9
- 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/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 +15 -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/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
|
@@ -251,8 +251,11 @@ class PaginatedQueryClient {
|
|
|
251
251
|
if (ongoingSplits.has(pageKey)) {
|
|
252
252
|
continue;
|
|
253
253
|
}
|
|
254
|
-
const
|
|
255
|
-
|
|
254
|
+
const pageEntry = pageKeyToQuery.get(pageKey);
|
|
255
|
+
if (!pageEntry) {
|
|
256
|
+
throw new Error(`No page query for active pageKey ${pageKey}`);
|
|
257
|
+
}
|
|
258
|
+
const pageResult = getResult(pageEntry.queryToken);
|
|
256
259
|
if (!pageResult) {
|
|
257
260
|
continue;
|
|
258
261
|
}
|
|
@@ -263,6 +266,7 @@ class PaginatedQueryClient {
|
|
|
263
266
|
this.splitPaginatedQueryPage(
|
|
264
267
|
paginatedQuery,
|
|
265
268
|
pageKey,
|
|
269
|
+
pageEntry.cursor,
|
|
266
270
|
result.splitCursor,
|
|
267
271
|
// we just checked
|
|
268
272
|
result.continueCursor
|
|
@@ -271,11 +275,10 @@ class PaginatedQueryClient {
|
|
|
271
275
|
}
|
|
272
276
|
}
|
|
273
277
|
}
|
|
274
|
-
splitPaginatedQueryPage(paginatedQuery, pageKey, splitCursor, continueCursor) {
|
|
278
|
+
splitPaginatedQueryPage(paginatedQuery, pageKey, startCursor, splitCursor, continueCursor) {
|
|
275
279
|
const splitKey1 = paginatedQuery.nextPageKey++;
|
|
276
280
|
const splitKey2 = paginatedQuery.nextPageKey++;
|
|
277
281
|
const paginationOpts = {
|
|
278
|
-
cursor: continueCursor,
|
|
279
282
|
numItems: paginatedQuery.options.initialNumItems,
|
|
280
283
|
id: paginatedQuery.id
|
|
281
284
|
};
|
|
@@ -285,13 +288,15 @@ class PaginatedQueryClient {
|
|
|
285
288
|
...paginatedQuery.args,
|
|
286
289
|
paginationOpts: {
|
|
287
290
|
...paginationOpts,
|
|
288
|
-
cursor:
|
|
289
|
-
// Start from beginning for first split
|
|
291
|
+
cursor: startCursor,
|
|
290
292
|
endCursor: splitCursor
|
|
291
293
|
}
|
|
292
294
|
}
|
|
293
295
|
);
|
|
294
|
-
paginatedQuery.pageKeyToQuery.set(splitKey1,
|
|
296
|
+
paginatedQuery.pageKeyToQuery.set(splitKey1, {
|
|
297
|
+
...firstSubscription,
|
|
298
|
+
cursor: startCursor
|
|
299
|
+
});
|
|
295
300
|
const secondSubscription = this.client.subscribe(
|
|
296
301
|
paginatedQuery.canonicalizedUdfPath,
|
|
297
302
|
{
|
|
@@ -303,7 +308,10 @@ class PaginatedQueryClient {
|
|
|
303
308
|
}
|
|
304
309
|
}
|
|
305
310
|
);
|
|
306
|
-
paginatedQuery.pageKeyToQuery.set(splitKey2,
|
|
311
|
+
paginatedQuery.pageKeyToQuery.set(splitKey2, {
|
|
312
|
+
...secondSubscription,
|
|
313
|
+
cursor: splitCursor
|
|
314
|
+
});
|
|
307
315
|
paginatedQuery.ongoingSplits.set(pageKey, [splitKey1, splitKey2]);
|
|
308
316
|
}
|
|
309
317
|
/**
|
|
@@ -326,7 +334,10 @@ class PaginatedQueryClient {
|
|
|
326
334
|
pageArgs
|
|
327
335
|
);
|
|
328
336
|
paginatedQuery.pageKeys.push(pageKey);
|
|
329
|
-
paginatedQuery.pageKeyToQuery.set(pageKey,
|
|
337
|
+
paginatedQuery.pageKeyToQuery.set(pageKey, {
|
|
338
|
+
...subscription,
|
|
339
|
+
cursor: continueCursor
|
|
340
|
+
});
|
|
330
341
|
return subscription;
|
|
331
342
|
}
|
|
332
343
|
removePaginatedQuerySubscriber(token) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/browser/sync/paginated_query_client.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * PaginatedQueryClient maps subscriptions to paginated queries to the\n * individual page queries and handles page splits.\n *\n * In order to process all modified queries, paginated and normal, in the same\n * synchronous call the PaginatedQueryClient transition should be used exclusively.\n *\n * Like the BaseConvexClient, this client is not Convex Function type-aware: it deals\n * with queries as functions that return Value, not the specific value.\n * Use a higher-level library to get types.\n */\n\nimport { Value } from \"../../values/index.js\";\nimport {\n PaginatedQueryToken,\n QueryToken,\n serializePaginatedPathAndArgs,\n canonicalizeUdfPath,\n} from \"./udf_path_utils.js\";\nimport { BaseConvexClientInterface, Transition } from \"./client.js\";\nimport {\n PaginatedQueryResult,\n PaginationStatus,\n asPaginationResult,\n} from \"./pagination.js\";\nimport { TS } from \"./protocol.js\";\nimport { Long } from \"../../vendor/long.js\";\n\ntype QueryPageKey = number;\n\n/**\n * Represents a paginated query subscription with multiple pages.\n *\n * To know the order of pages it's necessary to consult `pageKeys`.\n * The pages in this array are active, they constitute a gapless sequence of results.\n * Some pages are not in this array: they may be waiting for data for a page split.\n */\ntype LocalPaginatedQuery = {\n token: PaginatedQueryToken;\n canonicalizedUdfPath: string;\n args: Record<string, Value>; // WITHOUT paginationOpts\n numSubscribers: number;\n options: { initialNumItems: number };\n nextPageKey: QueryPageKey;\n pageKeys: QueryPageKey[]; // These pages make up the active page queries.\n // Map page keys to their query subscriptions\n pageKeyToQuery: Map<\n QueryPageKey,\n { queryToken: QueryToken; unsubscribe: () => void }\n >;\n ongoingSplits: Map<QueryPageKey, [QueryPageKey, QueryPageKey]>;\n skip: boolean;\n\n // Give separate uses of the query separate identities,\n // which may be removed in the future to improve caching.\n id: number;\n};\n\nexport interface SubscribeToPaginatedQueryOptions {\n initialNumItems: number;\n id: number;\n}\n\ntype AnyPaginatedQueryResult = PaginatedQueryResult<Value>;\n\nexport type PaginatedQueryModification =\n | { kind: \"Updated\"; result: AnyPaginatedQueryResult | undefined }\n | { kind: \"Removed\" };\n\nexport type ExtendedTransition = Transition & {\n paginatedQueries: Array<{\n token: PaginatedQueryToken;\n modification: PaginatedQueryModification;\n }>;\n};\n\n/** @internal */\nexport class PaginatedQueryClient {\n private paginatedQuerySet: Map<PaginatedQueryToken, LocalPaginatedQuery> =\n new Map();\n // hold onto a real Transition so we can construct synthetic ones with that timestamp\n private lastTransitionTs: TS;\n\n constructor(\n private client: BaseConvexClientInterface,\n private onTransition: (transition: ExtendedTransition) => void,\n ) {\n // Nonsense initial value to construct synthetic Transitions\n this.lastTransitionTs = Long.fromNumber(0);\n this.client.addOnTransitionHandler((transition: Transition) =>\n this.onBaseTransition(transition),\n );\n }\n\n /**\n * Subscribe to a paginated query.\n *\n * @param name - The name of the paginated query function\n * @param args - Arguments for the query (excluding paginationOpts)\n * @param options - Pagination options including initialNumItems\n * @returns Object with paginatedQueryToken and unsubscribe function\n */\n subscribe(\n name: string,\n args: Record<string, Value>,\n options: SubscribeToPaginatedQueryOptions,\n ): {\n paginatedQueryToken: PaginatedQueryToken;\n unsubscribe: () => void;\n } {\n const canonicalizedUdfPath = canonicalizeUdfPath(name);\n // Note that only the expected options are included in the serialization.\n const token = serializePaginatedPathAndArgs(\n canonicalizedUdfPath,\n args,\n options,\n );\n\n const unsubscribe = () => this.removePaginatedQuerySubscriber(token);\n\n const existingEntry = this.paginatedQuerySet.get(token);\n if (existingEntry) {\n existingEntry.numSubscribers += 1;\n return {\n paginatedQueryToken: token,\n unsubscribe,\n };\n }\n\n // Create new paginated query\n this.paginatedQuerySet.set(token, {\n token,\n canonicalizedUdfPath,\n args,\n numSubscribers: 1,\n options: { initialNumItems: options.initialNumItems },\n nextPageKey: 0,\n pageKeys: [],\n pageKeyToQuery: new Map(),\n ongoingSplits: new Map(),\n skip: false,\n id: options.id,\n });\n\n this.addPageToPaginatedQuery(token, null, options.initialNumItems);\n\n return {\n paginatedQueryToken: token,\n unsubscribe,\n };\n }\n\n /**\n * Get current results for a paginated query based on local state.\n *\n * Throws an error when one of the pages has errored.\n */\n localQueryResult(\n name: string,\n args: Record<string, Value>,\n options: { initialNumItems: number; id: number },\n ): AnyPaginatedQueryResult | undefined {\n const canonicalizedUdfPath = canonicalizeUdfPath(name);\n const token = serializePaginatedPathAndArgs(\n canonicalizedUdfPath,\n args,\n options,\n );\n return this.localQueryResultByToken(token);\n }\n\n /**\n * @internal\n */\n localQueryResultByToken(\n token: PaginatedQueryToken,\n ): AnyPaginatedQueryResult | undefined {\n // undefined is probably the wrong value! Should be a real paginated query result for loading!\n // Butit's confusing why we'd ever get this, I guess some flows call localQueryResult before\n // subscribing? That's proabbly fair but is it consistent with the normal client?\n // What is the invariant here, will a token always exist? Or can a lookup occur at any time?\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n return undefined;\n }\n\n const activePages = this.activePageQueryTokens(paginatedQuery);\n if (activePages.length === 0) {\n return {\n results: [],\n status: \"LoadingFirstPage\",\n loadMore: (numItems: number) => {\n return this.loadMoreOfPaginatedQuery(token, numItems);\n },\n };\n }\n\n let allResults: Value[] = [];\n\n // Some page is loading (this isn't supposed to happen to any page but the last)\n let hasUndefined = false;\n let isDone = false;\n\n for (const pageToken of activePages) {\n // This throws, don't catch it, it should bubble up.\n // It might be a InvalidCursor Error. If it is, this query\n // should be reset (for now, use a new ID to ensure new state).\n //\n // In the future this might be caught and dealt with here but\n // an ID-based solution won't work here, ID is an intrinsic property\n // of this paginated query.\n const result = this.client.localQueryResultByToken(pageToken);\n\n if (result === undefined) {\n hasUndefined = true;\n isDone = false;\n continue;\n }\n\n const paginationResult = asPaginationResult(result);\n allResults = allResults.concat(paginationResult.page);\n // logic only relevant to the last page, we just happen to run it each time\n isDone = !!paginationResult.isDone;\n }\n\n let status: PaginationStatus;\n if (hasUndefined) {\n status = allResults.length === 0 ? \"LoadingFirstPage\" : \"LoadingMore\";\n } else if (isDone) {\n status = \"Exhausted\";\n } else {\n status = \"CanLoadMore\";\n }\n\n return {\n results: allResults,\n status,\n loadMore: (numItems: number) => {\n return this.loadMoreOfPaginatedQuery(token, numItems);\n },\n };\n }\n\n private onBaseTransition(transition: Transition) {\n const changedBaseTokens = transition.queries.map((q) => q.token);\n const changed = this.queriesContainingTokens(changedBaseTokens);\n\n let paginatedQueries: Array<{\n token: PaginatedQueryToken;\n modification: PaginatedQueryModification;\n }> = [];\n\n if (changed.length > 0) {\n this.processPaginatedQuerySplits(changed, (token) =>\n this.client.localQueryResultByToken(token),\n );\n\n paginatedQueries = changed.map((token) => ({\n token,\n modification: {\n kind: \"Updated\" as const,\n result: this.localQueryResultByToken(token),\n },\n }));\n }\n\n const extendedTransition: ExtendedTransition = {\n ...transition,\n paginatedQueries,\n };\n\n this.onTransition(extendedTransition);\n }\n\n /**\n * Load more items for a paginated query.\n *\n * This *always* causes a transition, the status of the query\n * has probably changed from \"CanLoadMore\" to \"LoadingMore\".\n * Data might have changed too: maybe a subscription to this page\n * query already exists (unlikely but possible) or this page query\n * has an optimistic update providing some initial data.\n *\n * @internal\n */\n private loadMoreOfPaginatedQuery(\n token: PaginatedQueryToken,\n numItems: number,\n ): boolean {\n this.mustGetPaginatedQuery(token);\n\n const lastPageToken = this.queryTokenForLastPageOfPaginatedQuery(token);\n const lastPageResult = this.client.localQueryResultByToken(lastPageToken);\n\n if (!lastPageResult) {\n // Still loading a page and concurrent loads are not allowed\n return false;\n }\n\n const paginationResult = asPaginationResult(lastPageResult);\n if (paginationResult.isDone) {\n // No more pages available\n return false;\n }\n\n this.addPageToPaginatedQuery(\n token,\n paginationResult.continueCursor,\n numItems,\n );\n\n const loadMoreTransition: ExtendedTransition = {\n timestamp: this.lastTransitionTs,\n reflectedMutations: [],\n queries: [],\n paginatedQueries: [\n {\n token,\n modification: {\n kind: \"Updated\" as const,\n result: this.localQueryResultByToken(token),\n },\n },\n ],\n };\n this.onTransition(loadMoreTransition);\n\n return true;\n }\n\n /**\n * @internal\n */\n private queriesContainingTokens(\n queryTokens: QueryToken[],\n ): PaginatedQueryToken[] {\n if (queryTokens.length === 0) {\n return [];\n }\n\n const changed: PaginatedQueryToken[] = [];\n const queryTokenSet = new Set(queryTokens);\n\n for (const [paginatedToken, paginatedQuery] of this.paginatedQuerySet) {\n for (const pageToken of this.allQueryTokens(paginatedQuery)) {\n if (queryTokenSet.has(pageToken)) {\n changed.push(paginatedToken);\n break;\n }\n }\n }\n\n return changed;\n }\n\n /**\n * @internal\n */\n private processPaginatedQuerySplits(\n changed: PaginatedQueryToken[],\n getResult: (token: QueryToken) => Value | undefined,\n ): void {\n for (const paginatedQueryToken of changed) {\n const paginatedQuery = this.mustGetPaginatedQuery(paginatedQueryToken);\n\n // These properties are all mutable, the destructure here is optional.\n const { ongoingSplits, pageKeyToQuery, pageKeys } = paginatedQuery;\n\n // Check for any completed splits\n for (const [pageKey, [splitKey1, splitKey2]] of ongoingSplits) {\n const bothNewPagesLoaded =\n getResult(pageKeyToQuery.get(splitKey1)!.queryToken) !== undefined &&\n getResult(pageKeyToQuery.get(splitKey2)!.queryToken) !== undefined;\n\n if (bothNewPagesLoaded) {\n this.completePaginatedQuerySplit(\n paginatedQuery,\n pageKey,\n splitKey1,\n splitKey2,\n );\n }\n }\n\n // Check each active page for splits needed\n for (const pageKey of pageKeys) {\n if (ongoingSplits.has(pageKey)) {\n continue; // Already splitting\n }\n\n const pageToken = pageKeyToQuery.get(pageKey)!.queryToken;\n const pageResult = getResult(pageToken);\n if (!pageResult) {\n continue;\n }\n const result = asPaginationResult(pageResult);\n\n // Check if this page needs splitting\n const shouldSplit =\n result.splitCursor &&\n (result.pageStatus === \"SplitRecommended\" ||\n result.pageStatus === \"SplitRequired\" ||\n // This client-driven page splitting condition will change in the future.\n result.page.length > paginatedQuery.options.initialNumItems * 2);\n\n if (shouldSplit) {\n this.splitPaginatedQueryPage(\n paginatedQuery,\n pageKey,\n result.splitCursor!, // we just checked\n result.continueCursor,\n );\n }\n }\n }\n }\n\n private splitPaginatedQueryPage(\n paginatedQuery: LocalPaginatedQuery,\n pageKey: QueryPageKey,\n splitCursor: string,\n continueCursor: string | null,\n ): void {\n const splitKey1 = paginatedQuery.nextPageKey++;\n const splitKey2 = paginatedQuery.nextPageKey++;\n\n const paginationOpts: Value = {\n cursor: continueCursor,\n numItems: paginatedQuery.options.initialNumItems,\n id: paginatedQuery.id,\n };\n\n // First split page: same cursor as original, but add endCursor at splitCursor\n const firstSubscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n {\n ...paginatedQuery.args,\n paginationOpts: {\n ...paginationOpts,\n cursor: null, // Start from beginning for first split\n endCursor: splitCursor,\n },\n },\n );\n paginatedQuery.pageKeyToQuery.set(splitKey1, firstSubscription);\n\n // Second split page: cursor starts at splitCursor, endCursor is the original continueCursor\n const secondSubscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n {\n ...paginatedQuery.args,\n paginationOpts: {\n ...paginationOpts,\n cursor: splitCursor,\n endCursor: continueCursor,\n },\n },\n );\n paginatedQuery.pageKeyToQuery.set(splitKey2, secondSubscription);\n\n paginatedQuery.ongoingSplits.set(pageKey, [splitKey1, splitKey2]);\n }\n\n /**\n * @internal\n */\n private addPageToPaginatedQuery(\n token: PaginatedQueryToken,\n continueCursor: string | null,\n numItems: number,\n ): { queryToken: QueryToken; unsubscribe: () => void } {\n const paginatedQuery = this.mustGetPaginatedQuery(token);\n const pageKey = paginatedQuery.nextPageKey++;\n\n const paginationOpts: Value = {\n cursor: continueCursor,\n numItems,\n id: paginatedQuery.id,\n };\n\n const pageArgs = {\n ...paginatedQuery.args,\n paginationOpts,\n };\n\n const subscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n pageArgs,\n );\n\n paginatedQuery.pageKeys.push(pageKey);\n paginatedQuery.pageKeyToQuery.set(pageKey, subscription);\n return subscription;\n }\n\n private removePaginatedQuerySubscriber(token: PaginatedQueryToken): void {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n return;\n }\n\n paginatedQuery.numSubscribers -= 1;\n if (paginatedQuery.numSubscribers > 0) {\n return;\n }\n\n // Remove all page subscriptions by calling their unsubscribe callbacks\n for (const subscription of paginatedQuery.pageKeyToQuery.values()) {\n subscription.unsubscribe();\n }\n\n this.paginatedQuerySet.delete(token);\n }\n\n private completePaginatedQuerySplit(\n paginatedQuery: LocalPaginatedQuery,\n pageKey: QueryPageKey,\n splitKey1: QueryPageKey,\n splitKey2: QueryPageKey,\n ): void {\n const originalQuery = paginatedQuery.pageKeyToQuery.get(pageKey)!;\n paginatedQuery.pageKeyToQuery.delete(pageKey);\n const pageIndex = paginatedQuery.pageKeys.indexOf(pageKey);\n paginatedQuery.pageKeys.splice(pageIndex, 1, splitKey1, splitKey2);\n paginatedQuery.ongoingSplits.delete(pageKey);\n originalQuery.unsubscribe();\n }\n\n /** The query tokens for all active pages, in result order */\n private activePageQueryTokens(\n paginatedQuery: LocalPaginatedQuery,\n ): QueryToken[] {\n return paginatedQuery.pageKeys.map(\n (pageKey) => paginatedQuery.pageKeyToQuery.get(pageKey)!.queryToken,\n );\n }\n\n private allQueryTokens(paginatedQuery: LocalPaginatedQuery): QueryToken[] {\n return Array.from(paginatedQuery.pageKeyToQuery.values()).map(\n (sub) => sub.queryToken,\n );\n }\n\n private queryTokenForLastPageOfPaginatedQuery(\n token: PaginatedQueryToken,\n ): QueryToken {\n const paginatedQuery = this.mustGetPaginatedQuery(token);\n const lastPageKey =\n paginatedQuery.pageKeys[paginatedQuery.pageKeys.length - 1];\n if (lastPageKey === undefined) {\n throw new Error(`No pages for paginated query ${token}`);\n }\n return paginatedQuery.pageKeyToQuery.get(lastPageKey)!.queryToken;\n }\n\n private mustGetPaginatedQuery(\n token: PaginatedQueryToken,\n ): LocalPaginatedQuery {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n throw new Error(\"paginated query no longer exists for token \" + token);\n }\n return paginatedQuery;\n }\n}\n"],
|
|
5
|
-
"mappings": "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
|
|
4
|
+
"sourcesContent": ["/**\n * PaginatedQueryClient maps subscriptions to paginated queries to the\n * individual page queries and handles page splits.\n *\n * In order to process all modified queries, paginated and normal, in the same\n * synchronous call the PaginatedQueryClient transition should be used exclusively.\n *\n * Like the BaseConvexClient, this client is not Convex Function type-aware: it deals\n * with queries as functions that return Value, not the specific value.\n * Use a higher-level library to get types.\n */\n\nimport { Value } from \"../../values/index.js\";\nimport {\n PaginatedQueryToken,\n QueryToken,\n serializePaginatedPathAndArgs,\n canonicalizeUdfPath,\n} from \"./udf_path_utils.js\";\nimport { BaseConvexClientInterface, Transition } from \"./client.js\";\nimport {\n PaginatedQueryResult,\n PaginationStatus,\n asPaginationResult,\n} from \"./pagination.js\";\nimport { TS } from \"./protocol.js\";\nimport { Long } from \"../../vendor/long.js\";\n\ntype QueryPageKey = number;\n\n/**\n * Represents a paginated query subscription with multiple pages.\n *\n * To know the order of pages it's necessary to consult `pageKeys`.\n * The pages in this array are active, they constitute a gapless sequence of results.\n * Some pages are not in this array: they may be waiting for data for a page split.\n */\ntype LocalPaginatedQuery = {\n token: PaginatedQueryToken;\n canonicalizedUdfPath: string;\n args: Record<string, Value>; // WITHOUT paginationOpts\n numSubscribers: number;\n options: { initialNumItems: number };\n nextPageKey: QueryPageKey;\n pageKeys: QueryPageKey[]; // These pages make up the active page queries.\n // Map page keys to their query subscriptions\n pageKeyToQuery: Map<\n QueryPageKey,\n { queryToken: QueryToken; unsubscribe: () => void; cursor: string | null }\n >;\n ongoingSplits: Map<QueryPageKey, [QueryPageKey, QueryPageKey]>;\n skip: boolean;\n\n // Give separate uses of the query separate identities,\n // which may be removed in the future to improve caching.\n id: number;\n};\n\nexport interface SubscribeToPaginatedQueryOptions {\n initialNumItems: number;\n id: number;\n}\n\ntype AnyPaginatedQueryResult = PaginatedQueryResult<Value>;\n\nexport type PaginatedQueryModification =\n | { kind: \"Updated\"; result: AnyPaginatedQueryResult | undefined }\n | { kind: \"Removed\" };\n\nexport type ExtendedTransition = Transition & {\n paginatedQueries: Array<{\n token: PaginatedQueryToken;\n modification: PaginatedQueryModification;\n }>;\n};\n\n/** @internal */\nexport class PaginatedQueryClient {\n private paginatedQuerySet: Map<PaginatedQueryToken, LocalPaginatedQuery> =\n new Map();\n // hold onto a real Transition so we can construct synthetic ones with that timestamp\n private lastTransitionTs: TS;\n\n constructor(\n private client: BaseConvexClientInterface,\n private onTransition: (transition: ExtendedTransition) => void,\n ) {\n // Nonsense initial value to construct synthetic Transitions\n this.lastTransitionTs = Long.fromNumber(0);\n this.client.addOnTransitionHandler((transition: Transition) =>\n this.onBaseTransition(transition),\n );\n }\n\n /**\n * Subscribe to a paginated query.\n *\n * @param name - The name of the paginated query function\n * @param args - Arguments for the query (excluding paginationOpts)\n * @param options - Pagination options including initialNumItems\n * @returns Object with paginatedQueryToken and unsubscribe function\n */\n subscribe(\n name: string,\n args: Record<string, Value>,\n options: SubscribeToPaginatedQueryOptions,\n ): {\n paginatedQueryToken: PaginatedQueryToken;\n unsubscribe: () => void;\n } {\n const canonicalizedUdfPath = canonicalizeUdfPath(name);\n // Note that only the expected options are included in the serialization.\n const token = serializePaginatedPathAndArgs(\n canonicalizedUdfPath,\n args,\n options,\n );\n\n const unsubscribe = () => this.removePaginatedQuerySubscriber(token);\n\n const existingEntry = this.paginatedQuerySet.get(token);\n if (existingEntry) {\n existingEntry.numSubscribers += 1;\n return {\n paginatedQueryToken: token,\n unsubscribe,\n };\n }\n\n // Create new paginated query\n this.paginatedQuerySet.set(token, {\n token,\n canonicalizedUdfPath,\n args,\n numSubscribers: 1,\n options: { initialNumItems: options.initialNumItems },\n nextPageKey: 0,\n pageKeys: [],\n pageKeyToQuery: new Map(),\n ongoingSplits: new Map(),\n skip: false,\n id: options.id,\n });\n\n this.addPageToPaginatedQuery(token, null, options.initialNumItems);\n\n return {\n paginatedQueryToken: token,\n unsubscribe,\n };\n }\n\n /**\n * Get current results for a paginated query based on local state.\n *\n * Throws an error when one of the pages has errored.\n */\n localQueryResult(\n name: string,\n args: Record<string, Value>,\n options: { initialNumItems: number; id: number },\n ): AnyPaginatedQueryResult | undefined {\n const canonicalizedUdfPath = canonicalizeUdfPath(name);\n const token = serializePaginatedPathAndArgs(\n canonicalizedUdfPath,\n args,\n options,\n );\n return this.localQueryResultByToken(token);\n }\n\n /**\n * @internal\n */\n localQueryResultByToken(\n token: PaginatedQueryToken,\n ): AnyPaginatedQueryResult | undefined {\n // undefined is probably the wrong value! Should be a real paginated query result for loading!\n // Butit's confusing why we'd ever get this, I guess some flows call localQueryResult before\n // subscribing? That's proabbly fair but is it consistent with the normal client?\n // What is the invariant here, will a token always exist? Or can a lookup occur at any time?\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n return undefined;\n }\n\n const activePages = this.activePageQueryTokens(paginatedQuery);\n if (activePages.length === 0) {\n return {\n results: [],\n status: \"LoadingFirstPage\",\n loadMore: (numItems: number) => {\n return this.loadMoreOfPaginatedQuery(token, numItems);\n },\n };\n }\n\n let allResults: Value[] = [];\n\n // Some page is loading (this isn't supposed to happen to any page but the last)\n let hasUndefined = false;\n let isDone = false;\n\n for (const pageToken of activePages) {\n // This throws, don't catch it, it should bubble up.\n // It might be a InvalidCursor Error. If it is, this query\n // should be reset (for now, use a new ID to ensure new state).\n //\n // In the future this might be caught and dealt with here but\n // an ID-based solution won't work here, ID is an intrinsic property\n // of this paginated query.\n const result = this.client.localQueryResultByToken(pageToken);\n\n if (result === undefined) {\n hasUndefined = true;\n isDone = false;\n continue;\n }\n\n const paginationResult = asPaginationResult(result);\n allResults = allResults.concat(paginationResult.page);\n // logic only relevant to the last page, we just happen to run it each time\n isDone = !!paginationResult.isDone;\n }\n\n let status: PaginationStatus;\n if (hasUndefined) {\n status = allResults.length === 0 ? \"LoadingFirstPage\" : \"LoadingMore\";\n } else if (isDone) {\n status = \"Exhausted\";\n } else {\n status = \"CanLoadMore\";\n }\n\n return {\n results: allResults,\n status,\n loadMore: (numItems: number) => {\n return this.loadMoreOfPaginatedQuery(token, numItems);\n },\n };\n }\n\n private onBaseTransition(transition: Transition) {\n const changedBaseTokens = transition.queries.map((q) => q.token);\n const changed = this.queriesContainingTokens(changedBaseTokens);\n\n let paginatedQueries: Array<{\n token: PaginatedQueryToken;\n modification: PaginatedQueryModification;\n }> = [];\n\n if (changed.length > 0) {\n this.processPaginatedQuerySplits(changed, (token) =>\n this.client.localQueryResultByToken(token),\n );\n\n paginatedQueries = changed.map((token) => ({\n token,\n modification: {\n kind: \"Updated\" as const,\n result: this.localQueryResultByToken(token),\n },\n }));\n }\n\n const extendedTransition: ExtendedTransition = {\n ...transition,\n paginatedQueries,\n };\n\n this.onTransition(extendedTransition);\n }\n\n /**\n * Load more items for a paginated query.\n *\n * This *always* causes a transition, the status of the query\n * has probably changed from \"CanLoadMore\" to \"LoadingMore\".\n * Data might have changed too: maybe a subscription to this page\n * query already exists (unlikely but possible) or this page query\n * has an optimistic update providing some initial data.\n *\n * @internal\n */\n private loadMoreOfPaginatedQuery(\n token: PaginatedQueryToken,\n numItems: number,\n ): boolean {\n this.mustGetPaginatedQuery(token);\n\n const lastPageToken = this.queryTokenForLastPageOfPaginatedQuery(token);\n const lastPageResult = this.client.localQueryResultByToken(lastPageToken);\n\n if (!lastPageResult) {\n // Still loading a page and concurrent loads are not allowed\n return false;\n }\n\n const paginationResult = asPaginationResult(lastPageResult);\n if (paginationResult.isDone) {\n // No more pages available\n return false;\n }\n\n this.addPageToPaginatedQuery(\n token,\n paginationResult.continueCursor,\n numItems,\n );\n\n const loadMoreTransition: ExtendedTransition = {\n timestamp: this.lastTransitionTs,\n reflectedMutations: [],\n queries: [],\n paginatedQueries: [\n {\n token,\n modification: {\n kind: \"Updated\" as const,\n result: this.localQueryResultByToken(token),\n },\n },\n ],\n };\n this.onTransition(loadMoreTransition);\n\n return true;\n }\n\n /**\n * @internal\n */\n private queriesContainingTokens(\n queryTokens: QueryToken[],\n ): PaginatedQueryToken[] {\n if (queryTokens.length === 0) {\n return [];\n }\n\n const changed: PaginatedQueryToken[] = [];\n const queryTokenSet = new Set(queryTokens);\n\n for (const [paginatedToken, paginatedQuery] of this.paginatedQuerySet) {\n for (const pageToken of this.allQueryTokens(paginatedQuery)) {\n if (queryTokenSet.has(pageToken)) {\n changed.push(paginatedToken);\n break;\n }\n }\n }\n\n return changed;\n }\n\n /**\n * @internal\n */\n private processPaginatedQuerySplits(\n changed: PaginatedQueryToken[],\n getResult: (token: QueryToken) => Value | undefined,\n ): void {\n for (const paginatedQueryToken of changed) {\n const paginatedQuery = this.mustGetPaginatedQuery(paginatedQueryToken);\n\n // These properties are all mutable, the destructure here is optional.\n const { ongoingSplits, pageKeyToQuery, pageKeys } = paginatedQuery;\n\n // Check for any completed splits\n for (const [pageKey, [splitKey1, splitKey2]] of ongoingSplits) {\n const bothNewPagesLoaded =\n getResult(pageKeyToQuery.get(splitKey1)!.queryToken) !== undefined &&\n getResult(pageKeyToQuery.get(splitKey2)!.queryToken) !== undefined;\n\n if (bothNewPagesLoaded) {\n this.completePaginatedQuerySplit(\n paginatedQuery,\n pageKey,\n splitKey1,\n splitKey2,\n );\n }\n }\n\n // Check each active page for splits needed\n for (const pageKey of pageKeys) {\n if (ongoingSplits.has(pageKey)) {\n continue; // Already splitting\n }\n\n const pageEntry = pageKeyToQuery.get(pageKey);\n if (!pageEntry) {\n throw new Error(`No page query for active pageKey ${pageKey}`);\n }\n const pageResult = getResult(pageEntry.queryToken);\n if (!pageResult) {\n continue;\n }\n const result = asPaginationResult(pageResult);\n\n // Check if this page needs splitting\n const shouldSplit =\n result.splitCursor &&\n (result.pageStatus === \"SplitRecommended\" ||\n result.pageStatus === \"SplitRequired\" ||\n // This client-driven page splitting condition will change in the future.\n result.page.length > paginatedQuery.options.initialNumItems * 2);\n\n if (shouldSplit) {\n this.splitPaginatedQueryPage(\n paginatedQuery,\n pageKey,\n pageEntry.cursor,\n result.splitCursor!, // we just checked\n result.continueCursor,\n );\n }\n }\n }\n }\n\n private splitPaginatedQueryPage(\n paginatedQuery: LocalPaginatedQuery,\n pageKey: QueryPageKey,\n // Where the page being split started.\n startCursor: string | null,\n // The split position - will be end of the first split page and the start\n // of the second.\n splitCursor: string,\n // Where the page being split ended.\n continueCursor: string | null,\n ): void {\n const splitKey1 = paginatedQuery.nextPageKey++;\n const splitKey2 = paginatedQuery.nextPageKey++;\n\n const paginationOpts: Value = {\n numItems: paginatedQuery.options.initialNumItems,\n id: paginatedQuery.id,\n };\n\n // First split page: same cursor as the original page, ending at splitCursor\n const firstSubscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n {\n ...paginatedQuery.args,\n paginationOpts: {\n ...paginationOpts,\n cursor: startCursor,\n endCursor: splitCursor,\n },\n },\n );\n paginatedQuery.pageKeyToQuery.set(splitKey1, {\n ...firstSubscription,\n cursor: startCursor,\n });\n\n // Second split page: cursor starts at splitCursor, endCursor is the original continueCursor\n const secondSubscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n {\n ...paginatedQuery.args,\n paginationOpts: {\n ...paginationOpts,\n cursor: splitCursor,\n endCursor: continueCursor,\n },\n },\n );\n paginatedQuery.pageKeyToQuery.set(splitKey2, {\n ...secondSubscription,\n cursor: splitCursor,\n });\n\n paginatedQuery.ongoingSplits.set(pageKey, [splitKey1, splitKey2]);\n }\n\n /**\n * @internal\n */\n private addPageToPaginatedQuery(\n token: PaginatedQueryToken,\n continueCursor: string | null,\n numItems: number,\n ): { queryToken: QueryToken; unsubscribe: () => void } {\n const paginatedQuery = this.mustGetPaginatedQuery(token);\n const pageKey = paginatedQuery.nextPageKey++;\n\n const paginationOpts: Value = {\n cursor: continueCursor,\n numItems,\n id: paginatedQuery.id,\n };\n\n const pageArgs = {\n ...paginatedQuery.args,\n paginationOpts,\n };\n\n const subscription = this.client.subscribe(\n paginatedQuery.canonicalizedUdfPath,\n pageArgs,\n );\n\n paginatedQuery.pageKeys.push(pageKey);\n paginatedQuery.pageKeyToQuery.set(pageKey, {\n ...subscription,\n cursor: continueCursor,\n });\n return subscription;\n }\n\n private removePaginatedQuerySubscriber(token: PaginatedQueryToken): void {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n return;\n }\n\n paginatedQuery.numSubscribers -= 1;\n if (paginatedQuery.numSubscribers > 0) {\n return;\n }\n\n // Remove all page subscriptions by calling their unsubscribe callbacks\n for (const subscription of paginatedQuery.pageKeyToQuery.values()) {\n subscription.unsubscribe();\n }\n\n this.paginatedQuerySet.delete(token);\n }\n\n private completePaginatedQuerySplit(\n paginatedQuery: LocalPaginatedQuery,\n pageKey: QueryPageKey,\n splitKey1: QueryPageKey,\n splitKey2: QueryPageKey,\n ): void {\n const originalQuery = paginatedQuery.pageKeyToQuery.get(pageKey)!;\n paginatedQuery.pageKeyToQuery.delete(pageKey);\n const pageIndex = paginatedQuery.pageKeys.indexOf(pageKey);\n paginatedQuery.pageKeys.splice(pageIndex, 1, splitKey1, splitKey2);\n paginatedQuery.ongoingSplits.delete(pageKey);\n originalQuery.unsubscribe();\n }\n\n /** The query tokens for all active pages, in result order */\n private activePageQueryTokens(\n paginatedQuery: LocalPaginatedQuery,\n ): QueryToken[] {\n return paginatedQuery.pageKeys.map(\n (pageKey) => paginatedQuery.pageKeyToQuery.get(pageKey)!.queryToken,\n );\n }\n\n private allQueryTokens(paginatedQuery: LocalPaginatedQuery): QueryToken[] {\n return Array.from(paginatedQuery.pageKeyToQuery.values()).map(\n (sub) => sub.queryToken,\n );\n }\n\n private queryTokenForLastPageOfPaginatedQuery(\n token: PaginatedQueryToken,\n ): QueryToken {\n const paginatedQuery = this.mustGetPaginatedQuery(token);\n const lastPageKey =\n paginatedQuery.pageKeys[paginatedQuery.pageKeys.length - 1];\n if (lastPageKey === undefined) {\n throw new Error(`No pages for paginated query ${token}`);\n }\n return paginatedQuery.pageKeyToQuery.get(lastPageKey)!.queryToken;\n }\n\n private mustGetPaginatedQuery(\n token: PaginatedQueryToken,\n ): LocalPaginatedQuery {\n const paginatedQuery = this.paginatedQuerySet.get(token);\n if (!paginatedQuery) {\n throw new Error(\"paginated query no longer exists for token \" + token);\n }\n return paginatedQuery;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -36,6 +36,8 @@ function validatorToType(validator, useIdType) {
|
|
|
36
36
|
return "number";
|
|
37
37
|
} else if (validator.type === "bigint") {
|
|
38
38
|
return "bigint";
|
|
39
|
+
} else if (validator.type === "commitTs") {
|
|
40
|
+
return 'bigint | import("convex/values").CommitTsPlaceholder';
|
|
39
41
|
} else if (validator.type === "boolean") {
|
|
40
42
|
return "boolean";
|
|
41
43
|
} 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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAoC;AAG7B,SAAS,eACd,WACwB;AACxB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,SAAS;AAC7B;AAEO,SAAS,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,kBAAc,4BAAa,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;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAoC;AAG7B,SAAS,eACd,WACwB;AACxB,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,MAAM,SAAS;AAC7B;AAEO,SAAS,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,kBAAc,4BAAa,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
|
}
|
|
@@ -25,5 +25,6 @@ var import_extra_typings = require("@commander-js/extra-typings");
|
|
|
25
25
|
var import_deploymentSelect = require("./deploymentSelect.js");
|
|
26
26
|
var import_deploymentCreate = require("./deploymentCreate.js");
|
|
27
27
|
var import_deploymentToken = require("./deploymentToken.js");
|
|
28
|
-
|
|
28
|
+
var import_usageLimits = require("./usageLimits.js");
|
|
29
|
+
const deployment = new import_extra_typings.Command("deployment").summary("Manage deployments").description("Manage deployments in your project.").addCommand(import_deploymentSelect.deploymentSelect).addCommand(import_deploymentCreate.deploymentCreate).addCommand(import_deploymentToken.deploymentToken).addCommand(import_usageLimits.usage).addCommand(import_usageLimits.usageLimits);
|
|
29
30
|
//# 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;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAwB;AACxB,8BAAiC;AACjC,8BAAiC;AACjC,6BAAgC;
|
|
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;AAAA;AAAA;AAAA;AAAA;AAAA,2BAAwB;AACxB,8BAAiC;AACjC,8BAAiC;AACjC,6BAAgC;AAChC,yBAAmC;AAE5B,MAAM,aAAa,IAAI,6BAAQ,YAAY,EAC/C,QAAQ,oBAAoB,EAC5B,YAAY,qCAAqC,EACjD,WAAW,wCAAgB,EAC3B,WAAW,wCAAgB,EAC3B,WAAW,sCAAe,EAC1B,WAAW,wBAAK,EAChB,WAAW,8BAAW;",
|
|
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": ["import_utils", "team"]
|
|
7
7
|
}
|