alchemy-convex 0.0.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.
Files changed (43) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +244 -0
  3. package/dist/AuthProvider.d.ts +35 -0
  4. package/dist/AuthProvider.d.ts.map +1 -0
  5. package/dist/AuthProvider.js +127 -0
  6. package/dist/AuthProvider.js.map +1 -0
  7. package/dist/Credentials.d.ts +13 -0
  8. package/dist/Credentials.d.ts.map +1 -0
  9. package/dist/Credentials.js +23 -0
  10. package/dist/Credentials.js.map +1 -0
  11. package/dist/Deployment.d.ts +45 -0
  12. package/dist/Deployment.d.ts.map +1 -0
  13. package/dist/Deployment.js +175 -0
  14. package/dist/Deployment.js.map +1 -0
  15. package/dist/ManagementApi.d.ts +108 -0
  16. package/dist/ManagementApi.d.ts.map +1 -0
  17. package/dist/ManagementApi.js +312 -0
  18. package/dist/ManagementApi.js.map +1 -0
  19. package/dist/OAuthClient.d.ts +38 -0
  20. package/dist/OAuthClient.d.ts.map +1 -0
  21. package/dist/OAuthClient.js +154 -0
  22. package/dist/OAuthClient.js.map +1 -0
  23. package/dist/Project.d.ts +34 -0
  24. package/dist/Project.d.ts.map +1 -0
  25. package/dist/Project.js +75 -0
  26. package/dist/Project.js.map +1 -0
  27. package/dist/ProjectHash.d.ts +25 -0
  28. package/dist/ProjectHash.d.ts.map +1 -0
  29. package/dist/ProjectHash.js +59 -0
  30. package/dist/ProjectHash.js.map +1 -0
  31. package/dist/Providers.d.ts +15 -0
  32. package/dist/Providers.d.ts.map +1 -0
  33. package/dist/Providers.js +24 -0
  34. package/dist/Providers.js.map +1 -0
  35. package/dist/Runtime.d.ts +61 -0
  36. package/dist/Runtime.d.ts.map +1 -0
  37. package/dist/Runtime.js +208 -0
  38. package/dist/Runtime.js.map +1 -0
  39. package/dist/index.d.ts +10 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +10 -0
  42. package/dist/index.js.map +1 -0
  43. package/package.json +55 -0
