1.1.2Updated a month ago
import { Command } from "jsr:@cliffy/command@1.0.0-rc.7";

import { HOST_URL, TOKEN } from "../config.ts";
import { Sort } from "../../utils/sort_utils.ts";
import { fetchExternal } from "../utils/fetch_external.ts";

export default new Command()
  .name('info')
  .alias('status')
  .description('Gets information about a Viapak package')
  .arguments('<package:string>')
  .action(async (_options, ...args) => {
    const [namespace_and_package] = args;

    const [namespace, package_and_version] = namespace_and_package.split('/');
    const [package_name, package_version = 'latest'] = package_and_version.split('@');

    try {
      console.log(`FETCHING `, `${HOST_URL}/api/v1/packages/${namespace}/${package_name}@${package_version || 'latest'}`);
      const package_info_request = await fetchExternal(`${HOST_URL}/api/v1/packages/${namespace}/${package_name}@${package_version || 'latest'}`, {
        headers: {
          Authorization: `Bearer ${TOKEN}`
        }
      });

      if(!package_info_request.ok) {
        console.error(`Error: Could not get info for ${namespace}/${package_name}`);
        console.error(`       ╰╴ ${package_info_request.status} ${package_info_request.statusText}`);
        return;
      }

      const package_info = await package_info_request.json() as Viapak.Package.Clean | null;

      if(!package_info) {
        console.error(`Error: Could not get info for ${namespace}/${package_name}`);
        console.error(`       ╰╴ Invalid response body`);
        return;
      }

      console.log(`\n${package_info.namespace}${package_info.name}\n\n`);

      const versions_to_show = 4;
      let versions = `${package_info.versions.all.sort(Sort.Version.Descending).filter((_, i) => i < versions_to_show).join(', ')}`;
      if(package_info.versions.all.length > versions_to_show) versions = versions + ` (+ ${package_info.versions.all.length - versions_to_show} more)`;

      const info: [string, string][] = [
        ['Latest version', package_info.versions.latest || '?'],
        ['Available versions', versions],
      ]
      if(package_info.scripts.length) {
        info.push(['Scripts', `${package_info.scripts.join(', ')}`])
      }

      for(const [name, value] of info) {
        console.log(' ', name.padEnd(20), value);
      }
      if(package_info.deprecated) {
        console.warn('!', "DEPRECATED");
      }

      console.log();

    } catch(_: any) {
      console.log(`\nSomething went wrong while fetching information for "${package_name}@${package_version}"\n${_.stack}\n`);
    }
  });