@gitkraken/core-gitlens 0.5.108 → 0.5.110

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 (190) hide show
  1. package/CHANGELOG.md +49 -1
  2. package/dist/git/models/issue.d.ts +70 -0
  3. package/dist/git/models/issue.d.ts.map +1 -1
  4. package/dist/git/models/issue.js +17 -0
  5. package/dist/git/models/issue.js.map +1 -1
  6. package/dist/git/models/pullRequest.d.ts +81 -0
  7. package/dist/git/models/pullRequest.d.ts.map +1 -1
  8. package/dist/git/models/pullRequest.js +15 -0
  9. package/dist/git/models/pullRequest.js.map +1 -1
  10. package/dist/git/utils/issue.utils.d.ts +41 -1
  11. package/dist/git/utils/issue.utils.d.ts.map +1 -1
  12. package/dist/git/utils/issue.utils.js +80 -0
  13. package/dist/git/utils/issue.utils.js.map +1 -1
  14. package/dist/git/utils/pullRequest.utils.d.ts +11 -1
  15. package/dist/git/utils/pullRequest.utils.d.ts.map +1 -1
  16. package/dist/git/utils/pullRequest.utils.js +40 -0
  17. package/dist/git/utils/pullRequest.utils.js.map +1 -1
  18. package/dist/plus/git-github/api/github.d.ts +70 -10
  19. package/dist/plus/git-github/api/github.d.ts.map +1 -1
  20. package/dist/plus/git-github/api/github.js +284 -31
  21. package/dist/plus/git-github/api/github.js.map +1 -1
  22. package/dist/plus/git-github/api/issueSearchQuery.d.ts +49 -5
  23. package/dist/plus/git-github/api/issueSearchQuery.d.ts.map +1 -1
  24. package/dist/plus/git-github/api/issueSearchQuery.js +64 -6
  25. package/dist/plus/git-github/api/issueSearchQuery.js.map +1 -1
  26. package/dist/plus/git-github/api/pullRequestSearchQuery.d.ts +27 -1
  27. package/dist/plus/git-github/api/pullRequestSearchQuery.d.ts.map +1 -1
  28. package/dist/plus/git-github/api/pullRequestSearchQuery.js +73 -6
  29. package/dist/plus/git-github/api/pullRequestSearchQuery.js.map +1 -1
  30. package/dist/plus/git-github/models.d.ts +17 -5
  31. package/dist/plus/git-github/models.d.ts.map +1 -1
  32. package/dist/plus/git-github/models.js +14 -1
  33. package/dist/plus/git-github/models.js.map +1 -1
  34. package/dist/plus/integrations/collectionMetadata.d.ts +18 -0
  35. package/dist/plus/integrations/collectionMetadata.d.ts.map +1 -1
  36. package/dist/plus/integrations/collectionMetadata.js +24 -0
  37. package/dist/plus/integrations/collectionMetadata.js.map +1 -1
  38. package/dist/plus/integrations/integrationService.d.ts +31 -10
  39. package/dist/plus/integrations/integrationService.d.ts.map +1 -1
  40. package/dist/plus/integrations/integrationService.js +9 -1
  41. package/dist/plus/integrations/integrationService.js.map +1 -1
  42. package/dist/plus/integrations/manager.d.ts +85 -31
  43. package/dist/plus/integrations/manager.d.ts.map +1 -1
  44. package/dist/plus/integrations/models/gitHostIntegration.d.ts +18 -31
  45. package/dist/plus/integrations/models/gitHostIntegration.d.ts.map +1 -1
  46. package/dist/plus/integrations/models/gitHostIntegration.js +29 -1
  47. package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
  48. package/dist/plus/integrations/models/integration.d.ts +1 -1
  49. package/dist/plus/integrations/models/integration.d.ts.map +1 -1
  50. package/dist/plus/integrations/models/integration.js.map +1 -1
  51. package/dist/plus/integrations/models/issueReads.d.ts +63 -1
  52. package/dist/plus/integrations/models/issueReads.d.ts.map +1 -1
  53. package/dist/plus/integrations/models/issuesIntegration.d.ts +7 -21
  54. package/dist/plus/integrations/models/issuesIntegration.d.ts.map +1 -1
  55. package/dist/plus/integrations/models/issuesIntegration.js.map +1 -1
  56. package/dist/plus/integrations/providerFilters.d.ts +2 -2
  57. package/dist/plus/integrations/providerFilters.d.ts.map +1 -1
  58. package/dist/plus/integrations/providers/accounts.d.ts +6 -0
  59. package/dist/plus/integrations/providers/accounts.d.ts.map +1 -0
  60. package/dist/plus/integrations/providers/accounts.js +30 -0
  61. package/dist/plus/integrations/providers/accounts.js.map +1 -0
  62. package/dist/plus/integrations/providers/azureDevOps.d.ts.map +1 -1
  63. package/dist/plus/integrations/providers/azureDevOps.js +1 -0
  64. package/dist/plus/integrations/providers/azureDevOps.js.map +1 -1
  65. package/dist/plus/integrations/providers/github.d.ts +9 -0
  66. package/dist/plus/integrations/providers/github.d.ts.map +1 -1
  67. package/dist/plus/integrations/providers/github.js +115 -135
  68. package/dist/plus/integrations/providers/github.js.map +1 -1
  69. package/dist/plus/integrations/providers/gitlab.d.ts +9 -0
  70. package/dist/plus/integrations/providers/gitlab.d.ts.map +1 -1
  71. package/dist/plus/integrations/providers/gitlab.js +24 -4
  72. package/dist/plus/integrations/providers/gitlab.js.map +1 -1
  73. package/dist/plus/integrations/providers/issueSorts.d.ts +36 -0
  74. package/dist/plus/integrations/providers/issueSorts.d.ts.map +1 -0
  75. package/dist/plus/integrations/providers/issueSorts.js +76 -0
  76. package/dist/plus/integrations/providers/issueSorts.js.map +1 -0
  77. package/dist/plus/integrations/providers/jira.d.ts +3 -9
  78. package/dist/plus/integrations/providers/jira.d.ts.map +1 -1
  79. package/dist/plus/integrations/providers/jira.js +5 -1
  80. package/dist/plus/integrations/providers/jira.js.map +1 -1
  81. package/dist/plus/integrations/providers/linear.d.ts +24 -9
  82. package/dist/plus/integrations/providers/linear.d.ts.map +1 -1
  83. package/dist/plus/integrations/providers/linear.js +63 -5
  84. package/dist/plus/integrations/providers/linear.js.map +1 -1
  85. package/dist/plus/integrations/providers/models.d.ts +76 -38
  86. package/dist/plus/integrations/providers/models.d.ts.map +1 -1
  87. package/dist/plus/integrations/providers/models.js +91 -105
  88. package/dist/plus/integrations/providers/models.js.map +1 -1
  89. package/dist/plus/integrations/providers/providersApi.d.ts +18 -3
  90. package/dist/plus/integrations/providers/providersApi.d.ts.map +1 -1
  91. package/dist/plus/integrations/providers/providersApi.js +24 -7
  92. package/dist/plus/integrations/providers/providersApi.js.map +1 -1
  93. package/dist/plus/integrations/providers/pullRequestReviews.d.ts +50 -0
  94. package/dist/plus/integrations/providers/pullRequestReviews.d.ts.map +1 -0
  95. package/dist/plus/integrations/providers/pullRequestReviews.js +99 -0
  96. package/dist/plus/integrations/providers/pullRequestReviews.js.map +1 -0
  97. package/dist/plus/integrations/providers/trello.d.ts +3 -9
  98. package/dist/plus/integrations/providers/trello.d.ts.map +1 -1
  99. package/dist/plus/integrations/providers/trello.js +1 -0
  100. package/dist/plus/integrations/providers/trello.js.map +1 -1
  101. package/dist/plus/integrations/providers/utils/providerPaging.d.ts.map +1 -1
  102. package/dist/plus/integrations/providers/utils/providerPaging.js +5 -1
  103. package/dist/plus/integrations/providers/utils/providerPaging.js.map +1 -1
  104. package/dist/plus/integrations/reads/broaden.d.ts +6 -0
  105. package/dist/plus/integrations/reads/broaden.d.ts.map +1 -1
  106. package/dist/plus/integrations/reads/broaden.js.map +1 -1
  107. package/dist/plus/integrations/reads/counts.d.ts +63 -1
  108. package/dist/plus/integrations/reads/counts.d.ts.map +1 -1
  109. package/dist/plus/integrations/reads/counts.js +146 -2
  110. package/dist/plus/integrations/reads/counts.js.map +1 -1
  111. package/dist/plus/integrations/reads/drains.d.ts +7 -1
  112. package/dist/plus/integrations/reads/drains.d.ts.map +1 -1
  113. package/dist/plus/integrations/reads/drains.js +13 -2
  114. package/dist/plus/integrations/reads/drains.js.map +1 -1
  115. package/dist/plus/integrations/reads/filters.d.ts +59 -9
  116. package/dist/plus/integrations/reads/filters.d.ts.map +1 -1
  117. package/dist/plus/integrations/reads/filters.js +39 -0
  118. package/dist/plus/integrations/reads/filters.js.map +1 -1
  119. package/dist/plus/integrations/reads/issueTracker.d.ts +18 -1
  120. package/dist/plus/integrations/reads/issueTracker.d.ts.map +1 -1
  121. package/dist/plus/integrations/reads/issueTracker.js +40 -3
  122. package/dist/plus/integrations/reads/issueTracker.js.map +1 -1
  123. package/dist/plus/integrations/reads/issues.d.ts +27 -3
  124. package/dist/plus/integrations/reads/issues.d.ts.map +1 -1
  125. package/dist/plus/integrations/reads/issues.js +223 -123
  126. package/dist/plus/integrations/reads/issues.js.map +1 -1
  127. package/dist/plus/integrations/reads/ordering.d.ts +101 -0
  128. package/dist/plus/integrations/reads/ordering.d.ts.map +1 -0
  129. package/dist/plus/integrations/reads/ordering.js +48 -0
  130. package/dist/plus/integrations/reads/ordering.js.map +1 -0
  131. package/dist/plus/integrations/reads/searchIssues.d.ts +7 -2
  132. package/dist/plus/integrations/reads/searchIssues.d.ts.map +1 -1
  133. package/dist/plus/integrations/reads/searchIssues.js +9 -3
  134. package/dist/plus/integrations/reads/searchIssues.js.map +1 -1
  135. package/dist/plus/integrations/reads/searchPullRequests.d.ts +4 -3
  136. package/dist/plus/integrations/reads/searchPullRequests.d.ts.map +1 -1
  137. package/dist/plus/integrations/reads/searchPullRequests.js +6 -4
  138. package/dist/plus/integrations/reads/searchPullRequests.js.map +1 -1
  139. package/dist/plus/integrations/reads/sweeps.js +1 -1
  140. package/dist/plus/integrations/reads/sweeps.js.map +1 -1
  141. package/dist/plus/integrations/reads/warnings.d.ts +35 -3
  142. package/dist/plus/integrations/reads/warnings.d.ts.map +1 -1
  143. package/dist/plus/integrations/reads/warnings.js +58 -4
  144. package/dist/plus/integrations/reads/warnings.js.map +1 -1
  145. package/dist/plus/integrations/results.d.ts +15 -0
  146. package/dist/plus/integrations/results.d.ts.map +1 -1
  147. package/dist/plus/integrations/results.js.map +1 -1
  148. package/docs/integrations.md +76 -10
  149. package/docs/kepler-read-api-parity.md +9 -0
  150. package/package.json +2 -2
  151. package/src/git/models/issue.ts +73 -0
  152. package/src/git/models/pullRequest.ts +84 -0
  153. package/src/git/utils/issue.utils.ts +91 -1
  154. package/src/git/utils/pullRequest.utils.ts +50 -0
  155. package/src/plus/git-github/api/github.ts +356 -36
  156. package/src/plus/git-github/api/issueSearchQuery.ts +67 -7
  157. package/src/plus/git-github/api/pullRequestSearchQuery.ts +81 -7
  158. package/src/plus/git-github/models.ts +29 -5
  159. package/src/plus/integrations/collectionMetadata.ts +24 -0
  160. package/src/plus/integrations/integrationService.ts +40 -12
  161. package/src/plus/integrations/manager.ts +89 -35
  162. package/src/plus/integrations/models/gitHostIntegration.ts +47 -31
  163. package/src/plus/integrations/models/integration.ts +1 -0
  164. package/src/plus/integrations/models/issueReads.ts +65 -1
  165. package/src/plus/integrations/models/issuesIntegration.ts +7 -6
  166. package/src/plus/integrations/providerFilters.ts +8 -1
  167. package/src/plus/integrations/providers/accounts.ts +34 -0
  168. package/src/plus/integrations/providers/azureDevOps.ts +1 -0
  169. package/src/plus/integrations/providers/github.ts +134 -144
  170. package/src/plus/integrations/providers/gitlab.ts +29 -10
  171. package/src/plus/integrations/providers/issueSorts.ts +89 -0
  172. package/src/plus/integrations/providers/jira.ts +9 -3
  173. package/src/plus/integrations/providers/linear.ts +77 -8
  174. package/src/plus/integrations/providers/models.ts +185 -128
  175. package/src/plus/integrations/providers/providersApi.ts +51 -13
  176. package/src/plus/integrations/providers/pullRequestReviews.ts +122 -0
  177. package/src/plus/integrations/providers/trello.ts +4 -3
  178. package/src/plus/integrations/providers/utils/providerPaging.ts +6 -1
  179. package/src/plus/integrations/reads/broaden.ts +6 -0
  180. package/src/plus/integrations/reads/counts.ts +281 -3
  181. package/src/plus/integrations/reads/drains.ts +12 -2
  182. package/src/plus/integrations/reads/filters.ts +92 -8
  183. package/src/plus/integrations/reads/issueTracker.ts +78 -4
  184. package/src/plus/integrations/reads/issues.ts +386 -194
  185. package/src/plus/integrations/reads/ordering.ts +124 -0
  186. package/src/plus/integrations/reads/searchIssues.ts +15 -3
  187. package/src/plus/integrations/reads/searchPullRequests.ts +12 -4
  188. package/src/plus/integrations/reads/sweeps.ts +1 -1
  189. package/src/plus/integrations/reads/warnings.ts +84 -2
  190. package/src/plus/integrations/results.ts +15 -0
