@gitkraken/core-gitlens 0.3.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/CHANGELOG.md +13 -1
  2. package/README.md +13 -10
  3. package/dist/git/context.d.ts +4 -3
  4. package/dist/git/context.d.ts.map +1 -1
  5. package/dist/git/context.js.map +1 -1
  6. package/dist/git/providers/operations.d.ts +1 -0
  7. package/dist/git/providers/operations.d.ts.map +1 -1
  8. package/dist/git/providers/worktrees.d.ts +2 -0
  9. package/dist/git/providers/worktrees.d.ts.map +1 -1
  10. package/dist/git/utils/conflictResolution.utils.d.ts +32 -0
  11. package/dist/git/utils/conflictResolution.utils.d.ts.map +1 -1
  12. package/dist/git/utils/conflictResolution.utils.js +95 -0
  13. package/dist/git/utils/conflictResolution.utils.js.map +1 -1
  14. package/dist/git-cli/providers/operations.d.ts +1 -0
  15. package/dist/git-cli/providers/operations.d.ts.map +1 -1
  16. package/dist/git-cli/providers/operations.js +22 -1
  17. package/dist/git-cli/providers/operations.js.map +1 -1
  18. package/dist/git-cli/providers/worktrees.d.ts +2 -0
  19. package/dist/git-cli/providers/worktrees.d.ts.map +1 -1
  20. package/dist/git-cli/providers/worktrees.js +3 -0
  21. package/dist/git-cli/providers/worktrees.js.map +1 -1
  22. package/dist/plus/ai/utils/ai.utils.js +5 -5
  23. package/dist/plus/ai/utils/ai.utils.js.map +1 -1
  24. package/dist/plus/git-github/api/github.d.ts +6 -13
  25. package/dist/plus/git-github/api/github.d.ts.map +1 -1
  26. package/dist/plus/git-github/api/github.js +5 -10
  27. package/dist/plus/git-github/api/github.js.map +1 -1
  28. package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts +11 -0
  29. package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts.map +1 -0
  30. package/dist/plus/integrations/authentication/cloudIntegrationService.js +90 -0
  31. package/dist/plus/integrations/authentication/cloudIntegrationService.js.map +1 -0
  32. package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts +67 -0
  33. package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts.map +1 -0
  34. package/dist/plus/integrations/authentication/configuredIntegrationService.js +295 -0
  35. package/dist/plus/integrations/authentication/configuredIntegrationService.js.map +1 -0
  36. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts +92 -0
  37. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts.map +1 -0
  38. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js +185 -0
  39. package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js.map +1 -0
  40. package/dist/plus/integrations/authentication/integrationAuthenticationService.d.ts +62 -0
  41. package/dist/plus/integrations/authentication/integrationAuthenticationService.d.ts.map +1 -0
  42. package/dist/plus/integrations/authentication/integrationAuthenticationService.js +122 -0
  43. package/dist/plus/integrations/authentication/integrationAuthenticationService.js.map +1 -0
  44. package/dist/plus/integrations/authentication/manualTokenProvider.d.ts +15 -0
  45. package/dist/plus/integrations/authentication/manualTokenProvider.d.ts.map +1 -0
  46. package/dist/plus/integrations/authentication/manualTokenProvider.js +49 -0
  47. package/dist/plus/integrations/authentication/manualTokenProvider.js.map +1 -0
  48. package/dist/plus/integrations/authentication/models.d.ts +87 -0
  49. package/dist/plus/integrations/authentication/models.d.ts.map +1 -0
  50. package/dist/plus/integrations/authentication/models.js +64 -0
  51. package/dist/plus/integrations/authentication/models.js.map +1 -0
  52. package/dist/plus/integrations/constants.d.ts +47 -0
  53. package/dist/plus/integrations/constants.d.ts.map +1 -0
  54. package/dist/plus/integrations/constants.js +128 -0
  55. package/dist/plus/integrations/constants.js.map +1 -0
  56. package/dist/plus/integrations/context.d.ts +354 -0
  57. package/dist/plus/integrations/context.d.ts.map +1 -0
  58. package/dist/plus/integrations/context.js +2 -0
  59. package/dist/plus/integrations/context.js.map +1 -0
  60. package/dist/plus/integrations/errors.d.ts +14 -0
  61. package/dist/plus/integrations/errors.d.ts.map +1 -0
  62. package/dist/plus/integrations/errors.js +19 -0
  63. package/dist/plus/integrations/errors.js.map +1 -0
  64. package/dist/plus/integrations/index.d.ts +32 -0
  65. package/dist/plus/integrations/index.d.ts.map +1 -0
  66. package/dist/plus/integrations/index.js +62 -0
  67. package/dist/plus/integrations/index.js.map +1 -0
  68. package/dist/plus/integrations/integrationService.d.ts +98 -0
  69. package/dist/plus/integrations/integrationService.d.ts.map +1 -0
  70. package/dist/plus/integrations/integrationService.js +627 -0
  71. package/dist/plus/integrations/integrationService.js.map +1 -0
  72. package/dist/plus/integrations/models/gitHostIntegration.d.ts +82 -0
  73. package/dist/plus/integrations/models/gitHostIntegration.d.ts.map +1 -0
  74. package/dist/plus/integrations/models/gitHostIntegration.js +522 -0
  75. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -0
  76. package/dist/plus/integrations/models/integration.d.ts +127 -0
  77. package/dist/plus/integrations/models/integration.d.ts.map +1 -0
  78. package/dist/plus/integrations/models/integration.js +456 -0
  79. package/dist/plus/integrations/models/integration.js.map +1 -0
  80. package/dist/plus/integrations/models/issuesIntegration.d.ts +28 -0
  81. package/dist/plus/integrations/models/issuesIntegration.d.ts.map +1 -0
  82. package/dist/plus/integrations/models/issuesIntegration.js +101 -0
  83. package/dist/plus/integrations/models/issuesIntegration.js.map +1 -0
  84. package/dist/plus/integrations/providers/apiClients.d.ts +25 -0
  85. package/dist/plus/integrations/providers/apiClients.d.ts.map +1 -0
  86. package/dist/plus/integrations/providers/apiClients.js +39 -0
  87. package/dist/plus/integrations/providers/apiClients.js.map +1 -0
  88. package/dist/plus/integrations/providers/azure/azure.d.ts +47 -0
  89. package/dist/plus/integrations/providers/azure/azure.d.ts.map +1 -0
  90. package/dist/plus/integrations/providers/azure/azure.js +444 -0
  91. package/dist/plus/integrations/providers/azure/azure.js.map +1 -0
  92. package/dist/plus/integrations/providers/azure/models.d.ts +286 -0
  93. package/dist/plus/integrations/providers/azure/models.d.ts.map +1 -0
  94. package/dist/plus/integrations/providers/azure/models.js +203 -0
  95. package/dist/plus/integrations/providers/azure/models.js.map +1 -0
  96. package/dist/plus/integrations/providers/azureDevOps.d.ts +95 -0
  97. package/dist/plus/integrations/providers/azureDevOps.d.ts.map +1 -0
  98. package/dist/plus/integrations/providers/azureDevOps.js +432 -0
  99. package/dist/plus/integrations/providers/azureDevOps.js.map +1 -0
  100. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts +42 -0
  101. package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts.map +1 -0
  102. package/dist/plus/integrations/providers/bitbucket/bitbucket.js +513 -0
  103. package/dist/plus/integrations/providers/bitbucket/bitbucket.js.map +1 -0
  104. package/dist/plus/integrations/providers/bitbucket/models.d.ts +222 -0
  105. package/dist/plus/integrations/providers/bitbucket/models.d.ts.map +1 -0
  106. package/dist/plus/integrations/providers/bitbucket/models.js +158 -0
  107. package/dist/plus/integrations/providers/bitbucket/models.js.map +1 -0
  108. package/dist/plus/integrations/providers/bitbucket-server/models.d.ts +120 -0
  109. package/dist/plus/integrations/providers/bitbucket-server/models.d.ts.map +1 -0
  110. package/dist/plus/integrations/providers/bitbucket-server/models.js +111 -0
  111. package/dist/plus/integrations/providers/bitbucket-server/models.js.map +1 -0
  112. package/dist/plus/integrations/providers/bitbucket-server.d.ts +60 -0
  113. package/dist/plus/integrations/providers/bitbucket-server.d.ts.map +1 -0
  114. package/dist/plus/integrations/providers/bitbucket-server.js +138 -0
  115. package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -0
  116. package/dist/plus/integrations/providers/bitbucket.d.ts +50 -0
  117. package/dist/plus/integrations/providers/bitbucket.d.ts.map +1 -0
  118. package/dist/plus/integrations/providers/bitbucket.js +181 -0
  119. package/dist/plus/integrations/providers/bitbucket.js.map +1 -0
  120. package/dist/plus/integrations/providers/github/github.d.ts +5 -0
  121. package/dist/plus/integrations/providers/github/github.d.ts.map +1 -0
  122. package/dist/plus/integrations/providers/github/github.js +47 -0
  123. package/dist/plus/integrations/providers/github/github.js.map +1 -0
  124. package/dist/plus/integrations/providers/github/github.utils.d.ts +11 -0
  125. package/dist/plus/integrations/providers/github/github.utils.d.ts.map +1 -0
  126. package/dist/plus/integrations/providers/github/github.utils.js +6 -0
  127. package/dist/plus/integrations/providers/github/github.utils.js.map +1 -0
  128. package/dist/plus/integrations/providers/github/models.d.ts +3 -0
  129. package/dist/plus/integrations/providers/github/models.d.ts.map +1 -0
  130. package/dist/plus/integrations/providers/github/models.js +2 -0
  131. package/dist/plus/integrations/providers/github/models.js.map +1 -0
  132. package/dist/plus/integrations/providers/github.d.ts +73 -0
  133. package/dist/plus/integrations/providers/github.d.ts.map +1 -0
  134. package/dist/plus/integrations/providers/github.js +160 -0
  135. package/dist/plus/integrations/providers/github.js.map +1 -0
  136. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts +63 -0
  137. package/dist/plus/integrations/providers/gitlab/gitlab.d.ts.map +1 -0
  138. package/dist/plus/integrations/providers/gitlab/gitlab.js +828 -0
  139. package/dist/plus/integrations/providers/gitlab/gitlab.js.map +1 -0
  140. package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts +21 -0
  141. package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts.map +1 -0
  142. package/dist/plus/integrations/providers/gitlab/gitlab.utils.js +45 -0
  143. package/dist/plus/integrations/providers/gitlab/gitlab.utils.js.map +1 -0
  144. package/dist/plus/integrations/providers/gitlab/models.d.ts +128 -0
  145. package/dist/plus/integrations/providers/gitlab/models.d.ts.map +1 -0
  146. package/dist/plus/integrations/providers/gitlab/models.js +96 -0
  147. package/dist/plus/integrations/providers/gitlab/models.js.map +1 -0
  148. package/dist/plus/integrations/providers/gitlab.d.ts +79 -0
  149. package/dist/plus/integrations/providers/gitlab.d.ts.map +1 -0
  150. package/dist/plus/integrations/providers/gitlab.js +253 -0
  151. package/dist/plus/integrations/providers/gitlab.js.map +1 -0
  152. package/dist/plus/integrations/providers/jira.d.ts +46 -0
  153. package/dist/plus/integrations/providers/jira.d.ts.map +1 -0
  154. package/dist/plus/integrations/providers/jira.js +255 -0
  155. package/dist/plus/integrations/providers/jira.js.map +1 -0
  156. package/dist/plus/integrations/providers/linear.d.ts +47 -0
  157. package/dist/plus/integrations/providers/linear.d.ts.map +1 -0
  158. package/dist/plus/integrations/providers/linear.js +198 -0
  159. package/dist/plus/integrations/providers/linear.js.map +1 -0
  160. package/dist/plus/integrations/providers/models.d.ts +433 -0
  161. package/dist/plus/integrations/providers/models.d.ts.map +1 -0
  162. package/dist/plus/integrations/providers/models.js +602 -0
  163. package/dist/plus/integrations/providers/models.js.map +1 -0
  164. package/dist/plus/integrations/providers/providersApi.d.ts +129 -0
  165. package/dist/plus/integrations/providers/providersApi.d.ts.map +1 -0
  166. package/dist/plus/integrations/providers/providersApi.js +602 -0
  167. package/dist/plus/integrations/providers/providersApi.js.map +1 -0
  168. package/dist/plus/integrations/providers/utils.d.ts +54 -0
  169. package/dist/plus/integrations/providers/utils.d.ts.map +1 -0
  170. package/dist/plus/integrations/providers/utils.js +262 -0
  171. package/dist/plus/integrations/providers/utils.js.map +1 -0
  172. package/dist/plus/integrations/telemetry.d.ts +26 -0
  173. package/dist/plus/integrations/telemetry.d.ts.map +1 -0
  174. package/dist/plus/integrations/telemetry.js +11 -0
  175. package/dist/plus/integrations/telemetry.js.map +1 -0
  176. package/dist/plus/integrations/utils/integration.utils.d.ts +14 -0
  177. package/dist/plus/integrations/utils/integration.utils.d.ts.map +1 -0
  178. package/dist/plus/integrations/utils/integration.utils.js +111 -0
  179. package/dist/plus/integrations/utils/integration.utils.js.map +1 -0
  180. package/dist/utils/disposable.d.ts +15 -2
  181. package/dist/utils/disposable.d.ts.map +1 -1
  182. package/dist/utils/disposable.js.map +1 -1
  183. package/package.json +43 -2
  184. package/src/git/context.ts +4 -3
  185. package/src/git/providers/operations.ts +1 -1
  186. package/src/git/providers/worktrees.ts +14 -2
  187. package/src/git/utils/conflictResolution.utils.ts +126 -0
  188. package/src/git-cli/providers/operations.ts +22 -2
  189. package/src/git-cli/providers/worktrees.ts +17 -2
  190. package/src/plus/ai/utils/ai.utils.ts +5 -5
  191. package/src/plus/git-github/api/github.ts +13 -25
  192. package/src/plus/integrations/authentication/cloudIntegrationService.ts +120 -0
  193. package/src/plus/integrations/authentication/configuredIntegrationService.ts +414 -0
  194. package/src/plus/integrations/authentication/integrationAuthenticationProvider.ts +289 -0
  195. package/src/plus/integrations/authentication/integrationAuthenticationService.ts +144 -0
  196. package/src/plus/integrations/authentication/manualTokenProvider.ts +72 -0
  197. package/src/plus/integrations/authentication/models.ts +168 -0
  198. package/src/plus/integrations/constants.ts +169 -0
  199. package/src/plus/integrations/context.ts +383 -0
  200. package/src/plus/integrations/errors.ts +35 -0
  201. package/src/plus/integrations/index.ts +119 -0
  202. package/src/plus/integrations/integrationService.ts +924 -0
  203. package/src/plus/integrations/models/gitHostIntegration.ts +738 -0
  204. package/src/plus/integrations/models/integration.ts +657 -0
  205. package/src/plus/integrations/models/issuesIntegration.ts +124 -0
  206. package/src/plus/integrations/providers/apiClients.ts +72 -0
  207. package/src/plus/integrations/providers/azure/azure.ts +691 -0
  208. package/src/plus/integrations/providers/azure/models.ts +605 -0
  209. package/src/plus/integrations/providers/azureDevOps.ts +677 -0
  210. package/src/plus/integrations/providers/bitbucket/bitbucket.ts +774 -0
  211. package/src/plus/integrations/providers/bitbucket/models.ts +445 -0
  212. package/src/plus/integrations/providers/bitbucket-server/models.ts +252 -0
  213. package/src/plus/integrations/providers/bitbucket-server.ts +282 -0
  214. package/src/plus/integrations/providers/bitbucket.ts +350 -0
  215. package/src/plus/integrations/providers/github/github.ts +64 -0
  216. package/src/plus/integrations/providers/github/github.utils.ts +23 -0
  217. package/src/plus/integrations/providers/github/models.ts +29 -0
  218. package/src/plus/integrations/providers/github.ts +366 -0
  219. package/src/plus/integrations/providers/gitlab/gitlab.ts +1210 -0
  220. package/src/plus/integrations/providers/gitlab/gitlab.utils.ts +71 -0
  221. package/src/plus/integrations/providers/gitlab/models.ts +257 -0
  222. package/src/plus/integrations/providers/gitlab.ts +473 -0
  223. package/src/plus/integrations/providers/jira.ts +359 -0
  224. package/src/plus/integrations/providers/linear.ts +275 -0
  225. package/src/plus/integrations/providers/models.ts +1114 -0
  226. package/src/plus/integrations/providers/providersApi.ts +1126 -0
  227. package/src/plus/integrations/providers/utils.ts +359 -0
  228. package/src/plus/integrations/telemetry.ts +29 -0
  229. package/src/plus/integrations/utils/integration.utils.ts +138 -0
  230. package/src/utils/disposable.ts +15 -2