@@ -0,0 +1,175 @@
1
+ import { Platform, havePropsChanged, isResolved, } from "alchemy";
2
+ import { Unowned } from "alchemy/AdoptPolicy";
3
+ import * as Provider from "alchemy/Provider";
4
+ import * as Effect from "effect/Effect";
5
+ import { ConvexManagementApi } from "./ManagementApi.js";
6
+ import { hashProject } from "./ProjectHash.js";
7
+ import { ConvexCli, createConvexRuntimeContext, } from "./Runtime.js";
8
+ export const DeploymentTypeId = "Convex.Deployment";
9
+ /** A production, development, or preview deployment within a Convex project. */
10
+ export const Deployment = Platform(DeploymentTypeId, {
11
+ createRuntimeContext: (id) => createConvexRuntimeContext(DeploymentTypeId, id),
12
+ });
13
+ const resolveReference = (reference) => {
14
+ const resolved = reference ?? "production";
15
+ if (resolved === "production") {
16
+ return { reference: resolved, managementType: "prod", kind: "production" };
17
+ }
18
+ if (/^dev\/[a-z0-9][a-z0-9/-]*$/.test(resolved) && resolved.length <= 100) {
19
+ return { reference: resolved, managementType: "dev", kind: "development" };
20
+ }
21
+ if (/^preview\/[a-z0-9][a-z0-9/-]*$/.test(resolved) &&
22
+ resolved.length <= 100) {
23
+ return { reference: resolved, managementType: "preview", kind: "preview" };
24
+ }
25
+ throw new Error('Convex deployment reference must be "production", "dev/<name>", or "preview/<name>".');
26
+ };
27
+ const expirationTimestamp = (expiresAt) => {
28
+ if (expiresAt === undefined)
29
+ return undefined;
30
+ const timestamp = typeof expiresAt === "number" ? expiresAt : new Date(expiresAt).getTime();
31
+ if (!Number.isFinite(timestamp)) {
32
+ throw new Error("Convex deployment expiresAt must be a valid date.");
33
+ }
34
+ return timestamp;
35
+ };
36
+ const projectAttributes = (project) => project;
37
+ export const DeploymentProvider = () => Provider.effect(Deployment, Effect.gen(function* () {
38
+ const cli = yield* ConvexCli;
39
+ const management = yield* ConvexManagementApi;
40
+ return {
41
+ version: 2,
42
+ nuke: { skip: true },
43
+ list: () => Effect.succeed([]),
44
+ read: Effect.fn(function* ({ olds, output }) {
45
+ if (!isResolved(olds))
46
+ return undefined;
47
+ const project = projectAttributes(olds.project);
48
+ if (project?.projectId === undefined)
49
+ return undefined;
50
+ const target = resolveReference(olds.reference);
51
+ const deployment = yield* management.findDeployment({
52
+ projectId: project.projectId,
53
+ type: target.managementType,
54
+ ...(target.managementType === "prod"
55
+ ? project.defaultProductionDeploymentName.length === 0
56
+ ? {}
57
+ : {
58
+ defaultProductionDeploymentName: project.defaultProductionDeploymentName,
59
+ }
60
+ : { reference: target.reference }),
61
+ });
62
+ if (deployment === undefined)
63
+ return undefined;
64
+ // The default production deployment is created with its parent
65
+ // project. With no Deployment state yet, route through reconcile so
66
+ // the local Convex code and environment are still pushed.
67
+ if (target.managementType === "prod" && output === undefined) {
68
+ return undefined;
69
+ }
70
+ const attributes = {
71
+ projectId: deployment.projectId,
72
+ deploymentId: deployment.deploymentId,
73
+ name: deployment.name,
74
+ reference: target.reference,
75
+ type: target.kind,
76
+ isDefault: deployment.isDefault,
77
+ url: deployment.url,
78
+ httpActionsUrl: `https://${deployment.name}.convex.site`,
79
+ expiresAt: deployment.expiresAt,
80
+ sourceHash: output?.sourceHash ?? "",
81
+ environmentKeys: output?.environmentKeys ?? [],
82
+ };
83
+ if (target.managementType === "prod" ||
84
+ output?.deploymentId === deployment.deploymentId) {
85
+ return attributes;
86
+ }
87
+ return Unowned(attributes);
88
+ }),
89
+ diff: Effect.fn(function* ({ olds, news, output }) {
90
+ if (!output || !isResolved(news) || !isResolved(olds)) {
91
+ return undefined;
92
+ }
93
+ const oldProject = projectAttributes(olds.project);
94
+ const newProject = projectAttributes(news.project);
95
+ if (oldProject.projectId !== newProject.projectId ||
96
+ resolveReference(olds.reference).reference !==
97
+ resolveReference(news.reference).reference) {
98
+ return { action: "replace" };
99
+ }
100
+ if (news.alwaysDeploy || havePropsChanged(olds, news)) {
101
+ return { action: "update" };
102
+ }
103
+ const sourceHash = yield* hashProject(newProject.dir, newProject.source);
104
+ return {
105
+ action: sourceHash === output.sourceHash ? "noop" : "update",
106
+ };
107
+ }),
108
+ reconcile: Effect.fn(function* ({ news, output, session }) {
109
+ const project = projectAttributes(news.project);
110
+ const target = resolveReference(news.reference);
111
+ if (news.expiresAt !== undefined && target.kind !== "preview") {
112
+ throw new Error("Convex deployment expiresAt is only supported for preview references.");
113
+ }
114
+ const expiresAt = expirationTimestamp(news.expiresAt);
115
+ const environment = news.env ?? {};
116
+ const sourceHash = yield* hashProject(project.dir, project.source);
117
+ const deployment = yield* management.ensureDeployment({
118
+ projectId: project.projectId,
119
+ ...(output?.name === undefined ? {} : { name: output.name }),
120
+ type: target.managementType,
121
+ ...(target.managementType === "prod"
122
+ ? project.defaultProductionDeploymentName.length === 0
123
+ ? {}
124
+ : {
125
+ defaultProductionDeploymentName: project.defaultProductionDeploymentName,
126
+ }
127
+ : { reference: target.reference }),
128
+ ...(expiresAt === undefined ? {} : { expiresAt }),
129
+ });
130
+ if (deployment.createdDeployment) {
131
+ yield* session.note(`Created Convex ${target.kind} deployment ${deployment.name}.`);
132
+ }
133
+ const lease = yield* management.leaseDeploymentKey({
134
+ deploymentName: deployment.name,
135
+ });
136
+ const result = yield* cli
137
+ .deploy({
138
+ projectDir: project.dir,
139
+ deployKey: lease.deployKey,
140
+ environment,
141
+ previousEnvironmentKeys: output?.name === deployment.name
142
+ ? output.environmentKeys
143
+ : [],
144
+ typecheck: news.typecheck ?? "try",
145
+ codegen: news.codegen ?? true,
146
+ ...(news.message === undefined ? {} : { message: news.message }),
147
+ })
148
+ .pipe(Effect.ensuring(lease.release.pipe(Effect.catch((error) => session.note(`Warning: failed to revoke temporary Convex deploy key (${error.message}). It will expire automatically.`)))));
149
+ for (const line of `${result.stdout}\n${result.stderr}`
150
+ .split("\n")
151
+ .map((outputLine) => outputLine.trim())
152
+ .filter(Boolean)) {
153
+ yield* session.note(line);
154
+ }
155
+ return {
156
+ projectId: project.projectId,
157
+ deploymentId: deployment.deploymentId,
158
+ name: deployment.name,
159
+ reference: target.reference,
160
+ type: target.kind,
161
+ isDefault: deployment.isDefault,
162
+ url: result.url,
163
+ httpActionsUrl: result.httpActionsUrl,
164
+ expiresAt: deployment.expiresAt,
165
+ sourceHash,
166
+ environmentKeys: Object.keys(environment).sort(),
167
+ };
168
+ }),
169
+ delete: Effect.fn(function* ({ output, session }) {
170
+ yield* management.deleteDeployment(output.name);
171
+ yield* session.note(`Deleted Convex deployment ${output.name}.`);
172
+ }),
173
+ };
174
+ }));
175
+ //# sourceMappingURL=Deployment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Deployment.js","sourceRoot":"","sources":["../src/Deployment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,108 @@
1
+ import * as Context from "effect/Context";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import * as Redacted from "effect/Redacted";
5
+ import { Credentials } from "./Credentials.js";
6
+ export interface DeploymentKeyLease {
7
+ readonly deployKey: Redacted.Redacted<string>;
8
+ /** Revokes access-token leases. OAuth leases reuse the OAuth grant. */
9
+ readonly release: Effect.Effect<void, ConvexManagementApiError>;
10
+ }
11
+ export interface LeaseDeploymentKeyInput {
12
+ readonly deploymentName: string;
13
+ readonly keyName?: string;
14
+ }
15
+ export interface EnsureProjectInput {
16
+ readonly projectId?: number;
17
+ /** Internal ownership state retained across reconciliations. */
18
+ readonly managedProject?: boolean;
19
+ readonly name: string;
20
+ }
21
+ export interface FindProjectInput {
22
+ readonly name: string;
23
+ }
24
+ export interface ProjectMetadata {
25
+ readonly projectId: number;
26
+ readonly name: string;
27
+ readonly slug: string;
28
+ readonly teamId: number;
29
+ readonly teamSlug: string;
30
+ readonly defaultProductionDeploymentName: string | null;
31
+ }
32
+ export interface EnsuredProject {
33
+ readonly projectId: number;
34
+ readonly name: string;
35
+ readonly slug: string;
36
+ readonly teamId: number;
37
+ readonly teamSlug: string;
38
+ readonly defaultProductionDeploymentName: string;
39
+ readonly createdProject: boolean;
40
+ readonly createdDeployment: boolean;
41
+ readonly managedProject: boolean;
42
+ }
43
+ export type ManagementDeploymentType = "prod" | "dev" | "preview";
44
+ export interface EnsureDeploymentInput {
45
+ readonly projectId: number;
46
+ readonly name?: string;
47
+ readonly type: ManagementDeploymentType;
48
+ readonly reference?: string;
49
+ readonly defaultProductionDeploymentName?: string;
50
+ readonly expiresAt?: number;
51
+ }
52
+ export interface FindDeploymentInput {
53
+ readonly projectId: number;
54
+ readonly type: ManagementDeploymentType;
55
+ readonly reference?: string;
56
+ readonly defaultProductionDeploymentName?: string;
57
+ }
58
+ export interface DeploymentMetadata {
59
+ readonly deploymentId: number;
60
+ readonly projectId: number;
61
+ readonly name: string;
62
+ readonly type: ManagementDeploymentType;
63
+ readonly reference: string;
64
+ readonly isDefault: boolean;
65
+ readonly url: string;
66
+ readonly expiresAt: number | null;
67
+ }
68
+ export interface EnsuredDeployment {
69
+ readonly deploymentId: number;
70
+ readonly projectId: number;
71
+ readonly name: string;
72
+ readonly type: ManagementDeploymentType;
73
+ readonly reference: string;
74
+ readonly isDefault: boolean;
75
+ readonly url: string;
76
+ readonly expiresAt: number | null;
77
+ readonly createdDeployment: boolean;
78
+ readonly managedDeployment: boolean;
79
+ }
80
+ export interface ConvexManagementApiOptions {
81
+ readonly apiBaseUrl?: string;
82
+ /** Temporary access-token deploy keys expire even if cleanup cannot run. */
83
+ readonly deployKeyTtlMs?: number;
84
+ }
85
+ declare const ConvexManagementApiError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
86
+ readonly _tag: "ConvexManagementApiError";
87
+ } & Readonly<A>;
88
+ export declare class ConvexManagementApiError extends ConvexManagementApiError_base<{
89
+ readonly operation: string;
90
+ readonly message: string;
91
+ readonly status?: number;
92
+ readonly cause?: unknown;
93
+ }> {
94
+ }
95
+ declare const ConvexManagementApi_base: Context.ServiceClass<ConvexManagementApi, "alchemy-convex/ConvexManagementApi", {
96
+ readonly findProject: (input: FindProjectInput) => Effect.Effect<ProjectMetadata | undefined, ConvexManagementApiError>;
97
+ readonly ensureProject: (input: EnsureProjectInput) => Effect.Effect<EnsuredProject, ConvexManagementApiError>;
98
+ readonly ensureDeployment: (input: EnsureDeploymentInput) => Effect.Effect<EnsuredDeployment, ConvexManagementApiError>;
99
+ readonly findDeployment: (input: FindDeploymentInput) => Effect.Effect<DeploymentMetadata | undefined, ConvexManagementApiError>;
100
+ readonly deleteProject: (projectId: number) => Effect.Effect<void, ConvexManagementApiError>;
101
+ readonly deleteDeployment: (deploymentName: string) => Effect.Effect<void, ConvexManagementApiError>;
102
+ readonly leaseDeploymentKey: (input: LeaseDeploymentKeyInput) => Effect.Effect<DeploymentKeyLease, ConvexManagementApiError>;
103
+ }>;
104
+ export declare class ConvexManagementApi extends ConvexManagementApi_base {
105
+ }
106
+ export declare const ConvexManagementApiLive: (options?: ConvexManagementApiOptions) => Layer.Layer<ConvexManagementApi, never, Credentials>;
107
+ export {};
108
+ //# sourceMappingURL=ManagementApi.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManagementApi.d.ts","sourceRoot":"","sources":["../src/ManagementApi.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,312 @@
1
+ import * as Context from "effect/Context";
2
+ import * as Data from "effect/Data";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Layer from "effect/Layer";
5
+ import * as Redacted from "effect/Redacted";
6
+ import { randomUUID } from "node:crypto";
7
+ import { Credentials } from "./Credentials.js";
8
+ /**
9
+ * Preview creation accepts the identifier without its `preview/` namespace,
10
+ * but deployment reads return the fully-qualified reference. Dev references
11
+ * are accepted by the API exactly as supplied.
12
+ */
13
+ const deploymentCreateReference = (type, reference) => type === "preview" && reference.startsWith("preview/")
14
+ ? reference.slice("preview/".length)
15
+ : reference;
16
+ const toProjectMetadata = (project) => ({
17
+ projectId: project.id,
18
+ name: project.name,
19
+ slug: project.slug,
20
+ teamId: project.teamId,
21
+ teamSlug: project.teamSlug,
22
+ defaultProductionDeploymentName: project.prodDeploymentName,
23
+ });
24
+ const toDeploymentMetadata = (deployment) => ({
25
+ deploymentId: deployment.id,
26
+ projectId: deployment.projectId,
27
+ name: deployment.name,
28
+ type: deployment.deploymentType,
29
+ reference: deployment.reference,
30
+ isDefault: deployment.isDefault,
31
+ url: deployment.deploymentUrl,
32
+ expiresAt: deployment.expiresAt,
33
+ });
34
+ const ignoreNotFound = (effect) => effect.pipe(Effect.catchTag("ConvexManagementApiError", (error) => error.status === 404 ? Effect.succeed(undefined) : Effect.fail(error)));
35
+ export class ConvexManagementApiError extends Data.TaggedError("ConvexManagementApiError") {
36
+ }
37
+ export class ConvexManagementApi extends Context.Service()("alchemy-convex/ConvexManagementApi") {
38
+ }
39
+ const responseMessage = async (response) => {
40
+ const text = await response.text();
41
+ if (text.length === 0)
42
+ return `HTTP ${response.status}`;
43
+ try {
44
+ const payload = JSON.parse(text);
45
+ if (typeof payload.message === "string")
46
+ return payload.message;
47
+ if (typeof payload.error === "string")
48
+ return payload.error;
49
+ }
50
+ catch {
51
+ // The response is not JSON; return its text below.
52
+ }
53
+ return text;
54
+ };
55
+ export const ConvexManagementApiLive = (options = {}) => Layer.effect(ConvexManagementApi, Effect.gen(function* () {
56
+ const credentials = yield* Credentials;
57
+ const apiBaseUrl = (options.apiBaseUrl ?? "https://api.convex.dev/v1").replace(/\/$/, "");
58
+ const ttlMs = Math.max(options.deployKeyTtlMs ?? 60 * 60 * 1000, 30 * 60 * 1000 + 1_000);
59
+ const request = (operation, accessToken, method, path, body) => Effect.tryPromise({
60
+ try: async () => {
61
+ const response = await fetch(`${apiBaseUrl}${path}`, {
62
+ method,
63
+ headers: {
64
+ Accept: "application/json",
65
+ Authorization: `Bearer ${Redacted.value(accessToken)}`,
66
+ "Content-Type": "application/json",
67
+ },
68
+ ...(body === undefined ? {} : { body: JSON.stringify(body) }),
69
+ });
70
+ if (!response.ok) {
71
+ throw new ConvexManagementApiError({
72
+ operation,
73
+ message: await responseMessage(response),
74
+ status: response.status,
75
+ });
76
+ }
77
+ if (response.status === 204)
78
+ return undefined;
79
+ const text = await response.text();
80
+ return (text.length === 0 ? undefined : JSON.parse(text));
81
+ },
82
+ catch: (cause) => cause instanceof ConvexManagementApiError
83
+ ? cause
84
+ : new ConvexManagementApiError({
85
+ operation,
86
+ message: `Convex Management API request failed: ${String(cause)}`,
87
+ cause,
88
+ }),
89
+ });
90
+ const getTokenDetails = (accessToken) => request("get token details", accessToken, "GET", "/token_details");
91
+ return ConvexManagementApi.of({
92
+ findProject: (input) => Effect.gen(function* () {
93
+ const resolved = yield* credentials;
94
+ const tokenDetails = yield* getTokenDetails(resolved.accessToken);
95
+ let projectId;
96
+ if (tokenDetails.type === "projectToken") {
97
+ projectId = tokenDetails.projectId;
98
+ }
99
+ else {
100
+ const projects = yield* request("list projects", resolved.accessToken, "GET", `/teams/${encodeURIComponent(String(tokenDetails.teamId))}/projects?limit=100&q=${encodeURIComponent(input.name)}`);
101
+ projectId = projects.items.find((project) => project.name === input.name || project.slug === input.name)?.id;
102
+ }
103
+ if (projectId === undefined)
104
+ return undefined;
105
+ const project = yield* ignoreNotFound(request("get project", resolved.accessToken, "GET", `/projects/${encodeURIComponent(String(projectId))}`));
106
+ return project === undefined
107
+ ? undefined
108
+ : toProjectMetadata(project);
109
+ }),
110
+ ensureProject: (input) => Effect.gen(function* () {
111
+ const resolved = yield* credentials;
112
+ const tokenDetails = yield* getTokenDetails(resolved.accessToken);
113
+ let projectId = input.projectId;
114
+ let createdProject = false;
115
+ let managedProject = input.managedProject ?? false;
116
+ let createdDeploymentName;
117
+ if (projectId === undefined &&
118
+ tokenDetails.type === "projectToken") {
119
+ projectId = tokenDetails.projectId;
120
+ }
121
+ if (projectId === undefined) {
122
+ managedProject = true;
123
+ const inferredTeamId = tokenDetails.type === "teamToken"
124
+ ? tokenDetails.teamId
125
+ : undefined;
126
+ const teamId = inferredTeamId;
127
+ if (teamId === undefined) {
128
+ return yield* new ConvexManagementApiError({
129
+ operation: "ensure project",
130
+ message: "A team-scoped access token or explicit teamId is required to create a Convex project.",
131
+ });
132
+ }
133
+ const projects = yield* request("list projects", resolved.accessToken, "GET", `/teams/${encodeURIComponent(String(teamId))}/projects?limit=100&q=${encodeURIComponent(input.name)}`);
134
+ const existing = projects.items.find((project) => project.name === input.name || project.slug === input.name);
135
+ if (existing !== undefined) {
136
+ projectId = existing.id;
137
+ }
138
+ else {
139
+ const created = yield* request("create project", resolved.accessToken, "POST", `/teams/${encodeURIComponent(String(teamId))}/create_project`, { projectName: input.name, deploymentType: "prod" });
140
+ projectId = created.id;
141
+ createdDeploymentName = created.deploymentName ?? undefined;
142
+ createdProject = true;
143
+ }
144
+ }
145
+ let project = yield* request("get project", resolved.accessToken, "GET", `/projects/${encodeURIComponent(String(projectId))}`);
146
+ if (managedProject && project.name !== input.name) {
147
+ project = yield* request("rename project", resolved.accessToken, "PATCH", `/projects/${encodeURIComponent(String(project.id))}`, { name: input.name });
148
+ }
149
+ let deploymentName = project.prodDeploymentName ?? createdDeploymentName;
150
+ let createdDeployment = createdDeploymentName !== undefined;
151
+ if (deploymentName === undefined) {
152
+ const deployment = yield* request("create production deployment", resolved.accessToken, "POST", `/projects/${encodeURIComponent(String(project.id))}/create_deployment`, { type: "prod", isDefault: true });
153
+ deploymentName = deployment.name;
154
+ createdDeployment = true;
155
+ }
156
+ return {
157
+ projectId: project.id,
158
+ name: project.name,
159
+ slug: project.slug,
160
+ teamId: project.teamId,
161
+ teamSlug: project.teamSlug,
162
+ defaultProductionDeploymentName: deploymentName,
163
+ createdProject,
164
+ createdDeployment,
165
+ managedProject,
166
+ };
167
+ }),
168
+ findDeployment: (input) => Effect.gen(function* () {
169
+ const resolved = yield* credentials;
170
+ let deployment;
171
+ if (input.type === "prod" &&
172
+ input.defaultProductionDeploymentName !== undefined) {
173
+ deployment = yield* ignoreNotFound(request("get deployment", resolved.accessToken, "GET", `/deployments/${encodeURIComponent(input.defaultProductionDeploymentName)}`));
174
+ }
175
+ else {
176
+ const deployments = yield* request("list deployments", resolved.accessToken, "GET", `/projects/${encodeURIComponent(String(input.projectId))}/list_deployments?deploymentType=${encodeURIComponent(input.type)}`);
177
+ deployment =
178
+ input.type === "prod"
179
+ ? deployments.find((candidate) => candidate.isDefault)
180
+ : deployments.find((candidate) => candidate.reference === input.reference);
181
+ }
182
+ if (deployment === undefined ||
183
+ deployment.projectId !== input.projectId) {
184
+ return undefined;
185
+ }
186
+ return toDeploymentMetadata(deployment);
187
+ }),
188
+ ensureDeployment: (input) => Effect.gen(function* () {
189
+ const resolved = yield* credentials;
190
+ const getDeployment = (name) => request("get deployment", resolved.accessToken, "GET", `/deployments/${encodeURIComponent(name)}`);
191
+ let deployment;
192
+ let createdDeployment = false;
193
+ let managedDeployment = false;
194
+ const cleanupFailedCreate = (candidate) => createdDeployment
195
+ ? ignoreNotFound(request("clean up invalid deployment", resolved.accessToken, "POST", `/deployments/${encodeURIComponent(candidate.name)}/delete`)).pipe(Effect.asVoid)
196
+ : Effect.void;
197
+ if (input.name !== undefined) {
198
+ deployment = yield* getDeployment(input.name);
199
+ }
200
+ else if (input.type === "prod" &&
201
+ input.defaultProductionDeploymentName !== undefined) {
202
+ deployment = yield* getDeployment(input.defaultProductionDeploymentName);
203
+ }
204
+ else {
205
+ if (input.reference === undefined) {
206
+ return yield* new ConvexManagementApiError({
207
+ operation: "ensure deployment",
208
+ message: `A reference is required to create a ${input.type} deployment.`,
209
+ });
210
+ }
211
+ managedDeployment = true;
212
+ const deployments = yield* request("list deployments", resolved.accessToken, "GET", `/projects/${encodeURIComponent(String(input.projectId))}/list_deployments?deploymentType=${encodeURIComponent(input.type)}`);
213
+ const existing = deployments.find((candidate) => candidate.reference === input.reference);
214
+ if (existing !== undefined) {
215
+ return yield* new ConvexManagementApiError({
216
+ operation: "ensure deployment",
217
+ message: `Convex deployment ${existing.name} already exists for reference ${input.reference}. ` +
218
+ "Adopt it explicitly with --adopt or adopt().",
219
+ });
220
+ }
221
+ else {
222
+ deployment = yield* request("create deployment", resolved.accessToken, "POST", `/projects/${encodeURIComponent(String(input.projectId))}/create_deployment`, {
223
+ type: input.type,
224
+ reference: deploymentCreateReference(input.type, input.reference),
225
+ ...(input.type === "dev" ? { isDefault: false } : {}),
226
+ ...(input.expiresAt === undefined
227
+ ? {}
228
+ : { expiresAt: input.expiresAt }),
229
+ });
230
+ createdDeployment = true;
231
+ }
232
+ }
233
+ if (deployment.projectId !== input.projectId) {
234
+ yield* cleanupFailedCreate(deployment);
235
+ return yield* new ConvexManagementApiError({
236
+ operation: "ensure deployment",
237
+ message: `Convex deployment ${deployment.name} belongs to project ${deployment.projectId}, not project ${input.projectId}.`,
238
+ });
239
+ }
240
+ if (deployment.deploymentType !== input.type) {
241
+ yield* cleanupFailedCreate(deployment);
242
+ return yield* new ConvexManagementApiError({
243
+ operation: "ensure deployment",
244
+ message: `Convex deployment ${deployment.name} has type ${deployment.deploymentType}, not ${input.type}.`,
245
+ });
246
+ }
247
+ if (input.reference !== undefined &&
248
+ deployment.reference !== input.reference) {
249
+ yield* cleanupFailedCreate(deployment);
250
+ return yield* new ConvexManagementApiError({
251
+ operation: "ensure deployment",
252
+ message: `Convex deployment ${deployment.name} has reference ${deployment.reference}, not ${input.reference}.`,
253
+ });
254
+ }
255
+ if (input.expiresAt !== undefined &&
256
+ deployment.expiresAt !== input.expiresAt) {
257
+ deployment = yield* request("update deployment expiration", resolved.accessToken, "PATCH", `/deployments/${encodeURIComponent(deployment.name)}`, { expiresAt: input.expiresAt });
258
+ }
259
+ return {
260
+ deploymentId: deployment.id,
261
+ projectId: deployment.projectId,
262
+ name: deployment.name,
263
+ type: deployment.deploymentType,
264
+ reference: deployment.reference,
265
+ isDefault: deployment.isDefault,
266
+ url: deployment.deploymentUrl,
267
+ expiresAt: deployment.expiresAt,
268
+ createdDeployment,
269
+ managedDeployment,
270
+ };
271
+ }),
272
+ deleteProject: (projectId) => Effect.gen(function* () {
273
+ const resolved = yield* credentials;
274
+ yield* ignoreNotFound(request("delete project", resolved.accessToken, "POST", `/projects/${encodeURIComponent(String(projectId))}/delete`));
275
+ }),
276
+ deleteDeployment: (deploymentName) => Effect.gen(function* () {
277
+ const resolved = yield* credentials;
278
+ yield* ignoreNotFound(request("delete deployment", resolved.accessToken, "POST", `/deployments/${encodeURIComponent(deploymentName)}/delete`));
279
+ }),
280
+ leaseDeploymentKey: (input) => Effect.gen(function* () {
281
+ const resolved = yield* credentials;
282
+ const deploymentName = encodeURIComponent(input.deploymentName);
283
+ const keyName = input.keyName ??
284
+ `alchemy-${Date.now()}-${randomUUID().slice(0, 8)}`;
285
+ const response = yield* request("create deploy key", resolved.accessToken, "POST", `/deployments/${deploymentName}/create_deploy_key`, {
286
+ name: keyName,
287
+ ...(resolved.type === "accessToken"
288
+ ? {
289
+ allowedActions: [
290
+ "deployment:deploy",
291
+ "deployment:env:view",
292
+ "deployment:env:write",
293
+ ],
294
+ expiresAt: Date.now() + ttlMs,
295
+ }
296
+ : {}),
297
+ });
298
+ if (typeof response.deployKey !== "string") {
299
+ return yield* new ConvexManagementApiError({
300
+ operation: "create deploy key",
301
+ message: "Convex Management API response did not include deployKey.",
302
+ });
303
+ }
304
+ const deployKey = Redacted.make(response.deployKey);
305
+ const release = resolved.type === "oauth"
306
+ ? Effect.void
307
+ : request("delete deploy key", resolved.accessToken, "POST", `/deployments/${deploymentName}/delete_deploy_key`, { id: response.deployKey });
308
+ return { deployKey, release };
309
+ }),
310
+ });
311
+ }));
312
+ //# sourceMappingURL=ManagementApi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ManagementApi.js","sourceRoot":"","sources":["../src/ManagementApi.ts"],"names":[],"mappings":"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"}