@@ -12,14 +12,30 @@ import { toTokenWithInfo } from '../authentication/models.js';
12
12
  import { toCollectionScopeFailure } from '../collectionMetadata.js';
13
13
  import { IssuesCloudHostIntegrationId } from '../constants.js';
14
14
  import { IntegrationReadUnavailableError } from '../errors.js';
15
+ import type { AccountWideIssuesResult, IssuesForProjectOptions, SearchMyIssuesOptions } from '../models/issueReads.js';
15
16
  import { IssuesIntegration } from '../models/issuesIntegration.js';
16
- import type { IssueFilter, ProviderApiCollectionResult, ProviderIssue } from './models.js';
17
+ import type { ProviderApiCollectionResult, ProviderIssue } from './models.js';
17
18
  import { fromProviderIssue, providersMetadata, toIssueShape } from './models.js';
18
19
  import { mergeCollectionMetadata } from './utils/providerPaging.js';
19
20
 
20
21
  const metadata = providersMetadata[IssuesCloudHostIntegrationId.Linear];
21
22
  const authProvider = Object.freeze({ id: metadata.id, scopes: metadata.scopes });
22
23
  const maxPagesPerRequest = 10;
24
+ /**
25
+ * The account-wide drain's own backstop, separate from {@link maxPagesPerRequest}.
26
+ *
27
+ * Raised to 50 (5,000 issues at the SDK's 100-per-page) because 10 no longer means what it used to. That read
28
+ * once fanned out over four overlapping relationship queries and merged them, so most of what a page cost was
29
+ * rows already returned — a low budget capped the waste. It is now a single server-ordered query over an `or`
30
+ * filter, so every page is 100 issues the caller has not seen, and the same budget just truncates real results
31
+ * at 1,000.
32
+ *
33
+ * Reaching it is reported rather than silent: {@link LinearIntegration.searchProviderMyIssuesWithTruncation}
34
+ * returns `truncated`, so the facade can say the read was incomplete instead of publishing a capped list as a
35
+ * whole account. The bound stays — a runaway cursor must not spend requests forever — but it is now set where a
36
+ * real Linear account is unlikely to reach it rather than where the duplication used to hurt.
37
+ */
38
+ const maxAccountWidePagesPerRequest = 50;
23
39
  const linearImplicitTeamsPageSize = 50;
