{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { GoogleAuth, GoogleAuthOptions } from \"google-auth-library\";\r\nimport { AUTH_SCOPES } from \"./utils\";\r\nimport { Testers } from \"./testers\";\r\nimport { Groups } from \"./groups\";\r\nimport { Releases } from \"./releases\";\r\n\r\ninterface UploadAndDistributeOptions {\r\n  appId: string;\r\n  binaryPath: string;\r\n  fileName: string;\r\n  testerEmails: string[];\r\n  groupAliases: string[];\r\n  releaseNotes?: string;\r\n  uploadOperationTimeout?: number;\r\n  uploadOperationInteval?: number;\r\n}\r\n\r\nexport interface FirebaseAppDistributionAuthOptions extends Omit<\r\n  GoogleAuthOptions,\r\n  \"scopes\"\r\n> {}\r\n\r\nexport class FirebaseAppDistribution {\r\n  private projectNumber: string | null = null;\r\n  private projectId: string | null = null;\r\n  private googleAuth: GoogleAuth;\r\n  private accessToken: string | undefined;\r\n\r\n  testers: Testers;\r\n  groups: Groups;\r\n  releases: Releases;\r\n\r\n  constructor(authOptions: FirebaseAppDistributionAuthOptions) {\r\n    this.googleAuth = new GoogleAuth({\r\n      ...authOptions,\r\n      scopes: AUTH_SCOPES,\r\n    });\r\n    this.testers = new Testers(this);\r\n    this.groups = new Groups(this);\r\n    this.releases = new Releases(this);\r\n  }\r\n\r\n  async getProjectId(): Promise<string> {\r\n    if (this.projectId) {\r\n      return this.projectId;\r\n    }\r\n\r\n    // For some reason, the project ID is not available until after we get an access token.\r\n    // This is a workaround to ensure we have the project ID when needed.\r\n    await this.getAccessToken();\r\n    this.projectId = await this.googleAuth.getProjectId();\r\n    return this.projectId;\r\n  }\r\n\r\n  async getProjectNumber(): Promise<string> {\r\n    if (this.projectNumber) {\r\n      return this.projectNumber;\r\n    }\r\n\r\n    const projectId = await this.getProjectId();\r\n    const client = await this.googleAuth.getClient();\r\n\r\n    const url = `https://cloudresourcemanager.googleapis.com/v1/projects/${projectId}`;\r\n    const res: any = await client.request({ url });\r\n\r\n    this.projectNumber = res.data.projectNumber;\r\n    if (!this.projectNumber) {\r\n      throw new Error(\"Failed to retrieve project number\");\r\n    }\r\n    return this.projectNumber;\r\n  }\r\n\r\n  async getAccessToken(): Promise<string> {\r\n    if (this.accessToken) {\r\n      return this.accessToken;\r\n    }\r\n\r\n    const accessToken = await this.googleAuth.getAccessToken();\r\n    if (!accessToken) {\r\n      throw new Error(\"Failed to retrieve access token\");\r\n    }\r\n    this.accessToken = accessToken;\r\n    return this.accessToken;\r\n  }\r\n\r\n  async uploadAndDistribute({\r\n    appId,\r\n    binaryPath,\r\n    fileName,\r\n    testerEmails = [],\r\n    groupAliases = [],\r\n    releaseNotes,\r\n    uploadOperationInteval = 500,\r\n    uploadOperationTimeout = 5_000,\r\n  }: UploadAndDistributeOptions) {\r\n    const operation = await this.releases.upload(appId, binaryPath, fileName);\r\n    const operationName = operation.name;\r\n\r\n    const uploadTimeout = setTimeout(() => {\r\n      throw new Error(\"Upload operation timed out\");\r\n    }, uploadOperationTimeout);\r\n\r\n    let doneUploading = false;\r\n    let releaseName: string | null = null;\r\n    while (!doneUploading) {\r\n      const operationData = await this.releases.operations.get(operationName);\r\n      if (operationData.done) {\r\n        doneUploading = true;\r\n        releaseName = operationData.response!.release.name;\r\n        clearTimeout(uploadTimeout);\r\n      }\r\n\r\n      if (operationData.error) {\r\n        throw new Error(\r\n          `Upload operation failed with code ${operationData.error.code} and error: ${operationData.error.message}`,\r\n        );\r\n      }\r\n      await new Promise((res) => setTimeout(res, uploadOperationInteval));\r\n    }\r\n\r\n    if (testerEmails.length !== 0 || groupAliases.length !== 0) {\r\n      await this.releases.distribute(releaseName!, {\r\n        testerEmails,\r\n        groupAliases,\r\n      });\r\n    }\r\n\r\n    if (releaseNotes) {\r\n      await this.releases.addReleaseNotes(releaseName!, releaseNotes);\r\n    }\r\n\r\n    const finalReleaseData = await this.releases.get(releaseName!);\r\n    return finalReleaseData;\r\n  }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,SAAS,kBAAqC;AAsBvC,IAAM,0BAAN,MAA8B;AAAA,EAUnC,YAAY,aAAiD;AAT7D,SAAQ,gBAA+B;AACvC,SAAQ,YAA2B;AASjC,SAAK,aAAa,IAAI,WAAW,iCAC5B,cAD4B;AAAA,MAE/B,QAAQ;AAAA,IACV,EAAC;AACD,SAAK,UAAU,IAAI,QAAQ,IAAI;AAC/B,SAAK,SAAS,IAAI,OAAO,IAAI;AAC7B,SAAK,WAAW,IAAI,SAAS,IAAI;AAAA,EACnC;AAAA,EAEM,eAAgC;AAAA;AACpC,UAAI,KAAK,WAAW;AAClB,eAAO,KAAK;AAAA,MACd;AAIA,YAAM,KAAK,eAAe;AAC1B,WAAK,YAAY,MAAM,KAAK,WAAW,aAAa;AACpD,aAAO,KAAK;AAAA,IACd;AAAA;AAAA,EAEM,mBAAoC;AAAA;AACxC,UAAI,KAAK,eAAe;AACtB,eAAO,KAAK;AAAA,MACd;AAEA,YAAM,YAAY,MAAM,KAAK,aAAa;AAC1C,YAAM,SAAS,MAAM,KAAK,WAAW,UAAU;AAE/C,YAAM,MAAM,2DAA2D,SAAS;AAChF,YAAM,MAAW,MAAM,OAAO,QAAQ,EAAE,IAAI,CAAC;AAE7C,WAAK,gBAAgB,IAAI,KAAK;AAC9B,UAAI,CAAC,KAAK,eAAe;AACvB,cAAM,IAAI,MAAM,mCAAmC;AAAA,MACrD;AACA,aAAO,KAAK;AAAA,IACd;AAAA;AAAA,EAEM,iBAAkC;AAAA;AACtC,UAAI,KAAK,aAAa;AACpB,eAAO,KAAK;AAAA,MACd;AAEA,YAAM,cAAc,MAAM,KAAK,WAAW,eAAe;AACzD,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,iCAAiC;AAAA,MACnD;AACA,WAAK,cAAc;AACnB,aAAO,KAAK;AAAA,IACd;AAAA;AAAA,EAEM,oBAAoB,IASK;AAAA,+CATL;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA,eAAe,CAAC;AAAA,MAChB,eAAe,CAAC;AAAA,MAChB;AAAA,MACA,yBAAyB;AAAA,MACzB,yBAAyB;AAAA,IAC3B,GAA+B;AAC7B,YAAM,YAAY,MAAM,KAAK,SAAS,OAAO,OAAO,YAAY,QAAQ;AACxE,YAAM,gBAAgB,UAAU;AAEhC,YAAM,gBAAgB,WAAW,MAAM;AACrC,cAAM,IAAI,MAAM,4BAA4B;AAAA,MAC9C,GAAG,sBAAsB;AAEzB,UAAI,gBAAgB;AACpB,UAAI,cAA6B;AACjC,aAAO,CAAC,eAAe;AACrB,cAAM,gBAAgB,MAAM,KAAK,SAAS,WAAW,IAAI,aAAa;AACtE,YAAI,cAAc,MAAM;AACtB,0BAAgB;AAChB,wBAAc,cAAc,SAAU,QAAQ;AAC9C,uBAAa,aAAa;AAAA,QAC5B;AAEA,YAAI,cAAc,OAAO;AACvB,gBAAM,IAAI;AAAA,YACR,qCAAqC,cAAc,MAAM,IAAI,eAAe,cAAc,MAAM,OAAO;AAAA,UACzG;AAAA,QACF;AACA,cAAM,IAAI,QAAQ,CAAC,QAAQ,WAAW,KAAK,sBAAsB,CAAC;AAAA,MACpE;AAEA,UAAI,aAAa,WAAW,KAAK,aAAa,WAAW,GAAG;AAC1D,cAAM,KAAK,SAAS,WAAW,aAAc;AAAA,UAC3C;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,cAAc;AAChB,cAAM,KAAK,SAAS,gBAAgB,aAAc,YAAY;AAAA,MAChE;AAEA,YAAM,mBAAmB,MAAM,KAAK,SAAS,IAAI,WAAY;AAC7D,aAAO;AAAA,IACT;AAAA;AACF;","names":[]}