@@ -0,0 +1,602 @@
1
+ import ProviderApis from '@gitkraken/provider-apis';
2
+ import { base64 } from '../../../utils/base64.js';
3
+ import { toTokenWithInfo } from '../authentication/models.js';
4
+ import { GitCloudHostIntegrationId, GitSelfManagedHostIntegrationId, IssuesCloudHostIntegrationId, } from '../constants.js';
5
+ import { AuthenticationError, AuthenticationErrorReason, RequestClientError, RequestNotFoundError, RequestRateLimitError, } from '../errors.js';
6
+ import { providersMetadata } from './models.js';
7
+ const createProviderApis = ProviderApis.default ?? ProviderApis;
8
+ export class ProvidersApi {
9
+ authenticationService;
10
+ providers;
11
+ constructor(authenticationService) {
12
+ this.authenticationService = authenticationService;
13
+ const http = authenticationService.ctx.http;
14
+ const userAgent = http.userAgent;
15
+ const customFetch = async ({ url, ...options }) => {
16
+ const response = await http.fetch(url, {
17
+ ...options,
18
+ headers: {
19
+ 'User-Agent': userAgent,
20
+ ...options.headers,
21
+ },
22
+ });
23
+ return parseFetchResponseForApi(response);
24
+ };
25
+ const providerApis = createProviderApis({ request: customFetch });
26
+ this.providers = {
27
+ [GitCloudHostIntegrationId.GitHub]: {
28
+ ...providersMetadata[GitCloudHostIntegrationId.GitHub],
29
+ provider: providerApis.github,
30
+ getCurrentUserFn: providerApis.github.getCurrentUser.bind(providerApis.github),
31
+ getPullRequestsForReposFn: providerApis.github.getPullRequestsForRepos.bind(providerApis.github),
32
+ getPullRequestsForUserFn: providerApis.github.getPullRequestsAssociatedWithUser.bind(providerApis.github),
33
+ getIssuesForReposFn: providerApis.github.getIssuesForRepos.bind(providerApis.github),
34
+ },
35
+ [GitSelfManagedHostIntegrationId.CloudGitHubEnterprise]: {
36
+ ...providersMetadata[GitSelfManagedHostIntegrationId.CloudGitHubEnterprise],
37
+ provider: providerApis.github,
38
+ getCurrentUserFn: providerApis.github.getCurrentUser.bind(providerApis.github),
39
+ getPullRequestsForReposFn: providerApis.github.getPullRequestsForRepos.bind(providerApis.github),
40
+ getPullRequestsForUserFn: providerApis.github.getPullRequestsAssociatedWithUser.bind(providerApis.github),
41
+ getIssuesForReposFn: providerApis.github.getIssuesForRepos.bind(providerApis.github),
42
+ },
43
+ [GitCloudHostIntegrationId.GitLab]: {
44
+ ...providersMetadata[GitCloudHostIntegrationId.GitLab],
45
+ provider: providerApis.gitlab,
46
+ getRepoFn: providerApis.gitlab.getRepo.bind(providerApis.gitlab),
47
+ getCurrentUserFn: providerApis.gitlab.getCurrentUser.bind(providerApis.gitlab),
48
+ getPullRequestsForReposFn: providerApis.gitlab.getPullRequestsForRepos.bind(providerApis.gitlab),
49
+ getPullRequestsForRepoFn: providerApis.gitlab.getPullRequestsForRepo.bind(providerApis.gitlab),
50
+ getPullRequestsForUserFn: providerApis.gitlab.getPullRequestsAssociatedWithUser.bind(providerApis.gitlab),
51
+ getIssueFn: providerApis.gitlab.getIssue.bind(providerApis.gitlab),
52
+ getIssuesForReposFn: providerApis.gitlab.getIssuesForRepos.bind(providerApis.gitlab),
53
+ getIssuesForRepoFn: providerApis.gitlab.getIssuesForRepo.bind(providerApis.gitlab),
54
+ mergePullRequestFn: providerApis.gitlab.mergePullRequest.bind(providerApis.gitlab),
55
+ },
56
+ [GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted]: {
57
+ ...providersMetadata[GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted],
58
+ provider: providerApis.gitlab,
59
+ getCurrentUserFn: providerApis.gitlab.getCurrentUser.bind(providerApis.gitlab),
60
+ getPullRequestsForReposFn: providerApis.gitlab.getPullRequestsForRepos.bind(providerApis.gitlab),
61
+ getPullRequestsForRepoFn: providerApis.gitlab.getPullRequestsForRepo.bind(providerApis.gitlab),
62
+ getPullRequestsForUserFn: providerApis.gitlab.getPullRequestsAssociatedWithUser.bind(providerApis.gitlab),
63
+ getIssueFn: providerApis.gitlab.getIssue.bind(providerApis.gitlab),
64
+ getIssuesForReposFn: providerApis.gitlab.getIssuesForRepos.bind(providerApis.gitlab),
65
+ getIssuesForRepoFn: providerApis.gitlab.getIssuesForRepo.bind(providerApis.gitlab),
66
+ mergePullRequestFn: providerApis.gitlab.mergePullRequest.bind(providerApis.gitlab),
67
+ },
68
+ [GitCloudHostIntegrationId.Bitbucket]: {
69
+ ...providersMetadata[GitCloudHostIntegrationId.Bitbucket],
70
+ provider: providerApis.bitbucket,
71
+ getCurrentUserFn: providerApis.bitbucket.getCurrentUser.bind(providerApis.bitbucket),
72
+ getBitbucketResourcesForCurrentUserFn: providerApis.bitbucket.getWorkspacesForCurrentUser.bind(providerApis.bitbucket),
73
+ getBitbucketPullRequestsAuthoredByUserForWorkspaceFn: providerApis.bitbucket.getPullRequestsForUserAndWorkspace.bind(providerApis.bitbucket),
74
+ getPullRequestsForReposFn: providerApis.bitbucket.getPullRequestsForRepos.bind(providerApis.bitbucket),
75
+ getPullRequestsForRepoFn: providerApis.bitbucket.getPullRequestsForRepo.bind(providerApis.bitbucket),
76
+ mergePullRequestFn: providerApis.bitbucket.mergePullRequest.bind(providerApis.bitbucket),
77
+ },
78
+ [GitSelfManagedHostIntegrationId.BitbucketServer]: {
79
+ ...providersMetadata[GitSelfManagedHostIntegrationId.BitbucketServer],
80
+ provider: providerApis.bitbucketServer,
81
+ getRepoFn: providerApis.bitbucketServer.getRepo.bind(providerApis.bitbucketServer),
82
+ getCurrentUserFn: providerApis.bitbucketServer.getCurrentUser.bind(providerApis.bitbucketServer),
83
+ getBitbucketServerPullRequestsForCurrentUserFn: providerApis.bitbucketServer.getPullRequestsForCurrentUser.bind(providerApis.bitbucketServer),
84
+ getPullRequestsForReposFn: providerApis.bitbucketServer.getPullRequestsForRepos.bind(providerApis.bitbucketServer),
85
+ getPullRequestsForRepoFn: providerApis.bitbucketServer.getPullRequestsForRepo.bind(providerApis.bitbucketServer),
86
+ mergePullRequestFn: providerApis.bitbucketServer.mergePullRequest.bind(providerApis.bitbucketServer),
87
+ },
88
+ [GitCloudHostIntegrationId.AzureDevOps]: {
89
+ ...providersMetadata[GitCloudHostIntegrationId.AzureDevOps],
90
+ provider: providerApis.azureDevOps,
91
+ getRepoOfProjectFn: providerApis.azureDevOps.getRepo.bind(providerApis.azureDevOps),
92
+ getCurrentUserFn: providerApis.azureDevOps.getCurrentUser.bind(providerApis.azureDevOps),
93
+ getCurrentUserForInstanceFn: providerApis.azureDevOps.getCurrentUserForInstance.bind(providerApis.azureDevOps),
94
+ getAzureResourcesForUserFn: providerApis.azureDevOps.getOrgsForUser.bind(providerApis.azureDevOps),
95
+ getAzureProjectsForResourceFn: providerApis.azureDevOps.getAzureProjects.bind(providerApis.azureDevOps),
96
+ getPullRequestsForReposFn: providerApis.azureDevOps.getPullRequestsForRepos.bind(providerApis.azureDevOps),
97
+ getPullRequestsForRepoFn: providerApis.azureDevOps.getPullRequestsForRepo.bind(providerApis.azureDevOps),
98
+ getPullRequestsForAzureProjectsFn: providerApis.azureDevOps.getPullRequestsForProjects.bind(providerApis.azureDevOps),
99
+ getIssuesForAzureProjectFn: providerApis.azureDevOps.getIssuesForAzureProject.bind(providerApis.azureDevOps),
100
+ getReposForAzureProjectFn: providerApis.azureDevOps.getReposForAzureProject.bind(providerApis.azureDevOps),
101
+ mergePullRequestFn: providerApis.azureDevOps.mergePullRequest.bind(providerApis.azureDevOps),
102
+ },
103
+ [GitSelfManagedHostIntegrationId.AzureDevOpsServer]: {
104
+ ...providersMetadata[GitSelfManagedHostIntegrationId.AzureDevOpsServer],
105
+ provider: providerApis.azureDevOps,
106
+ getRepoOfProjectFn: providerApis.azureDevOps.getRepo.bind(providerApis.azureDevOps),
107
+ getCurrentUserFn: providerApis.azureDevOps.getCurrentUser.bind(providerApis.azureDevOps),
108
+ getCurrentUserForInstanceFn: providerApis.azureDevOps.getCurrentUserForInstance.bind(providerApis.azureDevOps),
109
+ getAzureResourcesForUserFn: providerApis.azureDevOps.getCollectionsForUser.bind(providerApis.azureDevOps),
110
+ getAzureProjectsForResourceFn: providerApis.azureDevOps.getAzureProjects.bind(providerApis.azureDevOps),
111
+ getPullRequestsForReposFn: providerApis.azureDevOps.getPullRequestsForRepos.bind(providerApis.azureDevOps),
112
+ getPullRequestsForRepoFn: providerApis.azureDevOps.getPullRequestsForRepo.bind(providerApis.azureDevOps),
113
+ getPullRequestsForAzureProjectsFn: providerApis.azureDevOps.getPullRequestsForProjects.bind(providerApis.azureDevOps),
114
+ getIssuesForAzureProjectFn: providerApis.azureDevOps.getIssuesForAzureProject.bind(providerApis.azureDevOps),
115
+ getReposForAzureProjectFn: providerApis.azureDevOps.getReposForAzureProject.bind(providerApis.azureDevOps),
116
+ mergePullRequestFn: providerApis.azureDevOps.mergePullRequest.bind(providerApis.azureDevOps),
117
+ },
118
+ [IssuesCloudHostIntegrationId.Jira]: {
119
+ ...providersMetadata[IssuesCloudHostIntegrationId.Jira],
120
+ provider: providerApis.jira,
121
+ getCurrentUserForResourceFn: providerApis.jira.getCurrentUserForResource.bind(providerApis.jira),
122
+ getJiraResourcesForCurrentUserFn: providerApis.jira.getJiraResourcesForCurrentUser.bind(providerApis.jira),
123
+ getJiraProjectsForResourcesFn: providerApis.jira.getJiraProjectsForResources.bind(providerApis.jira),
124
+ getIssueFn: providerApis.jira.getIssue.bind(providerApis.jira),
125
+ getIssuesForProjectFn: providerApis.jira.getIssuesForProject.bind(providerApis.jira),
126
+ getIssuesForResourceForCurrentUserFn: providerApis.jira.getIssuesForResourceForCurrentUser.bind(providerApis.jira),
127
+ },
128
+ [IssuesCloudHostIntegrationId.Linear]: {
129
+ ...providersMetadata[IssuesCloudHostIntegrationId.Linear],
130
+ provider: providerApis.linear,
131
+ getIssueFn: providerApis.linear.getIssue.bind(providerApis.linear),
132
+ getIssuesForCurrentUserFn: providerApis.linear.getIssuesForCurrentUser.bind(providerApis.linear),
133
+ getLinearOrganizationFn: providerApis.linear.getLinearOrganization.bind(providerApis.linear),
134
+ getLinearTeamsForCurrentUserFn: providerApis.linear.getTeamsForCurrentUser.bind(providerApis.linear),
135
+ },
136
+ [IssuesCloudHostIntegrationId.Trello]: {
137
+ ...providersMetadata[IssuesCloudHostIntegrationId.Trello],
138
+ provider: providerApis.trello,
139
+ },
140
+ };
141
+ }
142
+ getScopesForProvider(providerId) {
143
+ return this.providers[providerId]?.scopes;
144
+ }
145
+ getProviderDomain(providerId) {
146
+ return this.providers[providerId]?.domain;
147
+ }
148
+ getProviderPullRequestsPagingMode(providerId) {
149
+ return this.providers[providerId]?.pullRequestsPagingMode;
150
+ }
151
+ getProviderIssuesPagingMode(providerId) {
152
+ return this.providers[providerId]?.issuesPagingMode;
153
+ }
154
+ providerSupportsPullRequestFilters(providerId, filters) {
155
+ return (this.providers[providerId]?.supportedPullRequestFilters != null &&
156
+ filters.every(filter => this.providers[providerId]?.supportedPullRequestFilters?.includes(filter)));
157
+ }
158
+ providerSupportsIssueFilters(providerId, filters) {
159
+ return (this.providers[providerId]?.supportedIssueFilters != null &&
160
+ filters.every(filter => this.providers[providerId]?.supportedIssueFilters?.includes(filter)));
161
+ }
162
+ isRepoIdsInput(input) {
163
+ return (input != null &&
164
+ Array.isArray(input) &&
165
+ input.every((id) => typeof id === 'string' || typeof id === 'number'));
166
+ }
167
+ async getProviderToken(provider, options) {
168
+ const providerDescriptor = { domain: provider.domain, scopes: provider.scopes };
169
+ try {
170
+ const authProvider = await this.authenticationService.get(provider.id);
171
+ const session = await authProvider.getSession(providerDescriptor, {
172
+ createIfNeeded: options?.createSessionIfNeeded,
173
+ });
174
+ if (session == null) {
175
+ return undefined;
176
+ }
177
+ return toTokenWithInfo(provider.id, session);
178
+ }
179
+ catch {
180
+ return undefined;
181
+ }
182
+ }
183
+ getAzurePATForOAuthToken(oauthToken) {
184
+ return base64(`PAT:${oauthToken}`);
185
+ }
186
+ async ensureProviderTokenAndFunction(tokenOptInfo, providerFn) {
187
+ const providerId = tokenOptInfo.providerId;
188
+ const provider = this.providers[providerId];
189
+ if (provider == null) {
190
+ throw new Error(`Provider with id ${providerId} not registered`);
191
+ }
192
+ if (providerId !== provider.id) {
193
+ throw new Error(`Provider id mismatch: expected ${providerId} but got ${provider.id}`);
194
+ }
195
+ const tokenWithInfo = tokenOptInfo?.accessToken
196
+ ? tokenOptInfo
197
+ : await this.getProviderToken(provider);
198
+ if (tokenWithInfo == null) {
199
+ throw new Error(`Not connected to provider ${providerId}`);
200
+ }
201
+ if (provider[providerFn] == null) {
202
+ throw new Error(`Provider with id ${providerId} does not support function: ${providerFn}`);
203
+ }
204
+ return { provider: provider, tokenWithInfo: tokenWithInfo };
205
+ }
206
+ handleProviderError(tokenWithInfo, error) {
207
+ const { accessToken: token, ...tokenInfo } = tokenWithInfo;
208
+ const providerId = tokenWithInfo.providerId;
209
+ const provider = this.providers[providerId];
210
+ if (provider == null) {
211
+ throw new Error(`Provider with id ${providerId} not registered`);
212
+ }
213
+ if (error?.response?.status != null) {
214
+ switch (error.response.status) {
215
+ case 404: // Not found
216
+ case 410: // Gone
217
+ case 422: // Unprocessable Entity
218
+ throw new RequestNotFoundError(error);
219
+ case 401: // Unauthorized
220
+ if (error.message?.includes('rate limit')) {
221
+ let resetAt;
222
+ const reset = error.response?.headers?.['x-ratelimit-reset'];
223
+ if (reset != null) {
224
+ resetAt = parseInt(reset, 10);
225
+ if (Number.isNaN(resetAt)) {
226
+ resetAt = undefined;
227
+ }
228
+ }
229
+ throw new RequestRateLimitError(error, token, resetAt);
230
+ }
231
+ throw new AuthenticationError(tokenInfo, AuthenticationErrorReason.Unauthorized, error);
232
+ case 403: // Forbidden
233
+ throw new AuthenticationError(tokenInfo, AuthenticationErrorReason.Forbidden, error);
234
+ case 429: {
235
+ // Too Many Requests
236
+ let resetAt;
237
+ const reset = error.response.headers?.['x-ratelimit-reset'];
238
+ if (reset != null) {
239
+ resetAt = parseInt(reset, 10);
240
+ if (Number.isNaN(resetAt)) {
241
+ resetAt = undefined;
242
+ }
243
+ }
244
+ throw new RequestRateLimitError(error, token, resetAt);
245
+ }
246
+ default:
247
+ if (error.response.status >= 400 && error.response.status < 500) {
248
+ throw new RequestClientError(error);
249
+ }
250
+ }
251
+ }
252
+ throw error;
253
+ }
254
+ async getPagedResult(args, providerFn, tokenWithInfo, cursor = '{}', isPAT = false, baseUrl) {
255
+ let cursorInfo;
256
+ try {
257
+ cursorInfo = JSON.parse(cursor);
258
+ }
259
+ catch {
260
+ cursorInfo = {};
261
+ }
262
+ const cursorValue = cursorInfo.value;
263
+ const cursorType = cursorInfo.type;
264
+ let cursorOrPage = {};
265
+ if (cursorType === 'page') {
266
+ cursorOrPage = { page: cursorValue };
267
+ }
268
+ else if (cursorType === 'cursor') {
269
+ cursorOrPage = { cursor: cursorValue };
270
+ }
271
+ const input = {
272
+ ...args,
273
+ ...cursorOrPage,
274
+ };
275
+ try {
276
+ const result = await providerFn?.(input, {
277
+ token: tokenWithInfo.accessToken,
278
+ isPAT: isPAT,
279
+ baseUrl: baseUrl,
280
+ });
281
+ if (result == null) {
282
+ return { values: [] };
283
+ }
284
+ const hasMore = result.pageInfo?.hasNextPage ?? false;
285
+ let nextCursor = '{}';
286
+ if (result.pageInfo?.endCursor != null) {
287
+ nextCursor = JSON.stringify({ value: result.pageInfo?.endCursor, type: 'cursor' });
288
+ }
289
+ else if (result.pageInfo?.nextPage != null) {
290
+ nextCursor = JSON.stringify({ value: result.pageInfo?.nextPage, type: 'page' });
291
+ }
292
+ return {
293
+ values: result.data,
294
+ paging: {
295
+ cursor: nextCursor,
296
+ more: hasMore,
297
+ },
298
+ };
299
+ }
300
+ catch (e) {
301
+ return this.handleProviderError(tokenWithInfo, e);
302
+ }
303
+ }
304
+ async getRepo(tokenOptInfo, owner, name, project, options) {
305
+ const providerId = tokenOptInfo.providerId;
306
+ if (providerId === GitCloudHostIntegrationId.AzureDevOps && project != null) {
307
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getRepoOfProjectFn');
308
+ const token = tokenWithInfo.accessToken;
309
+ try {
310
+ const result = await provider['getRepoOfProjectFn']?.({ namespace: owner, name: name, project: project }, { token: token, isPAT: options?.isPAT, baseUrl: options?.baseUrl });
311
+ return result?.data;
312
+ }
313
+ catch (e) {
314
+ return this.handleProviderError(tokenWithInfo, e);
315
+ }
316
+ }
317
+ else {
318
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getRepoFn');
319
+ const token = tokenWithInfo.accessToken;
320
+ try {
321
+ const result = await provider['getRepoFn']?.({ namespace: owner, name: name, project: project }, { token: token, isPAT: options?.isPAT, baseUrl: options?.baseUrl });
322
+ return result?.data;
323
+ }
324
+ catch (e) {
325
+ return this.handleProviderError(tokenWithInfo, e);
326
+ }
327
+ }
328
+ }
329
+ async getCurrentUser(tokenOptInfo, options) {
330
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getCurrentUserFn');
331
+ const token = tokenWithInfo.accessToken;
332
+ try {
333
+ return (await provider.getCurrentUserFn?.({}, { token: token, isPAT: options?.isPAT, baseUrl: options?.baseUrl }))?.data;
334
+ }
335
+ catch (e) {
336
+ return this.handleProviderError(tokenWithInfo, e);
337
+ }
338
+ }
339
+ async getCurrentUserForInstance(tokenOptInfo, namespace, options) {
340
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getCurrentUserForInstanceFn');
341
+ const token = tokenWithInfo.accessToken;
342
+ return (await provider.getCurrentUserForInstanceFn?.({ namespace: namespace }, { token: token, isPAT: options?.isPAT, baseUrl: options?.baseUrl }))?.data;
343
+ }
344
+ async getCurrentUserForResource(tokenOptInfo, resourceId, options) {
345
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getCurrentUserForResourceFn');
346
+ const token = tokenWithInfo.accessToken;
347
+ try {
348
+ return (await provider.getCurrentUserForResourceFn?.({ resourceId: resourceId }, { token: token, isPAT: options?.isPAT, baseUrl: options?.baseUrl }))?.data;
349
+ }
350
+ catch (e) {
351
+ return this.handleProviderError(tokenWithInfo, e);
352
+ }
353
+ }
354
+ async getJiraResourcesForCurrentUser(tokenOptInfo) {
355
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getJiraResourcesForCurrentUserFn');
356
+ const token = tokenWithInfo.accessToken;
357
+ try {
358
+ return (await provider.getJiraResourcesForCurrentUserFn?.({ token: token }))?.data;
359
+ }
360
+ catch (e) {
361
+ return this.handleProviderError(tokenWithInfo, e);
362
+ }
363
+ }
364
+ async getLinearOrganization(tokenOptInfo) {
365
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getLinearOrganizationFn');
366
+ const token = tokenWithInfo.accessToken;
367
+ try {
368
+ const x = await provider.getLinearOrganizationFn?.({ token: token });
369
+ const y = x?.data;
370
+ return y;
371
+ }
372
+ catch (e) {
373
+ return this.handleProviderError(tokenWithInfo, e);
374
+ }
375
+ }
376
+ async getLinearTeamsForCurrentUser(tokenOptInfo) {
377
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getLinearTeamsForCurrentUserFn');
378
+ const token = tokenWithInfo.accessToken;
379
+ try {
380
+ return (await provider.getLinearTeamsForCurrentUserFn?.({ token: token }))?.data;
381
+ }
382
+ catch (e) {
383
+ return this.handleProviderError(tokenWithInfo, e);
384
+ }
385
+ }
386
+ async getAzureResourcesForUser(tokenOptInfo, userId, options) {
387
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getAzureResourcesForUserFn');
388
+ const token = tokenWithInfo.accessToken;
389
+ try {
390
+ return (await provider.getAzureResourcesForUserFn?.({ userId: userId }, { token: token, isPAT: options?.isPAT, baseUrl: options?.baseUrl }))?.data;
391
+ }
392
+ catch (e) {
393
+ return this.handleProviderError(tokenWithInfo, e);
394
+ }
395
+ }
396
+ async getBitbucketResourcesForCurrentUser(tokenOptInfo) {
397
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getBitbucketResourcesForCurrentUserFn');
398
+ const token = tokenWithInfo.accessToken;
399
+ try {
400
+ return (await provider.getBitbucketResourcesForCurrentUserFn?.({}, { token: token }))?.data;
401
+ }
402
+ catch (e) {
403
+ return this.handleProviderError(tokenWithInfo, e);
404
+ }
405
+ }
406
+ async getBitbucketPullRequestsAuthoredByUserForWorkspace(tokenOptInfo, userId, workspaceSlug) {
407
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getBitbucketPullRequestsAuthoredByUserForWorkspaceFn');
408
+ const token = tokenWithInfo.accessToken;
409
+ try {
410
+ return (await provider.getBitbucketPullRequestsAuthoredByUserForWorkspaceFn?.({ userId: userId, workspaceSlug: workspaceSlug }, { token: token }))?.data;
411
+ }
412
+ catch (e) {
413
+ return this.handleProviderError(tokenWithInfo, e);
414
+ }
415
+ }
416
+ async getBitbucketServerPullRequestsForCurrentUser(tokenOptInfo, baseUrl) {
417
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getBitbucketServerPullRequestsForCurrentUserFn');
418
+ const token = tokenWithInfo.accessToken;
419
+ try {
420
+ return (await provider.getBitbucketServerPullRequestsForCurrentUserFn?.({}, { token: token, baseUrl: baseUrl }))?.data;
421
+ }
422
+ catch (e) {
423
+ return this.handleProviderError(tokenWithInfo, e);
424
+ }
425
+ }
426
+ async getJiraProjectsForResources(tokenOptInfo, resourceIds) {
427
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getJiraProjectsForResourcesFn');
428
+ const token = tokenWithInfo.accessToken;
429
+ try {
430
+ return (await provider.getJiraProjectsForResourcesFn?.({ resourceIds: resourceIds }, { token: token }))
431
+ ?.data;
432
+ }
433
+ catch (e) {
434
+ return this.handleProviderError(tokenWithInfo, e);
435
+ }
436
+ }
437
+ async getAzureProjectsForResource(tokenOptInfo, namespace, options) {
438
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getAzureProjectsForResourceFn');
439
+ const token = tokenWithInfo.accessToken;
440
+ // Azure only supports PAT for this call
441
+ const azureToken = options?.isPAT ? token : this.getAzurePATForOAuthToken(token);
442
+ try {
443
+ return await this.getPagedResult({ namespace: namespace, ...options }, provider.getAzureProjectsForResourceFn, { ...tokenWithInfo, accessToken: azureToken }, options?.cursor, options?.isPAT, options?.baseUrl);
444
+ }
445
+ catch (e) {
446
+ return this.handleProviderError(tokenWithInfo, e);
447
+ }
448
+ }
449
+ async getReposForAzureProject(tokenOptInfo, namespace, project, options) {
450
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getReposForAzureProjectFn');
451
+ return this.getPagedResult({ namespace: namespace, project: project, ...options }, provider.getReposForAzureProjectFn, tokenWithInfo, options?.cursor, options?.isPAT, options?.baseUrl);
452
+ }
453
+ async getPullRequestsForRepos(tokenOptInfo, reposOrIds, options) {
454
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getPullRequestsForReposFn');
455
+ return this.getPagedResult({
456
+ ...(this.isRepoIdsInput(reposOrIds) ? { repoIds: reposOrIds } : { repos: reposOrIds }),
457
+ ...options,
458
+ }, provider.getPullRequestsForReposFn, tokenWithInfo, options?.cursor, options?.isPAT, options?.baseUrl);
459
+ }
460
+ async getPullRequestsForRepo(tokenOptInfo, repo, options) {
461
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getPullRequestsForRepoFn');
462
+ return this.getPagedResult({ repo: repo, ...options }, provider.getPullRequestsForRepoFn, tokenWithInfo, options?.cursor, options?.isPAT, options?.baseUrl);
463
+ }
464
+ async getPullRequestsForUser(tokenOptInfo, usernameOrId, options) {
465
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getPullRequestsForUserFn');
466
+ return this.getPagedResult({
467
+ ...(tokenWithInfo.providerId === GitCloudHostIntegrationId.Bitbucket
468
+ ? { userId: usernameOrId }
469
+ : { username: usernameOrId }),
470
+ ...options,
471
+ }, provider.getPullRequestsForUserFn, tokenWithInfo, options?.cursor, options?.isPAT, options?.baseUrl);
472
+ }
473
+ async getPullRequestsForAzureProjects(tokenOptInfo, projects, options) {
474
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getPullRequestsForAzureProjectsFn');
475
+ const token = tokenWithInfo.accessToken;
476
+ // Azure only supports PAT for this call
477
+ const azureToken = options?.isPAT ? token : this.getAzurePATForOAuthToken(token);
478
+ try {
479
+ return (await provider.getPullRequestsForAzureProjectsFn?.({ projects: projects, ...options }, { token: azureToken, isPAT: options?.isPAT, baseUrl: options?.baseUrl }))?.data;
480
+ }
481
+ catch (e) {
482
+ return this.handleProviderError(tokenWithInfo, e);
483
+ }
484
+ }
485
+ async mergePullRequest(tokenOptInfo, pr, options) {
486
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'mergePullRequestFn');
487
+ const token = tokenWithInfo.accessToken;
488
+ const headRef = pr.refs?.head;
489
+ if (headRef == null)
490
+ return false;
491
+ if (provider.id === GitCloudHostIntegrationId.AzureDevOps && pr.project == null) {
492
+ return false;
493
+ }
494
+ try {
495
+ await provider.mergePullRequestFn?.({
496
+ pullRequest: {
497
+ headRef: { oid: headRef.sha },
498
+ id: pr.id,
499
+ number: Number.parseInt(pr.id, 10),
500
+ repository: {
501
+ id: pr.repository.repo,
502
+ name: pr.repository.repo,
503
+ project: pr.project?.name ?? '',
504
+ owner: {
505
+ login: pr.repository.owner,
506
+ },
507
+ },
508
+ version: pr.version,
509
+ },
510
+ ...options,
511
+ }, { token: token, isPAT: options?.isPAT, baseUrl: options?.baseUrl });
512
+ return true;
513
+ }
514
+ catch (e) {
515
+ return this.handleProviderError(tokenWithInfo, e);
516
+ }
517
+ }
518
+ async getIssuesForRepos(tokenOptInfo, reposOrIds, options) {
519
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getIssuesForReposFn');
520
+ return this.getPagedResult({
521
+ ...(this.isRepoIdsInput(reposOrIds) ? { repoIds: reposOrIds } : { repos: reposOrIds }),
522
+ ...options,
523
+ }, provider.getIssuesForReposFn, tokenWithInfo, options?.cursor, options?.isPAT, options?.baseUrl);
524
+ }
525
+ async getIssuesForRepo(tokenOptInfo, repo, options) {
526
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getIssuesForRepoFn');
527
+ return this.getPagedResult({ repo: repo, ...options }, provider.getIssuesForRepoFn, tokenWithInfo, options?.cursor, options?.isPAT, options?.baseUrl);
528
+ }
529
+ async getIssuesForCurrentUser(tokenOptInfo, options) {
530
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getIssuesForCurrentUserFn');
531
+ return this.getPagedResult(options, provider.getIssuesForCurrentUserFn, tokenWithInfo, options?.cursor ?? undefined, options?.isPAT, options?.baseUrl);
532
+ }
533
+ async getIssuesForAzureProject(tokenOptInfo, namespace, project, options) {
534
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getIssuesForAzureProjectFn');
535
+ return this.getPagedResult({ namespace: namespace, project: project, ...options }, provider.getIssuesForAzureProjectFn, tokenWithInfo, options?.cursor, options?.isPAT, options?.baseUrl);
536
+ }
537
+ async getIssuesForProject(tokenOptInfo, project, resourceId, options) {
538
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getIssuesForProjectFn');
539
+ const token = tokenWithInfo.accessToken;
540
+ try {
541
+ const result = await provider.getIssuesForProjectFn?.({ projectKey: project, resourceId: resourceId, ...options }, { token: token });
542
+ return result?.data;
543
+ }
544
+ catch (e) {
545
+ return this.handleProviderError(tokenWithInfo, e);
546
+ }
547
+ }
548
+ async getIssuesForResourceForCurrentUser(tokenOptInfo, resourceId, options) {
549
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getIssuesForResourceForCurrentUserFn');
550
+ return this.getPagedResult({ resourceId: resourceId }, provider.getIssuesForResourceForCurrentUserFn, tokenWithInfo, options?.cursor, options?.isPAT, options?.baseUrl);
551
+ }
552
+ async getIssue(tokenOptInfo, input, options) {
553
+ const { provider, tokenWithInfo } = await this.ensureProviderTokenAndFunction(tokenOptInfo, 'getIssueFn');
554
+ const token = tokenWithInfo.accessToken;
555
+ try {
556
+ const result = await provider.getIssueFn?.(input, {
557
+ token: token,
558
+ isPAT: options?.isPAT,
559
+ baseUrl: options?.baseUrl,
560
+ });
561
+ return result?.data;
562
+ }
563
+ catch (e) {
564
+ return this.handleProviderError(tokenWithInfo, e);
565
+ }
566
+ }
567
+ }
568
+ // This is copied over from the shared provider library because the current version is not respecting the "forceIsFetch: true"
569
+ // option in the config and our custom fetch function isn't being wrapped by the necessary fetch wrapper. Remove this once the library
570
+ // properly wraps our custom fetch and use `forceIsFetch: true` in the config.
571
+ async function parseFetchResponseForApi(response) {
572
+ const contentType = response.headers.get('content-type') || '';
573
+ let body;
574
+ // parse the response body
575
+ if (contentType.startsWith('application/json')) {
576
+ const text = await response.text();
577
+ body = text.trim().length > 0 ? JSON.parse(text) : null;
578
+ }
579
+ else if (contentType.startsWith('text/') || contentType === '') {
580
+ body = await response.text();
581
+ }
582
+ else if (contentType.startsWith('application/vnd.github.raw+json')) {
583
+ body = await response.arrayBuffer();
584
+ }
585
+ else {
586
+ throw new Error(`Unsupported content-type: ${contentType}`);
587
+ }
588
+ const result = {
589
+ body: body,
590
+ headers: Object.fromEntries(response.headers.entries()),
591
+ status: response.status,
592
+ statusText: response.statusText,
593
+ };
594
+ // throw an error if the response is not ok
595
+ if (!response.ok) {
596
+ const error = new Error(response.statusText);
597
+ Object.assign(error, { response: result });
598
+ throw error;
599
+ }
600
+ return result;
601
+ }
602
+ //# sourceMappingURL=providersApi.js.map