24
40
 
25
41
  export interface LinearTeamDescriptor extends IssueResourceDescriptor {
@@ -194,7 +210,7 @@ export class LinearIntegration extends IssuesIntegration<IssuesCloudHostIntegrat
194
210
  protected override async getProviderIssuesForProject(
195
211
  session: ProviderAuthenticationSession,
196
212
  project: ResourceDescriptor,
197
- options?: { user?: string; filters?: IssueFilter[] },
213
+ options?: IssuesForProjectOptions,
198
214
  ): Promise<IssueShape[] | undefined> {
199
215
  return (await this.getProviderIssuesForProjectWithTruncation(session, project, options))?.values;
200
216
  }
@@ -202,7 +218,7 @@ export class LinearIntegration extends IssuesIntegration<IssuesCloudHostIntegrat
202
218
  protected override async getProviderIssuesForProjectWithTruncation(
203
219
  session: ProviderAuthenticationSession,
204
220
  project: ResourceDescriptor,
205
- options?: { user?: string; filters?: IssueFilter[] },
221
+ options?: IssuesForProjectOptions,
206
222
  ): Promise<{ values: IssueShape[]; truncated: boolean; metadata?: CollectionMetadata } | undefined> {
207
223
  if (!isIssueResourceDescriptor(project)) return undefined;
208
224
 
@@ -222,7 +238,7 @@ export class LinearIntegration extends IssuesIntegration<IssuesCloudHostIntegrat
222
238
  result = await api.getLinearIssues(
223
239
  toTokenWithInfo(this.id, session),
224
240
  { teams: [project.id] },
225
- { cursor: cursor },
241
+ { cursor: cursor, sort: options?.sort },
226
242
  );
227
243
  } catch (ex) {
228
244
  // A page failure after the first page leaves the already-drained prefix intact; record the
@@ -305,14 +321,45 @@ export class LinearIntegration extends IssuesIntegration<IssuesCloudHostIntegrat
305
321
  resources?: ResourceDescriptor[],
306
322
  cancellation?: AbortSignal,
307
323
  ): Promise<IssueShape[] | undefined> {
324
+ return (await this.searchProviderMyIssuesWithTruncation(session, resources, cancellation))?.values;
325
+ }
326
+
327
+ /**
328
+ * Account-wide "my issues" for Linear, drained to exhaustion and reporting whether it got there.
329
+ *
330
+ * The SDK read is one server-ordered query over an `or` filter across the four relationships (assigned,
331
+ * created, named in an issue's content, named in a comment), so each page is 100 issues the caller has not
332
+ * seen and the pages are ordered as one sequence. Draining it is therefore just following the cursor.
333
+ *
334
+ * Overridden rather than left to the base default because that default hardcodes `truncated: false`, and a
335
+ * bounded drain that stops early is exactly the case a caller must be able to see. Three things end the
336
+ * drain, and only one of them is completion:
337
+ *
338
+ * - the provider says there is no next page — complete;
339
+ * - the backstop is reached — `truncated`, because issues beyond it exist and were not read;
340
+ * - the provider claims a next page but hands back a cursor that does not advance — also `truncated`, since
341
+ * the read cannot continue and the remainder is unreachable rather than absent.
342
+ *
343
+ * Cancellation is deliberately NOT truncation: the caller asked for the read to stop, so the partial list is
344
+ * what it asked for, and flagging it would surface an incompleteness warning for a user action.
345
+ */
346
+ protected override async searchProviderMyIssuesWithTruncation(
347
+ session: ProviderAuthenticationSession,
348
+ resources?: ResourceDescriptor[],
349
+ cancellation?: AbortSignal,
350
+ options?: SearchMyIssuesOptions,
351
+ ): Promise<AccountWideIssuesResult | undefined> {
308
352
  if (resources != null) {
309
353
  return undefined;
310
354
  }
311
355
 
312
356
  const api = await this.getProvidersApi();
313
357
  let cursor = undefined;
314
- let hasMore: boolean;
358
+ // Starts false so an immediate cancellation, which leaves the loop before the first response, reads as
359
+ // "no more pages known" rather than as an unfinished drain.
360
+ let hasMore = false;
315
361
  let requestCount = 0;
362
+ let truncated = false;
316
363
  const issues = [];
317
364
  try {
318
365
  do {
@@ -322,25 +369,47 @@ export class LinearIntegration extends IssuesIntegration<IssuesCloudHostIntegrat
322
369
 
323
370
  const result = await api.getIssuesForCurrentUser(toTokenWithInfo(this.id, session), {
324
371
  cursor: cursor,
372
+ sort: options?.sort,
325
373
  });
326
374
  requestCount += 1;
327
375
  hasMore = result.paging?.more ?? false;
328
- cursor = result.paging?.cursor;
376
+ const nextCursor = result.paging?.cursor;
377
+
378
+ // Keep this page before deciding whether to continue: the request is already paid for, so
379
+ // dropping its rows would lose real results to save nothing.
329
380
  const formattedIssues = result.values
330
381
  .map(issue => toIssueShape(issue, this))
331
382
  .filter((result): result is IssueShape => result != null);
332
383
  if (formattedIssues.length > 0) {
333
384
  issues.push(...formattedIssues);
334
385
  }
335
- } while (requestCount < maxPagesPerRequest && hasMore);
386
+
387
+ // The provider claims more but hands back no advancing cursor: continuing would re-read the page
388
+ // just returned. `ProvidersApi.getPagedResult` already normalizes this into `more: false`, so
389
+ // this is a backstop for if that ever stops holding rather than a case seen today -- but the rest
390
+ // of the account is unreachable either way, which is what `truncated` says.
391
+ if (hasMore && (nextCursor == null || nextCursor === cursor)) {
392
+ truncated = true;
393
+ break;
394
+ }
395
+
396
+ cursor = nextCursor;
397
+ } while (requestCount < maxAccountWidePagesPerRequest && hasMore);
398
+
399
+ // Ran out of budget with pages still to come.
400
+ if (hasMore && requestCount >= maxAccountWidePagesPerRequest) {
401
+ truncated = true;
402
+ }
336
403
  } catch (ex) {
337
404
  if (issues.length === 0) {
338
405
  throw ex;
339
406
  }
340
407
 
408
+ // Kept what was already fetched, so the list is real but short of the account.
409
+ truncated = true;
341
410
  Logger.error(ex, 'searchProviderMyIssues');
342
411
  }
343
- return issues;
412
+ return { values: issues, truncated: truncated };
344
413
  }
345
414
  protected override async getProviderLinkedIssueOrPullRequest(
346
415
  session: ProviderAuthenticationSession,