@gitkraken/core-gitlens 0.7.0 → 0.7.1
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.
- package/CHANGELOG.md +21 -2
- package/dist/git/remotes/azure-devops.js +3 -3
- package/dist/git/remotes/azure-devops.js.map +1 -1
- package/dist/git-cli/exec/git.js +1 -1
- package/dist/git-cli/providers/config.js +2 -2
- package/dist/git-cli/providers/pausedOperations.js +2 -2
- package/dist/git-cli/providers/pausedOperations.js.map +1 -1
- package/dist/git-cli/providers/staging.js +1 -1
- package/dist/ipc/discovery.js +1 -1
- package/dist/plus/agents/providers/claudeCodeTranscript.js +6 -6
- package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -1
- package/dist/plus/ai/providers/openAICompatibleProviderBase.js +1 -1
- package/dist/plus/integrations/authentication/configuredIntegrationService.js +9 -2
- package/dist/plus/integrations/authentication/configuredIntegrationService.js.map +1 -1
- package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js +1 -1
- package/dist/plus/integrations/index.d.ts +2 -2
- package/dist/plus/integrations/index.js.map +1 -1
- package/dist/plus/integrations/integrationService.d.ts +34 -0
- package/dist/plus/integrations/integrationService.js +90 -43
- package/dist/plus/integrations/integrationService.js.map +1 -1
- package/dist/plus/integrations/lite.js +5 -4
- package/dist/plus/integrations/lite.js.map +1 -1
- package/dist/plus/integrations/manager.d.ts +68 -23
- package/dist/plus/integrations/models/gitHostIntegration.d.ts +30 -14
- package/dist/plus/integrations/models/gitHostIntegration.js +59 -21
- package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
- package/dist/plus/integrations/models/integration.d.ts +3 -3
- package/dist/plus/integrations/models/integration.js +1 -1
- package/dist/plus/integrations/models/integration.js.map +1 -1
- package/dist/plus/integrations/models/issueReads.d.ts +17 -0
- package/dist/plus/integrations/models/pullRequestReads.d.ts +26 -0
- package/dist/plus/integrations/providers/azure/azure.d.ts +66 -1
- package/dist/plus/integrations/providers/azure/azure.js +192 -12
- package/dist/plus/integrations/providers/azure/azure.js.map +1 -1
- package/dist/plus/integrations/providers/azure/search.d.ts +144 -0
- package/dist/plus/integrations/providers/azure/search.js +250 -0
- package/dist/plus/integrations/providers/azure/search.js.map +1 -0
- package/dist/plus/integrations/providers/azureDevOps.d.ts +54 -35
- package/dist/plus/integrations/providers/azureDevOps.js +154 -121
- package/dist/plus/integrations/providers/azureDevOps.js.map +1 -1
- package/dist/plus/integrations/providers/azureDevOpsServer.d.ts +176 -0
- package/dist/plus/integrations/providers/azureDevOpsServer.js +560 -0
- package/dist/plus/integrations/providers/azureDevOpsServer.js.map +1 -0
- package/dist/plus/integrations/providers/bitbucket-server/discovery.d.ts +12 -0
- package/dist/plus/integrations/providers/bitbucket-server/discovery.js +128 -0
- package/dist/plus/integrations/providers/bitbucket-server/discovery.js.map +1 -0
- package/dist/plus/integrations/providers/bitbucket-server/models.d.ts +10 -1
- package/dist/plus/integrations/providers/bitbucket-server/models.js +3 -2
- package/dist/plus/integrations/providers/bitbucket-server/models.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket-server/pullRequestSearch.d.ts +58 -0
- package/dist/plus/integrations/providers/bitbucket-server/pullRequestSearch.js +485 -0
- package/dist/plus/integrations/providers/bitbucket-server/pullRequestSearch.js.map +1 -0
- package/dist/plus/integrations/providers/bitbucket-server.d.ts +52 -3
- package/dist/plus/integrations/providers/bitbucket-server.js +96 -20
- package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket.js +1 -1
- package/dist/plus/integrations/providers/github.d.ts +5 -5
- package/dist/plus/integrations/providers/github.js +34 -33
- package/dist/plus/integrations/providers/github.js.map +1 -1
- package/dist/plus/integrations/providers/gitlab.d.ts +5 -3
- package/dist/plus/integrations/providers/gitlab.js +31 -27
- package/dist/plus/integrations/providers/gitlab.js.map +1 -1
- package/dist/plus/integrations/providers/issueSorts.d.ts +1 -0
- package/dist/plus/integrations/providers/jira-server.d.ts +9 -0
- package/dist/plus/integrations/providers/jira-server.js +13 -2
- package/dist/plus/integrations/providers/jira-server.js.map +1 -1
- package/dist/plus/integrations/providers/jira.js +1 -1
- package/dist/plus/integrations/providers/linear.js +1 -1
- package/dist/plus/integrations/providers/models.d.ts +9 -0
- package/dist/plus/integrations/providers/models.js +86 -0
- package/dist/plus/integrations/providers/models.js.map +1 -1
- package/dist/plus/integrations/providers/providersApi.d.ts +10 -0
- package/dist/plus/integrations/providers/providersApi.js +16 -1
- package/dist/plus/integrations/providers/providersApi.js.map +1 -1
- package/dist/plus/integrations/providers/utils.d.ts +12 -1
- package/dist/plus/integrations/providers/utils.js +36 -6
- package/dist/plus/integrations/providers/utils.js.map +1 -1
- package/dist/plus/integrations/reads/broaden.js +5 -5
- package/dist/plus/integrations/reads/broaden.js.map +1 -1
- package/dist/plus/integrations/reads/counts.d.ts +18 -4
- package/dist/plus/integrations/reads/counts.js +66 -15
- package/dist/plus/integrations/reads/counts.js.map +1 -1
- package/dist/plus/integrations/reads/cursors.js +1 -1
- package/dist/plus/integrations/reads/drains.d.ts +1 -0
- package/dist/plus/integrations/reads/filters.d.ts +1 -1
- package/dist/plus/integrations/reads/filters.js +17 -12
- package/dist/plus/integrations/reads/filters.js.map +1 -1
- package/dist/plus/integrations/reads/hierarchy.js +1 -1
- package/dist/plus/integrations/reads/hierarchy.js.map +1 -1
- package/dist/plus/integrations/reads/issueTracker.js +1 -1
- package/dist/plus/integrations/reads/issues.js +1 -1
- package/dist/plus/integrations/reads/paging.js +1 -1
- package/dist/plus/integrations/reads/resolveRepository.d.ts +12 -11
- package/dist/plus/integrations/reads/resolveRepository.js +109 -18
- package/dist/plus/integrations/reads/resolveRepository.js.map +1 -1
- package/dist/plus/integrations/reads/searchIssues.js +4 -2
- package/dist/plus/integrations/reads/searchIssues.js.map +1 -1
- package/dist/plus/integrations/reads/searchPullRequests.js +9 -3
- package/dist/plus/integrations/reads/searchPullRequests.js.map +1 -1
- package/dist/plus/integrations/reads/trackerIssue.d.ts +9 -5
- package/dist/plus/integrations/reads/trackerIssue.js +15 -9
- package/dist/plus/integrations/reads/trackerIssue.js.map +1 -1
- package/dist/plus/integrations/reads/warnings.d.ts +6 -2
- package/dist/plus/integrations/reads/warnings.js +15 -19
- package/dist/plus/integrations/reads/warnings.js.map +1 -1
- package/dist/plus/integrations/utils/domain.utils.d.ts +19 -0
- package/dist/plus/integrations/utils/domain.utils.js +36 -1
- package/dist/plus/integrations/utils/domain.utils.js.map +1 -1
- package/dist/plus/integrations/utils/integration.utils.d.ts +1 -0
- package/dist/plus/integrations/utils/integration.utils.js +12 -1
- package/dist/plus/integrations/utils/integration.utils.js.map +1 -1
- package/dist/utils/env/node/exec.js +2 -2
- package/docs/integrations.md +176 -73
- package/docs/kepler-read-api-parity.md +19 -6
- package/package.json +1 -1
|
@@ -2,15 +2,18 @@ import { PagedResult } from "../../../utils/paging.js";
|
|
|
2
2
|
import { Emitter } from "../../../utils/event.js";
|
|
3
3
|
import { IssueOrPullRequest, IssueOrPullRequestState, IssueOrPullRequestType } from "../../../git/models/issueOrPullRequest.js";
|
|
4
4
|
import { Issue, IssueShape } from "../../../git/models/issue.js";
|
|
5
|
-
import { PullRequest, PullRequestFilter, PullRequestMergeMethod, PullRequestStateFilter } from "../../../git/models/pullRequest.js";
|
|
5
|
+
import { PullRequest, PullRequestFilter, PullRequestMergeMethod, PullRequestSearchCriteria, PullRequestStateFilter } from "../../../git/models/pullRequest.js";
|
|
6
6
|
import { Account, UnidentifiedAuthor } from "../../../git/models/author.js";
|
|
7
7
|
import { DefaultBranch } from "../../../git/models/defaultBranch.js";
|
|
8
8
|
import { RepositoryMetadata } from "../../../git/models/repositoryMetadata.js";
|
|
9
9
|
import { AuthenticationSessionLike, ProviderAuthenticationSession } from "../authentication/models.js";
|
|
10
10
|
import { GitSelfManagedHostIntegrationId } from "../constants.js";
|
|
11
|
+
import { ProviderPullRequestCount, ProviderPullRequestSearchPage } from "../models/pullRequestReads.js";
|
|
11
12
|
import { ProvidersApi } from "./providersApi.js";
|
|
12
13
|
import { GitHostIntegration, SearchMyPullRequestsOptions, SearchPullRequestsOptions } from "../models/gitHostIntegration.js";
|
|
13
|
-
import
|
|
14
|
+
import "../models/integration.js";
|
|
15
|
+
import { ProviderOrganization } from "../results.js";
|
|
16
|
+
import { ProviderHierarchyResult, ProviderPullRequest, ProviderRepoInput, ProviderRepository } from "./models.js";
|
|
14
17
|
import { IntegrationConnectionChangeEvent } from "../integrationService.js";
|
|
15
18
|
import { IntegrationAuthenticationService } from "../authentication/integrationAuthenticationService.js";
|
|
16
19
|
import { IntegrationAuthenticationProviderDescriptor } from "../authentication/integrationAuthenticationProvider.js";
|
|
@@ -25,7 +28,7 @@ export declare class BitbucketServerIntegration extends GitHostIntegration<GitSe
|
|
|
25
28
|
readonly name: string;
|
|
26
29
|
constructor(ctx: IntegrationServiceContext, authenticationService: IntegrationAuthenticationService, getProvidersApi: () => Promise<ProvidersApi>, didChangeConnection: Emitter<IntegrationConnectionChangeEvent>, _domain: string);
|
|
27
30
|
get domain(): string;
|
|
28
|
-
protected
|
|
31
|
+
protected apiBaseUrlFor(session: ProviderAuthenticationSession): string;
|
|
29
32
|
protected mergeProviderPullRequest(session: ProviderAuthenticationSession, pr: PullRequest, options?: {
|
|
30
33
|
mergeMethod?: PullRequestMergeMethod;
|
|
31
34
|
}): Promise<boolean>;
|
|
@@ -53,8 +56,21 @@ export declare class BitbucketServerIntegration extends GitHostIntegration<GitSe
|
|
|
53
56
|
connectionId?: string;
|
|
54
57
|
}): Promise<ProviderRepository | undefined>;
|
|
55
58
|
protected getProviderRepositoryMetadata(_session: AuthenticationSessionLike, _repo: BitbucketRepositoryDescriptor, _cancellation?: AbortSignal): Promise<RepositoryMetadata | undefined>;
|
|
59
|
+
/**
|
|
60
|
+
* Accounts by {@link getAccountKey}. One integration serves every installation on its host, and installations
|
|
61
|
+
* mounted at different context paths are different servers whose users differ, even under the same token.
|
|
62
|
+
*/
|
|
56
63
|
private _accounts;
|
|
64
|
+
/** The installation the session's reads address, plus the credential — what decides whose account it is. */
|
|
65
|
+
private getAccountKey;
|
|
57
66
|
protected getProviderCurrentAccount(session: ProviderAuthenticationSession): Promise<Account | undefined>;
|
|
67
|
+
protected getProviderOrganizationsForUser(session: ProviderAuthenticationSession): Promise<ProviderHierarchyResult<ProviderOrganization>>;
|
|
68
|
+
protected getProviderRepositoriesForOrg(session: ProviderAuthenticationSession, org: string, options?: {
|
|
69
|
+
cursor?: string;
|
|
70
|
+
}): Promise<ProviderHierarchyResult<ProviderRepository>>;
|
|
71
|
+
protected getProviderRepositoriesForUser(session: ProviderAuthenticationSession, options?: {
|
|
72
|
+
cursor?: string;
|
|
73
|
+
}): Promise<ProviderHierarchyResult<ProviderRepository>>;
|
|
58
74
|
protected searchProviderMyPullRequests(session: ProviderAuthenticationSession, repos?: BitbucketRepositoryDescriptor[], _cancellation?: AbortSignal, options?: SearchMyPullRequestsOptions): Promise<PullRequest[] | undefined>;
|
|
59
75
|
protected getProviderMyPullRequestsForUser(session: ProviderAuthenticationSession, options?: {
|
|
60
76
|
state?: PullRequestStateFilter[];
|
|
@@ -62,6 +78,39 @@ export declare class BitbucketServerIntegration extends GitHostIntegration<GitSe
|
|
|
62
78
|
filters?: PullRequestFilter[];
|
|
63
79
|
}): Promise<PagedResult<ProviderPullRequest> | undefined>;
|
|
64
80
|
protected searchProviderPullRequests(session: ProviderAuthenticationSession, searchQuery: string, repos?: BitbucketRepositoryDescriptor[], cancellation?: AbortSignal, options?: SearchPullRequestsOptions): Promise<PullRequest[] | undefined>;
|
|
81
|
+
/**
|
|
82
|
+
* The filtered pull-request search, read by this module's own requests rather than the SDK's: the SDK's list
|
|
83
|
+
* reads carry no text, draft or participant-status filter and no per-facet continuation. Every request goes to
|
|
84
|
+
* the session's own address, context path included, so one connection's cursor can't be replayed on another.
|
|
85
|
+
*/
|
|
86
|
+
protected searchProviderPullRequestsPage(session: ProviderAuthenticationSession, options: {
|
|
87
|
+
repos?: ProviderRepoInput[];
|
|
88
|
+
org?: string;
|
|
89
|
+
criteria?: PullRequestSearchCriteria;
|
|
90
|
+
cursor?: string;
|
|
91
|
+
pageSize?: number;
|
|
92
|
+
summary?: boolean;
|
|
93
|
+
}, cancellation?: AbortSignal): Promise<ProviderPullRequestSearchPage | undefined>;
|
|
94
|
+
/**
|
|
95
|
+
* Counts each scope by reading it, since Bitbucket Data Center has neither a count query nor a total on its
|
|
96
|
+
* pages. The facade hands over one scope per call and runs those calls concurrently (see `countPullRequests`),
|
|
97
|
+
* so scopes here are counted one after another rather than multiplying that concurrency.
|
|
98
|
+
*/
|
|
99
|
+
protected countProviderPullRequests(session: ProviderAuthenticationSession, scopes: readonly {
|
|
100
|
+
repos?: ProviderRepoInput[];
|
|
101
|
+
org?: string;
|
|
102
|
+
criteria?: PullRequestSearchCriteria;
|
|
103
|
+
}[], cancellation?: AbortSignal): Promise<ProviderPullRequestCount[] | undefined>;
|
|
104
|
+
/**
|
|
105
|
+
* The session's own user, which a relationship facet filters by. Resolved per session rather than from the
|
|
106
|
+
* primary connection, so a read pinned to one account never filters by another's identity; an account that
|
|
107
|
+
* can't be resolved refuses the read instead of widening it to everyone's pull requests.
|
|
108
|
+
*
|
|
109
|
+
* The lookup is raced against `cancellation` so a cancelled read settles at once. The SDK's current-user read
|
|
110
|
+
* takes no signal, so the request itself runs on; its answer still lands in the per-token account cache, so a
|
|
111
|
+
* cold lookup a cancellation abandoned isn't wasted on the next read.
|
|
112
|
+
*/
|
|
113
|
+
private getSearchUser;
|
|
65
114
|
private getWorkspaceRepoInputs;
|
|
66
115
|
protected searchProviderMyIssues(_session: AuthenticationSessionLike, _repos?: BitbucketRepositoryDescriptor[]): Promise<IssueShape[] | undefined>;
|
|
67
116
|
/**
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { CancellationError } from "../../../utils/cancellation.js";
|
|
1
|
+
import { CancellationError, raceWithSignal } from "../../../utils/cancellation.js";
|
|
2
2
|
import { nonnullSettled } from "../../../utils/promise.js";
|
|
3
3
|
import { md5 } from "../../../utils/crypto.js";
|
|
4
4
|
import "../../../git/models/pullRequest.js";
|
|
5
5
|
import "../constants.js";
|
|
6
6
|
import { toTokenWithInfo } from "../authentication/models.js";
|
|
7
|
-
import { ProviderPullRequestReviewState, fromProviderPullRequest, providerPullRequestMatchesSearch, providersMetadata, toProviderPullRequestStates } from "./models.js";
|
|
8
7
|
import { collectProviderPagedResult, flatSettledOrThrow, parsePageCursor, toPageCursor } from "./utils/providerPaging.js";
|
|
8
|
+
import { ProviderPullRequestReviewState, fromProviderPullRequest, providerPullRequestMatchesSearch, providersMetadata, toProviderPullRequestStates } from "./models.js";
|
|
9
9
|
import { GitHostIntegration } from "../models/gitHostIntegration.js";
|
|
10
10
|
//#region ../plus/integrations/src/providers/bitbucket-server.ts
|
|
11
11
|
const metadata = providersMetadata["bitbucket-server"];
|
|
@@ -26,17 +26,17 @@ var BitbucketServerIntegration = class extends GitHostIntegration {
|
|
|
26
26
|
get domain() {
|
|
27
27
|
return this._domain;
|
|
28
28
|
}
|
|
29
|
-
|
|
30
|
-
return
|
|
29
|
+
apiBaseUrlFor(session) {
|
|
30
|
+
return this.getSelfManagedApiBaseUrl(session);
|
|
31
31
|
}
|
|
32
32
|
async mergeProviderPullRequest(session, pr, options) {
|
|
33
33
|
return (await this.getProvidersApi()).mergePullRequest(toTokenWithInfo(this.id, session), pr, {
|
|
34
34
|
mergeMethod: options?.mergeMethod,
|
|
35
|
-
baseUrl: this.
|
|
35
|
+
baseUrl: this.apiBaseUrlFor(session)
|
|
36
36
|
});
|
|
37
37
|
}
|
|
38
38
|
async getProviderAccountForCommit(session, repo, rev, options) {
|
|
39
|
-
return (await this.authenticationService.apis.bitbucket)?.getServerAccountForCommit(this, toTokenWithInfo(this.id, session), repo.owner, repo.name, rev, this.
|
|
39
|
+
return (await this.authenticationService.apis.bitbucket)?.getServerAccountForCommit(this, toTokenWithInfo(this.id, session), repo.owner, repo.name, rev, this.apiBaseUrlFor(session), { avatarSize: options?.avatarSize });
|
|
40
40
|
}
|
|
41
41
|
async getProviderAccountForEmail(_session, _repo, _email, _options) {
|
|
42
42
|
return Promise.resolve(void 0);
|
|
@@ -46,33 +46,41 @@ var BitbucketServerIntegration = class extends GitHostIntegration {
|
|
|
46
46
|
}
|
|
47
47
|
async getProviderLinkedIssueOrPullRequest(session, repo, { id }, type) {
|
|
48
48
|
if (type === "issue") return;
|
|
49
|
-
return (await this.authenticationService.apis.bitbucket)?.getServerPullRequestById(this, toTokenWithInfo(this.id, session), repo.owner, repo.name, id, this.
|
|
49
|
+
return (await this.authenticationService.apis.bitbucket)?.getServerPullRequestById(this, toTokenWithInfo(this.id, session), repo.owner, repo.name, id, this.apiBaseUrlFor(session));
|
|
50
50
|
}
|
|
51
51
|
async getProviderIssue(_session, _repo, _id) {
|
|
52
52
|
return Promise.resolve(void 0);
|
|
53
53
|
}
|
|
54
54
|
async getProviderPullRequestForBranch(session, repo, branch, _options) {
|
|
55
|
-
return (await this.authenticationService.apis.bitbucket)?.getServerPullRequestForBranch(this, toTokenWithInfo(this.id, session), repo.owner, repo.name, branch, this.
|
|
55
|
+
return (await this.authenticationService.apis.bitbucket)?.getServerPullRequestForBranch(this, toTokenWithInfo(this.id, session), repo.owner, repo.name, branch, this.apiBaseUrlFor(session));
|
|
56
56
|
}
|
|
57
57
|
async getProviderPullRequestForCommit(session, repo, rev) {
|
|
58
|
-
return (await this.authenticationService.apis.bitbucket)?.getServerPullRequestForCommit(this, toTokenWithInfo(this.id, session), repo.owner, repo.name, rev, this.
|
|
58
|
+
return (await this.authenticationService.apis.bitbucket)?.getServerPullRequestForCommit(this, toTokenWithInfo(this.id, session), repo.owner, repo.name, rev, this.apiBaseUrlFor(session));
|
|
59
59
|
}
|
|
60
60
|
async getRepoInfo(repo) {
|
|
61
61
|
const api = await this.getProvidersApi();
|
|
62
62
|
const session = await this.resolveReadSession(repo.connectionId, void 0);
|
|
63
63
|
if (session == null) return void 0;
|
|
64
|
-
return api.getRepo(toTokenWithInfo(this.id, session), repo.owner, repo.name, repo.project, { baseUrl: this.
|
|
64
|
+
return api.getRepo(toTokenWithInfo(this.id, session), repo.owner, repo.name, repo.project, { baseUrl: this.apiBaseUrlFor(session) });
|
|
65
65
|
}
|
|
66
66
|
async getProviderRepositoryMetadata(_session, _repo, _cancellation) {
|
|
67
67
|
return Promise.resolve(void 0);
|
|
68
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* Accounts by {@link getAccountKey}. One integration serves every installation on its host, and installations
|
|
71
|
+
* mounted at different context paths are different servers whose users differ, even under the same token.
|
|
72
|
+
*/
|
|
69
73
|
_accounts;
|
|
74
|
+
/** The installation the session's reads address, plus the credential — what decides whose account it is. */
|
|
75
|
+
getAccountKey(session) {
|
|
76
|
+
return `${this.apiBaseUrlFor(session)}\n${session.accessToken}`;
|
|
77
|
+
}
|
|
70
78
|
async getProviderCurrentAccount(session) {
|
|
71
|
-
const
|
|
79
|
+
const key = this.getAccountKey(session);
|
|
72
80
|
this._accounts ??= /* @__PURE__ */ new Map();
|
|
73
|
-
if (this._accounts.get(
|
|
74
|
-
const user = await (await this.getProvidersApi()).getCurrentUser(toTokenWithInfo(this.id, session), { baseUrl: this.
|
|
75
|
-
this._accounts.set(
|
|
81
|
+
if (this._accounts.get(key) == null) {
|
|
82
|
+
const user = await (await this.getProvidersApi()).getCurrentUser(toTokenWithInfo(this.id, session), { baseUrl: this.apiBaseUrlFor(session) });
|
|
83
|
+
this._accounts.set(key, user ? {
|
|
76
84
|
provider: this,
|
|
77
85
|
id: user.id,
|
|
78
86
|
name: user.name ?? void 0,
|
|
@@ -81,19 +89,31 @@ var BitbucketServerIntegration = class extends GitHostIntegration {
|
|
|
81
89
|
username: user.username ?? void 0
|
|
82
90
|
} : void 0);
|
|
83
91
|
}
|
|
84
|
-
return this._accounts.get(
|
|
92
|
+
return this._accounts.get(key);
|
|
93
|
+
}
|
|
94
|
+
async getProviderOrganizationsForUser(session) {
|
|
95
|
+
return (await this.getProvidersApi()).getBitbucketServerProjects(toTokenWithInfo(this.id, session), this.apiBaseUrlFor(session), session.id);
|
|
96
|
+
}
|
|
97
|
+
async getProviderRepositoriesForOrg(session, org, options) {
|
|
98
|
+
return (await this.getProvidersApi()).getBitbucketServerRepositories(toTokenWithInfo(this.id, session), this.apiBaseUrlFor(session), session.id, {
|
|
99
|
+
project: org,
|
|
100
|
+
cursor: options?.cursor
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
async getProviderRepositoriesForUser(session, options) {
|
|
104
|
+
return (await this.getProvidersApi()).getBitbucketServerRepositories(toTokenWithInfo(this.id, session), this.apiBaseUrlFor(session), session.id, options);
|
|
85
105
|
}
|
|
86
106
|
async searchProviderMyPullRequests(session, repos, _cancellation, options) {
|
|
87
107
|
if (repos != null) return;
|
|
88
108
|
const api = await this.getProvidersApi();
|
|
89
109
|
if (!api) return;
|
|
90
|
-
return (await api.getBitbucketServerPullRequestsForCurrentUser(toTokenWithInfo(this.id, session), this.
|
|
110
|
+
return (await api.getBitbucketServerPullRequestsForCurrentUser(toTokenWithInfo(this.id, session), this.apiBaseUrlFor(session), { states: toProviderPullRequestStates(options?.state) }))?.data.map((pr) => fromProviderPullRequest(pr, this));
|
|
91
111
|
}
|
|
92
112
|
async getProviderMyPullRequestsForUser(session, options) {
|
|
93
113
|
const api = await this.getProvidersApi();
|
|
94
114
|
const states = toProviderPullRequestStates(options?.state);
|
|
95
115
|
const page = parsePageCursor(options?.cursor);
|
|
96
|
-
const result = await api.getBitbucketServerPullRequestsForCurrentUser(toTokenWithInfo(this.id, session), this.
|
|
116
|
+
const result = await api.getBitbucketServerPullRequestsForCurrentUser(toTokenWithInfo(this.id, session), this.apiBaseUrlFor(session), {
|
|
97
117
|
states,
|
|
98
118
|
page
|
|
99
119
|
});
|
|
@@ -130,7 +150,7 @@ var BitbucketServerIntegration = class extends GitHostIntegration {
|
|
|
130
150
|
return (await collectProviderPagedResult((cursor) => {
|
|
131
151
|
if (cancellation?.aborted) throw new CancellationError();
|
|
132
152
|
return api.getPullRequestsForRepo(token, repo, {
|
|
133
|
-
baseUrl: this.
|
|
153
|
+
baseUrl: this.apiBaseUrlFor(session),
|
|
134
154
|
cursor,
|
|
135
155
|
states
|
|
136
156
|
});
|
|
@@ -139,6 +159,61 @@ var BitbucketServerIntegration = class extends GitHostIntegration {
|
|
|
139
159
|
if (cancellation?.aborted) throw new CancellationError();
|
|
140
160
|
return providerPullRequests.filter((pr) => providerPullRequestMatchesSearch(pr, searchQuery)).map((pr) => fromProviderPullRequest(pr, this));
|
|
141
161
|
}
|
|
162
|
+
/**
|
|
163
|
+
* The filtered pull-request search, read by this module's own requests rather than the SDK's: the SDK's list
|
|
164
|
+
* reads carry no text, draft or participant-status filter and no per-facet continuation. Every request goes to
|
|
165
|
+
* the session's own address, context path included, so one connection's cursor can't be replayed on another.
|
|
166
|
+
*/
|
|
167
|
+
async searchProviderPullRequestsPage(session, options, cancellation) {
|
|
168
|
+
return (await this.getProvidersApi()).searchBitbucketServerPullRequestsPage(toTokenWithInfo(this.id, session), {
|
|
169
|
+
baseUrl: this.apiBaseUrlFor(session),
|
|
170
|
+
connectionId: session.id,
|
|
171
|
+
provider: this,
|
|
172
|
+
repos: options.repos,
|
|
173
|
+
org: options.org,
|
|
174
|
+
criteria: options.criteria,
|
|
175
|
+
currentUser: await this.getSearchUser(session, options.criteria, cancellation),
|
|
176
|
+
cursor: options.cursor,
|
|
177
|
+
pageSize: options.pageSize
|
|
178
|
+
}, cancellation);
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Counts each scope by reading it, since Bitbucket Data Center has neither a count query nor a total on its
|
|
182
|
+
* pages. The facade hands over one scope per call and runs those calls concurrently (see `countPullRequests`),
|
|
183
|
+
* so scopes here are counted one after another rather than multiplying that concurrency.
|
|
184
|
+
*/
|
|
185
|
+
async countProviderPullRequests(session, scopes, cancellation) {
|
|
186
|
+
const api = await this.getProvidersApi();
|
|
187
|
+
const token = toTokenWithInfo(this.id, session);
|
|
188
|
+
const counts = [];
|
|
189
|
+
for (const scope of scopes) counts.push(await api.countBitbucketServerPullRequests(token, {
|
|
190
|
+
baseUrl: this.apiBaseUrlFor(session),
|
|
191
|
+
repos: scope.repos,
|
|
192
|
+
org: scope.org,
|
|
193
|
+
criteria: scope.criteria,
|
|
194
|
+
currentUser: await this.getSearchUser(session, scope.criteria, cancellation)
|
|
195
|
+
}, cancellation));
|
|
196
|
+
return counts;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* The session's own user, which a relationship facet filters by. Resolved per session rather than from the
|
|
200
|
+
* primary connection, so a read pinned to one account never filters by another's identity; an account that
|
|
201
|
+
* can't be resolved refuses the read instead of widening it to everyone's pull requests.
|
|
202
|
+
*
|
|
203
|
+
* The lookup is raced against `cancellation` so a cancelled read settles at once. The SDK's current-user read
|
|
204
|
+
* takes no signal, so the request itself runs on; its answer still lands in the per-token account cache, so a
|
|
205
|
+
* cold lookup a cancellation abandoned isn't wasted on the next read.
|
|
206
|
+
*/
|
|
207
|
+
async getSearchUser(session, criteria, cancellation) {
|
|
208
|
+
if (!criteria?.relationships?.length) return void 0;
|
|
209
|
+
const lookup = this.getProviderCurrentAccount(session);
|
|
210
|
+
const account = await (cancellation != null ? raceWithSignal(lookup, cancellation) : lookup);
|
|
211
|
+
if (account?.id == null || account.username == null) throw new Error("Unable to resolve the current Bitbucket Data Center account for a relationship search.");
|
|
212
|
+
return {
|
|
213
|
+
id: account.id,
|
|
214
|
+
username: account.username
|
|
215
|
+
};
|
|
216
|
+
}
|
|
142
217
|
async getWorkspaceRepoInputs() {
|
|
143
218
|
const remotes = await this.ctx.repositories.getOpenRemotes();
|
|
144
219
|
const inputs = await nonnullSettled(remotes.map(async (r) => {
|
|
@@ -170,7 +245,8 @@ var BitbucketServerIntegration = class extends GitHostIntegration {
|
|
|
170
245
|
storagePrefix = "bitbucket-server";
|
|
171
246
|
async providerOnConnect() {
|
|
172
247
|
if (this._session == null) return;
|
|
173
|
-
const
|
|
248
|
+
const accountKey = this.getAccountKey(this._session);
|
|
249
|
+
const accountStorageKey = md5(accountKey);
|
|
174
250
|
const storedAccount = this.ctx.storage.get(`${this.storagePrefix}:${accountStorageKey}:account`);
|
|
175
251
|
let account = storedAccount?.data ? {
|
|
176
252
|
...storedAccount.data,
|
|
@@ -194,7 +270,7 @@ var BitbucketServerIntegration = class extends GitHostIntegration {
|
|
|
194
270
|
}
|
|
195
271
|
}
|
|
196
272
|
this._accounts ??= /* @__PURE__ */ new Map();
|
|
197
|
-
this._accounts.set(
|
|
273
|
+
this._accounts.set(accountKey, account);
|
|
198
274
|
}
|
|
199
275
|
providerOnDisconnect() {
|
|
200
276
|
this._accounts = void 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bitbucket-server.js","names":[],"sources":["../../../../../plus/integrations/src/providers/bitbucket-server.ts"],"sourcesContent":["import type { Account, UnidentifiedAuthor } from '@gitlens/git/models/author.js';\nimport type { DefaultBranch } from '@gitlens/git/models/defaultBranch.js';\nimport type { Issue, IssueShape } from '@gitlens/git/models/issue.js';\nimport type { IssueOrPullRequest, IssueOrPullRequestType } from '@gitlens/git/models/issueOrPullRequest.js';\nimport type {\n\tPullRequest,\n\tPullRequestMergeMethod,\n\tPullRequestState,\n\tPullRequestStateFilter,\n} from '@gitlens/git/models/pullRequest.js';\nimport type { GitRemote } from '@gitlens/git/models/remote.js';\nimport type { RepositoryMetadata } from '@gitlens/git/models/repositoryMetadata.js';\nimport { CancellationError } from '@gitlens/utils/cancellation.js';\nimport { md5 } from '@gitlens/utils/crypto.js';\nimport type { Emitter } from '@gitlens/utils/event.js';\nimport type { PagedResult } from '@gitlens/utils/paging.js';\nimport { nonnullSettled } from '@gitlens/utils/promise.js';\nimport type { IntegrationAuthenticationProviderDescriptor } from '../authentication/integrationAuthenticationProvider.js';\nimport type { IntegrationAuthenticationService } from '../authentication/integrationAuthenticationService.js';\nimport type {\n\tAuthenticationSessionLike as AuthenticationSession,\n\tProviderAuthenticationSession,\n} from '../authentication/models.js';\nimport { toTokenWithInfo } from '../authentication/models.js';\nimport { GitSelfManagedHostIntegrationId } from '../constants.js';\nimport type { IntegrationServiceContext } from '../context.js';\nimport type { IntegrationConnectionChangeEvent } from '../integrationService.js';\nimport type { SearchMyPullRequestsOptions, SearchPullRequestsOptions } from '../models/gitHostIntegration.js';\nimport { GitHostIntegration } from '../models/gitHostIntegration.js';\nimport type { IntegrationKey } from '../models/integration.js';\nimport type { BitbucketRepositoryDescriptor } from './bitbucket/models.js';\nimport type { ProviderPullRequest, ProviderRepository } from './models.js';\nimport {\n\tfromProviderPullRequest,\n\tproviderPullRequestMatchesSearch,\n\tProviderPullRequestReviewState,\n\tprovidersMetadata,\n\tPullRequestFilter,\n\ttoProviderPullRequestStates,\n} from './models.js';\nimport type { ProvidersApi } from './providersApi.js';\nimport {\n\tcollectProviderPagedResult,\n\tflatSettledOrThrow,\n\tparsePageCursor,\n\ttoPageCursor,\n} from './utils/providerPaging.js';\n\nconst metadata = providersMetadata[GitSelfManagedHostIntegrationId.BitbucketServer];\nconst authProvider = Object.freeze({ id: metadata.id, scopes: metadata.scopes });\n\nexport class BitbucketServerIntegration extends GitHostIntegration<\n\tGitSelfManagedHostIntegrationId.BitbucketServer,\n\tBitbucketRepositoryDescriptor\n> {\n\treadonly authProvider: IntegrationAuthenticationProviderDescriptor = authProvider;\n\treadonly id = GitSelfManagedHostIntegrationId.BitbucketServer;\n\tprotected readonly key =\n\t\t`${this.id}:${this.domain}` satisfies IntegrationKey<GitSelfManagedHostIntegrationId.BitbucketServer>;\n\treadonly name: string = 'Bitbucket Data Center';\n\n\tconstructor(\n\t\tctx: IntegrationServiceContext,\n\t\tauthenticationService: IntegrationAuthenticationService,\n\t\tgetProvidersApi: () => Promise<ProvidersApi>,\n\t\tdidChangeConnection: Emitter<IntegrationConnectionChangeEvent>,\n\t\tprivate readonly _domain: string,\n\t) {\n\t\tsuper(ctx, authenticationService, getProvidersApi, didChangeConnection);\n\t}\n\n\tget domain(): string {\n\t\treturn this._domain;\n\t}\n\n\tprotected get apiBaseUrl(): string {\n\t\tconst protocol = this._session?.protocol ?? 'https:';\n\t\treturn `${protocol}//${this.domain}/rest/api/1.0`;\n\t}\n\n\tprotected override async mergeProviderPullRequest(\n\t\tsession: ProviderAuthenticationSession,\n\t\tpr: PullRequest,\n\t\toptions?: {\n\t\t\tmergeMethod?: PullRequestMergeMethod;\n\t\t},\n\t): Promise<boolean> {\n\t\tconst api = await this.getProvidersApi();\n\t\treturn api.mergePullRequest(toTokenWithInfo(this.id, session), pr, {\n\t\t\tmergeMethod: options?.mergeMethod,\n\t\t\tbaseUrl: this.apiBaseUrl,\n\t\t});\n\t}\n\n\tprotected override async getProviderAccountForCommit(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepo: BitbucketRepositoryDescriptor,\n\t\trev: string,\n\t\toptions?: {\n\t\t\tavatarSize?: number;\n\t\t},\n\t): Promise<Account | UnidentifiedAuthor | undefined> {\n\t\treturn (await this.authenticationService.apis.bitbucket)?.getServerAccountForCommit(\n\t\t\tthis,\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\trepo.owner,\n\t\t\trepo.name,\n\t\t\trev,\n\t\t\tthis.apiBaseUrl,\n\t\t\t{\n\t\t\t\tavatarSize: options?.avatarSize,\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected override async getProviderAccountForEmail(\n\t\t_session: AuthenticationSession,\n\t\t_repo: BitbucketRepositoryDescriptor,\n\t\t_email: string,\n\t\t_options?: {\n\t\t\tavatarSize?: number;\n\t\t},\n\t): Promise<Account | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\tprotected override async getProviderDefaultBranch(\n\t\t_session: AuthenticationSession,\n\t\t_repo: BitbucketRepositoryDescriptor,\n\t): Promise<DefaultBranch | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\tprotected override async getProviderLinkedIssueOrPullRequest(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepo: BitbucketRepositoryDescriptor,\n\t\t{ id }: { id: string; key: string },\n\t\ttype: undefined | IssueOrPullRequestType,\n\t): Promise<IssueOrPullRequest | undefined> {\n\t\tif (type === 'issue') {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn (await this.authenticationService.apis.bitbucket)?.getServerPullRequestById(\n\t\t\tthis,\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\trepo.owner,\n\t\t\trepo.name,\n\t\t\tid,\n\t\t\tthis.apiBaseUrl,\n\t\t);\n\t}\n\n\tprotected override async getProviderIssue(\n\t\t_session: AuthenticationSession,\n\t\t_repo: BitbucketRepositoryDescriptor,\n\t\t_id: string,\n\t): Promise<Issue | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\tprotected override async getProviderPullRequestForBranch(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepo: BitbucketRepositoryDescriptor,\n\t\tbranch: string,\n\t\t_options?: {\n\t\t\tavatarSize?: number;\n\t\t\tinclude?: PullRequestState[];\n\t\t},\n\t): Promise<PullRequest | undefined> {\n\t\treturn (await this.authenticationService.apis.bitbucket)?.getServerPullRequestForBranch(\n\t\t\tthis,\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\trepo.owner,\n\t\t\trepo.name,\n\t\t\tbranch,\n\t\t\tthis.apiBaseUrl,\n\t\t);\n\t}\n\n\tprotected override async getProviderPullRequestForCommit(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepo: BitbucketRepositoryDescriptor,\n\t\trev: string,\n\t): Promise<PullRequest | undefined> {\n\t\treturn (await this.authenticationService.apis.bitbucket)?.getServerPullRequestForCommit(\n\t\t\tthis,\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\trepo.owner,\n\t\t\trepo.name,\n\t\t\trev,\n\t\t\tthis.apiBaseUrl,\n\t\t);\n\t}\n\n\tpublic override async getRepoInfo(repo: {\n\t\towner: string;\n\t\tname: string;\n\t\tproject?: string;\n\t\tconnectionId?: string;\n\t}): Promise<ProviderRepository | undefined> {\n\t\tconst api = await this.getProvidersApi();\n\t\t// `connectionId` targets a specific account (multi-account); omitted reads the primary.\n\t\tconst session = await this.resolveReadSession(repo.connectionId, undefined);\n\t\tif (session == null) return undefined;\n\n\t\treturn api.getRepo(toTokenWithInfo(this.id, session), repo.owner, repo.name, repo.project, {\n\t\t\tbaseUrl: this.apiBaseUrl,\n\t\t});\n\t}\n\n\tprotected override async getProviderRepositoryMetadata(\n\t\t_session: AuthenticationSession,\n\t\t_repo: BitbucketRepositoryDescriptor,\n\t\t_cancellation?: AbortSignal,\n\t): Promise<RepositoryMetadata | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\tprivate _accounts: Map<string, Account | undefined> | undefined;\n\tprotected override async getProviderCurrentAccount(\n\t\tsession: ProviderAuthenticationSession,\n\t): Promise<Account | undefined> {\n\t\tconst { accessToken } = session;\n\t\tthis._accounts ??= new Map<string, Account | undefined>();\n\n\t\tconst cachedAccount = this._accounts.get(accessToken);\n\t\tif (cachedAccount == null) {\n\t\t\tconst api = await this.getProvidersApi();\n\t\t\tconst user = await api.getCurrentUser(toTokenWithInfo(this.id, session), {\n\t\t\t\tbaseUrl: this.apiBaseUrl,\n\t\t\t});\n\t\t\tthis._accounts.set(\n\t\t\t\taccessToken,\n\t\t\t\tuser\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tprovider: this,\n\t\t\t\t\t\t\tid: user.id,\n\t\t\t\t\t\t\tname: user.name ?? undefined,\n\t\t\t\t\t\t\temail: user.email ?? undefined,\n\t\t\t\t\t\t\tavatarUrl: user.avatarUrl ?? undefined,\n\t\t\t\t\t\t\tusername: user.username ?? undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t}\n\n\t\treturn this._accounts.get(accessToken);\n\t}\n\n\tprotected override async searchProviderMyPullRequests(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepos?: BitbucketRepositoryDescriptor[],\n\t\t_cancellation?: AbortSignal,\n\t\toptions?: SearchMyPullRequestsOptions,\n\t): Promise<PullRequest[] | undefined> {\n\t\tif (repos != null) {\n\t\t\t// TODO: implement repos version\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst api = await this.getProvidersApi();\n\t\tif (!api) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prs = await api.getBitbucketServerPullRequestsForCurrentUser(\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\tthis.apiBaseUrl,\n\t\t\t{ states: toProviderPullRequestStates(options?.state) },\n\t\t);\n\t\treturn prs?.data.map(pr => fromProviderPullRequest(pr, this));\n\t}\n\n\tprotected override async getProviderMyPullRequestsForUser(\n\t\tsession: ProviderAuthenticationSession,\n\t\toptions?: { state?: PullRequestStateFilter[]; cursor?: string; filters?: PullRequestFilter[] },\n\t): Promise<PagedResult<ProviderPullRequest> | undefined> {\n\t\tconst api = await this.getProvidersApi();\n\t\tconst states = toProviderPullRequestStates(options?.state);\n\t\t// provider-apis translates the public 1-based `page` to Bitbucket Server's `start` offset and normalizes\n\t\t// `nextPageStart` back to the next page number. Thread that number inside our opaque cursor so the\n\t\t// ProviderBackend sweep drives the drain (bounded by its maxPages).\n\t\tconst page = parsePageCursor(options?.cursor);\n\t\tconst result = await api.getBitbucketServerPullRequestsForCurrentUser(\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\tthis.apiBaseUrl,\n\t\t\t{ states: states, page: page },\n\t\t);\n\t\tif (result == null) return undefined;\n\n\t\tconst account = options?.filters?.length ? await this.getProviderCurrentAccount(session) : undefined;\n\t\tconst identifiers = new Set([account?.id, account?.username].filter((id): id is string => id != null));\n\t\tif (options?.filters?.length && identifiers.size === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t'Unable to resolve the current Bitbucket Data Center account for the requested pull request filters.',\n\t\t\t);\n\t\t}\n\n\t\tconst values = options?.filters?.length\n\t\t\t? result.data.filter(pr => {\n\t\t\t\t\tconst isCurrentUser = (user: { id?: string | null; username?: string | null } | null | undefined) =>\n\t\t\t\t\t\tuser != null &&\n\t\t\t\t\t\t((user.id != null && identifiers.has(user.id)) ||\n\t\t\t\t\t\t\t(user.username != null && identifiers.has(user.username)));\n\t\t\t\t\tconst isAuthor = isCurrentUser(pr.author);\n\t\t\t\t\tconst isRequestedReviewer = pr.reviews?.some(\n\t\t\t\t\t\treview =>\n\t\t\t\t\t\t\tisCurrentUser(review.reviewer) &&\n\t\t\t\t\t\t\treview.state === ProviderPullRequestReviewState.ReviewRequested,\n\t\t\t\t\t);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t(options.filters!.includes(PullRequestFilter.Author) && isAuthor) ||\n\t\t\t\t\t\t(options.filters!.includes(PullRequestFilter.ReviewRequested) && isRequestedReviewer)\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t: result.data;\n\n\t\treturn {\n\t\t\tvalues: values,\n\t\t\tpaging: {\n\t\t\t\tmore: result.hasMore,\n\t\t\t\tcursor: result.hasMore && result.nextPage != null ? toPageCursor(result.nextPage) : '{}',\n\t\t\t},\n\t\t};\n\t}\n\n\tprotected override async searchProviderPullRequests(\n\t\tsession: ProviderAuthenticationSession,\n\t\tsearchQuery: string,\n\t\trepos?: BitbucketRepositoryDescriptor[],\n\t\tcancellation?: AbortSignal,\n\t\toptions?: SearchPullRequestsOptions,\n\t): Promise<PullRequest[] | undefined> {\n\t\tif (cancellation?.aborted) throw new CancellationError();\n\n\t\tconst api = await this.getProvidersApi();\n\t\tif (!api) return undefined;\n\n\t\tconst repoInputs =\n\t\t\trepos != null\n\t\t\t\t? repos.map(r => ({ name: r.name, namespace: r.owner }))\n\t\t\t\t: await this.getWorkspaceRepoInputs();\n\t\tif (cancellation?.aborted) throw new CancellationError();\n\t\t// An explicitly-empty `repos` means \"search these zero repos\" -> no results; reserve `undefined`\n\t\t// (\"scope couldn't be determined\") for when no repos were requested and none were discovered.\n\t\tif (repoInputs.length === 0) return repos != null ? [] : undefined;\n\n\t\tconst token = toTokenWithInfo(this.id, session);\n\t\tconst states = toProviderPullRequestStates(options?.include);\n\t\tconst providerPullRequests = await flatSettledOrThrow(\n\t\t\trepoInputs.map(async repo => {\n\t\t\t\tconst result = await collectProviderPagedResult(cursor => {\n\t\t\t\t\tif (cancellation?.aborted) throw new CancellationError();\n\n\t\t\t\t\treturn api.getPullRequestsForRepo(token, repo, {\n\t\t\t\t\t\tbaseUrl: this.apiBaseUrl,\n\t\t\t\t\t\tcursor: cursor,\n\t\t\t\t\t\tstates: states,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn result.values;\n\t\t\t}),\n\t\t);\n\t\tif (cancellation?.aborted) throw new CancellationError();\n\n\t\treturn providerPullRequests\n\t\t\t.filter(pr => providerPullRequestMatchesSearch(pr, searchQuery))\n\t\t\t.map(pr => fromProviderPullRequest(pr, this));\n\t}\n\n\tprivate async getWorkspaceRepoInputs(): Promise<{ name: string; namespace: string }[]> {\n\t\tconst remotes = await this.ctx.repositories.getOpenRemotes();\n\t\tconst inputs = await nonnullSettled(\n\t\t\tremotes.map(async (r: GitRemote) => {\n\t\t\t\tconst integration = await this.authenticationService.getByRemote(r);\n\t\t\t\tif (integration !== this) return undefined;\n\n\t\t\t\t// Use the remote provider's parsing so the Bitbucket Server `scm/<project>/<repo>` prefix is\n\t\t\t\t// stripped; a raw `path.split('/')` would yield namespace=`scm`, name=`<project>`.\n\t\t\t\tconst namespace = r.provider?.owner;\n\t\t\t\tconst name = r.provider?.repoName;\n\t\t\t\treturn namespace != null && name != null ? { name: name, namespace: namespace } : undefined;\n\t\t\t}),\n\t\t);\n\t\t// Dedupe: a repo with multiple remotes (e.g. `origin` + `upstream`) can map to the same input,\n\t\t// which would otherwise fetch and return the same PRs more than once.\n\t\treturn [...new Map(inputs.map(i => [`${i.namespace}/${i.name}`, i])).values()];\n\t}\n\n\tprotected override async searchProviderMyIssues(\n\t\t_session: AuthenticationSession,\n\t\t_repos?: BitbucketRepositoryDescriptor[],\n\t): Promise<IssueShape[] | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\t/**\n\t * Bitbucket Data Center exposes no issue tracker at all (issues live in Jira), so — like Bitbucket Cloud,\n\t * whose own tracker is deprecated — it is not an issue provider on the ProviderBackend surface. Without this\n\t * the facade would take `supportsIssues`' default `true` and route the read to a provider that registers no\n\t * issue client: the repo-scoped path fails with the SDK's `does not support function: getIssuesForReposFn`\n\t * as an opaque `kind: 'other'` warning, and `broadenIssues` first drains every repo of the org before hitting\n\t * the same failure. Its metadata already declares no issue filters, so this keeps both halves of the\n\t * capability answer consistent.\n\t */\n\toverride get supportsIssues(): boolean {\n\t\treturn false;\n\t}\n\n\tprivate readonly storagePrefix = 'bitbucket-server';\n\tprotected override async providerOnConnect(): Promise<void> {\n\t\tif (this._session == null) return;\n\n\t\tconst accountStorageKey = md5(this._session.accessToken);\n\n\t\tconst storedAccount = this.ctx.storage.get(`${this.storagePrefix}:${accountStorageKey}:account`);\n\n\t\tlet account: Account | undefined = storedAccount?.data ? { ...storedAccount.data, provider: this } : undefined;\n\n\t\tif (storedAccount == null) {\n\t\t\taccount = await this.getProviderCurrentAccount(this._session);\n\t\t\tif (account != null) {\n\t\t\t\t// Clear all other stored workspaces and repositories and accounts when our session changes\n\t\t\t\tawait this.ctx.storage.deleteWithPrefix(this.storagePrefix);\n\t\t\t\tawait this.ctx.storage.store(`${this.storagePrefix}:${accountStorageKey}:account`, {\n\t\t\t\t\tv: 1,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tid: account.id,\n\t\t\t\t\t\tname: account.name,\n\t\t\t\t\t\temail: account.email,\n\t\t\t\t\t\tavatarUrl: account.avatarUrl,\n\t\t\t\t\t\tusername: account.username,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis._accounts ??= new Map<string, Account | undefined>();\n\t\tthis._accounts.set(this._session.accessToken, account);\n\t}\n\n\tprotected override providerOnDisconnect(): void {\n\t\tthis._accounts = undefined;\n\t}\n}\n"],"mappings":";;;;;;;;;;AAgDA,MAAM,WAAW,kBAAA;AACjB,MAAM,eAAe,OAAO,OAAO;CAAE,IAAI,SAAS;CAAI,QAAQ,SAAS;AAAO,CAAC;AAE/E,IAAa,6BAAb,cAAgD,mBAG9C;CAYiB;CAXlB,eAAqE;CACrE,KAAS;CACT,MACC,GAAG,KAAK,GAAG,GAAG,KAAK;CACpB,OAAwB;CAExB,YACC,KACA,uBACA,iBACA,qBACA,SACC;EACD,MAAM,KAAK,uBAAuB,iBAAiB,mBAAmB;EAFrD,KAAA,UAAA;CAGlB;CAEA,IAAI,SAAiB;EACpB,OAAO,KAAK;CACb;CAEA,IAAc,aAAqB;EAElC,OAAO,GADU,KAAK,UAAU,YAAY,SACzB,IAAI,KAAK,OAAO;CACpC;CAEA,MAAyB,yBACxB,SACA,IACA,SAGmB;EAEnB,QAAO,MADW,KAAK,gBAAgB,EAAA,CAC5B,iBAAiB,gBAAgB,KAAK,IAAI,OAAO,GAAG,IAAI;GAClE,aAAa,SAAS;GACtB,SAAS,KAAK;EACf,CAAC;CACF;CAEA,MAAyB,4BACxB,SACA,MACA,KACA,SAGoD;EACpD,QAAQ,MAAM,KAAK,sBAAsB,KAAK,UAAA,EAAY,0BACzD,MACA,gBAAgB,KAAK,IAAI,OAAO,GAChC,KAAK,OACL,KAAK,MACL,KACA,KAAK,YACL,EACC,YAAY,SAAS,WACtB,CACD;CACD;CAEA,MAAyB,2BACxB,UACA,OACA,QACA,UAG+B;EAC/B,OAAO,QAAQ,QAAQ,KAAA,CAAS;CACjC;CAEA,MAAyB,yBACxB,UACA,OACqC;EACrC,OAAO,QAAQ,QAAQ,KAAA,CAAS;CACjC;CAEA,MAAyB,oCACxB,SACA,MACA,EAAE,MACF,MAC0C;EAC1C,IAAI,SAAS,SACZ;EAED,QAAQ,MAAM,KAAK,sBAAsB,KAAK,UAAA,EAAY,yBACzD,MACA,gBAAgB,KAAK,IAAI,OAAO,GAChC,KAAK,OACL,KAAK,MACL,IACA,KAAK,UACN;CACD;CAEA,MAAyB,iBACxB,UACA,OACA,KAC6B;EAC7B,OAAO,QAAQ,QAAQ,KAAA,CAAS;CACjC;CAEA,MAAyB,gCACxB,SACA,MACA,QACA,UAImC;EACnC,QAAQ,MAAM,KAAK,sBAAsB,KAAK,UAAA,EAAY,8BACzD,MACA,gBAAgB,KAAK,IAAI,OAAO,GAChC,KAAK,OACL,KAAK,MACL,QACA,KAAK,UACN;CACD;CAEA,MAAyB,gCACxB,SACA,MACA,KACmC;EACnC,QAAQ,MAAM,KAAK,sBAAsB,KAAK,UAAA,EAAY,8BACzD,MACA,gBAAgB,KAAK,IAAI,OAAO,GAChC,KAAK,OACL,KAAK,MACL,KACA,KAAK,UACN;CACD;CAEA,MAAsB,YAAY,MAKU;EAC3C,MAAM,MAAM,MAAM,KAAK,gBAAgB;EAEvC,MAAM,UAAU,MAAM,KAAK,mBAAmB,KAAK,cAAc,KAAA,CAAS;EAC1E,IAAI,WAAW,MAAM,OAAO,KAAA;EAE5B,OAAO,IAAI,QAAQ,gBAAgB,KAAK,IAAI,OAAO,GAAG,KAAK,OAAO,KAAK,MAAM,KAAK,SAAS,EAC1F,SAAS,KAAK,WACf,CAAC;CACF;CAEA,MAAyB,8BACxB,UACA,OACA,eAC0C;EAC1C,OAAO,QAAQ,QAAQ,KAAA,CAAS;CACjC;CAEA;CACA,MAAyB,0BACxB,SAC+B;EAC/B,MAAM,EAAE,gBAAgB;EACxB,KAAK,8BAAc,IAAI,IAAiC;EAGxD,IADsB,KAAK,UAAU,IAAI,WACzB,KAAK,MAAM;GAE1B,MAAM,OAAO,OAAM,MADD,KAAK,gBAAgB,EAAA,CAChB,eAAe,gBAAgB,KAAK,IAAI,OAAO,GAAG,EACxE,SAAS,KAAK,WACf,CAAC;GACD,KAAK,UAAU,IACd,aACA,OACG;IACA,UAAU;IACV,IAAI,KAAK;IACT,MAAM,KAAK,QAAQ,KAAA;IACnB,OAAO,KAAK,SAAS,KAAA;IACrB,WAAW,KAAK,aAAa,KAAA;IAC7B,UAAU,KAAK,YAAY,KAAA;GAC5B,IACC,KAAA,CACJ;EACD;EAEA,OAAO,KAAK,UAAU,IAAI,WAAW;CACtC;CAEA,MAAyB,6BACxB,SACA,OACA,eACA,SACqC;EACrC,IAAI,SAAS,MAEZ;EAGD,MAAM,MAAM,MAAM,KAAK,gBAAgB;EACvC,IAAI,CAAC,KACJ;EAQD,QAAO,MALW,IAAI,6CACrB,gBAAgB,KAAK,IAAI,OAAO,GAChC,KAAK,YACL,EAAE,QAAQ,4BAA4B,SAAS,KAAK,EAAE,CACvD,EAAA,EACY,KAAK,KAAI,OAAM,wBAAwB,IAAI,IAAI,CAAC;CAC7D;CAEA,MAAyB,iCACxB,SACA,SACwD;EACxD,MAAM,MAAM,MAAM,KAAK,gBAAgB;EACvC,MAAM,SAAS,4BAA4B,SAAS,KAAK;EAIzD,MAAM,OAAO,gBAAgB,SAAS,MAAM;EAC5C,MAAM,SAAS,MAAM,IAAI,6CACxB,gBAAgB,KAAK,IAAI,OAAO,GAChC,KAAK,YACL;GAAU;GAAc;EAAK,CAC9B;EACA,IAAI,UAAU,MAAM,OAAO,KAAA;EAE3B,MAAM,UAAU,SAAS,SAAS,SAAS,MAAM,KAAK,0BAA0B,OAAO,IAAI,KAAA;EAC3F,MAAM,cAAc,IAAI,IAAI,CAAC,SAAS,IAAI,SAAS,QAAQ,CAAC,CAAC,QAAQ,OAAqB,MAAM,IAAI,CAAC;EACrG,IAAI,SAAS,SAAS,UAAU,YAAY,SAAS,GACpD,MAAM,IAAI,MACT,qGACD;EAsBD,OAAO;GACN,QApBc,SAAS,SAAS,SAC9B,OAAO,KAAK,QAAO,OAAM;IACzB,MAAM,iBAAiB,SACtB,QAAQ,SACN,KAAK,MAAM,QAAQ,YAAY,IAAI,KAAK,EAAE,KAC1C,KAAK,YAAY,QAAQ,YAAY,IAAI,KAAK,QAAQ;IACzD,MAAM,WAAW,cAAc,GAAG,MAAM;IACxC,MAAM,sBAAsB,GAAG,SAAS,MACvC,WACC,cAAc,OAAO,QAAQ,KAC7B,OAAO,UAAU,+BAA+B,eAClD;IACA,OACE,QAAQ,QAAS,SAAA,QAAiC,KAAK,YACvD,QAAQ,QAAS,SAAA,kBAA0C,KAAK;GAEnE,CAAC,IACA,OAAO;GAIT,QAAQ;IACP,MAAM,OAAO;IACb,QAAQ,OAAO,WAAW,OAAO,YAAY,OAAO,aAAa,OAAO,QAAQ,IAAI;GACrF;EACD;CACD;CAEA,MAAyB,2BACxB,SACA,aACA,OACA,cACA,SACqC;EACrC,IAAI,cAAc,SAAS,MAAM,IAAI,kBAAkB;EAEvD,MAAM,MAAM,MAAM,KAAK,gBAAgB;EACvC,IAAI,CAAC,KAAK,OAAO,KAAA;EAEjB,MAAM,aACL,SAAS,OACN,MAAM,KAAI,OAAM;GAAE,MAAM,EAAE;GAAM,WAAW,EAAE;EAAM,EAAE,IACrD,MAAM,KAAK,uBAAuB;EACtC,IAAI,cAAc,SAAS,MAAM,IAAI,kBAAkB;EAGvD,IAAI,WAAW,WAAW,GAAG,OAAO,SAAS,OAAO,CAAC,IAAI,KAAA;EAEzD,MAAM,QAAQ,gBAAgB,KAAK,IAAI,OAAO;EAC9C,MAAM,SAAS,4BAA4B,SAAS,OAAO;EAC3D,MAAM,uBAAuB,MAAM,mBAClC,WAAW,IAAI,OAAM,SAAQ;GAU5B,QAAO,MATc,4BAA2B,WAAU;IACzD,IAAI,cAAc,SAAS,MAAM,IAAI,kBAAkB;IAEvD,OAAO,IAAI,uBAAuB,OAAO,MAAM;KAC9C,SAAS,KAAK;KACN;KACA;IACT,CAAC;GACF,CAAC,EAAA,CACa;EACf,CAAC,CACF;EACA,IAAI,cAAc,SAAS,MAAM,IAAI,kBAAkB;EAEvD,OAAO,qBACL,QAAO,OAAM,iCAAiC,IAAI,WAAW,CAAC,CAAC,CAC/D,KAAI,OAAM,wBAAwB,IAAI,IAAI,CAAC;CAC9C;CAEA,MAAc,yBAAyE;EACtF,MAAM,UAAU,MAAM,KAAK,IAAI,aAAa,eAAe;EAC3D,MAAM,SAAS,MAAM,eACpB,QAAQ,IAAI,OAAO,MAAiB;GAEnC,IAAI,MADsB,KAAK,sBAAsB,YAAY,CAAC,MAC9C,MAAM,OAAO,KAAA;GAIjC,MAAM,YAAY,EAAE,UAAU;GAC9B,MAAM,OAAO,EAAE,UAAU;GACzB,OAAO,aAAa,QAAQ,QAAQ,OAAO;IAAQ;IAAiB;GAAU,IAAI,KAAA;EACnF,CAAC,CACF;EAGA,OAAO,CAAC,GAAG,IAAI,IAAI,OAAO,KAAI,MAAK,CAAC,GAAG,EAAE,UAAU,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;CAC9E;CAEA,MAAyB,uBACxB,UACA,QACoC;EACpC,OAAO,QAAQ,QAAQ,KAAA,CAAS;CACjC;;;;;;;;;;CAWA,IAAa,iBAA0B;EACtC,OAAO;CACR;CAEA,gBAAiC;CACjC,MAAyB,oBAAmC;EAC3D,IAAI,KAAK,YAAY,MAAM;EAE3B,MAAM,oBAAoB,IAAI,KAAK,SAAS,WAAW;EAEvD,MAAM,gBAAgB,KAAK,IAAI,QAAQ,IAAI,GAAG,KAAK,cAAc,GAAG,kBAAkB,SAAS;EAE/F,IAAI,UAA+B,eAAe,OAAO;GAAE,GAAG,cAAc;GAAM,UAAU;EAAK,IAAI,KAAA;EAErG,IAAI,iBAAiB,MAAM;GAC1B,UAAU,MAAM,KAAK,0BAA0B,KAAK,QAAQ;GAC5D,IAAI,WAAW,MAAM;IAEpB,MAAM,KAAK,IAAI,QAAQ,iBAAiB,KAAK,aAAa;IAC1D,MAAM,KAAK,IAAI,QAAQ,MAAM,GAAG,KAAK,cAAc,GAAG,kBAAkB,WAAW;KAClF,GAAG;KACH,WAAW,KAAK,IAAI;KACpB,MAAM;MACL,IAAI,QAAQ;MACZ,MAAM,QAAQ;MACd,OAAO,QAAQ;MACf,WAAW,QAAQ;MACnB,UAAU,QAAQ;KACnB;IACD,CAAC;GACF;EACD;EACA,KAAK,8BAAc,IAAI,IAAiC;EACxD,KAAK,UAAU,IAAI,KAAK,SAAS,aAAa,OAAO;CACtD;CAEA,uBAAgD;EAC/C,KAAK,YAAY,KAAA;CAClB;AACD"}
|
|
1
|
+
{"version":3,"file":"bitbucket-server.js","names":[],"sources":["../../../../../plus/integrations/src/providers/bitbucket-server.ts"],"sourcesContent":["import type { Account, UnidentifiedAuthor } from '@gitlens/git/models/author.js';\nimport type { DefaultBranch } from '@gitlens/git/models/defaultBranch.js';\nimport type { Issue, IssueShape } from '@gitlens/git/models/issue.js';\nimport type { IssueOrPullRequest, IssueOrPullRequestType } from '@gitlens/git/models/issueOrPullRequest.js';\nimport type {\n\tPullRequest,\n\tPullRequestMergeMethod,\n\tPullRequestSearchCriteria,\n\tPullRequestState,\n\tPullRequestStateFilter,\n} from '@gitlens/git/models/pullRequest.js';\nimport type { GitRemote } from '@gitlens/git/models/remote.js';\nimport type { RepositoryMetadata } from '@gitlens/git/models/repositoryMetadata.js';\nimport { CancellationError, raceWithSignal } from '@gitlens/utils/cancellation.js';\nimport { md5 } from '@gitlens/utils/crypto.js';\nimport type { Emitter } from '@gitlens/utils/event.js';\nimport type { PagedResult } from '@gitlens/utils/paging.js';\nimport { nonnullSettled } from '@gitlens/utils/promise.js';\nimport type { IntegrationAuthenticationProviderDescriptor } from '../authentication/integrationAuthenticationProvider.js';\nimport type { IntegrationAuthenticationService } from '../authentication/integrationAuthenticationService.js';\nimport type {\n\tAuthenticationSessionLike as AuthenticationSession,\n\tProviderAuthenticationSession,\n} from '../authentication/models.js';\nimport { toTokenWithInfo } from '../authentication/models.js';\nimport { GitSelfManagedHostIntegrationId } from '../constants.js';\nimport type { IntegrationServiceContext } from '../context.js';\nimport type { IntegrationConnectionChangeEvent } from '../integrationService.js';\nimport type { SearchMyPullRequestsOptions, SearchPullRequestsOptions } from '../models/gitHostIntegration.js';\nimport { GitHostIntegration } from '../models/gitHostIntegration.js';\nimport type { IntegrationKey, ProviderPullRequestCount, ProviderPullRequestSearchPage } from '../models/integration.js';\nimport type { BitbucketServerSearchUser } from './bitbucket-server/pullRequestSearch.js';\nimport type { BitbucketRepositoryDescriptor } from './bitbucket/models.js';\nimport type {\n\tProviderHierarchyResult,\n\tProviderOrganization,\n\tProviderPullRequest,\n\tProviderRepoInput,\n\tProviderRepository,\n} from './models.js';\nimport {\n\tfromProviderPullRequest,\n\tproviderPullRequestMatchesSearch,\n\tProviderPullRequestReviewState,\n\tprovidersMetadata,\n\tPullRequestFilter,\n\ttoProviderPullRequestStates,\n} from './models.js';\nimport type { ProvidersApi } from './providersApi.js';\nimport {\n\tcollectProviderPagedResult,\n\tflatSettledOrThrow,\n\tparsePageCursor,\n\ttoPageCursor,\n} from './utils/providerPaging.js';\n\nconst metadata = providersMetadata[GitSelfManagedHostIntegrationId.BitbucketServer];\nconst authProvider = Object.freeze({ id: metadata.id, scopes: metadata.scopes });\n\nexport class BitbucketServerIntegration extends GitHostIntegration<\n\tGitSelfManagedHostIntegrationId.BitbucketServer,\n\tBitbucketRepositoryDescriptor\n> {\n\treadonly authProvider: IntegrationAuthenticationProviderDescriptor = authProvider;\n\treadonly id = GitSelfManagedHostIntegrationId.BitbucketServer;\n\tprotected readonly key =\n\t\t`${this.id}:${this.domain}` satisfies IntegrationKey<GitSelfManagedHostIntegrationId.BitbucketServer>;\n\treadonly name: string = 'Bitbucket Data Center';\n\n\tconstructor(\n\t\tctx: IntegrationServiceContext,\n\t\tauthenticationService: IntegrationAuthenticationService,\n\t\tgetProvidersApi: () => Promise<ProvidersApi>,\n\t\tdidChangeConnection: Emitter<IntegrationConnectionChangeEvent>,\n\t\tprivate readonly _domain: string,\n\t) {\n\t\tsuper(ctx, authenticationService, getProvidersApi, didChangeConnection);\n\t}\n\n\tget domain(): string {\n\t\treturn this._domain;\n\t}\n\n\tprotected apiBaseUrlFor(session: ProviderAuthenticationSession): string {\n\t\treturn this.getSelfManagedApiBaseUrl(session);\n\t}\n\n\tprotected override async mergeProviderPullRequest(\n\t\tsession: ProviderAuthenticationSession,\n\t\tpr: PullRequest,\n\t\toptions?: {\n\t\t\tmergeMethod?: PullRequestMergeMethod;\n\t\t},\n\t): Promise<boolean> {\n\t\tconst api = await this.getProvidersApi();\n\t\treturn api.mergePullRequest(toTokenWithInfo(this.id, session), pr, {\n\t\t\tmergeMethod: options?.mergeMethod,\n\t\t\tbaseUrl: this.apiBaseUrlFor(session),\n\t\t});\n\t}\n\n\tprotected override async getProviderAccountForCommit(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepo: BitbucketRepositoryDescriptor,\n\t\trev: string,\n\t\toptions?: {\n\t\t\tavatarSize?: number;\n\t\t},\n\t): Promise<Account | UnidentifiedAuthor | undefined> {\n\t\treturn (await this.authenticationService.apis.bitbucket)?.getServerAccountForCommit(\n\t\t\tthis,\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\trepo.owner,\n\t\t\trepo.name,\n\t\t\trev,\n\t\t\tthis.apiBaseUrlFor(session),\n\t\t\t{\n\t\t\t\tavatarSize: options?.avatarSize,\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected override async getProviderAccountForEmail(\n\t\t_session: AuthenticationSession,\n\t\t_repo: BitbucketRepositoryDescriptor,\n\t\t_email: string,\n\t\t_options?: {\n\t\t\tavatarSize?: number;\n\t\t},\n\t): Promise<Account | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\tprotected override async getProviderDefaultBranch(\n\t\t_session: AuthenticationSession,\n\t\t_repo: BitbucketRepositoryDescriptor,\n\t): Promise<DefaultBranch | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\tprotected override async getProviderLinkedIssueOrPullRequest(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepo: BitbucketRepositoryDescriptor,\n\t\t{ id }: { id: string; key: string },\n\t\ttype: undefined | IssueOrPullRequestType,\n\t): Promise<IssueOrPullRequest | undefined> {\n\t\tif (type === 'issue') {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn (await this.authenticationService.apis.bitbucket)?.getServerPullRequestById(\n\t\t\tthis,\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\trepo.owner,\n\t\t\trepo.name,\n\t\t\tid,\n\t\t\tthis.apiBaseUrlFor(session),\n\t\t);\n\t}\n\n\tprotected override async getProviderIssue(\n\t\t_session: AuthenticationSession,\n\t\t_repo: BitbucketRepositoryDescriptor,\n\t\t_id: string,\n\t): Promise<Issue | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\tprotected override async getProviderPullRequestForBranch(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepo: BitbucketRepositoryDescriptor,\n\t\tbranch: string,\n\t\t_options?: {\n\t\t\tavatarSize?: number;\n\t\t\tinclude?: PullRequestState[];\n\t\t},\n\t): Promise<PullRequest | undefined> {\n\t\treturn (await this.authenticationService.apis.bitbucket)?.getServerPullRequestForBranch(\n\t\t\tthis,\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\trepo.owner,\n\t\t\trepo.name,\n\t\t\tbranch,\n\t\t\tthis.apiBaseUrlFor(session),\n\t\t);\n\t}\n\n\tprotected override async getProviderPullRequestForCommit(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepo: BitbucketRepositoryDescriptor,\n\t\trev: string,\n\t): Promise<PullRequest | undefined> {\n\t\treturn (await this.authenticationService.apis.bitbucket)?.getServerPullRequestForCommit(\n\t\t\tthis,\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\trepo.owner,\n\t\t\trepo.name,\n\t\t\trev,\n\t\t\tthis.apiBaseUrlFor(session),\n\t\t);\n\t}\n\n\tpublic override async getRepoInfo(repo: {\n\t\towner: string;\n\t\tname: string;\n\t\tproject?: string;\n\t\tconnectionId?: string;\n\t}): Promise<ProviderRepository | undefined> {\n\t\tconst api = await this.getProvidersApi();\n\t\t// `connectionId` targets a specific account (multi-account); omitted reads the primary.\n\t\tconst session = await this.resolveReadSession(repo.connectionId, undefined);\n\t\tif (session == null) return undefined;\n\n\t\treturn api.getRepo(toTokenWithInfo(this.id, session), repo.owner, repo.name, repo.project, {\n\t\t\tbaseUrl: this.apiBaseUrlFor(session),\n\t\t});\n\t}\n\n\tprotected override async getProviderRepositoryMetadata(\n\t\t_session: AuthenticationSession,\n\t\t_repo: BitbucketRepositoryDescriptor,\n\t\t_cancellation?: AbortSignal,\n\t): Promise<RepositoryMetadata | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\t/**\n\t * Accounts by {@link getAccountKey}. One integration serves every installation on its host, and installations\n\t * mounted at different context paths are different servers whose users differ, even under the same token.\n\t */\n\tprivate _accounts: Map<string, Account | undefined> | undefined;\n\n\t/** The installation the session's reads address, plus the credential — what decides whose account it is. */\n\tprivate getAccountKey(session: ProviderAuthenticationSession): string {\n\t\treturn `${this.apiBaseUrlFor(session)}\\n${session.accessToken}`;\n\t}\n\n\tprotected override async getProviderCurrentAccount(\n\t\tsession: ProviderAuthenticationSession,\n\t): Promise<Account | undefined> {\n\t\tconst key = this.getAccountKey(session);\n\t\tthis._accounts ??= new Map<string, Account | undefined>();\n\n\t\tconst cachedAccount = this._accounts.get(key);\n\t\tif (cachedAccount == null) {\n\t\t\tconst api = await this.getProvidersApi();\n\t\t\tconst user = await api.getCurrentUser(toTokenWithInfo(this.id, session), {\n\t\t\t\tbaseUrl: this.apiBaseUrlFor(session),\n\t\t\t});\n\t\t\tthis._accounts.set(\n\t\t\t\tkey,\n\t\t\t\tuser\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tprovider: this,\n\t\t\t\t\t\t\tid: user.id,\n\t\t\t\t\t\t\tname: user.name ?? undefined,\n\t\t\t\t\t\t\temail: user.email ?? undefined,\n\t\t\t\t\t\t\tavatarUrl: user.avatarUrl ?? undefined,\n\t\t\t\t\t\t\tusername: user.username ?? undefined,\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined,\n\t\t\t);\n\t\t}\n\n\t\treturn this._accounts.get(key);\n\t}\n\n\tprotected override async getProviderOrganizationsForUser(\n\t\tsession: ProviderAuthenticationSession,\n\t): Promise<ProviderHierarchyResult<ProviderOrganization>> {\n\t\tconst api = await this.getProvidersApi();\n\t\treturn api.getBitbucketServerProjects(\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\tthis.apiBaseUrlFor(session),\n\t\t\tsession.id,\n\t\t);\n\t}\n\n\tprotected override async getProviderRepositoriesForOrg(\n\t\tsession: ProviderAuthenticationSession,\n\t\torg: string,\n\t\toptions?: { cursor?: string },\n\t): Promise<ProviderHierarchyResult<ProviderRepository>> {\n\t\tconst api = await this.getProvidersApi();\n\t\treturn api.getBitbucketServerRepositories(\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\tthis.apiBaseUrlFor(session),\n\t\t\tsession.id,\n\t\t\t{\n\t\t\t\tproject: org,\n\t\t\t\tcursor: options?.cursor,\n\t\t\t},\n\t\t);\n\t}\n\n\tprotected override async getProviderRepositoriesForUser(\n\t\tsession: ProviderAuthenticationSession,\n\t\toptions?: { cursor?: string },\n\t): Promise<ProviderHierarchyResult<ProviderRepository>> {\n\t\tconst api = await this.getProvidersApi();\n\t\treturn api.getBitbucketServerRepositories(\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\tthis.apiBaseUrlFor(session),\n\t\t\tsession.id,\n\t\t\toptions,\n\t\t);\n\t}\n\n\tprotected override async searchProviderMyPullRequests(\n\t\tsession: ProviderAuthenticationSession,\n\t\trepos?: BitbucketRepositoryDescriptor[],\n\t\t_cancellation?: AbortSignal,\n\t\toptions?: SearchMyPullRequestsOptions,\n\t): Promise<PullRequest[] | undefined> {\n\t\tif (repos != null) {\n\t\t\t// TODO: implement repos version\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst api = await this.getProvidersApi();\n\t\tif (!api) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst prs = await api.getBitbucketServerPullRequestsForCurrentUser(\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\tthis.apiBaseUrlFor(session),\n\t\t\t{ states: toProviderPullRequestStates(options?.state) },\n\t\t);\n\t\treturn prs?.data.map(pr => fromProviderPullRequest(pr, this));\n\t}\n\n\tprotected override async getProviderMyPullRequestsForUser(\n\t\tsession: ProviderAuthenticationSession,\n\t\toptions?: { state?: PullRequestStateFilter[]; cursor?: string; filters?: PullRequestFilter[] },\n\t): Promise<PagedResult<ProviderPullRequest> | undefined> {\n\t\tconst api = await this.getProvidersApi();\n\t\tconst states = toProviderPullRequestStates(options?.state);\n\t\t// provider-apis translates the public 1-based `page` to Bitbucket Server's `start` offset and normalizes\n\t\t// `nextPageStart` back to the next page number. Thread that number inside our opaque cursor so the\n\t\t// ProviderBackend sweep drives the drain (bounded by its maxPages).\n\t\tconst page = parsePageCursor(options?.cursor);\n\t\tconst result = await api.getBitbucketServerPullRequestsForCurrentUser(\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\tthis.apiBaseUrlFor(session),\n\t\t\t{ states: states, page: page },\n\t\t);\n\t\tif (result == null) return undefined;\n\n\t\tconst account = options?.filters?.length ? await this.getProviderCurrentAccount(session) : undefined;\n\t\tconst identifiers = new Set([account?.id, account?.username].filter((id): id is string => id != null));\n\t\tif (options?.filters?.length && identifiers.size === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t'Unable to resolve the current Bitbucket Data Center account for the requested pull request filters.',\n\t\t\t);\n\t\t}\n\n\t\tconst values = options?.filters?.length\n\t\t\t? result.data.filter(pr => {\n\t\t\t\t\tconst isCurrentUser = (user: { id?: string | null; username?: string | null } | null | undefined) =>\n\t\t\t\t\t\tuser != null &&\n\t\t\t\t\t\t((user.id != null && identifiers.has(user.id)) ||\n\t\t\t\t\t\t\t(user.username != null && identifiers.has(user.username)));\n\t\t\t\t\tconst isAuthor = isCurrentUser(pr.author);\n\t\t\t\t\tconst isRequestedReviewer = pr.reviews?.some(\n\t\t\t\t\t\treview =>\n\t\t\t\t\t\t\tisCurrentUser(review.reviewer) &&\n\t\t\t\t\t\t\treview.state === ProviderPullRequestReviewState.ReviewRequested,\n\t\t\t\t\t);\n\t\t\t\t\treturn (\n\t\t\t\t\t\t(options.filters!.includes(PullRequestFilter.Author) && isAuthor) ||\n\t\t\t\t\t\t(options.filters!.includes(PullRequestFilter.ReviewRequested) && isRequestedReviewer)\n\t\t\t\t\t);\n\t\t\t\t})\n\t\t\t: result.data;\n\n\t\treturn {\n\t\t\tvalues: values,\n\t\t\tpaging: {\n\t\t\t\tmore: result.hasMore,\n\t\t\t\tcursor: result.hasMore && result.nextPage != null ? toPageCursor(result.nextPage) : '{}',\n\t\t\t},\n\t\t};\n\t}\n\n\tprotected override async searchProviderPullRequests(\n\t\tsession: ProviderAuthenticationSession,\n\t\tsearchQuery: string,\n\t\trepos?: BitbucketRepositoryDescriptor[],\n\t\tcancellation?: AbortSignal,\n\t\toptions?: SearchPullRequestsOptions,\n\t): Promise<PullRequest[] | undefined> {\n\t\tif (cancellation?.aborted) throw new CancellationError();\n\n\t\tconst api = await this.getProvidersApi();\n\t\tif (!api) return undefined;\n\n\t\tconst repoInputs =\n\t\t\trepos != null\n\t\t\t\t? repos.map(r => ({ name: r.name, namespace: r.owner }))\n\t\t\t\t: await this.getWorkspaceRepoInputs();\n\t\tif (cancellation?.aborted) throw new CancellationError();\n\t\t// An explicitly-empty `repos` means \"search these zero repos\" -> no results; reserve `undefined`\n\t\t// (\"scope couldn't be determined\") for when no repos were requested and none were discovered.\n\t\tif (repoInputs.length === 0) return repos != null ? [] : undefined;\n\n\t\tconst token = toTokenWithInfo(this.id, session);\n\t\tconst states = toProviderPullRequestStates(options?.include);\n\t\tconst providerPullRequests = await flatSettledOrThrow(\n\t\t\trepoInputs.map(async repo => {\n\t\t\t\tconst result = await collectProviderPagedResult(cursor => {\n\t\t\t\t\tif (cancellation?.aborted) throw new CancellationError();\n\n\t\t\t\t\treturn api.getPullRequestsForRepo(token, repo, {\n\t\t\t\t\t\tbaseUrl: this.apiBaseUrlFor(session),\n\t\t\t\t\t\tcursor: cursor,\n\t\t\t\t\t\tstates: states,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\treturn result.values;\n\t\t\t}),\n\t\t);\n\t\tif (cancellation?.aborted) throw new CancellationError();\n\n\t\treturn providerPullRequests\n\t\t\t.filter(pr => providerPullRequestMatchesSearch(pr, searchQuery))\n\t\t\t.map(pr => fromProviderPullRequest(pr, this));\n\t}\n\n\t/**\n\t * The filtered pull-request search, read by this module's own requests rather than the SDK's: the SDK's list\n\t * reads carry no text, draft or participant-status filter and no per-facet continuation. Every request goes to\n\t * the session's own address, context path included, so one connection's cursor can't be replayed on another.\n\t */\n\tprotected override async searchProviderPullRequestsPage(\n\t\tsession: ProviderAuthenticationSession,\n\t\toptions: {\n\t\t\trepos?: ProviderRepoInput[];\n\t\t\torg?: string;\n\t\t\tcriteria?: PullRequestSearchCriteria;\n\t\t\tcursor?: string;\n\t\t\tpageSize?: number;\n\t\t\tsummary?: boolean;\n\t\t},\n\t\tcancellation?: AbortSignal,\n\t): Promise<ProviderPullRequestSearchPage | undefined> {\n\t\tconst api = await this.getProvidersApi();\n\t\treturn api.searchBitbucketServerPullRequestsPage(\n\t\t\ttoTokenWithInfo(this.id, session),\n\t\t\t{\n\t\t\t\tbaseUrl: this.apiBaseUrlFor(session),\n\t\t\t\tconnectionId: session.id,\n\t\t\t\tprovider: this,\n\t\t\t\trepos: options.repos,\n\t\t\t\torg: options.org,\n\t\t\t\tcriteria: options.criteria,\n\t\t\t\tcurrentUser: await this.getSearchUser(session, options.criteria, cancellation),\n\t\t\t\tcursor: options.cursor,\n\t\t\t\tpageSize: options.pageSize,\n\t\t\t},\n\t\t\tcancellation,\n\t\t);\n\t}\n\n\t/**\n\t * Counts each scope by reading it, since Bitbucket Data Center has neither a count query nor a total on its\n\t * pages. The facade hands over one scope per call and runs those calls concurrently (see `countPullRequests`),\n\t * so scopes here are counted one after another rather than multiplying that concurrency.\n\t */\n\tprotected override async countProviderPullRequests(\n\t\tsession: ProviderAuthenticationSession,\n\t\tscopes: readonly { repos?: ProviderRepoInput[]; org?: string; criteria?: PullRequestSearchCriteria }[],\n\t\tcancellation?: AbortSignal,\n\t): Promise<ProviderPullRequestCount[] | undefined> {\n\t\tconst api = await this.getProvidersApi();\n\t\tconst token = toTokenWithInfo(this.id, session);\n\t\tconst counts: ProviderPullRequestCount[] = [];\n\t\tfor (const scope of scopes) {\n\t\t\tcounts.push(\n\t\t\t\tawait api.countBitbucketServerPullRequests(\n\t\t\t\t\ttoken,\n\t\t\t\t\t{\n\t\t\t\t\t\tbaseUrl: this.apiBaseUrlFor(session),\n\t\t\t\t\t\trepos: scope.repos,\n\t\t\t\t\t\torg: scope.org,\n\t\t\t\t\t\tcriteria: scope.criteria,\n\t\t\t\t\t\tcurrentUser: await this.getSearchUser(session, scope.criteria, cancellation),\n\t\t\t\t\t},\n\t\t\t\t\tcancellation,\n\t\t\t\t),\n\t\t\t);\n\t\t}\n\t\treturn counts;\n\t}\n\n\t/**\n\t * The session's own user, which a relationship facet filters by. Resolved per session rather than from the\n\t * primary connection, so a read pinned to one account never filters by another's identity; an account that\n\t * can't be resolved refuses the read instead of widening it to everyone's pull requests.\n\t *\n\t * The lookup is raced against `cancellation` so a cancelled read settles at once. The SDK's current-user read\n\t * takes no signal, so the request itself runs on; its answer still lands in the per-token account cache, so a\n\t * cold lookup a cancellation abandoned isn't wasted on the next read.\n\t */\n\tprivate async getSearchUser(\n\t\tsession: ProviderAuthenticationSession,\n\t\tcriteria: PullRequestSearchCriteria | undefined,\n\t\tcancellation: AbortSignal | undefined,\n\t): Promise<BitbucketServerSearchUser | undefined> {\n\t\tif (!criteria?.relationships?.length) return undefined;\n\n\t\tconst lookup = this.getProviderCurrentAccount(session);\n\t\tconst account = await (cancellation != null ? raceWithSignal(lookup, cancellation) : lookup);\n\t\tif (account?.id == null || account.username == null) {\n\t\t\tthrow new Error('Unable to resolve the current Bitbucket Data Center account for a relationship search.');\n\t\t}\n\n\t\treturn { id: account.id, username: account.username };\n\t}\n\n\tprivate async getWorkspaceRepoInputs(): Promise<{ name: string; namespace: string }[]> {\n\t\tconst remotes = await this.ctx.repositories.getOpenRemotes();\n\t\tconst inputs = await nonnullSettled(\n\t\t\tremotes.map(async (r: GitRemote) => {\n\t\t\t\tconst integration = await this.authenticationService.getByRemote(r);\n\t\t\t\tif (integration !== this) return undefined;\n\n\t\t\t\t// Use the remote provider's parsing so the Bitbucket Server `scm/<project>/<repo>` prefix is\n\t\t\t\t// stripped; a raw `path.split('/')` would yield namespace=`scm`, name=`<project>`.\n\t\t\t\tconst namespace = r.provider?.owner;\n\t\t\t\tconst name = r.provider?.repoName;\n\t\t\t\treturn namespace != null && name != null ? { name: name, namespace: namespace } : undefined;\n\t\t\t}),\n\t\t);\n\t\t// Dedupe: a repo with multiple remotes (e.g. `origin` + `upstream`) can map to the same input,\n\t\t// which would otherwise fetch and return the same PRs more than once.\n\t\treturn [...new Map(inputs.map(i => [`${i.namespace}/${i.name}`, i])).values()];\n\t}\n\n\tprotected override async searchProviderMyIssues(\n\t\t_session: AuthenticationSession,\n\t\t_repos?: BitbucketRepositoryDescriptor[],\n\t): Promise<IssueShape[] | undefined> {\n\t\treturn Promise.resolve(undefined);\n\t}\n\n\t/**\n\t * Bitbucket Data Center exposes no issue tracker at all (issues live in Jira), so — like Bitbucket Cloud,\n\t * whose own tracker is deprecated — it is not an issue provider on the ProviderBackend surface. Without this\n\t * the facade would take `supportsIssues`' default `true` and route the read to a provider that registers no\n\t * issue client: the repo-scoped path fails with the SDK's `does not support function: getIssuesForReposFn`\n\t * as an opaque `kind: 'other'` warning, and `broadenIssues` first drains every repo of the org before hitting\n\t * the same failure. Its metadata already declares no issue filters, so this keeps both halves of the\n\t * capability answer consistent.\n\t */\n\toverride get supportsIssues(): boolean {\n\t\treturn false;\n\t}\n\n\tprivate readonly storagePrefix = 'bitbucket-server';\n\tprotected override async providerOnConnect(): Promise<void> {\n\t\tif (this._session == null) return;\n\n\t\tconst accountKey = this.getAccountKey(this._session);\n\t\tconst accountStorageKey = md5(accountKey);\n\n\t\tconst storedAccount = this.ctx.storage.get(`${this.storagePrefix}:${accountStorageKey}:account`);\n\n\t\tlet account: Account | undefined = storedAccount?.data ? { ...storedAccount.data, provider: this } : undefined;\n\n\t\tif (storedAccount == null) {\n\t\t\taccount = await this.getProviderCurrentAccount(this._session);\n\t\t\tif (account != null) {\n\t\t\t\t// Clear all other stored workspaces and repositories and accounts when our session changes\n\t\t\t\tawait this.ctx.storage.deleteWithPrefix(this.storagePrefix);\n\t\t\t\tawait this.ctx.storage.store(`${this.storagePrefix}:${accountStorageKey}:account`, {\n\t\t\t\t\tv: 1,\n\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\tdata: {\n\t\t\t\t\t\tid: account.id,\n\t\t\t\t\t\tname: account.name,\n\t\t\t\t\t\temail: account.email,\n\t\t\t\t\t\tavatarUrl: account.avatarUrl,\n\t\t\t\t\t\tusername: account.username,\n\t\t\t\t\t},\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis._accounts ??= new Map<string, Account | undefined>();\n\t\tthis._accounts.set(accountKey, account);\n\t}\n\n\tprotected override providerOnDisconnect(): void {\n\t\tthis._accounts = undefined;\n\t}\n}\n"],"mappings":"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"}
|
|
@@ -6,8 +6,8 @@ import "../../../git/models/pullRequest.js";
|
|
|
6
6
|
import { toCollectionScopeFailure } from "../collectionMetadata.js";
|
|
7
7
|
import "../constants.js";
|
|
8
8
|
import { toTokenWithInfo } from "../authentication/models.js";
|
|
9
|
-
import { fromProviderPullRequest, getProviderPullRequestIdentity, providersMetadata, toProviderPullRequestStates } from "./models.js";
|
|
10
9
|
import { collectProviderPagedResult, flatSettledOrThrow, mergeCollectionMetadata, parsePageCursor, toPageCursor } from "./utils/providerPaging.js";
|
|
10
|
+
import { fromProviderPullRequest, getProviderPullRequestIdentity, providersMetadata, toProviderPullRequestStates } from "./models.js";
|
|
11
11
|
import { GitHostIntegration } from "../models/gitHostIntegration.js";
|
|
12
12
|
//#region ../plus/integrations/src/providers/bitbucket.ts
|
|
13
13
|
const metadata = providersMetadata["bitbucket"];
|
|
@@ -9,10 +9,10 @@ import { RepositoryMetadata } from "../../../git/models/repositoryMetadata.js";
|
|
|
9
9
|
import { PullRequestUrlIdentity } from "../../../git/utils/pullRequest.utils.js";
|
|
10
10
|
import { ProviderAuthenticationSession } from "../authentication/models.js";
|
|
11
11
|
import { GitCloudHostIntegrationId, GitSelfManagedHostIntegrationId } from "../constants.js";
|
|
12
|
+
import { ProviderPullRequestCount, ProviderPullRequestSearchPage } from "../models/pullRequestReads.js";
|
|
12
13
|
import { ProvidersApi } from "./providersApi.js";
|
|
13
14
|
import { ProviderIssueSearchPage, SearchMyIssuesOptions } from "../models/issueReads.js";
|
|
14
15
|
import { GitHostIntegration, SearchMyPullRequestsOptions, SearchPullRequestsOptions } from "../models/gitHostIntegration.js";
|
|
15
|
-
import { ProviderPullRequestSearchPage } from "../models/pullRequestReads.js";
|
|
16
16
|
import "../models/integration.js";
|
|
17
17
|
import { ProviderOrganization } from "../results.js";
|
|
18
18
|
import { ProviderApiPagedResult, ProviderHierarchyResult, ProviderPullRequest, ProviderRepoInput, ProviderRepository } from "./models.js";
|
|
@@ -29,7 +29,7 @@ declare abstract class GitHubIntegrationBase<ID extends GitHubIntegrationIds> ex
|
|
|
29
29
|
* by appending GitHub Enterprise's paths. Only a GHE instance base belongs here; cloud passes `undefined`,
|
|
30
30
|
* the sole value that selects the cloud endpoints (see the cloud subclass).
|
|
31
31
|
*/
|
|
32
|
-
protected abstract
|
|
32
|
+
protected abstract apiBaseUrlFor(session: ProviderAuthenticationSession): string | undefined;
|
|
33
33
|
protected getProviderAccountForCommit(session: ProviderAuthenticationSession, repo: GitHubRepositoryDescriptor, rev: string, options?: {
|
|
34
34
|
avatarSize?: number;
|
|
35
35
|
}): Promise<Account | UnidentifiedAuthor | undefined>;
|
|
@@ -136,7 +136,7 @@ declare abstract class GitHubIntegrationBase<ID extends GitHubIntegrationIds> ex
|
|
|
136
136
|
repos?: ProviderRepoInput[];
|
|
137
137
|
org?: string;
|
|
138
138
|
criteria?: PullRequestSearchCriteria;
|
|
139
|
-
}[], cancellation?: AbortSignal): Promise<
|
|
139
|
+
}[], cancellation?: AbortSignal): Promise<ProviderPullRequestCount[] | undefined>;
|
|
140
140
|
protected searchProviderPullRequests(session: ProviderAuthenticationSession, searchQuery: string, repos?: GitHubRepositoryDescriptor[], cancellation?: AbortSignal, options?: SearchPullRequestsOptions): Promise<PullRequest[] | undefined>;
|
|
141
141
|
/**
|
|
142
142
|
* Stack membership for every stacked pull request in the repository, keyed by pull request number.
|
|
@@ -164,7 +164,7 @@ export declare class GitHubIntegration extends GitHubIntegrationBase<GitCloudHos
|
|
|
164
164
|
protected readonly key = GitCloudHostIntegrationId.GitHub;
|
|
165
165
|
readonly name: string;
|
|
166
166
|
get domain(): string;
|
|
167
|
-
protected
|
|
167
|
+
protected apiBaseUrlFor(_session: ProviderAuthenticationSession): string | undefined;
|
|
168
168
|
access(): Promise<boolean>;
|
|
169
169
|
refresh(): Promise<void>;
|
|
170
170
|
}
|
|
@@ -175,7 +175,7 @@ export declare class GitHubEnterpriseIntegration extends GitHubIntegrationBase<G
|
|
|
175
175
|
protected readonly key: `cloud-github-enterprise:${string}`;
|
|
176
176
|
readonly name = "GitHub Enterprise";
|
|
177
177
|
get domain(): string;
|
|
178
|
-
protected
|
|
178
|
+
protected apiBaseUrlFor(session: ProviderAuthenticationSession): string;
|
|
179
179
|
constructor(ctx: IntegrationServiceContext, authenticationService: IntegrationAuthenticationService, getProvidersApi: () => Promise<ProvidersApi>, didChangeConnection: Emitter<IntegrationConnectionChangeEvent>, _domain: string);
|
|
180
180
|
}
|
|
181
181
|
//#endregion
|