UNPKG

firebase-app-distribution

Version:
1 lines 6.33 kB
{"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":[]}