import type { AssetFileEntry } from '../contract.js' import { getCliClient } from '../cli-client.js' import { assetUrlsResult } from '../output.js' import type { RefsReader } from '../refs.js' import { resolveAsset } from '../refs.js' export interface AssetUrls { name: string version: string baseUrl: string subpaths: string[] previewUrl: string | null } export interface UrlsCommandOptions { unapproved?: boolean key?: string baseUrl?: string } export async function resolveAssetUrls( client: RefsReader, ref: string, opts: Pick = {}, ): Promise { const asset = await resolveAsset(client, ref, { includeUnapproved: opts.unapproved, key: opts.key, }) const files = asset.files.map(splitFileUrl) if (files.length === 0) throw new Error(`Asset "${ref}" has no files`) const baseUrl = files[0].baseUrl if (files.some((file) => file.baseUrl !== baseUrl)) { throw new Error(`Market API returned inconsistent file URLs for "${ref}"`) } return { name: asset.name, version: asset.version, baseUrl, subpaths: files.map((file) => file.subpath), previewUrl: asset.previewUrl, } } export async function urlsCommand(ref: string, opts: UrlsCommandOptions): Promise { const { client } = await getCliClient({ baseUrl: opts.baseUrl }) const urls = await resolveAssetUrls(client.asset, ref, opts) console.log(assetUrlsResult(urls)) } function splitFileUrl(file: Pick): { baseUrl: string subpath: string } { const subpath = file.path.split('/').map(encodeURIComponent).join('/') if (!file.url.endsWith(`/${subpath}`)) { throw new Error(`Market API returned an invalid URL for asset file "${file.path}"`) } return { baseUrl: file.url.slice(0, -subpath.length), subpath } }