@prisma/compute-cli 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/README.md +118 -0
  2. package/bin/compute +4 -0
  3. package/bin/compute-bun +4 -0
  4. package/dist/cli.d.ts +4 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +28 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/commands/deploy.d.ts +56 -0
  9. package/dist/commands/deploy.d.ts.map +1 -0
  10. package/dist/commands/deploy.js +106 -0
  11. package/dist/commands/deploy.js.map +1 -0
  12. package/dist/commands/env.d.ts +2 -0
  13. package/dist/commands/env.d.ts.map +1 -0
  14. package/dist/commands/env.js +84 -0
  15. package/dist/commands/env.js.map +1 -0
  16. package/dist/commands/helpers.d.ts +27 -0
  17. package/dist/commands/helpers.d.ts.map +1 -0
  18. package/dist/commands/helpers.js +128 -0
  19. package/dist/commands/helpers.js.map +1 -0
  20. package/dist/commands/login.d.ts +2 -0
  21. package/dist/commands/login.d.ts.map +1 -0
  22. package/dist/commands/login.js +17 -0
  23. package/dist/commands/login.js.map +1 -0
  24. package/dist/commands/logout.d.ts +2 -0
  25. package/dist/commands/logout.d.ts.map +1 -0
  26. package/dist/commands/logout.js +17 -0
  27. package/dist/commands/logout.js.map +1 -0
  28. package/dist/commands/projects.d.ts +2 -0
  29. package/dist/commands/projects.d.ts.map +1 -0
  30. package/dist/commands/projects.js +43 -0
  31. package/dist/commands/projects.js.map +1 -0
  32. package/dist/commands/services.d.ts +2 -0
  33. package/dist/commands/services.d.ts.map +1 -0
  34. package/dist/commands/services.js +318 -0
  35. package/dist/commands/services.js.map +1 -0
  36. package/dist/commands/versions.d.ts +2 -0
  37. package/dist/commands/versions.d.ts.map +1 -0
  38. package/dist/commands/versions.js +321 -0
  39. package/dist/commands/versions.js.map +1 -0
  40. package/dist/index.d.ts +3 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +3 -0
  43. package/dist/index.js.map +1 -0
  44. package/dist/lib/auth/client.d.ts +7 -0
  45. package/dist/lib/auth/client.d.ts.map +1 -0
  46. package/dist/lib/auth/client.js +26 -0
  47. package/dist/lib/auth/client.js.map +1 -0
  48. package/dist/lib/auth/guard.d.ts +12 -0
  49. package/dist/lib/auth/guard.d.ts.map +1 -0
  50. package/dist/lib/auth/guard.js +39 -0
  51. package/dist/lib/auth/guard.js.map +1 -0
  52. package/dist/lib/auth/login.d.ts +15 -0
  53. package/dist/lib/auth/login.d.ts.map +1 -0
  54. package/dist/lib/auth/login.js +128 -0
  55. package/dist/lib/auth/login.js.map +1 -0
  56. package/dist/lib/auth/token-storage.d.ts +9 -0
  57. package/dist/lib/auth/token-storage.d.ts.map +1 -0
  58. package/dist/lib/auth/token-storage.js +55 -0
  59. package/dist/lib/auth/token-storage.js.map +1 -0
  60. package/dist/lib/compute-config.d.ts +12 -0
  61. package/dist/lib/compute-config.d.ts.map +1 -0
  62. package/dist/lib/compute-config.js +69 -0
  63. package/dist/lib/compute-config.js.map +1 -0
  64. package/dist/lib/format.d.ts +2 -0
  65. package/dist/lib/format.d.ts.map +1 -0
  66. package/dist/lib/format.js +11 -0
  67. package/dist/lib/format.js.map +1 -0
  68. package/dist/lib/interaction.d.ts +17 -0
  69. package/dist/lib/interaction.d.ts.map +1 -0
  70. package/dist/lib/interaction.js +131 -0
  71. package/dist/lib/interaction.js.map +1 -0
  72. package/dist/lib/json-output.d.ts +3 -0
  73. package/dist/lib/json-output.d.ts.map +1 -0
  74. package/dist/lib/json-output.js +9 -0
  75. package/dist/lib/json-output.js.map +1 -0
  76. package/dist/lib/progress.d.ts +6 -0
  77. package/dist/lib/progress.d.ts.map +1 -0
  78. package/dist/lib/progress.js +156 -0
  79. package/dist/lib/progress.js.map +1 -0
  80. package/package.json +45 -0
  81. package/src/cli.ts +30 -0
  82. package/src/commands/deploy.ts +127 -0
  83. package/src/commands/env.ts +104 -0
  84. package/src/commands/helpers.ts +153 -0
  85. package/src/commands/login.ts +18 -0
  86. package/src/commands/logout.ts +18 -0
  87. package/src/commands/projects.ts +54 -0
  88. package/src/commands/services.ts +385 -0
  89. package/src/commands/versions.ts +389 -0
  90. package/src/index.ts +2 -0
  91. package/src/lib/auth/client.ts +39 -0
  92. package/src/lib/auth/guard.ts +51 -0
  93. package/src/lib/auth/login.ts +175 -0
  94. package/src/lib/auth/token-storage.ts +73 -0
  95. package/src/lib/compute-config.ts +95 -0
  96. package/src/lib/format.ts +16 -0
  97. package/src/lib/interaction.ts +166 -0
  98. package/src/lib/json-output.ts +9 -0
  99. package/src/lib/progress.ts +172 -0
