/**
 * Fetches the npm registry and returns the latest version of a given package
 * @param packageName Name of the package
 * @returns As string with the latest version of the package
 */
export async function getPackageLatestVersion(
  packageName: string
): Promise<string> {
  try {
    const request = await fetch(`https://registry.npmjs.org/${packageName}`)
    const { 'dist-tags': distTags }: PackageMeta = await request.json()

    return distTags.latest
  } catch {
    // The fallback is the highest available 'latest' dist-tag
    return 'latest'
  }
}

interface PackageMeta {
  _id: string
  _rev: string
  name: string
  'dist-tags': DistTags
  versions: Record<string, unknown>
  time: Time
  author: Author
  license: string
  keywords: string[]
  description: string
  maintainers: Maintainer[]
  readme: string
  readmeFilename: string
}

interface Time {
  created: string
  modified: string
  [key: string]: string
}

interface Author {
  name: string
}

interface Maintainer {
  name: string
  email: string
}

interface DistTags {
  latest: string
  [key: string]: string
}
