diff --git a/deploy/database.ts b/deploy/database.ts index eb823b2..5603290 100644 --- a/deploy/database.ts +++ b/deploy/database.ts @@ -15,6 +15,14 @@ export type DatabaseContext = GlobalContext & { org?: string; }; +/** + * Build the Deno KV connect URL for a per-environment database id, suitable for + * `Deno.openKv("https://api.deno.com/v2/databases//connect")`. + */ +function kvConnectUrl(databaseId: string): string { + return `https://api.deno.com/v2/databases/${databaseId}/connect`; +} + const databasesProvisionCommand = new Command() .description("Provision a database") .example("Provision a Deno KV database", "provision my-db --kind denokv") @@ -72,11 +80,15 @@ const databasesProvisionCommand = new Command() }, }); - console.log( - `${ - green("✔") - } Successfully provisioned ${options.kind} database '${name}'.`, - ); + if (options.json) { + writeJsonResult({ database: name, engine: options.kind, org }); + } else { + console.error( + `${ + green("✔") + } Successfully provisioned ${options.kind} database '${name}'.`, + ); + } })); const databasesLinkCommand = new Command() @@ -164,7 +176,11 @@ const databasesLinkCommand = new Command() engine, connection_config: connectionConfig, }); - console.log(`${green("✔")} Connection test successful.`); + if (options.json) { + writeJsonResult({ database: name, engine, dryRun: true, ok: true }); + } else { + console.error(`${green("✔")} Connection test successful.`); + } } else { await trpcClient.mutation("databases.createInstance", { org: org, @@ -172,7 +188,11 @@ const databasesLinkCommand = new Command() engine, connectionConfig, }); - console.log(`${green("✔")} Successfully linked database '${name}'.`); + if (options.json) { + writeJsonResult({ database: name, engine, org }); + } else { + console.error(`${green("✔")} Successfully linked database '${name}'.`); + } } })); @@ -193,9 +213,15 @@ const databasesAssignCommand = new Command() databaseInstance: name, }); - console.log( - `${green("✔")} Successfully assigned database '${name}' to app '${app}'.`, - ); + if (options.json) { + writeJsonResult({ database: name, app, org }); + } else { + console.error( + `${ + green("✔") + } Successfully assigned database '${name}' to app '${app}'.`, + ); + } })); const databasesDetachCommand = new Command() @@ -215,11 +241,15 @@ const databasesDetachCommand = new Command() databaseInstance: name, }); - console.log( - `${ - green("✔") - } Successfully detached database '${name}' from app '${app}'.`, - ); + if (options.json) { + writeJsonResult({ database: name, app, org }); + } else { + console.error( + `${ + green("✔") + } Successfully detached database '${name}' from app '${app}'.`, + ); + } })); const databasesQueryCommand = new Command() @@ -332,7 +362,12 @@ const databasesListCommand = new Command() { slug: string; created_at: Date; - databases: Array<{ name: string; status: string; created_at: Date }>; + databases: Array<{ + name: string; + status: string; + created_at: Date; + metadata?: { td_id?: string }; + }>; assignments: Array<{ app_slug: string }>; } & ConnectionInfo >; @@ -344,11 +379,17 @@ const databasesListCommand = new Command() createdAt: database.created_at, assignments: database.assignments.map((a) => a.app_slug), connection: database.safeConnectionConfig, - databases: database.databases.map((db) => ({ - name: db.name, - status: db.status, - createdAt: db.created_at, - })), + databases: database.databases.map((db) => { + const databaseId = db.metadata?.td_id; + return { + name: db.name, + status: db.status, + createdAt: db.created_at, + ...(databaseId + ? { databaseId, connectUrl: kvConnectUrl(databaseId) } + : {}), + }; + }), }))); return; } @@ -371,7 +412,7 @@ const databasesListCommand = new Command() }, (database) => { return { - headers: ["NAME", "STATUS", "CREATED"], + headers: ["NAME", "STATUS", "CREATED", "DATABASE ID"], rows: database.databases.map((database) => { return [ database.name, @@ -379,6 +420,7 @@ const databasesListCommand = new Command() renderTemporalTimestamp( database.created_at.toISOString(), ), + database.metadata?.td_id ?? "", ]; }), }; @@ -400,7 +442,11 @@ const databasesDeleteCommand = new Command() databaseInstance: name, }); - console.log(`${green("✔")} Successfully deleted database '${name}'.`); + if (options.json) { + writeJsonResult({ database: name, org }); + } else { + console.error(`${green("✔")} Successfully deleted database '${name}'.`); + } })); export const databasesCommand = new Command()