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

import { HOST_URL, TOKEN } from "../config.ts";

export default new Command()
  .name('script')
  .description('Runs a script from a Viapak package')
  .arguments('<package:string> <script_name:string>')
  .action(async (_options, ...args) => {
    const [namespace_and_package, script_name] = args;

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

    if(!namespace || !namespace.startsWith('@') || !package_name || !package_version) {
      console.warn(`"${namespace_and_package}" is not a valid package name\n`);
      Deno.exit(0);
    }

    let package_info: Record<string, any> = {};

    try {
      package_info = await (
        await fetch(`${HOST_URL}/api/v1/packages/${namespace}/${package_name}@${package_version || 'latest'}`, {
          headers: {
            Authorization: `Bearer ${TOKEN}`
          }
        })
      ).json();
    } catch(_) { /**/ }

    const scripts = package_info.scripts ?? [];

    if(scripts.includes(script_name.toLowerCase())) {
      await import(`${HOST_URL}/${namespace}/${package_name}@${package_version}/___.viapak/${script_name.toLowerCase()}.ts`);
    } else if(scripts.length) {
      console.log(`\n${package_name}@${package_version} does not have a script called "${script_name}".\nAvailable scripts: "${package_info.scripts.join('", "')}"\n`);
    } else {
      console.log(`\n${namespace}/${package_name}@${package_version} has no scripts.\n`);
    }
  });