@@ -0,0 +1,55 @@
1
+ import { CredentialsStore } from "@prisma/credentials-store";
2
+ import { getAuthFilePath } from "./client.js";
3
+ export class FileTokenStorage {
4
+ credentialsStore;
5
+ constructor() {
6
+ this.credentialsStore = new CredentialsStore(getAuthFilePath());
7
+ }
8
+ async getTokens() {
9
+ try {
10
+ const allCredentials = await this.credentialsStore.getCredentials();
11
+ return findLatestValidTokens(allCredentials);
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ async setTokens(tokens) {
18
+ await this.credentialsStore.storeCredentials({
19
+ workspaceId: tokens.workspaceId,
20
+ token: tokens.accessToken,
21
+ refreshToken: tokens.refreshToken,
22
+ });
23
+ }
24
+ async clearTokens() {
25
+ const allCredentials = await this.credentialsStore.getCredentials();
26
+ const tokens = findLatestValidTokens(allCredentials);
27
+ if (!tokens) {
28
+ return;
29
+ }
30
+ await this.credentialsStore.deleteCredentials(tokens.workspaceId);
31
+ }
32
+ }
33
+ function findLatestValidTokens(allCredentials) {
34
+ for (let i = allCredentials.length - 1; i >= 0; i -= 1) {
35
+ const credential = allCredentials[i];
36
+ if (!credential) {
37
+ continue;
38
+ }
39
+ if (typeof credential.workspaceId !== "string" ||
40
+ credential.workspaceId.length === 0 ||
41
+ typeof credential.token !== "string" ||
42
+ credential.token.length === 0 ||
43
+ typeof credential.refreshToken !== "string" ||
44
+ credential.refreshToken.length === 0) {
45
+ continue;
46
+ }
47
+ return {
48
+ workspaceId: credential.workspaceId,
49
+ accessToken: credential.token,
50
+ refreshToken: credential.refreshToken,
51
+ };
52
+ }
53
+ return null;
54
+ }
55
+ //# sourceMappingURL=token-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-storage.js","sourceRoot":"","sources":["../../../src/lib/auth/token-storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,OAAO,gBAAgB;IACnB,gBAAgB,CAAmB;IAE3C;QACE,IAAI,CAAC,gBAAgB,GAAG,IAAI,gBAAgB,CAAC,eAAe,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,SAAS;QACb,IAAI,CAAC;YACH,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;YACpE,OAAO,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAAc;QAC5B,MAAM,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CAAC;YAC3C,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,KAAK,EAAE,MAAM,CAAC,WAAW;YACzB,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACf,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,cAAc,EAAE,CAAC;QACpE,MAAM,MAAM,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO;QACT,CAAC;QACD,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACpE,CAAC;CACF;AAQD,SAAS,qBAAqB,CAC5B,cAAkC;IAElC,KAAK,IAAI,CAAC,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACvD,MAAM,UAAU,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,IACE,OAAO,UAAU,CAAC,WAAW,KAAK,QAAQ;YAC1C,UAAU,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;YACnC,OAAO,UAAU,CAAC,KAAK,KAAK,QAAQ;YACpC,UAAU,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;YAC7B,OAAO,UAAU,CAAC,YAAY,KAAK,QAAQ;YAC3C,UAAU,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EACpC,CAAC;YACD,SAAS;QACX,CAAC;QAED,OAAO;YACL,WAAW,EAAE,UAAU,CAAC,WAAW;YACnC,WAAW,EAAE,UAAU,CAAC,KAAK;YAC7B,YAAY,EAAE,UAAU,CAAC,YAAY;SACtC,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { PortMapping } from "@prisma/compute-sdk";
2
+ export declare const COMPUTE_CONFIG_FILENAME = "compute.config.json";
3
+ export type ComputeConfig = {
4
+ projectId: string;
5
+ serviceId: string;
6
+ serviceName?: string;
7
+ region?: string;
8
+ portMapping?: PortMapping;
9
+ };
10
+ export declare function readComputeConfig(filePath: string): Promise<ComputeConfig | null>;
11
+ export declare function writeComputeConfig(filePath: string, config: ComputeConfig): Promise<void>;
12
+ //# sourceMappingURL=compute-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-config.d.ts","sourceRoot":"","sources":["../../src/lib/compute-config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGvD,eAAO,MAAM,uBAAuB,wBAAwB,CAAC;AAgB7D,MAAM,MAAM,aAAa,GAAG;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAU/B;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,69 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { readFile, rename, rm, writeFile } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { z } from "zod";
5
+ export const COMPUTE_CONFIG_FILENAME = "compute.config.json";
6
+ const computePortMappingSchema = z
7
+ .object({
8
+ http: z.union([z.number().int().min(1).max(65_535), z.null()]).optional(),
9
+ })
10
+ .strict();
11
+ const computeConfigSchema = z.object({
12
+ projectId: z.string().min(1),
13
+ serviceId: z.string().min(1),
14
+ serviceName: z.string().min(1).optional(),
15
+ region: z.string().min(1).optional(),
16
+ portMapping: computePortMappingSchema.optional(),
17
+ });
18
+ export async function readComputeConfig(filePath) {
19
+ try {
20
+ const raw = await readFile(filePath, "utf8");
21
+ return parseComputeConfig(raw, filePath);
22
+ }
23
+ catch (error) {
24
+ if (isNotFoundError(error)) {
25
+ return null;
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+ export async function writeComputeConfig(filePath, config) {
31
+ const payload = {
32
+ projectId: config.projectId,
33
+ serviceId: config.serviceId,
34
+ serviceName: config.serviceName,
35
+ region: config.region,
36
+ portMapping: config.portMapping,
37
+ };
38
+ const serialized = `${JSON.stringify(payload, null, 2)}\n`;
39
+ const tempPath = path.join(path.dirname(filePath), `.compute.config.${randomUUID()}.tmp`);
40
+ try {
41
+ await writeFile(tempPath, serialized, "utf8");
42
+ await rename(tempPath, filePath);
43
+ }
44
+ catch (error) {
45
+ await rm(tempPath, { force: true }).catch(() => { });
46
+ throw error;
47
+ }
48
+ }
49
+ function parseComputeConfig(raw, filePath) {
50
+ let parsed;
51
+ try {
52
+ parsed = JSON.parse(raw);
53
+ }
54
+ catch {
55
+ throw new Error(`Invalid JSON in ${filePath}`);
56
+ }
57
+ const result = computeConfigSchema.safeParse(parsed);
58
+ if (!result.success) {
59
+ throw new Error(`Invalid config in ${filePath}: ${result.error.message}`);
60
+ }
61
+ return result.data;
62
+ }
63
+ function isNotFoundError(error) {
64
+ return (typeof error === "object" &&
65
+ error !== null &&
66
+ "code" in error &&
67
+ error.code === "ENOENT");
68
+ }
69
+ //# sourceMappingURL=compute-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compute-config.js","sourceRoot":"","sources":["../../src/lib/compute-config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function formatTable(headers: string[], rows: string[][]): string;
2
+ //# sourceMappingURL=format.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,CAevE"}
@@ -0,0 +1,11 @@
1
+ export function formatTable(headers, rows) {
2
+ const widths = headers.map((h, i) => Math.max(h.length, ...rows.map((r) => (r[i] ?? "").length)));
3
+ // biome-ignore lint/style/noNonNullAssertion: `widths` has the same length as `headers`
4
+ const header = headers.map((h, i) => h.padEnd(widths[i])).join(" ");
5
+ const separator = widths.map((w) => "-".repeat(w)).join(" ");
6
+ const body = rows
7
+ .map((row) => widths.map((width, i) => (row[i] ?? "").padEnd(width)).join(" "))
8
+ .join("\n");
9
+ return `${header}\n${separator}\n${body}`;
10
+ }
11
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/lib/format.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,WAAW,CAAC,OAAiB,EAAE,IAAgB;IAC7D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAClC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAC5D,CAAC;IAEF,wFAAwF;IACxF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,IAAI;SACd,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACX,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAClE;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO,GAAG,MAAM,KAAK,SAAS,KAAK,IAAI,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { DeployInteraction, DestroyVersionInteraction } from "@prisma/compute-sdk";
2
+ export declare class PromptCancelledError extends Error {
3
+ constructor();
4
+ }
5
+ export declare function isPromptCancelled(error: unknown): boolean;
6
+ export declare function isInteractiveSession(): boolean;
7
+ /**
8
+ * Create DeployInteraction callbacks backed by @clack/prompts.
9
+ * Returns undefined if the session is not interactive (e.g. --json mode).
10
+ */
11
+ export declare function createDeployInteraction(): DeployInteraction | undefined;
12
+ /**
13
+ * Create DestroyVersionInteraction callbacks backed by @clack/prompts.
14
+ */
15
+ export declare function createDestroyVersionInteraction(): DestroyVersionInteraction | undefined;
16
+ export declare function promptForConfirmation(message: string): Promise<boolean>;
17
+ //# sourceMappingURL=interaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.d.ts","sourceRoot":"","sources":["../../src/lib/interaction.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,yBAAyB,EAK1B,MAAM,qBAAqB,CAAC;AAE7B,qBAAa,oBAAqB,SAAQ,KAAK;;CAK9C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEzD;AAUD,wBAAgB,oBAAoB,IAAI,OAAO,CAE9C;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,GAAG,SAAS,CAqFvE;AAED;;GAEG;AACH,wBAAgB,+BAA+B,IAC3C,yBAAyB,GACzB,SAAS,CA4BZ;AAED,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAM7E"}
@@ -0,0 +1,131 @@
1
+ import { cancel, confirm, isCancel, log, select, text } from "@clack/prompts";
2
+ export class PromptCancelledError extends Error {
3
+ constructor() {
4
+ super("Operation cancelled");
5
+ this.name = "PromptCancelledError";
6
+ }
7
+ }
8
+ export function isPromptCancelled(error) {
9
+ return error instanceof PromptCancelledError;
10
+ }
11
+ function readPromptValue(value) {
12
+ if (isCancel(value)) {
13
+ cancel("Operation cancelled.");
14
+ throw new PromptCancelledError();
15
+ }
16
+ return value;
17
+ }
18
+ export function isInteractiveSession() {
19
+ return Boolean(process.stdout.isTTY && process.stdin.isTTY);
20
+ }
21
+ /**
22
+ * Create DeployInteraction callbacks backed by @clack/prompts.
23
+ * Returns undefined if the session is not interactive (e.g. --json mode).
24
+ */
25
+ export function createDeployInteraction() {
26
+ if (!isInteractiveSession())
27
+ return undefined;
28
+ return {
29
+ async selectProject(projects) {
30
+ if (projects.length === 0) {
31
+ throw new Error("No projects found in your workspace.");
32
+ }
33
+ const sorted = [...projects].sort((a, b) => `${a.name}|${a.id}`.localeCompare(`${b.name}|${b.id}`));
34
+ if (sorted.length === 1) {
35
+ // biome-ignore lint/style/noNonNullAssertion: length check guarantees element exists
36
+ const project = sorted[0];
37
+ log.info(`Using project: ${project.name} (${project.id})`);
38
+ return project.id;
39
+ }
40
+ const selection = await select({
41
+ message: "Select a project",
42
+ options: sorted.map((p) => ({
43
+ value: p.id,
44
+ label: p.name,
45
+ hint: p.id,
46
+ })),
47
+ });
48
+ return readPromptValue(selection);
49
+ },
50
+ async selectService(services) {
51
+ const sorted = [...services].sort((a, b) => `${a.name}|${a.id}`.localeCompare(`${b.name}|${b.id}`));
52
+ const options = [
53
+ ...sorted.map((s) => ({
54
+ value: s.id,
55
+ label: s.name || s.id,
56
+ hint: s.region ? `${s.id} · ${s.region}` : s.id,
57
+ })),
58
+ {
59
+ value: null,
60
+ label: "Create a new service",
61
+ hint: undefined,
62
+ },
63
+ ];
64
+ const selection = await select({
65
+ message: "Select a compute service",
66
+ options,
67
+ });
68
+ return readPromptValue(selection);
69
+ },
70
+ async provideServiceName() {
71
+ const rawName = await text({
72
+ message: "Service name",
73
+ placeholder: "my-compute-service",
74
+ validate: (value) => {
75
+ if (!value || value.trim().length === 0) {
76
+ return "Service name is required";
77
+ }
78
+ return undefined;
79
+ },
80
+ });
81
+ return readPromptValue(rawName).trim();
82
+ },
83
+ async selectRegion(regions) {
84
+ const selection = await select({
85
+ message: "Select a region",
86
+ options: regions.map((r) => ({
87
+ value: r.id,
88
+ label: r.displayName,
89
+ })),
90
+ });
91
+ return readPromptValue(selection);
92
+ },
93
+ };
94
+ }
95
+ /**
96
+ * Create DestroyVersionInteraction callbacks backed by @clack/prompts.
97
+ */
98
+ export function createDestroyVersionInteraction() {
99
+ if (!isInteractiveSession())
100
+ return undefined;
101
+ return {
102
+ async selectVersion(versions) {
103
+ if (versions.length === 0) {
104
+ throw new Error("No versions found.");
105
+ }
106
+ if (versions.length === 1) {
107
+ // biome-ignore lint/style/noNonNullAssertion: length check guarantees element exists
108
+ const version = versions[0];
109
+ log.info(`Using version: ${version.id}`);
110
+ return version.id;
111
+ }
112
+ const selection = await select({
113
+ message: "Select a version to destroy",
114
+ options: versions.map((v) => ({
115
+ value: v.id,
116
+ label: v.id,
117
+ hint: [v.status, v.createdAt].filter(Boolean).join(" · "),
118
+ })),
119
+ });
120
+ return readPromptValue(selection);
121
+ },
122
+ };
123
+ }
124
+ export async function promptForConfirmation(message) {
125
+ const selection = await confirm({
126
+ message,
127
+ initialValue: false,
128
+ });
129
+ return readPromptValue(selection);
130
+ }
131
+ //# sourceMappingURL=interaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interaction.js","sourceRoot":"","sources":["../../src/lib/interaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Result } from "@prisma/compute-sdk";
2
+ export declare function printJsonResult<T, E>(result: Result<T, E>): void;
3
+ //# sourceMappingURL=json-output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.d.ts","sourceRoot":"","sources":["../../src/lib/json-output.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAElD,wBAAgB,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAMhE"}
@@ -0,0 +1,9 @@
1
+ export function printJsonResult(result) {
2
+ if (result.isOk()) {
3
+ console.log(JSON.stringify({ ok: true, data: result.value }, null, 2));
4
+ }
5
+ else {
6
+ console.log(JSON.stringify({ ok: false, error: result.error }, null, 2));
7
+ }
8
+ }
9
+ //# sourceMappingURL=json-output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-output.js","sourceRoot":"","sources":["../../src/lib/json-output.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAO,MAAoB;IACxD,IAAI,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC3E,CAAC;AACH,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { DeployProgress, DestroyServiceProgress, DestroyVersionProgress, UpdateEnvProgress } from "@prisma/compute-sdk";
2
+ export declare function createDeployProgress(): DeployProgress;
3
+ export declare function createUpdateEnvProgress(): UpdateEnvProgress;
4
+ export declare function createDestroyVersionProgress(): DestroyVersionProgress;
5
+ export declare function createDestroyServiceProgress(): DestroyServiceProgress;
6
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,sBAAsB,EACtB,sBAAsB,EACtB,iBAAiB,EAClB,MAAM,qBAAqB,CAAC;AA2B7B,wBAAgB,oBAAoB,IAAI,cAAc,CA6CrD;AAED,wBAAgB,uBAAuB,IAAI,iBAAiB,CAoB3D;AAED,wBAAgB,4BAA4B,IAAI,sBAAsB,CAkBrE;AAED,wBAAgB,4BAA4B,IAAI,sBAAsB,CA8BrE"}
@@ -0,0 +1,156 @@
1
+ import { spinner } from "@clack/prompts";
2
+ import { isInteractiveSession } from "./interaction.js";
3
+ function createTaskSpinner() {
4
+ if (isInteractiveSession()) {
5
+ return spinner();
6
+ }
7
+ return {
8
+ start(_message) { },
9
+ stop(message) {
10
+ if (message)
11
+ console.log(message);
12
+ },
13
+ cancel(message) {
14
+ if (message)
15
+ console.error(message);
16
+ },
17
+ error(message) {
18
+ if (message)
19
+ console.error(message);
20
+ },
21
+ message(message) {
22
+ if (message)
23
+ console.log(message);
24
+ },
25
+ clear() { },
26
+ isCancelled: false,
27
+ };
28
+ }
29
+ export function createDeployProgress() {
30
+ let currentSpinner = null;
31
+ return {
32
+ onBuildStart() {
33
+ currentSpinner = createTaskSpinner();
34
+ currentSpinner.start("Building application bundle...");
35
+ },
36
+ onBuildComplete() {
37
+ currentSpinner?.stop("Bundle complete.");
38
+ currentSpinner = null;
39
+ },
40
+ onArchiveCreating() {
41
+ currentSpinner = createTaskSpinner();
42
+ currentSpinner.start("Creating deployment artifact...");
43
+ },
44
+ onArchiveReady() {
45
+ currentSpinner?.stop("Artifact ready.");
46
+ currentSpinner = null;
47
+ },
48
+ onVersionCreated(versionId) {
49
+ currentSpinner = createTaskSpinner();
50
+ currentSpinner.start(`Created version ${versionId}. Uploading artifact...`);
51
+ },
52
+ onUploadStart() {
53
+ // Already spinning from onVersionCreated
54
+ },
55
+ onUploadComplete() {
56
+ currentSpinner?.stop("Artifact uploaded.");
57
+ currentSpinner = null;
58
+ },
59
+ onStartRequested() {
60
+ currentSpinner = createTaskSpinner();
61
+ currentSpinner.start("Starting version...");
62
+ },
63
+ onStatusChange(status) {
64
+ printStatus(status);
65
+ },
66
+ onRunning() {
67
+ currentSpinner?.stop("Version is running.");
68
+ currentSpinner = null;
69
+ },
70
+ };
71
+ }
72
+ export function createUpdateEnvProgress() {
73
+ let currentSpinner = null;
74
+ return {
75
+ onVersionCreated(versionId) {
76
+ currentSpinner?.stop(`Created version ${versionId}.`);
77
+ currentSpinner = null;
78
+ },
79
+ onStartRequested() {
80
+ currentSpinner = createTaskSpinner();
81
+ currentSpinner.start("Starting version...");
82
+ },
83
+ onStatusChange(status) {
84
+ printStatus(status);
85
+ },
86
+ onRunning() {
87
+ currentSpinner?.stop("Version is running.");
88
+ currentSpinner = null;
89
+ },
90
+ };
91
+ }
92
+ export function createDestroyVersionProgress() {
93
+ let currentSpinner = null;
94
+ return {
95
+ onStopRequested() {
96
+ currentSpinner = createTaskSpinner();
97
+ currentSpinner.start("Stopping version...");
98
+ },
99
+ onStopped() {
100
+ currentSpinner?.stop("Version stopped.");
101
+ currentSpinner = null;
102
+ },
103
+ onDeleted(versionId) {
104
+ currentSpinner = createTaskSpinner();
105
+ currentSpinner.stop(`Deleted version ${versionId}.`);
106
+ currentSpinner = null;
107
+ },
108
+ };
109
+ }
110
+ export function createDestroyServiceProgress() {
111
+ let currentSpinner = null;
112
+ return {
113
+ onStoppingVersions(versionIds) {
114
+ currentSpinner = createTaskSpinner();
115
+ currentSpinner.start(`Stopping ${versionIds.length} active version(s)...`);
116
+ },
117
+ onVersionStopped() { },
118
+ onAllVersionsStopped() {
119
+ currentSpinner?.stop("All active versions stopped.");
120
+ currentSpinner = null;
121
+ },
122
+ onDeletingVersions(versionIds) {
123
+ currentSpinner = createTaskSpinner();
124
+ currentSpinner.start(`Deleting ${versionIds.length} version(s)...`);
125
+ },
126
+ onVersionDeleted(versionId) {
127
+ currentSpinner?.message(`Deleted version ${versionId}`);
128
+ },
129
+ onAllVersionsDeleted() {
130
+ currentSpinner?.stop("All versions deleted.");
131
+ currentSpinner = null;
132
+ },
133
+ onServiceDeleted() {
134
+ createTaskSpinner().stop("Service deleted.");
135
+ },
136
+ };
137
+ }
138
+ function printStatus(status) {
139
+ const line = `Status: ${status}`;
140
+ if (status === "failed") {
141
+ console.error(colorize(line, "red"));
142
+ return;
143
+ }
144
+ if (status === "running") {
145
+ console.log(colorize(line, "green"));
146
+ return;
147
+ }
148
+ console.log(line);
149
+ }
150
+ function colorize(input, color) {
151
+ if (!process.stdout.isTTY)
152
+ return input;
153
+ const code = color === "green" ? 32 : 31;
154
+ return `\x1b[${code}m${input}\x1b[0m`;
155
+ }
156
+ //# sourceMappingURL=progress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.js","sourceRoot":"","sources":["../../src/lib/progress.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "@prisma/compute-cli",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "bin": {
6
+ "compute": "./bin/compute"
7
+ },
8
+ "exports": {
9
+ ".": {
10
+ "bun": "./src/index.ts",
11
+ "import": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ }
15
+ }
16
+ },
17
+ "main": "./dist/index.js",
18
+ "types": "./dist/index.d.ts",
19
+ "files": [
20
+ "bin",
21
+ "dist",
22
+ "src"
23
+ ],
24
+ "scripts": {
25
+ "build": "tsc --project tsconfig.build.json",
26
+ "prepublishOnly": "npm run build",
27
+ "dev": "bun run bin/compute",
28
+ "test": "bun test",
29
+ "check:types": "tsc --noEmit"
30
+ },
31
+ "dependencies": {
32
+ "@clack/prompts": "^1.1.0",
33
+ "@prisma/compute-sdk": "0.2.0",
34
+ "@prisma/credentials-store": "^7.5.0",
35
+ "@prisma/management-api-sdk": "^1.23.0",
36
+ "citty": "^0.2.1",
37
+ "open": "^11.0.0",
38
+ "openapi-fetch": "0.17.0",
39
+ "zod": "^4.3.6"
40
+ },
41
+ "devDependencies": {
42
+ "@types/bun": "latest",
43
+ "typescript": "^6.0.2"
44
+ }
45
+ }
package/src/cli.ts ADDED
@@ -0,0 +1,30 @@
1
+ import { defineCommand, runMain } from "citty";
2
+ import { deployCommand } from "./commands/deploy.ts";
3
+ import { envGroup } from "./commands/env.ts";
4
+ import { loginCommand } from "./commands/login.ts";
5
+ import { logoutCommand } from "./commands/logout.ts";
6
+ import { projectsGroup } from "./commands/projects.ts";
7
+ import { servicesGroup } from "./commands/services.ts";
8
+ import { versionsGroup } from "./commands/versions.ts";
9
+
10
+ export { parseEnvAssignments, parseEnvFromArgs } from "./commands/helpers.ts";
11
+
12
+ export const mainCommand = defineCommand({
13
+ meta: {
14
+ name: "compute",
15
+ description: "Prisma Compute CLI",
16
+ },
17
+ subCommands: {
18
+ login: loginCommand,
19
+ logout: logoutCommand,
20
+ deploy: deployCommand,
21
+ env: envGroup,
22
+ projects: projectsGroup,
23
+ services: servicesGroup,
24
+ versions: versionsGroup,
25
+ },
26
+ });
27
+
28
+ export async function runCli(): Promise<void> {
29
+ await runMain(mainCommand);
30
+ }