All files / management github.ts

87.5% Statements 28/32
62.5% Branches 10/16
85.71% Functions 6/7
87.5% Lines 28/32

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 1111x 1x     1x 2x                                 1x 3x                     3x     1x 2x   2x       2x 1x     2x   2x   2x     1x 2x 2x       1x           2x       2x       2x 1x   1x     1x   1x   1x   1x                                              
import { config } from './config'
import { isSemverGreater } from './semver'
import { Logger } from '@azure/functions'
 
export function bearer(token?: string) {
  return `Bearer ${token}`
}
 
async function getLatestGithubReleaseWithPrelease(token?: string) {
  const response = await fetch(`https://api.github.com/repos/${config.repositoryOwner}/${config.repository}/releases`, {
    headers: token
      ? {
          Authorization: bearer(token),
        }
      : undefined,
  })
 
  const releases = (await response.json()) as GithubRelease[]
 
  return releases?.[0]
}
 
export async function getLatestGithubRelease(token?: string) {
  const response = await fetch(
    `https://api.github.com/repos/${config.repositoryOwner}/${config.repository}/releases/latest`,
    {
      headers: token
        ? {
            Authorization: bearer(token),
          }
        : undefined,
    }
  )
 
  return (await response.json()) as GithubRelease
}
 
export async function downloadReleaseAsset(url: string, token?: string, logger?: Logger) {
  logger?.verbose(`Downloading release asset from ${url}`)
 
  const headers: Record<string, string> = {
    Accept: 'application/octet-stream',
    'User-Agent': 'fingerprint-pro-azure-integration',
  }
  if (token) {
    headers['Authorization'] = bearer(token)
  }
 
  const response = await fetch(url, { headers })
 
  const arrayBuffer = await response.arrayBuffer()
 
  return Buffer.from(arrayBuffer)
}
 
export async function findFunctionZip(assets: GithubReleaseAsset[]) {
  return assets.find(
    (asset) => asset.name === 'package.zip' && asset.state === 'uploaded' && asset.content_type === 'application/zip'
  )
}
 
export async function getLatestFunctionZip(
  logger?: Logger,
  token?: string,
  version = config.version,
  allowPrerelease = false
) {
  Iif (allowPrerelease) {
    logger?.info('Pre-releases are allowed')
  }
 
  const release = allowPrerelease
    ? await getLatestGithubReleaseWithPrelease(token)
    : await getLatestGithubRelease(token)
 
  if (!isSemverGreater(release.tag_name, version)) {
    logger?.verbose(`Latest release ${release.tag_name} is not greater than current version ${version}`)
 
    return null
  }
 
  logger?.verbose(`Found new release ${release.tag_name}`, release.assets)
 
  const asset = await findFunctionZip(release.assets)
 
  logger?.verbose(`Found asset ${asset?.name} for release ${release.tag_name}`, asset)
 
  return asset
    ? {
        file: await downloadReleaseAsset(asset.url, token, logger),
        name: asset.name,
        version: release.tag_name,
      }
    : null
}
 
export interface GithubRelease {
  assets_url: string
  url: string
  tag_name: string
  name: string
  assets: GithubReleaseAsset[]
}
 
export interface GithubReleaseAsset {
  url: string
  name: string
  content_type: string
  state: 'uploaded' | 'errored'
}