{"version":3,"file":"info.mjs","names":[],"sources":["../../src/commands/info.ts"],"sourcesContent":["import type { Package } from \"../core/types.ts\";\nimport type { Registry } from \"../core/registry.ts\";\nimport { defineCommand } from \"citty\";\nimport consola from \"consola\";\nimport { resolveDocsUrl } from \"../helpers.ts\";\nimport { sharedArgs, resolvePURL, withErrorHandling } from \"./shared.ts\";\n\nexport function outputPackageInfo(pkg: Package, name: string, reg: Registry): void {\n  const urls = reg.urls();\n  const registryUrl = urls.registry(name);\n  const docsUrl = resolveDocsUrl(pkg, urls, pkg.latestVersion || undefined);\n  const showDocs = shouldShowDocs(docsUrl, pkg, registryUrl);\n\n  consola.log(\"\");\n  consola.log(\n    `  \\x1B[1m\\x1B[36m${pkg.name}\\x1B[0m${pkg.latestVersion ? `\\x1B[90m@${pkg.latestVersion}\\x1B[0m` : \"\"}`,\n  );\n  if (pkg.description) {\n    consola.log(`  ${pkg.description}`);\n  }\n  consola.log(\"\");\n\n  const rows = [\n    [\"License:\", \"    \", pkg.licenses, Boolean(pkg.licenses)],\n    [\"Repository:\", \" \", pkg.repository, Boolean(pkg.repository)],\n    [\"Homepage:\", \"   \", pkg.homepage, Boolean(pkg.homepage)],\n    [\"Docs:\", \"       \", docsUrl, showDocs],\n    [\"Registry:\", \"   \", registryUrl, true],\n    [\"Keywords:\", \"   \", pkg.keywords.join(\", \"), pkg.keywords.length > 0],\n    [\"Namespace:\", \"  \", pkg.namespace, Boolean(pkg.namespace)],\n    [\"Ecosystem:\", \"  \", reg.ecosystem(), true],\n  ] as const;\n\n  for (const [label, spacing, value, visible] of rows) {\n    if (visible) consola.log(`  \\x1B[90m${label}\\x1B[0m${spacing}${value}`);\n  }\n  consola.log(\"\");\n}\n\nfunction shouldShowDocs(\n  docsUrl: string,\n  pkg: Readonly<Pick<Package, \"homepage\" | \"repository\">>,\n  registryUrl: string,\n): boolean {\n  return Boolean(docsUrl) && ![pkg.homepage, pkg.repository, registryUrl].includes(docsUrl);\n}\n\nexport default defineCommand({\n  meta: {\n    name: \"info\",\n    description: \"Show package metadata\",\n  },\n  args: {\n    ...sharedArgs,\n    purl: {\n      type: \"positional\",\n      description: \"Package PURL (e.g. pkg:npm/lodash, cargo/serde@1.0)\",\n      required: true,\n    },\n  },\n  async run({ args }) {\n    await withErrorHandling(async () => {\n      const [reg, name] = await resolvePURL(args.purl, args.cache);\n      const pkg = await reg.fetchPackage(name);\n\n      if (args.json) {\n        console.log(JSON.stringify(pkg, null, 2));\n        return;\n      }\n\n      outputPackageInfo(pkg, name, reg);\n    });\n  },\n});\n"],"mappings":";;;;AAOA,SAAgB,kBAAkB,KAAc,MAAc,KAAqB;CACjF,MAAM,OAAO,IAAI,KAAK;CACtB,MAAM,cAAc,KAAK,SAAS,IAAI;CACtC,MAAM,UAAU,eAAe,KAAK,MAAM,IAAI,iBAAiB,KAAA,CAAS;CACxE,MAAM,WAAW,eAAe,SAAS,KAAK,WAAW;CAEzD,QAAQ,IAAI,EAAE;CACd,QAAQ,IACN,oBAAoB,IAAI,KAAK,SAAS,IAAI,gBAAgB,YAAY,IAAI,cAAc,WAAW,IACrG;CACA,IAAI,IAAI,aACN,QAAQ,IAAI,KAAK,IAAI,aAAa;CAEpC,QAAQ,IAAI,EAAE;CAEd,MAAM,OAAO;EACX;GAAC;GAAY;GAAQ,IAAI;GAAU,QAAQ,IAAI,QAAQ;EAAC;EACxD;GAAC;GAAe;GAAK,IAAI;GAAY,QAAQ,IAAI,UAAU;EAAC;EAC5D;GAAC;GAAa;GAAO,IAAI;GAAU,QAAQ,IAAI,QAAQ;EAAC;EACxD;GAAC;GAAS;GAAW;GAAS;EAAQ;EACtC;GAAC;GAAa;GAAO;GAAa;EAAI;EACtC;GAAC;GAAa;GAAO,IAAI,SAAS,KAAK,IAAI;GAAG,IAAI,SAAS,SAAS;EAAC;EACrE;GAAC;GAAc;GAAM,IAAI;GAAW,QAAQ,IAAI,SAAS;EAAC;EAC1D;GAAC;GAAc;GAAM,IAAI,UAAU;GAAG;EAAI;CAC5C;CAEA,KAAK,MAAM,CAAC,OAAO,SAAS,OAAO,YAAY,MAC7C,IAAI,SAAS,QAAQ,IAAI,aAAa,MAAM,SAAS,UAAU,OAAO;CAExE,QAAQ,IAAI,EAAE;AAChB;AAEA,SAAS,eACP,SACA,KACA,aACS;CACT,OAAO,QAAQ,OAAO,KAAK,CAAC;EAAC,IAAI;EAAU,IAAI;EAAY;CAAW,CAAC,CAAC,SAAS,OAAO;AAC1F;AAEA,IAAA,eAAe,cAAc;CAC3B,MAAM;EACJ,MAAM;EACN,aAAa;CACf;CACA,MAAM;EACJ,GAAG;EACH,MAAM;GACJ,MAAM;GACN,aAAa;GACb,UAAU;EACZ;CACF;CACA,MAAM,IAAI,EAAE,QAAQ;EAClB,MAAM,kBAAkB,YAAY;GAClC,MAAM,CAAC,KAAK,QAAQ,MAAM,YAAY,KAAK,MAAM,KAAK,KAAK;GAC3D,MAAM,MAAM,MAAM,IAAI,aAAa,IAAI;GAEvC,IAAI,KAAK,MAAM;IACb,QAAQ,IAAI,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;IACxC;GACF;GAEA,kBAAkB,KAAK,MAAM,GAAG;EAClC,CAAC;CACH;AACF,CAAC"}