All files cloudflare.ts

61.29% Statements 19/31
40% Branches 4/10
66.66% Functions 2/3
55.55% Lines 15/27

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 622x     2x   2x         11x 10x   9x 9x                   8x 7x   7x 7x         7x 7x 7x                                             7x      
import * as core from '@actions/core'
import type { CloudflareResponse } from './types'
import type { AxiosError } from 'axios'
import axios from 'axios'
 
export default class Cloudflare {
  private readonly accountID: string
  private readonly apiToken: string
 
  constructor(accountID: string, apiToken: string) {
    if (!accountID) throw new Error('Missing Cloudflare account ID')
    if (!apiToken) throw new Error('Missing Cloudflare API token')
 
    this.accountID = accountID
    this.apiToken = apiToken
  }
 
  /**
   * Generate a Cloudflare preview deployment for the given project and branch.
   * @param projectName The name of the Cloudflare Pages project.
   * @param branch The branch to create a preview for.
   * @returns The response from the Cloudflare API.
   */
  async deploy(projectName: string, branch: string) {
    if (!projectName) throw new Error('Missing Cloudflare Pages project name')
    core.info(`Starting deployment of ${projectName} from branch ${branch}`)
 
    const url = `https://api.cloudflare.com/client/v4/accounts/${this.accountID}/pages/projects/${projectName}/deployments`
    const headers = {
      Authorization: `Bearer ${this.apiToken}`
    }
 
    let result
    try {
      const response = await axios.postForm(url, { branch }, { headers })
      if (response?.data) result = response?.data.result
    } catch (error) {
      if ((error as AxiosError).response?.status === 304) {
        core.debug(`${projectName} not changed since last deployment.`)
        core.debug(`Retrieving previous deployment info...`)
 
        const response = await axios.get(`${url}?env=preview`, { headers })
        if (response?.data && response?.data.result) {
          const branchDeployments = response?.data.result.filter(
            (deployment: CloudflareResponse['result']) =>
              deployment.deployment_trigger.metadata.branch === branch
          )
          result = branchDeployments[0]
          core.debug(`Found previous deployment with url: ${result.url}`)
        } else {
          core.debug(`Could not retrieve previous deployment.`)
          throw error
        }
      } else {
        throw error
      }
    }
 
    return result
  }
}