@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,627 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { gate } from '../../utils/decorators/gate.js';
8
+ import { debug, trace } from '../../utils/decorators/log.js';
9
+ import { fromDisposables } from '../../utils/disposable.js';
10
+ import { Emitter } from '../../utils/event.js';
11
+ import { filterMap, flatten } from '../../utils/iterable.js';
12
+ import { getScopedLogger } from '../../utils/logger.scoped.js';
13
+ import { getSupportedCloudIntegrationIds, isSupportedCloudIntegrationId, toIntegrationId, } from './authentication/models.js';
14
+ import { GitCloudHostIntegrationId, GitSelfManagedHostIntegrationId, IssuesCloudHostIntegrationId, } from './constants.js';
15
+ import { createApiClients } from './providers/apiClients.js';
16
+ import { convertRemoteProviderIdToIntegrationId, getIntegrationIdForRemote, isCloudGitSelfManagedHostIntegrationId, isGitCloudHostIntegrationId, isGitSelfManagedHostIntegrationId, } from './utils/integration.utils.js';
17
+ export class IntegrationService {
18
+ authenticationService;
19
+ configuredIntegrationService;
20
+ ctx;
21
+ get onDidChange() {
22
+ return this.configuredIntegrationService.onDidChange;
23
+ }
24
+ _onDidChangeConnectionState = new Emitter();
25
+ get onDidChangeConnectionState() {
26
+ return this._onDidChangeConnectionState.event;
27
+ }
28
+ _connectedCache = new Set();
29
+ _disposable;
30
+ _integrations = new Map();
31
+ _onDidChangeIntegrationConnection = new Emitter();
32
+ _apiDisposables = [];
33
+ _apis;
34
+ /** The package-built, memoized per-provider API clients (was injected via the now-removed `ctx.apis`). */
35
+ get apis() {
36
+ return (this._apis ??= createApiClients(this.ctx, this._apiDisposables));
37
+ }
38
+ /** The shared `GitHubApi` instance — also consumed by the host's GitHub git provider (one instance). */
39
+ get github() {
40
+ return this.apis.github;
41
+ }
42
+ constructor(authenticationService, configuredIntegrationService, ctx) {
43
+ this.authenticationService = authenticationService;
44
+ this.configuredIntegrationService = configuredIntegrationService;
45
+ this.ctx = ctx;
46
+ this._disposable = fromDisposables(ctx.config.onDidChange(e => {
47
+ if (e.remotes) {
48
+ this._ignoreSSLErrors.clear();
49
+ }
50
+ }), ctx.account.onDidChangeSessions(this.onAuthenticationSessionsChanged, this), ctx.account.onDidCheckIn(this.onUserCheckedIn, this), ctx.account.onDidChange(this.onSubscriptionChanged, this), this._onDidChangeIntegrationConnection.event(this.onIntegrationConnectionChanged, this));
51
+ }
52
+ dispose() {
53
+ this._integrations.forEach(i => i.dispose());
54
+ this._integrations.clear();
55
+ this._disposable?.dispose();
56
+ // The facade (`createIntegrationManager`) hands us sole ownership of these, so disposing the manager
57
+ // must tear them down too — otherwise cached auth providers (+ their host session listeners) and the
58
+ // configured-integrations emitter outlive the manager.
59
+ this.authenticationService.dispose();
60
+ this.configuredIntegrationService.dispose();
61
+ this._onDidChangeConnectionState.dispose();
62
+ this._onDidChangeIntegrationConnection.dispose();
63
+ this._apiDisposables.forEach(d => d.dispose());
64
+ }
65
+ async connectCloudIntegrations(connect, source) {
66
+ const scope = getScopedLogger();
67
+ const integrationIds = connect?.integrationIds;
68
+ this.ctx.hooks?.connection?.onStarted?.({ integrationIds: integrationIds }, source);
69
+ const connectedIntegrations = new Set();
70
+ if (integrationIds?.length) {
71
+ if (connect?.skipIfConnected && !connect?.skipPreSync) {
72
+ await this.syncCloudIntegrations(true);
73
+ }
74
+ for (const integrationId of integrationIds) {
75
+ try {
76
+ const integration = await this.get(integrationId);
77
+ if (integration == null)
78
+ continue;
79
+ if (integration.maybeConnected ?? (await integration.isConnected())) {
80
+ connectedIntegrations.add(integrationId);
81
+ }
82
+ }
83
+ catch (ex) {
84
+ scope?.warn(`Failed to get integration ${integrationId} by its ID. Consider it as not-connected and ignore. Error message: ${ex.message}`, scope);
85
+ }
86
+ }
87
+ if (connect?.skipIfConnected && connectedIntegrations.size === integrationIds.length) {
88
+ return true;
89
+ }
90
+ }
91
+ // The host owns the GK-Dev connect round-trip end-to-end (URL/query, exchange-token-vs-redirect,
92
+ // open, await its OAuth callback, sign-in + redeem). The package only orchestrates state/sync/hooks.
93
+ if (!(await this.ctx.account.connect({ integrationIds: integrationIds, source: source }))) {
94
+ return false;
95
+ }
96
+ const connected = await this.syncCloudIntegrations(true);
97
+ this.ctx.hooks?.connection?.onCompleted?.({
98
+ integrationIds: integrationIds,
99
+ connectedIntegrationIds: connected != null ? [...connected.values()] : undefined,
100
+ }, source);
101
+ if (integrationIds != null) {
102
+ for (const integrationId of integrationIds) {
103
+ const integration = await this.get(integrationId);
104
+ if (integration == null)
105
+ continue;
106
+ const connected = integration.maybeConnected ?? (await integration.isConnected());
107
+ if (connected && !connectedIntegrations.has(integrationId)) {
108
+ return true;
109
+ }
110
+ }
111
+ return false;
112
+ }
113
+ return true;
114
+ }
115
+ async get(id, domain) {
116
+ let integration = this.getCached(id, domain);
117
+ if (integration == null) {
118
+ switch (id) {
119
+ case GitCloudHostIntegrationId.GitHub:
120
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/github.js')).GitHubIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection);
121
+ break;
122
+ case GitSelfManagedHostIntegrationId.CloudGitHubEnterprise:
123
+ if (domain == null) {
124
+ integration = this.findCachedById(id);
125
+ // return immediately in order to not to cache it after the "switch" block:
126
+ if (integration != null)
127
+ return integration;
128
+ const configured = this.getConfigured(GitSelfManagedHostIntegrationId.CloudGitHubEnterprise);
129
+ if (configured.length) {
130
+ const { domain: configuredDomain } = configured[0];
131
+ if (configuredDomain == null)
132
+ throw new Error(`Domain is required for '${id}' integration`);
133
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/github.js')).GitHubEnterpriseIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection, configuredDomain);
134
+ // assign domain because it's part of caching key:
135
+ domain = configuredDomain;
136
+ break;
137
+ }
138
+ return undefined;
139
+ }
140
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/github.js')).GitHubEnterpriseIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection, domain);
141
+ break;
142
+ case GitCloudHostIntegrationId.GitLab:
143
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/gitlab.js')).GitLabIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection);
144
+ break;
145
+ case GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted:
146
+ if (domain == null) {
147
+ integration = this.findCachedById(id);
148
+ // return immediately in order to not to cache it after the "switch" block:
149
+ if (integration != null)
150
+ return integration;
151
+ const configured = this.getConfigured(GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted);
152
+ if (configured.length) {
153
+ const { domain: configuredDomain } = configured[0];
154
+ if (configuredDomain == null)
155
+ throw new Error(`Domain is required for '${id}' integration`);
156
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/gitlab.js')).GitLabSelfHostedIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection, configuredDomain);
157
+ // assign domain because it's part of caching key:
158
+ domain = configuredDomain;
159
+ break;
160
+ }
161
+ return undefined;
162
+ }
163
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/gitlab.js')).GitLabSelfHostedIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection, domain);
164
+ break;
165
+ case GitCloudHostIntegrationId.Bitbucket:
166
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/bitbucket.js')).BitbucketIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection);
167
+ break;
168
+ case GitSelfManagedHostIntegrationId.BitbucketServer:
169
+ if (domain == null) {
170
+ integration = this.findCachedById(id);
171
+ // return immediately in order to not to cache it after the "switch" block:
172
+ if (integration != null)
173
+ return integration;
174
+ const configured = this.getConfigured(GitSelfManagedHostIntegrationId.BitbucketServer);
175
+ if (configured.length) {
176
+ const { domain: configuredDomain } = configured[0];
177
+ if (configuredDomain == null)
178
+ throw new Error(`Domain is required for '${id}' integration`);
179
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/bitbucket-server.js')).BitbucketServerIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection, configuredDomain);
180
+ // assign domain because it's part of caching key:
181
+ domain = configuredDomain;
182
+ break;
183
+ }
184
+ return undefined;
185
+ }
186
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/bitbucket-server.js')).BitbucketServerIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection, domain);
187
+ break;
188
+ case GitCloudHostIntegrationId.AzureDevOps:
189
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/azureDevOps.js')).AzureDevOpsIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection);
190
+ break;
191
+ case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
192
+ if (domain == null) {
193
+ integration = this.findCachedById(id);
194
+ // return immediately in order to not to cache it after the "switch" block:
195
+ if (integration != null)
196
+ return integration;
197
+ const configured = this.getConfigured(GitSelfManagedHostIntegrationId.AzureDevOpsServer);
198
+ if (configured.length) {
199
+ const { domain: configuredDomain } = configured[0];
200
+ if (configuredDomain == null)
201
+ throw new Error(`Domain is required for '${id}' integration`);
202
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/azureDevOps.js')).AzureDevOpsServerIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection, configuredDomain);
203
+ // assign domain because it's part of caching key:
204
+ domain = configuredDomain;
205
+ break;
206
+ }
207
+ return undefined;
208
+ }
209
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/azureDevOps.js')).AzureDevOpsServerIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection, domain);
210
+ break;
211
+ case IssuesCloudHostIntegrationId.Jira:
212
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/jira.js')).JiraIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection);
213
+ break;
214
+ case IssuesCloudHostIntegrationId.Linear:
215
+ integration = new (await import(/* webpackChunkName: "integrations" */ './providers/linear.js')).LinearIntegration(this.ctx, this.authenticationService, this.getProvidersApi.bind(this), this._onDidChangeIntegrationConnection);
216
+ break;
217
+ default:
218
+ throw new Error(`Integration with '${id}' is not supported`);
219
+ }
220
+ this._integrations.set(this.getCacheKey(id, domain), integration);
221
+ }
222
+ return integration;
223
+ }
224
+ getConfigured(id, options) {
225
+ return this.configuredIntegrationService.getConfigured(id, options);
226
+ }
227
+ /**
228
+ * Returns the connected integration for a `GitRemote`, if any.
229
+ * Internal counterpart to the host's `getRemoteIntegration(remote)` helper.
230
+ */
231
+ async getByRemote(remote) {
232
+ if (remote?.provider == null)
233
+ return undefined;
234
+ const integrationId = getIntegrationIdForRemote(remote.provider);
235
+ if (integrationId == null)
236
+ return undefined;
237
+ const integration = await this.get(integrationId, remote.provider?.domain);
238
+ return integration?.type === 'git' ? integration : undefined;
239
+ }
240
+ async getMyIssues(integrationIds, options) {
241
+ const integrations = new Map();
242
+ const hostingIntegrationIds = integrationIds?.filter(id => id in GitCloudHostIntegrationId || id in GitSelfManagedHostIntegrationId);
243
+ const openRemotesByIntegrationId = new Map();
244
+ let hasOpenAzureRepository = false;
245
+ for (const remote of await this.ctx.repositories.getOpenRemotes()) {
246
+ const remoteIntegration = await this.getByRemote(remote);
247
+ if (remoteIntegration == null)
248
+ continue;
249
+ if (remoteIntegration.id === GitCloudHostIntegrationId.AzureDevOps) {
250
+ hasOpenAzureRepository = true;
251
+ }
252
+ for (const integrationId of hostingIntegrationIds?.length
253
+ ? hostingIntegrationIds
254
+ : [...Object.values(GitCloudHostIntegrationId), ...Object.values(GitSelfManagedHostIntegrationId)]) {
255
+ if (remoteIntegration.id === integrationId &&
256
+ remote.provider?.owner != null &&
257
+ remote.provider?.repoName != null) {
258
+ const descriptor = {
259
+ key: `${remote.provider.owner}/${remote.provider.repoName}`,
260
+ owner: remote.provider.owner,
261
+ name: remote.provider.repoName,
262
+ };
263
+ if (openRemotesByIntegrationId.has(integrationId)) {
264
+ openRemotesByIntegrationId.get(integrationId)?.push(descriptor);
265
+ }
266
+ else {
267
+ openRemotesByIntegrationId.set(integrationId, [descriptor]);
268
+ }
269
+ }
270
+ }
271
+ }
272
+ for (const integrationId of integrationIds?.length
273
+ ? integrationIds
274
+ : [
275
+ ...Object.values(GitCloudHostIntegrationId),
276
+ ...Object.values(IssuesCloudHostIntegrationId),
277
+ ...Object.values(GitSelfManagedHostIntegrationId),
278
+ ]) {
279
+ const integration = await this.get(integrationId);
280
+ const isInvalidIntegration = (options?.openRepositoriesOnly &&
281
+ integrationId !== GitCloudHostIntegrationId.AzureDevOps &&
282
+ (isGitCloudHostIntegrationId(integrationId) || isGitSelfManagedHostIntegrationId(integrationId)) &&
283
+ !openRemotesByIntegrationId.has(integrationId)) ||
284
+ (integrationId === GitCloudHostIntegrationId.AzureDevOps && !hasOpenAzureRepository);
285
+ if (integration == null || isInvalidIntegration) {
286
+ continue;
287
+ }
288
+ integrations.set(integration, options?.openRepositoriesOnly && !isInvalidIntegration
289
+ ? openRemotesByIntegrationId.get(integrationId)
290
+ : undefined);
291
+ }
292
+ if (integrations.size === 0)
293
+ return undefined;
294
+ return this.getMyIssuesCore(integrations, options?.cancellation);
295
+ }
296
+ async getMyIssuesCore(integrations, cancellation) {
297
+ const promises = [];
298
+ for (const [integration, repos] of integrations) {
299
+ if (integration == null)
300
+ continue;
301
+ promises.push(integration.searchMyIssues(repos, cancellation));
302
+ }
303
+ const results = await Promise.allSettled(promises);
304
+ return [...flatten(filterMap(results, r => (r.status === 'fulfilled' ? r.value : undefined)))];
305
+ }
306
+ async getMyIssuesForRemotes(remoteOrRemotes) {
307
+ if (!Array.isArray(remoteOrRemotes)) {
308
+ remoteOrRemotes = [remoteOrRemotes];
309
+ }
310
+ if (!remoteOrRemotes.length)
311
+ return undefined;
312
+ if (remoteOrRemotes.length === 1) {
313
+ const [remote] = remoteOrRemotes;
314
+ if (remote?.provider == null)
315
+ return undefined;
316
+ const integration = await this.getByRemote(remote);
317
+ return integration?.searchMyIssues(remote.provider.repoDesc);
318
+ }
319
+ const integrations = new Map();
320
+ for (const remote of remoteOrRemotes) {
321
+ if (remote?.provider == null)
322
+ continue;
323
+ const integration = await this.getByRemote(remote);
324
+ if (integration == null)
325
+ continue;
326
+ let repos = integrations.get(integration);
327
+ if (repos == null) {
328
+ repos = [];
329
+ integrations.set(integration, repos);
330
+ }
331
+ repos.push(remote.provider.repoDesc);
332
+ }
333
+ return this.getMyIssuesCore(integrations);
334
+ }
335
+ async getMyCurrentAccounts(integrationIds) {
336
+ const accounts = new Map();
337
+ await Promise.allSettled(integrationIds.map(async (integrationId) => {
338
+ const integration = await this.get(integrationId);
339
+ if (integration == null)
340
+ return;
341
+ const account = await integration.getCurrentAccount();
342
+ if (account) {
343
+ accounts.set(integrationId, account);
344
+ }
345
+ }));
346
+ return accounts;
347
+ }
348
+ async getMyPullRequests(integrationIds, cancellation, silent) {
349
+ const integrations = new Map();
350
+ for (const integrationId of integrationIds?.length
351
+ ? integrationIds
352
+ : Object.values(GitCloudHostIntegrationId)) {
353
+ let integration;
354
+ try {
355
+ integration = await this.get(integrationId);
356
+ }
357
+ catch { }
358
+ if (integration == null)
359
+ continue;
360
+ integrations.set(integration, undefined);
361
+ }
362
+ if (integrations.size === 0)
363
+ return undefined;
364
+ return this.getMyPullRequestsCore(integrations, cancellation, silent);
365
+ }
366
+ async getMyPullRequestsCore(integrations, cancellation, silent) {
367
+ const start = performance.now();
368
+ const promises = [];
369
+ for (const [integration, repos] of integrations) {
370
+ if (integration == null)
371
+ continue;
372
+ promises.push(integration.searchMyPullRequests(repos, cancellation, silent));
373
+ }
374
+ const results = await Promise.allSettled(promises);
375
+ const successfulResults = [
376
+ ...flatten(filterMap(results, r => r.status === 'fulfilled' && r.value?.value != null ? r.value.value : undefined)),
377
+ ];
378
+ const errors = [
379
+ ...filterMap(results, r => r.status === 'fulfilled' && r.value?.error != null ? r.value.error : undefined),
380
+ ];
381
+ const error = errors.length === 0
382
+ ? undefined
383
+ : errors.length === 1
384
+ ? errors[0]
385
+ : new AggregateError(errors, 'Failed to get some pull requests');
386
+ return {
387
+ value: successfulResults,
388
+ error: error,
389
+ duration: performance.now() - start,
390
+ };
391
+ }
392
+ async getMyPullRequestsForRemotes(remoteOrRemotes) {
393
+ if (!Array.isArray(remoteOrRemotes)) {
394
+ remoteOrRemotes = [remoteOrRemotes];
395
+ }
396
+ if (!remoteOrRemotes.length)
397
+ return undefined;
398
+ if (remoteOrRemotes.length === 1) {
399
+ const [remote] = remoteOrRemotes;
400
+ if (remote?.provider == null)
401
+ return undefined;
402
+ const integration = await this.getByRemote(remote);
403
+ return integration?.searchMyPullRequests(remote.provider.repoDesc);
404
+ }
405
+ const integrations = new Map();
406
+ for (const remote of remoteOrRemotes) {
407
+ if (remote?.provider == null)
408
+ continue;
409
+ const integration = await this.getByRemote(remote);
410
+ if (integration == null)
411
+ continue;
412
+ let repos = integrations.get(integration);
413
+ if (repos == null) {
414
+ repos = [];
415
+ integrations.set(integration, repos);
416
+ }
417
+ repos.push(remote.provider.repoDesc);
418
+ }
419
+ return this.getMyPullRequestsCore(integrations);
420
+ }
421
+ _ignoreSSLErrors = new Map();
422
+ ignoreSSLErrors(integration) {
423
+ if (this.ctx.http.isWeb)
424
+ return false;
425
+ let ignoreSSLErrors = this._ignoreSSLErrors.get(integration.id);
426
+ if (ignoreSSLErrors === undefined) {
427
+ const cfg = this.ctx.config
428
+ .getRemoteConfigs()
429
+ .find(remote => remote.type.toLowerCase() === integration.id && remote.domain === integration.domain);
430
+ ignoreSSLErrors = cfg?.ignoreSSLErrors ?? false;
431
+ this._ignoreSSLErrors.set(integration.id, ignoreSSLErrors);
432
+ }
433
+ return ignoreSSLErrors;
434
+ }
435
+ async manageCloudIntegrations(source) {
436
+ this.ctx.hooks?.connection?.onManaged?.(source);
437
+ // The host owns the GK-Dev manage interaction (sign-in if needed, open settings, wait for the user
438
+ // to return); it resolves `true` once they're back, then we re-sync + report.
439
+ if (!(await this.ctx.account.openManagement(source)))
440
+ return;
441
+ const connected = await this.syncCloudIntegrations(true);
442
+ this.ctx.hooks?.connection?.onCompleted?.({
443
+ integrationIds: undefined,
444
+ connectedIntegrationIds: connected != null ? [...connected.values()] : undefined,
445
+ }, source);
446
+ }
447
+ async reset() {
448
+ for (const integration of this._integrations.values()) {
449
+ await integration.reset();
450
+ }
451
+ await this.authenticationService.reset();
452
+ await this.ctx.storage.deleteWithPrefix('provider:authentication:skip');
453
+ queueMicrotask(() => void this.syncCloudIntegrations(true));
454
+ }
455
+ supports(remoteProviderId) {
456
+ return convertRemoteProviderIdToIntegrationId(remoteProviderId) != null;
457
+ }
458
+ onAuthenticationSessionsChanged(e) {
459
+ for (const integration of this._integrations.values()) {
460
+ if (e.provider.id === integration.authProvider.id) {
461
+ integration.refresh();
462
+ }
463
+ }
464
+ }
465
+ onIntegrationConnectionChanged(e) {
466
+ const { integration, key, reason } = e;
467
+ if (reason === 'connected') {
468
+ // Only fire events if the key is being connected for the first time
469
+ if (this._connectedCache.has(key))
470
+ return;
471
+ this._connectedCache.add(key);
472
+ }
473
+ else {
474
+ // Probably shouldn't bother to fire the event if we don't already think we are connected, but better to be safe
475
+ // if (!_connectedCache.has(key)) return;
476
+ this._connectedCache.delete(key);
477
+ }
478
+ const connected = reason === 'connected';
479
+ if (integration.type === 'git') {
480
+ this.ctx.hooks?.connection?.onStateChanged?.({
481
+ id: integration.id,
482
+ key: key,
483
+ connected: connected,
484
+ kind: isSupportedCloudIntegrationId(integration.id) ? 'hosting' : 'remote',
485
+ });
486
+ }
487
+ else {
488
+ this.ctx.hooks?.connection?.onStateChanged?.({
489
+ id: integration.id,
490
+ key: key,
491
+ connected: connected,
492
+ kind: 'issue',
493
+ });
494
+ }
495
+ setTimeout(() => this._onDidChangeConnectionState.fire({ key: key, reason: reason }), 250);
496
+ }
497
+ async onSubscriptionChanged() {
498
+ // When the account goes away, disconnect all connected cloud integrations. Mirrors the host's
499
+ // historical `account == null` check (the host forwards `onDidChange` without a payload).
500
+ if ((await this.ctx.account.getAccount()) == null) {
501
+ void this.syncCloudIntegrations(false);
502
+ }
503
+ }
504
+ onUserCheckedIn(e) {
505
+ void this.syncCloudIntegrations(Boolean(e?.force));
506
+ }
507
+ _providersApi;
508
+ async getProvidersApi() {
509
+ if (this._providersApi == null) {
510
+ const authenticationService = this.authenticationService;
511
+ async function load() {
512
+ return new (await import(/* webpackChunkName: "integrations" */ './providers/providersApi.js')).ProvidersApi(authenticationService);
513
+ }
514
+ this._providersApi = load();
515
+ }
516
+ return this._providersApi;
517
+ }
518
+ getCached(id, domain) {
519
+ return this._integrations.get(this.getCacheKey(id, domain));
520
+ }
521
+ getCacheKey(id, domain) {
522
+ return isGitSelfManagedHostIntegrationId(id) ? `${id}:${domain}` : id;
523
+ }
524
+ async *getSupportedCloudIntegrations(domainsById) {
525
+ for (const id of getSupportedCloudIntegrationIds()) {
526
+ if (isCloudGitSelfManagedHostIntegrationId(id) && !domainsById.has(id)) {
527
+ // Try getting whatever we have now because we will need to disconnect
528
+ const integration = await this.get(id, undefined);
529
+ if (integration != null) {
530
+ yield integration;
531
+ }
532
+ }
533
+ else {
534
+ const integration = await this.get(id, domainsById.get(id));
535
+ if (integration != null) {
536
+ yield integration;
537
+ }
538
+ }
539
+ }
540
+ }
541
+ findCachedById(id) {
542
+ const key = this.getCacheKey(id, '');
543
+ for (const [k, integration] of this._integrations) {
544
+ if (k.startsWith(key)) {
545
+ return integration;
546
+ }
547
+ }
548
+ return undefined;
549
+ }
550
+ async syncCloudIntegrations(forceConnect) {
551
+ const scope = getScopedLogger();
552
+ const connectedIntegrations = new Set();
553
+ const domainsById = new Map();
554
+ const loggedIn = (await this.ctx.account.getAccount()) != null;
555
+ if (loggedIn) {
556
+ const connections = await this.authenticationService.cloudIntegrations.getConnections();
557
+ if (connections == null)
558
+ return;
559
+ connections.map(p => {
560
+ const integrationId = toIntegrationId[p.provider];
561
+ // GKDev includes some integrations like "google" that we don't support
562
+ if (integrationId == null)
563
+ return;
564
+ connectedIntegrations.add(toIntegrationId[p.provider]);
565
+ if (p.domain?.length > 0) {
566
+ try {
567
+ const host = new URL(p.domain).host;
568
+ domainsById.set(integrationId, host);
569
+ }
570
+ catch {
571
+ scope?.warn(`Invalid domain for ${integrationId} integration: ${p.domain}. Ignoring.`);
572
+ }
573
+ }
574
+ });
575
+ }
576
+ for await (const integration of this.getSupportedCloudIntegrations(domainsById)) {
577
+ await integration.syncCloudConnection(connectedIntegrations.has(integration.id) ? 'connected' : 'disconnected', forceConnect);
578
+ }
579
+ this.ctx.hooks?.connection?.onConnectedChanged?.({
580
+ integrationIds: [...connectedIntegrations.values()],
581
+ });
582
+ return connectedIntegrations;
583
+ }
584
+ }
585
+ __decorate([
586
+ debug()
587
+ ], IntegrationService.prototype, "connectCloudIntegrations", null);
588
+ __decorate([
589
+ debug({
590
+ args: integrationIds => ({ integrationIds: integrationIds?.length ? integrationIds.join(',') : '<undefined>' }),
591
+ })
592
+ ], IntegrationService.prototype, "getMyIssues", null);
593
+ __decorate([
594
+ trace({
595
+ args: (remoteOrRemotes) => ({
596
+ remoteOrRemotes: Array.isArray(remoteOrRemotes) ? remoteOrRemotes.map(rp => rp.name) : remoteOrRemotes.name,
597
+ }),
598
+ })
599
+ ], IntegrationService.prototype, "getMyIssuesForRemotes", null);
600
+ __decorate([
601
+ debug({
602
+ args: integrationIds => ({ integrationIds: integrationIds?.length ? integrationIds.join(',') : '<undefined>' }),
603
+ })
604
+ ], IntegrationService.prototype, "getMyCurrentAccounts", null);
605
+ __decorate([
606
+ debug({
607
+ args: integrationIds => ({ integrationIds: integrationIds?.length ? integrationIds.join(',') : '<undefined>' }),
608
+ })
609
+ ], IntegrationService.prototype, "getMyPullRequests", null);
610
+ __decorate([
611
+ trace({
612
+ args: (remoteOrRemotes) => ({
613
+ remoteOrRemotes: Array.isArray(remoteOrRemotes) ? remoteOrRemotes.map(rp => rp.name) : remoteOrRemotes.name,
614
+ }),
615
+ })
616
+ ], IntegrationService.prototype, "getMyPullRequestsForRemotes", null);
617
+ __decorate([
618
+ debug()
619
+ ], IntegrationService.prototype, "manageCloudIntegrations", null);
620
+ __decorate([
621
+ debug()
622
+ ], IntegrationService.prototype, "reset", null);
623
+ __decorate([
624
+ gate(),
625
+ trace()
626
+ ], IntegrationService.prototype, "syncCloudIntegrations", null);
627
+ //# sourceMappingURL=integrationService.js.map