@gitkraken/provider-apis 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 +6 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +38 -38
- package/dist/providers/azureDevops/azureDevOps.d.ts +2 -1
- package/dist/providers/bitbucket/bitbucket.d.ts +5 -4
- package/dist/providers/bitbucket/bitbucketTypes.d.ts +1 -1
- package/dist/providers/bitbucketServer/bitbucketServer.d.ts +30 -0
- package/dist/providers/bitbucketServer/bitbucketServerTypes.d.ts +6 -0
- package/dist/providers/gitProvider.d.ts +9 -12
- package/dist/providers/github/github.d.ts +3 -2
- package/dist/providers/gitlab/gitlab.d.ts +3 -2
- package/dist/providers/issueProvider.d.ts +3 -4
- package/dist/providers/provider.d.ts +3 -1
- package/dist/types.d.ts +2 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { AzureDevOps } from './providers/azureDevops/azureDevOps';
|
|
2
2
|
import { Bitbucket } from './providers/bitbucket/bitbucket';
|
|
3
|
+
import { BitbucketServer } from './providers/bitbucketServer/bitbucketServer';
|
|
3
4
|
import { GitHub } from './providers/github/github';
|
|
4
5
|
import { GitLab } from './providers/gitlab/gitlab';
|
|
5
6
|
import { Jira } from './providers/jira/jira';
|
|
@@ -8,13 +9,14 @@ import { Config } from './types';
|
|
|
8
9
|
declare const makeProviderAPIs: (config?: Partial<Config>) => {
|
|
9
10
|
azureDevOps: AzureDevOps;
|
|
10
11
|
bitbucket: Bitbucket;
|
|
12
|
+
bitbucketServer: BitbucketServer;
|
|
11
13
|
github: GitHub;
|
|
12
14
|
gitlab: GitLab;
|
|
13
15
|
jira: Jira;
|
|
14
16
|
trello: Trello;
|
|
15
17
|
};
|
|
16
18
|
export default makeProviderAPIs;
|
|
17
|
-
export { AzureDevOps, Bitbucket, GitHub, GitLab };
|
|
19
|
+
export { AzureDevOps, Bitbucket, BitbucketServer, GitHub, GitLab };
|
|
18
20
|
export type * from './providers/azureDevops/azureDevOps';
|
|
19
21
|
export type * from './providers/bitbucket/bitbucket';
|
|
20
22
|
export type * from './providers/gitProvider';
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var Ee=Object.create;var z=Object.defineProperty;var Ue=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var De=Object.getPrototypeOf,$e=Object.prototype.hasOwnProperty;var Ae=(e,t)=>{for(var r in t)z(e,r,{get:t[r],enumerable:!0})},ae=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Se(t))!$e.call(e,s)&&s!==r&&z(e,s,{get:()=>t[s],enumerable:!(n=Ue(t,s))||n.enumerable});return e};var Ge=(e,t,r)=>(r=e!=null?Ee(De(e)):{},ae(t||!e||!e.__esModule?z(r,"default",{value:e,enumerable:!0}):r,e)),Le=e=>ae(z({},"__esModule",{value:!0}),e);var ct={};Ae(ct,{AzureDevOps:()=>B,Bitbucket:()=>j,GitHub:()=>N,GitLab:()=>Q,default:()=>mt});module.exports=Le(ct);var ie=Ge(require("node-fetch")),ue=globalThis.fetch||ie.default;var le=e=>e.name==="fetch";var Te=async e=>{let t=e.headers.get("content-type")||"",r=null;if(t.startsWith("application/json"))r=await e.json();else if(t.startsWith("text/"))r=await e.text();else throw new Error(`Unsupported content-type: ${t}`);let n={body:r,headers:Object.fromEntries(e.headers.entries()),status:e.status,statusText:e.statusText};if(!e.ok){let s=new Error(e.statusText);throw Object.assign(s,{response:n}),s}return n},V=e=>le(e)?async({url:t,...r})=>{let n=await e(t,r);return Te(n)}:e;var $=class{constructor(t){this.config={...t,request:V((t==null?void 0:t.request)||ue)}}updateConfig(t){this.config={...this.config,...t,request:t.request?V(t.request):this.config.request}}};var L=class extends ${},x=class extends L{},S=100;var y=(e,t)=>{let r={};return e&&(r.Authorization=`${t?"Basic":"Bearer"} ${e}`),r};var v=(e,t={})=>y(t.token||e.token,t.isPAT||e.isPAT);var _e="https://app.vssps.visualstudio.com/_apis",A="https://dev.azure.com",xe={active:"OPEN",completed:"MERGED",abandoned:"CLOSED"},qe={10:"APPROVED",5:"APPROVED",0:"REVIEW_REQUESTED",[-5]:"CHANGES_REQUESTED",[-10]:"CHANGES_REQUESTED"},X=e=>({id:e.id,name:e.displayName,username:e.uniqueName||e.displayName,email:null,avatarUrl:e.imageUrl}),M=e=>e.startsWith("refs/heads/")?e.replace("refs/heads/",""):e,pe=e=>({id:e.pullRequestId.toString(),title:e.title,number:e.codeReviewId,state:xe[e.status],isDraft:e.isDraft,commentCount:null,upvoteCount:null,author:X(e.createdBy),createdDate:new Date(e.creationDate),updatedDate:new Date(e.closedDate||e.creationDate),closedDate:e.closedDate?new Date(e.closedDate):null,repository:{name:e.repository.name,owner:{login:void 0}},headCommit:{buildStatus:null},baseRef:{name:M(e.targetRefName)},headRef:{name:M(e.sourceRefName)},url:null,assignees:e.reviewers.map(X),reviews:e.reviewers.filter(t=>t.vote!==0).map(t=>({reviewer:X(t),state:qe[t.vote]||"REVIEW_REQUESTED"})),additions:null,deletions:null,fileCount:null,commitCount:null,headRepository:null,mergeableState:"UNKNOWN"}),de=(e,t)=>({id:t.id,name:t.name,namespace:e,project:t.project.name,webUrl:t.webUrl,httpsUrl:t.remoteUrl,sshUrl:t.sshUrl,defaultBranch:t.defaultBranch?{name:M(t.defaultBranch)}:null,permission:null}),ke=e=>{let t=e.fields,r=t["System.AssignedTo"];return{id:e.id.toString(),number:e.id.toString(),title:t["System.Title"],commentCount:t["System.CommentCount"],author:{avatarUrl:t["System.CreatedBy"]._links.avatar.href,email:null,id:t["System.CreatedBy"].id,name:t["System.CreatedBy"].uniqueName,username:t["System.CreatedBy"].displayName},createdDate:new Date(t["System.CreatedDate"]),updatedDate:new Date(t["System.ChangedDate"]),url:e._links.html.href,assignees:r?[{avatarUrl:r._links.avatar.href,email:null,id:r.id,name:r.uniqueName,username:r.displayName}]:[],description:null,state:null,repository:null,upvoteCount:0}},B=class extends L{async getCurrentUser(t={}){if(t.isPAT||this.config.isPAT)throw new Error("Azure DevOps does not support PATs for this function.");let r=await this.config.request({url:`${_e}/profile/profiles/me`,headers:v(this.config,t)});return{data:{id:r.body.id,name:r.body.displayName,username:r.body.displayName,email:r.body.emailAddress,avatarUrl:null}}}async getCurrentUserForInstance(t,r={}){let s=(await this.config.request({url:`${A}/${encodeURIComponent(t.namespace)}/_apis/ConnectionData`,headers:v(this.config,r)})).body.authorizedUser;if(s.providerDisplayName==="Anonymous")throw new Error("Current user not found.");return{data:{id:s.id,name:s.providerDisplayName,username:s.providerDisplayName,email:s.properties.Account.$value,avatarUrl:null}}}async getUserForCommit(t,r={}){if(!t.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let s=(await this.config.request({url:`${A}/${encodeURIComponent(t.repo.namespace)}/${encodeURIComponent(t.repo.project)}/_apis/git/repositories/${encodeURIComponent(t.repo.name)}/commits/${t.oid}`,headers:v(this.config,r)})).body.author;return{data:{name:s.name,email:s.email,avatarUrl:s.imageUrl}}}async getRepo(t,r={}){if(!t.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let n=await this.config.request({url:`${A}/${encodeURIComponent(t.namespace)}/${encodeURIComponent(t.project)}/_apis/git/repositories/${encodeURIComponent(t.name)}`,headers:v(this.config,r)});return{data:de(t.namespace,n.body)}}async getRepos(t,r={}){return{data:(await Promise.all(t.map(s=>this.getRepo(s,r)))).map(s=>s.data)}}async getReposForAzureProject(t,r={}){if(!t.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');return{data:(await this.config.request({url:`${A}/${encodeURIComponent(t.namespace)}/${encodeURIComponent(t.project)}/_apis/git/repositories`,headers:v(this.config,r)})).body.value.map(s=>de(t.namespace,s))}}async getRefs(t,r,n={}){if(!r.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let s=new URL(`${A}/${encodeURIComponent(r.repo.namespace)}/${encodeURIComponent(r.repo.project)}/_apis/git/repositories/${encodeURIComponent(r.repo.name)}/refs`);s.searchParams.set("filter",t),s.searchParams.set("$top",S.toString()),r.cursor&&s.searchParams.set("continuationToken",r.cursor);let a=await this.config.request({url:s.toString(),headers:v(this.config,n)}),o=a.headers["x-ms-continuationtoken"];return{pageInfo:{hasNextPage:!!o,endCursor:o||null},data:a.body.value.map(i=>({name:M(i.name),commit:{oid:i.objectId,authoredDate:null,committedDate:null}}))}}async getBranches(t,r={}){return this.getRefs("heads",t,r)}async getTags(t,r={}){return this.getRefs("tags",t,r)}async getPullRequestsForRepoBase(t,r={},n=100){let{page:s,repo:a,assigneeLogins:o,authorLogin:i}=t||{},u=s||1;if(!a.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let l="searchCriteria.status=1";return o&&o.length&&(l+=`&searchCriteria.reviewerId=${o[0]}`),i&&(l+=`&searchCriteria.creatorId=${i}`),await this.config.request({url:`${r.baseUrl||A}/${encodeURIComponent(a.namespace)}/${encodeURIComponent(a.project||"")}/_apis/git/repositories/${encodeURIComponent(a.name)}/pullRequests?${l}&%24top=${n}&%24skip=${(u-1)*n}`,headers:v(this.config,r)})}async getPullRequestsForRepo(t,r={}){let s=t.page||1,a=await this.getPullRequestsForRepoBase(t,r,100);return{pageInfo:{hasNextPage:a.body.value.length===100,nextPage:s+1},data:a.body.value.map(pe)}}async getPullRequestsForRepos(t,r={}){if(!t.repos.every(a=>a.project))throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let{repos:n}=t||{},s=[];return await Promise.all(n.map(async a=>{try{(await this.getPullRequestsForRepoBase({repo:a,...t},r)).body.value.forEach(i=>{s.push(pe(i))})}catch(o){if(o.statusCode!==404&&o.statusCode!==401)throw o}})),{data:s}}async getIssuesForAzureProject(t,r={}){let{page:n,assigneeLogins:s,authorLogin:a,mentionLogin:o}=t||{},i=n||1,u=200,l=["[Microsoft.VSTS.Common.ClosedDate] = ''","[System.TeamProject] = @project","[Microsoft.VSTS.Common.ResolvedDate] = ''"];a&&l.push(`[System.CreatedBy] = '${a.replace("'","''")}'`),s&&s[0]&&l.push(`[System.AssignedTo] = '${s[0].replace("'","''")}'`),o&&l.push("[System.Id] IN (@recentMentions)");let p=`Select [Microsoft.VSTS.Common.ClosedDate], [Microsoft.VSTS.Common.ResolvedDate] From WorkItems Where ${l.join(" AND ")} order by [System.CreatedDate] desc`,m=await this.config.request({url:`${r.baseUrl||A}/${encodeURIComponent(t.namespace)}/${encodeURIComponent(t.project)}/_apis/wit/wiql?api-version=6.0`,body:JSON.stringify({query:p}),method:"POST",headers:{...v(this.config,r),"Content-Type":"application/json"}}),c=m.body.workItems.slice((i-1)*u,u*i).map(g=>g.id),d=await this.config.request({url:`${r.baseUrl||A}/${encodeURIComponent(t.namespace)}/${encodeURIComponent(t.project)}/_apis/wit/workitemsbatch?api-version=6.0`,body:JSON.stringify({ids:c,$expand:"Links"}),method:"POST",headers:{...v(this.config,r),"Content-Type":"application/json"}});return{pageInfo:{hasNextPage:m.body.workItems.length>u*i,nextPage:i+1},data:d.body.value.map(ke)}}};var T=(e,t={})=>y(t.token||e.token,t.isPAT||e.isPAT);var q="https://api.bitbucket.org/2.0",Oe={OPEN:"OPEN",MERGED:"MERGED",DECLINED:"CLOSED"},ge=e=>({id:e.uuid,name:e.display_name||e.nickname,username:e.nickname||e.display_name,email:null,avatarUrl:e.links.avatar.href}),ce=e=>{let t=e.id;return{id:t.toString(),title:e.title,number:t,state:Oe[e.state],isDraft:!1,commentCount:e.comment_count,upvoteCount:null,author:ge(e.author),createdDate:new Date(e.created_on),updatedDate:new Date(e.updated_on),closedDate:null,repository:{name:e.source.repository.name,owner:{login:void 0}},headCommit:{buildStatus:null},baseRef:{name:e.destination.branch.name},headRef:{name:e.source.branch.name},url:e.links.html.href,assignees:null,reviews:null,additions:null,deletions:null,fileCount:null,commitCount:null,headRepository:null,mergeableState:"UNKNOWN"}},j=class extends L{async refreshToken(t){return{data:(await this.config.request({url:"https://bitbucket.org/site/oauth2/access_token",method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Basic ${t.base64ClientIDColonClientSecret}`},body:`grant_type=refresh_token&refresh_token=${t.refreshToken}`})).body}}async getCurrentUser(t={}){let r=await this.config.request({url:`${q}/user`,headers:T(this.config,t)});return{data:ge(r.body)}}async getUserForCommit(t,r={}){var o;let s=(await this.config.request({url:`${q}/repositories/${t.repo.namespace}/${t.repo.name}/commit/${t.oid}`,headers:T(this.config,r)})).body.author,a=s.raw.match(/([^<]+)<(.+)>/);return{data:{name:a?a[1].trim():null,email:a?a[2]:null,avatarUrl:((o=s.user)==null?void 0:o.links.avatar.href)||null}}}async getRepo(t,r={}){var s,a;let n=await this.config.request({url:`${q}/repositories/${t.namespace}/${t.name}`,headers:T(this.config,r)});return{data:{id:n.body.uuid,namespace:n.body.workspace.slug,name:n.body.slug,webUrl:n.body.links.html.href,httpsUrl:((s=n.body.links.clone.find(o=>o.name==="https"))==null?void 0:s.href)??null,sshUrl:((a=n.body.links.clone.find(o=>o.name==="ssh"))==null?void 0:a.href)??null,defaultBranch:{name:n.body.mainbranch.name},permission:null}}}async getRepos(t,r={}){return{data:(await Promise.all(t.map(s=>this.getRepo(s,r)))).map(s=>s.data)}}async getBranches(t,r={}){var o;let n=new URL(`${q}/repositories/${t.repo.namespace}/${t.repo.name}/refs/branches`);n.searchParams.set("page",((o=t.page)==null?void 0:o.toString())||"1"),n.searchParams.set("pagelen",S.toString());let s=await this.config.request({url:n.toString(),headers:T(this.config,r)}),a=!!s.body.next;return{pageInfo:{hasNextPage:a,nextPage:a?s.body.page+1:null},data:s.body.values.map(i=>{let u=new Date(i.target.date);return{name:i.name,commit:{oid:i.target.hash,authoredDate:u,committedDate:u}}})}}async getTags(t,r={}){let n=new URL(`${q}/repositories/${t.repo.namespace}/${t.repo.name}/refs/tags`);n.searchParams.set("pagelen",S.toString()),t.cursor&&n.searchParams.set("page",t.cursor);let s=await this.config.request({url:n.toString(),headers:T(this.config,r)}),a=!!s.body.next,o=null;return s.body.next&&(o=new URL(s.body.next).searchParams.get("page")),{pageInfo:{hasNextPage:a,endCursor:o},data:s.body.values.map(i=>{let u=new Date(i.target.date);return{name:i.name,commit:{oid:i.target.hash,authoredDate:u,committedDate:u}}})}}async getPullRequestsForRepoBase(t,r={}){var s;let n=new URL(`${r.baseUrl||q}/repositories/${encodeURI(t.repo.namespace)}/${encodeURI(t.repo.name)}/pullrequests?state=OPEN`);return n.searchParams.set("page",((s=t.page)==null?void 0:s.toString())||"1"),n.searchParams.set("pagelen","50"),await this.config.request({url:n.toString(),headers:T(this.config,r)})}async getPullRequestsForRepo(t,r={}){let n=[],s=await this.getPullRequestsForRepoBase(t,r);s.body.values.forEach(o=>{if(t.authorLogin&&o.author.uuid!==t.authorLogin)return null;n.push(ce(o))});let a=!!s.body.next;return{pageInfo:{hasNextPage:a,nextPage:a?s.body.page+1:null},data:n}}async getPullRequestsForRepos(t,r={}){let n=[];return await Promise.all(t.repos.map(async s=>{try{(await this.getPullRequestsForRepoBase({repo:s,...t},r)).body.values.forEach(o=>{if(t.authorLogin&&o.author.uuid!==t.authorLogin)return null;n.push(ce(o))})}catch(a){if(a.statusCode!==404&&a.statusCode!==401)throw a}})),{data:n}}};var Z="https://api.github.com",Be=`${Z}/graphql`,he=/\/api\/v\d+$/,je=e=>{if(e.endsWith("/api/graphql"))throw new Error("The graphql endpoint is being used as the baseUrl. This package uses both GraphQL and REST APIs, and the REST version cannot be assumed. Use the REST endpoint as the baseUrl instead.")},Ne=(e,t)=>{let r=t.baseUrl||e.baseUrl;return r?(r=r.replace(/\/$/,""),je(r),he.test(r)&&(r=r.replace(he,"")),`${r}/api/graphql`):Be},P=(e,t,r)=>{let n=y(r.token||e.token);return n["X-Github-Next-Global-ID"]="1",n["Content-Type"]="application/json",e.request({url:Ne(e,r),method:"POST",headers:n,body:JSON.stringify(t)})},Fe={user:!0,"user:email":!0,"read:user":!0},k=e=>e.some(t=>Fe[t]),w=(e=!1,t=!1)=>`
|
|
1
|
+
"use strict";var Ue=Object.create;var z=Object.defineProperty;var Ee=Object.getOwnPropertyDescriptor;var Se=Object.getOwnPropertyNames;var De=Object.getPrototypeOf,$e=Object.prototype.hasOwnProperty;var Ge=(e,t)=>{for(var r in t)z(e,r,{get:t[r],enumerable:!0})},ae=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Se(t))!$e.call(e,s)&&s!==r&&z(e,s,{get:()=>t[s],enumerable:!(n=Ee(t,s))||n.enumerable});return e};var Le=(e,t,r)=>(r=e!=null?Ue(De(e)):{},ae(t||!e||!e.__esModule?z(r,"default",{value:e,enumerable:!0}):r,e)),Ae=e=>ae(z({},"__esModule",{value:!0}),e);var ct={};Ge(ct,{AzureDevOps:()=>O,Bitbucket:()=>B,BitbucketServer:()=>j,GitHub:()=>N,GitLab:()=>Q,default:()=>mt});module.exports=Ae(ct);var D=100;var ie=Le(require("node-fetch")),ue=globalThis.fetch||ie.default;var le=e=>e.name==="fetch";var Te=async e=>{let t=e.headers.get("content-type")||"",r=null;if(t.startsWith("application/json"))r=await e.json();else if(t.startsWith("text/"))r=await e.text();else throw new Error(`Unsupported content-type: ${t}`);let n={body:r,headers:Object.fromEntries(e.headers.entries()),status:e.status,statusText:e.statusText};if(!e.ok){let s=new Error(e.statusText);throw Object.assign(s,{response:n}),s}return n},V=e=>le(e)?async({url:t,...r})=>{let n=await e(t,r);return Te(n)}:e;var C=class{constructor(t){this.config={...t,request:V((t==null?void 0:t.request)||ue)}}updateConfig(t){this.config={...this.config,...t,request:t.request?V(t.request):this.config.request}}},G=class extends C{};var y=(e,t)=>{let r={};return e&&(r.Authorization=`${t?"Basic":"Bearer"} ${e}`),r};var w=(e,t={})=>y(t.token||e.token,t.isPAT||e.isPAT);var _e="https://app.vssps.visualstudio.com/_apis",L="https://dev.azure.com",xe={active:"OPEN",completed:"MERGED",abandoned:"CLOSED"},qe={10:"APPROVED",5:"APPROVED",0:"REVIEW_REQUESTED",[-5]:"CHANGES_REQUESTED",[-10]:"CHANGES_REQUESTED"},X=e=>({id:e.id,name:e.displayName,username:e.uniqueName||e.displayName,email:null,avatarUrl:e.imageUrl}),M=e=>e.startsWith("refs/heads/")?e.replace("refs/heads/",""):e,pe=e=>({id:e.pullRequestId.toString(),title:e.title,number:e.codeReviewId,state:xe[e.status],isDraft:e.isDraft,commentCount:null,upvoteCount:null,author:X(e.createdBy),createdDate:new Date(e.creationDate),updatedDate:new Date(e.closedDate||e.creationDate),closedDate:e.closedDate?new Date(e.closedDate):null,repository:{name:e.repository.name,owner:{login:void 0}},headCommit:{buildStatus:null},baseRef:{name:M(e.targetRefName)},headRef:{name:M(e.sourceRefName)},url:null,assignees:e.reviewers.map(X),reviews:e.reviewers.filter(t=>t.vote!==0).map(t=>({reviewer:X(t),state:qe[t.vote]||"REVIEW_REQUESTED"})),additions:null,deletions:null,fileCount:null,commitCount:null,headRepository:null,mergeableState:"UNKNOWN"}),de=(e,t)=>({id:t.id,name:t.name,namespace:e,project:t.project.name,webUrl:t.webUrl,httpsUrl:t.remoteUrl,sshUrl:t.sshUrl,defaultBranch:t.defaultBranch?{name:M(t.defaultBranch)}:null,permission:null}),ke=e=>{let t=e.fields,r=t["System.AssignedTo"];return{id:e.id.toString(),number:e.id.toString(),title:t["System.Title"],commentCount:t["System.CommentCount"],author:{avatarUrl:t["System.CreatedBy"]._links.avatar.href,email:null,id:t["System.CreatedBy"].id,name:t["System.CreatedBy"].uniqueName,username:t["System.CreatedBy"].displayName},createdDate:new Date(t["System.CreatedDate"]),updatedDate:new Date(t["System.ChangedDate"]),url:e._links.html.href,assignees:r?[{avatarUrl:r._links.avatar.href,email:null,id:r.id,name:r.uniqueName,username:r.displayName}]:[],description:null,state:null,repository:null,upvoteCount:0}},O=class extends C{async getCurrentUser(t={}){if(t.isPAT||this.config.isPAT)throw new Error("Azure DevOps does not support PATs for this function.");let r=await this.config.request({url:`${_e}/profile/profiles/me`,headers:w(this.config,t)});return{data:{id:r.body.id,name:r.body.displayName,username:r.body.displayName,email:r.body.emailAddress,avatarUrl:null}}}async getCurrentUserForInstance(t,r={}){let s=(await this.config.request({url:`${L}/${encodeURIComponent(t.namespace)}/_apis/ConnectionData`,headers:w(this.config,r)})).body.authorizedUser;if(s.providerDisplayName==="Anonymous")throw new Error("Current user not found.");return{data:{id:s.id,name:s.providerDisplayName,username:s.providerDisplayName,email:s.properties.Account.$value,avatarUrl:null}}}async getUserForCommit(t,r={}){if(!t.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let s=(await this.config.request({url:`${L}/${encodeURIComponent(t.repo.namespace)}/${encodeURIComponent(t.repo.project)}/_apis/git/repositories/${encodeURIComponent(t.repo.name)}/commits/${t.oid}`,headers:w(this.config,r)})).body.author;return{data:{name:s.name,email:s.email,avatarUrl:s.imageUrl}}}async getRepo(t,r={}){if(!t.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let n=await this.config.request({url:`${L}/${encodeURIComponent(t.namespace)}/${encodeURIComponent(t.project)}/_apis/git/repositories/${encodeURIComponent(t.name)}`,headers:w(this.config,r)});return{data:de(t.namespace,n.body)}}async getRepos(t,r={}){return{data:(await Promise.all(t.map(s=>this.getRepo(s,r)))).map(s=>s.data)}}async getReposForAzureProject(t,r={}){if(!t.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');return{data:(await this.config.request({url:`${L}/${encodeURIComponent(t.namespace)}/${encodeURIComponent(t.project)}/_apis/git/repositories`,headers:w(this.config,r)})).body.value.map(s=>de(t.namespace,s))}}async getRefs(t,r,n={}){if(!r.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let s=new URL(`${L}/${encodeURIComponent(r.repo.namespace)}/${encodeURIComponent(r.repo.project)}/_apis/git/repositories/${encodeURIComponent(r.repo.name)}/refs`);s.searchParams.set("filter",t),s.searchParams.set("$top",D.toString()),r.cursor&&s.searchParams.set("continuationToken",r.cursor);let a=await this.config.request({url:s.toString(),headers:w(this.config,n)}),o=a.headers["x-ms-continuationtoken"];return{pageInfo:{hasNextPage:!!o,endCursor:o||null},data:a.body.value.map(i=>({name:M(i.name),commit:{oid:i.objectId,authoredDate:null,committedDate:null}}))}}async getBranches(t,r={}){return this.getRefs("heads",t,r)}async getTags(t,r={}){return this.getRefs("tags",t,r)}async getPullRequestsForRepoBase(t,r={},n=100){let{page:s,repo:a,assigneeLogins:o,authorLogin:i}=t||{},u=s||1;if(!a.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let l="searchCriteria.status=1";return o&&o.length&&(l+=`&searchCriteria.reviewerId=${o[0]}`),i&&(l+=`&searchCriteria.creatorId=${i}`),await this.config.request({url:`${r.baseUrl||L}/${encodeURIComponent(a.namespace)}/${encodeURIComponent(a.project||"")}/_apis/git/repositories/${encodeURIComponent(a.name)}/pullRequests?${l}&%24top=${n}&%24skip=${(u-1)*n}`,headers:w(this.config,r)})}async getPullRequestsForRepo(t,r={}){let s=t.page||1,a=await this.getPullRequestsForRepoBase(t,r,100);return{pageInfo:{hasNextPage:a.body.value.length===100,nextPage:s+1},data:a.body.value.map(pe)}}async getPullRequestsForRepos(t,r={}){if(!t.repos.every(a=>a.project))throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let{repos:n}=t||{},s=[];return await Promise.all(n.map(async a=>{try{(await this.getPullRequestsForRepoBase({repo:a,...t},r)).body.value.forEach(i=>{s.push(pe(i))})}catch(o){if(o.statusCode!==404&&o.statusCode!==401)throw o}})),{data:s}}async getIssuesForAzureProject(t,r={}){let{page:n,assigneeLogins:s,authorLogin:a,mentionLogin:o}=t||{},i=n||1,u=200,l=["[Microsoft.VSTS.Common.ClosedDate] = ''","[System.TeamProject] = @project","[Microsoft.VSTS.Common.ResolvedDate] = ''"];a&&l.push(`[System.CreatedBy] = '${a.replace("'","''")}'`),s&&s[0]&&l.push(`[System.AssignedTo] = '${s[0].replace("'","''")}'`),o&&l.push("[System.Id] IN (@recentMentions)");let p=`Select [Microsoft.VSTS.Common.ClosedDate], [Microsoft.VSTS.Common.ResolvedDate] From WorkItems Where ${l.join(" AND ")} order by [System.CreatedDate] desc`,m=await this.config.request({url:`${r.baseUrl||L}/${encodeURIComponent(t.namespace)}/${encodeURIComponent(t.project)}/_apis/wit/wiql?api-version=6.0`,body:JSON.stringify({query:p}),method:"POST",headers:{...w(this.config,r),"Content-Type":"application/json"}}),c=m.body.workItems.slice((i-1)*u,u*i).map(g=>g.id),d=await this.config.request({url:`${r.baseUrl||L}/${encodeURIComponent(t.namespace)}/${encodeURIComponent(t.project)}/_apis/wit/workitemsbatch?api-version=6.0`,body:JSON.stringify({ids:c,$expand:"Links"}),method:"POST",headers:{...w(this.config,r),"Content-Type":"application/json"}});return{pageInfo:{hasNextPage:m.body.workItems.length>u*i,nextPage:i+1},data:d.body.value.map(ke)}}};var T=(e,t={})=>y(t.token||e.token,t.isPAT||e.isPAT);var x="https://api.bitbucket.org/2.0",Oe={OPEN:"OPEN",MERGED:"MERGED",DECLINED:"CLOSED"},ge=e=>({id:e.uuid,name:e.display_name||e.nickname,username:e.nickname||e.display_name,email:null,avatarUrl:e.links.avatar.href}),ce=e=>{let t=e.id;return{id:t.toString(),title:e.title,number:t,state:Oe[e.state],isDraft:!1,commentCount:e.comment_count,upvoteCount:null,author:ge(e.author),createdDate:new Date(e.created_on),updatedDate:new Date(e.updated_on),closedDate:null,repository:{name:e.source.repository.name,owner:{login:void 0}},headCommit:{buildStatus:null},baseRef:{name:e.destination.branch.name},headRef:{name:e.source.branch.name},url:e.links.html.href,assignees:null,reviews:null,additions:null,deletions:null,fileCount:null,commitCount:null,headRepository:null,mergeableState:"UNKNOWN"}},B=class extends C{async refreshToken(t){return{data:(await this.config.request({url:"https://bitbucket.org/site/oauth2/access_token",method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded",Authorization:`Basic ${t.base64ClientIDColonClientSecret}`},body:`grant_type=refresh_token&refresh_token=${t.refreshToken}`})).body}}async getCurrentUser(t={}){let r=await this.config.request({url:`${x}/user`,headers:T(this.config,t)});return{data:ge(r.body)}}async getUserForCommit(t,r={}){var o;let s=(await this.config.request({url:`${x}/repositories/${t.repo.namespace}/${t.repo.name}/commit/${t.oid}`,headers:T(this.config,r)})).body.author,a=s.raw.match(/([^<]+)<(.+)>/);return{data:{name:a?a[1].trim():null,email:a?a[2]:null,avatarUrl:((o=s.user)==null?void 0:o.links.avatar.href)||null}}}async getRepo(t,r={}){var s,a;let n=await this.config.request({url:`${x}/repositories/${t.namespace}/${t.name}`,headers:T(this.config,r)});return{data:{id:n.body.uuid,namespace:n.body.workspace.slug,name:n.body.slug,webUrl:n.body.links.html.href,httpsUrl:((s=n.body.links.clone.find(o=>o.name==="https"))==null?void 0:s.href)??null,sshUrl:((a=n.body.links.clone.find(o=>o.name==="ssh"))==null?void 0:a.href)??null,defaultBranch:{name:n.body.mainbranch.name},permission:null}}}async getRepos(t,r={}){return{data:(await Promise.all(t.map(s=>this.getRepo(s,r)))).map(s=>s.data)}}async getBranches(t,r={}){var o;let n=new URL(`${x}/repositories/${t.repo.namespace}/${t.repo.name}/refs/branches`);n.searchParams.set("page",((o=t.page)==null?void 0:o.toString())||"1"),n.searchParams.set("pagelen",D.toString());let s=await this.config.request({url:n.toString(),headers:T(this.config,r)}),a=!!s.body.next;return{pageInfo:{hasNextPage:a,nextPage:a?s.body.page+1:null},data:s.body.values.map(i=>{let u=new Date(i.target.date);return{name:i.name,commit:{oid:i.target.hash,authoredDate:u,committedDate:u}}})}}async getTags(t,r={}){let n=new URL(`${x}/repositories/${t.repo.namespace}/${t.repo.name}/refs/tags`);n.searchParams.set("pagelen",D.toString()),t.cursor&&n.searchParams.set("page",t.cursor);let s=await this.config.request({url:n.toString(),headers:T(this.config,r)}),a=!!s.body.next,o=null;return s.body.next&&(o=new URL(s.body.next).searchParams.get("page")),{pageInfo:{hasNextPage:a,endCursor:o},data:s.body.values.map(i=>{let u=new Date(i.target.date);return{name:i.name,commit:{oid:i.target.hash,authoredDate:u,committedDate:u}}})}}async getPullRequestsForRepoBase(t,r={}){var s;let n=new URL(`${x}/repositories/${encodeURI(t.repo.namespace)}/${encodeURI(t.repo.name)}/pullrequests?state=OPEN`);return n.searchParams.set("page",((s=t.page)==null?void 0:s.toString())||"1"),n.searchParams.set("pagelen","50"),await this.config.request({url:n.toString(),headers:T(this.config,r)})}async getPullRequestsForRepo(t,r={}){let n=[],s=await this.getPullRequestsForRepoBase(t,r);s.body.values.forEach(o=>{if(t.authorLogin&&o.author.uuid!==t.authorLogin)return null;n.push(ce(o))});let a=!!s.body.next;return{pageInfo:{hasNextPage:a,nextPage:a?s.body.page+1:null},data:n}}async getPullRequestsForRepos(t,r={}){let n=[];return await Promise.all(t.repos.map(async s=>{try{(await this.getPullRequestsForRepoBase({repo:s,...t},r)).body.values.forEach(o=>{if(t.authorLogin&&o.author.uuid!==t.authorLogin)return null;n.push(ce(o))})}catch(a){if(a.statusCode!==404&&a.statusCode!==401)throw a}})),{data:n}}};var j=class extends G{getBaseUrl(t){let r=t.baseUrl||this.config.baseUrl;if(!r)throw new Error('Bitbucket Server requires "baseUrl"');return r}getRequestHeaders(t){return y(t.token||this.config.token)}async getRepo(t,r={}){var s,a,o;let n=await this.config.request({url:`${this.getBaseUrl(r)}/projects/${t.namespace}/repos/${t.name}`,headers:this.getRequestHeaders(r)});return{data:{id:n.body.id.toString(),namespace:n.body.project.key,name:n.body.slug,webUrl:((s=n.body.links.self[0])==null?void 0:s.href)??null,httpsUrl:((a=n.body.links.clone.find(i=>i.name==="https"))==null?void 0:a.href)??null,sshUrl:((o=n.body.links.clone.find(i=>i.name==="ssh"))==null?void 0:o.href)??null,defaultBranch:null,permission:null}}}async getRepos(t,r={}){return{data:(await Promise.all(t.map(s=>this.getRepo(s,r)))).map(s=>s.data)}}};var Z="https://api.github.com",Be=`${Z}/graphql`,he=/\/api\/v\d+$/,je=e=>{if(e.endsWith("/api/graphql"))throw new Error("The graphql endpoint is being used as the baseUrl. This package uses both GraphQL and REST APIs, and the REST version cannot be assumed. Use the REST endpoint as the baseUrl instead.")},Ne=(e,t)=>{let r=t.baseUrl||e.baseUrl;return r?(r=r.replace(/\/$/,""),je(r),he.test(r)&&(r=r.replace(he,"")),`${r}/api/graphql`):Be},P=(e,t,r)=>{let n=y(r.token||e.token);return n["X-Github-Next-Global-ID"]="1",n["Content-Type"]="application/json",e.request({url:Ne(e,r),method:"POST",headers:n,body:JSON.stringify(t)})},Fe={user:!0,"user:email":!0,"read:user":!0},q=e=>e.some(t=>Fe[t]),U=(e=!1,t=!1)=>`
|
|
2
2
|
id
|
|
3
3
|
databaseId
|
|
4
4
|
name
|
|
@@ -13,7 +13,7 @@ title
|
|
|
13
13
|
state
|
|
14
14
|
author {
|
|
15
15
|
... on User {
|
|
16
|
-
${
|
|
16
|
+
${U(!1,t)}
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
19
|
commits(last: 1) {
|
|
@@ -73,7 +73,7 @@ updatedAt
|
|
|
73
73
|
closedAt
|
|
74
74
|
assignees(first: 100) {
|
|
75
75
|
nodes {
|
|
76
|
-
${
|
|
76
|
+
${U(!1,t)}
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
reviewRequests(first: 100) {
|
|
@@ -81,7 +81,7 @@ reviewRequests(first: 100) {
|
|
|
81
81
|
asCodeOwner
|
|
82
82
|
requestedReviewer {
|
|
83
83
|
... on User {
|
|
84
|
-
${
|
|
84
|
+
${U(!1,t)}
|
|
85
85
|
}
|
|
86
86
|
}
|
|
87
87
|
}
|
|
@@ -90,7 +90,7 @@ latestReviews(first: 100) {
|
|
|
90
90
|
nodes {
|
|
91
91
|
author {
|
|
92
92
|
... on User {
|
|
93
|
-
${
|
|
93
|
+
${U(!1,t)}
|
|
94
94
|
}
|
|
95
95
|
}
|
|
96
96
|
state
|
|
@@ -136,13 +136,13 @@ defaultBranchRef {
|
|
|
136
136
|
name
|
|
137
137
|
}
|
|
138
138
|
viewerPermission
|
|
139
|
-
`,te={id:"U_kgDNJ5k",databaseId:10137,name:"Deleted user",login:"ghost",email:"",avatarUrl:"https://avatars.githubusercontent.com/u/10137?v=4"},He={APPROVED:"APPROVED",CHANGES_REQUESTED:"CHANGES_REQUESTED",COMMENTED:"COMMENTED",REVIEW_REQUESTED:"REVIEW_REQUESTED"},We={MERGEABLE:"MERGEABLE",CONFLICTING:"CONFLICTS",UNKNOWN:"UNKNOWN"},Re=e=>({id:e.databaseId.toString(),graphQLId:e.id,namespace:e.owner.login,name:e.name,webUrl:e.url,httpsUrl:e.url.endsWith(".git")?e.url:`${e.url}.git`,sshUrl:e.sshUrl,defaultBranch:e.defaultBranchRef,permission:e.viewerPermission}),Ve={OPEN:"OPEN",CLOSED:"CLOSED",MERGED:"MERGED"}
|
|
139
|
+
`,te={id:"U_kgDNJ5k",databaseId:10137,name:"Deleted user",login:"ghost",email:"",avatarUrl:"https://avatars.githubusercontent.com/u/10137?v=4"},He={APPROVED:"APPROVED",CHANGES_REQUESTED:"CHANGES_REQUESTED",COMMENTED:"COMMENTED",REVIEW_REQUESTED:"REVIEW_REQUESTED"},We={MERGEABLE:"MERGEABLE",CONFLICTING:"CONFLICTS",UNKNOWN:"UNKNOWN"},Re=e=>({id:e.databaseId.toString(),graphQLId:e.id,namespace:e.owner.login,name:e.name,webUrl:e.url,httpsUrl:e.url.endsWith(".git")?e.url:`${e.url}.git`,sshUrl:e.sshUrl,defaultBranch:e.defaultBranchRef,permission:e.viewerPermission}),Ve={OPEN:"OPEN",CLOSED:"CLOSED",MERGED:"MERGED"},$=e=>({id:e.databaseId.toString(),graphQLId:e.id,name:e.name,username:e.login,email:e.email??null,avatarUrl:e.avatarUrl}),Xe=e=>{var l,p,m,c,d,g,b,f;let t=e.author?e.author.id?e.author:null:te,r=(p=(l=e.commits.nodes)==null?void 0:l[0])==null?void 0:p.commit,n=((m=e.headRef)==null?void 0:m.target)||r,s=n==null?void 0:n.oid,a=r==null?void 0:r.oid,o=s===a?(d=(c=r==null?void 0:r.status)==null?void 0:c.contexts)==null?void 0:d[0]:null,i=(((g=e.reviewRequests)==null?void 0:g.nodes)||[]).filter(h=>!h.asCodeOwner),u=(b=e.headRepository)==null?void 0:b.url;return u&&!u.endsWith(".git")&&(u=`${u}.git`),{id:e.databaseId.toString(),graphQLId:e.id,title:e.title,number:e.number,state:Ve[e.state],commentCount:e.comments.totalCount,upvoteCount:e.reactions.totalCount,author:t?$(t):null,createdDate:new Date(e.createdAt),isDraft:e.isDraft,repository:{name:e.repository.name,owner:{login:e.repository.owner.login}},headRepository:e.headRepository?{name:e.headRepository.name,owner:{login:e.headRepository.owner.login},remoteInfo:{cloneUrlHTTPS:u,cloneUrlSSH:e.headRepository.sshUrl}}:null,headCommit:{buildStatus:o||null},headRef:e.headRef?{name:e.headRef.name}:null,baseRef:e.baseRef?{name:e.baseRef.name}:null,url:e.url,updatedDate:new Date(e.updatedAt),closedDate:e.closedAt?new Date(e.closedAt):null,assignees:e.assignees.nodes?e.assignees.nodes.map($):null,reviews:i.map(h=>({reviewer:$(h.requestedReviewer),state:"REVIEW_REQUESTED"})).concat((((f=e.latestReviews)==null?void 0:f.nodes)||[]).map(h=>{let R=h.author||te;return{reviewer:$(R),state:He[h.state]}})),additions:e.additions,deletions:e.deletions,fileCount:e.changedFiles,commitCount:e.commits.totalCount,mergeableState:We[e.mergeable]}},Je=e=>{var r;let t=(r=e.author)!=null&&r.id?e.author:te;return{id:e.databaseId.toString(),graphQLId:e.id,number:e.number,title:e.title,author:$(t),commentCount:e.comments.totalCount,createdDate:new Date(e.createdAt),description:null,state:null,repository:{name:e.repository.name,owner:{login:e.repository.owner.login}},url:e.url,updatedDate:new Date(e.updatedAt),assignees:e.assignees.nodes?e.assignees.nodes.map($):[],upvoteCount:e.reactions.totalCount}},N=class extends G{constructor(){super(...arguments);this._scopesCache={}}async getScopes(r){let n=r.token||this.config.token;if(!n)return[];let s=this._scopesCache[n];if(!s){let o=(await P(this.config,{query:"query { rateLimit(dryRun: true) { __typename } }"},r)).headers["x-oauth-scopes"];s=o?o.split(", "):[],this._scopesCache[n]=s}return s}getEnterpriseAvatarUrlIfNeeded(r,n,s){let a=s.baseUrl||this.config.baseUrl;return!a||a.startsWith(Z)?r:n?`https://avatars.githubusercontent.com/u/e?email=${encodeURIComponent(n)}`:""}async getCurrentUser(r={}){var o;let n=await this.getScopes(r),a=(o=(await P(this.config,{query:`
|
|
140
140
|
query getCurrentUser {
|
|
141
141
|
viewer {
|
|
142
|
-
${
|
|
142
|
+
${U(!1,q(n))}
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
|
-
`},r)).body.data)==null?void 0:o.viewer;if(!a)throw new Error("Current user not found.");return{data
|
|
145
|
+
`},r)).body.data)==null?void 0:o.viewer;if(!a)throw new Error("Current user not found.");return{data:$(a)}}async getUserForCommit(r,n={}){var i,u;let a=(i=(await P(this.config,{query:`
|
|
146
146
|
query getUserForCommit(
|
|
147
147
|
$owner: String!
|
|
148
148
|
$name: String!
|
|
@@ -166,18 +166,18 @@ query getAccountForEmail($query: String! $avatarSize: Int) {
|
|
|
166
166
|
search(query: $query, type: USER, first: 1) {
|
|
167
167
|
nodes {
|
|
168
168
|
... on User {
|
|
169
|
-
${
|
|
169
|
+
${U(!0,q(s))}
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
|
-
`,variables:{query:`in:email ${r.email}`,avatarSize:r.avatarSize}},n)).body.data)==null?void 0:i.search)==null?void 0:u.nodes)==null?void 0:l[0];if(!o)throw new Error("User not found.");return{data
|
|
174
|
+
`,variables:{query:`in:email ${r.email}`,avatarSize:r.avatarSize}},n)).body.data)==null?void 0:i.search)==null?void 0:u.nodes)==null?void 0:l[0];if(!o)throw new Error("User not found.");return{data:$({...o,avatarUrl:this.getEnterpriseAvatarUrlIfNeeded(o.avatarUrl,o.email,n)})}}async getAccountForUsername(r,n={}){var i;let s=await this.getScopes(n),o=(i=(await P(this.config,{query:`
|
|
175
175
|
query getUserForUsername($login: String! $avatarSize: Int) {
|
|
176
176
|
user(login: $login) {
|
|
177
|
-
${
|
|
177
|
+
${U(!0,q(s))}
|
|
178
178
|
}
|
|
179
179
|
}
|
|
180
|
-
`,variables:{login:r.username,avatarSize:r.avatarSize}},n)).body.data)==null?void 0:i.user;if(!o)throw new Error("User not found.");return{data
|
|
180
|
+
`,variables:{login:r.username,avatarSize:r.avatarSize}},n)).body.data)==null?void 0:i.user;if(!o)throw new Error("User not found.");return{data:$({...o,avatarUrl:this.getEnterpriseAvatarUrlIfNeeded(o.avatarUrl,o.email,n)})}}async getRepo(r,n={}){var a;let s=await P(this.config,{query:`
|
|
181
181
|
query getRepo($owner: String!, $name: String!) {
|
|
182
182
|
repository(owner: $owner, name: $name) {
|
|
183
183
|
${fe}
|
|
@@ -213,7 +213,7 @@ query getRefs($owner: String!, $name: String!, $refPrefix: String!, $cursor: Str
|
|
|
213
213
|
}
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
|
-
`,variables:{owner:n.repo.namespace,name:n.repo.name,refPrefix:r,cursor:n.cursor,first:
|
|
216
|
+
`,variables:{owner:n.repo.namespace,name:n.repo.name,refPrefix:r,cursor:n.cursor,first:D}},s)).body.data)==null?void 0:u.repository;if(!o)throw new Error("Repository not found.");let i=o.refs;return i?{pageInfo:i.pageInfo,data:(i.nodes||[]).map(l=>{var m;let p=(m=l.target)!=null&&m.oid?l.target:null;return{name:l.name,commit:p?{oid:p.oid,authoredDate:new Date(p.authoredDate),committedDate:new Date(p.committedDate)}:null}})}:{pageInfo:{endCursor:null,hasNextPage:!1},data:[]}}async getBranches(r,n={}){return this.getRefs("refs/heads/",r,n)}async getTags(r,n={}){return this.getRefs("refs/tags/",r,n)}async getBlame(r,n={}){var i;let a=(i=(await P(this.config,{query:`
|
|
217
217
|
query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
218
218
|
repository(owner: $owner, name: $name) {
|
|
219
219
|
object(expression: $ref) {
|
|
@@ -252,7 +252,7 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
252
252
|
}
|
|
253
253
|
}
|
|
254
254
|
}
|
|
255
|
-
`,variables:{owner:r.repo.namespace,name:r.repo.name,ref:r.ref,path:r.path}},n)).body.data)==null?void 0:i.repository;if(!a)throw new Error("Repository not found.");let o=a.object;if(!o||!("blame"in o))throw new Error("Ref not found.");if(o.blame.ranges.length===0)throw new Error("File not found.");return{data:{ranges:o.blame.ranges.map(u=>{var l;return{startingLine:u.startingLine,endingLine:u.endingLine,commit:{oid:u.commit.oid,parentOids:((l=u.commit.parents.nodes)==null?void 0:l.map(p=>p.oid))||[],authoredDate:new Date(u.commit.authoredDate),author:u.commit.author?{name:u.commit.author.name,email:u.commit.author.email,avatarUrl:u.commit.author.avatarUrl}:null,committedDate:new Date(u.commit.committedDate),committer:u.commit.committer?{name:u.commit.committer.name,email:u.commit.committer.email,avatarUrl:u.commit.committer.avatarUrl}:null,message:u.commit.message,fileCount:u.commit.changedFilesIfAvailable,additions:u.commit.additions,deletions:u.commit.deletions}}})}}}async getPullRequestsForRepos(r,n={}){var l,p,m,c,d,g,b,f;let s=await this.getScopes(n),a=
|
|
255
|
+
`,variables:{owner:r.repo.namespace,name:r.repo.name,ref:r.ref,path:r.path}},n)).body.data)==null?void 0:i.repository;if(!a)throw new Error("Repository not found.");let o=a.object;if(!o||!("blame"in o))throw new Error("Ref not found.");if(o.blame.ranges.length===0)throw new Error("File not found.");return{data:{ranges:o.blame.ranges.map(u=>{var l;return{startingLine:u.startingLine,endingLine:u.endingLine,commit:{oid:u.commit.oid,parentOids:((l=u.commit.parents.nodes)==null?void 0:l.map(p=>p.oid))||[],authoredDate:new Date(u.commit.authoredDate),author:u.commit.author?{name:u.commit.author.name,email:u.commit.author.email,avatarUrl:u.commit.author.avatarUrl}:null,committedDate:new Date(u.commit.committedDate),committer:u.commit.committer?{name:u.commit.committer.name,email:u.commit.committer.email,avatarUrl:u.commit.committer.avatarUrl}:null,message:u.commit.message,fileCount:u.commit.changedFilesIfAvailable,additions:u.commit.additions,deletions:u.commit.deletions}}})}}}async getPullRequestsForRepos(r,n={}){var l,p,m,c,d,g,b,f;let s=await this.getScopes(n),a=q(s),o="Field 'isDraft' doesn't exist on type 'PullRequest'",i=await ee(this.config,r,n,!0,a);if(i.body.errors){let R=((p=(l=i==null?void 0:i.body.errors)==null?void 0:l[0])==null?void 0:p.message)===o;n.baseUrl&&R&&(i=await ee(this.config,r,n,!1,a))}let u=((d=(c=(m=i.body)==null?void 0:m.data)==null?void 0:c.search)==null?void 0:d.nodes)||[];return{pageInfo:(f=(b=(g=i.body)==null?void 0:g.data)==null?void 0:b.search)==null?void 0:f.pageInfo,data:u.map(Xe)}}async getIssuesForRepos(r,n={}){var b,f,h,R,I,E;let s=await this.getScopes(n),a=q(s),o=Y(r.startQuery||""),{cursor:i,assigneeLogins:u,updatedBefore:l,authorLogin:p,mentionLogin:m}=r||{};r.repos.forEach(S=>{o.push(`repo:${S.namespace}/${S.name}`)}),u&&u.forEach(S=>{o.push(`assignee:${S}`)}),l&&o.push(`updated:<${l}`),p&&o.push(`author:${p}`),m&&o.push(`mentions:${m}`);let c=`
|
|
256
256
|
query (
|
|
257
257
|
$after: String
|
|
258
258
|
$search: String!
|
|
@@ -270,7 +270,7 @@ query (
|
|
|
270
270
|
title
|
|
271
271
|
author {
|
|
272
272
|
... on User {
|
|
273
|
-
${
|
|
273
|
+
${U(!1,a)}
|
|
274
274
|
}
|
|
275
275
|
}
|
|
276
276
|
createdAt
|
|
@@ -291,7 +291,7 @@ query (
|
|
|
291
291
|
}
|
|
292
292
|
assignees(first: 100) {
|
|
293
293
|
nodes {
|
|
294
|
-
${
|
|
294
|
+
${U(!1,a)}
|
|
295
295
|
}
|
|
296
296
|
}
|
|
297
297
|
}
|
|
@@ -303,7 +303,7 @@ query (
|
|
|
303
303
|
}
|
|
304
304
|
}
|
|
305
305
|
}
|
|
306
|
-
`,d=await P(this.config,{query:`${c}`,variables:{after:i??null,search:`sort:updated type:issue state:open ${o.join(" ")}`}},n);if(!d.body.data)throw new Error(d.statusText||"Unknown error");let g=((h=(f=(b=d.body)==null?void 0:b.data)==null?void 0:f.search)==null?void 0:h.nodes)||[];return{pageInfo:(E=(I=(R=d.body)==null?void 0:R.data)==null?void 0:I.search)==null?void 0:E.pageInfo,data:g.map(Je)}}};var Ke="https://gitlab.com/api/v4",Ze="https://gitlab.com/api/graphql",be=/\/api\/v\d+$/,ye=e=>{if(e.endsWith("/api/graphql"))throw new Error("The graphql endpoint is being used as the baseUrl. This package uses both GraphQL and REST APIs, and the REST version cannot be assumed. Use the REST endpoint as the baseUrl instead.")},re=(e,t)=>{let r=t.baseUrl||e.baseUrl;return r?(r=r.replace(/\/$/,""),ye(r),r):Ke},Ye=(e,t)=>{let r=t.baseUrl||e.baseUrl;return r?(r=r.replace(/\/$/,""),ye(r),be.test(r)&&(r=r.replace(be,"")),`${r}/api/graphql`):Ze},
|
|
306
|
+
`,d=await P(this.config,{query:`${c}`,variables:{after:i??null,search:`sort:updated type:issue state:open ${o.join(" ")}`}},n);if(!d.body.data)throw new Error(d.statusText||"Unknown error");let g=((h=(f=(b=d.body)==null?void 0:b.data)==null?void 0:f.search)==null?void 0:h.nodes)||[];return{pageInfo:(E=(I=(R=d.body)==null?void 0:R.data)==null?void 0:I.search)==null?void 0:E.pageInfo,data:g.map(Je)}}};var Ke="https://gitlab.com/api/v4",Ze="https://gitlab.com/api/graphql",be=/\/api\/v\d+$/,ye=e=>{if(e.endsWith("/api/graphql"))throw new Error("The graphql endpoint is being used as the baseUrl. This package uses both GraphQL and REST APIs, and the REST version cannot be assumed. Use the REST endpoint as the baseUrl instead.")},re=(e,t)=>{let r=t.baseUrl||e.baseUrl;return r?(r=r.replace(/\/$/,""),ye(r),r):Ke},Ye=(e,t)=>{let r=t.baseUrl||e.baseUrl;return r?(r=r.replace(/\/$/,""),ye(r),be.test(r)&&(r=r.replace(be,"")),`${r}/api/graphql`):Ze},v=(e,t,r)=>{let n=y(r.token||e.token);return e.request({url:Ye(e,r),method:"POST",headers:{...n,"Content-Type":"application/json"},body:JSON.stringify(t)})};var et={CAN_BE_MERGED:"MERGEABLE",CANNOT_BE_MERGED:"CONFLICTS",CANNOT_BE_MERGED_RECHECK:"UNKNOWN",UNCHECKED:"UNKNOWN",CHECKING:"UNKNOWN"},oe="gid://gitlab/User/",F="gid://gitlab/Project/",tt="gid://gitlab/MergeRequest/",rt="gid://gitlab/Issue/",Ie=`
|
|
307
307
|
id
|
|
308
308
|
path
|
|
309
309
|
fullPath
|
|
@@ -313,7 +313,7 @@ sshUrlToRepo
|
|
|
313
313
|
repository {
|
|
314
314
|
rootRef
|
|
315
315
|
}
|
|
316
|
-
`,
|
|
316
|
+
`,A=`
|
|
317
317
|
id
|
|
318
318
|
name
|
|
319
319
|
username
|
|
@@ -321,11 +321,11 @@ publicEmail
|
|
|
321
321
|
avatarUrl
|
|
322
322
|
`,ne=`
|
|
323
323
|
author {
|
|
324
|
-
${
|
|
324
|
+
${A}
|
|
325
325
|
}
|
|
326
326
|
assignees {
|
|
327
327
|
nodes {
|
|
328
|
-
${
|
|
328
|
+
${A}
|
|
329
329
|
}
|
|
330
330
|
}
|
|
331
331
|
createdAt
|
|
@@ -343,7 +343,7 @@ webUrl
|
|
|
343
343
|
id
|
|
344
344
|
state
|
|
345
345
|
author {
|
|
346
|
-
${
|
|
346
|
+
${A}
|
|
347
347
|
}
|
|
348
348
|
diffStatsSummary {
|
|
349
349
|
additions
|
|
@@ -364,25 +364,25 @@ targetBranch
|
|
|
364
364
|
sourceBranch
|
|
365
365
|
assignees {
|
|
366
366
|
nodes {
|
|
367
|
-
${
|
|
367
|
+
${A}
|
|
368
368
|
}
|
|
369
369
|
}
|
|
370
370
|
reviewers {
|
|
371
371
|
nodes {
|
|
372
|
-
${
|
|
372
|
+
${A}
|
|
373
373
|
mergeRequestInteraction {
|
|
374
374
|
approved
|
|
375
375
|
reviewState
|
|
376
376
|
}
|
|
377
377
|
}
|
|
378
378
|
}
|
|
379
|
-
mergeStatusEnum`,_=e=>`${e.namespace}/${e.name}`,nt=e=>`${e.namespace}/${e.name}`,
|
|
379
|
+
mergeStatusEnum`,_=e=>`${e.namespace}/${e.name}`,nt=e=>`${e.namespace}/${e.name}`,ve=e=>{var t;return{id:e.id.replace(F,""),graphQLId:e.id,namespace:e.fullPath.split("/").slice(0,-1).join("/"),name:e.path,webUrl:e.webUrl,httpsUrl:e.httpUrlToRepo,sshUrl:e.sshUrlToRepo,defaultBranch:(t=e.repository)!=null&&t.rootRef?{name:e.repository.rootRef}:null,permission:null}},st={opened:"OPEN",merged:"MERGED",closed:"CLOSED"},k=e=>({id:e.id.replace(oe,""),graphQLId:e.id,name:e.name,username:e.username,email:e.publicEmail,avatarUrl:e.avatarUrl}),Ce=(e,t)=>{var r,n,s,a,o;return{id:e.id.replace(tt,""),graphQLId:e.id,title:e.title,number:parseInt(e.iid,10),state:st[e.state],commentCount:e.userNotesCount||0,upvoteCount:e.upvotes,author:e.author?k(e.author):null,createdDate:new Date(e.createdAt),isDraft:e.draft,repository:{name:t.name,owner:{login:t.owner}},headRepository:null,headCommit:{buildStatus:null},baseRef:{name:e.targetBranch},headRef:{name:e.sourceBranch},url:e.webUrl,updatedDate:new Date(e.updatedAt),closedDate:e.mergedAt?new Date(e.mergedAt):null,assignees:(r=e.assignees)!=null&&r.nodes?e.assignees.nodes.map(k):null,reviews:(n=e.reviewers)!=null&&n.nodes?e.reviewers.nodes.map(i=>{var u,l;return{reviewer:k(i),state:(u=i.mergeRequestInteraction)!=null&&u.approved?"APPROVED":((l=i.mergeRequestInteraction)==null?void 0:l.reviewState)==="REVIEWED"?"CHANGES_REQUESTED":"CHANGES_REQUESTED"}}):null,additions:((s=e.diffStatsSummary)==null?void 0:s.additions)||0,deletions:((a=e.diffStatsSummary)==null?void 0:a.deletions)||0,fileCount:((o=e.diffStatsSummary)==null?void 0:o.fileCount)||0,commitCount:e.commitCount||0,mergeableState:et[e.mergeStatusEnum]}},se=(e,t)=>({author:{avatarUrl:e.author.avatarUrl,email:null,graphQLId:e.author.id,id:e.author.id.replace(oe,""),name:e.author.name,username:e.author.username},assignees:e.assignees.nodes.map(r=>({avatarUrl:r.avatarUrl,email:null,graphQLId:r.id,id:r.id.replace(oe,""),name:r.name,username:r.username})),commentCount:e.userNotesCount,createdDate:new Date(e.createdAt),description:e.description,graphQLId:e.id,id:e.id.replace(rt,""),number:e.iid,repository:{name:t.name,owner:{login:t.owner}},updatedDate:new Date(e.updatedAt),upvoteCount:e.upvotes,state:e.state,title:e.title,url:e.webUrl}),Q=class extends G{async getCurrentUser(t={}){var s;let n=(s=(await v(this.config,{query:`
|
|
380
380
|
query getCurrentUser {
|
|
381
381
|
currentUser {
|
|
382
|
-
${
|
|
382
|
+
${A}
|
|
383
383
|
}
|
|
384
384
|
}
|
|
385
|
-
`},t)).body.data)==null?void 0:s.currentUser;if(!n)throw new Error("Current user not found.");return{data:
|
|
385
|
+
`},t)).body.data)==null?void 0:s.currentUser;if(!n)throw new Error("Current user not found.");return{data:k(n)}}async getUserForCommit(t,r={}){var o,i,u,l;let n=_(t.repo),a=(l=(u=(i=(o=(await v(this.config,{query:`
|
|
386
386
|
query getUserForCommit($fullPath: ID!, $oid: String!) {
|
|
387
387
|
project(fullPath: $fullPath) {
|
|
388
388
|
repository {
|
|
@@ -396,36 +396,36 @@ query getUserForCommit($fullPath: ID!, $oid: String!) {
|
|
|
396
396
|
}
|
|
397
397
|
}
|
|
398
398
|
}
|
|
399
|
-
`,variables:{fullPath:n,oid:t.oid}},r)).body.data)==null?void 0:o.project)==null?void 0:i.repository)==null?void 0:u.tree)==null?void 0:l.lastCommit;if(!a)throw new Error("Commit not found.");return{data:{name:a.authorName,email:a.authorEmail,avatarUrl:a.authorGravatar}}}async getAccountForEmail(t,r={}){var a,o,i;let s=(i=(o=(a=(await
|
|
399
|
+
`,variables:{fullPath:n,oid:t.oid}},r)).body.data)==null?void 0:o.project)==null?void 0:i.repository)==null?void 0:u.tree)==null?void 0:l.lastCommit;if(!a)throw new Error("Commit not found.");return{data:{name:a.authorName,email:a.authorEmail,avatarUrl:a.authorGravatar}}}async getAccountForEmail(t,r={}){var a,o,i;let s=(i=(o=(a=(await v(this.config,{query:`
|
|
400
400
|
query getAccountForEmail($email: String!) {
|
|
401
401
|
users(search: $email) {
|
|
402
402
|
nodes {
|
|
403
|
-
${
|
|
403
|
+
${A}
|
|
404
404
|
}
|
|
405
405
|
}
|
|
406
406
|
}
|
|
407
|
-
`,variables:{email:t.email}},r)).body.data)==null?void 0:a.users)==null?void 0:o.nodes)==null?void 0:i[0];if(!s)throw new Error("User not found.");return{data:
|
|
407
|
+
`,variables:{email:t.email}},r)).body.data)==null?void 0:a.users)==null?void 0:o.nodes)==null?void 0:i[0];if(!s)throw new Error("User not found.");return{data:k(s)}}async getAccountForUsername(t,r={}){var a;let s=(a=(await v(this.config,{query:`
|
|
408
408
|
query getAccountForUsername($username: String!) {
|
|
409
409
|
user(username: $username) {
|
|
410
|
-
${
|
|
410
|
+
${A}
|
|
411
411
|
}
|
|
412
412
|
}
|
|
413
|
-
`,variables:{username:t.username}},r)).body.data)==null?void 0:a.user;if(!s)throw new Error("User not found.");return{data:
|
|
413
|
+
`,variables:{username:t.username}},r)).body.data)==null?void 0:a.user;if(!s)throw new Error("User not found.");return{data:k(s)}}async getRepo(t,r={}){var a;let n=_(t),s=await v(this.config,{query:`
|
|
414
414
|
query getRepo($fullPath: ID!) {
|
|
415
415
|
project(fullPath: $fullPath) {
|
|
416
416
|
${Ie}
|
|
417
417
|
}
|
|
418
418
|
}
|
|
419
|
-
`,variables:{fullPath:n}},r);if(!((a=s.body.data)!=null&&a.project))throw new Error(`Repository ${n} not found`);return{data:
|
|
419
|
+
`,variables:{fullPath:n}},r);if(!((a=s.body.data)!=null&&a.project))throw new Error(`Repository ${n} not found`);return{data:ve(s.body.data.project)}}async getRepos(t,r={}){let n=t.map(_),s=n.map((o,i)=>`
|
|
420
420
|
getRepo_${i}: project(fullPath: "${o}") {
|
|
421
421
|
${Ie}
|
|
422
422
|
}
|
|
423
423
|
`).join(`
|
|
424
|
-
`),a=await
|
|
424
|
+
`),a=await v(this.config,{query:`
|
|
425
425
|
query batchGetRepos {
|
|
426
426
|
${s}
|
|
427
427
|
}
|
|
428
|
-
`},r);if(!a.body.data)throw new Error(a.statusText||"Unknown error");return{data:n.map((o,i)=>{let u=a.body.data[`getRepo_${i}`];if(!u)throw new Error(`Repository ${o} not found`);return
|
|
428
|
+
`},r);if(!a.body.data)throw new Error(a.statusText||"Unknown error");return{data:n.map((o,i)=>{let u=a.body.data[`getRepo_${i}`];if(!u)throw new Error(`Repository ${o} not found`);return ve(u)})}}async getRefs(t,r,n={}){var u;let s=_(r.repo),a=new URL(`${re(this.config,n)}/projects/${encodeURIComponent(s)}/repository/${t}`);a.searchParams.set("page",((u=r.page)==null?void 0:u.toString())||"1"),a.searchParams.set("per_page",D.toString());let o=await this.config.request({url:a.toString(),headers:y(n.token||this.config.token)}),i=o.headers["x-next-page"];return{pageInfo:{hasNextPage:!!i,nextPage:i?parseInt(i,10):null},data:o.body.map(l=>({name:l.name,commit:{oid:l.commit.id,authoredDate:new Date(l.commit.authored_date),committedDate:new Date(l.commit.committed_date)}}))}}async getBranches(t,r={}){return this.getRefs("branches",t,r)}async getTags(t,r={}){return this.getRefs("tags",t,r)}async getBlame(t,r={}){let n=_(t.repo),s=new URL(`${re(this.config,r)}/projects/${encodeURIComponent(n)}/repository/files/${encodeURIComponent(t.path)}/blame`);s.searchParams.set("ref",t.ref);let a=await this.config.request({url:s.toString(),headers:y(r.token||this.config.token)}),o=0;return{data:{ranges:a.body.map(i=>{let u=o+1;return o+=i.lines.length,{startingLine:u,endingLine:o,commit:{oid:i.commit.id,parentOids:i.commit.parent_ids,authoredDate:new Date(i.commit.authored_date),author:{name:i.commit.author_name,email:i.commit.author_email,avatarUrl:null},committedDate:new Date(i.commit.committed_date),committer:{name:i.commit.committer_name,email:i.commit.committer_email,avatarUrl:null},message:i.commit.message,fileCount:null,additions:null,deletions:null}}})}}}getVariablesForPullRequests(t){let{updatedBefore:r,isDraft:n,authorLogin:s,assigneeLogins:a,reviewRequestedLogin:o}=t||{},i={},u=[],l=[],p=(m,c,d)=>{u.push(`$${m}: ${d}`),l.push(`${m}: $${m}`),i[m]=c};return r&&p("updatedBefore",r,"Time"),s&&p("authorUsername",s,"String"),a&&p("assigneeUsername",a[0],"String"),n!=null&&p("draft",n,"Boolean"),o&&p("reviewerUsername",o,"String"),{variables:i,variableTypes:u,mergeRequestArguments:l}}async getPullRequestsForRepo(t,r={}){var b,f,h;let{cursor:n,repo:s}=t||{},a=_(s),{variables:o,variableTypes:i,mergeRequestArguments:u}=this.getVariablesForPullRequests(t),l={fullPath:a,...o},p=await v(this.config,{query:`
|
|
429
429
|
query getPullRequestsForRepo(
|
|
430
430
|
$fullPath: ID!
|
|
431
431
|
$after: String
|
|
@@ -453,7 +453,7 @@ query getPullRequestsForRepo(
|
|
|
453
453
|
}
|
|
454
454
|
}
|
|
455
455
|
}
|
|
456
|
-
`,variables:{...l,after:n}},r),m=[],c=(b=p.body.data)==null?void 0:b.project,d={name:(c==null?void 0:c.name)||"",owner:((c==null?void 0:c.fullPath)||"").split("/").slice(0,-1).join("/")};return(((f=c==null?void 0:c.mergeRequests)==null?void 0:f.nodes)||[]).forEach(R=>{m.push(
|
|
456
|
+
`,variables:{...l,after:n}},r),m=[],c=(b=p.body.data)==null?void 0:b.project,d={name:(c==null?void 0:c.name)||"",owner:((c==null?void 0:c.fullPath)||"").split("/").slice(0,-1).join("/")};return(((f=c==null?void 0:c.mergeRequests)==null?void 0:f.nodes)||[]).forEach(R=>{m.push(Ce(R,d))}),{pageInfo:(h=c==null?void 0:c.mergeRequests)==null?void 0:h.pageInfo,data:m}}async getPullRequestsForRepos(t,r={}){var c,d,g,b,f;let{cursor:n}=t||{},s=t.repoIds.map(h=>h.toString().startsWith(F)?h:`${F}${h}`),{variables:a,variableTypes:o,mergeRequestArguments:i}=this.getVariablesForPullRequests(t),u={projectIds:s,...a},l=await v(this.config,{query:`
|
|
457
457
|
query getPullRequests(
|
|
458
458
|
$projectIds: [ID!]
|
|
459
459
|
$after: String
|
|
@@ -483,7 +483,7 @@ query getPullRequests(
|
|
|
483
483
|
}
|
|
484
484
|
}
|
|
485
485
|
}
|
|
486
|
-
`,variables:{...u,after:n}},r),p=[];return(((d=(c=l.body.data)==null?void 0:c.projects)==null?void 0:d.nodes)||[]).forEach(h=>{var E;let R={name:h.name,owner:h.fullPath.split("/").slice(0,-1).join("/")};(((E=h.mergeRequests)==null?void 0:E.nodes)||[]).forEach(
|
|
486
|
+
`,variables:{...u,after:n}},r),p=[];return(((d=(c=l.body.data)==null?void 0:c.projects)==null?void 0:d.nodes)||[]).forEach(h=>{var E;let R={name:h.name,owner:h.fullPath.split("/").slice(0,-1).join("/")};(((E=h.mergeRequests)==null?void 0:E.nodes)||[]).forEach(S=>{p.push(Ce(S,R))})}),{pageInfo:(f=(b=(g=l.body)==null?void 0:g.data)==null?void 0:b.projects)==null?void 0:f.pageInfo,data:p}}async getIssue(t,r={}){var a,o,i,u,l,p,m;let n=nt(t),s=await v(this.config,{query:`
|
|
487
487
|
query GetSingleIssue($projectId: ID!, $issueId: String!) {
|
|
488
488
|
project(fullPath: $projectId) {
|
|
489
489
|
name
|
|
@@ -520,7 +520,7 @@ query GetSingleIssue($projectId: ID!, $issueId: String!) {
|
|
|
520
520
|
}
|
|
521
521
|
}
|
|
522
522
|
}
|
|
523
|
-
}`,m=await
|
|
523
|
+
}`,m=await v(this.config,{query:p,variables:{...l,after:n}},r),c=[],d=(f=m.body.data)==null?void 0:f.project,g={name:(d==null?void 0:d.name)||"",owner:((d==null?void 0:d.fullPath)||"").split("/").slice(0,-1).join("/")};return(((h=d==null?void 0:d.issues)==null?void 0:h.nodes)||[]).forEach(I=>{c.push(se(I,g))}),{pageInfo:(R=d==null?void 0:d.issues)==null?void 0:R.pageInfo,data:c.sort((I,E)=>(I.updatedDate||I.createdDate).getTime()-(E.updatedDate||E.createdDate).getTime())}}async getIssuesForRepos(t,r={}){var d,g,b,f,h;let{cursor:n}=t||{},s=t.repoIds.map(R=>R.toString().startsWith(F)?R:`${F}${R}`),{variables:a,variableTypes:o,mergeRequestArguments:i}=this.getVariablesForPullRequests(t),u={projectIds:s,...a},l=`
|
|
524
524
|
query GetIssuesFromProject(
|
|
525
525
|
$projectIds: [ID!]
|
|
526
526
|
$after: String
|
|
@@ -549,4 +549,4 @@ query GetSingleIssue($projectId: ID!, $issueId: String!) {
|
|
|
549
549
|
}
|
|
550
550
|
}
|
|
551
551
|
}
|
|
552
|
-
}`,p=await
|
|
552
|
+
}`,p=await v(this.config,{query:l,variables:{...u,after:n}},r),m=[];return(((g=(d=p.body.data)==null?void 0:d.projects)==null?void 0:g.nodes)||[]).forEach(R=>{var S;let I={name:R.name,owner:R.fullPath.split("/").slice(0,-1).join("/")};(((S=R.issues)==null?void 0:S.nodes)||[]).forEach(we=>m.push(se(we,I)))}),{pageInfo:(h=(f=(b=p.body)==null?void 0:b.data)==null?void 0:f.projects)==null?void 0:h.pageInfo,data:m.sort((R,I)=>(R.updatedDate||R.createdDate).getTime()-(I.updatedDate||I.createdDate).getTime())}}};var ot="https://api.atlassian.com/ex/jira",at=100,it=e=>{var r;let t=e.fields.assignee;return{id:e.id,commentCount:e.fields.comment.comments.length,number:e.key,title:e.fields.summary,url:e.self,createdDate:new Date(e.fields.created),author:{id:e.fields.creator.accountId,name:e.fields.creator.displayName,email:e.fields.creator.emailAddress,avatarUrl:e.fields.creator.avatarUrls["32x32"],username:e.fields.creator.displayName},updatedDate:new Date(e.fields.updated),assignees:t?[{id:t.accountId,name:t.displayName,email:t.emailAddress,avatarUrl:t.avatarUrls["32x32"],username:t.displayName}]:[],description:null,repository:null,state:null,upvoteCount:((r=e.fields.votes)==null?void 0:r.votes)||0}},H=class extends C{async getIssuesForProject(t,r={}){let{assigneeLogins:n,authorLogin:s,mentionLogin:a,project:o}=t||{},i=[`project = "${o}"`];return s&&i.push(`creator in (${s})`),n&&i.push(`assignee in (${n.join(", ")})`),a&&i.push(`comment ~ ${a}`),{data:(await this.config.request({url:`${r.baseUrl||ot}/${t.resourceId}/rest/api/2/search?jql=${i.join(" AND ")}&startAt=0&maxResults=${at}&fields=${["assignee","comment","summary","created","creator","updated","votes"].join(",")}`,headers:y(r.token||this.config.token)})).body.issues.map(it)}}};var ut="https://api.trello.com",lt=1e3,pt=e=>{let t=new Date(1e3*parseInt(e.id.substring(0,8),16));return{id:e.id,commentCount:e.badges.comments,number:e.idShort.toString(),title:e.name,url:e.url,createdDate:new Date(t.toISOString()),author:null,updatedDate:new Date(e.dateLastActivity),assignees:e.idMembers.map(r=>({id:r,username:null,name:null,email:null,avatarUrl:null})),description:null,state:null,repository:null,upvoteCount:e.badges.votes}},W=class extends C{async getIssuesForBoard(t,r={}){let n=["-is:archived","sort:edited"],{appKey:s,boardId:a,filterText:o,assigneeLogins:i}=t||{};i&&n.push("@me");let u=`${o?`${o}`:""}${n.join(" ")} board:${a}`;return{data:(await this.config.request({url:`${r.baseUrl||ut}/1/search?key=${s}&query=${u}&cards_limit=${lt}&token=${r.token||this.config.token}`,headers:y(r.token||this.config.token)})).body.cards.map(pt)}}};var dt=e=>{let t={request:e==null?void 0:e.request};return{azureDevOps:new O({...t,...e==null?void 0:e.azureDevOps}),bitbucket:new B({...t,...e==null?void 0:e.bitbucket}),bitbucketServer:new j({...t,...e==null?void 0:e.bitbucketServer}),github:new N({...t,...e==null?void 0:e.github}),gitlab:new Q({...t,...e==null?void 0:e.gitlab}),jira:new H({...t,...e==null?void 0:e.jira}),trello:new W({...t,...e==null?void 0:e.trello})}},mt=dt;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CursorPageInput, EnterpriseOptions, GetRepoInput, GitProvider, GitPullRequest, GitRepository, NumberedPageInput, Options } from '../gitProvider';
|
|
2
2
|
import { Issue } from '../issueProvider';
|
|
3
|
+
import { Provider } from '../provider';
|
|
3
4
|
export interface AzureGetRepoInput extends GetRepoInput {
|
|
4
5
|
project: string;
|
|
5
6
|
}
|
|
@@ -7,7 +8,7 @@ export interface AzureGetReposInput {
|
|
|
7
8
|
namespace: string;
|
|
8
9
|
project: string;
|
|
9
10
|
}
|
|
10
|
-
export declare class AzureDevOps extends GitProvider {
|
|
11
|
+
export declare class AzureDevOps extends Provider implements GitProvider {
|
|
11
12
|
/** Note: PATs are not supported for this function, only OAuth tokens are. */
|
|
12
13
|
getCurrentUser(options?: EnterpriseOptions): Promise<{
|
|
13
14
|
data: {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { Account, CursorPageInput,
|
|
1
|
+
import { Account, CursorPageInput, GetRepoInput, GitProvider, GitPullRequest, NumberedPageInput, Options } from '../gitProvider';
|
|
2
|
+
import { Provider } from '../provider';
|
|
2
3
|
export interface RefreshTokenResponse {
|
|
3
4
|
access_token: string;
|
|
4
5
|
scopes: string;
|
|
@@ -7,7 +8,7 @@ export interface RefreshTokenResponse {
|
|
|
7
8
|
state: string;
|
|
8
9
|
refresh_token: string;
|
|
9
10
|
}
|
|
10
|
-
export declare class Bitbucket extends GitProvider {
|
|
11
|
+
export declare class Bitbucket extends Provider implements GitProvider {
|
|
11
12
|
refreshToken(data: {
|
|
12
13
|
refreshToken: string;
|
|
13
14
|
base64ClientIDColonClientSecret: string;
|
|
@@ -91,7 +92,7 @@ export declare class Bitbucket extends GitProvider {
|
|
|
91
92
|
getPullRequestsForRepo(input: {
|
|
92
93
|
repo: GetRepoInput;
|
|
93
94
|
authorLogin?: string;
|
|
94
|
-
} & NumberedPageInput, options?:
|
|
95
|
+
} & NumberedPageInput, options?: Options): Promise<{
|
|
95
96
|
pageInfo: {
|
|
96
97
|
hasNextPage: boolean;
|
|
97
98
|
nextPage: number | null;
|
|
@@ -101,7 +102,7 @@ export declare class Bitbucket extends GitProvider {
|
|
|
101
102
|
getPullRequestsForRepos(input: {
|
|
102
103
|
repos: GetRepoInput[];
|
|
103
104
|
authorLogin?: string;
|
|
104
|
-
}, options?:
|
|
105
|
+
}, options?: Options): Promise<{
|
|
105
106
|
data: GitPullRequest[];
|
|
106
107
|
}>;
|
|
107
108
|
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { EnterpriseOptions, GetRepoInput, GitProvider } from '../gitProvider';
|
|
2
|
+
import { EnterpriseProvider } from '../provider';
|
|
3
|
+
export declare class BitbucketServer extends EnterpriseProvider implements GitProvider {
|
|
4
|
+
private getBaseUrl;
|
|
5
|
+
private getRequestHeaders;
|
|
6
|
+
getRepo(input: GetRepoInput, options?: EnterpriseOptions): Promise<{
|
|
7
|
+
data: {
|
|
8
|
+
id: string;
|
|
9
|
+
namespace: string;
|
|
10
|
+
name: string;
|
|
11
|
+
webUrl: string;
|
|
12
|
+
httpsUrl: string | null;
|
|
13
|
+
sshUrl: string | null;
|
|
14
|
+
defaultBranch: null;
|
|
15
|
+
permission: null;
|
|
16
|
+
};
|
|
17
|
+
}>;
|
|
18
|
+
getRepos(inputs: GetRepoInput[], options?: EnterpriseOptions): Promise<{
|
|
19
|
+
data: {
|
|
20
|
+
id: string;
|
|
21
|
+
namespace: string;
|
|
22
|
+
name: string;
|
|
23
|
+
webUrl: string;
|
|
24
|
+
httpsUrl: string | null;
|
|
25
|
+
sshUrl: string | null;
|
|
26
|
+
defaultBranch: null;
|
|
27
|
+
permission: null;
|
|
28
|
+
}[];
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Provider } from './provider';
|
|
1
|
+
import { PagedResult, Result } from '../types';
|
|
3
2
|
export interface Options {
|
|
4
3
|
token?: string;
|
|
5
4
|
isPAT?: boolean;
|
|
@@ -140,9 +139,9 @@ export interface NumberedPageInput {
|
|
|
140
139
|
page?: number | null;
|
|
141
140
|
}
|
|
142
141
|
export type PageInput = CursorPageInput | NumberedPageInput;
|
|
143
|
-
export
|
|
144
|
-
|
|
145
|
-
|
|
142
|
+
export interface GitProvider {
|
|
143
|
+
getCurrentUser?(options: Options): Promise<Result<Account>>;
|
|
144
|
+
getUserForCommit?(input: {
|
|
146
145
|
repo: GetRepoInput;
|
|
147
146
|
oid: string;
|
|
148
147
|
}, options: Options): Promise<Result<User>>;
|
|
@@ -152,12 +151,12 @@ export declare abstract class GitProvider<Config extends ProviderConfigInit = Pr
|
|
|
152
151
|
getAccountForUsername?(input: {
|
|
153
152
|
username: string;
|
|
154
153
|
}, options: Options): Promise<Result<Account>>;
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
154
|
+
getRepo(input: GetRepoInput, options: Options): Promise<Result<GitRepository>>;
|
|
155
|
+
getRepos(inputs: GetRepoInput[], options: Options): Promise<Result<GitRepository[]>>;
|
|
156
|
+
getBranches?(input: {
|
|
158
157
|
repo: GetRepoInput;
|
|
159
158
|
} & PageInput, options: Options): Promise<PagedResult<GitRefWithCommit>>;
|
|
160
|
-
|
|
159
|
+
getTags?(input: {
|
|
161
160
|
repo: GetRepoInput;
|
|
162
161
|
} & PageInput, options: Options): Promise<PagedResult<GitRefWithCommit>>;
|
|
163
162
|
getBlame?(input: {
|
|
@@ -165,8 +164,6 @@ export declare abstract class GitProvider<Config extends ProviderConfigInit = Pr
|
|
|
165
164
|
ref: string;
|
|
166
165
|
path: string;
|
|
167
166
|
}, options: Options): Promise<Result<GitBlame>>;
|
|
168
|
-
|
|
169
|
-
}
|
|
170
|
-
export declare abstract class EnterpriseGitProvider extends GitProvider<EnterpriseProviderConfigInit> {
|
|
167
|
+
getPullRequestsForRepos?(input: GetPRsForReposInput, options: Options): Promise<Result<GitPullRequest[]>>;
|
|
171
168
|
}
|
|
172
169
|
export declare const MAX_PAGE_SIZE = 100;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Account, CursorPageInput,
|
|
1
|
+
import { Account, CursorPageInput, EnterpriseOptions, GetRepoInput, GitProvider, GitPullRequest, GitRepository } from '../gitProvider';
|
|
2
2
|
import { Issue } from '../issueProvider';
|
|
3
|
+
import { EnterpriseProvider } from '../provider';
|
|
3
4
|
import { FetchIssuesData, FetchPullRequestsData } from './githubTypes';
|
|
4
|
-
export declare class GitHub extends
|
|
5
|
+
export declare class GitHub extends EnterpriseProvider implements GitProvider {
|
|
5
6
|
private _scopesCache;
|
|
6
7
|
private getScopes;
|
|
7
8
|
private getEnterpriseAvatarUrlIfNeeded;
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { Account, CursorPageInput,
|
|
1
|
+
import { Account, CursorPageInput, EnterpriseOptions, GetRepoInput, GitProvider, GitPullRequest, GitRepository, NumberedPageInput } from '../gitProvider';
|
|
2
2
|
import { GetIssueInput, Issue, IssueProvider } from '../issueProvider';
|
|
3
|
+
import { EnterpriseProvider } from '../provider';
|
|
3
4
|
export type PullRequestState = 'opened' | 'merged' | 'closed';
|
|
4
|
-
export declare class GitLab extends
|
|
5
|
+
export declare class GitLab extends EnterpriseProvider implements GitProvider, IssueProvider {
|
|
5
6
|
getCurrentUser(options?: EnterpriseOptions): Promise<{
|
|
6
7
|
data: Account;
|
|
7
8
|
}>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { Result } from '../types';
|
|
2
2
|
import { Account, GetReposInput, Options } from './gitProvider';
|
|
3
|
-
import { Provider } from './provider';
|
|
4
3
|
export interface GetIssueInput {
|
|
5
4
|
id: string;
|
|
6
5
|
name: string;
|
|
@@ -31,7 +30,7 @@ export interface Issue {
|
|
|
31
30
|
upvoteCount: number | null;
|
|
32
31
|
url: string;
|
|
33
32
|
}
|
|
34
|
-
export
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
export interface IssueProvider {
|
|
34
|
+
getIssue(input: GetIssueInput, options: Options): Promise<Result<Issue>>;
|
|
35
|
+
getIssuesForRepos(input: GetIssuesForReposInput, options: Options): Promise<Result<Issue[]>>;
|
|
37
36
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import { ProviderConfig, ProviderConfigInit } from '../types';
|
|
1
|
+
import { EnterpriseProviderConfigInit, ProviderConfig, ProviderConfigInit } from '../types';
|
|
2
2
|
export declare class Provider<Config extends ProviderConfigInit = ProviderConfigInit> {
|
|
3
3
|
protected config: ProviderConfig;
|
|
4
4
|
constructor(config?: Config);
|
|
5
5
|
updateConfig(config: Config): void;
|
|
6
6
|
}
|
|
7
|
+
export declare class EnterpriseProvider extends Provider<EnterpriseProviderConfigInit> {
|
|
8
|
+
}
|
package/dist/types.d.ts
CHANGED
|
@@ -4,8 +4,9 @@ export declare const isFetch: (fetch: Fetch | RequestFunction) => fetch is typeo
|
|
|
4
4
|
export type RequestFunction = <T>(options: RequestOptions) => Promise<Response<T>>;
|
|
5
5
|
export interface Config extends SharedConfig {
|
|
6
6
|
github?: ProviderBaseConfig & EnterpriseConfig;
|
|
7
|
-
gitlab?: ProviderBaseConfig;
|
|
7
|
+
gitlab?: ProviderBaseConfig & EnterpriseConfig;
|
|
8
8
|
bitbucket?: ProviderBaseConfig;
|
|
9
|
+
bitbucketServer?: ProviderBaseConfig & EnterpriseConfig;
|
|
9
10
|
azureDevOps?: ProviderBaseConfig;
|
|
10
11
|
jira?: ProviderBaseConfig;
|
|
11
12
|
trello?: ProviderBaseConfig;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gitkraken/provider-apis",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1",
|
|
4
4
|
"description": "An SDK around different third-party APIs that accepts and returns data in a common format.",
|
|
5
5
|
"author": "Axosoft, LLC dba GitKraken",
|
|
6
6
|
"license": "SEE LICENSE IN LICENSE",
|