import * as fs from 'fs/promises' import * as path from 'path' import ora from 'ora' import { getCliClient } from '../cli-client.js' import { resolveAsset, type RefsReader } from '../refs.js' import { previewResult } from '../output.js' export interface PreviewCommandOptions { unapproved?: boolean out?: string baseUrl?: string } export async function resolvePreviewRef( client: RefsReader, ref: string, includeUnapproved: boolean, ): Promise<{ name: string; version: string; previewUrl: string }> { const asset = await resolveAsset(client, ref, { includeUnapproved }) if (!asset.previewUrl) { throw new Error(`Asset "${ref}" has no preview image`) } return { name: asset.name, version: asset.version, previewUrl: asset.previewUrl } } export async function previewCommand(ref: string, opts: PreviewCommandOptions): Promise { const spinner = ora({ text: `Resolving preview for ${ref}`, isEnabled: Boolean(process.stderr.isTTY), isSilent: !process.stderr.isTTY, }).start() try { const { client } = await getCliClient({ baseUrl: opts.baseUrl }) const preview = await resolvePreviewRef(client.asset, ref, opts.unapproved ?? false) spinner.text = `Downloading preview for ${preview.name}@${preview.version}` const response = await fetch(preview.previewUrl) if (!response.ok) { throw new Error(`Failed to download preview (${response.status}) from ${preview.previewUrl}`) } const bytes = new Uint8Array(await response.arrayBuffer()) const out = path.resolve(opts.out ?? `${preview.name}-preview.webp`) await fs.mkdir(path.dirname(out), { recursive: true }) await fs.writeFile(out, bytes) spinner.stop() console.log(previewResult(preview.name, preview.version, out)) } catch (err) { spinner.stop() throw err } }