@gitkraken/core-gitlens 0.12.0 → 0.14.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 (198) hide show
  1. package/CHANGELOG.md +78 -1
  2. package/dist/git/cache.d.ts +84 -29
  3. package/dist/git/cache.js +188 -54
  4. package/dist/git/cache.js.map +1 -1
  5. package/dist/git/features.d.ts +1 -1
  6. package/dist/git/features.js +5 -0
  7. package/dist/git/features.js.map +1 -1
  8. package/dist/git/models/branch.d.ts +20 -2
  9. package/dist/git/models/branch.js +28 -6
  10. package/dist/git/models/branch.js.map +1 -1
  11. package/dist/git/models/reference.d.ts +3 -0
  12. package/dist/git/models/status.js +2 -2
  13. package/dist/git/models/worktree.d.ts +4 -1
  14. package/dist/git/models/worktree.js +4 -2
  15. package/dist/git/models/worktree.js.map +1 -1
  16. package/dist/git/parsers/diffParser.js +1 -1
  17. package/dist/git/providers/branches.d.ts +73 -8
  18. package/dist/git/providers/operations.d.ts +3 -2
  19. package/dist/git/providers/pausedOperations.d.ts +6 -0
  20. package/dist/git/providers/provider.d.ts +45 -2
  21. package/dist/git/providers/revision.d.ts +17 -3
  22. package/dist/git/providers/status.d.ts +8 -2
  23. package/dist/git/remotes/azure-devops.js +61 -53
  24. package/dist/git/remotes/azure-devops.js.map +1 -1
  25. package/dist/git/run.types.d.ts +12 -0
  26. package/dist/git/service.d.ts +8 -5
  27. package/dist/git/service.js +16 -8
  28. package/dist/git/service.js.map +1 -1
  29. package/dist/git/utils/branch.utils.d.ts +12 -2
  30. package/dist/git/utils/branch.utils.js +49 -5
  31. package/dist/git/utils/branch.utils.js.map +1 -1
  32. package/dist/git/utils/reference.utils.d.ts +1 -0
  33. package/dist/git/utils/reference.utils.js.map +1 -1
  34. package/dist/git/watching/changeEvent.d.ts +13 -2
  35. package/dist/git/watching/changeEvent.js +17 -3
  36. package/dist/git/watching/changeEvent.js.map +1 -1
  37. package/dist/git/watching/gitDirPoller.d.ts +111 -0
  38. package/dist/git/watching/gitDirPoller.js +266 -0
  39. package/dist/git/watching/gitDirPoller.js.map +1 -0
  40. package/dist/git/watching/provider.d.ts +16 -0
  41. package/dist/git/watching/watchGroup.d.ts +40 -4
  42. package/dist/git/watching/watchGroup.js +143 -17
  43. package/dist/git/watching/watchGroup.js.map +1 -1
  44. package/dist/git/watching/watchService.d.ts +70 -1
  45. package/dist/git/watching/watchService.js +158 -13
  46. package/dist/git/watching/watchService.js.map +1 -1
  47. package/dist/git/watching/watchSession.d.ts +44 -0
  48. package/dist/git/watching/watchSession.js +91 -6
  49. package/dist/git/watching/watchSession.js.map +1 -1
  50. package/dist/git/watching/watcherPatterns.d.ts +21 -0
  51. package/dist/git/watching/watcherPatterns.js +67 -1
  52. package/dist/git/watching/watcherPatterns.js.map +1 -1
  53. package/dist/git/watching/worktreeSummary.d.ts +34 -7
  54. package/dist/git/watching/worktreeSummary.js +39 -12
  55. package/dist/git/watching/worktreeSummary.js.map +1 -1
  56. package/dist/git-cli/cliGitProvider.d.ts +40 -2
  57. package/dist/git-cli/cliGitProvider.js +182 -18
  58. package/dist/git-cli/cliGitProvider.js.map +1 -1
  59. package/dist/git-cli/exec/commandClassifier.d.ts +15 -0
  60. package/dist/git-cli/exec/commandClassifier.js +48 -2
  61. package/dist/git-cli/exec/commandClassifier.js.map +1 -1
  62. package/dist/git-cli/exec/git.d.ts +20 -3
  63. package/dist/git-cli/exec/git.js +63 -19
  64. package/dist/git-cli/exec/git.js.map +1 -1
  65. package/dist/git-cli/exec/gitQueue.d.ts +2 -0
  66. package/dist/git-cli/exec/gitQueue.js +2 -1
  67. package/dist/git-cli/exec/gitQueue.js.map +1 -1
  68. package/dist/git-cli/exec/indexLock.d.ts +39 -0
  69. package/dist/git-cli/exec/indexLock.js +160 -0
  70. package/dist/git-cli/exec/indexLock.js.map +1 -0
  71. package/dist/git-cli/parsers/blameParser.js +2 -2
  72. package/dist/git-cli/parsers/refParser.js +4 -2
  73. package/dist/git-cli/parsers/refParser.js.map +1 -1
  74. package/dist/git-cli/parsers/statusParser.d.ts +6 -0
  75. package/dist/git-cli/parsers/statusParser.js +33 -3
  76. package/dist/git-cli/parsers/statusParser.js.map +1 -1
  77. package/dist/git-cli/parsers/worktreeParser.js +42 -2
  78. package/dist/git-cli/parsers/worktreeParser.js.map +1 -1
  79. package/dist/git-cli/providers/branchRemote.d.ts +14 -0
  80. package/dist/git-cli/providers/branchRemote.js +36 -0
  81. package/dist/git-cli/providers/branchRemote.js.map +1 -0
  82. package/dist/git-cli/providers/branches.d.ts +109 -10
  83. package/dist/git-cli/providers/branches.js +630 -134
  84. package/dist/git-cli/providers/branches.js.map +1 -1
  85. package/dist/git-cli/providers/commits.js +2 -2
  86. package/dist/git-cli/providers/config.d.ts +9 -5
  87. package/dist/git-cli/providers/config.js +58 -25
  88. package/dist/git-cli/providers/config.js.map +1 -1
  89. package/dist/git-cli/providers/contributors.js +1 -1
  90. package/dist/git-cli/providers/graph.js +9 -6
  91. package/dist/git-cli/providers/graph.js.map +1 -1
  92. package/dist/git-cli/providers/operations.d.ts +17 -0
  93. package/dist/git-cli/providers/operations.js +172 -111
  94. package/dist/git-cli/providers/operations.js.map +1 -1
  95. package/dist/git-cli/providers/pausedOperations.d.ts +8 -0
  96. package/dist/git-cli/providers/pausedOperations.js +59 -39
  97. package/dist/git-cli/providers/pausedOperations.js.map +1 -1
  98. package/dist/git-cli/providers/refs.js +11 -8
  99. package/dist/git-cli/providers/refs.js.map +1 -1
  100. package/dist/git-cli/providers/remotes.js +19 -10
  101. package/dist/git-cli/providers/remotes.js.map +1 -1
  102. package/dist/git-cli/providers/revision.d.ts +6 -2
  103. package/dist/git-cli/providers/revision.js +38 -12
  104. package/dist/git-cli/providers/revision.js.map +1 -1
  105. package/dist/git-cli/providers/staging.js +39 -14
  106. package/dist/git-cli/providers/staging.js.map +1 -1
  107. package/dist/git-cli/providers/stash.d.ts +2 -0
  108. package/dist/git-cli/providers/stash.js +33 -18
  109. package/dist/git-cli/providers/stash.js.map +1 -1
  110. package/dist/git-cli/providers/status.d.ts +3 -1
  111. package/dist/git-cli/providers/status.js +40 -22
  112. package/dist/git-cli/providers/status.js.map +1 -1
  113. package/dist/git-cli/providers/tags.js +6 -4
  114. package/dist/git-cli/providers/tags.js.map +1 -1
  115. package/dist/git-cli/providers/worktrees.d.ts +1 -0
  116. package/dist/git-cli/providers/worktrees.js +60 -31
  117. package/dist/git-cli/providers/worktrees.js.map +1 -1
  118. package/dist/git-cli/service.d.ts +6 -0
  119. package/dist/git-cli/service.js +5 -2
  120. package/dist/git-cli/service.js.map +1 -1
  121. package/dist/plus/git-github/providers/github/revision.d.ts +6 -2
  122. package/dist/plus/git-github/providers/github/revision.js +15 -10
  123. package/dist/plus/git-github/providers/github/revision.js.map +1 -1
  124. package/dist/plus/git-github/providers/github/status.d.ts +3 -1
  125. package/dist/plus/git-github/providers/github/status.js +2 -2
  126. package/dist/plus/git-github/providers/github/status.js.map +1 -1
  127. package/dist/plus/integrations/collectionMetadata.d.ts +13 -2
  128. package/dist/plus/integrations/collectionMetadata.js +14 -2
  129. package/dist/plus/integrations/collectionMetadata.js.map +1 -1
  130. package/dist/plus/integrations/index.d.ts +2 -2
  131. package/dist/plus/integrations/index.js.map +1 -1
  132. package/dist/plus/integrations/integrationService.d.ts +1 -0
  133. package/dist/plus/integrations/integrationService.js +1 -1
  134. package/dist/plus/integrations/integrationService.js.map +1 -1
  135. package/dist/plus/integrations/manager.d.ts +1 -0
  136. package/dist/plus/integrations/models/gitHostIntegration.d.ts +41 -5
  137. package/dist/plus/integrations/models/gitHostIntegration.js +106 -29
  138. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
  139. package/dist/plus/integrations/models/issueReads.d.ts +17 -4
  140. package/dist/plus/integrations/providers/apiClients.d.ts +2 -0
  141. package/dist/plus/integrations/providers/apiClients.js +7 -1
  142. package/dist/plus/integrations/providers/apiClients.js.map +1 -1
  143. package/dist/plus/integrations/providers/azure/azure.d.ts +5 -4
  144. package/dist/plus/integrations/providers/azure/azure.js +36 -76
  145. package/dist/plus/integrations/providers/azure/azure.js.map +1 -1
  146. package/dist/plus/integrations/providers/azure/azure.utils.js +20 -17
  147. package/dist/plus/integrations/providers/azure/azure.utils.js.map +1 -1
  148. package/dist/plus/integrations/providers/azure/models.d.ts +2 -2
  149. package/dist/plus/integrations/providers/azure/models.js +4 -4
  150. package/dist/plus/integrations/providers/azure/models.js.map +1 -1
  151. package/dist/plus/integrations/providers/azure/workItemStateCategories.d.ts +21 -12
  152. package/dist/plus/integrations/providers/azure/workItemStateCategories.js +74 -17
  153. package/dist/plus/integrations/providers/azure/workItemStateCategories.js.map +1 -1
  154. package/dist/plus/integrations/providers/azureDevOps.d.ts +44 -0
  155. package/dist/plus/integrations/providers/azureDevOps.js +108 -17
  156. package/dist/plus/integrations/providers/azureDevOps.js.map +1 -1
  157. package/dist/plus/integrations/providers/azureDevOpsServer.d.ts +45 -1
  158. package/dist/plus/integrations/providers/azureDevOpsServer.js +121 -6
  159. package/dist/plus/integrations/providers/azureDevOpsServer.js.map +1 -1
  160. package/dist/plus/integrations/providers/jira-server.js +18 -14
  161. package/dist/plus/integrations/providers/jira-server.js.map +1 -1
  162. package/dist/plus/integrations/providers/jira.js +18 -14
  163. package/dist/plus/integrations/providers/jira.js.map +1 -1
  164. package/dist/plus/integrations/providers/models.d.ts +1 -2
  165. package/dist/plus/integrations/providers/models.js +9 -2
  166. package/dist/plus/integrations/providers/models.js.map +1 -1
  167. package/dist/plus/integrations/providers/providersApi.d.ts +7 -17
  168. package/dist/plus/integrations/providers/providersApi.js +85 -78
  169. package/dist/plus/integrations/providers/providersApi.js.map +1 -1
  170. package/dist/plus/integrations/providers/utils/jiraIssueDrains.d.ts +22 -0
  171. package/dist/plus/integrations/providers/utils/jiraIssueDrains.js +69 -9
  172. package/dist/plus/integrations/providers/utils/jiraIssueDrains.js.map +1 -1
  173. package/dist/plus/integrations/providers/utils/providerPaging.js +8 -2
  174. package/dist/plus/integrations/providers/utils/providerPaging.js.map +1 -1
  175. package/dist/plus/integrations/reads/filters.d.ts +3 -3
  176. package/dist/plus/integrations/reads/filters.js.map +1 -1
  177. package/dist/plus/integrations/reads/issueBatch.d.ts +2 -1
  178. package/dist/plus/integrations/reads/issueBatch.js +1 -1
  179. package/dist/plus/integrations/reads/issueBatch.js.map +1 -1
  180. package/dist/plus/integrations/reads/issueTracker.js +23 -14
  181. package/dist/plus/integrations/reads/issueTracker.js.map +1 -1
  182. package/dist/plus/integrations/reads/issues.d.ts +2 -1
  183. package/dist/plus/integrations/reads/issues.js +18 -3
  184. package/dist/plus/integrations/reads/issues.js.map +1 -1
  185. package/dist/plus/integrations/reads/pullRequestBatch.js +1 -1
  186. package/dist/plus/integrations/reads/resolveRepository.js +12 -3
  187. package/dist/plus/integrations/reads/resolveRepository.js.map +1 -1
  188. package/dist/plus/integrations/reads/warnings.d.ts +11 -4
  189. package/dist/plus/integrations/reads/warnings.js +15 -5
  190. package/dist/plus/integrations/reads/warnings.js.map +1 -1
  191. package/dist/plus/integrations/results.d.ts +36 -2
  192. package/dist/plus/integrations/results.js +33 -13
  193. package/dist/plus/integrations/results.js.map +1 -1
  194. package/dist/utils/promiseCache.d.ts +10 -0
  195. package/dist/utils/promiseCache.js +17 -2
  196. package/dist/utils/promiseCache.js.map +1 -1
  197. package/docs/integrations.md +52 -20
  198. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  import { IssueShape, IssueSorting, IssueStateFilter } from "../../../git/models/issue.js";
