1import { ApiClient } from "../lib/api.ts";2import { configPath, loadConfig, saveConfig } from "../lib/config.ts";3import { emit, fail, green } from "../lib/fmt.ts";45function prompt2(question: string, fallback?: string): string {6 const answer = prompt(fallback ? `${question} [${fallback}]:` : `${question}:`);7 const value = (answer ?? "").trim() || fallback || "";8 if (!value) fail(`${question} is required`);9 return value;10}1112function envDefaultServer(): string | undefined {13 try {14 const server = Deno.env.get("NZIP_SERVER")?.trim();15 if (server) return server;16 const domain = Deno.env.get("NZIP_DOMAIN")?.trim().replace(/^https?:\/\//, "").replace(17 /\/$/,18 "",19 );20 return domain ? `https://${domain}` : undefined;21 } catch {22 return undefined;23 }24}2526export async function cmdAuth(27 serverFlag?: string,28 tokenFlag?: string,29): Promise<void> {30 const existing = await loadConfig();31 const server = (serverFlag ?? prompt2("server", existing?.server ?? envDefaultServer()))32 .replace(/\/$/, "");33 const token = tokenFlag ?? prompt2("token", existing?.token);34 const config = { server, token, defaultVault: existing?.defaultVault };3536 const api = new ApiClient(config);37 let status;38 try {39 status = await api.status();40 } catch (e) {41 fail(`could not verify token against ${server}/api/status — ${(e as Error).message}`);42 }4344 if (!config.defaultVault && status.vaults.length > 0) {45 config.defaultVault = status.vaults[0].name;46 }47 await saveConfig(config);48 emit(() => {49 console.log(`${green("✓")} authenticated against ${server} — saved to ${configPath()}`);50 if (config.defaultVault) console.log(` default vault: ${config.defaultVault}`);51 }, {52 ok: true,53 server,54 configPath: configPath(),55 defaultVault: config.defaultVault ?? null,56 vaults: status.vaults,57 });58}