2
2
  import { IssueFilter } from "../providerFilters.js";
3
- import { CollectionMetadata } from "@gitkraken/provider-apis";
3
+ import { CollectionMetadata, CollectionScope } from "@gitkraken/provider-apis";
4
4
  //#region ../plus/integrations/src/models/issueReads.d.ts
5
5
  /**
6
6
  * The result and option contracts of the integration layer's issue reads — the shapes a PROVIDER returns to the
@@ -105,9 +105,22 @@ export type ProjectIssuesRequest<T> = {
105
105
  project: T;
106
106
  options: IssuesForProjectOptions;
107
107
  };
108
+ /** How a truncated project read could be recovered: see {@link ProjectIssuesDrain}. */
109
+ export type ProjectIssuesRecovery = 'narrow-scope' | 'none';
110
+ /**
111
+ * One project's issues as a tracker read them. A truncated result whose `metadata` reports a failure or an omission is
112
+ * explained by it; one whose metadata reports neither is a cut the facade reports for the project when it names its
113
+ * `scope` (Jira, whose drains record every other cut in their metadata), and for the read as a whole otherwise, where
114
+ * `narrow-scope` is not offered.
115
+ */
108
116
  export type ProjectIssuesDrain = {
109
117
  values: IssueShape[];
110
118
  metadata?: CollectionMetadata;
119
+ /**
120
+ * The scope the provider records this project's failures under, so a cut the facade reports names the project
121
+ * the same way: a Jira Cloud project by its key, a Jira Data Center one by its id. Omitted names no scope.
122
+ */
123
+ scope?: CollectionScope;
111
124
  } & ({
112
125
  truncated: false;
113
126
  } | {
@@ -116,7 +129,7 @@ export type ProjectIssuesDrain = {
116
129
  * `narrow-scope` means a smaller server-side scope avoids this truncation. `none` covers incomplete
117
130
  * results without that guarantee, including Linear's client-side assignee filtering.
118
131
  */
119
- recovery: 'narrow-scope' | 'none';
132
+ recovery: ProjectIssuesRecovery;
120
133
  });
121
134
  /**
122
135
  * Options for the REPO-scoped issue read (`GitHostIntegration.getMyIssuesForRepos*`), the git-host counterpart of
@@ -183,8 +196,8 @@ export type SearchMyIssuesOptions = {
183
196
  /**
184
197
  * Which issue states to read. Omitted reads open issues only.
185
198
  *
186
- * Honored by the issue trackers that declare `ProviderMetadata.supportsIssueStates` (Jira, Jira Data Center,
187
- * Linear). The git hosts' account-wide reads ignore it and keep their own open-only default.
199
+ * Honored by providers declaring `ProviderMetadata.supportsIssueStates`, including Azure DevOps Services and
200
+ * Server. Other git hosts keep their own open-only account-wide default.
188
201
  */
189
202
  state?: IssueStateFilter;
190
203
  /**
@@ -1,5 +1,6 @@
1
1
  import { Disposable } from "../../../utils/disposable.js";
2
2
  import { GitHubApi } from "../../git-github/api/github.js";
3
+ import { AzureWorkItemStatesCache } from "./azure/workItemStateCategories.js";
3
4
  import { AzureDevOpsApi } from "./azure/azure.js";
4
5
  import { BitbucketApi } from "./bitbucket/bitbucket.js";
5
6
  import "./github/github.js";
@@ -13,6 +14,7 @@ import { IntegrationServiceContext } from "../context.js";
13
14
  * offline/limited runtimes.
14
15
  */
15
16
  export interface ApiClients {
17
+ readonly azureWorkItemStates: AzureWorkItemStatesCache;
16
18
  readonly github: Promise<GitHubApi | undefined>;
17
19
  readonly gitlab: Promise<GitLabApi | undefined>;
18
20
  readonly bitbucket: Promise<BitbucketApi | undefined>;
@@ -1,4 +1,5 @@
1
1
  import { getScopedLogger } from "../../../utils/logger.scoped.js";
2
+ import { AzureWorkItemStatesCache } from "./azure/workItemStateCategories.js";
2
3
  //#region ../plus/integrations/src/providers/apiClients.ts
3
4
  /**
4
5
  * Lazily constructs + memoizes the API clients from the runtime context, pushing each to `disposables` for
@@ -6,6 +7,10 @@ import { getScopedLogger } from "../../../utils/logger.scoped.js";
6
7
  * ownership (the host used to build these and inject them back through the context — a pure round-trip).
7
8
  */
8
9
  function createApiClients(ctx, disposables) {
10
+ const azureWorkItemStates = new AzureWorkItemStatesCache();
11
+ disposables.push(ctx.config.onDidChange((e) => {
12
+ if (e.httpProxy) azureWorkItemStates.clear();
13
+ }), { dispose: () => azureWorkItemStates.clear() });
9
14
  let github;
10
15
  let gitlab;
11
16
  let bitbucket;
@@ -22,6 +27,7 @@ function createApiClients(ctx, disposables) {
22
27
  }
23
28
  };
24
29
  return {
30
+ azureWorkItemStates,
25
31
  get github() {
26
32
  return github ??= build(async () => (await import(
27
33
  /* webpackChunkName: "integrations" */
@@ -44,7 +50,7 @@ function createApiClients(ctx, disposables) {
44
50
  return azure ??= build(async () => (await import(
45
51
  /* webpackChunkName: "integrations" */
46
52
  "./azure/azure.js"
47
- )).createAzureDevOpsApi(ctx));
53
+ )).createAzureDevOpsApi(ctx, azureWorkItemStates));
48
54
  }
49
55
  };
50
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"apiClients.js","names":[],"sources":["../../../../../plus/integrations/src/providers/apiClients.ts"],"sourcesContent":["import type { Disposable } from '@gitlens/utils/disposable.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport type { IntegrationServiceContext } from '../context.js';\nimport type { AzureDevOpsApi } from './azure/azure.js';\nimport type { BitbucketApi } from './bitbucket/bitbucket.js';\nimport type { GitHubApi } from './github/github.js';\nimport type { GitLabApi } from './gitlab/gitlab.js';\n\n/**\n * The per-provider API clients, owned and built by the package. `GitLabApi`/`BitbucketApi`/`AzureDevOpsApi`\n * live in the package; `GitHubApi` comes from `@gitlens/git-github` (shared with the host's GitHub git\n * provider, which reads the manager's memoized instance via `manager.github`). `undefined` is tolerated for\n * offline/limited runtimes.\n */\nexport interface ApiClients {\n\treadonly github: Promise<GitHubApi | undefined>;\n\treadonly gitlab: Promise<GitLabApi | undefined>;\n\treadonly bitbucket: Promise<BitbucketApi | undefined>;\n\treadonly azure: Promise<AzureDevOpsApi | undefined>;\n}\n\n/**\n * Lazily constructs + memoizes the API clients from the runtime context, pushing each to `disposables` for\n * teardown. Mirrors the lazy-chunked construction the host's `Container` did before the package took\n * ownership (the host used to build these and inject them back through the context — a pure round-trip).\n */\nexport function createApiClients(ctx: IntegrationServiceContext, disposables: Disposable[]): ApiClients {\n\tlet github: Promise<GitHubApi | undefined> | undefined;\n\tlet gitlab: Promise<GitLabApi | undefined> | undefined;\n\tlet bitbucket: Promise<BitbucketApi | undefined> | undefined;\n\tlet azure: Promise<AzureDevOpsApi | undefined> | undefined;\n\n\tconst build = async <T extends Disposable>(load: () => Promise<T>): Promise<T | undefined> => {\n\t\tconst scope = getScopedLogger();\n\t\ttry {\n\t\t\tconst api = await load();\n\t\t\tdisposables.push(api);\n\t\t\treturn api;\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex, 'Failed to construct integration API client');\n\t\t\treturn undefined;\n\t\t}\n\t};\n\n\treturn {\n\t\tget github() {\n\t\t\treturn (github ??= build(async () =>\n\t\t\t\t(await import(/* webpackChunkName: \"integrations\" */ './github/github.js')).createGitHubApi(ctx),\n\t\t\t));\n\t\t},\n\t\tget gitlab() {\n\t\t\treturn (gitlab ??= build(async () =>\n\t\t\t\t(await import(/* webpackChunkName: \"integrations\" */ './gitlab/gitlab.js')).createGitLabApi(ctx),\n\t\t\t));\n\t\t},\n\t\tget bitbucket() {\n\t\t\treturn (bitbucket ??= build(async () =>\n\t\t\t\t(await import(/* webpackChunkName: \"integrations\" */ './bitbucket/bitbucket.js')).createBitbucketApi(\n\t\t\t\t\tctx,\n\t\t\t\t),\n\t\t\t));\n\t\t},\n\t\tget azure() {\n\t\t\treturn (azure ??= build(async () =>\n\t\t\t\t(await import(/* webpackChunkName: \"integrations\" */ './azure/azure.js')).createAzureDevOpsApi(ctx),\n\t\t\t));\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;AA0BA,SAAgB,iBAAiB,KAAgC,aAAuC;CACvG,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,MAAM,QAAQ,OAA6B,SAAmD;EAC7F,MAAM,QAAQ,gBAAgB;EAC9B,IAAI;GACH,MAAM,MAAM,MAAM,KAAK;GACvB,YAAY,KAAK,GAAG;GACpB,OAAO;EACR,SAAS,IAAI;GACZ,OAAO,MAAM,IAAI,4CAA4C;GAC7D;EACD;CACD;CAEA,OAAO;EACN,IAAI,SAAS;GACZ,OAAQ,WAAW,MAAM,aACvB,MAAM;;IAA8C;EAAqB,CAAE,gBAAgB,GAAG,CAChG;EACD;EACA,IAAI,SAAS;GACZ,OAAQ,WAAW,MAAM,aACvB,MAAM;;IAA8C;EAAqB,CAAE,gBAAgB,GAAG,CAChG;EACD;EACA,IAAI,YAAY;GACf,OAAQ,cAAc,MAAM,aAC1B,MAAM;;IAA8C;EAA2B,CAAE,mBACjF,GACD,CACD;EACD;EACA,IAAI,QAAQ;GACX,OAAQ,UAAU,MAAM,aACtB,MAAM;;IAA8C;EAAmB,CAAE,qBAAqB,GAAG,CACnG;EACD;CACD;AACD"}
1
+ {"version":3,"file":"apiClients.js","names":[],"sources":["../../../../../plus/integrations/src/providers/apiClients.ts"],"sourcesContent":["import type { Disposable } from '@gitlens/utils/disposable.js';\nimport { getScopedLogger } from '@gitlens/utils/logger.scoped.js';\nimport type { IntegrationServiceContext } from '../context.js';\nimport type { AzureDevOpsApi } from './azure/azure.js';\nimport { AzureWorkItemStatesCache } from './azure/workItemStateCategories.js';\nimport type { BitbucketApi } from './bitbucket/bitbucket.js';\nimport type { GitHubApi } from './github/github.js';\nimport type { GitLabApi } from './gitlab/gitlab.js';\n\n/**\n * The per-provider API clients, owned and built by the package. `GitLabApi`/`BitbucketApi`/`AzureDevOpsApi`\n * live in the package; `GitHubApi` comes from `@gitlens/git-github` (shared with the host's GitHub git\n * provider, which reads the manager's memoized instance via `manager.github`). `undefined` is tolerated for\n * offline/limited runtimes.\n */\nexport interface ApiClients {\n\treadonly azureWorkItemStates: AzureWorkItemStatesCache;\n\treadonly github: Promise<GitHubApi | undefined>;\n\treadonly gitlab: Promise<GitLabApi | undefined>;\n\treadonly bitbucket: Promise<BitbucketApi | undefined>;\n\treadonly azure: Promise<AzureDevOpsApi | undefined>;\n}\n\n/**\n * Lazily constructs + memoizes the API clients from the runtime context, pushing each to `disposables` for\n * teardown. Mirrors the lazy-chunked construction the host's `Container` did before the package took\n * ownership (the host used to build these and inject them back through the context — a pure round-trip).\n */\nexport function createApiClients(ctx: IntegrationServiceContext, disposables: Disposable[]): ApiClients {\n\tconst azureWorkItemStates = new AzureWorkItemStatesCache();\n\tdisposables.push(\n\t\tctx.config.onDidChange(e => {\n\t\t\tif (e.httpProxy) {\n\t\t\t\tazureWorkItemStates.clear();\n\t\t\t}\n\t\t}),\n\t\t{ dispose: () => azureWorkItemStates.clear() },\n\t);\n\tlet github: Promise<GitHubApi | undefined> | undefined;\n\tlet gitlab: Promise<GitLabApi | undefined> | undefined;\n\tlet bitbucket: Promise<BitbucketApi | undefined> | undefined;\n\tlet azure: Promise<AzureDevOpsApi | undefined> | undefined;\n\n\tconst build = async <T extends Disposable>(load: () => Promise<T>): Promise<T | undefined> => {\n\t\tconst scope = getScopedLogger();\n\t\ttry {\n\t\t\tconst api = await load();\n\t\t\tdisposables.push(api);\n\t\t\treturn api;\n\t\t} catch (ex) {\n\t\t\tscope?.error(ex, 'Failed to construct integration API client');\n\t\t\treturn undefined;\n\t\t}\n\t};\n\n\treturn {\n\t\tazureWorkItemStates: azureWorkItemStates,\n\t\tget github() {\n\t\t\treturn (github ??= build(async () =>\n\t\t\t\t(await import(/* webpackChunkName: \"integrations\" */ './github/github.js')).createGitHubApi(ctx),\n\t\t\t));\n\t\t},\n\t\tget gitlab() {\n\t\t\treturn (gitlab ??= build(async () =>\n\t\t\t\t(await import(/* webpackChunkName: \"integrations\" */ './gitlab/gitlab.js')).createGitLabApi(ctx),\n\t\t\t));\n\t\t},\n\t\tget bitbucket() {\n\t\t\treturn (bitbucket ??= build(async () =>\n\t\t\t\t(await import(/* webpackChunkName: \"integrations\" */ './bitbucket/bitbucket.js')).createBitbucketApi(\n\t\t\t\t\tctx,\n\t\t\t\t),\n\t\t\t));\n\t\t},\n\t\tget azure() {\n\t\t\treturn (azure ??= build(async () =>\n\t\t\t\t(await import(/* webpackChunkName: \"integrations\" */ './azure/azure.js')).createAzureDevOpsApi(\n\t\t\t\t\tctx,\n\t\t\t\t\tazureWorkItemStates,\n\t\t\t\t),\n\t\t\t));\n\t\t},\n\t};\n}\n"],"mappings":";;;;;;;;AA4BA,SAAgB,iBAAiB,KAAgC,aAAuC;CACvG,MAAM,sBAAsB,IAAI,yBAAyB;CACzD,YAAY,KACX,IAAI,OAAO,aAAY,MAAK;EAC3B,IAAI,EAAE,WACL,oBAAoB,MAAM;CAE5B,CAAC,GACD,EAAE,eAAe,oBAAoB,MAAM,EAAE,CAC9C;CACA,IAAI;CACJ,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,MAAM,QAAQ,OAA6B,SAAmD;EAC7F,MAAM,QAAQ,gBAAgB;EAC9B,IAAI;GACH,MAAM,MAAM,MAAM,KAAK;GACvB,YAAY,KAAK,GAAG;GACpB,OAAO;EACR,SAAS,IAAI;GACZ,OAAO,MAAM,IAAI,4CAA4C;GAC7D;EACD;CACD;CAEA,OAAO;EACe;EACrB,IAAI,SAAS;GACZ,OAAQ,WAAW,MAAM,aACvB,MAAM;;IAA8C;EAAqB,CAAE,gBAAgB,GAAG,CAChG;EACD;EACA,IAAI,SAAS;GACZ,OAAQ,WAAW,MAAM,aACvB,MAAM;;IAA8C;EAAqB,CAAE,gBAAgB,GAAG,CAChG;EACD;EACA,IAAI,YAAY;GACf,OAAQ,cAAc,MAAM,aAC1B,MAAM;;IAA8C;EAA2B,CAAE,mBACjF,GACD,CACD;EACD;EACA,IAAI,QAAQ;GACX,OAAQ,UAAU,MAAM,aACtB,MAAM;;IAA8C;EAAmB,CAAE,qBACzE,KACA,mBACD,CACD;EACD;CACD;AACD"}
@@ -8,6 +8,7 @@ import { DefaultBranch } from "../../../../git/models/defaultBranch.js";
8
8
  import { RepositoryMetadata } from "../../../../git/models/repositoryMetadata.js";
9
9
  import { TokenWithInfo } from "../../authentication/models.js";
10
10
  import { AzureProjectDescriptor, AzureWorkItemStateCategory } from "./models.js";
11
+ import { AzureWorkItemStatesCache } from "./workItemStateCategories.js";
11
12
  import { ProviderIssueSearchPage } from "../../models/issueReads.js";
12
13
  import { ProviderApiConfig } from "../apiConfig.js";
13
14
  import { IntegrationServiceContext } from "../../context.js";
@@ -15,7 +16,8 @@ import { IntegrationServiceContext } from "../../context.js";
15
16
  export declare class AzureDevOpsApi implements Disposable {
16
17
  private readonly config;
17
18
  private readonly _disposable;
18
- private _workItemStates;
19
+ private readonly _workItemStates;
20
+ private readonly ownsWorkItemStates;
19
21
  private readonly _forkRepositoryUrls;
20
22
  /**
21
23
  * The ordered ids each filtered work-item search's first page queried, paged through by its continuations. Kept
@@ -23,7 +25,7 @@ export declare class AzureDevOpsApi implements Disposable {
23
25
  * the capacity leaves room for repeated first pages before an idle pagination's snapshot is the one evicted.
24
26
  */
25
27
  private readonly _workItemSearches;
26
- constructor(config: ProviderApiConfig);
28
+ constructor(config: ProviderApiConfig, workItemStates?: AzureWorkItemStatesCache);
27
29
  dispose(): void;
28
30
  private resetCaches;
29
31
  getPullRequestForBranch(provider: Provider, token: TokenWithInfo, owner: string, repo: string, branch: string, options: {
@@ -68,7 +70,6 @@ export declare class AzureDevOpsApi implements Disposable {
68
70
  getWorkItemStateCategory(issueType: string, state: string, provider: Provider, token: TokenWithInfo, owner: string, projectName: string, options: {
69
71
  baseUrl: string;
70
72
  }): Promise<AzureWorkItemStateCategory | undefined>;
71
- private retrieveWorkItemTypeStates;
72
73
  getRepositoryMetadata(provider: Provider, token: TokenWithInfo, owner: string, repo: string, options: {
73
74
  baseUrl: string;
74
75
  }, cancellation?: AbortSignal): Promise<RepositoryMetadata | undefined>;
@@ -137,6 +138,6 @@ export declare class AzureDevOpsApi implements Disposable {
137
138
  private handleRequestError;
138
139
  }
139
140
  /** Wires an {@link AzureDevOpsApi} from the full runtime context, mapping `ctx` down to the narrow config. */
140
- export declare function createAzureDevOpsApi(ctx: IntegrationServiceContext): AzureDevOpsApi;
141
+ export declare function createAzureDevOpsApi(ctx: IntegrationServiceContext, workItemStates?: AzureWorkItemStatesCache): AzureDevOpsApi;
141
142
  //#endregion
142
143
  //# sourceMappingURL=azure.d.ts.map
@@ -12,9 +12,9 @@ import { effectiveIssueSort } from "../../../../git/utils/issue.utils.js";
12
12
  import { ProviderFetchError, isRateLimitResponse, toRateLimitError } from "../../errors.js";
13
13
  import { decodePathSegment } from "../../utils/domain.utils.js";
14
14
  import { azureWorkItemSearchResultLimit, parseAzureWorkItemSearchCursor, toAzureSearchPageSize, toAzureWorkItemSearchCursorKey, toAzureWorkItemSearchWiql } from "./search.js";
15
- import { baseProviderApiConfig } from "../apiConfig.js";
16
15
  import { azurePullRequestStatusToState, azureWorkItemsStateCategoryToState, encodeAzurePathSegment, fromAzurePullRequest, fromAzureWorkItem, getAzurePullRequestWebUrl, isClosedAzurePullRequestStatus, isClosedAzureWorkItemStateCategory, normalizeAzureBranchName, sanitizeAzureRepositoryUrl } from "./models.js";
17
- import { getAzureWorkItemTypeStatesPath } from "./workItemStateCategories.js";
16
+ import { AzureWorkItemStatesCache, getAzureWorkItemTypeStatesPath } from "./workItemStateCategories.js";
17
+ import { baseProviderApiConfig } from "../apiConfig.js";
18
18
  import * as l10n from "@vscode/l10n";
19
19
  //#region ../plus/integrations/src/providers/azure/azure.ts
20
20
  const forkRepositoryUrlCacheTtl = 3e5;
@@ -34,44 +34,11 @@ function parseAzureRepositoryDescriptor(repo) {
34
34
  repoName
35
35
  };
36
36
  }
37
- var WorkItemStates = class {
38
- _categories = /* @__PURE__ */ new Map();
39
- _types = /* @__PURE__ */ new Map();
40
- getStateCategory(project, workItemType, stateName) {
41
- return this._categories.get(this.getStateKey(project, workItemType, stateName));
42
- }
43
- clear() {
44
- this._categories.clear();
45
- this._types.clear();
46
- }
47
- saveTypeStates(project, workItemType, states) {
48
- this.clearTypeStates(project, workItemType);
49
- this._types.set(this.getTypeKey(project, workItemType), states);
50
- for (const state of states) this._categories.set(this.getStateKey(project, workItemType, state.name), state.category);
51
- }
52
- hasTypeStates(project, workItemType) {
53
- return this._types.has(this.getTypeKey(project, workItemType));
54
- }
55
- clearTypeStates(project, workItemType) {
56
- const states = this._types.get(this.getTypeKey(project, workItemType));
57
- if (states == null) return;
58
- for (const state of states) this._categories.delete(this.getStateKey(project, workItemType, state.name));
59
- }
60
- getStateKey(project, workItemType, stateName) {
61
- return JSON.stringify([
62
- project,
63
- workItemType,
64
- stateName
65
- ]);
66
- }
67
- getTypeKey(project, workItemType) {
68
- return JSON.stringify([project, workItemType]);
69
- }
70
- };
71
37
  var AzureDevOpsApi = class {
72
38
  config;
73
39
  _disposable;
74
- _workItemStates = new WorkItemStates();
40
+ _workItemStates;
41
+ ownsWorkItemStates;
75
42
  _forkRepositoryUrls = new PromiseCache({
76
43
  capacity: 100,
77
44
  createTTL: forkRepositoryUrlCacheTtl
@@ -86,15 +53,17 @@ var AzureDevOpsApi = class {
86
53
  accessTTL: workItemSearchSnapshotTtl,
87
54
  createTTL: workItemSearchSnapshotMaxTtl
88
55
  });
89
- constructor(config) {
56
+ constructor(config, workItemStates) {
90
57
  this.config = config;
58
+ this._workItemStates = workItemStates ?? new AzureWorkItemStatesCache();
59
+ this.ownsWorkItemStates = workItemStates == null;
91
60
  this._disposable = config.onConfigChanged?.(() => this.resetCaches());
92
61
  }
93
62
  dispose() {
94
63
  this._disposable?.dispose();
95
64
  }
96
65
  resetCaches() {
97
- this._workItemStates.clear();
66
+ if (this.ownsWorkItemStates) this._workItemStates.clear();
98
67
  this._forkRepositoryUrls.clear();
99
68
  this._workItemSearches.clear();
100
69
  }
@@ -151,8 +120,17 @@ var AzureDevOpsApi = class {
151
120
  async getIssueOrPullRequest(provider, token, owner, repo, id, options) {
152
121
  const scope = getScopedLogger();
153
122
  const { projectName, repoName } = parseAzureRepositoryDescriptor(repo);
154
- if (options?.type === void 0 || options?.type === "issue") try {
155
- const issueResult = await this.request(provider, token, options?.baseUrl, `${encodeAzurePathSegment(owner)}/${encodeAzurePathSegment(projectName)}/_apis/wit/workItems/${encodeAzurePathSegment(id)}`, { method: "GET" }, scope);
123
+ if (options?.type === void 0 || options?.type === "issue") {
124
+ let issueResult;
125
+ try {
126
+ issueResult = await this.request(provider, token, options?.baseUrl, `${encodeAzurePathSegment(owner)}/${encodeAzurePathSegment(projectName)}/_apis/wit/workItems/${encodeAzurePathSegment(id)}`, { method: "GET" }, scope);
127
+ } catch (ex) {
128
+ if (ex instanceof AuthenticationError) throw ex;
129
+ if (ex.original?.status !== 404) {
130
+ scope?.error(ex);
131
+ return;
132
+ }
133
+ }
156
134
  if (issueResult != null) {
157
135
  const issueType = issueResult.fields["System.WorkItemType"];
158
136
  const state = issueResult.fields["System.State"];
@@ -170,12 +148,6 @@ var AzureDevOpsApi = class {
170
148
  url: issueResult._links.html.href
171
149
  };
172
150
  }
173
- } catch (ex) {
174
- if (ex instanceof AuthenticationError) throw ex;
175
- if (ex.original?.status !== 404) {
176
- scope?.error(ex);
177
- return;
178
- }
179
151
  }
180
152
  if (options?.type === void 0 || options?.type === "pullrequest") try {
181
153
  const prResult = await this.request(provider, token, options?.baseUrl, `${encodeAzurePathSegment(owner)}/${encodeAzurePathSegment(projectName)}/_apis/git/repositories/${encodeAzurePathSegment(repoName)}/pullRequests/${encodeAzurePathSegment(id)}`, { method: "GET" }, scope);
@@ -202,14 +174,9 @@ var AzureDevOpsApi = class {
202
174
  }
203
175
  async getIssue(provider, token, project, id, options) {
204
176
  const scope = getScopedLogger();
177
+ let issueResult;
205
178
  try {
206
- const issueResult = await this.request(provider, token, options?.baseUrl, `${encodeAzurePathSegment(project.resourceName)}/${encodeAzurePathSegment(project.name)}/_apis/wit/workItems/${encodeAzurePathSegment(id)}`, { method: "GET" }, scope);
207
- if (issueResult != null) {
208
- const issueType = issueResult.fields["System.WorkItemType"];
209
- const state = issueResult.fields["System.State"];
210
- const stateCategory = await this.getWorkItemStateCategory(issueType, state, provider, token, project.resourceName, project.name, options);
211
- return fromAzureWorkItem(issueResult, provider, project, stateCategory, "point");
212
- }
179
+ issueResult = await this.request(provider, token, options?.baseUrl, `${encodeAzurePathSegment(project.resourceName)}/${encodeAzurePathSegment(project.name)}/_apis/wit/workItems/${encodeAzurePathSegment(id)}`, { method: "GET" }, scope);
213
180
  } catch (ex) {
214
181
  if (ex instanceof AuthenticationError) throw ex;
215
182
  if (ex.original?.status !== 404) {
@@ -217,6 +184,12 @@ var AzureDevOpsApi = class {
217
184
  return;
218
185
  }
219
186
  }
187
+ if (issueResult != null) {
188
+ const issueType = issueResult.fields["System.WorkItemType"];
189
+ const state = issueResult.fields["System.State"];
190
+ const stateCategory = await this.getWorkItemStateCategory(issueType, state, provider, token, project.resourceName, project.name, options);
191
+ return fromAzureWorkItem(issueResult, provider, project, stateCategory, "point");
192
+ }
220
193
  }
221
194
  async getAccountForCommit(provider, token, owner, repo, rev, baseUrl, _options) {
222
195
  const scope = getScopedLogger();
@@ -280,26 +253,13 @@ var AzureDevOpsApi = class {
280
253
  }
281
254
  }
282
255
  async getWorkItemStateCategory(issueType, state, provider, token, owner, projectName, options) {
283
- const project = JSON.stringify([
284
- options.baseUrl,
285
- owner,
286
- projectName
287
- ]);
288
- const category = this._workItemStates.getStateCategory(project, issueType, state);
289
- if (category != null) return category;
290
- const states = await this.retrieveWorkItemTypeStates(issueType, provider, token, owner, projectName, options);
291
- this._workItemStates.saveTypeStates(project, issueType, states);
292
- return this._workItemStates.getStateCategory(project, issueType, state);
293
- }
294
- async retrieveWorkItemTypeStates(workItemType, provider, token, owner, projectName, options) {
295
- const scope = getScopedLogger();
296
- try {
297
- return (await this.request(provider, token, options?.baseUrl, getAzureWorkItemTypeStatesPath(owner, projectName, workItemType), { method: "GET" }, scope))?.value ?? [];
298
- } catch (ex) {
299
- if (ex instanceof AuthenticationError) throw ex;
300
- scope?.error(ex);
301
- return [];
302
- }
256
+ return (await this._workItemStates.getStates({
257
+ baseUrl: options.baseUrl,
258
+ namespace: owner,
259
+ project: projectName,
260
+ token: token.accessToken,
261
+ isPAT: true
262
+ }, issueType, () => this.request(provider, token, options.baseUrl, getAzureWorkItemTypeStatesPath(owner, projectName, issueType), { method: "GET" }, void 0))).find((s) => s.name === state)?.category;
303
263
  }
304
264
  async getRepositoryMetadata(provider, token, owner, repo, options, cancellation) {
305
265
  const scope = getScopedLogger();
@@ -639,8 +599,8 @@ __decorate([trace({ args: (provider, token, collection) => ({
639
599
  collection
640
600
  }) })], AzureDevOpsApi.prototype, "countWorkItems", null);
641
601
  /** Wires an {@link AzureDevOpsApi} from the full runtime context, mapping `ctx` down to the narrow config. */
642
- function createAzureDevOpsApi(ctx) {
643
- return new AzureDevOpsApi(baseProviderApiConfig(ctx));
602
+ function createAzureDevOpsApi(ctx, workItemStates) {
603
+ return new AzureDevOpsApi(baseProviderApiConfig(ctx), workItemStates);
644
604
  }
645
605
  //#endregion
646
606
  export { AzureDevOpsApi, createAzureDevOpsApi };