@gitkraken/provider-apis 0.32.0 → 0.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +10 -0
- package/dist/index.js +190 -134
- package/dist/index.provider-utils.js +1 -1
- package/dist/index.providers.js +233 -177
- package/dist/providers/gitProvider.d.ts +6 -1
- package/dist/providers/github/github.d.ts +8 -1
- package/dist/types/exportedTypes/gitProvider.d.ts +12 -0
- package/dist/types/internalTypes/github.d.ts +4 -0
- package/package.json +2 -2
package/dist/index.providers.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var _e=Object.defineProperty;var cr=Object.getOwnPropertyDescriptor;var gr=Object.getOwnPropertyNames;var mr=Object.prototype.hasOwnProperty;var hr=(r,s)=>{for(var e in s)_e(r,e,{get:s[e],enumerable:!0})},fr=(r,s,e,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let n of gr(s))!mr.call(r,n)&&n!==e&&_e(r,n,{get:()=>s[n],enumerable:!(t=cr(s,n))||t.enumerable});return r};var Rr=r=>fr(_e({},"__esModule",{value:!0}),r);var js={};hr(js,{AzureDevOps:()=>H,Bitbucket:()=>J,BitbucketServer:()=>V,EntityIdentifierProviderType:()=>lr,EntityType:()=>ur,EntityVersion:()=>ir,GitBuildStatusStage:()=>Pt,GitBuildStatusState:()=>ue,GitDiffLineType:()=>Fe,GitHub:()=>X,GitHubIssueCloseReason:()=>pr,GitIssueState:()=>me,GitLab:()=>Y,GitMergeStrategy:()=>W,GitPullRequestMergeableState:()=>M,GitPullRequestReviewState:()=>F,GitPullRequestState:()=>z,GraphQLErrors:()=>f,Jira:()=>ee,JiraServer:()=>te,PullRequestAsyncStatus:()=>ar,Trello:()=>re,default:()=>Qs,isFetch:()=>le});module.exports=Rr(js);var Pt=(n=>(n.Build="build",n.Production="production",n.Staging="staging",n.Test="test",n))(Pt||{}),ue=(p=>(p.ActionRequired="ACTION_REQUIRED",p.Cancelled="CANCELLED",p.Error="ERROR",p.Failed="FAILED",p.Pending="PENDING",p.Running="RUNNING",p.Skipped="SKIPPED",p.Success="SUCCESS",p.Warning="WARNING",p.OptionalActionRequired="OPTIONAL_ACTION_REQUIRED",p))(ue||{}),W=(o=>(o.MergeCommit="MERGE_COMMIT",o.Rebase="REBASE",o.RebaseThenMergeCommit="REBASE_THEN_MERGE_COMMIT",o.FastForward="FAST_FORWARD",o.Squash="SQUASH",o))(W||{}),z=(t=>(t.Open="OPEN",t.Closed="CLOSED",t.Merged="MERGED",t))(z||{}),F=(n=>(n.Approved="APPROVED",n.ChangesRequested="CHANGES_REQUESTED",n.Commented="COMMENTED",n.ReviewRequested="REVIEW_REQUESTED",n))(F||{}),M=(u=>(u.Behind="BEHIND",u.Blocked="BLOCKED",u.Conflicts="CONFLICTS",u.FailingChecks="FAILING_CHECKS",u.Mergeable="MERGEABLE",u.Unknown="UNKNOWN",u.UnknownAndBlocked="UNKNOWN_AND_BLOCKED",u.Unstable="UNSTABLE",u))(M||{}),Fe=(t=>(t.ADDED="ADDED",t.DELETED="DELETED",t.UNMODIFIED="UNMODIFIED",t))(Fe||{});var wt={APPROVED:0,COMMENTED:1,REVIEW_REQUESTED:2,CHANGES_REQUESTED:3},G=r=>!r||r.length===0?null:r.reduce((s,e)=>wt[e.state]>wt[s]?e.state:s,"APPROVED");var S=100;var St=globalThis.fetch;var Ir=async r=>{let s=r.headers.get("content-type")||"",e=null;if(s.startsWith("application/json")){let o=await r.text();e=o.trim().length>0?JSON.parse(o):null}else if(s.startsWith("text/")||s==="")e=await r.text();else if(s.startsWith("application/vnd.github.raw+json"))e=await r.arrayBuffer();else throw new Error(`Unsupported content-type: ${s}`);let t={};r.headers.forEach((o,a)=>{t[a]=o});let n={body:e,headers:t,status:r.status,statusText:r.statusText};if(!r.ok){let o=new Error(r.statusText);throw Object.assign(o,{response:n}),o}return n},Qe=r=>async({url:s,...e})=>{let t=await r(s,e);return Ir(t)};var le=(r,s=!1)=>r.name==="fetch"||s;var U=class{constructor(s){let e=s?.request||St;this.config={...s,request:le(e,s?.forceIsFetch)?Qe(e):e}}updateConfig(s){this.config={...this.config,...s,request:s.request&&le(s.request,s?.forceIsFetch??this.config.forceIsFetch)?Qe(s.request):this.config.request}}},L=class extends U{};var h=(r,s)=>{let e={};return r&&(e.Authorization=`${s?"Basic":"Bearer"} ${r}`),e},vt=r=>r?r.reduce((s,e)=>(s[e]=!0,s),{}):void 0,Q=(r,s,e)=>!r||s.some(t=>r[t])?e:"",qt=async r=>{let s=[],e=!0,t;for(;e;){let n=await r(t);s=s.concat(n.data),e=!!n?.pageInfo?.hasNextPage,t=n?.pageInfo?.endCursor||n?.pageInfo?.nextPage}return s};async function je(r){return(await Promise.allSettled(r)).map(e=>br(e)).filter(e=>e!=null)}function br(r,s=void 0){return r?.status==="fulfilled"?r.value:s}var yr="https://app.vssps.visualstudio.com/_apis",Pr="https://vssps.dev.azure.com/",wr="https://dev.azure.com",P=(r,s={})=>h(s.token||r.token,s.isPAT||r.isPAT),Et=r=>r.url.replace("/_apis/git/repositories/","/_git/").replace(`/${r.repository.project.id}/`,`/${encodeURIComponent(r.repository.project.name)}/`).replace(`/${r.repository.id}/`,`/${encodeURIComponent(r.repository.name)}/`).replace("/pullRequests/","/pullrequest/"),Be=(r,s)=>{let e=s.baseUrl||r.baseUrl||yr;return e=e.replace(/\/$/,""),e},w=(r,s)=>{let e=s.baseUrl||r.baseUrl||wr;return e=e.replace(/\/$/,""),e},ze=(r,s)=>{let e=s.baseUrl||r.baseUrl||Pr;return e=e.replace(/\/$/,""),e};var Sr={active:"OPEN",completed:"MERGED",abandoned:"CLOSED"},vr={10:"APPROVED",5:"APPROVED",0:"REVIEW_REQUESTED",[-5]:"CHANGES_REQUESTED",[-10]:"CHANGES_REQUESTED"},Me=r=>({id:r.id,name:r.displayName??null,username:(r.uniqueName||r.displayName)??null,email:null,avatarUrl:r.imageUrl??null,url:null}),de=r=>r.startsWith("refs/heads/")?r.replace("refs/heads/",""):r,qr=r=>{switch(r){case"conflicts":return"CONFLICTS";case"failure":return"FAILING_CHECKS";case"rejectedByPolicy":return"BLOCKED";case"succeeded":return"MERGEABLE";case"notSet":case"queued":default:return"UNKNOWN"}},pe=(r,s)=>{let e=[],t=[];return s.reviewers.forEach(n=>{let o={reviewer:Me(n),state:vr[n.vote??0]||"REVIEW_REQUESTED"};n.isRequired&&e.push(o),t.push(o)}),{id:s.pullRequestId.toString(),title:s.title,description:s.description??null,number:s.codeReviewId,state:Sr[s.status],isDraft:s.isDraft,commentCount:null,upvoteCount:null,author:Me(s.createdBy),createdDate:new Date(s.creationDate),updatedDate:new Date(s.closedDate||s.creationDate),closedDate:s.closedDate?new Date(s.closedDate):null,mergedDate:s.closedDate&&s.status==="completed"?new Date(s.closedDate):null,repository:{id:s.repository.id,name:s.repository.name,project:s.repository.project.name,owner:{login:r},remoteInfo:null},headCommit:{buildStatuses:null},baseRef:{name:de(s.targetRefName),oid:s.lastMergeTargetCommit.commitId},headRef:{name:de(s.sourceRefName),oid:s.lastMergeSourceCommit.commitId},url:Et(s),assignees:s.reviewers.map(Me),reviews:t,reviewDecision:G(e),additions:null,deletions:null,fileCount:null,commitCount:null,headRepository:s.forkSource?{id:s.forkSource.repository.id,name:s.forkSource.repository.name,project:void 0,owner:{login:r},remoteInfo:null}:{id:s.repository.id,name:s.repository.name,project:s.repository.project.name,owner:{login:r},remoteInfo:null},mergeableState:qr(s.mergeStatus),labels:s.labels?.map(n=>({color:null,description:null,id:n.id,name:n.name}))??[],permissions:null}},Ct=(r,s)=>({id:s.id,name:s.name,namespace:r,project:s.project.name,projectId:s.project.id,webUrl:s.webUrl,httpsUrl:s.remoteUrl,sshUrl:s.sshUrl,defaultBranch:s.defaultBranch?{name:de(s.defaultBranch)}:null,permissions:null}),Er=(r,s,e,t)=>{let n=e.fields,o=n["System.AssignedTo"],a=n["System.State"],i=n["System.WorkItemType"],u;return a&&i&&(u=t[i]?.[a]),{id:e.id.toString(),number:e.id.toString(),title:n["System.Title"],commentCount:n["System.CommentCount"],author:{avatarUrl:n["System.CreatedBy"]._links?.avatar?.href??null,email:null,id:n["System.CreatedBy"].id,name:n["System.CreatedBy"].uniqueName??null,username:n["System.CreatedBy"].displayName??null,url:null},closedDate:n["Microsoft.VSTS.Common.ClosedDate"]?new Date(n["Microsoft.VSTS.Common.ClosedDate"]):null,createdDate:new Date(n["System.CreatedDate"]),updatedDate:new Date(n["System.ChangedDate"]),url:e._links.html.href,assignees:o?[{avatarUrl:o._links?.avatar?.href??null,email:null,id:o.id,name:o.uniqueName??null,username:o.displayName??null,url:null}]:[],description:n["System.Description"]??null,state:{name:u?.title||a,color:null},type:n["System.WorkItemType"],repository:null,project:{namespace:r,name:s,resourceId:null,key:null,id:null},upvoteCount:0,labels:e.fields["System.Tags"]?.split(";").map(l=>({color:null,description:null,id:null,name:l.trim()}))??[]}},H=class extends L{async getCurrentUser(s={},e={}){if(e.isPAT||this.config.isPAT)throw new Error("Azure DevOps does not support PATs for this function.");let t=`${Be(this.config,e)}/profile/profiles/me`,n=await this.config.request({url:t,headers:P(this.config,e)});return{data:{id:n.body.id,name:n.body.displayName,username:n.body.displayName,email:n.body.emailAddress,avatarUrl:null,url:null}}}async getCurrentUserForInstance(s,e={}){let n=(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/_apis/ConnectionData`,headers:P(this.config,e)})).body.authorizedUser;if(n.providerDisplayName==="Anonymous")throw new Error("Current user not found.");return{data:{id:n.id,name:n.providerDisplayName,username:n.providerDisplayName,email:n.properties.Account.$value,avatarUrl:null,url:null}}}async getUserForCommit(s,e={}){if(!s.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let n=(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.repo.namespace)}/${encodeURIComponent(s.repo.project)}/_apis/git/repositories/${encodeURIComponent(s.repo.name)}/commits/${s.oid}`,headers:P(this.config,e)})).body.author;return{data:{name:n.name,email:n.email,avatarUrl:n.imageUrl}}}async getOrgsForUser(s,e={}){let t=`${Be(this.config,e)}/accounts?memberId=${s.userId}&api-version=6.0`;return{data:(await this.config.request({url:t,headers:P(this.config,e)})).body.value.map(o=>({id:o.accountId,name:o.accountName}))}}async getCollectionsForUser(s,e={}){let t=`${w(this.config,e)}/_apis/projectCollections`;return{data:(await this.config.request({url:t,headers:P(this.config,e)})).body.value.map(o=>({id:o.id,name:o.name}))}}async getAzureProjects(s,e={}){let t=new URL(`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/_apis/projects`);t.searchParams.set("$top",S.toString()),s.cursor&&t.searchParams.set("$skip",s.cursor);let n=await this.config.request({url:t.toString(),headers:P(this.config,e)}),o=n.headers["x-ms-continuationtoken"];return{pageInfo:{hasNextPage:!!o,endCursor:o||null},data:n.body.value.map(a=>({id:a.id,name:a.name,namespace:s.namespace}))}}async getAzureProjectScopeDescriptor(s,e={}){let{namespace:t,projectId:n}=s;return{data:{scope:(await this.config.request({url:`${ze(this.config,e)}/${encodeURIComponent(t)}/_apis/graph/descriptors/${n}?api-version=6.0`,headers:P(this.config,e)})).body.value}}}async getAzureGraphAccountsForAzureProject(s,e={}){let{namespace:t,projectScopeDescriptor:n,cursor:o}=s,a=new URL(`${ze(this.config,e)}/${encodeURIComponent(t)}/_apis/graph/users`);n&&a.searchParams.set("scopeDescriptor",n),o&&a.searchParams.set("continuationToken",o);let i=await this.config.request({url:a.toString(),headers:P(this.config,e)}),u=i.headers["x-ms-continuationtoken"];return{pageInfo:{endCursor:u||null,hasNextPage:!!u},data:i.body.value.map(l=>({avatarUrl:l._links?.avatar?.href??null,descriptor:l.descriptor??null,email:l.mailAddress??null,name:l.displayName??null,storageKeyURL:l._links?.storageKey?.href??null,username:l.displayName??null}))}}async getAccountFromAzureGraphAccount(s,e={}){let{azureGraphAccount:t}=s;if(!t.storageKeyURL)throw new Error("Expected 'storageKeyURL' to not be null for 'azureGraphAccount'");let n=await this.config.request({url:t.storageKeyURL,headers:P(this.config,e)});return{data:{avatarUrl:t.avatarUrl,email:t.email,id:n.body.value,name:t.name,username:t.username,url:null}}}async getAccountsFromAzureGraphAccounts(s,e={}){let t=[];for(let n of s.azureGraphAccounts){let o=await this.getAccountFromAzureGraphAccount({azureGraphAccount:n},e);t.push(o.data)}return{data:t}}async getRepo(s,e={}){if(!s.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let t=await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/${encodeURIComponent(s.project)}/_apis/git/repositories/${encodeURIComponent(s.name)}`,headers:P(this.config,e)});return{data:Ct(s.namespace,t.body)}}async getRepos(s,e={}){let t=[],n=[];return await Promise.all(s.map(async o=>{try{let a=await this.getRepo(o,e);t.push(a.data)}catch(a){n.push({input:o,error:a})}})),{data:t,errors:n}}async getReposForAzureProject(s,e={}){if(!s.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');return{data:(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/${encodeURIComponent(s.project)}/_apis/git/repositories`,headers:P(this.config,e)})).body.value.map(n=>Ct(s.namespace,n))}}async getRefs(s,e,t={}){if(!e.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let n=new URL(`${w(this.config,t)}/${encodeURIComponent(e.repo.namespace)}/${encodeURIComponent(e.repo.project)}/_apis/git/repositories/${encodeURIComponent(e.repo.name)}/refs`);n.searchParams.set("filter",s),n.searchParams.set("$top",S.toString()),e.cursor&&n.searchParams.set("continuationToken",e.cursor);let o=await this.config.request({url:n.toString(),headers:P(this.config,t)}),a=o.headers["x-ms-continuationtoken"];return{pageInfo:{hasNextPage:!!a,endCursor:a||null},data:o.body.value.map(i=>({name:de(i.name),commit:{oid:i.objectId,authoredDate:null,committedDate:null}}))}}async getBranches(s,e={}){return this.getRefs("heads",s,e)}async getTags(s,e={}){return this.getRefs("tags",s,e)}async getPullRequestsForRepoBase(s,e={},t=100){let{page:n,repo:o,assigneeLogins:a,authorLogin:i}=s||{},u=n||1;if(!o.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let l="searchCriteria.status=1";return a&&a.length&&(l+=`&searchCriteria.reviewerId=${a[0]}`),i&&(l+=`&searchCriteria.creatorId=${i}`),await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(o.namespace)}/${encodeURIComponent(o.project||"")}/_apis/git/repositories/${encodeURIComponent(o.name)}/pullRequests?${l}&%24top=${t}&%24skip=${(u-1)*t}`,headers:P(this.config,e)})}async getPullRequestsForRepo(s,e={}){let n=s.page||1,o=await this.getPullRequestsForRepoBase(s,e,100);return{pageInfo:{hasNextPage:o.body.value.length===100,nextPage:n+1},data:o.body.value.map(a=>pe(s.repo.namespace,a))}}async getPullRequestsForRepos(s,e={}){if(!s.repos.every(o=>o.project))throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let{repos:t}=s||{},n=[];return await Promise.all(t.map(async o=>{try{(await this.getPullRequestsForRepoBase({repo:o,...s},e)).body.value.forEach(i=>{n.push(pe(o.namespace,i))})}catch(a){if(a.statusCode!==404&&a.statusCode!==401)throw a}})),{data:n}}async getPullRequestsForProjectBase(s,e={},t=100){let{namespace:n,project:o,page:a,assigneeLogins:i,authorLogin:u,repo:l}=s;if(l?.project&&l.project!==o)throw new Error("Could not fetch pull requests, project mismatch");let p=a||1,d=new URL(`${w(this.config,e)}/${encodeURIComponent(n)}/${encodeURIComponent(o)}/_apis/git/pullRequests`);return d.searchParams.set("searchCriteria.status","1"),d.searchParams.set("$top",t.toString()),d.searchParams.set("$skip",((p-1)*t).toString()),l?.id&&l?.project===o&&d.searchParams.set("searchCriteria.repositoryId",l.id),i&&i.length&&d.searchParams.set("searchCriteria.reviewerId",i[0]),u&&d.searchParams.set("searchCriteria.creatorId",u),await this.config.request({url:d.toString(),headers:P(this.config,e)})}async getPullRequestsForProject(s,e={}){let n=s.page||1,o=await this.getPullRequestsForProjectBase(s,e,100);return{pageInfo:{hasNextPage:o?.body.value.length===100,nextPage:n+1},data:o?.body.value.map(a=>pe(s.namespace,a))||[]}}async getPullRequestsForProjects(s,e={}){let{projects:t}=s||{},n=[];return await Promise.all(t.map(async o=>{try{(!s.repo||s.repo.project&&s.repo.project===o.project)&&(await this.getPullRequestsForProjectBase({...o,...s},e))?.body.value.forEach(i=>{n.push(pe(o.namespace,i))})}catch(a){if(a.statusCode!==404&&a.statusCode!==401)throw a}})),{data:n}}async getAzurePullRequestLastMergeStatus(s,e={}){if(!s.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let{repo:{namespace:t,project:n,name:o},pullRequestId:a}=s,i=await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(t)}/${encodeURIComponent(n||"")}/_apis/git/repositories/${o}/pullrequests/${a}?includeCommits=true?api-version=6.0`,headers:{...P(this.config,e)}});if(!i.body.mergeStatus)throw new Error("Could not fetch pull request");return{data:i.body.mergeStatus}}async updatePullRequest(s,e,t){return await this.config.request({method:"PATCH",url:`${w(this.config,t)}/${encodeURIComponent(s.repository.owner.login)}/${encodeURIComponent(s.repository.project)}/_apis/git/repositories/${s.repository.name}/pullrequests/${s.id}?api-version=6.0`,body:e,headers:{...P(this.config,t),"Content-Type":"application/json"}})}async closePullRequest(s,e={}){let{pullRequest:t}=s,n={status:"abandoned"};if(!(await this.updatePullRequest(t,JSON.stringify(n),e)).body.status)throw new Error("Could not close pull request")}async mergePullRequest(s,e={}){let{pullRequest:t,mergeStrategy:n}=s,o;switch(n){case"MERGE_COMMIT":{o="noFastForward";break}case"REBASE":{o="rebase";break}case"REBASE_THEN_MERGE_COMMIT":{o="rebaseMerge";break}case"SQUASH":{o="squash";break}}let a={completionOptions:{mergeStrategy:o},lastMergeSourceCommit:{commitId:t.headRef?.oid},status:"completed"};if(!(await this.updatePullRequest(t,JSON.stringify(a),e)).body.status)throw new Error("Could not merge pull request")}async addPullRequestLabel(s,e={}){let{pullRequest:t,label:n}=s;if(!t.repository.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let o={name:n.name};if(!(await this.config.request({method:"POST",url:`${w(this.config,e)}/${encodeURIComponent(t.repository.owner.login)}/${encodeURIComponent(t.repository.project)}/_apis/git/repositories/${t.repository.name}/pullrequests/${t.id}/labels?api-version=6.0`,body:JSON.stringify(o),headers:{...P(this.config,e),"Content-Type":"application/json"}})).body.id)throw new Error("Could not add pull request label")}async removePullRequestLabel(s,e={}){let{pullRequest:t,label:n}=s;if(!t.repository.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');await this.config.request({method:"DELETE",url:`${w(this.config,e)}/${encodeURIComponent(t.repository.owner.login)}/${encodeURIComponent(t.repository.project)}/_apis/git/repositories/${t.repository.name}/pullrequests/${t.id}/labels/${encodeURIComponent(n.name)}?api-version=6.0`,headers:{...P(this.config,e)}})}async setPullRequestLabels(s,e={}){let{pullRequest:t,labels:n}=s;if(!t.repository.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let o=t.labels;if(!o)throw new Error('Azure DevOps requires "labels" for this function.');for(let a of n)o.find(i=>i.id===a.id)||await this.addPullRequestLabel({pullRequest:t,label:a},e);for(let a of o)n.find(i=>a.id===i.id)||await this.removePullRequestLabel({pullRequest:t,label:a},e)}async setPullRequestAsDraft(s,e={}){let{pullRequest:t,isDraft:n}=s,o={isDraft:n};if(!(await this.updatePullRequest(t,JSON.stringify(o),e)).body.status)throw new Error("Could not set the pull request as draft")}async addPullRequestReviewer(s,e={}){let{pullRequest:t,reviewer:n,isRequired:o}=s,a={id:n.id,isRequired:o};if(!(await this.config.request({method:"PUT",url:`${w(this.config,e)}/${encodeURIComponent(t.repository.owner.login)}/${encodeURIComponent(t.repository.project)}/_apis/git/repositories/${t.repository.name}/pullrequests/${t.id}/reviewers/${n.id}?api-version=6.0`,body:JSON.stringify(a),headers:{...P(this.config,e),"Content-Type":"application/json"}})).body.id)throw new Error("Could not add pull request reviewer")}async removePullRequestReviewer(s,e={}){let{pullRequest:t,reviewer:n}=s;await this.config.request({method:"DELETE",url:`${w(this.config,e)}/${encodeURIComponent(t.repository.owner.login)}/${encodeURIComponent(t.repository.project)}/_apis/git/repositories/${t.repository.name}/pullrequests/${t.id}/reviewers/${n.id}?api-version=6.0`,headers:{...P(this.config,e),Accept:"application/json"}})}async setPullRequestReviewers(s,e={}){let{pullRequest:t,reviewers:n}=s;for(let o of n)t.assignees.find(a=>a.id===o.id)||await this.addPullRequestReviewer({pullRequest:t,reviewer:o,isRequired:!0},e);for(let o of t.assignees)n.find(a=>o.id===a.id)||await this.removePullRequestReviewer({pullRequest:t,reviewer:o},e)}async getIssuesForAzureProject(s,e={}){let{page:t,assigneeLogins:n,authorLogin:o,mentionLogin:a,labelNames:i,statusByWorkItemIdByStatusId:u}=s||{},l=t||1,p=200,d=["[Microsoft.VSTS.Common.ClosedDate] = ''","[System.TeamProject] = @project","[Microsoft.VSTS.Common.ResolvedDate] = ''"];o&&d.push(`[System.CreatedBy] = '${o.replace("'","''")}'`),n&&n[0]&&d.push(`[System.AssignedTo] = '${n[0].replace("'","''")}'`),a&&d.push("[System.Id] IN (@recentMentions)"),i&&i.forEach(I=>d.push(`[System.Tags] Contains '${I}'`));let c=`Select [Microsoft.VSTS.Common.ClosedDate], [Microsoft.VSTS.Common.ResolvedDate] From WorkItems Where ${d.join(" AND ")} order by [System.CreatedDate] desc`,g=await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/${encodeURIComponent(s.project)}/_apis/wit/wiql?api-version=6.0`,body:JSON.stringify({query:c}),method:"POST",headers:{...P(this.config,e),"Content-Type":"application/json"}}),m=g.body.workItems.slice((l-1)*p,p*l).map(I=>I.id);if(m.length==0)return{pageInfo:{hasNextPage:!1,nextPage:null},data:[]};let b=await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/${encodeURIComponent(s.project)}/_apis/wit/workitemsbatch?api-version=6.0`,body:JSON.stringify({ids:m,$expand:"Links"}),method:"POST",headers:{...P(this.config,e),"Content-Type":"application/json"}});return{pageInfo:{hasNextPage:g.body.workItems.length>p*l,nextPage:l+1},data:b.body.value.map(I=>Er(s.namespace,s.project,I,u||{}))}}async getPermissionsForRepos(s,e={}){let{namespace:t,repos:n}=s,o={4:["canPush","canCreateWebhook"],1024:["isAdmin"],2048:["isAdmin"],4096:["isAdmin"],8192:["isAdmin"]},a=p=>{let d="2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87",c=`repoV2/${p.projectId}/${p.id}`;return Object.keys(o).map(g=>({securityNamespaceId:d,token:c,permissions:g}))},i={alwaysAllowAdministrators:!1,evaluations:n.flatMap(a)};return{data:(await this.config.request({method:"POST",url:`${w(this.config,e)}/${encodeURIComponent(t)}/_apis/security/permissionevaluationbatch?api-version=7.0`,body:JSON.stringify(i),headers:{...P(this.config,e),"Content-Type":"application/json"}})).body.evaluations.reduce((p,d)=>{let[,c,g]=d.token.split("/"),m=`${c}/${g}`,b=o[d.permissions];for(let I of b)p[m]===void 0&&(p[m]={canCreateWebhook:!0,canPush:!0,isAdmin:!0}),d.value===!1&&(p[m][I]=!1);return p},{})}}async decorateReposWithPermissions(s,e={}){let{namespace:t,repos:n}=s,o=await this.getPermissionsForRepos({namespace:t,repos:n},e);return{data:n.map(a=>({...a,permissions:o.data[`${a.projectId}/${a.id}`]}))}}async updateIssue(s,e,t={}){return await this.config.request({method:"PATCH",url:`${w(this.config,t)}/${encodeURIComponent(s.project.namespace)}/${encodeURIComponent(s.project.name)}/_apis/wit/workitems/${s.id}?api-version=6.0`,body:JSON.stringify(e),headers:{...P(this.config,t),"Content-Type":"application/json-patch+json"}})}async setIssueStatus(s,e={}){let{issue:t,status:n}=s,o=[{op:"add",path:"/fields/System.State",value:n.name}];if(!(await this.updateIssue(t,o,e)).body.fields?.["System.State"])throw new Error("Could not set issue status")}async setIssueAssignee(s,e={}){let{issue:t,assignee:n}=s,o=[{op:"add",path:"/fields/System.AssignedTo",value:n?.name??""}];if(!(await this.updateIssue(t,o,e)).body.fields?.["System.State"])throw new Error("Could not set issue assignee")}async setIssueLabels(s,e={}){let{issue:t,labels:n}=s,a=[{op:"replace",path:"/fields/System.Tags",value:n.map(u=>u.name).join(";")}];if(!(await this.updateIssue(t,a,e)).body.fields?.["System.Tags"])throw new Error("Could not set issue tags")}async getIssueTypesForAzureProject(s,e={}){if(!s.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let{namespace:t,project:n}=s;return{data:(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(t)}/${encodeURIComponent(n||"")}/_apis/wit/workitemtypes?api-version=6.0`,headers:{...P(this.config,e)}})).body.value}}async getLabelsForProject(s,e={}){let{namespace:t,project:n}=s;return{data:(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(t)}/${encodeURIComponent(n||"")}/_apis/wit/tags?api-version=6.0`,headers:{...P(this.config,e)}})).body.value.map(a=>({color:null,description:null,id:a.id,name:a.name,url:a.url}))}}};var q=(r,s={})=>h(s.token||r.token,s.isPAT||r.isPAT);var E="https://api.bitbucket.org/2.0",Cr={OPEN:"OPEN",MERGED:"MERGED",DECLINED:"CLOSED"},ce=r=>({id:r.uuid,name:r.display_name||r.nickname,username:r.nickname||r.display_name,email:null,avatarUrl:r.links.avatar.href,url:r.links.html.href}),Lt=r=>{let s=r.links.clone,e=s?.find(n=>n.name==="ssh"),t=s?.find(n=>n.name==="https");return e&&t?{cloneUrlHTTPS:t.href,cloneUrlSSH:e.href}:null},Dt=r=>({id:r.uuid,namespace:r.workspace.slug,name:r.slug,webUrl:r.links.html.href,httpsUrl:r.links.clone.find(s=>s.name==="https")?.href??null,sshUrl:r.links.clone.find(s=>s.name==="ssh")?.href??null,defaultBranch:{name:r.mainbranch.name},permissions:null}),We=r=>{let s=r.id,e=r.participants?.map(t=>{let n="REVIEW_REQUESTED";return t.approved?n="APPROVED":t.state==="changes_requested"?n="CHANGES_REQUESTED":t.participated_on!==null&&(n="COMMENTED"),{reviewer:ce(t.user),state:n}})??[];return{id:s.toString(),title:r.title,description:r.description,number:s,state:Cr[r.state],isDraft:!1,commentCount:r.comment_count,upvoteCount:null,author:ce(r.author),createdDate:new Date(r.created_on),updatedDate:new Date(r.updated_on),closedDate:null,mergedDate:null,repository:{id:r.destination.repository.uuid,name:r.destination.repository.name,owner:{login:r.destination.repository.full_name.split("/")[0]},remoteInfo:Lt(r.destination.repository)},headCommit:{buildStatuses:null},baseRef:{name:r.destination.branch.name,oid:r.destination.commit.hash},headRef:{name:r.source.branch.name,oid:r.source.commit.hash},url:r.links.html.href,assignees:null,reviews:e,reviewDecision:G(e),additions:null,deletions:null,fileCount:null,commitCount:null,headRepository:{id:r.source.repository.uuid,name:r.source.repository.name,owner:{login:r.source.repository.full_name.split("/")[0]},remoteInfo:Lt(r.source.repository)},mergeableState:"MERGEABLE",permissions:null}},Lr=r=>{switch(r){case"owner":case"admin":return{canCreateWebhook:!0,canPush:!0,isAdmin:!0};case"write":return{canCreateWebhook:!1,canPush:!0,isAdmin:!1};case"read":case"none":return{canCreateWebhook:!1,canPush:!1,isAdmin:!1}}},J=class extends U{async refreshToken(s){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 ${s.base64ClientIDColonClientSecret}`},body:`grant_type=refresh_token&refresh_token=${s.refreshToken}`})).body}}async getCurrentUser(s={},e={}){let t=await this.config.request({url:`${E}/user`,headers:q(this.config,e)});return{data:ce(t.body)}}async getUserForCommit(s,e={}){let n=(await this.config.request({url:`${E}/repositories/${s.repo.namespace}/${s.repo.name}/commit/${s.oid}`,headers:q(this.config,e)})).body.author,o=n.raw.match(/([^<]+)<(.+)>/);return{data:{name:o?o[1].trim():null,email:o?o[2]:null,avatarUrl:n.user?.links.avatar.href||null}}}async getRepo(s,e={}){let t=await this.config.request({url:`${E}/repositories/${s.namespace}/${s.name}`,headers:q(this.config,e)});return{data:Dt(t.body)}}async getRepos(s,e={}){let t=[],n=[];return await Promise.all(s.map(async o=>{try{let a=await this.getRepo(o,e);t.push(a.data)}catch(a){n.push({input:o,error:a})}})),{data:t,errors:n}}async getReposForCurrentUser(s,e={}){let t=new URL(`${E}/repositories`);t.searchParams.set("role","member"),t.searchParams.set("pagelen",S.toString()),s.cursor&&t.searchParams.set("after",s.cursor);let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next,a=null;return n.body.next&&(a=new URL(n.body.next).searchParams.get("after")),{pageInfo:{hasNextPage:o,endCursor:a},data:n.body.values.map(Dt)}}async getBranches(s,e={}){let t=new URL(`${E}/repositories/${s.repo.namespace}/${s.repo.name}/refs/branches`);t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen",S.toString());let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.map(a=>{let i=new Date(a.target.date);return{name:a.name,commit:{oid:a.target.hash,authoredDate:i,committedDate:i}}})}}async getTags(s,e={}){let t=new URL(`${E}/repositories/${s.repo.namespace}/${s.repo.name}/refs/tags`);t.searchParams.set("pagelen",S.toString()),s.cursor&&t.searchParams.set("page",s.cursor);let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next,a=null;return n.body.next&&(a=new URL(n.body.next).searchParams.get("page")),{pageInfo:{hasNextPage:o,endCursor:a},data:n.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 getWorkspacesForUser(s,e={}){let t=new URL(`${E}/user/permissions/workspaces`);t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","50");let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.map(a=>({id:a.workspace.uuid,slug:a.workspace.slug,name:a.workspace.name}))}}async getPullRequestsForUserAndWorkspace(s,e={}){let t=new URL(`${E}/workspaces/${s.workspaceSlug}/pullrequests/${s.userId}`);if(t.searchParams.set("fields","+values.participants,+values.destination.repository.links.clone.*,+values.source.repository.links.clone.*"),t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","50"),s.repos&&s.repos.length>0){let a=`state = "open" AND (${s.repos.map(i=>`source.repository.full_name = "${i.namespace}/${i.name}"`).join(" OR ")})`;t.searchParams.set("q",a)}let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.map(We)}}async getPullRequestsForRepoBase(s,e={}){let t=new URL(`${E}/repositories/${encodeURI(s.repo.namespace)}/${encodeURI(s.repo.name)}/pullrequests?state=OPEN`),n=[];s.reviewerId&&n.push(`reviewers.uuid="${s.reviewerId}"`),s.authorLogin&&n.push(`author.uuid="${s.authorLogin}"`);let o='state="OPEN"';return n.length&&(o+=` AND (${n.join(s.useOrFilter?" OR ":" AND ")})`),t.searchParams.set("fields","+values.participants,+values.destination.repository.links.clone.*,+values.source.repository.links.clone.*"),t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","50"),t.searchParams.set("q",o),await this.config.request({url:t.toString(),headers:q(this.config,e)})}async getPullRequestsForRepo(s,e={}){let t=[],n=await this.getPullRequestsForRepoBase(s,e);n.body.values.forEach(a=>{t.push(We(a))});let o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:t}}async getPullRequestsForRepos(s,e={}){let t=[];return await Promise.all(s.repos.map(async n=>{try{(await this.getPullRequestsForRepoBase({repo:n,...s},e)).body.values.forEach(a=>{t.push(We(a))})}catch(o){if(o.statusCode!==404&&o.statusCode!==401)throw o}})),{data:t}}async getAccountsForWorkspace(s,e={}){let t=new URL(`${E}/workspaces/${encodeURI(s.workspace)}/members`);t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","100");let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.map(a=>ce(a.user))}}async getReposPermissionsForCurrentUser(s,e={}){let t=new URL(`${E}/user/permissions/repositories`);t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","100");let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.reduce((a,i)=>({...a,[i.repository.uuid]:Lr(i.permission)}),{})}}async decorateReposWithPermissions(s,e={}){let t={},n=1;do{let o=await this.getReposPermissionsForCurrentUser({page:n},e);t={...o.data,...t},n=o.pageInfo.hasNextPage?o.pageInfo.nextPage:null}while(n!==null);return{data:s.repos.map(o=>({...o,permissions:t[o.id]??{canCreateWebhook:!1,canPush:!1,isAdmin:!1}}))}}async closePullRequest(s,e={}){let{pullRequest:t}=s;if(!(await this.config.request({method:"POST",url:`${E}/repositories/${t.repository.owner.login}/${t.repository.name}/pullrequests/${t.id}/decline`,headers:q(this.config,e)})).body.title)throw new Error("Could not close pull request")}async mergePullRequest(s,e={}){let{pullRequest:t,mergeStrategy:n}=s,o;switch(n){case"MERGE_COMMIT":{o="merge_commit";break}case"FAST_FORWARD":{o="fast_forward";break}case"SQUASH":{o="squash";break}}let a={merge_strategy:o,type:"pullrequest"};if(!(await this.config.request({method:"POST",url:`${E}/repositories/${t.repository.owner.login}/${t.repository.name}/pullrequests/${t.id}/merge`,body:JSON.stringify(a),headers:{...q(this.config,e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not merge pull request")}async setPullRequestReviewers(s,e={}){let{pullRequest:t,reviewers:n}=s,o={reviewers:n.map(i=>{if(i.username)throw new Error('Bitbucket reviewer requires "username" for this function.');return{username:i.username}})};if(!(await this.config.request({method:"PUT",url:`${E}/repositories/${t.repository.owner.login}/${t.repository.name}/pullrequests/${t.id}`,body:JSON.stringify(o),headers:{...q(this.config,e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not set pull request reviewers")}};var $t=r=>r?r.find(s=>s.permission==="USER_ADMIN"||s.permission==="PROJECT_ADMIN"||s.permission==="ADMIN"||s.permission==="SYS_ADMIN"||s.permission==="REPO_ADMIN")?{canCreateWebhook:!0,canPush:!0,isAdmin:!0}:r.find(s=>s.permission==="REPO_WRITE"||s.permission==="REPO_CREATE"||s.permission==="PROJECT_CREATE"||s.permission==="PROJECT_WRITE")?{canCreateWebhook:!1,canPush:!0,isAdmin:!1}:{canCreateWebhook:!1,canPush:!1,isAdmin:!1}:{canCreateWebhook:!1,canPush:!1,isAdmin:!1};var oe=r=>{let s=r.links.self[0].href;return{name:r.displayName,email:r.emailAddress,avatarUrl:r.avatarUrl??(s&&`${s}/avatar.png`),id:r.id.toString(),username:r.name,url:s}},ge=r=>{let s={OPEN:"OPEN",MERGED:"MERGED",DECLINED:"CLOSED"},e={UNAPPROVED:"REVIEW_REQUESTED",NEEDS_WORK:"CHANGES_REQUESTED",APPROVED:"APPROVED"},t=r.reviewers.map(u=>({reviewer:oe(u.user),state:e[u.status]})),n=r.toRef.repository.links.clone.find(u=>u.name==="ssh")?.href??null,o=r.toRef.repository.links.clone.find(u=>u.name==="https")?.href??null;o||(o=r.toRef.repository.links.clone.find(u=>u.name==="http")?.href??null);let a=r.fromRef.repository.links.clone.find(u=>u.name==="ssh")?.href??null,i=r.fromRef.repository.links.clone.find(u=>u.name==="https")?.href??null;return i||(i=r.fromRef.repository.links.clone.find(u=>u.name==="http")?.href??null),{id:r.id.toString(),number:r.id,title:r.title,description:r.description,url:r.links.self[0].href,state:s[r.state],isDraft:!1,createdDate:new Date(r.createdDate),updatedDate:new Date(r.updatedDate),closedDate:r.closedDate?new Date(r.closedDate):null,mergedDate:r.state=="MERGED"&&r.closedDate?new Date(r.closedDate):null,baseRef:{name:r.toRef.displayId,oid:r.toRef.latestCommit},headRef:{name:r.fromRef.displayId,oid:r.fromRef.latestCommit},commentCount:r.properties.commentCount,upvoteCount:null,commitCount:null,fileCount:null,additions:null,deletions:null,author:oe(r.author.user),assignees:null,reviews:t,reviewDecision:G(t),repository:{id:r.toRef.repository.id.toString(),name:r.toRef.repository.name,owner:{login:r.toRef.repository.project.key},remoteInfo:o&&n?{cloneUrlHTTPS:o,cloneUrlSSH:n}:null},headRepository:{id:r.fromRef.repository.id.toString(),name:r.fromRef.repository.name,owner:{login:r.fromRef.repository.project.key},remoteInfo:i&&a?{cloneUrlHTTPS:i,cloneUrlSSH:a}:null},headCommit:null,mergeableState:"MERGEABLE",permissions:null,version:r.version}},Ut=r=>({id:r.id.toString(),namespace:r.project.key,name:r.slug,webUrl:r.links.self[0]?.href??null,httpsUrl:r.links.clone.find(s=>s.name==="https"||s.name==="http")?.href??null,sshUrl:r.links.clone.find(s=>s.name==="ssh")?.href??null,defaultBranch:null,permissions:null}),V=class extends L{getBaseUrl(s){let e=s.baseUrl||this.config.baseUrl;if(!e)throw new Error('Bitbucket Server requires "baseUrl"');return e}getRequestHeaders(s){return h(s.token||this.config.token)}async getCurrentUser(s={},e={}){let t=await this.config.request({url:`${this.getBaseUrl(e)}/users?limit=2`,headers:this.getRequestHeaders(e)}),{headers:{"x-auserid":n,"x-ausername":o}}=t,a=n?parseInt(n,10):null,i=decodeURIComponent(o),l=(await this.config.request({url:`${this.getBaseUrl(e)}/users?filter=${o}&avatarSize=64`,headers:this.getRequestHeaders(e)})).body.values.find(({emailAddress:p,id:d,name:c,slug:g})=>a?a===d:i===c||i===p||i===g);if(!l)throw new Error("Could not find current Bitbucket Server user");return{data:oe(l)}}async getUserForCommit(s,e){let{repo:t,oid:n}=s,o=await this.config.request({url:`${this.getBaseUrl(e)}/projects/${t.namespace}/repos/${t.name}/commits/${n}`,headers:this.getRequestHeaders(e)});if(!o.body.author)throw new Error("Could not find user for commit");return{data:oe(o.body.author)}}async getRepo(s,e={}){let t=await this.config.request({url:`${this.getBaseUrl(e)}/projects/${s.namespace}/repos/${s.name}`,headers:this.getRequestHeaders(e)});return{data:Ut(t.body)}}async getRepos(s,e={}){let t=[],n=[];return await Promise.all(s.map(async o=>{try{let a=await this.getRepo(o,e);t.push(a.data)}catch(a){n.push({input:o,error:a})}})),{data:t,errors:n}}async getReposForCurrentUser(s,e={}){let t=s.page??0,n=await this.config.request({url:`${this.getBaseUrl(e)}/repos?start=${t}`,headers:this.getRequestHeaders(e)});return{pageInfo:{hasNextPage:!n.body.isLastPage,nextPage:n.body.nextPageStart},data:n.body.values.map(Ut)}}async getRepoPermissionsForUsername(s,e={}){let t=new URL(`${this.getBaseUrl(e)}/projects/${s.repo.namespace}/repos/${s.repo.name}/permissions/search?filterText=${s.username}`);try{let n=await this.config.request({url:t.toString(),headers:this.getRequestHeaders(e)});return{data:$t(n.body.values)}}catch(n){if(n.response?.status===401)return{data:{canCreateWebhook:!1,canPush:!1,isAdmin:!1}};throw n}}async decorateReposWithPermissions(s,e={}){return await Promise.all(s.repos.map(async n=>{let o=await this.getRepoPermissionsForUsername({repo:n,username:s.username},e);return{...n,permissions:o.data}}))}async getPullRequestsForRepoBase(s,e={}){let t=new URL(`${this.getBaseUrl(e)}/projects/${encodeURI(s.repo.namespace)}/repos/${encodeURI(s.repo.name)}/pull-requests?state=OPEN`);return t.searchParams.set("start",s.page?.toString()||"0"),t.searchParams.set("limit","50"),await this.config.request({url:t.toString(),headers:this.getRequestHeaders(e)})}async getPullRequestsForRepo(s,e={}){let t=[],n=await this.getPullRequestsForRepoBase(s,e);n.body.values.forEach(a=>{if(s.authorLogin&&a.author.user.name!==s.authorLogin)return null;t.push(ge(a))});let o=n.body.values.length!==0;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.start+n.body.values.length:null},data:t}}async getPullRequestsForRepos(s,e={}){let t=[];return await Promise.all(s.repos.map(async n=>{try{(await this.getPullRequestsForRepoBase({repo:n,...s},e)).body.values.forEach(a=>{if(s.authorLogin&&a.author.user.name!==s.authorLogin)return null;t.push(ge(a))})}catch(o){if(o.statusCode!==404&&o.statusCode!==401)throw o}})),{data:t}}async getPullRequestsForCurrentUser(s,e={}){let t=new URL(`${this.getBaseUrl(e)}/dashboard/pull-requests`);t.searchParams.set("state","OPEN"),t.searchParams.set("start",s.page?.toString()||"0"),t.searchParams.set("limit","50");let n=await this.config.request({url:t.toString(),headers:this.getRequestHeaders(e)}),o=n.body.values.length!==0;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.start+n.body.values.length:null},data:n.body.values.map(ge)}}async closePullRequest(s,e={}){let{pullRequest:t}=s;if(t.version===void 0)throw new Error('Bitbucket Server requires "version" for this function.');if(!(await this.config.request({method:"POST",url:`${this.getBaseUrl(e)}/projects/${t.repository.owner.login}/repos/${t.repository.name}/pull-requests/${t.id}/decline`,body:JSON.stringify({version:t.version}),headers:{...this.getRequestHeaders(e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not close pull request")}async mergePullRequest(s,e={}){let{pullRequest:t,mergeStrategyId:n}=s;if(s.mergeStrategy)throw new Error('Bitbucket Server uses "mergeStrategyId" instead of "mergeStrategy".');if(t.version===void 0)throw new Error('Bitbucket Server requires "version" for this function.');if(!(await this.config.request({method:"POST",url:`${this.getBaseUrl(e)}/projects/${t.repository.owner.login}/repos/${t.repository.name}/pull-requests/${t.id}/merge`,body:JSON.stringify({strategyId:n,version:t.version}),headers:{...this.getRequestHeaders(e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not merge pull request")}async getMergeStrategies(s={}){let e=await this.config.request({url:`${this.getBaseUrl(s)}/admin/pull-requests/git`,headers:{...this.getRequestHeaders(s),"Content-Type":"application/json"}});return{data:{defaultStrategy:e.body.mergeConfig.defaultStrategy,strategies:e.body.mergeConfig.strategies}}}async setPullRequestReviewers(s,e={}){let{pullRequest:t,reviewers:n}=s;if(t.version===void 0)throw new Error('Bitbucket Server requires "version" for this function.');let o={reviewers:n.map(i=>{if(i.username)throw new Error('Bitbucket Server reviewer requires "username" for this function.');return{user:{name:i.username}}}),version:t.version};if(!(await this.config.request({method:"PUT",url:`${this.getBaseUrl(e)}/projects/${t.repository.owner.login}/repos/${t.repository.name}/pull-requests/${t.id}`,body:JSON.stringify(o),headers:{...this.getRequestHeaders(e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not set pull request reviewers")}async getAccountsForProject(s,e={}){let t=new URL(`${this.getBaseUrl(e)}/projects/${encodeURI(s.project)}/permissions/users`);t.searchParams.set("start",s.page?.toString()||"0"),t.searchParams.set("limit","50");let n=await this.config.request({url:t.toString(),headers:this.getRequestHeaders(e)}),o=n.body.values.length!==0;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.start+n.body.values.length:null},data:n.body.values.map(a=>oe(a.user))}}};var Nt=require("js-base64");var me=(e=>(e.Open="OPEN",e.Closed="CLOSED",e))(me||{});var f=class extends Error{constructor(e,t){let n=t?.map(a=>`'${a.message}'`).join(", "),o=n?`${e}: ${n}`:e;super(o);this.graphQLErrors=t??[]}};var Dr={AS_CODE_OWNER:[3,0,0],CHECK_RUN:[3,0,0],LATEST_REVIEWS:[3,0,0],VIEWER_CAN_MERGE_AS_ADMIN:[3,5,0],ISSUE_FULL_DATABASE_ID:[3,12,0],PR_FULL_DATABASE_ID:[3,13,0],PR_REVIEW_FULL_DATABASE_ID:[3,13,0],PR_REVIEW_COMMENT_FULL_DATABASE_ID:[3,13,0]},At=15,Gt=100,C=r=>!!r,O=(r,s)=>{let e=Dr[s];for(let t=0;t<3;t++){if(r[t]>e[t])return!0;if(r[t]<e[t])return!1}return!0},fe="https://api.github.com",$r=`${fe}/graphql`,Re=`
|
|
1
|
+
"use strict";var Qe=Object.defineProperty;var gr=Object.getOwnPropertyDescriptor;var mr=Object.getOwnPropertyNames;var hr=Object.prototype.hasOwnProperty;var fr=(r,s)=>{for(var e in s)Qe(r,e,{get:s[e],enumerable:!0})},Rr=(r,s,e,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let n of mr(s))!hr.call(r,n)&&n!==e&&Qe(r,n,{get:()=>s[n],enumerable:!(t=gr(s,n))||t.enumerable});return r};var Ir=r=>Rr(Qe({},"__esModule",{value:!0}),r);var Bs={};fr(Bs,{AzureDevOps:()=>J,Bitbucket:()=>V,BitbucketServer:()=>K,EntityIdentifierProviderType:()=>dr,EntityType:()=>pr,EntityVersion:()=>lr,GitBuildStatusStage:()=>St,GitBuildStatusState:()=>pe,GitDiffLineType:()=>je,GitHub:()=>Z,GitHubIssueCloseReason:()=>cr,GitIssueState:()=>fe,GitLab:()=>ee,GitMergeStrategy:()=>W,GitPullRequestMergeableState:()=>H,GitPullRequestReviewState:()=>Q,GitPullRequestState:()=>M,GraphQLErrors:()=>f,Jira:()=>te,JiraServer:()=>re,PullRequestAsyncStatus:()=>ur,Trello:()=>se,default:()=>js,isFetch:()=>de});module.exports=Ir(Bs);var St=(n=>(n.Build="build",n.Production="production",n.Staging="staging",n.Test="test",n))(St||{}),pe=(p=>(p.ActionRequired="ACTION_REQUIRED",p.Cancelled="CANCELLED",p.Error="ERROR",p.Failed="FAILED",p.Pending="PENDING",p.Running="RUNNING",p.Skipped="SKIPPED",p.Success="SUCCESS",p.Warning="WARNING",p.OptionalActionRequired="OPTIONAL_ACTION_REQUIRED",p))(pe||{}),W=(o=>(o.MergeCommit="MERGE_COMMIT",o.Rebase="REBASE",o.RebaseThenMergeCommit="REBASE_THEN_MERGE_COMMIT",o.FastForward="FAST_FORWARD",o.Squash="SQUASH",o))(W||{}),M=(t=>(t.Open="OPEN",t.Closed="CLOSED",t.Merged="MERGED",t))(M||{}),Q=(n=>(n.Approved="APPROVED",n.ChangesRequested="CHANGES_REQUESTED",n.Commented="COMMENTED",n.ReviewRequested="REVIEW_REQUESTED",n))(Q||{}),H=(u=>(u.Behind="BEHIND",u.Blocked="BLOCKED",u.Conflicts="CONFLICTS",u.FailingChecks="FAILING_CHECKS",u.Mergeable="MERGEABLE",u.Unknown="UNKNOWN",u.UnknownAndBlocked="UNKNOWN_AND_BLOCKED",u.Unstable="UNSTABLE",u))(H||{}),je=(t=>(t.ADDED="ADDED",t.DELETED="DELETED",t.UNMODIFIED="UNMODIFIED",t))(je||{});var vt={APPROVED:0,COMMENTED:1,REVIEW_REQUESTED:2,CHANGES_REQUESTED:3},G=r=>!r||r.length===0?null:r.reduce((s,e)=>vt[e.state]>vt[s]?e.state:s,"APPROVED");var v=100;var qt=globalThis.fetch;var br=async r=>{let s=r.headers.get("content-type")||"",e=null;if(s.startsWith("application/json")){let o=await r.text();e=o.trim().length>0?JSON.parse(o):null}else if(s.startsWith("text/")||s==="")e=await r.text();else if(s.startsWith("application/vnd.github.raw+json"))e=await r.arrayBuffer();else throw new Error(`Unsupported content-type: ${s}`);let t={};r.headers.forEach((o,i)=>{t[i]=o});let n={body:e,headers:t,status:r.status,statusText:r.statusText};if(!r.ok){let o=new Error(r.statusText);throw Object.assign(o,{response:n}),o}return n},Be=r=>async({url:s,...e})=>{let t=await r(s,e);return br(t)};var de=(r,s=!1)=>r.name==="fetch"||s;var U=class{constructor(s){let e=s?.request||qt;this.config={...s,request:de(e,s?.forceIsFetch)?Be(e):e}}updateConfig(s){this.config={...this.config,...s,request:s.request&&de(s.request,s?.forceIsFetch??this.config.forceIsFetch)?Be(s.request):this.config.request}}},D=class extends U{};var h=(r,s)=>{let e={};return r&&(e.Authorization=`${s?"Basic":"Bearer"} ${r}`),e},Et=r=>r?r.reduce((s,e)=>(s[e]=!0,s),{}):void 0,j=(r,s,e)=>!r||s.some(t=>r[t])?e:"",Ct=async r=>{let s=[],e=!0,t;for(;e;){let n=await r(t);s=s.concat(n.data),e=!!n?.pageInfo?.hasNextPage,t=n?.pageInfo?.endCursor||n?.pageInfo?.nextPage}return s};async function ze(r){return(await Promise.allSettled(r)).map(e=>yr(e)).filter(e=>e!=null)}function yr(r,s=void 0){return r?.status==="fulfilled"?r.value:s}var Pr="https://app.vssps.visualstudio.com/_apis",wr="https://vssps.dev.azure.com/",Sr="https://dev.azure.com",P=(r,s={})=>h(s.token||r.token,s.isPAT||r.isPAT),Lt=r=>r.url.replace("/_apis/git/repositories/","/_git/").replace(`/${r.repository.project.id}/`,`/${encodeURIComponent(r.repository.project.name)}/`).replace(`/${r.repository.id}/`,`/${encodeURIComponent(r.repository.name)}/`).replace("/pullRequests/","/pullrequest/"),Me=(r,s)=>{let e=s.baseUrl||r.baseUrl||Pr;return e=e.replace(/\/$/,""),e},w=(r,s)=>{let e=s.baseUrl||r.baseUrl||Sr;return e=e.replace(/\/$/,""),e},He=(r,s)=>{let e=s.baseUrl||r.baseUrl||wr;return e=e.replace(/\/$/,""),e};var vr={active:"OPEN",completed:"MERGED",abandoned:"CLOSED"},qr={10:"APPROVED",5:"APPROVED",0:"REVIEW_REQUESTED",[-5]:"CHANGES_REQUESTED",[-10]:"CHANGES_REQUESTED"},We=r=>({id:r.id,name:r.displayName??null,username:(r.uniqueName||r.displayName)??null,email:null,avatarUrl:r.imageUrl??null,url:null}),ge=r=>r.startsWith("refs/heads/")?r.replace("refs/heads/",""):r,Er=r=>{switch(r){case"conflicts":return"CONFLICTS";case"failure":return"FAILING_CHECKS";case"rejectedByPolicy":return"BLOCKED";case"succeeded":return"MERGEABLE";case"notSet":case"queued":default:return"UNKNOWN"}},ce=(r,s)=>{let e=[],t=[];return s.reviewers.forEach(n=>{let o={reviewer:We(n),state:qr[n.vote??0]||"REVIEW_REQUESTED"};n.isRequired&&e.push(o),t.push(o)}),{id:s.pullRequestId.toString(),title:s.title,description:s.description??null,number:s.codeReviewId,state:vr[s.status],isDraft:s.isDraft,commentCount:null,upvoteCount:null,author:We(s.createdBy),createdDate:new Date(s.creationDate),updatedDate:new Date(s.closedDate||s.creationDate),closedDate:s.closedDate?new Date(s.closedDate):null,mergedDate:s.closedDate&&s.status==="completed"?new Date(s.closedDate):null,repository:{id:s.repository.id,name:s.repository.name,project:s.repository.project.name,owner:{login:r},remoteInfo:null},headCommit:{buildStatuses:null},baseRef:{name:ge(s.targetRefName),oid:s.lastMergeTargetCommit.commitId},headRef:{name:ge(s.sourceRefName),oid:s.lastMergeSourceCommit.commitId},url:Lt(s),assignees:s.reviewers.map(We),reviews:t,reviewDecision:G(e),additions:null,deletions:null,fileCount:null,commitCount:null,headRepository:s.forkSource?{id:s.forkSource.repository.id,name:s.forkSource.repository.name,project:void 0,owner:{login:r},remoteInfo:null}:{id:s.repository.id,name:s.repository.name,project:s.repository.project.name,owner:{login:r},remoteInfo:null},mergeableState:Er(s.mergeStatus),labels:s.labels?.map(n=>({color:null,description:null,id:n.id,name:n.name}))??[],permissions:null}},Dt=(r,s)=>({id:s.id,name:s.name,namespace:r,project:s.project.name,projectId:s.project.id,webUrl:s.webUrl,httpsUrl:s.remoteUrl,sshUrl:s.sshUrl,defaultBranch:s.defaultBranch?{name:ge(s.defaultBranch)}:null,permissions:null}),Cr=(r,s,e,t)=>{let n=e.fields,o=n["System.AssignedTo"],i=n["System.State"],a=n["System.WorkItemType"],u;return i&&a&&(u=t[a]?.[i]),{id:e.id.toString(),number:e.id.toString(),title:n["System.Title"],commentCount:n["System.CommentCount"],author:{avatarUrl:n["System.CreatedBy"]._links?.avatar?.href??null,email:null,id:n["System.CreatedBy"].id,name:n["System.CreatedBy"].uniqueName??null,username:n["System.CreatedBy"].displayName??null,url:null},closedDate:n["Microsoft.VSTS.Common.ClosedDate"]?new Date(n["Microsoft.VSTS.Common.ClosedDate"]):null,createdDate:new Date(n["System.CreatedDate"]),updatedDate:new Date(n["System.ChangedDate"]),url:e._links.html.href,assignees:o?[{avatarUrl:o._links?.avatar?.href??null,email:null,id:o.id,name:o.uniqueName??null,username:o.displayName??null,url:null}]:[],description:n["System.Description"]??null,state:{name:u?.title||i,color:null},type:n["System.WorkItemType"],repository:null,project:{namespace:r,name:s,resourceId:null,key:null,id:null},upvoteCount:0,labels:e.fields["System.Tags"]?.split(";").map(l=>({color:null,description:null,id:null,name:l.trim()}))??[]}},J=class extends D{async getCurrentUser(s={},e={}){if(e.isPAT||this.config.isPAT)throw new Error("Azure DevOps does not support PATs for this function.");let t=`${Me(this.config,e)}/profile/profiles/me`,n=await this.config.request({url:t,headers:P(this.config,e)});return{data:{id:n.body.id,name:n.body.displayName,username:n.body.displayName,email:n.body.emailAddress,avatarUrl:null,url:null}}}async getCurrentUserForInstance(s,e={}){let n=(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/_apis/ConnectionData`,headers:P(this.config,e)})).body.authorizedUser;if(n.providerDisplayName==="Anonymous")throw new Error("Current user not found.");return{data:{id:n.id,name:n.providerDisplayName,username:n.providerDisplayName,email:n.properties.Account.$value,avatarUrl:null,url:null}}}async getUserForCommit(s,e={}){if(!s.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let n=(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.repo.namespace)}/${encodeURIComponent(s.repo.project)}/_apis/git/repositories/${encodeURIComponent(s.repo.name)}/commits/${s.oid}`,headers:P(this.config,e)})).body.author;return{data:{name:n.name,email:n.email,avatarUrl:n.imageUrl}}}async getOrgsForUser(s,e={}){let t=`${Me(this.config,e)}/accounts?memberId=${s.userId}&api-version=6.0`;return{data:(await this.config.request({url:t,headers:P(this.config,e)})).body.value.map(o=>({id:o.accountId,name:o.accountName}))}}async getCollectionsForUser(s,e={}){let t=`${w(this.config,e)}/_apis/projectCollections`;return{data:(await this.config.request({url:t,headers:P(this.config,e)})).body.value.map(o=>({id:o.id,name:o.name}))}}async getAzureProjects(s,e={}){let t=new URL(`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/_apis/projects`);t.searchParams.set("$top",v.toString()),s.cursor&&t.searchParams.set("$skip",s.cursor);let n=await this.config.request({url:t.toString(),headers:P(this.config,e)}),o=n.headers["x-ms-continuationtoken"];return{pageInfo:{hasNextPage:!!o,endCursor:o||null},data:n.body.value.map(i=>({id:i.id,name:i.name,namespace:s.namespace}))}}async getAzureProjectScopeDescriptor(s,e={}){let{namespace:t,projectId:n}=s;return{data:{scope:(await this.config.request({url:`${He(this.config,e)}/${encodeURIComponent(t)}/_apis/graph/descriptors/${n}?api-version=6.0`,headers:P(this.config,e)})).body.value}}}async getAzureGraphAccountsForAzureProject(s,e={}){let{namespace:t,projectScopeDescriptor:n,cursor:o}=s,i=new URL(`${He(this.config,e)}/${encodeURIComponent(t)}/_apis/graph/users`);n&&i.searchParams.set("scopeDescriptor",n),o&&i.searchParams.set("continuationToken",o);let a=await this.config.request({url:i.toString(),headers:P(this.config,e)}),u=a.headers["x-ms-continuationtoken"];return{pageInfo:{endCursor:u||null,hasNextPage:!!u},data:a.body.value.map(l=>({avatarUrl:l._links?.avatar?.href??null,descriptor:l.descriptor??null,email:l.mailAddress??null,name:l.displayName??null,storageKeyURL:l._links?.storageKey?.href??null,username:l.displayName??null}))}}async getAccountFromAzureGraphAccount(s,e={}){let{azureGraphAccount:t}=s;if(!t.storageKeyURL)throw new Error("Expected 'storageKeyURL' to not be null for 'azureGraphAccount'");let n=await this.config.request({url:t.storageKeyURL,headers:P(this.config,e)});return{data:{avatarUrl:t.avatarUrl,email:t.email,id:n.body.value,name:t.name,username:t.username,url:null}}}async getAccountsFromAzureGraphAccounts(s,e={}){let t=[];for(let n of s.azureGraphAccounts){let o=await this.getAccountFromAzureGraphAccount({azureGraphAccount:n},e);t.push(o.data)}return{data:t}}async getRepo(s,e={}){if(!s.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let t=await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/${encodeURIComponent(s.project)}/_apis/git/repositories/${encodeURIComponent(s.name)}`,headers:P(this.config,e)});return{data:Dt(s.namespace,t.body)}}async getRepos(s,e={}){let t=[],n=[];return await Promise.all(s.map(async o=>{try{let i=await this.getRepo(o,e);t.push(i.data)}catch(i){n.push({input:o,error:i})}})),{data:t,errors:n}}async getReposForAzureProject(s,e={}){if(!s.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');return{data:(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/${encodeURIComponent(s.project)}/_apis/git/repositories`,headers:P(this.config,e)})).body.value.map(n=>Dt(s.namespace,n))}}async getRefs(s,e,t={}){if(!e.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let n=new URL(`${w(this.config,t)}/${encodeURIComponent(e.repo.namespace)}/${encodeURIComponent(e.repo.project)}/_apis/git/repositories/${encodeURIComponent(e.repo.name)}/refs`);n.searchParams.set("filter",s),n.searchParams.set("$top",v.toString()),e.cursor&&n.searchParams.set("continuationToken",e.cursor);let o=await this.config.request({url:n.toString(),headers:P(this.config,t)}),i=o.headers["x-ms-continuationtoken"];return{pageInfo:{hasNextPage:!!i,endCursor:i||null},data:o.body.value.map(a=>({name:ge(a.name),commit:{oid:a.objectId,authoredDate:null,committedDate:null}}))}}async getBranches(s,e={}){return this.getRefs("heads",s,e)}async getTags(s,e={}){return this.getRefs("tags",s,e)}async getPullRequestsForRepoBase(s,e={},t=100){let{page:n,repo:o,assigneeLogins:i,authorLogin:a}=s||{},u=n||1;if(!o.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let l="searchCriteria.status=1";return i&&i.length&&(l+=`&searchCriteria.reviewerId=${i[0]}`),a&&(l+=`&searchCriteria.creatorId=${a}`),await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(o.namespace)}/${encodeURIComponent(o.project||"")}/_apis/git/repositories/${encodeURIComponent(o.name)}/pullRequests?${l}&%24top=${t}&%24skip=${(u-1)*t}`,headers:P(this.config,e)})}async getPullRequestsForRepo(s,e={}){let n=s.page||1,o=await this.getPullRequestsForRepoBase(s,e,100);return{pageInfo:{hasNextPage:o.body.value.length===100,nextPage:n+1},data:o.body.value.map(i=>ce(s.repo.namespace,i))}}async getPullRequestsForRepos(s,e={}){if(!s.repos.every(o=>o.project))throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let{repos:t}=s||{},n=[];return await Promise.all(t.map(async o=>{try{(await this.getPullRequestsForRepoBase({repo:o,...s},e)).body.value.forEach(a=>{n.push(ce(o.namespace,a))})}catch(i){if(i.statusCode!==404&&i.statusCode!==401)throw i}})),{data:n}}async getPullRequestsForProjectBase(s,e={},t=100){let{namespace:n,project:o,page:i,assigneeLogins:a,authorLogin:u,repo:l}=s;if(l?.project&&l.project!==o)throw new Error("Could not fetch pull requests, project mismatch");let p=i||1,d=new URL(`${w(this.config,e)}/${encodeURIComponent(n)}/${encodeURIComponent(o)}/_apis/git/pullRequests`);return d.searchParams.set("searchCriteria.status","1"),d.searchParams.set("$top",t.toString()),d.searchParams.set("$skip",((p-1)*t).toString()),l?.id&&l?.project===o&&d.searchParams.set("searchCriteria.repositoryId",l.id),a&&a.length&&d.searchParams.set("searchCriteria.reviewerId",a[0]),u&&d.searchParams.set("searchCriteria.creatorId",u),await this.config.request({url:d.toString(),headers:P(this.config,e)})}async getPullRequestsForProject(s,e={}){let n=s.page||1,o=await this.getPullRequestsForProjectBase(s,e,100);return{pageInfo:{hasNextPage:o?.body.value.length===100,nextPage:n+1},data:o?.body.value.map(i=>ce(s.namespace,i))||[]}}async getPullRequestsForProjects(s,e={}){let{projects:t}=s||{},n=[];return await Promise.all(t.map(async o=>{try{(!s.repo||s.repo.project&&s.repo.project===o.project)&&(await this.getPullRequestsForProjectBase({...o,...s},e))?.body.value.forEach(a=>{n.push(ce(o.namespace,a))})}catch(i){if(i.statusCode!==404&&i.statusCode!==401)throw i}})),{data:n}}async getAzurePullRequestLastMergeStatus(s,e={}){if(!s.repo.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let{repo:{namespace:t,project:n,name:o},pullRequestId:i}=s,a=await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(t)}/${encodeURIComponent(n||"")}/_apis/git/repositories/${o}/pullrequests/${i}?includeCommits=true?api-version=6.0`,headers:{...P(this.config,e)}});if(!a.body.mergeStatus)throw new Error("Could not fetch pull request");return{data:a.body.mergeStatus}}async updatePullRequest(s,e,t){return await this.config.request({method:"PATCH",url:`${w(this.config,t)}/${encodeURIComponent(s.repository.owner.login)}/${encodeURIComponent(s.repository.project)}/_apis/git/repositories/${s.repository.name}/pullrequests/${s.id}?api-version=6.0`,body:e,headers:{...P(this.config,t),"Content-Type":"application/json"}})}async closePullRequest(s,e={}){let{pullRequest:t}=s,n={status:"abandoned"};if(!(await this.updatePullRequest(t,JSON.stringify(n),e)).body.status)throw new Error("Could not close pull request")}async mergePullRequest(s,e={}){let{pullRequest:t,mergeStrategy:n}=s,o;switch(n){case"MERGE_COMMIT":{o="noFastForward";break}case"REBASE":{o="rebase";break}case"REBASE_THEN_MERGE_COMMIT":{o="rebaseMerge";break}case"SQUASH":{o="squash";break}}let i={completionOptions:{mergeStrategy:o},lastMergeSourceCommit:{commitId:t.headRef?.oid},status:"completed"};if(!(await this.updatePullRequest(t,JSON.stringify(i),e)).body.status)throw new Error("Could not merge pull request")}async addPullRequestLabel(s,e={}){let{pullRequest:t,label:n}=s;if(!t.repository.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let o={name:n.name};if(!(await this.config.request({method:"POST",url:`${w(this.config,e)}/${encodeURIComponent(t.repository.owner.login)}/${encodeURIComponent(t.repository.project)}/_apis/git/repositories/${t.repository.name}/pullrequests/${t.id}/labels?api-version=6.0`,body:JSON.stringify(o),headers:{...P(this.config,e),"Content-Type":"application/json"}})).body.id)throw new Error("Could not add pull request label")}async removePullRequestLabel(s,e={}){let{pullRequest:t,label:n}=s;if(!t.repository.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');await this.config.request({method:"DELETE",url:`${w(this.config,e)}/${encodeURIComponent(t.repository.owner.login)}/${encodeURIComponent(t.repository.project)}/_apis/git/repositories/${t.repository.name}/pullrequests/${t.id}/labels/${encodeURIComponent(n.name)}?api-version=6.0`,headers:{...P(this.config,e)}})}async setPullRequestLabels(s,e={}){let{pullRequest:t,labels:n}=s;if(!t.repository.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let o=t.labels;if(!o)throw new Error('Azure DevOps requires "labels" for this function.');for(let i of n)o.find(a=>a.id===i.id)||await this.addPullRequestLabel({pullRequest:t,label:i},e);for(let i of o)n.find(a=>i.id===a.id)||await this.removePullRequestLabel({pullRequest:t,label:i},e)}async setPullRequestAsDraft(s,e={}){let{pullRequest:t,isDraft:n}=s,o={isDraft:n};if(!(await this.updatePullRequest(t,JSON.stringify(o),e)).body.status)throw new Error("Could not set the pull request as draft")}async addPullRequestReviewer(s,e={}){let{pullRequest:t,reviewer:n,isRequired:o}=s,i={id:n.id,isRequired:o};if(!(await this.config.request({method:"PUT",url:`${w(this.config,e)}/${encodeURIComponent(t.repository.owner.login)}/${encodeURIComponent(t.repository.project)}/_apis/git/repositories/${t.repository.name}/pullrequests/${t.id}/reviewers/${n.id}?api-version=6.0`,body:JSON.stringify(i),headers:{...P(this.config,e),"Content-Type":"application/json"}})).body.id)throw new Error("Could not add pull request reviewer")}async removePullRequestReviewer(s,e={}){let{pullRequest:t,reviewer:n}=s;await this.config.request({method:"DELETE",url:`${w(this.config,e)}/${encodeURIComponent(t.repository.owner.login)}/${encodeURIComponent(t.repository.project)}/_apis/git/repositories/${t.repository.name}/pullrequests/${t.id}/reviewers/${n.id}?api-version=6.0`,headers:{...P(this.config,e),Accept:"application/json"}})}async setPullRequestReviewers(s,e={}){let{pullRequest:t,reviewers:n}=s;for(let o of n)t.assignees.find(i=>i.id===o.id)||await this.addPullRequestReviewer({pullRequest:t,reviewer:o,isRequired:!0},e);for(let o of t.assignees)n.find(i=>o.id===i.id)||await this.removePullRequestReviewer({pullRequest:t,reviewer:o},e)}async getIssuesForAzureProject(s,e={}){let{page:t,assigneeLogins:n,authorLogin:o,mentionLogin:i,labelNames:a,statusByWorkItemIdByStatusId:u}=s||{},l=t||1,p=200,d=["[Microsoft.VSTS.Common.ClosedDate] = ''","[System.TeamProject] = @project","[Microsoft.VSTS.Common.ResolvedDate] = ''"];o&&d.push(`[System.CreatedBy] = '${o.replace("'","''")}'`),n&&n[0]&&d.push(`[System.AssignedTo] = '${n[0].replace("'","''")}'`),i&&d.push("[System.Id] IN (@recentMentions)"),a&&a.forEach(I=>d.push(`[System.Tags] Contains '${I}'`));let c=`Select [Microsoft.VSTS.Common.ClosedDate], [Microsoft.VSTS.Common.ResolvedDate] From WorkItems Where ${d.join(" AND ")} order by [System.CreatedDate] desc`,g=await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/${encodeURIComponent(s.project)}/_apis/wit/wiql?api-version=6.0`,body:JSON.stringify({query:c}),method:"POST",headers:{...P(this.config,e),"Content-Type":"application/json"}}),m=g.body.workItems.slice((l-1)*p,p*l).map(I=>I.id);if(m.length==0)return{pageInfo:{hasNextPage:!1,nextPage:null},data:[]};let b=await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(s.namespace)}/${encodeURIComponent(s.project)}/_apis/wit/workitemsbatch?api-version=6.0`,body:JSON.stringify({ids:m,$expand:"Links"}),method:"POST",headers:{...P(this.config,e),"Content-Type":"application/json"}});return{pageInfo:{hasNextPage:g.body.workItems.length>p*l,nextPage:l+1},data:b.body.value.map(I=>Cr(s.namespace,s.project,I,u||{}))}}async getPermissionsForRepos(s,e={}){let{namespace:t,repos:n}=s,o={4:["canPush","canCreateWebhook"],1024:["isAdmin"],2048:["isAdmin"],4096:["isAdmin"],8192:["isAdmin"]},i=p=>{let d="2e9eb7ed-3c0a-47d4-87c1-0ffdd275fd87",c=`repoV2/${p.projectId}/${p.id}`;return Object.keys(o).map(g=>({securityNamespaceId:d,token:c,permissions:g}))},a={alwaysAllowAdministrators:!1,evaluations:n.flatMap(i)};return{data:(await this.config.request({method:"POST",url:`${w(this.config,e)}/${encodeURIComponent(t)}/_apis/security/permissionevaluationbatch?api-version=7.0`,body:JSON.stringify(a),headers:{...P(this.config,e),"Content-Type":"application/json"}})).body.evaluations.reduce((p,d)=>{let[,c,g]=d.token.split("/"),m=`${c}/${g}`,b=o[d.permissions];for(let I of b)p[m]===void 0&&(p[m]={canCreateWebhook:!0,canPush:!0,isAdmin:!0}),d.value===!1&&(p[m][I]=!1);return p},{})}}async decorateReposWithPermissions(s,e={}){let{namespace:t,repos:n}=s,o=await this.getPermissionsForRepos({namespace:t,repos:n},e);return{data:n.map(i=>({...i,permissions:o.data[`${i.projectId}/${i.id}`]}))}}async updateIssue(s,e,t={}){return await this.config.request({method:"PATCH",url:`${w(this.config,t)}/${encodeURIComponent(s.project.namespace)}/${encodeURIComponent(s.project.name)}/_apis/wit/workitems/${s.id}?api-version=6.0`,body:JSON.stringify(e),headers:{...P(this.config,t),"Content-Type":"application/json-patch+json"}})}async setIssueStatus(s,e={}){let{issue:t,status:n}=s,o=[{op:"add",path:"/fields/System.State",value:n.name}];if(!(await this.updateIssue(t,o,e)).body.fields?.["System.State"])throw new Error("Could not set issue status")}async setIssueAssignee(s,e={}){let{issue:t,assignee:n}=s,o=[{op:"add",path:"/fields/System.AssignedTo",value:n?.name??""}];if(!(await this.updateIssue(t,o,e)).body.fields?.["System.State"])throw new Error("Could not set issue assignee")}async setIssueLabels(s,e={}){let{issue:t,labels:n}=s,i=[{op:"replace",path:"/fields/System.Tags",value:n.map(u=>u.name).join(";")}];if(!(await this.updateIssue(t,i,e)).body.fields?.["System.Tags"])throw new Error("Could not set issue tags")}async getIssueTypesForAzureProject(s,e={}){if(!s.project)throw new Error('Azure DevOps requires a "project" (name or ID) for this function.');let{namespace:t,project:n}=s;return{data:(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(t)}/${encodeURIComponent(n||"")}/_apis/wit/workitemtypes?api-version=6.0`,headers:{...P(this.config,e)}})).body.value}}async getLabelsForProject(s,e={}){let{namespace:t,project:n}=s;return{data:(await this.config.request({url:`${w(this.config,e)}/${encodeURIComponent(t)}/${encodeURIComponent(n||"")}/_apis/wit/tags?api-version=6.0`,headers:{...P(this.config,e)}})).body.value.map(i=>({color:null,description:null,id:i.id,name:i.name,url:i.url}))}}};var q=(r,s={})=>h(s.token||r.token,s.isPAT||r.isPAT);var E="https://api.bitbucket.org/2.0",Lr={OPEN:"OPEN",MERGED:"MERGED",DECLINED:"CLOSED"},me=r=>({id:r.uuid,name:r.display_name||r.nickname,username:r.nickname||r.display_name,email:null,avatarUrl:r.links.avatar.href,url:r.links.html.href}),$t=r=>{let s=r.links.clone,e=s?.find(n=>n.name==="ssh"),t=s?.find(n=>n.name==="https");return e&&t?{cloneUrlHTTPS:t.href,cloneUrlSSH:e.href}:null},Ut=r=>({id:r.uuid,namespace:r.workspace.slug,name:r.slug,webUrl:r.links.html.href,httpsUrl:r.links.clone.find(s=>s.name==="https")?.href??null,sshUrl:r.links.clone.find(s=>s.name==="ssh")?.href??null,defaultBranch:{name:r.mainbranch.name},permissions:null}),Je=r=>{let s=r.id,e=r.participants?.map(t=>{let n="REVIEW_REQUESTED";return t.approved?n="APPROVED":t.state==="changes_requested"?n="CHANGES_REQUESTED":t.participated_on!==null&&(n="COMMENTED"),{reviewer:me(t.user),state:n}})??[];return{id:s.toString(),title:r.title,description:r.description,number:s,state:Lr[r.state],isDraft:!1,commentCount:r.comment_count,upvoteCount:null,author:me(r.author),createdDate:new Date(r.created_on),updatedDate:new Date(r.updated_on),closedDate:null,mergedDate:null,repository:{id:r.destination.repository.uuid,name:r.destination.repository.name,owner:{login:r.destination.repository.full_name.split("/")[0]},remoteInfo:$t(r.destination.repository)},headCommit:{buildStatuses:null},baseRef:{name:r.destination.branch.name,oid:r.destination.commit.hash},headRef:{name:r.source.branch.name,oid:r.source.commit.hash},url:r.links.html.href,assignees:null,reviews:e,reviewDecision:G(e),additions:null,deletions:null,fileCount:null,commitCount:null,headRepository:{id:r.source.repository.uuid,name:r.source.repository.name,owner:{login:r.source.repository.full_name.split("/")[0]},remoteInfo:$t(r.source.repository)},mergeableState:"MERGEABLE",permissions:null}},Dr=r=>{switch(r){case"owner":case"admin":return{canCreateWebhook:!0,canPush:!0,isAdmin:!0};case"write":return{canCreateWebhook:!1,canPush:!0,isAdmin:!1};case"read":case"none":return{canCreateWebhook:!1,canPush:!1,isAdmin:!1}}},V=class extends U{async refreshToken(s){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 ${s.base64ClientIDColonClientSecret}`},body:`grant_type=refresh_token&refresh_token=${s.refreshToken}`})).body}}async getCurrentUser(s={},e={}){let t=await this.config.request({url:`${E}/user`,headers:q(this.config,e)});return{data:me(t.body)}}async getUserForCommit(s,e={}){let n=(await this.config.request({url:`${E}/repositories/${s.repo.namespace}/${s.repo.name}/commit/${s.oid}`,headers:q(this.config,e)})).body.author,o=n.raw.match(/([^<]+)<(.+)>/);return{data:{name:o?o[1].trim():null,email:o?o[2]:null,avatarUrl:n.user?.links.avatar.href||null}}}async getRepo(s,e={}){let t=await this.config.request({url:`${E}/repositories/${s.namespace}/${s.name}`,headers:q(this.config,e)});return{data:Ut(t.body)}}async getRepos(s,e={}){let t=[],n=[];return await Promise.all(s.map(async o=>{try{let i=await this.getRepo(o,e);t.push(i.data)}catch(i){n.push({input:o,error:i})}})),{data:t,errors:n}}async getReposForCurrentUser(s,e={}){let t=new URL(`${E}/repositories`);t.searchParams.set("role","member"),t.searchParams.set("pagelen",v.toString()),s.cursor&&t.searchParams.set("after",s.cursor);let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next,i=null;return n.body.next&&(i=new URL(n.body.next).searchParams.get("after")),{pageInfo:{hasNextPage:o,endCursor:i},data:n.body.values.map(Ut)}}async getBranches(s,e={}){let t=new URL(`${E}/repositories/${s.repo.namespace}/${s.repo.name}/refs/branches`);t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen",v.toString());let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.map(i=>{let a=new Date(i.target.date);return{name:i.name,commit:{oid:i.target.hash,authoredDate:a,committedDate:a}}})}}async getTags(s,e={}){let t=new URL(`${E}/repositories/${s.repo.namespace}/${s.repo.name}/refs/tags`);t.searchParams.set("pagelen",v.toString()),s.cursor&&t.searchParams.set("page",s.cursor);let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next,i=null;return n.body.next&&(i=new URL(n.body.next).searchParams.get("page")),{pageInfo:{hasNextPage:o,endCursor:i},data:n.body.values.map(a=>{let u=new Date(a.target.date);return{name:a.name,commit:{oid:a.target.hash,authoredDate:u,committedDate:u}}})}}async getWorkspacesForUser(s,e={}){let t=new URL(`${E}/user/permissions/workspaces`);t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","50");let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.map(i=>({id:i.workspace.uuid,slug:i.workspace.slug,name:i.workspace.name}))}}async getPullRequestsForUserAndWorkspace(s,e={}){let t=new URL(`${E}/workspaces/${s.workspaceSlug}/pullrequests/${s.userId}`);if(t.searchParams.set("fields","+values.participants,+values.destination.repository.links.clone.*,+values.source.repository.links.clone.*"),t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","50"),s.repos&&s.repos.length>0){let i=`state = "open" AND (${s.repos.map(a=>`source.repository.full_name = "${a.namespace}/${a.name}"`).join(" OR ")})`;t.searchParams.set("q",i)}let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.map(Je)}}async getPullRequestsForRepoBase(s,e={}){let t=new URL(`${E}/repositories/${encodeURI(s.repo.namespace)}/${encodeURI(s.repo.name)}/pullrequests?state=OPEN`),n=[];s.reviewerId&&n.push(`reviewers.uuid="${s.reviewerId}"`),s.authorLogin&&n.push(`author.uuid="${s.authorLogin}"`);let o='state="OPEN"';return n.length&&(o+=` AND (${n.join(s.useOrFilter?" OR ":" AND ")})`),t.searchParams.set("fields","+values.participants,+values.destination.repository.links.clone.*,+values.source.repository.links.clone.*"),t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","50"),t.searchParams.set("q",o),await this.config.request({url:t.toString(),headers:q(this.config,e)})}async getPullRequestsForRepo(s,e={}){let t=[],n=await this.getPullRequestsForRepoBase(s,e);n.body.values.forEach(i=>{t.push(Je(i))});let o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:t}}async getPullRequestsForRepos(s,e={}){let t=[];return await Promise.all(s.repos.map(async n=>{try{(await this.getPullRequestsForRepoBase({repo:n,...s},e)).body.values.forEach(i=>{t.push(Je(i))})}catch(o){if(o.statusCode!==404&&o.statusCode!==401)throw o}})),{data:t}}async getAccountsForWorkspace(s,e={}){let t=new URL(`${E}/workspaces/${encodeURI(s.workspace)}/members`);t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","100");let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.map(i=>me(i.user))}}async getReposPermissionsForCurrentUser(s,e={}){let t=new URL(`${E}/user/permissions/repositories`);t.searchParams.set("page",s.page?.toString()||"1"),t.searchParams.set("pagelen","100");let n=await this.config.request({url:t.toString(),headers:q(this.config,e)}),o=!!n.body.next;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.page+1:null},data:n.body.values.reduce((i,a)=>({...i,[a.repository.uuid]:Dr(a.permission)}),{})}}async decorateReposWithPermissions(s,e={}){let t={},n=1;do{let o=await this.getReposPermissionsForCurrentUser({page:n},e);t={...o.data,...t},n=o.pageInfo.hasNextPage?o.pageInfo.nextPage:null}while(n!==null);return{data:s.repos.map(o=>({...o,permissions:t[o.id]??{canCreateWebhook:!1,canPush:!1,isAdmin:!1}}))}}async closePullRequest(s,e={}){let{pullRequest:t}=s;if(!(await this.config.request({method:"POST",url:`${E}/repositories/${t.repository.owner.login}/${t.repository.name}/pullrequests/${t.id}/decline`,headers:q(this.config,e)})).body.title)throw new Error("Could not close pull request")}async mergePullRequest(s,e={}){let{pullRequest:t,mergeStrategy:n}=s,o;switch(n){case"MERGE_COMMIT":{o="merge_commit";break}case"FAST_FORWARD":{o="fast_forward";break}case"SQUASH":{o="squash";break}}let i={merge_strategy:o,type:"pullrequest"};if(!(await this.config.request({method:"POST",url:`${E}/repositories/${t.repository.owner.login}/${t.repository.name}/pullrequests/${t.id}/merge`,body:JSON.stringify(i),headers:{...q(this.config,e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not merge pull request")}async setPullRequestReviewers(s,e={}){let{pullRequest:t,reviewers:n}=s,o={reviewers:n.map(a=>{if(a.username)throw new Error('Bitbucket reviewer requires "username" for this function.');return{username:a.username}})};if(!(await this.config.request({method:"PUT",url:`${E}/repositories/${t.repository.owner.login}/${t.repository.name}/pullrequests/${t.id}`,body:JSON.stringify(o),headers:{...q(this.config,e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not set pull request reviewers")}};var At=r=>r?r.find(s=>s.permission==="USER_ADMIN"||s.permission==="PROJECT_ADMIN"||s.permission==="ADMIN"||s.permission==="SYS_ADMIN"||s.permission==="REPO_ADMIN")?{canCreateWebhook:!0,canPush:!0,isAdmin:!0}:r.find(s=>s.permission==="REPO_WRITE"||s.permission==="REPO_CREATE"||s.permission==="PROJECT_CREATE"||s.permission==="PROJECT_WRITE")?{canCreateWebhook:!1,canPush:!0,isAdmin:!1}:{canCreateWebhook:!1,canPush:!1,isAdmin:!1}:{canCreateWebhook:!1,canPush:!1,isAdmin:!1};var ie=r=>{let s=r.links.self[0].href;return{name:r.displayName,email:r.emailAddress,avatarUrl:r.avatarUrl??(s&&`${s}/avatar.png`),id:r.id.toString(),username:r.name,url:s}},he=r=>{let s={OPEN:"OPEN",MERGED:"MERGED",DECLINED:"CLOSED"},e={UNAPPROVED:"REVIEW_REQUESTED",NEEDS_WORK:"CHANGES_REQUESTED",APPROVED:"APPROVED"},t=r.reviewers.map(u=>({reviewer:ie(u.user),state:e[u.status]})),n=r.toRef.repository.links.clone.find(u=>u.name==="ssh")?.href??null,o=r.toRef.repository.links.clone.find(u=>u.name==="https")?.href??null;o||(o=r.toRef.repository.links.clone.find(u=>u.name==="http")?.href??null);let i=r.fromRef.repository.links.clone.find(u=>u.name==="ssh")?.href??null,a=r.fromRef.repository.links.clone.find(u=>u.name==="https")?.href??null;return a||(a=r.fromRef.repository.links.clone.find(u=>u.name==="http")?.href??null),{id:r.id.toString(),number:r.id,title:r.title,description:r.description,url:r.links.self[0].href,state:s[r.state],isDraft:!1,createdDate:new Date(r.createdDate),updatedDate:new Date(r.updatedDate),closedDate:r.closedDate?new Date(r.closedDate):null,mergedDate:r.state=="MERGED"&&r.closedDate?new Date(r.closedDate):null,baseRef:{name:r.toRef.displayId,oid:r.toRef.latestCommit},headRef:{name:r.fromRef.displayId,oid:r.fromRef.latestCommit},commentCount:r.properties.commentCount,upvoteCount:null,commitCount:null,fileCount:null,additions:null,deletions:null,author:ie(r.author.user),assignees:null,reviews:t,reviewDecision:G(t),repository:{id:r.toRef.repository.id.toString(),name:r.toRef.repository.name,owner:{login:r.toRef.repository.project.key},remoteInfo:o&&n?{cloneUrlHTTPS:o,cloneUrlSSH:n}:null},headRepository:{id:r.fromRef.repository.id.toString(),name:r.fromRef.repository.name,owner:{login:r.fromRef.repository.project.key},remoteInfo:a&&i?{cloneUrlHTTPS:a,cloneUrlSSH:i}:null},headCommit:null,mergeableState:"MERGEABLE",permissions:null,version:r.version}},Gt=r=>({id:r.id.toString(),namespace:r.project.key,name:r.slug,webUrl:r.links.self[0]?.href??null,httpsUrl:r.links.clone.find(s=>s.name==="https"||s.name==="http")?.href??null,sshUrl:r.links.clone.find(s=>s.name==="ssh")?.href??null,defaultBranch:null,permissions:null}),K=class extends D{getBaseUrl(s){let e=s.baseUrl||this.config.baseUrl;if(!e)throw new Error('Bitbucket Server requires "baseUrl"');return e}getRequestHeaders(s){return h(s.token||this.config.token)}async getCurrentUser(s={},e={}){let t=await this.config.request({url:`${this.getBaseUrl(e)}/users?limit=2`,headers:this.getRequestHeaders(e)}),{headers:{"x-auserid":n,"x-ausername":o}}=t,i=n?parseInt(n,10):null,a=decodeURIComponent(o),l=(await this.config.request({url:`${this.getBaseUrl(e)}/users?filter=${o}&avatarSize=64`,headers:this.getRequestHeaders(e)})).body.values.find(({emailAddress:p,id:d,name:c,slug:g})=>i?i===d:a===c||a===p||a===g);if(!l)throw new Error("Could not find current Bitbucket Server user");return{data:ie(l)}}async getUserForCommit(s,e){let{repo:t,oid:n}=s,o=await this.config.request({url:`${this.getBaseUrl(e)}/projects/${t.namespace}/repos/${t.name}/commits/${n}`,headers:this.getRequestHeaders(e)});if(!o.body.author)throw new Error("Could not find user for commit");return{data:ie(o.body.author)}}async getRepo(s,e={}){let t=await this.config.request({url:`${this.getBaseUrl(e)}/projects/${s.namespace}/repos/${s.name}`,headers:this.getRequestHeaders(e)});return{data:Gt(t.body)}}async getRepos(s,e={}){let t=[],n=[];return await Promise.all(s.map(async o=>{try{let i=await this.getRepo(o,e);t.push(i.data)}catch(i){n.push({input:o,error:i})}})),{data:t,errors:n}}async getReposForCurrentUser(s,e={}){let t=s.page??0,n=await this.config.request({url:`${this.getBaseUrl(e)}/repos?start=${t}`,headers:this.getRequestHeaders(e)});return{pageInfo:{hasNextPage:!n.body.isLastPage,nextPage:n.body.nextPageStart},data:n.body.values.map(Gt)}}async getRepoPermissionsForUsername(s,e={}){let t=new URL(`${this.getBaseUrl(e)}/projects/${s.repo.namespace}/repos/${s.repo.name}/permissions/search?filterText=${s.username}`);try{let n=await this.config.request({url:t.toString(),headers:this.getRequestHeaders(e)});return{data:At(n.body.values)}}catch(n){if(n.response?.status===401)return{data:{canCreateWebhook:!1,canPush:!1,isAdmin:!1}};throw n}}async decorateReposWithPermissions(s,e={}){return await Promise.all(s.repos.map(async n=>{let o=await this.getRepoPermissionsForUsername({repo:n,username:s.username},e);return{...n,permissions:o.data}}))}async getPullRequestsForRepoBase(s,e={}){let t=new URL(`${this.getBaseUrl(e)}/projects/${encodeURI(s.repo.namespace)}/repos/${encodeURI(s.repo.name)}/pull-requests?state=OPEN`);return t.searchParams.set("start",s.page?.toString()||"0"),t.searchParams.set("limit","50"),await this.config.request({url:t.toString(),headers:this.getRequestHeaders(e)})}async getPullRequestsForRepo(s,e={}){let t=[],n=await this.getPullRequestsForRepoBase(s,e);n.body.values.forEach(i=>{if(s.authorLogin&&i.author.user.name!==s.authorLogin)return null;t.push(he(i))});let o=n.body.values.length!==0;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.start+n.body.values.length:null},data:t}}async getPullRequestsForRepos(s,e={}){let t=[];return await Promise.all(s.repos.map(async n=>{try{(await this.getPullRequestsForRepoBase({repo:n,...s},e)).body.values.forEach(i=>{if(s.authorLogin&&i.author.user.name!==s.authorLogin)return null;t.push(he(i))})}catch(o){if(o.statusCode!==404&&o.statusCode!==401)throw o}})),{data:t}}async getPullRequestsForCurrentUser(s,e={}){let t=new URL(`${this.getBaseUrl(e)}/dashboard/pull-requests`);t.searchParams.set("state","OPEN"),t.searchParams.set("start",s.page?.toString()||"0"),t.searchParams.set("limit","50");let n=await this.config.request({url:t.toString(),headers:this.getRequestHeaders(e)}),o=n.body.values.length!==0;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.start+n.body.values.length:null},data:n.body.values.map(he)}}async closePullRequest(s,e={}){let{pullRequest:t}=s;if(t.version===void 0)throw new Error('Bitbucket Server requires "version" for this function.');if(!(await this.config.request({method:"POST",url:`${this.getBaseUrl(e)}/projects/${t.repository.owner.login}/repos/${t.repository.name}/pull-requests/${t.id}/decline`,body:JSON.stringify({version:t.version}),headers:{...this.getRequestHeaders(e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not close pull request")}async mergePullRequest(s,e={}){let{pullRequest:t,mergeStrategyId:n}=s;if(s.mergeStrategy)throw new Error('Bitbucket Server uses "mergeStrategyId" instead of "mergeStrategy".');if(t.version===void 0)throw new Error('Bitbucket Server requires "version" for this function.');if(!(await this.config.request({method:"POST",url:`${this.getBaseUrl(e)}/projects/${t.repository.owner.login}/repos/${t.repository.name}/pull-requests/${t.id}/merge`,body:JSON.stringify({strategyId:n,version:t.version}),headers:{...this.getRequestHeaders(e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not merge pull request")}async getMergeStrategies(s={}){let e=await this.config.request({url:`${this.getBaseUrl(s)}/admin/pull-requests/git`,headers:{...this.getRequestHeaders(s),"Content-Type":"application/json"}});return{data:{defaultStrategy:e.body.mergeConfig.defaultStrategy,strategies:e.body.mergeConfig.strategies}}}async setPullRequestReviewers(s,e={}){let{pullRequest:t,reviewers:n}=s;if(t.version===void 0)throw new Error('Bitbucket Server requires "version" for this function.');let o={reviewers:n.map(a=>{if(a.username)throw new Error('Bitbucket Server reviewer requires "username" for this function.');return{user:{name:a.username}}}),version:t.version};if(!(await this.config.request({method:"PUT",url:`${this.getBaseUrl(e)}/projects/${t.repository.owner.login}/repos/${t.repository.name}/pull-requests/${t.id}`,body:JSON.stringify(o),headers:{...this.getRequestHeaders(e),"Content-Type":"application/json"}})).body.title)throw new Error("Could not set pull request reviewers")}async getAccountsForProject(s,e={}){let t=new URL(`${this.getBaseUrl(e)}/projects/${encodeURI(s.project)}/permissions/users`);t.searchParams.set("start",s.page?.toString()||"0"),t.searchParams.set("limit","50");let n=await this.config.request({url:t.toString(),headers:this.getRequestHeaders(e)}),o=n.body.values.length!==0;return{pageInfo:{hasNextPage:o,nextPage:o?n.body.start+n.body.values.length:null},data:n.body.values.map(i=>ie(i.user))}}};var Ft=require("js-base64");var fe=(e=>(e.Open="OPEN",e.Closed="CLOSED",e))(fe||{});var f=class extends Error{constructor(e,t){let n=t?.map(i=>`'${i.message}'`).join(", "),o=n?`${e}: ${n}`:e;super(o);this.graphQLErrors=t??[]}};var $r={AS_CODE_OWNER:[3,0,0],CHECK_RUN:[3,0,0],LATEST_REVIEWS:[3,0,0],VIEWER_CAN_MERGE_AS_ADMIN:[3,5,0],ISSUE_FULL_DATABASE_ID:[3,12,0],PR_FULL_DATABASE_ID:[3,13,0],PR_REVIEW_FULL_DATABASE_ID:[3,13,0],PR_REVIEW_COMMENT_FULL_DATABASE_ID:[3,13,0]},Tt=15,Ot=100,C=r=>!!r,O=(r,s)=>{let e=$r[s];for(let t=0;t<3;t++){if(r[t]>e[t])return!0;if(r[t]<e[t])return!1}return!0},Ie="https://api.github.com",Ur=`${Ie}/graphql`,be=`
|
|
2
2
|
description
|
|
3
3
|
dueOn
|
|
4
4
|
id
|
|
@@ -6,7 +6,7 @@ number
|
|
|
6
6
|
state
|
|
7
7
|
title
|
|
8
8
|
url
|
|
9
|
-
`,
|
|
9
|
+
`,Ar=`
|
|
10
10
|
... on CheckRun {
|
|
11
11
|
completedAt
|
|
12
12
|
conclusion
|
|
@@ -15,48 +15,48 @@ url
|
|
|
15
15
|
permalink
|
|
16
16
|
startedAt
|
|
17
17
|
}
|
|
18
|
-
`,
|
|
18
|
+
`,Re=/\/api\/v\d+$/,ye=`
|
|
19
19
|
color
|
|
20
20
|
description
|
|
21
21
|
id
|
|
22
22
|
name
|
|
23
|
-
`,
|
|
23
|
+
`,xt=r=>{if(r.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.")},Gr=(r,s)=>{let e=s.baseUrl||r.baseUrl;return e?(e=e.replace(/\/$/,""),xt(e),Re.test(e)&&(e=e.replace(Re,"")),`${e}/api/graphql`):Ur},X=(r,s)=>{let e=s.baseUrl||r.baseUrl;return e?(e=e.replace(/\/$/,""),xt(e),Re.test(e)&&(e=e.replace(Re,"")),`${e}/api/v3`):Ie},R=(r,s,e)=>{let t=h(e.token||r.token);return t["X-Github-Next-Global-ID"]="1",t["Content-Type"]="application/json",t.Accept="application/vnd.github.merge-info-preview+json",r.request({url:Gr(r,e),method:"POST",headers:t,body:JSON.stringify(s)})},Tr={user:!0,"user:email":!0,"read:user":!0},x=r=>r.some(s=>Tr[s]),$=(r=!1,s=!1,e)=>`
|
|
24
24
|
__typename
|
|
25
|
-
${
|
|
26
|
-
${
|
|
27
|
-
${
|
|
28
|
-
${
|
|
29
|
-
${s?
|
|
30
|
-
${
|
|
31
|
-
${
|
|
32
|
-
`,
|
|
25
|
+
${j(e,["graphQLId"],"id")}
|
|
26
|
+
${j(e,["id"],"databaseId")}
|
|
27
|
+
${j(e,["name"],"name")}
|
|
28
|
+
${j(e,["name","username"],"login")}
|
|
29
|
+
${s?j(e,["email"],"email"):""}
|
|
30
|
+
${j(e,["avatarUrl"],`avatarUrl${r?"(size: $avatarSize)":""}`)}
|
|
31
|
+
${j(e,["url"],"url")}
|
|
32
|
+
`,Or=(r=!1)=>`
|
|
33
33
|
latestReviews(first: 100) {
|
|
34
34
|
nodes {
|
|
35
35
|
author {
|
|
36
36
|
... on User {
|
|
37
|
-
${
|
|
37
|
+
${$(!1,r)}
|
|
38
38
|
}
|
|
39
39
|
... on EnterpriseUserAccount {
|
|
40
|
-
${
|
|
40
|
+
${Ve(!1)}
|
|
41
41
|
}
|
|
42
42
|
}
|
|
43
43
|
state
|
|
44
44
|
}
|
|
45
45
|
}
|
|
46
|
-
`,
|
|
46
|
+
`,kt=(r=!1)=>`
|
|
47
47
|
__typename
|
|
48
48
|
id
|
|
49
49
|
databaseId
|
|
50
50
|
login
|
|
51
51
|
avatarUrl${r?"(size: $avatarSize)":""}
|
|
52
52
|
url
|
|
53
|
-
`,
|
|
53
|
+
`,Ve=(r=!1)=>`
|
|
54
54
|
__typename
|
|
55
55
|
id
|
|
56
56
|
login
|
|
57
57
|
avatarUrl${r?"(size: $avatarSize)":""}
|
|
58
58
|
url
|
|
59
|
-
`,
|
|
59
|
+
`,Pe=(r,s=!1,e)=>`
|
|
60
60
|
id
|
|
61
61
|
${!e||O(e,"PR_FULL_DATABASE_ID")?"fullDatabaseId":"databaseId"}
|
|
62
62
|
number
|
|
@@ -65,13 +65,13 @@ body
|
|
|
65
65
|
state
|
|
66
66
|
author {
|
|
67
67
|
... on User {
|
|
68
|
-
${
|
|
68
|
+
${$(!1,s)}
|
|
69
69
|
}
|
|
70
70
|
... on Bot {
|
|
71
|
-
${
|
|
71
|
+
${kt(!1)}
|
|
72
72
|
}
|
|
73
73
|
... on EnterpriseUserAccount {
|
|
74
|
-
${
|
|
74
|
+
${Ve(!1)}
|
|
75
75
|
}
|
|
76
76
|
}
|
|
77
77
|
commits(last: 1) {
|
|
@@ -84,7 +84,7 @@ commits(last: 1) {
|
|
|
84
84
|
contexts(first: 100) {
|
|
85
85
|
totalCount
|
|
86
86
|
nodes {
|
|
87
|
-
${!e||O(e,"CHECK_RUN")?
|
|
87
|
+
${!e||O(e,"CHECK_RUN")?Ar:""}
|
|
88
88
|
... on StatusContext {
|
|
89
89
|
context
|
|
90
90
|
createdAt
|
|
@@ -146,7 +146,7 @@ closedAt
|
|
|
146
146
|
mergedAt
|
|
147
147
|
assignees(first: 100) {
|
|
148
148
|
nodes {
|
|
149
|
-
${
|
|
149
|
+
${$(!1,s)}
|
|
150
150
|
}
|
|
151
151
|
}
|
|
152
152
|
reviewRequests(first: 100) {
|
|
@@ -154,39 +154,39 @@ reviewRequests(first: 100) {
|
|
|
154
154
|
${!e||O(e,"AS_CODE_OWNER")?"asCodeOwner":""}
|
|
155
155
|
requestedReviewer {
|
|
156
156
|
... on User {
|
|
157
|
-
${
|
|
157
|
+
${$(!1,s)}
|
|
158
158
|
}
|
|
159
159
|
}
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
|
-
${!e||O(e,"LATEST_REVIEWS")?
|
|
162
|
+
${!e||O(e,"LATEST_REVIEWS")?Or(s):""}
|
|
163
163
|
additions
|
|
164
164
|
deletions
|
|
165
165
|
changedFiles
|
|
166
166
|
mergeable
|
|
167
167
|
mergeStateStatus
|
|
168
168
|
milestone {
|
|
169
|
-
${
|
|
169
|
+
${be}
|
|
170
170
|
}
|
|
171
171
|
labels(first: 100) {
|
|
172
172
|
nodes {
|
|
173
|
-
${
|
|
173
|
+
${ye}
|
|
174
174
|
}
|
|
175
175
|
}
|
|
176
176
|
${!e||O(e,"VIEWER_CAN_MERGE_AS_ADMIN")?"viewerCanMergeAsAdmin":""}
|
|
177
|
-
`,
|
|
177
|
+
`,xr=(r=!1,s)=>`
|
|
178
178
|
id
|
|
179
179
|
${!s||O(s,"ISSUE_FULL_DATABASE_ID")?"fullDatabaseId":"databaseId"}
|
|
180
180
|
title
|
|
181
181
|
author {
|
|
182
182
|
... on User {
|
|
183
|
-
${
|
|
183
|
+
${$(!1,r)}
|
|
184
184
|
}
|
|
185
185
|
... on Bot {
|
|
186
|
-
${
|
|
186
|
+
${kt(!1)}
|
|
187
187
|
}
|
|
188
188
|
... on EnterpriseUserAccount {
|
|
189
|
-
${
|
|
189
|
+
${Ve(!1)}
|
|
190
190
|
}
|
|
191
191
|
}
|
|
192
192
|
closedAt
|
|
@@ -210,19 +210,19 @@ comments {
|
|
|
210
210
|
}
|
|
211
211
|
assignees(first: 100) {
|
|
212
212
|
nodes {
|
|
213
|
-
${
|
|
213
|
+
${$(!1,r)}
|
|
214
214
|
}
|
|
215
215
|
}
|
|
216
216
|
state
|
|
217
217
|
milestone {
|
|
218
|
-
${
|
|
218
|
+
${be}
|
|
219
219
|
}
|
|
220
220
|
labels(first: 100) {
|
|
221
221
|
nodes {
|
|
222
|
-
${
|
|
222
|
+
${ye}
|
|
223
223
|
}
|
|
224
224
|
}
|
|
225
|
-
`,
|
|
225
|
+
`,kr={"-linked":"-linked",archived:"archived",assignee:"assignee",author:"author",base:"base",closed:"closed",commenter:"commenter",comments:"comments",created:"created",draft:"draft",head:"head",label:"label",language:"language",linked:"linked",in:"in",interactions:"interactions",involves:"involves",is:"is",mentions:"mentions",merged:"merged",milestone:"milestone",no:"no",org:"org",project:"project",reactions:"reactions",repo:"repo",review:"review","reviewed-by":"reviewed-by","review-requested":"review-requested",state:"state",status:"status",team:"team","team-review-requested":"team-review-requested",type:"type",updated:"updated",user:"user","user-review-requested":"user-review-requested"},Nr=new RegExp('(([^\\s]+:)?\\"(?:[^\\"\\\\]|\\\\.)*\\"?)|([^\\"\\s]+)',"g"),Ke=r=>{let s=[];return(r.match(Nr)??[]).forEach(t=>{if(t.includes(":")&&t!="is:closed"){let n=t.split(":")[0];kr[n]&&s.push(t)}}),s},Xe=(r,s,e,t)=>{let n=r==="issue";return{query:`
|
|
226
226
|
query SearchIssuesOrPullRequests($query: String! $after: String) {
|
|
227
227
|
search(type:ISSUE query:$query first: ${t.maxPageSize} after:$after) {
|
|
228
228
|
pageInfo {
|
|
@@ -231,18 +231,18 @@ query SearchIssuesOrPullRequests($query: String! $after: String) {
|
|
|
231
231
|
}
|
|
232
232
|
nodes {
|
|
233
233
|
... on ${n?"Issue":"PullRequest"} {
|
|
234
|
-
${n?
|
|
234
|
+
${n?xr(t.supportsEmail,t.enterpriseVersion??null):Pe(t.supportsDrafts??!1,t.supportsEmail,t.enterpriseVersion??null)}
|
|
235
235
|
}
|
|
236
236
|
}
|
|
237
237
|
}
|
|
238
|
-
}`,variables:{query:`is:${r} is:open ${t.includeFromArchivedRepos?"":"archived:false"} ${s}`,after:e}}},
|
|
238
|
+
}`,variables:{query:`is:${r} is:open ${t.includeFromArchivedRepos?"":"archived:false"} ${s}`,after:e}}},_r="Field 'isDraft' doesn't exist on type 'PullRequest'",we=(r=[])=>r.some(s=>s?.message===_r),Fr=/@@ -(\d+)(?:,\d+ | )\+(\d+)(?:,\d+ | )@@(?:\\n)?/,Qr=`
|
|
239
239
|
\
|
|
240
|
-
+`,
|
|
240
|
+
+`,Nt=(r,s,e,t)=>{let n=Fr.exec(r);if(!n||!n[0]||!n[1])return[];let o=parseInt(n[1],10),i=parseInt(n[2],10),a=r.replace(Qr,`
|
|
241
241
|
+`).split(`
|
|
242
|
-
`).slice(1),u=o-1,l=
|
|
242
|
+
`).slice(1),u=o-1,l=i-1,p=a.map(g=>{let m,b;switch(g[0]){case"-":{m="DELETED",u+=1,b=`${g.slice(1)}
|
|
243
243
|
`;break}case"+":{m="ADDED",l+=1,b=`${g.slice(1)}
|
|
244
244
|
`;break}default:m="UNMODIFIED",l+=1,u+=1,b=`${g}
|
|
245
|
-
`}return{line:b,oldLineNumber:m!=="ADDED"?u:null,newLineNumber:m!=="DELETED"?l:null,type:m}}),d=e,c=s;if(d!==null&&c!==null&&t!==null&&d<c){let g=0,m=p.length,b=t==="LEFT"?"oldLineNumber":"newLineNumber";for(let I=0;I<p.length;I++){let
|
|
245
|
+
`}return{line:b,oldLineNumber:m!=="ADDED"?u:null,newLineNumber:m!=="DELETED"?l:null,type:m}}),d=e,c=s;if(d!==null&&c!==null&&t!==null&&d<c){let g=0,m=p.length,b=t==="LEFT"?"oldLineNumber":"newLineNumber";for(let I=0;I<p.length;I++){let F=p[I][b];F===d?g=I:F===c&&(m=I)}p=p.slice(g,m+1)}return p};var Ze=`
|
|
246
246
|
id
|
|
247
247
|
databaseId
|
|
248
248
|
owner {
|
|
@@ -255,18 +255,18 @@ defaultBranchRef {
|
|
|
255
255
|
name
|
|
256
256
|
}
|
|
257
257
|
viewerPermission
|
|
258
|
-
`,
|
|
258
|
+
`,tt={__typename:"User",id:"U_kgDNJ5k",databaseId:10137,name:"Deleted user",login:"ghost",email:"",avatarUrl:"https://avatars.githubusercontent.com/u/10137?v=4",url:"https://github.com/ghost"},jr={APPROVED:"APPROVED",CHANGES_REQUESTED:"CHANGES_REQUESTED",COMMENTED:"COMMENTED",REVIEW_REQUESTED:"REVIEW_REQUESTED"},Br={MERGEABLE:"MERGEABLE",CONFLICTING:"CONFLICTS",UNKNOWN:"UNKNOWN"},zr={BEHIND:"BEHIND",BLOCKED:"BLOCKED",UNKNOWN:"UNKNOWN_AND_BLOCKED",UNSTABLE:"UNSTABLE",CLEAN:null,DIRTY:null,DRAFT:null,HAS_HOOKS:null},Mr={OPEN:"OPEN",CLOSED:"CLOSED"},Hr=["ADMIN","MAINTAIN","TRIAGE","WRITE"],rt=r=>({color:`#${r.color}`,description:r.description,graphQLId:r.id,id:null,name:r.name}),Wr=r=>({canCreateWebhook:r==="ADMIN",canPush:r==="ADMIN"||r==="MAINTAIN"||r==="WRITE",isAdmin:r==="ADMIN"}),Ye=r=>({id:r.databaseId.toString(),graphQLId:r.id,namespace:r.owner.login,name:r.name,webUrl:r.url,httpsUrl:r.url.endsWith(".git")?r.url:`${r.url}.git`,sshUrl:r.sshUrl,defaultBranch:r.defaultBranchRef,permissions:Wr(r.viewerPermission)}),Jr=r=>({canCreateWebhook:r.admin,canPush:r.admin||r.maintain||r.push,isAdmin:r.admin}),_t=r=>({id:r.id.toString(),graphQLId:r.node_id,namespace:r.owner.login,name:r.name,webUrl:r.html_url,httpsUrl:r.clone_url,sshUrl:r.ssh_url,defaultBranch:{name:r.default_branch},permissions:Jr(r.permissions)}),Vr=r=>({path:r.path,isDirectory:r.type==="tree"}),Kr={OPEN:"OPEN",CLOSED:"CLOSED",MERGED:"MERGED"},Xr={id:!0,graphQLId:!0,name:!0,username:!0,email:!0,avatarUrl:!0,url:!0},A=(r,s=Xr)=>{let e={};return s.id&&(e.id="databaseId"in r?r.databaseId.toString():r.id),s.graphQLId&&(e.graphQLId=r.id),s.name&&(e.name=r.name??r.login),s.username&&(e.username=r.login),s.email&&(e.email=r.email??null),s.avatarUrl&&(e.avatarUrl=r.avatarUrl),s.url&&(e.url=r.url),e},Zr=(r,s)=>{let e={IN_PROGRESS:"RUNNING",PENDING:"PENDING",QUEUED:"PENDING",REQUESTED:"PENDING",WAITING:"PENDING"};return r!=="COMPLETED"?e[r]:{ACTION_REQUIRED:"ACTION_REQUIRED",CANCELLED:"CANCELLED",FAILURE:"FAILED",NEUTRAL:null,SKIPPED:"SKIPPED",STALE:"FAILED",STARTUP_FAILURE:"FAILED",SUCCESS:"SUCCESS",TIMED_OUT:"ERROR"}[s]},Yr=r=>({ERROR:"ERROR",EXPECTED:"PENDING",FAILURE:"FAILED",PENDING:"PENDING",SUCCESS:"SUCCESS"})[r],et=r=>{let s=null;r.author?s=r.author:s=tt;let e=(r.reviewRequests?.nodes||[]).filter(C).filter(i=>!i.asCodeOwner),t=r.headRepository?.url;t&&!t.endsWith(".git")&&(t=`${t}.git`);let n=r.repository?.url;n&&!n.endsWith(".git")&&(n=`${n}.git`);let o=e.filter(i=>i.requestedReviewer&&"__typename"in i.requestedReviewer).map(i=>({reviewer:A(i.requestedReviewer),state:"REVIEW_REQUESTED"})).concat((r.latestReviews?.nodes||[]).filter(C).map(i=>{let a=tt;return i.author&&i.author.__typename&&(a=i.author),{reviewer:A(a),state:jr[i.state]}}));return{id:r.fullDatabaseId!==void 0?r.fullDatabaseId:r.databaseId.toString(),graphQLId:r.id,title:r.title,description:r.body,number:r.number,state:Kr[r.state],commentCount:r.comments.totalCount,upvoteCount:r.reactions.totalCount,author:s&&s.__typename?A(s):null,createdDate:new Date(r.createdAt),isDraft:r.isDraft,repository:{id:r.repository.databaseId.toString(),graphQLId:r.repository.id,name:r.repository.name,owner:{login:r.repository.owner.login},remoteInfo:{cloneUrlHTTPS:n,cloneUrlSSH:r.repository.sshUrl}},headRepository:r.headRepository?{id:r.headRepository.databaseId.toString(),graphQLId:r.headRepository.id,name:r.headRepository.name,owner:{login:r.headRepository.owner.login},remoteInfo:{cloneUrlHTTPS:t,cloneUrlSSH:r.headRepository.sshUrl}}:null,headCommit:{buildStatuses:r.commits.nodes?.filter(C)[0]?.commit.statusCheckRollup?.contexts.nodes?.filter(C).map(i=>"context"in i?{completedAt:null,description:i.description,name:i.context,state:Yr(i.state),startedAt:new Date(i.createdAt),stage:null,url:i.targetUrl}:{completedAt:i.completedAt?new Date(i.completedAt):null,description:null,name:i.name,state:Zr(i.status,i.conclusion),startedAt:i.startedAt?new Date(i.startedAt):null,stage:null,url:i.permalink})??[]},headRef:r.headRef?{name:r.headRef.name,oid:r.headRef.target?.oid??null}:null,baseRef:r.baseRef?{name:r.baseRef.name,oid:r.baseRef.target?.oid??null}:null,url:r.url,updatedDate:new Date(r.updatedAt),closedDate:r.closedAt?new Date(r.closedAt):null,mergedDate:r.mergedAt?new Date(r.mergedAt):null,assignees:r.assignees.nodes?r.assignees.nodes.filter(C).map(i=>A(i)):null,reviews:o,reviewDecision:G(o),additions:r.additions,deletions:r.deletions,fileCount:r.changedFiles,commitCount:r.commits.totalCount,mergeableState:zr[r.mergeStateStatus]??Br[r.mergeable],milestone:r.milestone?st(r.milestone):null,labels:r.labels?.nodes?.filter(C).map(rt)??[],permissions:{canMerge:Hr.includes(r.repository.viewerPermission),canMergeAndBypassProtections:r.viewerCanMergeAsAdmin??!1}}},es=r=>{let{id:s,comments:e,isOutdated:t,isResolved:n,line:o,startLine:i,diffSide:a,originalLine:u,originalStartLine:l,startDiffSide:p}=r,d=e.nodes?.[0];if(!d)return null;let{author:c,body:g,databaseId:m,fullDatabaseId:b,id:I,path:L,publishedAt:F,url:wt}=d,le=o??u,S=i??l,ne=a??p;return{author:c?{avatarUrl:c.avatarUrl,email:null,name:c.login}:null,body:g,createdAt:F?new Date(F):null,diffLines:Nt(d.diffHunk,le,S,ne),id:b??m.toString(),isOutdated:t,isResolved:n,graphQLId:I,threadId:s,filename:L,replies:e.nodes?.filter(C).slice(1).map(ts)??[],url:wt,line:le,startLine:S,side:ne}},ts=r=>({author:r.author?{avatarUrl:r.author.avatarUrl,email:null,name:r.author.login}:null,body:r.body,createdAt:r.publishedAt?new Date(r.publishedAt):null,graphQLId:r.id,id:r.fullDatabaseId??r.databaseId.toString(),url:r.url}),rs=r=>{let s=null;return r.author?s=r.author:s=tt,{id:r.fullDatabaseId!==void 0?r.fullDatabaseId:r.databaseId.toString(),graphQLId:r.id,number:r.number,title:r.title,author:s&&s.__typename?A(s):null,commentCount:r.comments.totalCount,closedDate:r.closedAt?new Date(r.closedAt):null,createdDate:new Date(r.createdAt),description:null,state:{name:Mr[r.state],color:null},type:null,repository:{id:r.repository.databaseId.toString(),graphQLId:r.repository.id,name:r.repository.name,owner:{login:r.repository.owner.login}},url:r.url,updatedDate:new Date(r.updatedAt),assignees:r.assignees.nodes?.filter(C).map(e=>A(e))??[],upvoteCount:r.reactions.totalCount,milestone:r.milestone?st(r.milestone):null,labels:r.labels?.nodes?.filter(C).map(rt)??[]}},st=r=>({id:r.number.toString(),graphQLId:r.id.toString(),number:r.number,title:r.title,description:r.description,isOpen:r.state=="OPEN",url:r.url,startDate:null,dueDate:r.dueOn?new Date(r.dueOn):null}),Z=class extends D{constructor(){super(...arguments);this._scopesCache={};this._enterpriseVersionsCache={}}async getScopes(e){let t=e.token||this.config.token;if(!t)return[];let n=this._scopesCache[t];if(!n){let i=(await R(this.config,{query:"query { rateLimit(dryRun: true) { __typename } }"},e)).headers["x-oauth-scopes"];n=i?i.split(", "):[],this._scopesCache[t]=n}return n}async getEnterpriseVersion(e){let t=e.baseUrl||this.config.baseUrl;if(!t)return null;let n=this._enterpriseVersionsCache[t];if(!n){let o=await this.config.request({url:`${X(this.config,e)}/meta`,headers:h(e.token||this.config.token)});if(!o.body.installed_version)return null;n=o.body.installed_version.split(".").slice(0,3).map(i=>parseInt(i,10)),this._enterpriseVersionsCache[t]=n}return n}getEnterpriseAvatarUrlIfNeeded(e,t,n){let o=n.baseUrl||this.config.baseUrl;return!o||o.startsWith(Ie)?e:t?`https://avatars.githubusercontent.com/u/e?email=${encodeURIComponent(t)}`:""}async getCurrentUser(e={},t={}){if(e.fields&&!e.fields.length)throw new Error('"fields" must contain at least one field or be omitted');let n=Et(e.fields),o=await this.getScopes(t),i=await R(this.config,{query:`
|
|
259
259
|
query getCurrentUser {
|
|
260
260
|
viewer {
|
|
261
|
-
${
|
|
261
|
+
${$(!1,x(o),n)}
|
|
262
262
|
}
|
|
263
263
|
}
|
|
264
|
-
`},t),i
|
|
264
|
+
`},t),a=i.body.data?.viewer;if(!a)throw new f("Current user not found.",i.body.errors);return{data:A(a,n)}}async getAccountsForRepo(e,t={}){let n=await this.getScopes(t),{repo:{namespace:o,name:i},cursor:a}=e,u=await R(this.config,{query:`
|
|
265
265
|
query getAccountsForRepo($owner: String!, $name: String! $cursor: String, $first: Int!) {
|
|
266
266
|
repository(owner: $owner, name: $name) {
|
|
267
267
|
assignableUsers(first: $first, after: $cursor) {
|
|
268
268
|
nodes {
|
|
269
|
-
${
|
|
269
|
+
${$(!1,x(n))}
|
|
270
270
|
}
|
|
271
271
|
pageInfo {
|
|
272
272
|
endCursor
|
|
@@ -275,7 +275,7 @@ query getAccountsForRepo($owner: String!, $name: String! $cursor: String, $first
|
|
|
275
275
|
}
|
|
276
276
|
}
|
|
277
277
|
}
|
|
278
|
-
`,variables:{owner:o,name:
|
|
278
|
+
`,variables:{owner:o,name:i,cursor:a,first:v}},t);if(!u.body.data)throw new f("Could not fetch accounts for repo",u.body.errors);return{pageInfo:u.body.data.repository?.assignableUsers?.pageInfo??{endCursor:null,hasNextPage:!1},data:u.body.data.repository?.assignableUsers?.nodes?.map(l=>A(l))??[]}}async getUserForCommit(e,t={}){let n=await R(this.config,{query:`
|
|
279
279
|
query getUserForCommit(
|
|
280
280
|
$owner: String!
|
|
281
281
|
$name: String!
|
|
@@ -294,7 +294,7 @@ query getUserForCommit(
|
|
|
294
294
|
}
|
|
295
295
|
}
|
|
296
296
|
}
|
|
297
|
-
`,variables:{owner:e.repo.namespace,name:e.repo.name,oid:e.oid,avatarSize:e.avatarSize}},t),o=n.body.data?.repository;if(!o)throw new f("Repository not found.",n.body.errors);let
|
|
297
|
+
`,variables:{owner:e.repo.namespace,name:e.repo.name,oid:e.oid,avatarSize:e.avatarSize}},t),o=n.body.data?.repository;if(!o)throw new f("Repository not found.",n.body.errors);let i=o.object?.author;if(!i)throw new f("Commit not found.",n.body.errors);return{data:{name:i.name,email:i.email,avatarUrl:this.getEnterpriseAvatarUrlIfNeeded(i.avatarUrl,i.email,t)}}}async createCommit(e,t={}){let{commitMessage:n,deletedFiles:o,newOrModifiedFiles:i,repo:a,target:u}=e,l=await R(this.config,{query:`
|
|
298
298
|
mutation createCommitOnBranch(
|
|
299
299
|
$branchName: String!,
|
|
300
300
|
$expectedHeadOid: GitObjectID!,
|
|
@@ -321,23 +321,23 @@ mutation createCommitOnBranch(
|
|
|
321
321
|
}
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
|
-
`,variables:{branchName:u.name,expectedHeadOid:u.oid,fileChanges:{additions:Object.entries(
|
|
324
|
+
`,variables:{branchName:u.name,expectedHeadOid:u.oid,fileChanges:{additions:Object.entries(i).map(([p,d])=>({contents:Ft.Base64.encode(d),path:p})),deletions:o.map(p=>({path:p}))},message:{body:n.description,headline:n.summary},repositoryNameWithOwner:`${a.namespace}/${a.name}`}},t);if(!l.body.data)throw new f("Could not create commit",l.body.errors);return{data:{name:l.body.data.createCommitOnBranch.ref.name,commit:{authoredDate:new Date(l.body.data.createCommitOnBranch.commit.authoredDate),committedDate:new Date(l.body.data.createCommitOnBranch.commit.committedDate),oid:l.body.data.createCommitOnBranch.commit.oid}}}}async getAccountForEmail(e,t={}){let n=await this.getScopes(t),o=await R(this.config,{query:`
|
|
325
325
|
query getAccountForEmail($query: String! $avatarSize: Int) {
|
|
326
326
|
search(query: $query, type: USER, first: 1) {
|
|
327
327
|
nodes {
|
|
328
328
|
... on User {
|
|
329
|
-
${
|
|
329
|
+
${$(!0,x(n))}
|
|
330
330
|
}
|
|
331
331
|
}
|
|
332
332
|
}
|
|
333
333
|
}
|
|
334
|
-
`,variables:{query:`in:email ${e.email}`,avatarSize:e.avatarSize}},t),
|
|
334
|
+
`,variables:{query:`in:email ${e.email}`,avatarSize:e.avatarSize}},t),i=o.body.data?.search?.nodes?.[0];if(!i)throw new f("Could not find user via email",o.body.errors);return{data:A({...i,avatarUrl:this.getEnterpriseAvatarUrlIfNeeded(i.avatarUrl,i.email,t)})}}async getAccountForUsername(e,t={}){let n=await this.getScopes(t),o=await R(this.config,{query:`
|
|
335
335
|
query getUserForUsername($login: String! $avatarSize: Int) {
|
|
336
336
|
user(login: $login) {
|
|
337
|
-
${
|
|
337
|
+
${$(!0,x(n))}
|
|
338
338
|
}
|
|
339
339
|
}
|
|
340
|
-
`,variables:{login:e.username,avatarSize:e.avatarSize}},t),
|
|
340
|
+
`,variables:{login:e.username,avatarSize:e.avatarSize}},t),i=o.body.data?.user;if(!i)throw new f("Could not find user via username",o.body.errors);return{data:A({...i,avatarUrl:this.getEnterpriseAvatarUrlIfNeeded(i.avatarUrl,i.email,t)})}}async getOrgsForCurrentUser(e={},t={}){let n=await R(this.config,{query:`
|
|
341
341
|
query getOrgsForCurrentUser($cursor: String, $first: Int!) {
|
|
342
342
|
viewer {
|
|
343
343
|
organizations(first: $first after: $cursor) {
|
|
@@ -356,7 +356,7 @@ query getOrgsForCurrentUser($cursor: String, $first: Int!) {
|
|
|
356
356
|
}
|
|
357
357
|
}
|
|
358
358
|
}
|
|
359
|
-
`,variables:{cursor:e.cursor,first:
|
|
359
|
+
`,variables:{cursor:e.cursor,first:v}},t);if(!n.body.data)throw new f("Could not fetch orgs for current user",n.body.errors);let o=n.body.data.viewer.organizations.nodes||[];return{pageInfo:n.body.data.viewer.organizations.pageInfo,data:o.map(i=>({id:i.databaseId.toString(),graphQLId:i.id,username:i.login,name:i.name||null,email:i.email||null,avatarUrl:i.avatarUrl}))}}async getOrgMembers(e,t={}){let n=await R(this.config,{query:`
|
|
360
360
|
query getOrgMember($cursor: String, $first: Int!, $login: String!) {
|
|
361
361
|
viewer {
|
|
362
362
|
organization(login: $login) {
|
|
@@ -366,28 +366,28 @@ query getOrgMember($cursor: String, $first: Int!, $login: String!) {
|
|
|
366
366
|
hasNextPage
|
|
367
367
|
}
|
|
368
368
|
nodes {
|
|
369
|
-
${
|
|
369
|
+
${$(!1,!0)}
|
|
370
370
|
}
|
|
371
371
|
}
|
|
372
372
|
}
|
|
373
373
|
}
|
|
374
374
|
}
|
|
375
|
-
`,variables:{cursor:e.cursor,first:
|
|
375
|
+
`,variables:{cursor:e.cursor,first:v,login:e.org}},t);if(!n.body.data?.viewer.organization?.membersWithRole&&n.body.errors?.length)throw new f("Could not read the members of the organization",n.body.errors);let o=n.body.data?.viewer.organization?.membersWithRole.nodes||[];return{pageInfo:{hasNextPage:n.body.data?.viewer.organization?.membersWithRole.pageInfo.hasNextPage??!1,endCursor:n.body.data?.viewer.organization?.membersWithRole.pageInfo.endCursor??null},data:o.map(i=>A({...i,avatarUrl:this.getEnterpriseAvatarUrlIfNeeded(i.avatarUrl,i.email,t)}))}}async getRepo(e,t={}){let n=await R(this.config,{query:`
|
|
376
376
|
query getRepo($owner: String!, $name: String!) {
|
|
377
377
|
repository(owner: $owner, name: $name) {
|
|
378
|
-
${
|
|
378
|
+
${Ze}
|
|
379
379
|
}
|
|
380
380
|
}
|
|
381
|
-
`,variables:{owner:e.namespace,name:e.name}},t);if(!n.body.data?.repository)throw new f(`Repository ${e.namespace}/${e.name} not found`,n.body.errors);return{data:
|
|
381
|
+
`,variables:{owner:e.namespace,name:e.name}},t);if(!n.body.data?.repository)throw new f(`Repository ${e.namespace}/${e.name} not found`,n.body.errors);return{data:Ye(n.body.data.repository)}}async getRepos(e,t={}){let n=e.map(({namespace:u,name:l},p)=>`
|
|
382
382
|
getRepo_${p}: repository(owner: "${u}", name: "${l}") {
|
|
383
|
-
${
|
|
383
|
+
${Ze}
|
|
384
384
|
}
|
|
385
385
|
`).join(`
|
|
386
386
|
`),o=await R(this.config,{query:`
|
|
387
387
|
query batchGetRepos {
|
|
388
388
|
${n}
|
|
389
389
|
}
|
|
390
|
-
`},t);if(!o.body.data)throw new f("Could not fetch repos",o.body.errors);let
|
|
390
|
+
`},t);if(!o.body.data)throw new f("Could not fetch repos",o.body.errors);let i=[],a=[];return e.forEach((u,l)=>{let p=o.body.data[`getRepo_${l}`];p?i.push(Ye(p)):a.push({input:u})}),{data:i,errors:a}}async fetchMultipleRESTPages(e,t,n,o){let i=[];for(let d=0;d<t;d++)i.push(n(e+d));let a=await Promise.all(i),u=[];for(let d of a){if(!d.body)throw new Error(d.statusText||"Unknown error");u=u.concat(d.body.map(c=>o(c)))}let l=a.every(d=>d.body.length===100),p=e+t;return{data:u,pageInfo:{hasNextPage:l,nextPage:l?p:null}}}async getReposForCurrentUser(e,t={}){if(e.simultaneousPagesToFetch&&e.simultaneousPagesToFetch>40)throw new Error("The argument 'simultaneousPagesToFetch' cannot exceed 40 for 'getReposForCurrentUser'");let n=new URLSearchParams;n.append("per_page","100"),e.affiliations&&n.append("affiliation",e.affiliations.join(","));let o=i=>this.config.request({url:`${X(this.config,t)}/user/repos?${n.toString()}&page=${i}`,headers:{...h(t.token||this.config.token),Accept:"application/vnd.github.raw+json","X-Github-Next-Global-ID":1}});return await this.fetchMultipleRESTPages(e.page??1,e.simultaneousPagesToFetch??4,o,_t)}async getReposForOrg(e,t={}){if(e.simultaneousPagesToFetch&&e.simultaneousPagesToFetch>40)throw new Error("The argument 'simultaneousPagesToFetch' cannot exceed 40 for 'getReposForOrg'");let n=o=>this.config.request({url:`${X(this.config,t)}/orgs/${e.orgName}/repos?per_page=100&page=${o}`,headers:{...h(t.token||this.config.token),Accept:"application/vnd.github.raw+json","X-Github-Next-Global-ID":1}});return await this.fetchMultipleRESTPages(e.page??1,e.simultaneousPagesToFetch??4,n,_t)}async getReposForUsernames(e,t={}){if(!e.usernames.length)return{pageInfo:{endCursor:null,hasNextPage:!1},data:[]};let n=await R(this.config,{query:`
|
|
391
391
|
query getReposForUsernames($query: String!, $cursor: String, $first: Int!) {
|
|
392
392
|
search(query: $query, type: REPOSITORY, first: $first, after: $cursor) {
|
|
393
393
|
pageInfo {
|
|
@@ -396,12 +396,12 @@ query getReposForUsernames($query: String!, $cursor: String, $first: Int!) {
|
|
|
396
396
|
}
|
|
397
397
|
nodes {
|
|
398
398
|
... on Repository {
|
|
399
|
-
${
|
|
399
|
+
${Ze}
|
|
400
400
|
}
|
|
401
401
|
}
|
|
402
402
|
}
|
|
403
403
|
}
|
|
404
|
-
`,variables:{query:`fork:true ${e.usernames.map(
|
|
404
|
+
`,variables:{query:`fork:true ${e.usernames.map(i=>`user:${i}`).join(" ")}`,cursor:e.cursor,first:v}},t);if(!n.body.data)throw new f("Could not fetch repos for usernames",n.body.errors);let o=n.body.data.search.nodes||[];return{pageInfo:n.body.data.search.pageInfo,data:o.map(Ye)}}async getReposForOwners(e,t={}){return this.getReposForUsernames({usernames:e.owners.filter(n=>n.username).map(n=>n.username),cursor:e.cursor},t)}async getRefs(e,t,n={}){let o=await R(this.config,{query:`
|
|
405
405
|
query getRefs($owner: String!, $name: String!, $refPrefix: String!, $cursor: String, $first: Int!) {
|
|
406
406
|
repository(owner: $owner, name: $name) {
|
|
407
407
|
refs(refPrefix: $refPrefix first: $first after: $cursor) {
|
|
@@ -422,7 +422,7 @@ query getRefs($owner: String!, $name: String!, $refPrefix: String!, $cursor: Str
|
|
|
422
422
|
}
|
|
423
423
|
}
|
|
424
424
|
}
|
|
425
|
-
`,variables:{owner:t.repo.namespace,name:t.repo.name,refPrefix:e,cursor:t.cursor,first:
|
|
425
|
+
`,variables:{owner:t.repo.namespace,name:t.repo.name,refPrefix:e,cursor:t.cursor,first:v}},n),i=o.body.data?.repository;if(!i)throw new f("Ref repository not found.",o.body.errors);let a=i.refs;return a?{pageInfo:a.pageInfo,data:(a.nodes||[]).map(u=>{let l=u.target?.oid?u.target:null;return{name:u.name,commit:l?{oid:l.oid,authoredDate:new Date(l.authoredDate),committedDate:new Date(l.committedDate)}:null}})}:{pageInfo:{endCursor:null,hasNextPage:!1},data:[]}}async getBranches(e,t={}){return this.getRefs("refs/heads/",e,t)}async getTags(e,t={}){return this.getRefs("refs/tags/",e,t)}async getBlame(e,t={}){let n=await R(this.config,{query:`
|
|
426
426
|
query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
427
427
|
repository(owner: $owner, name: $name) {
|
|
428
428
|
object(expression: $ref) {
|
|
@@ -461,7 +461,7 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
461
461
|
}
|
|
462
462
|
}
|
|
463
463
|
}
|
|
464
|
-
`,variables:{owner:e.repo.namespace,name:e.repo.name,ref:e.ref,path:e.path}},t),o=n.body.data?.repository;if(!o)throw new f("Blame repository not found.",n.body.errors);let
|
|
464
|
+
`,variables:{owner:e.repo.namespace,name:e.repo.name,ref:e.ref,path:e.path}},t),o=n.body.data?.repository;if(!o)throw new f("Blame repository not found.",n.body.errors);let i=o.object;if(!i||!("blame"in i))throw new f("Ref not found.",n.body.errors);if(i.blame.ranges.length===0)throw new f("File not found.",n.body.errors);return{data:{ranges:i.blame.ranges.map(a=>({startingLine:a.startingLine,endingLine:a.endingLine,commit:{oid:a.commit.oid,parentOids:a.commit.parents.nodes?.map(u=>u.oid)||[],authoredDate:new Date(a.commit.authoredDate),author:a.commit.author?{name:a.commit.author.name,email:a.commit.author.email,avatarUrl:a.commit.author.avatarUrl}:null,committedDate:new Date(a.commit.committedDate),committer:a.commit.committer?{name:a.commit.committer.name,email:a.commit.committer.email,avatarUrl:a.commit.committer.avatarUrl}:null,message:a.commit.message,fileCount:a.commit.changedFilesIfAvailable,additions:a.commit.additions,deletions:a.commit.deletions}}))}}}async getFileContents(e,t={}){let n=await this.config.request({url:`${X(this.config,t)}/repos/${e.repo.namespace}/${e.repo.name}/contents/${encodeURIComponent(e.path)}?ref=${e.ref}`,headers:{...h(t.token||this.config.token),Accept:"application/vnd.github.raw+json"}});if(n.headers["content-type"].startsWith("application/json"))throw new Error(`GitHub: got directory when fetching "${e.path}", getFileContents does not support fetching directories`);if(!n.headers["content-type"].startsWith("application/vnd.github.raw+json"))throw new Error(`GitHub: unsupported content type "${n.headers["content-type"]}" when fetching "${e.path}"`);return{data:new Blob([n.body])}}async searchPullRequests(e,t={}){let n=await this.getEnterpriseVersion(t),o=await this.getScopes(t),i=x(o),a=p=>{let d=p&&typeof e.isDraft=="boolean"?`${e.query} draft:${e.isDraft}`:e.query;return Xe("pr",d,e.cursor,{maxPageSize:e.maxPageSize??Tt,supportsEmail:i,supportsDrafts:p,enterpriseVersion:n,includeFromArchivedRepos:e.includeFromArchivedRepos})},u=await R(this.config,a(!0),t);u.body.errors&&we(u.body.errors)&&(this.config.baseUrl||t.baseUrl)&&(u=await R(this.config,a(!1),t));let{data:l}=u.body;if(!l)throw new f("Could not search pull requests",u.body.errors);return{pageInfo:{hasNextPage:l.search.pageInfo.hasNextPage,endCursor:l.search.pageInfo.endCursor},data:l.search.nodes?.filter(C).map(et)||[]}}async searchIssues(e,t={}){let n=await this.getEnterpriseVersion(t),o=await this.getScopes(t),i=x(o),a=await R(this.config,Xe("issue",e.query,e.cursor,{supportsEmail:i,includeFromArchivedRepos:e.includeFromArchivedRepos,maxPageSize:e.maxPageSize??Ot,enterpriseVersion:n}),t),{data:u}=a.body;if(!u)throw new f("Could not search issues",a.body.errors);return{pageInfo:{hasNextPage:u.search.pageInfo.hasNextPage,endCursor:u.search.pageInfo.endCursor},data:u.search.nodes?.filter(C).map(rs)||[]}}async getPullRequestsAssociatedWithUser(e,t={}){let n=[`involves:${e.username}`];return e.repos?.length&&e.repos.forEach(o=>{n.push(`repo:${o.namespace}/${o.name}`)}),e.labelNames&&e.labelNames.forEach(o=>{n.push(`label:"${o}"`)}),this.searchPullRequests({query:n.join(" "),cursor:e.cursor,includeFromArchivedRepos:e.includeFromArchivedRepos,maxPageSize:e.maxPageSize},t)}async getPullRequestsForRepos(e,t={}){let{assigneeLogins:n,updatedBefore:o,authorLogin:i,repos:a,reviewRequestedLogin:u,startQuery:l,mentionLogin:p,labelNames:d,maxPageSize:c}=e,g=Ke(l||"");return a.forEach(m=>{g.push(`repo:${m.namespace}/${m.name}`)}),n&&n.forEach(m=>{g.push(`assignee:${m}`)}),o&&g.push(`updated:<${o}`),i&&g.push(`author:${i}`),u&&g.push(`review-requested:${u}`),p&&g.push(`mentions:${p}`),d&&d.forEach(m=>{g.push(`label:"${m}"`)}),this.searchPullRequests({query:`sort:updated ${g.join(" ")}`,isDraft:e.isDraft,cursor:e.cursor,includeFromArchivedRepos:e.includeFromArchivedRepos,maxPageSize:c},t)}async getPullRequestForRepo(e,t={}){let n=await this.getEnterpriseVersion(t),o=await this.getScopes(t),i=x(o),a=d=>({query:`query getPullRequest(
|
|
465
465
|
$owner: String!
|
|
466
466
|
$name: String!
|
|
467
467
|
$number: Int!
|
|
@@ -471,24 +471,24 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
471
471
|
name: $name
|
|
472
472
|
) {
|
|
473
473
|
pullRequest(number: $number) {
|
|
474
|
-
${
|
|
474
|
+
${Pe(d,i,n)}
|
|
475
475
|
}
|
|
476
476
|
}
|
|
477
|
-
}`,variables:{owner:e.repo.namespace,name:e.repo.name,number:e.number}}),u=await R(this.config,
|
|
477
|
+
}`,variables:{owner:e.repo.namespace,name:e.repo.name,number:e.number}}),u=await R(this.config,a(!0),t);u.body.errors&&we(u.body.errors)&&(this.config.baseUrl||t.baseUrl)&&(u=await R(this.config,a(!1),t));let{data:l}=u.body;if(!l)throw new f("Could not fetch pull request by number",u.body.errors);let p=u.body.data?.repository.pullRequest;return{data:p?et(p):null}}async getPullRequestByGraphQLId(e,t={}){let n=await this.getEnterpriseVersion(t),o=await this.getScopes(t),i=x(o),a=d=>({query:`query getPullRequest(
|
|
478
478
|
$graphQLId: ID!
|
|
479
479
|
) {
|
|
480
480
|
node(id: $graphQLId) {
|
|
481
481
|
... on PullRequest {
|
|
482
|
-
${
|
|
482
|
+
${Pe(d,i,n)}
|
|
483
483
|
}
|
|
484
484
|
}
|
|
485
|
-
}`,variables:{graphQLId:e.graphQLId}}),u=await R(this.config,
|
|
485
|
+
}`,variables:{graphQLId:e.graphQLId}}),u=await R(this.config,a(!0),t);u.body.errors&&we(u.body.errors)&&(this.config.baseUrl||t.baseUrl)&&(u=await R(this.config,a(!1),t));let{data:l}=u.body;if(!l)throw new f("Could not fetch pull request by id",u.body.errors);let p=u.body.data?.node;return{data:p?et(p):null}}async closePullRequest(e,t={}){let{pullRequest:{graphQLId:n}}=e;if(!n)throw new Error('GitHub requires "graphQLId" for this function.');let o=`mutation ClosePullRequest($pullRequestGraphQLId: ID!) {
|
|
486
486
|
closePullRequest(input: { pullRequestId: $pullRequestGraphQLId }) {
|
|
487
487
|
pullRequest {
|
|
488
488
|
id
|
|
489
489
|
}
|
|
490
490
|
}
|
|
491
|
-
}`,
|
|
491
|
+
}`,i=await R(this.config,{query:`${o}`,variables:{pullRequestGraphQLId:n}},t);if(!i.body.data?.closePullRequest?.pullRequest?.id)throw new f("Could not close pull request",i.body.errors)}async mergePullRequest(e,t={}){let{pullRequest:n,mergeStrategy:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');if(!n.headRef?.oid)throw new Error('GitHub requires "headRef.oid" for this function.');let i;switch(o){case"MERGE_COMMIT":{i="MERGE";break}case"REBASE":{i="REBASE";break}case"SQUASH":{i="SQUASH";break}}let a=`mutation MergePullRequest(
|
|
492
492
|
$pullRequestGraphQLId: ID!,
|
|
493
493
|
$expectedSourceSha: GitObjectID!,
|
|
494
494
|
$mergeStrategy: PullRequestMergeMethod,
|
|
@@ -502,7 +502,7 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
502
502
|
id
|
|
503
503
|
}
|
|
504
504
|
}
|
|
505
|
-
}`,u=await R(this.config,{query:`${
|
|
505
|
+
}`,u=await R(this.config,{query:`${a}`,variables:{pullRequestGraphQLId:n.graphQLId,expectedSourceSha:n.headRef.oid,mergeStrategy:i}},t);if(!u.body.data?.mergePullRequest?.pullRequest?.id)throw new f("Could not merge pull request",u.body.errors)}async approvePullRequest(e,t={}){let{pullRequest:n,comment:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let i=`mutation ApprovePullRequest(
|
|
506
506
|
$pullRequestId: ID!,
|
|
507
507
|
$body: String
|
|
508
508
|
) {
|
|
@@ -515,7 +515,7 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
515
515
|
id
|
|
516
516
|
}
|
|
517
517
|
}
|
|
518
|
-
}`,
|
|
518
|
+
}`,a=await R(this.config,{query:i,variables:{pullRequestId:n.graphQLId,body:o||null}},t);if(!a.body.data?.addPullRequestReview?.pullRequestReview?.id)throw new f("Could not approve pull request",a.body.errors)}async requestPullRequestChanges(e,t={}){let{pullRequest:n,comment:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');if(!o||o.trim()==="")throw new Error("GitHub requires a comment when requesting changes.");let i=`mutation RequestPullRequestChanges(
|
|
519
519
|
$pullRequestId: ID!,
|
|
520
520
|
$body: String!
|
|
521
521
|
) {
|
|
@@ -528,7 +528,7 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
528
528
|
id
|
|
529
529
|
}
|
|
530
530
|
}
|
|
531
|
-
}`,
|
|
531
|
+
}`,a=await R(this.config,{query:i,variables:{pullRequestId:n.graphQLId,body:o}},t);if(!a.body.data?.addPullRequestReview?.pullRequestReview?.id)throw new f("Could not request pull request changes",a.body.errors)}async commentOnPullRequest(e,t={}){let{pullRequest:n,comment:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');if(!o||o.trim()==="")throw new Error("GitHub requires a comment when commenting on a pull request.");let i=`mutation CommentOnPullRequest(
|
|
532
532
|
$pullRequestId: ID!,
|
|
533
533
|
$body: String!
|
|
534
534
|
) {
|
|
@@ -541,13 +541,65 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
541
541
|
id
|
|
542
542
|
}
|
|
543
543
|
}
|
|
544
|
-
}`,
|
|
544
|
+
}`,a=await R(this.config,{query:i,variables:{pullRequestId:n.graphQLId,body:o}},t);if(!a.body.data?.addPullRequestReview?.pullRequestReview?.id)throw new f("Could not comment on pull request",a.body.errors)}async addCommentToPullRequest(e,t={}){let{pullRequest:n,comment:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');if(!o||o.trim()==="")throw new Error("GitHub requires a comment when adding a comment to a pull request.");let i=`mutation AddCommentToPullRequest(
|
|
545
|
+
$subjectId: ID!,
|
|
546
|
+
$body: String!
|
|
547
|
+
) {
|
|
548
|
+
addComment(input: {
|
|
549
|
+
subjectId: $subjectId,
|
|
550
|
+
body: $body
|
|
551
|
+
}) {
|
|
552
|
+
commentEdge {
|
|
553
|
+
node {
|
|
554
|
+
id
|
|
555
|
+
}
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}`,a=await R(this.config,{query:i,variables:{subjectId:n.graphQLId,body:o}},t);if(!a.body.data?.addComment?.commentEdge?.node?.id)throw new f("Could not add comment to pull request",a.body.errors)}async addInlineCommentToPullRequest(e,t={}){let{pullRequest:n,comment:o,path:i,line:a,side:u="RIGHT",threadId:l}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');if(!o?.trim())throw new Error("GitHub requires a comment when adding an inline comment to a pull request.");if(l)return this.addReplyToReviewThread({threadId:l,comment:o},t);if(!i?.trim())throw new Error("GitHub requires a file path when adding an inline comment to a pull request.");if(!Number.isInteger(a)||a<1)throw new Error("GitHub requires a positive line number when adding an inline comment to a pull request.");if(u!=="LEFT"&&u!=="RIGHT")throw new Error('GitHub requires side to be either "LEFT" or "RIGHT".');return this.createReviewThread({pullRequest:n,comment:o,path:i,line:a,side:u},t)}async addReplyToReviewThread(e,t){let{threadId:n,comment:o}=e,i=`mutation AddPullRequestReviewThreadReply(
|
|
559
|
+
$threadId: ID!,
|
|
560
|
+
$body: String!
|
|
561
|
+
) {
|
|
562
|
+
addPullRequestReviewThreadReply(input: {
|
|
563
|
+
pullRequestReviewThreadId: $threadId,
|
|
564
|
+
body: $body
|
|
565
|
+
}) {
|
|
566
|
+
comment {
|
|
567
|
+
id
|
|
568
|
+
}
|
|
569
|
+
}
|
|
570
|
+
}`,a=await R(this.config,{query:i,variables:{threadId:n,body:o}},t);if(!a.body.data?.addPullRequestReviewThreadReply?.comment?.id)throw new f("Could not add reply to pull request review thread",a.body.errors);return n}async createReviewThread(e,t){let{pullRequest:n,comment:o,path:i,line:a,side:u}=e,l=`mutation AddInlineCommentToPullRequest(
|
|
571
|
+
$pullRequestId: ID!,
|
|
572
|
+
$body: String!,
|
|
573
|
+
$path: String!,
|
|
574
|
+
$line: Int!,
|
|
575
|
+
$side: DiffSide
|
|
576
|
+
) {
|
|
577
|
+
addPullRequestReview(input: {
|
|
578
|
+
pullRequestId: $pullRequestId,
|
|
579
|
+
event: COMMENT,
|
|
580
|
+
threads: [{
|
|
581
|
+
path: $path,
|
|
582
|
+
body: $body,
|
|
583
|
+
line: $line,
|
|
584
|
+
side: $side
|
|
585
|
+
}]
|
|
586
|
+
}) {
|
|
587
|
+
pullRequestReview {
|
|
588
|
+
id
|
|
589
|
+
comments(first: 1) {
|
|
590
|
+
nodes {
|
|
591
|
+
id
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}`,p=await R(this.config,{query:l,variables:{pullRequestId:n.graphQLId,body:o,path:i,line:a,side:u}},t);if(!p.body.data?.addPullRequestReview?.pullRequestReview?.id)throw new f("Could not add inline comment to pull request",p.body.errors);return p.body.data?.addPullRequestReview?.pullRequestReview?.comments?.nodes?.[0]?.id}async setPullRequestMilestone(e,t={}){let{pullRequest:n,milestone:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let i=`mutation SetPullRequestMilestone($pullRequestGraphQLId: ID!, $milestoneGraphQLId: ID) {
|
|
545
597
|
updatePullRequest(input: { pullRequestId: $pullRequestGraphQLId, milestoneId: $milestoneGraphQLId }) {
|
|
546
598
|
pullRequest {
|
|
547
599
|
id
|
|
548
600
|
}
|
|
549
601
|
}
|
|
550
|
-
}`,
|
|
602
|
+
}`,a=await R(this.config,{query:`${i}`,variables:{pullRequestGraphQLId:n.graphQLId,milestoneGraphQLId:o?.graphQLId??null}},t);if(!a.body.data?.updatePullRequest?.pullRequest?.id)throw new f("Could not set milestone of pull request",a.body.errors)}async markPullRequestReadyForReview(e,t){let n=`mutation MarkReadyToReview($pullRequestGraphQLId: ID!) {
|
|
551
603
|
markPullRequestReadyForReview(input: { pullRequestId: $pullRequestGraphQLId }) {
|
|
552
604
|
pullRequest {
|
|
553
605
|
id
|
|
@@ -559,25 +611,25 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
559
611
|
id
|
|
560
612
|
}
|
|
561
613
|
}
|
|
562
|
-
}`,o=await R(this.config,{query:n,variables:{pullRequestGraphQLId:e}},t);if(!o.body.data?.convertPullRequestToDraft?.pullRequest?.id)throw new f("Could not convert pull request to draft",o.body.errors)}async setPullRequestAsDraft(e,t={}){let{pullRequest:{graphQLId:n},isDraft:o}=e;if(!n)throw new Error('GitHub requires "graphQLId" for this function.');if(o){await this.convertPullRequestToDraft(n,t);return}await this.markPullRequestReadyForReview(n,t)}async setPullRequestReviewers(e,t={}){let{pullRequest:{reviews:n,graphQLId:o},reviewers:
|
|
614
|
+
}`,o=await R(this.config,{query:n,variables:{pullRequestGraphQLId:e}},t);if(!o.body.data?.convertPullRequestToDraft?.pullRequest?.id)throw new f("Could not convert pull request to draft",o.body.errors)}async setPullRequestAsDraft(e,t={}){let{pullRequest:{graphQLId:n},isDraft:o}=e;if(!n)throw new Error('GitHub requires "graphQLId" for this function.');if(o){await this.convertPullRequestToDraft(n,t);return}await this.markPullRequestReadyForReview(n,t)}async setPullRequestReviewers(e,t={}){let{pullRequest:{reviews:n,graphQLId:o},reviewers:i}=e;if(!n)throw new Error('GitHub requires "reviews" for this function');if(!o)throw new Error('GitHub requires "graphQLId" for this function.');let a=n.filter(d=>d.state!=="REVIEW_REQUESTED").map(d=>{if(!d.reviewer.graphQLId)throw new Error('GitHub requires reviewer "graphQLId" for this function.');return d.reviewer.graphQLId}),u=i.map(d=>{if(!d.graphQLId)throw new Error('GitHub requires reviewer "graphQLId" for this function.');return d.graphQLId}).filter(d=>a.indexOf(d)===-1),l=`mutation SetPullRequestReviewers($pullRequestGraphQLId: ID!, $reviewerGraphQLIds: [ID!]!) {
|
|
563
615
|
requestReviews(input: { pullRequestId: $pullRequestGraphQLId, userIds: $reviewerGraphQLIds }) {
|
|
564
616
|
pullRequest {
|
|
565
617
|
id
|
|
566
618
|
}
|
|
567
619
|
}
|
|
568
|
-
}`,p=await R(this.config,{query:l,variables:{pullRequestGraphQLId:o,reviewerGraphQLIds:u}},t);if(!p.body.data?.requestReviews?.pullRequest?.id)throw new f("Could not set pull request reviewers",p.body.errors)}async reRequestPullRequestReviews(e,t={}){let{pullRequest:{reviews:n,graphQLId:o},reviewers:
|
|
620
|
+
}`,p=await R(this.config,{query:l,variables:{pullRequestGraphQLId:o,reviewerGraphQLIds:u}},t);if(!p.body.data?.requestReviews?.pullRequest?.id)throw new f("Could not set pull request reviewers",p.body.errors)}async reRequestPullRequestReviews(e,t={}){let{pullRequest:{reviews:n,graphQLId:o},reviewers:i}=e;if(!o)throw new Error('GitHub requires "graphQLId" for this function.');if(!n)throw new Error('GitHub requires "reviews" for this function.');let a=[];for(let p of i){if(!p.graphQLId)throw new Error('GitHub requires reviwer "graphQLId" for this function.');if(!n.find(d=>d.reviewer.graphQLId===p.graphQLId))throw new Error("Can only re-request review from existing reviewer.");a.push(p.graphQLId)}let u=`mutation SetPullRequestReviewers($pullRequestGraphQLId: ID!, $reviewerGraphQLIds: [ID!]!) {
|
|
569
621
|
requestReviews(input: { pullRequestId: $pullRequestGraphQLId, userIds: $reviewerGraphQLIds, union: true }) {
|
|
570
622
|
pullRequest {
|
|
571
623
|
id
|
|
572
624
|
}
|
|
573
625
|
}
|
|
574
|
-
}`,l=await R(this.config,{query:u,variables:{pullRequestGraphQLId:o,reviewerGraphQLIds:
|
|
626
|
+
}`,l=await R(this.config,{query:u,variables:{pullRequestGraphQLId:o,reviewerGraphQLIds:a}},t);if(!l.body.data?.requestReviews?.pullRequest?.id)throw new f("Could not re-request pull request reviews",l.body.errors)}async setPullRequestAssignees(e,t={}){let{pullRequest:n,assignees:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let i=o.map(l=>{if(!l.graphQLId)throw new Error('GitHub requires assignee "graphQLId" for this function.');return l.graphQLId}),a=`mutation SetPullRequestAssignees($pullRequestGraphQLId: ID!, $assigneeGraphQLIds: [ID!]!) {
|
|
575
627
|
updatePullRequest(input: { pullRequestId: $pullRequestGraphQLId, assigneeIds: $assigneeGraphQLIds }) {
|
|
576
628
|
pullRequest {
|
|
577
629
|
id
|
|
578
630
|
}
|
|
579
631
|
}
|
|
580
|
-
}`,u=await R(this.config,{query:
|
|
632
|
+
}`,u=await R(this.config,{query:a,variables:{pullRequestGraphQLId:n.graphQLId,assigneeGraphQLIds:i}},t);if(!u.body.data?.updatePullRequest?.pullRequest?.id)throw new f("Could not set pull request assignees",u.body.errors)}async getReviewsForPullRequest(e,t={}){let n=await this.getEnterpriseVersion(t),{repo:{namespace:o,name:i},pullRequestId:a}=e,u=`query getPullRequests(
|
|
581
633
|
$namespace: String!
|
|
582
634
|
$name: String!
|
|
583
635
|
$pullRequestId: Int!
|
|
@@ -589,8 +641,12 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
589
641
|
pullRequest(number: $pullRequestId) {
|
|
590
642
|
reviewThreads(first: 100) {
|
|
591
643
|
nodes {
|
|
644
|
+
id
|
|
592
645
|
isOutdated
|
|
593
646
|
isResolved
|
|
647
|
+
line
|
|
648
|
+
startLine
|
|
649
|
+
diffSide
|
|
594
650
|
originalLine
|
|
595
651
|
originalStartLine
|
|
596
652
|
startDiffSide
|
|
@@ -629,54 +685,54 @@ query getBlame($owner: String!, $name: String!, $ref: String!, $path: String!) {
|
|
|
629
685
|
}
|
|
630
686
|
}
|
|
631
687
|
}
|
|
632
|
-
}`,l=await R(this.config,{query:u,variables:{namespace:o,name:
|
|
688
|
+
}`,l=await R(this.config,{query:u,variables:{namespace:o,name:i,pullRequestId:a}},t),p=l.body.data?.repository.pullRequest.reviewThreads.nodes?.filter(C).reduce((c,g)=>{if(!g.comments.nodes?.[0]?.pullRequestReview)return c;let m=g.comments.nodes[0].pullRequestReview,b=es(g);return b&&(c[m.id]||(c[m.id]=[]),c[m.id].push(b)),c},{})??{};return{data:l.body.data?.repository.pullRequest.reviews.nodes?.filter(C).filter(c=>p[c.id]).map(c=>({author:c.author?{avatarUrl:c.author.avatarUrl,email:null,name:c.author.login}:null,body:c.body,createdAt:c.publishedAt?new Date(c.publishedAt):null,id:c.fullDatabaseId??c.databaseId.toString(),graphQLId:c.id,reviewComments:p[c.id],url:c.url}))??[]}}async getIssuesAssociatedWithUser(e,t={}){let[n,o]=e.cursor?.split(";")||[void 0,void 0],i=[];e.labelNames&&e.labelNames.forEach(c=>{i.push(`label:"${c}"`)});let[a,u]=await Promise.all([n==="null"?null:this.searchIssues({query:`author:${e.username} ${i.join(" ")}`,cursor:n,includeFromArchivedRepos:e.includeFromArchivedRepos,maxPageSize:e.maxPageSize},t),o==="null"?null:this.searchIssues({query:`assignee:${e.username} ${i.join(" ")}`,cursor:o,includeFromArchivedRepos:e.includeFromArchivedRepos,maxPageSize:e.maxPageSize},t)]),l={},p=[],d=c=>{l[c.id]||(l[c.id]=!0,p.push(c))};return a?.data.forEach(d),u?.data.forEach(d),{pageInfo:{hasNextPage:a?.pageInfo.hasNextPage||u?.pageInfo.hasNextPage||!1,endCursor:`${a?.pageInfo.hasNextPage&&a?.pageInfo.endCursor||"null"};${u?.pageInfo.hasNextPage&&u?.pageInfo.endCursor||"null"}`},data:p}}async setPullRequestLabels(e,t={}){let{pullRequest:n,labels:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let i=`mutation SetPullRequestLabels($pullRequestGraphQLId: ID!, $labelGraphQLIds: [ID!]) {
|
|
633
689
|
updatePullRequest(input: { pullRequestId: $pullRequestGraphQLId, labelIds: $labelGraphQLIds }) {
|
|
634
690
|
pullRequest {
|
|
635
691
|
id
|
|
636
692
|
}
|
|
637
693
|
}
|
|
638
|
-
}`,
|
|
694
|
+
}`,a=await R(this.config,{query:i,variables:{pullRequestGraphQLId:n.graphQLId,labelGraphQLIds:o.map(u=>{if(!u.graphQLId)throw new Error('GitHub requires label "graphQLId" for this function.');return u.graphQLId})}},t);if(!a.body.data?.updatePullRequest?.pullRequest?.id)throw new f("Could not set pull request labels",a.body.errors)}async getIssuesForRepos(e,t={}){let n=Ke(e.startQuery||""),{cursor:o,assigneeLogins:i,updatedBefore:a,authorLogin:u,mentionLogin:l,labelNames:p}=e;return e.repos.forEach(d=>{n.push(`repo:${d.namespace}/${d.name}`)}),i&&i.forEach(d=>{n.push(`assignee:${d}`)}),a&&n.push(`updated:<${a}`),u&&n.push(`author:${u}`),l&&n.push(`mentions:${l}`),p&&p.forEach(d=>{n.push(`label:"${d}"`)}),this.searchIssues({query:`sort:updated ${n.join(" ")}`,cursor:o,includeFromArchivedRepos:e.includeFromArchivedRepos,maxPageSize:e.maxPageSize},t)}async closeIssueWithReason(e,t={}){let{issue:n,reason:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let i=`mutation CloseIssueWithReason($issueGraphQLId: ID!, $reason: IssueClosedStateReason!) {
|
|
639
695
|
closeIssue(input: { issueId: $issueGraphQLId, stateReason: $reason }) {
|
|
640
696
|
issue {
|
|
641
697
|
id
|
|
642
698
|
}
|
|
643
699
|
}
|
|
644
|
-
}`,
|
|
700
|
+
}`,a=await R(this.config,{query:i,variables:{issueGraphQLId:n.graphQLId,reason:o}},t);if(!a.body.data?.closeIssue?.issue?.id)throw new f("Could not close issue with reason",a.body.errors)}async closeIssue(e,t={}){let{issue:n}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let o=`mutation SetIssueState($issueGraphQLId: ID!) {
|
|
645
701
|
updateIssue(input: { id: $issueGraphQLId, state: CLOSED }) {
|
|
646
702
|
issue {
|
|
647
703
|
id
|
|
648
704
|
}
|
|
649
705
|
}
|
|
650
|
-
}`,
|
|
706
|
+
}`,i=await R(this.config,{query:o,variables:{issueGraphQLId:n.graphQLId}},t);if(!i.body.data?.updateIssue?.issue?.id)throw new f("Could not close issue",i.body.errors)}async reOpenIssue(e,t={}){let{issue:n}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let o=`mutation ReOpenIssue($issueGraphQLId: ID!) {
|
|
651
707
|
reopenIssue(input: { issueId: $issueGraphQLId }) {
|
|
652
708
|
issue {
|
|
653
709
|
id
|
|
654
710
|
}
|
|
655
711
|
}
|
|
656
|
-
}`,
|
|
712
|
+
}`,i=await R(this.config,{query:o,variables:{issueGraphQLId:n.graphQLId}},t);if(!i.body.data?.reopenIssue?.issue?.id)throw new f("Could not reopen issue",i.body.errors)}async setIssueLabels(e,t={}){let{issue:n,labels:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let i=o.map(l=>l.graphQLId),a=`mutation SetIssueLabels($issueGraphQLId: ID!, $labelGraphQLIds: [ID!]) {
|
|
657
713
|
updateIssue(input: { id: $issueGraphQLId, labelIds: $labelGraphQLIds }) {
|
|
658
714
|
issue {
|
|
659
715
|
id
|
|
660
716
|
}
|
|
661
717
|
}
|
|
662
|
-
}`,u=await R(this.config,{query:
|
|
718
|
+
}`,u=await R(this.config,{query:a,variables:{issueGraphQLId:n.graphQLId,labelGraphQLIds:i}},t);if(!u.body.data?.updateIssue?.issue?.id)throw new f("Could not set issue labels",u.body.errors)}async setIssueMilestone(e,t={}){let{issue:n,milestone:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');if(o&&!o.graphQLId)throw new Error('GitHub requires milestone "graphQLId" for this function.');let i=`mutation SetIssueMilestone($issueGraphQLId: ID!, $milestoneGraphQLId: ID) {
|
|
663
719
|
updateIssue(input: { id: $issueGraphQLId, milestoneId: $milestoneGraphQLId }) {
|
|
664
720
|
issue {
|
|
665
721
|
id
|
|
666
722
|
}
|
|
667
723
|
}
|
|
668
|
-
}`,
|
|
724
|
+
}`,a=await R(this.config,{query:`${i}`,variables:{issueGraphQLId:n.graphQLId,milestoneGraphQLId:o?.graphQLId??null}},t);if(!a.body.data?.updateIssue?.issue?.id)throw new f("Could not set milestone of issue",a.body.errors)}async setIssueAssignees(e,t={}){let{issue:n,assignees:o}=e;if(!n.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let i=o.map(l=>{if(!l.graphQLId)throw new Error('GitHub requires assignee "graphQLId" for this function.');return l.graphQLId}),a=`mutation SetIssueAssignees($issueGraphQLId: ID!, $assigneeGraphQLIds: [ID!]!) {
|
|
669
725
|
updateIssue(input: { id: $issueGraphQLId, assigneeIds: $assigneeGraphQLIds }) {
|
|
670
726
|
issue {
|
|
671
727
|
id
|
|
672
728
|
}
|
|
673
729
|
}
|
|
674
|
-
}`,u=await R(this.config,{query:
|
|
730
|
+
}`,u=await R(this.config,{query:a,variables:{issueGraphQLId:n.graphQLId,assigneeGraphQLIds:i}},t);if(!u.body.data?.updateIssue?.issue?.id)throw new f("Could not set issue assignees",u.body.errors)}async getMilestonesForRepo(e,t={}){let{repo:{namespace:n,name:o},cursor:i}=e,a=await R(this.config,{query:`
|
|
675
731
|
query getLabelsForRepo($owner: String!, $name: String! $cursor: String, $first: Int!) {
|
|
676
732
|
repository(owner: $owner, name: $name) {
|
|
677
733
|
milestones(first: $first, after: $cursor) {
|
|
678
734
|
nodes {
|
|
679
|
-
${
|
|
735
|
+
${be}
|
|
680
736
|
}
|
|
681
737
|
pageInfo {
|
|
682
738
|
endCursor
|
|
@@ -685,12 +741,12 @@ query getLabelsForRepo($owner: String!, $name: String! $cursor: String, $first:
|
|
|
685
741
|
}
|
|
686
742
|
}
|
|
687
743
|
}
|
|
688
|
-
`,variables:{owner:n,name:o,cursor:
|
|
744
|
+
`,variables:{owner:n,name:o,cursor:i,first:v}},t);if(!a.body.data)throw new f("Could not fetch milestones",a.body.errors);return{pageInfo:a.body.data.repository.milestones?.pageInfo??{endCursor:null,hasNextPage:!1},data:a.body.data.repository.milestones?.nodes?.map(st)??[]}}async getLabelsForRepo(e,t={}){let{repo:{namespace:n,name:o},cursor:i}=e,a=await R(this.config,{query:`
|
|
689
745
|
query getLabelsForRepo($owner: String!, $name: String! $cursor: String, $first: Int!) {
|
|
690
746
|
repository(owner: $owner, name: $name) {
|
|
691
747
|
labels(first: $first, after: $cursor) {
|
|
692
748
|
nodes {
|
|
693
|
-
${
|
|
749
|
+
${ye}
|
|
694
750
|
}
|
|
695
751
|
pageInfo {
|
|
696
752
|
endCursor
|
|
@@ -699,7 +755,7 @@ query getLabelsForRepo($owner: String!, $name: String! $cursor: String, $first:
|
|
|
699
755
|
}
|
|
700
756
|
}
|
|
701
757
|
}
|
|
702
|
-
`,variables:{owner:n,name:o,cursor:
|
|
758
|
+
`,variables:{owner:n,name:o,cursor:i,first:v}},t);if(!a.body.data)throw new f("Could not fetch labels",a.body.errors);return{pageInfo:a.body.data.repository.labels?.pageInfo??{endCursor:null,hasNextPage:!1},data:a.body.data.repository.labels?.nodes?.map(rt)??[]}}async getTreeForRepo(e,t={}){let n=await this.config.request({url:`${X(this.config,t)}/repos/${e.repo.namespace}/${e.repo.name}/git/trees/${e.branch}?recursive=1`,headers:{...h(t.token||this.config.token)}});if(!n.body)throw new Error("Could not fetch trees");return{data:n.body.tree.map(Vr)}}};var ss="https://gitlab.com/api/v4",ns="https://gitlab.com/api/graphql",nt=/\/api\/v\d+$/,Qt=r=>{if(r.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.")},Se=(r,s)=>{let e=s.baseUrl||r.baseUrl;return e?(e=e.replace(/\/$/,""),Qt(e),nt.test(e)||(e=e+"/api/v4"),e):ss},os=(r,s)=>{let e=s.baseUrl||r.baseUrl;return e?(e=e.replace(/\/$/,""),Qt(e),nt.test(e)&&(e=e.replace(nt,"")),`${e}/api/graphql`):ns},y=(r,s,e)=>{let t=h(e.token||r.token);return r.request({url:os(r,e),method:"POST",headers:{...t,"Content-Type":"application/json"},body:JSON.stringify(s)})},ve=r=>r?.map(s=>`"${s.message}"`).join(", ");var lt=r=>r.split("/").slice(0,-1).join("/"),pt=r=>r.split("/").at(-1)??"",qe=r=>({id:r.id.replace(Y,""),graphQLId:r.id,namespace:lt(r.fullPath),name:pt(r.fullPath),webUrl:r.webUrl}),jt=r=>({id:r.id.replace(Y,""),graphQLId:r.id,httpsUrl:r.httpUrlToRepo,namespace:lt(r.fullPath),name:pt(r.fullPath),sshUrl:r.sshUrlToRepo,webUrl:r.webUrl}),is={assigned:"assignedMergeRequests",authored:"authoredMergeRequests",reviewRequested:"reviewRequestedMergeRequests"},as={CAN_BE_MERGED:"MERGEABLE",CANNOT_BE_MERGED:"CONFLICTS",CANNOT_BE_MERGED_RECHECK:"UNKNOWN",UNCHECKED:"UNKNOWN",CHECKING:"UNKNOWN"};var us="gid://gitlab/User/",Y="gid://gitlab/Project/",ls="gid://gitlab/MergeRequest/",ps="gid://gitlab/Issue/",ds="gid://gitlab/ProjectLabel/",cs="gid://gitlab/Milestone/",gs="gid://gitlab/Ci::Build/",dt=`
|
|
703
759
|
description
|
|
704
760
|
dueDate
|
|
705
761
|
id
|
|
@@ -708,7 +764,7 @@ startDate
|
|
|
708
764
|
state
|
|
709
765
|
title
|
|
710
766
|
webPath
|
|
711
|
-
`,
|
|
767
|
+
`,ot=`
|
|
712
768
|
id
|
|
713
769
|
fullPath
|
|
714
770
|
webUrl
|
|
@@ -729,12 +785,12 @@ username
|
|
|
729
785
|
publicEmail
|
|
730
786
|
avatarUrl
|
|
731
787
|
webUrl
|
|
732
|
-
`,
|
|
788
|
+
`,ct=`
|
|
733
789
|
color
|
|
734
790
|
description
|
|
735
791
|
id
|
|
736
792
|
title
|
|
737
|
-
`,
|
|
793
|
+
`,it=`
|
|
738
794
|
author {
|
|
739
795
|
${k}
|
|
740
796
|
}
|
|
@@ -751,7 +807,7 @@ id
|
|
|
751
807
|
iid
|
|
752
808
|
labels {
|
|
753
809
|
nodes {
|
|
754
|
-
${
|
|
810
|
+
${ct}
|
|
755
811
|
}
|
|
756
812
|
}
|
|
757
813
|
state
|
|
@@ -762,9 +818,9 @@ upvotes
|
|
|
762
818
|
userNotesCount
|
|
763
819
|
webUrl
|
|
764
820
|
milestone {
|
|
765
|
-
${
|
|
821
|
+
${dt}
|
|
766
822
|
}
|
|
767
|
-
`,
|
|
823
|
+
`,ms=`
|
|
768
824
|
stages {
|
|
769
825
|
nodes {
|
|
770
826
|
jobs {
|
|
@@ -780,7 +836,7 @@ stages {
|
|
|
780
836
|
name
|
|
781
837
|
}
|
|
782
838
|
}
|
|
783
|
-
`,
|
|
839
|
+
`,Bt=(r,s,e)=>`
|
|
784
840
|
id
|
|
785
841
|
state
|
|
786
842
|
author {
|
|
@@ -825,19 +881,19 @@ reviewers {
|
|
|
825
881
|
mergeStatusEnum
|
|
826
882
|
labels {
|
|
827
883
|
nodes {
|
|
828
|
-
${
|
|
884
|
+
${ct}
|
|
829
885
|
}
|
|
830
886
|
}
|
|
831
887
|
${r?"project { id httpUrlToRepo fullPath sshUrlToRepo webUrl archived } sourceProject { id httpUrlToRepo fullPath sshUrlToRepo webUrl }":""}
|
|
832
|
-
${s?`milestone { ${
|
|
833
|
-
${e?`headPipeline { ${
|
|
834
|
-
`,
|
|
888
|
+
${s?`milestone { ${dt} }`:""}
|
|
889
|
+
${e?`headPipeline { ${ms} }`:""}
|
|
890
|
+
`,B=r=>`${r.namespace}/${r.name}`,hs=r=>`${r.namespace}/${r.name}`,fs=r=>({canCreateWebhook:r.adminOperations,canPush:r.pushCode,isAdmin:r.adminOperations}),at=r=>({id:r.id.replace(Y,""),graphQLId:r.id,namespace:lt(r.fullPath),name:pt(r.fullPath),webUrl:r.webUrl,httpsUrl:r.httpUrlToRepo,sshUrl:r.sshUrlToRepo,defaultBranch:r.repository?.rootRef?{name:r.repository.rootRef}:null,permissions:fs(r.userPermissions)}),Rs=r=>({path:r.path,isDirectory:r.type==="tree"}),Is={opened:"OPEN",merged:"MERGED",closed:"CLOSED"},Mt=(r,s,e)=>!s&&r?.startsWith("/")?`https://gitlab.com${r}`:s&&r?.startsWith("/")&&e?`${e.replace(/\/+?$/,"")}${r}`:r,N=(r,s,e)=>{let t=Mt(r.avatarUrl,s,e);return{id:r.id.replace(us,""),graphQLId:r.id,name:r.name,username:r.username,email:r.publicEmail??null,avatarUrl:t,url:r.webUrl}},gt=r=>({color:r.color,description:r.description,id:r.id.replace(ds,""),graphQLId:r.id,name:r.title}),bs=(r,s)=>r?r==="FAILED"&&s?"WARNING":{CANCELED:"CANCELLED",CREATED:"PENDING",FAILED:"FAILED",MANUAL:"OPTIONAL_ACTION_REQUIRED",PENDING:"PENDING",PREPARING:"RUNNING",RUNNING:"RUNNING",SCHEDULED:"PENDING",SKIPPED:"SKIPPED",SUCCESS:"SUCCESS",WAITING_FOR_CALLBACK:"PENDING",WAITING_FOR_RESOURCE:"PENDING"}[r]:null,ys=(r,s,e)=>{let t={APPROVED:"APPROVED",REQUESTED_CHANGES:"CHANGES_REQUESTED",REVIEWED:"COMMENTED",UNAPPROVED:"REVIEW_REQUESTED",UNREVIEWED:"REVIEW_REQUESTED"};return{reviewer:N(r,s,e),state:r.mergeRequestInteraction?.reviewState?t[r.mergeRequestInteraction.reviewState]:"REVIEW_REQUESTED"}},zt=(r,s,e,t,n)=>{let o=r.reviewers?.nodes?r.reviewers.nodes.map(i=>ys(i,t,n)):null;return{id:r.id.replace(ls,""),graphQLId:r.id,title:r.title,description:r.description,number:parseInt(r.iid,10),state:Is[r.state],commentCount:r.userNotesCount||0,upvoteCount:r.upvotes,author:r.author?N(r.author,t,n):null,createdDate:new Date(r.createdAt),isDraft:r.draft,repository:{id:s.id,graphQLId:s.graphQLId,name:s.name,owner:{login:s.namespace},remoteInfo:s.httpsUrl&&s.sshUrl?{cloneUrlHTTPS:s.httpsUrl,cloneUrlSSH:s.sshUrl}:null},headRepository:e?{id:e.id,graphQLId:e.graphQLId,name:e.name,owner:{login:e.namespace},remoteInfo:{cloneUrlHTTPS:e.httpsUrl,cloneUrlSSH:e.sshUrl}}:null,headCommit:{buildStatuses:r.headPipeline?.stages?.nodes?.flatMap(i=>i.jobs?.nodes?.map(a=>({completedAt:a.finishedAt?new Date(a.finishedAt):null,description:null,name:a.name??null,state:bs(a.status,a.allowFailure),stage:i.name??null,startedAt:new Date(a.createdAt),url:`${s.webUrl}/-/jobs/${a.id.replace(gs,"")}`}))??[])??[]},baseRef:{name:r.targetBranch,oid:r.diffRefs?.baseSha??null},headRef:{name:r.sourceBranch,oid:r.diffRefs?.headSha??null},url:r.webUrl,updatedDate:new Date(r.updatedAt),closedDate:r.mergedAt?new Date(r.mergedAt):null,mergedDate:r.mergedAt?new Date(r.mergedAt):null,assignees:r.assignees?.nodes?r.assignees.nodes.map(i=>N(i,t,n)):null,reviews:o,reviewDecision:G(o),additions:r.diffStatsSummary?.additions||0,deletions:r.diffStatsSummary?.deletions||0,fileCount:r.diffStatsSummary?.fileCount||0,commitCount:r.commitCount||0,mergeableState:as[r.mergeStatusEnum],milestone:r.milestone?mt(r.milestone,s.webUrl):null,labels:r.labels?.nodes?.map(gt)??[],permissions:null}},ut=(r,s,e,t)=>({author:N(r.author,e,t),assignees:r.assignees.nodes.map(n=>N(n,e,t)),commentCount:r.userNotesCount,closedDate:r.closedAt?new Date(r.closedAt):null,createdDate:new Date(r.createdAt),description:r.description,graphQLId:r.id,id:r.id.replace(ps,""),labels:r.labels?.nodes?.map(gt)??[],number:r.iid,repository:{id:s.id.replace(Y,""),graphQLId:s.id,name:s.name,owner:{login:s.namespace}},updatedDate:new Date(r.updatedAt),upvoteCount:r.upvotes,state:{name:r.state,color:null},type:r.type,title:r.title,url:r.webUrl,milestone:r.milestone?mt(r.milestone,s.webUrl):null}),mt=(r,s)=>({id:r.id.replace(cs,""),graphQLId:r.id,number:parseInt(r.iid,10),title:r.title,description:r.description,isOpen:r.state==="active",url:`${s}/-/${r.webPath.replace(/.+?\/-\//,"")}`,startDate:r.startDate?new Date(r.startDate):null,dueDate:r.dueDate?new Date(r.dueDate):null}),ee=class extends D{getIsSelfHosted(s){return!!s.baseUrl||!!this.config.baseUrl}async getCurrentUser(s={},e={}){let n=(await y(this.config,{query:`
|
|
835
891
|
query getCurrentUser {
|
|
836
892
|
currentUser {
|
|
837
893
|
${k}
|
|
838
894
|
}
|
|
839
895
|
}
|
|
840
|
-
`},e)).body.data?.currentUser;if(!n)throw new Error("Current user not found.");return{data:N(n,this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl)}}async getUserForCommit(s,e={}){let t=
|
|
896
|
+
`},e)).body.data?.currentUser;if(!n)throw new Error("Current user not found.");return{data:N(n,this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl)}}async getUserForCommit(s,e={}){let t=B(s.repo),o=(await y(this.config,{query:`
|
|
841
897
|
query getUserForCommit($fullPath: ID!, $oid: String!) {
|
|
842
898
|
project(fullPath: $fullPath) {
|
|
843
899
|
repository {
|
|
@@ -853,7 +909,7 @@ query getUserForCommit($fullPath: ID!, $oid: String!) {
|
|
|
853
909
|
}
|
|
854
910
|
}
|
|
855
911
|
}
|
|
856
|
-
`,variables:{fullPath:t,oid:s.oid}},e)).body.data?.project?.repository?.tree?.lastCommit;if(!o)throw new Error("Commit not found.");let
|
|
912
|
+
`,variables:{fullPath:t,oid:s.oid}},e)).body.data?.project?.repository?.tree?.lastCommit;if(!o)throw new Error("Commit not found.");let i=Mt(o.author.avatarUrl,this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl);return{data:{name:o.authorName,email:o.authorEmail,avatarUrl:i}}}async getAccountForEmail(s,e={}){let n=(await y(this.config,{query:`
|
|
857
913
|
query getAccountForEmail($email: String!) {
|
|
858
914
|
users(search: $email) {
|
|
859
915
|
nodes {
|
|
@@ -867,7 +923,7 @@ query getAccountForUsername($username: String!) {
|
|
|
867
923
|
${k}
|
|
868
924
|
}
|
|
869
925
|
}
|
|
870
|
-
`,variables:{username:s.username}},e)).body.data?.user;if(!n)throw new Error("User not found.");return{data:N(n,this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl)}}async getAccountsForRepo(s,e={}){let{repo:{namespace:t,name:n},cursor:o}=s,
|
|
926
|
+
`,variables:{username:s.username}},e)).body.data?.user;if(!n)throw new Error("User not found.");return{data:N(n,this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl)}}async getAccountsForRepo(s,e={}){let{repo:{namespace:t,name:n},cursor:o}=s,i=await y(this.config,{query:`
|
|
871
927
|
query getAccountsForRepo(
|
|
872
928
|
$fullPath: ID!
|
|
873
929
|
$after: String
|
|
@@ -888,22 +944,22 @@ query getAccountsForRepo(
|
|
|
888
944
|
}
|
|
889
945
|
}
|
|
890
946
|
}
|
|
891
|
-
`,variables:{fullPath:`${t}/${n}`,after:o}},e),i
|
|
947
|
+
`,variables:{fullPath:`${t}/${n}`,after:o}},e),a=i.body.data?.project?.projectMembers?.nodes?.map(u=>u.user).filter(u=>u!==null);return{pageInfo:i.body.data?.project?.projectMembers?.pageInfo??{endCursor:null,hasNextPage:!1},data:a?.map(u=>N(u,this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl))??[]}}async getRepo(s,e={}){let t=B(s),n=await y(this.config,{query:`
|
|
892
948
|
query getRepo($fullPath: ID!) {
|
|
893
949
|
project(fullPath: $fullPath) {
|
|
894
|
-
${
|
|
950
|
+
${ot}
|
|
895
951
|
}
|
|
896
952
|
}
|
|
897
|
-
`,variables:{fullPath:t}},e);if(!n.body.data?.project)throw new Error(`Repository ${t} not found`);return{data:
|
|
953
|
+
`,variables:{fullPath:t}},e);if(!n.body.data?.project)throw new Error(`Repository ${t} not found`);return{data:at(n.body.data.project)}}async getReposBase(s,e={}){let n=s.map(B).map((u,l)=>`
|
|
898
954
|
getRepo_${l}: project(fullPath: "${u}") {
|
|
899
|
-
${
|
|
955
|
+
${ot}
|
|
900
956
|
}
|
|
901
957
|
`).join(`
|
|
902
958
|
`),o=await y(this.config,{query:`
|
|
903
959
|
query batchGetRepos {
|
|
904
960
|
${n}
|
|
905
961
|
}
|
|
906
|
-
`},e);if(!o.body.data)throw new Error(
|
|
962
|
+
`},e);if(!o.body.data)throw new Error(ve(o.body.errors)||o.statusText||"Unknown error");let i=[],a=[];return s.forEach((u,l)=>{let p=o.body.data[`getRepo_${l}`];p?i.push(at(p)):a.push({input:u})}),{data:i,errors:a}}async getRepos(s,e={}){let t=[];for(let i=0;i<s.length;i+=15)t.push(s.slice(i,i+15));return(await Promise.all(t.map(i=>this.getReposBase(i,e)))).reduce((i,a)=>({data:[...i.data,...a.data],errors:[...i.errors,...a.errors]}),{data:[],errors:[]})}async getReposForCurrentUser(s,e={}){let t=await y(this.config,{query:`
|
|
907
963
|
query getReposForCurrentUser($after: String) {
|
|
908
964
|
projects(membership: true first: 100 after: $after) {
|
|
909
965
|
pageInfo {
|
|
@@ -911,11 +967,11 @@ query getReposForCurrentUser($after: String) {
|
|
|
911
967
|
hasNextPage
|
|
912
968
|
}
|
|
913
969
|
nodes {
|
|
914
|
-
${
|
|
970
|
+
${ot}
|
|
915
971
|
}
|
|
916
972
|
}
|
|
917
973
|
}
|
|
918
|
-
`,variables:{after:s.cursor}},e);if(!t.body.data?.projects)throw new Error(
|
|
974
|
+
`,variables:{after:s.cursor}},e);if(!t.body.data?.projects)throw new Error(ve(t.body.errors)||t.statusText||"Unknown error");let n=t.body.data?.projects?.nodes||[];return{pageInfo:t.body.data?.projects?.pageInfo,data:n.map(at)}}async getRefs(s,e,t={}){let n=B(e.repo),o=new URL(`${Se(this.config,t)}/projects/${encodeURIComponent(n)}/repository/${s}`);o.searchParams.set("page",e.page?.toString()||"1"),o.searchParams.set("per_page",v.toString());let i=await this.config.request({url:o.toString(),headers:h(t.token||this.config.token)}),a=i.headers["x-next-page"];return{pageInfo:{hasNextPage:!!a,nextPage:a?parseInt(a,10):null},data:i.body.map(u=>({name:u.name,commit:{oid:u.commit.id,authoredDate:new Date(u.commit.authored_date),committedDate:new Date(u.commit.committed_date)}}))}}async getBranches(s,e={}){return this.getRefs("branches",s,e)}async getTags(s,e={}){return this.getRefs("tags",s,e)}async getBlame(s,e={}){let t=B(s.repo),n=new URL(`${Se(this.config,e)}/projects/${encodeURIComponent(t)}/repository/files/${encodeURIComponent(s.path)}/blame`);n.searchParams.set("ref",s.ref);let o=await this.config.request({url:n.toString(),headers:h(e.token||this.config.token)}),i=0;return{data:{ranges:o.body.map(a=>{let u=i+1;return i+=a.lines.length,{startingLine:u,endingLine:i,commit:{oid:a.commit.id,parentOids:a.commit.parent_ids,authoredDate:new Date(a.commit.authored_date),author:{name:a.commit.author_name,email:a.commit.author_email,avatarUrl:null},committedDate:new Date(a.commit.committed_date),committer:{name:a.commit.committer_name,email:a.commit.committer_email,avatarUrl:null},message:a.commit.message,fileCount:null,additions:null,deletions:null}}})}}}async getPullRequestsForUser(s,e={}){let t="";s.repo?.id?t=`projectId:"${s.repo.id}"`:s.repo?.namespace&&s.repo?.name&&(t=`projectPath:"${s.repo.namespace}/${s.repo.name}"`);let n=is[s.association],o=await y(this.config,{query:`
|
|
919
975
|
query getPullRequestsForUser($username: String! $cursor: String $labelNames: [String!]) {
|
|
920
976
|
user(username: $username) {
|
|
921
977
|
${n}(state:opened first:100 after:$cursor labels: $labelNames${t?` ${t}`:""}) {
|
|
@@ -924,12 +980,12 @@ query getPullRequestsForUser($username: String! $cursor: String $labelNames: [St
|
|
|
924
980
|
hasNextPage
|
|
925
981
|
}
|
|
926
982
|
nodes {
|
|
927
|
-
${
|
|
983
|
+
${Bt(!0,!0,!0)}
|
|
928
984
|
}
|
|
929
985
|
}
|
|
930
986
|
}
|
|
931
987
|
}
|
|
932
|
-
`,variables:{username:s.username,cursor:s.cursor,labelNames:s.labelNames}},e);if(!o.body.data)throw new Error(
|
|
988
|
+
`,variables:{username:s.username,cursor:s.cursor,labelNames:s.labelNames}},e);if(!o.body.data)throw new Error(ve(o.body.errors)||o.statusText||"Unknown error");if(!o.body.data.user)throw new Error("User not found");let i=o.body.data.user[n];if(!i)throw new Error("Unexpected response");return{pageInfo:i.pageInfo,data:i.nodes?.filter(a=>s.includeFromArchivedRepos||!a.project.archived).map(a=>zt(a,jt(a.project),jt(a.sourceProject),this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl))||[]}}async getPullRequestsAssociatedWithUser(s,e={}){let[t,n,o]=s.cursor?.split(";")||[void 0,void 0,void 0],i=t?.split("-")||[],a=n?.split("-")||[],u=o?.split("-")||[],l=[],p=[],d=[],c=0;do{let S=s.repos&&s.repos[c];i[c]==="null"?l.push(null):l.push(this.getPullRequestsForUser({username:s.username,association:"authored",cursor:i[c],includeFromArchivedRepos:s.includeFromArchivedRepos,labelNames:s.labelNames,...S&&{repo:S}},e)),a[c]==="null"?p.push(null):p.push(this.getPullRequestsForUser({username:s.username,association:"assigned",cursor:a[c],includeFromArchivedRepos:s.includeFromArchivedRepos,labelNames:s.labelNames,...S&&{repo:S}},e)),u[c]==="null"?d.push(null):d.push(this.getPullRequestsForUser({username:s.username,association:"reviewRequested",cursor:u[c],includeFromArchivedRepos:s.includeFromArchivedRepos,labelNames:s.labelNames,...S&&{repo:S}},e)),c++}while(c<(s.repos?.length||0));let g=[l,p,d].flat(),m=await Promise.all(g),b={},I=[],L=S=>{b[S.id]||(b[S.id]=!0,I.push(S))},F=!1,le=m.map((S,ne)=>{let oe="";return S&&S.data.forEach(L),S?.pageInfo.hasNextPage?(F=!0,oe+=`${S.pageInfo.endCursor||"null"}`):oe+="null",s.repos?.length&&(ne+1)%s.repos.length!==0?oe+="-":ne+1<m.length&&(oe+=";"),oe}).join("");return{pageInfo:{hasNextPage:F,endCursor:le},data:I}}getVariablesForPullRequests(s){let{updatedBefore:e,isDraft:t,authorLogin:n,assigneeLogins:o,labelNames:i,reviewRequestedLogin:a}=s||{},u={},l=[],p=[],d=(c,g,m)=>{l.push(`$${c}: ${m}`),p.push(`${c}: $${c}`),u[c]=g};return e&&d("updatedBefore",e,"Time"),n&&d("authorUsername",n,"String"),o&&d("assigneeUsername",o[0],"String"),i&&d("labelName",i,"[String]"),t!=null&&d("draft",t,"Boolean"),a&&d("reviewerUsername",a,"String"),{variables:u,variableTypes:l,mergeRequestArguments:p}}async getPullRequestsForRepoBase(s,e={},t){let{cursor:n,repo:o}=s||{},i=B(o),{variables:a,variableTypes:u,mergeRequestArguments:l}=this.getVariablesForPullRequests(s),p={fullPath:i,...a},d=await y(this.config,{query:`
|
|
933
989
|
query getPullRequestsForRepo(
|
|
934
990
|
$fullPath: ID!
|
|
935
991
|
$after: String
|
|
@@ -954,19 +1010,19 @@ query getPullRequestsForRepo(
|
|
|
954
1010
|
hasNextPage
|
|
955
1011
|
}
|
|
956
1012
|
nodes {
|
|
957
|
-
${
|
|
1013
|
+
${Bt(!1,!0,!0)}
|
|
958
1014
|
}
|
|
959
1015
|
}
|
|
960
1016
|
}
|
|
961
1017
|
}
|
|
962
|
-
`,variables:{...p,after:n}},e),c=[],g=d.body.data?.project;if(!t&&g?.archived)return{pageInfo:null,data:[]};let m=
|
|
1018
|
+
`,variables:{...p,after:n}},e),c=[],g=d.body.data?.project;if(!t&&g?.archived)return{pageInfo:null,data:[]};let m=qe(g||{id:"",fullPath:"",webUrl:""});return(g?.mergeRequests?.nodes||[]).forEach(I=>{c.push(zt(I,m,null,this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl))}),{pageInfo:g?.mergeRequests?.pageInfo,data:c}}async getPullRequestsForRepo(s,e={}){return this.getPullRequestsForRepoBase(s,e,!1)}async getPullRequestsForRepos(s,e={}){let{repos:t,assigneeLogins:n,updatedBefore:o,authorLogin:i,labelNames:a,isDraft:u,reviewRequestedLogin:l}=s;return{data:(await Promise.all(t.map(d=>this.getPullRequestsForRepoBase({repo:d,assigneeLogins:n,updatedBefore:o,authorLogin:i,labelNames:a,isDraft:u,reviewRequestedLogin:l},e,s.includeFromArchivedRepos??!1)))).flatMap(d=>d.data)}}async closePullRequest(s,e={}){let{pullRequest:t}=s,n=`mutation ClosePullRequest($fullPath: ID!, $pullRequestId: String!) {
|
|
963
1019
|
mergeRequestUpdate(input: { projectPath: $fullPath, iid: $pullRequestId, state: CLOSED }) {
|
|
964
1020
|
errors,
|
|
965
1021
|
mergeRequest {
|
|
966
1022
|
id
|
|
967
1023
|
}
|
|
968
1024
|
}
|
|
969
|
-
}`,
|
|
1025
|
+
}`,i=(await y(this.config,{query:n,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,pullRequestId:t.number.toString()}},e)).body.data?.mergeRequestUpdate;if(!i?.mergeRequest?.id||i?.errors?.length!==0)throw new Error("Could not close pull request")}async mergePullRequest(s,e={}){let{pullRequest:t,mergeStrategy:n}=s;if(!t.headRef?.oid)throw new Error('GitLab requires "headRef.oid" for this function.');let o=`mutation MergePullRequest(
|
|
970
1026
|
$fullPath: ID!,
|
|
971
1027
|
$pullRequestId: String!,
|
|
972
1028
|
$expectedSourceSha: String!,
|
|
@@ -983,63 +1039,63 @@ query getPullRequestsForRepo(
|
|
|
983
1039
|
id
|
|
984
1040
|
}
|
|
985
1041
|
}
|
|
986
|
-
}`,
|
|
1042
|
+
}`,a=(await y(this.config,{query:o,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,pullRequestId:t.number.toString(),expectedSourceSha:t.headRef.oid,squash:n==="SQUASH"}},e)).body.data?.mergeRequestAccept;if(!a?.mergeRequest?.id||a?.errors?.length!==0)throw new Error("Could not merge pull request")}async setPullRequestMilestone(s,e={}){let{pullRequest:t,milestone:n}=s;if(!t.graphQLId)throw new Error('GitHub requires "graphQLId" for this function.');let o=`mutation SetPullRequestMilestone($fullPath: ID!, $pullRequestId: String!, $milestoneGraphQLId: MilestoneID) {
|
|
987
1043
|
mergeRequestSetMilestone(input: { projectPath: $fullPath, iid: $pullRequestId, milestoneId: $milestoneGraphQLId }) {
|
|
988
1044
|
errors,
|
|
989
1045
|
mergeRequest {
|
|
990
1046
|
id
|
|
991
1047
|
}
|
|
992
1048
|
}
|
|
993
|
-
}`,
|
|
1049
|
+
}`,i=await y(this.config,{query:o,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,pullRequestId:t.number.toString(),milestoneGraphQLId:n?.graphQLId}},e),a=i.body.data?.mergeRequestSetMilestone;if(!a?.mergeRequest?.id||i.body.errors||a?.errors?.length!==0)throw new Error("Could not set milestone of pull request")}async setPullRequestAsDraft(s,e={}){let{pullRequest:t,isDraft:n}=s,o=`mutation MergeRequestSetDraft($fullPath: ID!, $pullRequestId: String!, $isDraft: Boolean!) {
|
|
994
1050
|
mergeRequestSetDraft(input: { projectPath: $fullPath, iid: $pullRequestId, draft: $isDraft }) {
|
|
995
1051
|
errors,
|
|
996
1052
|
mergeRequest {
|
|
997
1053
|
id
|
|
998
1054
|
}
|
|
999
1055
|
}
|
|
1000
|
-
}`,
|
|
1056
|
+
}`,a=(await y(this.config,{query:o,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,pullRequestId:t.number.toString(),isDraft:n}},e)).body.data?.mergeRequestSetDraft;if(!a?.mergeRequest?.id||a?.errors?.length!==0)throw new Error("Could not set pull request as draft")}async setPullRequestReviewers(s,e={}){let{pullRequest:t,reviewers:n}=s,o=n.map(l=>{if(!l.username)throw new Error('GitLab requires reviewer "username" for this function.');return l.username}),i=`mutation MergeRequestSetReviewers($fullPath: ID!, $pullRequestId: String!, $reviewerUsernames: [String!]!) {
|
|
1001
1057
|
mergeRequestSetReviewers(input: { projectPath: $fullPath, iid: $pullRequestId, reviewerUsernames: $reviewerUsernames }) {
|
|
1002
1058
|
errors,
|
|
1003
1059
|
mergeRequest {
|
|
1004
1060
|
id
|
|
1005
1061
|
}
|
|
1006
1062
|
}
|
|
1007
|
-
}`,u=(await y(this.config,{query:
|
|
1063
|
+
}`,u=(await y(this.config,{query:i,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,pullRequestId:t.number.toString(),reviewerUsernames:o}},e)).body.data?.mergeRequestSetReviewers;if(!u?.mergeRequest?.id||u?.errors?.length!==0)throw new Error("Could not set pull request reviewers")}async reRequestPullRequestReview(s,e={}){let{pullRequest:t,reviewer:n}=s;if(!n.graphQLId)throw new Error('GitLab requires reviwer "graphQLId" for this function.');let o=`mutation MergeRequestReviewerRereview($fullPath: ID!, $pullRequestId: String!, $reviewerUserId: UserID!) {
|
|
1008
1064
|
mergeRequestReviewerRereview(input: { projectPath: $fullPath, iid: $pullRequestId, userId: $reviewerUserId }) {
|
|
1009
1065
|
errors,
|
|
1010
1066
|
mergeRequest {
|
|
1011
1067
|
id
|
|
1012
1068
|
}
|
|
1013
1069
|
}
|
|
1014
|
-
}`,
|
|
1070
|
+
}`,a=(await y(this.config,{query:o,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,pullRequestId:t.number.toString(),reviewerUserId:n.graphQLId}},e)).body.data?.mergeRequestReviewerRereview;if(!a?.mergeRequest?.id||a?.errors?.length!==0)throw new Error("Could not set pull request reviewers")}async reRequestPullRequestReviews(s,e={}){let{pullRequest:t,reviewers:n}=s,o=t.reviews;if(!o)throw new Error('GitLab requires "reviews" for this function.');let i=n.filter(a=>o.find(u=>u.reviewer.graphQLId===a.graphQLId));await Promise.all(i.map(a=>this.reRequestPullRequestReview({pullRequest:t,reviewer:a},e)))}async setPullRequestAssignees(s,e={}){let{pullRequest:t,assignees:n}=s,o=n.map(l=>{if(!l.username)throw new Error('GitLab requires assignee "username" for this function.');return l.username}),i=`mutation MergeRequestSetAssignees($fullPath: ID!, $pullRequestId: String!, $assigneeUsernames: [String!]!) {
|
|
1015
1071
|
mergeRequestSetAssignees(input: { projectPath: $fullPath, iid: $pullRequestId, assigneeUsernames: $assigneeUsernames }) {
|
|
1016
1072
|
errors,
|
|
1017
1073
|
mergeRequest {
|
|
1018
1074
|
id
|
|
1019
1075
|
}
|
|
1020
1076
|
}
|
|
1021
|
-
}`,u=(await y(this.config,{query:
|
|
1077
|
+
}`,u=(await y(this.config,{query:i,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,pullRequestId:t.number.toString(),assigneeUsernames:o}},e)).body.data?.mergeRequestSetAssignees;if(!u?.mergeRequest?.id||u?.errors?.length!==0)throw new Error("Could not set pull request assignees")}async setPullRequestLabels(s,e={}){let{pullRequest:t,labels:n}=s,o=n.map(u=>{if(!u.graphQLId)throw new Error('GitLab requires "graphQLId" for labels in this function.');return u.graphQLId}),i=`mutation SetPullRequestLabels($fullPath: ID!, $pullRequestId: String!, $labelGraphQLIds: [LabelID!]!) {
|
|
1022
1078
|
mergeRequestSetLabels(input: { projectPath: $fullPath, iid: $pullRequestId, labelIds: $labelGraphQLIds }) {
|
|
1023
1079
|
mergeRequest {
|
|
1024
1080
|
id
|
|
1025
1081
|
}
|
|
1026
1082
|
}
|
|
1027
|
-
}`;if(!(await y(this.config,{query:
|
|
1083
|
+
}`;if(!(await y(this.config,{query:i,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,pullRequestId:t.number.toString(),labelGraphQLIds:o}},e)).body.data?.mergeRequestSetLabels?.mergeRequest?.id)throw new Error("Could not set pull request labels")}async getIssue(s,e={}){let t=hs(s),n=await y(this.config,{query:`
|
|
1028
1084
|
query GetSingleIssue($projectId: ID!, $issueNumber: String!) {
|
|
1029
1085
|
project(fullPath: $projectId) {
|
|
1030
1086
|
id
|
|
1031
1087
|
fullPath
|
|
1032
1088
|
webUrl
|
|
1033
1089
|
issue(iid: $issueNumber) {
|
|
1034
|
-
${
|
|
1090
|
+
${it}
|
|
1035
1091
|
}
|
|
1036
1092
|
}
|
|
1037
1093
|
}
|
|
1038
|
-
`,variables:{issueNumber:s.number,projectId:t}},e);if(!n.body.data?.project)throw new Error(`Repository ${t} not found`);if(!n.body.data?.project?.issue)throw new Error(`Issue ${s.number} not found`);return{data:
|
|
1094
|
+
`,variables:{issueNumber:s.number,projectId:t}},e);if(!n.body.data?.project)throw new Error(`Repository ${t} not found`);if(!n.body.data?.project?.issue)throw new Error(`Issue ${s.number} not found`);return{data:ut(n.body.data.project.issue,qe(n.body.data.project),this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl)}}getVariablesForIssues(s){let{updatedBefore:e,authorLogin:t,assigneeLogins:n,labelNames:o}=s||{},i={},a=[],u=[],l=(p,d,c)=>{a.push(`$${p}: ${c}`),u.push(`${p}: $${p}`),i[p]=d};return e&&l("updatedBefore",e,"Time"),t&&l("authorUsername",t,"String"),n&&l("assigneeUsername",n[0],"String"),o&&l("labelName",o,"[String]"),{variables:i,variableTypes:a,issueArguments:u}}async getIssuesForRepo(s,e={}){let{cursor:t,repo:n}=s||{},o=B(n),{variables:i,variableTypes:a,issueArguments:u}=this.getVariablesForIssues(s),l={fullPath:o,...i},p=`
|
|
1039
1095
|
query GetIssuesFromProject(
|
|
1040
1096
|
$fullPath: ID!
|
|
1041
1097
|
$after: String
|
|
1042
|
-
${
|
|
1098
|
+
${a.length?a.join(" "):""}
|
|
1043
1099
|
) {
|
|
1044
1100
|
project(
|
|
1045
1101
|
fullPath: $fullPath
|
|
@@ -1055,7 +1111,7 @@ query GetSingleIssue($projectId: ID!, $issueNumber: String!) {
|
|
|
1055
1111
|
${u.length?u.join(" "):""}
|
|
1056
1112
|
) {
|
|
1057
1113
|
nodes {
|
|
1058
|
-
${
|
|
1114
|
+
${it}
|
|
1059
1115
|
}
|
|
1060
1116
|
pageInfo {
|
|
1061
1117
|
endCursor
|
|
@@ -1063,11 +1119,11 @@ query GetSingleIssue($projectId: ID!, $issueNumber: String!) {
|
|
|
1063
1119
|
}
|
|
1064
1120
|
}
|
|
1065
1121
|
}
|
|
1066
|
-
}`,d=await y(this.config,{query:p,variables:{...l,after:t}},e),c=[],g=d.body.data?.project,m=
|
|
1122
|
+
}`,d=await y(this.config,{query:p,variables:{...l,after:t}},e),c=[],g=d.body.data?.project,m=qe(g||{id:"",fullPath:"",webUrl:""});return(g?.issues?.nodes||[]).forEach(I=>{c.push(ut(I,m,this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl))}),{pageInfo:g?.issues?.pageInfo??{endCursor:null,hasNextPage:!1},data:c.sort((I,L)=>(I.updatedDate||I.createdDate).getTime()-(L.updatedDate||L.createdDate).getTime())}}async getIssuesForRepos(s,e={}){let{cursor:t}=s||{},n=s.repoIds.map(g=>g.toString().startsWith(Y)?g:`${Y}${g}`),{variables:o,variableTypes:i,mergeRequestArguments:a}=this.getVariablesForPullRequests(s),u={projectIds:n,...o},l=`
|
|
1067
1123
|
query GetIssuesFromProject(
|
|
1068
1124
|
$projectIds: [ID!]
|
|
1069
1125
|
$after: String
|
|
1070
|
-
${
|
|
1126
|
+
${i.length?i.join(" "):""}
|
|
1071
1127
|
) {
|
|
1072
1128
|
projects(
|
|
1073
1129
|
ids: $projectIds
|
|
@@ -1086,27 +1142,27 @@ query GetSingleIssue($projectId: ID!, $issueNumber: String!) {
|
|
|
1086
1142
|
first: 100
|
|
1087
1143
|
state: opened
|
|
1088
1144
|
sort: UPDATED_DESC
|
|
1089
|
-
${
|
|
1145
|
+
${a.length?a.join(" "):""}
|
|
1090
1146
|
) {
|
|
1091
1147
|
nodes {
|
|
1092
|
-
${
|
|
1148
|
+
${it}
|
|
1093
1149
|
}
|
|
1094
1150
|
}
|
|
1095
1151
|
}
|
|
1096
1152
|
}
|
|
1097
|
-
}`,p=await y(this.config,{query:l,variables:{...u,after:t}},e),d=[];return(p.body.data?.projects?.nodes||[]).forEach(g=>{if(!s.includeFromArchivedRepos&&g.archived)return;let m=
|
|
1153
|
+
}`,p=await y(this.config,{query:l,variables:{...u,after:t}},e),d=[];return(p.body.data?.projects?.nodes||[]).forEach(g=>{if(!s.includeFromArchivedRepos&&g.archived)return;let m=qe(g);(g.issues?.nodes||[]).forEach(I=>d.push(ut(I,m,this.getIsSelfHosted(e),this.config.baseUrl??e.baseUrl)))}),{pageInfo:p.body?.data?.projects?.pageInfo??{endCursor:null,hasNextPage:!1},data:d.sort((g,m)=>(g.updatedDate||g.createdDate).getTime()-(m.updatedDate||m.createdDate).getTime())}}async setIssueState(s,e={}){let{issue:t,state:n}=s;if(!t.repository)throw new Error('GitLab requires "repository" for this function.');let o=`mutation SetIssueState($fullPath: ID!, $issueId: String!, $status: IssueStateEvent!) {
|
|
1098
1154
|
updateIssue(input: { projectPath: $fullPath, iid: $issueId, stateEvent: $status }) {
|
|
1099
1155
|
issue {
|
|
1100
1156
|
id
|
|
1101
1157
|
}
|
|
1102
1158
|
}
|
|
1103
|
-
}`;if(!(await y(this.config,{query:o,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,issueId:t.number,status:n==="OPEN"?"REOPEN":"CLOSE"}},e)).body.data?.updateIssue?.issue?.id)throw new Error("Could not set issue status")}async closeIssue(s,e={}){await this.setIssueState({...s,state:"CLOSED"},e)}async reOpenIssue(s,e={}){await this.setIssueState({...s,state:"OPEN"},e)}async setIssueLabels(s,e={}){let{issue:t,labels:n}=s;if(!t.repository)throw new Error('GitLab requires a "repository" for this function.');let o=n.map(u=>{if(!u.graphQLId)throw new Error('GitLab requires label "graphQLId" for this function.');return u.graphQLId}),
|
|
1159
|
+
}`;if(!(await y(this.config,{query:o,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,issueId:t.number,status:n==="OPEN"?"REOPEN":"CLOSE"}},e)).body.data?.updateIssue?.issue?.id)throw new Error("Could not set issue status")}async closeIssue(s,e={}){await this.setIssueState({...s,state:"CLOSED"},e)}async reOpenIssue(s,e={}){await this.setIssueState({...s,state:"OPEN"},e)}async setIssueLabels(s,e={}){let{issue:t,labels:n}=s;if(!t.repository)throw new Error('GitLab requires a "repository" for this function.');let o=n.map(u=>{if(!u.graphQLId)throw new Error('GitLab requires label "graphQLId" for this function.');return u.graphQLId}),i=`mutation SetIssueLabels($fullPath: ID!, $issueId: String!, $labelGraphQLIds: [ID!]) {
|
|
1104
1160
|
updateIssue(input: { projectPath: $fullPath, iid: $issueId, labelIds: $labelGraphQLIds }) {
|
|
1105
1161
|
issue {
|
|
1106
1162
|
id
|
|
1107
1163
|
}
|
|
1108
1164
|
}
|
|
1109
|
-
}`;if(!(await y(this.config,{query:
|
|
1165
|
+
}`;if(!(await y(this.config,{query:i,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,issueId:t.number,labelGraphQLIds:o}},e)).body.data?.updateIssue?.issue?.id)throw new Error("Could not set issue labels")}async setIssueMilestone(s,e={}){let{issue:t,milestone:n}=s;if(!t.repository)throw new Error('GitLab requires "repository" for this function.');let o=`mutation SetIssueMilestone($fullPath: ID!, $issueId: String!, $milestoneId: ID) {
|
|
1110
1166
|
updateIssue(input: { projectPath: $fullPath, iid: $issueId, milestoneId: $milestoneId }) {
|
|
1111
1167
|
errors
|
|
1112
1168
|
issue {
|
|
@@ -1116,14 +1172,14 @@ query GetSingleIssue($projectId: ID!, $issueNumber: String!) {
|
|
|
1116
1172
|
}
|
|
1117
1173
|
}
|
|
1118
1174
|
}
|
|
1119
|
-
}`,
|
|
1175
|
+
}`,i=await y(this.config,{query:o,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,issueId:t.number,milestoneId:n?.id??null}},e),a=i.body.data?.updateIssue;if(!a?.issue?.id||i.body.errors||a?.errors?.length!==0)throw new Error("Could not set milestone of issue")}async setIssueAssignees(s,e={}){let{issue:t,assignees:n}=s;if(!t.repository)throw new Error('GitLab requires "repository" for this function.');let o=n.map(l=>l.username),i=`mutation SetIssueAssignees($fullPath: ID!, $issueId: String!, $assigneeUsernames: [String!]!) {
|
|
1120
1176
|
issueSetAssignees(input: { projectPath: $fullPath, iid: $issueId, assigneeUsernames: $assigneeUsernames }) {
|
|
1121
1177
|
errors,
|
|
1122
1178
|
issue {
|
|
1123
1179
|
id
|
|
1124
1180
|
}
|
|
1125
1181
|
}
|
|
1126
|
-
}`,u=(await y(this.config,{query:
|
|
1182
|
+
}`,u=(await y(this.config,{query:i,variables:{fullPath:`${t.repository.owner.login}/${t.repository.name}`,issueId:t.number,assigneeUsernames:o}},e)).body.data?.issueSetAssignees;if(!u?.issue?.id||u?.errors?.length!==0)throw new Error("Could not set issue assignees")}async getMilestonesForRepo(s,e={}){let{repo:{namespace:t,name:n},cursor:o}=s,i=await y(this.config,{query:`
|
|
1127
1183
|
query getLabelsForRepo(
|
|
1128
1184
|
$fullPath: ID!
|
|
1129
1185
|
$after: String
|
|
@@ -1134,7 +1190,7 @@ query getLabelsForRepo(
|
|
|
1134
1190
|
webUrl
|
|
1135
1191
|
milestones(after: $after) {
|
|
1136
1192
|
nodes {
|
|
1137
|
-
${
|
|
1193
|
+
${dt}
|
|
1138
1194
|
}
|
|
1139
1195
|
pageInfo {
|
|
1140
1196
|
endCursor
|
|
@@ -1143,7 +1199,7 @@ query getLabelsForRepo(
|
|
|
1143
1199
|
}
|
|
1144
1200
|
}
|
|
1145
1201
|
}
|
|
1146
|
-
`,variables:{fullPath:`${t}/${n}`,after:o}},e);return{pageInfo:
|
|
1202
|
+
`,variables:{fullPath:`${t}/${n}`,after:o}},e);return{pageInfo:i.body.data?.project?.milestones?.pageInfo??{endCursor:null,hasNextPage:!1},data:i.body.data?.project?.milestones?.nodes?.map(a=>mt(a,i.body.data?.project?.webUrl||""))??[]}}async getLabelsForRepo(s,e={}){let{repo:{namespace:t,name:n},cursor:o}=s,i=await y(this.config,{query:`
|
|
1147
1203
|
query getLabelsForRepo(
|
|
1148
1204
|
$fullPath: ID!
|
|
1149
1205
|
$after: String
|
|
@@ -1153,7 +1209,7 @@ query getLabelsForRepo(
|
|
|
1153
1209
|
) {
|
|
1154
1210
|
labels(after: $after) {
|
|
1155
1211
|
nodes {
|
|
1156
|
-
${
|
|
1212
|
+
${ct}
|
|
1157
1213
|
}
|
|
1158
1214
|
pageInfo {
|
|
1159
1215
|
endCursor
|
|
@@ -1162,8 +1218,8 @@ query getLabelsForRepo(
|
|
|
1162
1218
|
}
|
|
1163
1219
|
}
|
|
1164
1220
|
}
|
|
1165
|
-
`,variables:{fullPath:`${t}/${n}`,after:o}},e);return{pageInfo:
|
|
1166
|
-
OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUser())`];a&&a.forEach($=>u.push(`labels = "${$}"`));let l=`${u.join(" AND ")} ORDER BY updated DESC`,p=!o,d=p?Mt:zt,c=new URL(`${B(r,t,o)}${d}`);c.searchParams.set("jql",l),c.searchParams.set("maxResults",ve.toString()),c.searchParams.set("fields",gt.join(",")),c.searchParams.set("expand","transitions"),n&&(p?c.searchParams.set("startAt",n):c.searchParams.set("nextPageToken",n));let g=await r.request({url:c.toString(),headers:h(t.token||r.token)}),m=g.body.issues.map($=>mt($,i,e,o)),b=!1,I="";return p?(b=m.length==ve,I=(parseInt(n??"0",10)+m.length).toString()):(b=!!g.body.nextPageToken,I=g.body.nextPageToken??null),{data:m,pageInfo:{hasNextPage:b,endCursor:I}}},Wt=async(r,s,e,t={})=>{let{cursor:n,resourceId:o,jql:a,fields:i}=s||{},u=[...gt],l=i?.Sprint;l&&u.push(l);let p=!o,d=p?Mt:zt,c=new URL(`${B(r,t,o)}${d}`);c.searchParams.set("jql",a.join(" AND ")),c.searchParams.set("maxResults",ve.toString()),c.searchParams.set("fields",u.join(",")),c.searchParams.set("expand","transitions"),n&&(p?c.searchParams.set("startAt",n):c.searchParams.set("nextPageToken",n));let g=await r.request({url:c.toString(),headers:h(t.token||r.token)}),m=g.body.issues.map($=>mt($,i,e,o)),b=!1,I="";return p?(b=m.length==ve,I=(parseInt(n??"0",10)+m.length).toString()):(b=!!g.body.nextPageToken,I=g.body.nextPageToken??null),{data:m,pageInfo:{hasNextPage:b,endCursor:I}}},De=async(r,s,e,t={})=>{let{assigneeLogins:n,authorLogin:o,mentionLogin:a,labelNames:i,cursor:u,projectKey:l,resourceId:p,fields:d}=s||{},c=[`project = "${l}"`,"statusCategory != Done"];return o&&c.push(`creator in ("${o}")`),n&&n.length!==0&&c.push(`assignee in ("${n.join('", "')}")`),a&&c.push(`comment ~ "${a}"`),i&&i.forEach(g=>c.push(`labels = "${g}"`)),Wt(r,{resourceId:p,jql:c,cursor:u,fields:d},e,t)},$e=async(r,s,e,t={})=>{let{assigneeLogins:n,authorLogin:o,mentionLogin:a,labelNames:i,cursor:u,projectKeys:l,resourceId:p,fields:d}=s||{},g=["("+l.map(m=>`project = "${m}"`).join(" OR ")+")","statusCategory != Done"];return o&&g.push(`creator in ("${o}")`),n&&n.length!==0&&g.push(`assignee in ("${n.join('", "')}")`),a&&g.push(`comment ~ "${a}"`),i&&i.forEach(m=>g.push(`labels = "${m}"`)),Wt(r,{resourceId:p,jql:g,fields:d,cursor:u},e,t)},Ue=async(r,s,e={})=>{let{issue:t,labels:n}=s;if(!t.project)throw new Error('Jira requires a "project" for this function.');let o={fields:{labels:n.map(a=>a.name)}};await r.request({method:"PUT",url:`${B(r,e,t.project.resourceId??void 0)}/rest/api/2/issue/${t.id}`,body:JSON.stringify(o),headers:{...h(e.token||r.token),"Content-Type":"application/json"}})},Ae=async(r,s,e={})=>{let{issue:t,components:n}=s;if(!t.project)throw new Error('Jira requires a "project" for this function.');let o={fields:{components:n.map(a=>({id:a.id}))}};await r.request({method:"PUT",url:`${B(r,e,t.project.resourceId??void 0)}/rest/api/2/issue/${t.id}`,body:JSON.stringify(o),headers:{...h(e.token||r.token),"Content-Type":"application/json"}})},Ge=async(r,s,e={})=>{let{issue:t,status:n}=s;if(!t.project)throw new Error('Jira requires a "project" for this function.');if(!n.id)throw new Error('Jira requires a status "id" for this function.');let o={transition:{id:n.id}};await r.request({method:"POST",url:`${B(r,e,t.project.resourceId??void 0)}/rest/api/2/issue/${t.id}/transitions`,body:JSON.stringify(o),headers:{...h(e.token||r.token),"Content-Type":"application/json"}})},Te=async(r,s,e={})=>{let{resourceId:t,projectIdOrKey:n}=s,o=new URL(`${B(r,e,t)}/rest/api/2/project/${n}/components`);return{data:(await r.request({url:o.toString(),headers:h(e.token||r.token)})).body}};var ae="https://api.atlassian.com/ex/jira",ht=100,ee=class extends U{constructor(){super(...arguments);this._resourceUrlCache={};this._issueFieldsCache={}}async getIssueFieldsForResource(e,t={}){if(!this._issueFieldsCache[e.resourceId]){let n=await Ee(this.config,e,t);this._issueFieldsCache[e.resourceId]=n.reduce((o,a)=>({...o,[a.name]:a.id}),{})}return this._issueFieldsCache[e.resourceId]??null}async getResourceUrl(e,t={}){let n=t.token||this.config.token;if(!n)return null;let o=this._resourceUrlCache[n];return o?o[e.resourceId]??null:(await this.getJiraResourcesForCurrentUser(t),this._resourceUrlCache[n]?.[e.resourceId]??null)}async getCurrentUserForResource(e,t={}){let n=await this.getResourceUrl({resourceId:e.resourceId},t),o=await this.config.request({url:`${t.baseUrl||ae}/${e.resourceId}/rest/api/2/myself`,headers:h(t.token||this.config.token)});return{data:{name:o.body.displayName,email:o.body.emailAddress,avatarUrl:o.body.avatarUrls["48x48"],id:o.body.accountId,username:o.body.displayName,url:n?`${n}/jira/people/${o.body.accountId}`:null}}}async getJiraResourcesForCurrentUser(e={}){let t=await this.config.request({url:`${e.baseUrl||"https://api.atlassian.com/"}/oauth/token/accessible-resources`,headers:h(e.token||this.config.token)}),n=e.token||this.config.token,o=n?this._resourceUrlCache[n]||{}:void 0,a=t.body.map(i=>(o&&(o[i.id]=i.url),{avatarUrl:i.avatarUrl,id:i.id,name:i.name,url:i.url}));return n&&(this._resourceUrlCache[n]=o),{data:a}}async getJiraProjectsForResource(e,t={}){let n=new URL(`${t.baseUrl||ae}/${e.resourceId}/rest/api/2/project/search`);n.searchParams.set("maxResults",ht.toString()),e.cursor&&n.searchParams.set("startAt",e.cursor);let o=await this.config.request({url:n.toString(),headers:h(t.token||this.config.token)});return{pageInfo:{hasNextPage:o.body.values.length!==0,endCursor:(o.body.startAt+o.body.values.length).toString()},data:o.body.values.map(a=>({id:a.id,key:a.key,name:a.name,resourceId:e.resourceId}))}}async getJiraProjectsForResources(e,t={}){let n=[];return await Promise.all(e.resourceIds.map(async o=>{try{return await qt(a=>this.getJiraProjectsForResource({resourceId:o,cursor:a},t))}catch{return[]}})).then((...o)=>{o.forEach(a=>{n=n.concat(...a)})}),{data:n}}async getAccountsForJiraProject(e,t={}){let{resourceId:n,projectKey:o,cursor:a}=e,i=await this.getResourceUrl({resourceId:n},t),u=new URL(`${t.baseUrl||ae}/${n}/rest/api/2/user/assignable/search`);u.searchParams.set("maxResults",ht.toString()),a&&u.searchParams.set("startAt",a),u.searchParams.set("project",o);let l=await this.config.request({url:u.toString(),headers:h(t.token||this.config.token)});return{pageInfo:{hasNextPage:l.body.length!==0,endCursor:((a?parseInt(a):0)+l.body.length).toString()},data:l.body.filter(p=>p.accountType!=="app"&&p.active).map(p=>qe(p,i,!1))}}async getComponentsForJiraProject(e,t={}){return await Te(this.config,e,t)}async getIssue(e,t={}){let n=await this.getIssueFieldsForResource({resourceId:e.resourceId},t),o=await this.getResourceUrl({resourceId:e.resourceId},t);return await Ce(this.config,{...e,fields:n},o,t)}async getIssuesForProject(e,t={}){let n=await this.getIssueFieldsForResource({resourceId:e.resourceId},t),o=await this.getResourceUrl({resourceId:e.resourceId},t);return await De(this.config,{...e,fields:n},o,t)}async getIssuesForProjects(e,t={}){let n=await this.getIssueFieldsForResource({resourceId:e.resourceId},t),o=await this.getResourceUrl({resourceId:e.resourceId},t);return await $e(this.config,{...e,fields:n},o,t)}async getIssuesForResourceForCurrentUser(e,t={}){let n=await this.getIssueFieldsForResource({resourceId:e.resourceId},t),o=await this.getResourceUrl({resourceId:e.resourceId},t);return await Le(this.config,{...e,fields:n},o,t)}async setIssueStatus(e,t={}){await Ge(this.config,e,t)}async setIssueAssignee(e,t={}){let{issue:n,assignee:o}=e;if(!n.project)throw new Error('Jira Cloud requires a "project" for this function.');if(!n.project.resourceId)throw new Error('Jira Cloud requires a project "resourceId" for this function.');let a={accountId:o?.id};await this.config.request({method:"PUT",url:`${t.baseUrl||ae}/${n.project.resourceId}/rest/api/2/issue/${n.id}/assignee`,body:JSON.stringify(a),headers:{...h(t.token||this.config.token),"Content-Type":"application/json"}})}async setIssueComponents(e,t={}){await Ae(this.config,e,t)}async setIssueLabels(e,t={}){await Ue(this.config,e,t)}async getLabelsForResource(e,t={}){let{resourceId:n,cursor:o}=e,a=new URL(`${t.baseUrl||ae}/${n}/rest/api/2/label`);a.searchParams.set("maxResults",ht.toString()),o&&a.searchParams.set("startAt",o);let i=await this.config.request({url:a.toString(),headers:h(t.token||this.config.token)});return{pageInfo:{hasNextPage:!i.body.isLast,endCursor:(i.body.startAt+i.body.values.length).toString()},data:i.body.values.map(u=>({color:null,description:null,id:null,name:u}))}}};var te=class extends L{constructor(){super(...arguments);this._issueFieldsCache={}}async getIssueFieldsForResource(e={}){let t=e?.baseUrl||this.config.baseUrl||"";if(!this._issueFieldsCache[t]){let n=await Ee(this.config,{},e);this._issueFieldsCache[t]=n.reduce((o,a)=>({...o,[a.name]:a.id}),{})}return this._issueFieldsCache[t]??null}async getCurrentUser(e={}){let t=await this.config.request({url:`${e?.baseUrl||this.config.baseUrl}/rest/api/2/myself`,headers:h(e?.token||this.config.token)});return{data:{name:t.body.displayName,email:t.body.emailAddress,avatarUrl:t.body.avatarUrls["48x48"],id:t.body.key,username:t.body.displayName,url:null}}}async getJiraProjects(e={}){return{data:(await this.config.request({url:`${e?.baseUrl||this.config.baseUrl}/rest/api/2/project`,headers:h(e?.token||this.config.token)})).body.map(n=>({id:n.id,name:n.name}))}}async getIssue(e,t={}){let n=e.resourceUrl||t.baseUrl||this.config.baseUrl;if(!n)throw new Error('Jira Server requires a "resourceUrl" or "baseUrl" for this function.');let o=await this.getIssueFieldsForResource(t);return await Ce(this.config,{...e,fields:o},n,t)}async getIssuesForProject(e,t={}){let n=e.resourceUrl||t.baseUrl||this.config.baseUrl;if(!n)throw new Error('Jira Server requires a "resourceUrl" or "baseUrl" for this function.');let o=await this.getIssueFieldsForResource(t);return await De(this.config,{...e,fields:o},n,t)}async getIssuesForProjects(e,t={}){let n=e.resourceUrl||t.baseUrl||this.config.baseUrl;if(!n)throw new Error('Jira Server requires a "resourceUrl" or "baseUrl" for this function.');let o=await this.getIssueFieldsForResource(t);return await $e(this.config,{...e,fields:o},n,t)}async getIssuesForResourceForCurrentUser(e,t={}){let n=e.resourceUrl||t.baseUrl||this.config.baseUrl;if(!n)throw new Error('Jira Server requires a "resourceUrl" or "baseUrl" for this function.');let o=await this.getIssueFieldsForResource(t);return await Le(this.config,{...e,fields:o},n,t)}async setIssueStatus(e,t={}){await Ge(this.config,e,t)}async setIssueLabels(e,t={}){await Ue(this.config,e,t)}async setIssueComponents(e,t={}){await Ae(this.config,e,t)}async getLabels(e={}){return{data:(await this.config.request({url:`${e?.baseUrl||this.config.baseUrl}/rest/api/2/jql/autocompletedata/suggestions?fieldName=labels`,headers:h(e.token||this.config.token)})).body.results.map(({displayName:n})=>({color:null,description:null,id:null,name:n}))}}async getComponentsForJiraProject(e,t={}){return await Te(this.config,e,t)}};var T="https://api.trello.com",Cs=1e3,Ls=r=>({id:r.id,username:r.username,url:r.url,name:r.fullName,email:r.email,avatarUrl:r.avatarUrl}),Ds=(r,s)=>{let e=new Date(1e3*parseInt(r.id.substring(0,8),16));return{id:r.id,commentCount:r.badges.comments,number:r.idShort.toString(),title:r.name,url:r.url,closedDate:null,createdDate:new Date(e.toISOString()),author:null,updatedDate:new Date(r.dateLastActivity),assignees:r.members.map(t=>({id:t.id,username:t.username,name:t.fullName,email:null,avatarUrl:t.avatarUrl,url:null})),description:null,state:s[r.idList??""]?{id:r.idList,name:s[r.idList].name,color:null}:null,type:null,repository:null,upvoteCount:r.badges.votes,labels:r.labels.map(t=>({color:t.color,description:null,id:t.id,name:t.name}))}},re=class extends U{async getCurrentUser(s,e={}){let t=await this.config.request({url:`${e.baseUrl||T}/1/members/me?key=${s.appKey}&token=${e.token||this.config.token}`,headers:h(e.token||this.config.token)});return{data:{name:t.body.fullName,email:t.body.email,avatarUrl:t.body.avatarHash?`https://trello-members.s3.amazonaws.com/${t.body.id}/${t.body.avatarHash}/50.png`:null,id:t.body.id,username:t.body.username,url:t.body.url}}}async getBoardsForCurrentUser(s,e={}){return{data:(await this.config.request({url:`${e.baseUrl||T}/1/members/me/boards?fields=name&key=${s.appKey}&token=${e.token||this.config.token}&filter=open`,headers:h(e.token||this.config.token)})).body.map(n=>({id:n.id,name:n.name}))}}async getListsForTrelloBoard(s,e={}){let{appKey:t,boardId:n}=s;return{data:(await this.config.request({url:`${e.baseUrl||T}/1/boards/${n}/lists?key=${t}&token=${e.token||this.config.token}`,headers:h(e.token||this.config.token)})).body}}async getAccountForId(s,e={}){let{appKey:t,memberId:n}=s,o=await this.config.request({url:`${e.baseUrl||T}/1/members/${n}/?key=${t}&token=${e.token||this.config.token}`});return{data:Ls(o.body)}}async getAccountsForTrelloBoard(s,e={}){let{appKey:t,boardId:n}=s;return{data:(await this.config.request({url:`${e.baseUrl||T}/1/boards/${n}/members?key=${t}&token=${e.token||this.config.token}`,headers:h(e.token||this.config.token)})).body.map(a=>({id:a.id,name:a.fullName,username:a.username,email:null,avatarUrl:null,url:null}))}}async getIssuesForBoard(s,e={}){let t=["-is:archived","sort:edited"],{appKey:n,boardId:o,filterText:a,assigneeLogins:i,labelNamesOrColors:u,trelloBoardListsById:l}=s||{};i&&t.push("@me"),u&&u.forEach(c=>t.push(`label:"${c}"`));let p=`${a?`${a}`:""}${t.join(" ")} board:${o}`;return{data:(await this.config.request({url:`${e.baseUrl||T}/1/search?key=${n}&query=${p}&cards_limit=${Cs}&token=${e.token||this.config.token}&card_members=true`,headers:h(e.token||this.config.token)})).body.cards.map(c=>Ds(c,l||{}))}}async updateIssue(s,e,t,n){return await this.config.request({method:"PUT",url:`${n.baseUrl||T}/1/cards/${e.id}?key=${s}&token=${n.token||this.config.token}&${t}`,headers:h(n.token||this.config.token)})}async setIssueStatus(s,e={}){let{appKey:t,issue:n,status:o}=s;if(!o.id)throw new Error('Trello requires a status "id" for this function.');let a=`idList=${o.id}`;if(!(await this.updateIssue(t,n,a,e)).body.id)throw new Error("Could not set issue status")}async setIssueAssignees(s,e={}){let{appKey:t,issue:n,assignees:o}=s,a=o.map(l=>l.id),i=`idMembers=${encodeURIComponent(a.join(","))}`;if(!(await this.updateIssue(t,n,i,e)).body.id)throw new Error("Could not set issue status")}async setIssueLabels(s,e={}){let{appKey:t,issue:n,labels:o}=s,a=o.map(u=>u.id).join(",");if(!(await this.config.request({method:"PUT",url:`${e.baseUrl||T}/1/cards/${n.id}?key=${t}&token=${e.token||this.config.token}&idLabels=${encodeURIComponent(a)}`,headers:h(e.token||this.config.token)})).body.id)throw new Error("Could not set issue status")}async setIssueArchived(s,e={}){let{appKey:t,issue:n,archived:o}=s;if(!(await this.config.request({method:"PUT",url:`${e.baseUrl||T}/1/cards/${n.id}?key=${t}&token=${e.token||this.config.token}&closed=${o}`,headers:h(e.token||this.config.token)})).body.id)throw new Error("Could not update issue archived status")}async archiveIssue(s,e={}){await this.setIssueArchived({...s,archived:!0},e)}async unArchiveIssue(s,e={}){await this.setIssueArchived({...s,archived:!1},e)}async getLabelsForBoard(s,e={}){let{appKey:t,boardId:n}=s;return{data:(await this.config.request({url:`${e.baseUrl||T}/1/boards/${n}/labels?key=${t}&token=${e.token||this.config.token}`,headers:h(e.token||this.config.token)})).body.map(a=>({color:a.color,description:null,id:a.id,name:a.name}))}}};var Rt=100,Oe=class{constructor(){this.set=new Set;this.arr=[]}push(...s){let e=s.filter(t=>!this.set.has(t.id));this.arr.push(...e),e.forEach(t=>this.set.add(t.id))}get length(){return this.arr.length}get items(){return this.arr}},_=async(r,s,e,t)=>{let n=s.token||r.token;if(!n)throw new Error("Linear API key is required");let o=await r.request({url:"https://api.linear.app/graphql",method:"POST",headers:{Authorization:n,"Content-Type":"application/json"},body:JSON.stringify({query:e,variables:t})});if(o.status>=400)throw new Error(`Linear API request failed: ${o.status} ${o.statusText}`);let a=o.body;if(a.errors)throw new Error(`Linear GraphQL errors: ${a.errors.map(i=>i.message).join(", ")}`);return a.data},ft=r=>r?r instanceof Date?r:new Date(r):null,$s=`
|
|
1221
|
+
`,variables:{fullPath:`${t}/${n}`,after:o}},e);return{pageInfo:i.body.data?.project?.labels?.pageInfo??{endCursor:null,hasNextPage:!1},data:i.body.data?.project?.labels?.nodes?.map(gt)??[]}}async getTreeForRepo(s,e={}){let t=B(s.repo),n=new URL(s.cursor??`${Se(this.config,e)}/projects/${encodeURIComponent(t)}/repository/tree`);n.searchParams.set("per_page","10000"),n.searchParams.set("recursive","true"),n.searchParams.set("pagination","keyset"),n.searchParams.set("ref",s.branch);let o=await this.config.request({url:n.toString(),headers:h(e.token||this.config.token)}),i=o.headers.link;return{data:o.body.map(Rs),pageInfo:{endCursor:i?i.substring(1,i.indexOf(">")):null,hasNextPage:!!i}}}};var Ps="https://api.atlassian.com/ex/jira",Ee=100,ht=["assignee","comment","summary","created","creator","updated","votes","issuetype","status","labels","components","project","fixVersions","description"],Ht="/rest/api/2/search/jql",Wt="/rest/api/2/search",ft=(r,s,e,t)=>{let n=r.fields.assignee,o=!t,i=(r.fields[s?.Sprint??""]??[]).filter(a=>typeof a=="object");return{id:r.id,commentCount:r.fields.comment.comments.length,number:r.key,title:r.fields.summary,url:e?`${e}/browse/${r.key}`:null,closedDate:null,createdDate:new Date(r.fields.created),author:Ce(r.fields.creator,e,o),updatedDate:new Date(r.fields.updated),assignees:n?[Ce(n,e,o)]:[],description:r.fields.description,repository:null,project:{name:r.fields.project.name,resourceId:t??null,key:r.fields.project.key,namespace:null,id:r.fields.project.id},state:qs(r.fields.status),statusTransitions:r.transitions?.map(ws)??[],components:r.fields.components?.map(Ss)??[],type:r.fields.issuetype.name,upvoteCount:r.fields.votes?.votes||0,labels:r.fields.labels?.map(a=>({color:null,description:null,id:null,name:a}))??[],sprints:i.map(Es),fixVersions:r.fields.fixVersions.map(Cs)}},ws=r=>{let s;switch(r.to.statusCategory.name){case"To Do":s="TO_DO";break;case"In Progress":s="IN_PROGRESS";break;default:s="DONE";break}return{name:r.name,id:r.id,to:{id:r.to.id,name:r.to.name,color:r.to.statusCategory.colorName,category:s}}},Ss=r=>({description:r.description??null,id:r.id,name:r.name}),vs=(r,s,e)=>e&&r.name?`${s}/secure/ViewProfile.jspa?name=${encodeURIComponent(r.name)}`:`${s}/jira/people/${r.accountId}`,Ce=(r,s,e)=>({id:(e?r.key:r.accountId)??"",name:r.displayName,email:r.emailAddress,avatarUrl:r.avatarUrls["48x48"],username:r.displayName,url:vs(r,s,e)}),qs=r=>{let s;switch(r.statusCategory.name){case"To Do":s="TO_DO";break;case"In Progress":s="IN_PROGRESS";break;default:s="DONE";break}return{id:r.id,name:r.name,color:r.statusCategory.colorName,category:s}},Es=r=>({id:r.id.toString(),name:r.name,isActive:r.state==="active",startDate:r.startDate?new Date(r.startDate):null,endDate:r.endDate?new Date(r.endDate):null,completedDate:r.completeDate?new Date(r.completeDate):null}),Cs=r=>({id:r.id,description:r.description,name:r.name,archived:r.archived,released:r.released,releaseDate:r.releaseDate?new Date(r.releaseDate):null}),z=(r,s,e)=>e?`${s.baseUrl||Ps}/${e}`:`${s?.baseUrl||r.baseUrl}`,Le=async(r,s,e={})=>{let{resourceId:t}=s;return(await r.request({url:`${z(r,e,t)}/rest/api/2/field`,headers:h(e.token||r.token)})).body},De=async(r,s,e,t={})=>{let{number:n,resourceId:o,fields:i}=s||{},a=await r.request({url:`${z(r,t,o)}/rest/api/2/issue/${n}?fields=${ht.join(",")}&expand=transitions`,headers:h(t.token||r.token)});return{data:ft(a.body,i,e,o)}},$e=async(r,s,e,t={})=>{let{cursor:n,resourceId:o,labelNames:i,fields:a}=s||{},u=["statusCategory != Done",`(creator = currentUser() OR assignee = currentUser()
|
|
1222
|
+
OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUser())`];i&&i.forEach(L=>u.push(`labels = "${L}"`));let l=`${u.join(" AND ")} ORDER BY updated DESC`,p=!o,d=p?Wt:Ht,c=new URL(`${z(r,t,o)}${d}`);c.searchParams.set("jql",l),c.searchParams.set("maxResults",Ee.toString()),c.searchParams.set("fields",ht.join(",")),c.searchParams.set("expand","transitions"),n&&(p?c.searchParams.set("startAt",n):c.searchParams.set("nextPageToken",n));let g=await r.request({url:c.toString(),headers:h(t.token||r.token)}),m=g.body.issues.map(L=>ft(L,a,e,o)),b=!1,I="";return p?(b=m.length==Ee,I=(parseInt(n??"0",10)+m.length).toString()):(b=!!g.body.nextPageToken,I=g.body.nextPageToken??null),{data:m,pageInfo:{hasNextPage:b,endCursor:I}}},Jt=async(r,s,e,t={})=>{let{cursor:n,resourceId:o,jql:i,fields:a}=s||{},u=[...ht],l=a?.Sprint;l&&u.push(l);let p=!o,d=p?Wt:Ht,c=new URL(`${z(r,t,o)}${d}`);c.searchParams.set("jql",i.join(" AND ")),c.searchParams.set("maxResults",Ee.toString()),c.searchParams.set("fields",u.join(",")),c.searchParams.set("expand","transitions"),n&&(p?c.searchParams.set("startAt",n):c.searchParams.set("nextPageToken",n));let g=await r.request({url:c.toString(),headers:h(t.token||r.token)}),m=g.body.issues.map(L=>ft(L,a,e,o)),b=!1,I="";return p?(b=m.length==Ee,I=(parseInt(n??"0",10)+m.length).toString()):(b=!!g.body.nextPageToken,I=g.body.nextPageToken??null),{data:m,pageInfo:{hasNextPage:b,endCursor:I}}},Ue=async(r,s,e,t={})=>{let{assigneeLogins:n,authorLogin:o,mentionLogin:i,labelNames:a,cursor:u,projectKey:l,resourceId:p,fields:d}=s||{},c=[`project = "${l}"`,"statusCategory != Done"];return o&&c.push(`creator in ("${o}")`),n&&n.length!==0&&c.push(`assignee in ("${n.join('", "')}")`),i&&c.push(`comment ~ "${i}"`),a&&a.forEach(g=>c.push(`labels = "${g}"`)),Jt(r,{resourceId:p,jql:c,cursor:u,fields:d},e,t)},Ae=async(r,s,e,t={})=>{let{assigneeLogins:n,authorLogin:o,mentionLogin:i,labelNames:a,cursor:u,projectKeys:l,resourceId:p,fields:d}=s||{},g=["("+l.map(m=>`project = "${m}"`).join(" OR ")+")","statusCategory != Done"];return o&&g.push(`creator in ("${o}")`),n&&n.length!==0&&g.push(`assignee in ("${n.join('", "')}")`),i&&g.push(`comment ~ "${i}"`),a&&a.forEach(m=>g.push(`labels = "${m}"`)),Jt(r,{resourceId:p,jql:g,fields:d,cursor:u},e,t)},Ge=async(r,s,e={})=>{let{issue:t,labels:n}=s;if(!t.project)throw new Error('Jira requires a "project" for this function.');let o={fields:{labels:n.map(i=>i.name)}};await r.request({method:"PUT",url:`${z(r,e,t.project.resourceId??void 0)}/rest/api/2/issue/${t.id}`,body:JSON.stringify(o),headers:{...h(e.token||r.token),"Content-Type":"application/json"}})},Te=async(r,s,e={})=>{let{issue:t,components:n}=s;if(!t.project)throw new Error('Jira requires a "project" for this function.');let o={fields:{components:n.map(i=>({id:i.id}))}};await r.request({method:"PUT",url:`${z(r,e,t.project.resourceId??void 0)}/rest/api/2/issue/${t.id}`,body:JSON.stringify(o),headers:{...h(e.token||r.token),"Content-Type":"application/json"}})},Oe=async(r,s,e={})=>{let{issue:t,status:n}=s;if(!t.project)throw new Error('Jira requires a "project" for this function.');if(!n.id)throw new Error('Jira requires a status "id" for this function.');let o={transition:{id:n.id}};await r.request({method:"POST",url:`${z(r,e,t.project.resourceId??void 0)}/rest/api/2/issue/${t.id}/transitions`,body:JSON.stringify(o),headers:{...h(e.token||r.token),"Content-Type":"application/json"}})},xe=async(r,s,e={})=>{let{resourceId:t,projectIdOrKey:n}=s,o=new URL(`${z(r,e,t)}/rest/api/2/project/${n}/components`);return{data:(await r.request({url:o.toString(),headers:h(e.token||r.token)})).body}};var ae="https://api.atlassian.com/ex/jira",Rt=100,te=class extends U{constructor(){super(...arguments);this._resourceUrlCache={};this._issueFieldsCache={}}async getIssueFieldsForResource(e,t={}){if(!this._issueFieldsCache[e.resourceId]){let n=await Le(this.config,e,t);this._issueFieldsCache[e.resourceId]=n.reduce((o,i)=>({...o,[i.name]:i.id}),{})}return this._issueFieldsCache[e.resourceId]??null}async getResourceUrl(e,t={}){let n=t.token||this.config.token;if(!n)return null;let o=this._resourceUrlCache[n];return o?o[e.resourceId]??null:(await this.getJiraResourcesForCurrentUser(t),this._resourceUrlCache[n]?.[e.resourceId]??null)}async getCurrentUserForResource(e,t={}){let n=await this.getResourceUrl({resourceId:e.resourceId},t),o=await this.config.request({url:`${t.baseUrl||ae}/${e.resourceId}/rest/api/2/myself`,headers:h(t.token||this.config.token)});return{data:{name:o.body.displayName,email:o.body.emailAddress,avatarUrl:o.body.avatarUrls["48x48"],id:o.body.accountId,username:o.body.displayName,url:n?`${n}/jira/people/${o.body.accountId}`:null}}}async getJiraResourcesForCurrentUser(e={}){let t=await this.config.request({url:`${e.baseUrl||"https://api.atlassian.com/"}/oauth/token/accessible-resources`,headers:h(e.token||this.config.token)}),n=e.token||this.config.token,o=n?this._resourceUrlCache[n]||{}:void 0,i=t.body.map(a=>(o&&(o[a.id]=a.url),{avatarUrl:a.avatarUrl,id:a.id,name:a.name,url:a.url}));return n&&(this._resourceUrlCache[n]=o),{data:i}}async getJiraProjectsForResource(e,t={}){let n=new URL(`${t.baseUrl||ae}/${e.resourceId}/rest/api/2/project/search`);n.searchParams.set("maxResults",Rt.toString()),e.cursor&&n.searchParams.set("startAt",e.cursor);let o=await this.config.request({url:n.toString(),headers:h(t.token||this.config.token)});return{pageInfo:{hasNextPage:o.body.values.length!==0,endCursor:(o.body.startAt+o.body.values.length).toString()},data:o.body.values.map(i=>({id:i.id,key:i.key,name:i.name,resourceId:e.resourceId}))}}async getJiraProjectsForResources(e,t={}){let n=[];return await Promise.all(e.resourceIds.map(async o=>{try{return await Ct(i=>this.getJiraProjectsForResource({resourceId:o,cursor:i},t))}catch{return[]}})).then((...o)=>{o.forEach(i=>{n=n.concat(...i)})}),{data:n}}async getAccountsForJiraProject(e,t={}){let{resourceId:n,projectKey:o,cursor:i}=e,a=await this.getResourceUrl({resourceId:n},t),u=new URL(`${t.baseUrl||ae}/${n}/rest/api/2/user/assignable/search`);u.searchParams.set("maxResults",Rt.toString()),i&&u.searchParams.set("startAt",i),u.searchParams.set("project",o);let l=await this.config.request({url:u.toString(),headers:h(t.token||this.config.token)});return{pageInfo:{hasNextPage:l.body.length!==0,endCursor:((i?parseInt(i):0)+l.body.length).toString()},data:l.body.filter(p=>p.accountType!=="app"&&p.active).map(p=>Ce(p,a,!1))}}async getComponentsForJiraProject(e,t={}){return await xe(this.config,e,t)}async getIssue(e,t={}){let n=await this.getIssueFieldsForResource({resourceId:e.resourceId},t),o=await this.getResourceUrl({resourceId:e.resourceId},t);return await De(this.config,{...e,fields:n},o,t)}async getIssuesForProject(e,t={}){let n=await this.getIssueFieldsForResource({resourceId:e.resourceId},t),o=await this.getResourceUrl({resourceId:e.resourceId},t);return await Ue(this.config,{...e,fields:n},o,t)}async getIssuesForProjects(e,t={}){let n=await this.getIssueFieldsForResource({resourceId:e.resourceId},t),o=await this.getResourceUrl({resourceId:e.resourceId},t);return await Ae(this.config,{...e,fields:n},o,t)}async getIssuesForResourceForCurrentUser(e,t={}){let n=await this.getIssueFieldsForResource({resourceId:e.resourceId},t),o=await this.getResourceUrl({resourceId:e.resourceId},t);return await $e(this.config,{...e,fields:n},o,t)}async setIssueStatus(e,t={}){await Oe(this.config,e,t)}async setIssueAssignee(e,t={}){let{issue:n,assignee:o}=e;if(!n.project)throw new Error('Jira Cloud requires a "project" for this function.');if(!n.project.resourceId)throw new Error('Jira Cloud requires a project "resourceId" for this function.');let i={accountId:o?.id};await this.config.request({method:"PUT",url:`${t.baseUrl||ae}/${n.project.resourceId}/rest/api/2/issue/${n.id}/assignee`,body:JSON.stringify(i),headers:{...h(t.token||this.config.token),"Content-Type":"application/json"}})}async setIssueComponents(e,t={}){await Te(this.config,e,t)}async setIssueLabels(e,t={}){await Ge(this.config,e,t)}async getLabelsForResource(e,t={}){let{resourceId:n,cursor:o}=e,i=new URL(`${t.baseUrl||ae}/${n}/rest/api/2/label`);i.searchParams.set("maxResults",Rt.toString()),o&&i.searchParams.set("startAt",o);let a=await this.config.request({url:i.toString(),headers:h(t.token||this.config.token)});return{pageInfo:{hasNextPage:!a.body.isLast,endCursor:(a.body.startAt+a.body.values.length).toString()},data:a.body.values.map(u=>({color:null,description:null,id:null,name:u}))}}};var re=class extends D{constructor(){super(...arguments);this._issueFieldsCache={}}async getIssueFieldsForResource(e={}){let t=e?.baseUrl||this.config.baseUrl||"";if(!this._issueFieldsCache[t]){let n=await Le(this.config,{},e);this._issueFieldsCache[t]=n.reduce((o,i)=>({...o,[i.name]:i.id}),{})}return this._issueFieldsCache[t]??null}async getCurrentUser(e={}){let t=await this.config.request({url:`${e?.baseUrl||this.config.baseUrl}/rest/api/2/myself`,headers:h(e?.token||this.config.token)});return{data:{name:t.body.displayName,email:t.body.emailAddress,avatarUrl:t.body.avatarUrls["48x48"],id:t.body.key,username:t.body.displayName,url:null}}}async getJiraProjects(e={}){return{data:(await this.config.request({url:`${e?.baseUrl||this.config.baseUrl}/rest/api/2/project`,headers:h(e?.token||this.config.token)})).body.map(n=>({id:n.id,name:n.name}))}}async getIssue(e,t={}){let n=e.resourceUrl||t.baseUrl||this.config.baseUrl;if(!n)throw new Error('Jira Server requires a "resourceUrl" or "baseUrl" for this function.');let o=await this.getIssueFieldsForResource(t);return await De(this.config,{...e,fields:o},n,t)}async getIssuesForProject(e,t={}){let n=e.resourceUrl||t.baseUrl||this.config.baseUrl;if(!n)throw new Error('Jira Server requires a "resourceUrl" or "baseUrl" for this function.');let o=await this.getIssueFieldsForResource(t);return await Ue(this.config,{...e,fields:o},n,t)}async getIssuesForProjects(e,t={}){let n=e.resourceUrl||t.baseUrl||this.config.baseUrl;if(!n)throw new Error('Jira Server requires a "resourceUrl" or "baseUrl" for this function.');let o=await this.getIssueFieldsForResource(t);return await Ae(this.config,{...e,fields:o},n,t)}async getIssuesForResourceForCurrentUser(e,t={}){let n=e.resourceUrl||t.baseUrl||this.config.baseUrl;if(!n)throw new Error('Jira Server requires a "resourceUrl" or "baseUrl" for this function.');let o=await this.getIssueFieldsForResource(t);return await $e(this.config,{...e,fields:o},n,t)}async setIssueStatus(e,t={}){await Oe(this.config,e,t)}async setIssueLabels(e,t={}){await Ge(this.config,e,t)}async setIssueComponents(e,t={}){await Te(this.config,e,t)}async getLabels(e={}){return{data:(await this.config.request({url:`${e?.baseUrl||this.config.baseUrl}/rest/api/2/jql/autocompletedata/suggestions?fieldName=labels`,headers:h(e.token||this.config.token)})).body.results.map(({displayName:n})=>({color:null,description:null,id:null,name:n}))}}async getComponentsForJiraProject(e,t={}){return await xe(this.config,e,t)}};var T="https://api.trello.com",Ls=1e3,Ds=r=>({id:r.id,username:r.username,url:r.url,name:r.fullName,email:r.email,avatarUrl:r.avatarUrl}),$s=(r,s)=>{let e=new Date(1e3*parseInt(r.id.substring(0,8),16));return{id:r.id,commentCount:r.badges.comments,number:r.idShort.toString(),title:r.name,url:r.url,closedDate:null,createdDate:new Date(e.toISOString()),author:null,updatedDate:new Date(r.dateLastActivity),assignees:r.members.map(t=>({id:t.id,username:t.username,name:t.fullName,email:null,avatarUrl:t.avatarUrl,url:null})),description:null,state:s[r.idList??""]?{id:r.idList,name:s[r.idList].name,color:null}:null,type:null,repository:null,upvoteCount:r.badges.votes,labels:r.labels.map(t=>({color:t.color,description:null,id:t.id,name:t.name}))}},se=class extends U{async getCurrentUser(s,e={}){let t=await this.config.request({url:`${e.baseUrl||T}/1/members/me?key=${s.appKey}&token=${e.token||this.config.token}`,headers:h(e.token||this.config.token)});return{data:{name:t.body.fullName,email:t.body.email,avatarUrl:t.body.avatarHash?`https://trello-members.s3.amazonaws.com/${t.body.id}/${t.body.avatarHash}/50.png`:null,id:t.body.id,username:t.body.username,url:t.body.url}}}async getBoardsForCurrentUser(s,e={}){return{data:(await this.config.request({url:`${e.baseUrl||T}/1/members/me/boards?fields=name&key=${s.appKey}&token=${e.token||this.config.token}&filter=open`,headers:h(e.token||this.config.token)})).body.map(n=>({id:n.id,name:n.name}))}}async getListsForTrelloBoard(s,e={}){let{appKey:t,boardId:n}=s;return{data:(await this.config.request({url:`${e.baseUrl||T}/1/boards/${n}/lists?key=${t}&token=${e.token||this.config.token}`,headers:h(e.token||this.config.token)})).body}}async getAccountForId(s,e={}){let{appKey:t,memberId:n}=s,o=await this.config.request({url:`${e.baseUrl||T}/1/members/${n}/?key=${t}&token=${e.token||this.config.token}`});return{data:Ds(o.body)}}async getAccountsForTrelloBoard(s,e={}){let{appKey:t,boardId:n}=s;return{data:(await this.config.request({url:`${e.baseUrl||T}/1/boards/${n}/members?key=${t}&token=${e.token||this.config.token}`,headers:h(e.token||this.config.token)})).body.map(i=>({id:i.id,name:i.fullName,username:i.username,email:null,avatarUrl:null,url:null}))}}async getIssuesForBoard(s,e={}){let t=["-is:archived","sort:edited"],{appKey:n,boardId:o,filterText:i,assigneeLogins:a,labelNamesOrColors:u,trelloBoardListsById:l}=s||{};a&&t.push("@me"),u&&u.forEach(c=>t.push(`label:"${c}"`));let p=`${i?`${i}`:""}${t.join(" ")} board:${o}`;return{data:(await this.config.request({url:`${e.baseUrl||T}/1/search?key=${n}&query=${p}&cards_limit=${Ls}&token=${e.token||this.config.token}&card_members=true`,headers:h(e.token||this.config.token)})).body.cards.map(c=>$s(c,l||{}))}}async updateIssue(s,e,t,n){return await this.config.request({method:"PUT",url:`${n.baseUrl||T}/1/cards/${e.id}?key=${s}&token=${n.token||this.config.token}&${t}`,headers:h(n.token||this.config.token)})}async setIssueStatus(s,e={}){let{appKey:t,issue:n,status:o}=s;if(!o.id)throw new Error('Trello requires a status "id" for this function.');let i=`idList=${o.id}`;if(!(await this.updateIssue(t,n,i,e)).body.id)throw new Error("Could not set issue status")}async setIssueAssignees(s,e={}){let{appKey:t,issue:n,assignees:o}=s,i=o.map(l=>l.id),a=`idMembers=${encodeURIComponent(i.join(","))}`;if(!(await this.updateIssue(t,n,a,e)).body.id)throw new Error("Could not set issue status")}async setIssueLabels(s,e={}){let{appKey:t,issue:n,labels:o}=s,i=o.map(u=>u.id).join(",");if(!(await this.config.request({method:"PUT",url:`${e.baseUrl||T}/1/cards/${n.id}?key=${t}&token=${e.token||this.config.token}&idLabels=${encodeURIComponent(i)}`,headers:h(e.token||this.config.token)})).body.id)throw new Error("Could not set issue status")}async setIssueArchived(s,e={}){let{appKey:t,issue:n,archived:o}=s;if(!(await this.config.request({method:"PUT",url:`${e.baseUrl||T}/1/cards/${n.id}?key=${t}&token=${e.token||this.config.token}&closed=${o}`,headers:h(e.token||this.config.token)})).body.id)throw new Error("Could not update issue archived status")}async archiveIssue(s,e={}){await this.setIssueArchived({...s,archived:!0},e)}async unArchiveIssue(s,e={}){await this.setIssueArchived({...s,archived:!1},e)}async getLabelsForBoard(s,e={}){let{appKey:t,boardId:n}=s;return{data:(await this.config.request({url:`${e.baseUrl||T}/1/boards/${n}/labels?key=${t}&token=${e.token||this.config.token}`,headers:h(e.token||this.config.token)})).body.map(i=>({color:i.color,description:null,id:i.id,name:i.name}))}}};var bt=100,ke=class{constructor(){this.set=new Set;this.arr=[]}push(...s){let e=s.filter(t=>!this.set.has(t.id));this.arr.push(...e),e.forEach(t=>this.set.add(t.id))}get length(){return this.arr.length}get items(){return this.arr}},_=async(r,s,e,t)=>{let n=s.token||r.token;if(!n)throw new Error("Linear API key is required");let o=await r.request({url:"https://api.linear.app/graphql",method:"POST",headers:{Authorization:n,"Content-Type":"application/json"},body:JSON.stringify({query:e,variables:t})});if(o.status>=400)throw new Error(`Linear API request failed: ${o.status} ${o.statusText}`);let i=o.body;if(i.errors)throw new Error(`Linear GraphQL errors: ${i.errors.map(a=>a.message).join(", ")}`);return i.data},It=r=>r?r instanceof Date?r:new Date(r):null,Us=`
|
|
1167
1223
|
id
|
|
1168
1224
|
name
|
|
1169
1225
|
description
|
|
@@ -1171,11 +1227,11 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1171
1227
|
startDate
|
|
1172
1228
|
targetDate
|
|
1173
1229
|
url
|
|
1174
|
-
`,
|
|
1230
|
+
`,Vt=r=>({id:r.id,name:r.name,description:r.description??null,state:r.state,startDate:It(r.startDate),targetDate:It(r.targetDate),url:r.url}),Kt=async(r,s,e)=>{let t=`
|
|
1175
1231
|
query GetProjects($first: Int!, $after: String) {
|
|
1176
1232
|
projects(first: $first, after: $after) {
|
|
1177
1233
|
nodes {
|
|
1178
|
-
${
|
|
1234
|
+
${Us}
|
|
1179
1235
|
}
|
|
1180
1236
|
pageInfo {
|
|
1181
1237
|
hasNextPage
|
|
@@ -1183,7 +1239,7 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1183
1239
|
}
|
|
1184
1240
|
}
|
|
1185
1241
|
}
|
|
1186
|
-
`;return(await _(r,s,t,{first:
|
|
1242
|
+
`;return(await _(r,s,t,{first:bt,after:e})).projects},As=`
|
|
1187
1243
|
id
|
|
1188
1244
|
name
|
|
1189
1245
|
number
|
|
@@ -1191,11 +1247,11 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1191
1247
|
startsAt
|
|
1192
1248
|
endsAt
|
|
1193
1249
|
completedAt
|
|
1194
|
-
`,
|
|
1250
|
+
`,Xt=r=>({id:r.id,name:r.name??`Cycle ${r.number}`,number:r.number,description:r.description??null,startsAt:new Date(r.startsAt),endsAt:new Date(r.endsAt),completedAt:It(r.completedAt),url:""}),Zt=async(r,s,e)=>{let t=`
|
|
1195
1251
|
query GetCycles($first: Int!, $after: String) {
|
|
1196
1252
|
cycles(first: $first, after: $after) {
|
|
1197
1253
|
nodes {
|
|
1198
|
-
${
|
|
1254
|
+
${As}
|
|
1199
1255
|
}
|
|
1200
1256
|
pageInfo {
|
|
1201
1257
|
hasNextPage
|
|
@@ -1203,16 +1259,16 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1203
1259
|
}
|
|
1204
1260
|
}
|
|
1205
1261
|
}
|
|
1206
|
-
`;return(await _(r,s,t,{first:
|
|
1262
|
+
`;return(await _(r,s,t,{first:bt,after:e})).cycles},Gs=`
|
|
1207
1263
|
id
|
|
1208
1264
|
name
|
|
1209
1265
|
color
|
|
1210
1266
|
description
|
|
1211
|
-
`,
|
|
1267
|
+
`,Yt=r=>({id:r.id,name:r.name,color:r.color,description:r.description??null}),er=async(r,s,e)=>{let t=`
|
|
1212
1268
|
query GetLabels($first: Int!, $after: String) {
|
|
1213
1269
|
projectLabels(first: $first, after: $after) {
|
|
1214
1270
|
nodes {
|
|
1215
|
-
${
|
|
1271
|
+
${Gs}
|
|
1216
1272
|
}
|
|
1217
1273
|
pageInfo {
|
|
1218
1274
|
hasNextPage
|
|
@@ -1220,36 +1276,36 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1220
1276
|
}
|
|
1221
1277
|
}
|
|
1222
1278
|
}
|
|
1223
|
-
`;return(await _(r,s,t,{first:
|
|
1279
|
+
`;return(await _(r,s,t,{first:bt,after:e})).projectLabels};var ue=(i=>(i[i.None=0]="None",i[i.Assignee=1]="Assignee",i[i.Creator=2]="Creator",i[i.Mention=3]="Mention",i[i.MentionInDescription=4]="MentionInDescription",i[i.MentionInComments=5]="MentionInComments",i))(ue||{});function tr(r,s){return r?`${ue[r]}:${s||""}`:s??null}function rr(r){if(!r)return{category:0};let[s,e]=r.split(":");return s in ue?{category:ue[s],cursor:e||void 0}:{category:0,cursor:r}}var sr=100;function _e(r){return r?r instanceof Date?r:new Date(r):null}var ir=`
|
|
1224
1280
|
id
|
|
1225
1281
|
name
|
|
1226
1282
|
key
|
|
1227
1283
|
icon
|
|
1228
|
-
`;function
|
|
1284
|
+
`;function Ts(r){return{id:r.id,name:r.name,key:r.key,iconUrl:r.icon}}var nr=`
|
|
1229
1285
|
id
|
|
1230
1286
|
name
|
|
1231
1287
|
avatarUrl
|
|
1232
|
-
`;function
|
|
1288
|
+
`;function or(r){return r?{id:r.id,name:r.name,username:r.name,email:null,avatarUrl:r.avatarUrl??null,url:null}:null}var Os=`
|
|
1233
1289
|
id
|
|
1234
1290
|
name
|
|
1235
|
-
`;function
|
|
1291
|
+
`;function xs(r,s){if(r)return{id:r.id,name:r.name,key:s?.key||null,namespace:null,resourceId:s?.id||null}}var ks=`
|
|
1236
1292
|
id
|
|
1237
1293
|
sortOrder
|
|
1238
1294
|
name
|
|
1239
1295
|
description
|
|
1240
1296
|
status
|
|
1241
1297
|
targetDate
|
|
1242
|
-
`;function
|
|
1298
|
+
`;function Ns(r){return r?{id:r.id,number:r.sortOrder,title:r.name,description:r.description??null,isOpen:r.status!=="done",url:"",startDate:null,dueDate:_e(r.targetDate)}:null}function _s(r){switch(r){case"completed":case"canceled":return"DONE";case"started":return"IN_PROGRESS";default:return"TO_DO"}}var Fs=`
|
|
1243
1299
|
id
|
|
1244
1300
|
name
|
|
1245
1301
|
color
|
|
1246
1302
|
type
|
|
1247
|
-
`;function
|
|
1303
|
+
`;function Qs(r){return r?{id:r.id,name:r.name,color:r.color,category:_s(r.type)}:null}var Pt=`
|
|
1248
1304
|
creator {
|
|
1249
|
-
${
|
|
1305
|
+
${nr}
|
|
1250
1306
|
}
|
|
1251
1307
|
assignee {
|
|
1252
|
-
${
|
|
1308
|
+
${nr}
|
|
1253
1309
|
}
|
|
1254
1310
|
archivedAt
|
|
1255
1311
|
createdAt
|
|
@@ -1257,32 +1313,32 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1257
1313
|
id
|
|
1258
1314
|
identifier
|
|
1259
1315
|
project {
|
|
1260
|
-
${
|
|
1316
|
+
${Os}
|
|
1261
1317
|
}
|
|
1262
1318
|
team {
|
|
1263
|
-
${
|
|
1319
|
+
${ir}
|
|
1264
1320
|
}
|
|
1265
1321
|
state {
|
|
1266
|
-
${
|
|
1322
|
+
${Fs}
|
|
1267
1323
|
}
|
|
1268
1324
|
title
|
|
1269
1325
|
updatedAt
|
|
1270
1326
|
url
|
|
1271
1327
|
projectMilestone {
|
|
1272
|
-
${
|
|
1328
|
+
${ks}
|
|
1273
1329
|
}
|
|
1274
|
-
`;async function
|
|
1330
|
+
`;async function yt(r){return{author:or(await r.creator),assignees:[or(await r.assignee)].filter(s=>s!=null),commentCount:null,closedDate:_e(r.archivedAt),createdDate:_e(r.createdAt),description:r.description??null,id:r.id,labels:[],number:r.identifier,repository:null,project:xs(await r.project,await r.team),state:Qs(await r.state),title:r.title,type:null,updatedDate:_e(r.updatedAt),upvoteCount:null,url:r.url,milestone:Ns(await r.projectMilestone)}}var Ne=`
|
|
1275
1331
|
nodes {
|
|
1276
|
-
${
|
|
1332
|
+
${Pt}
|
|
1277
1333
|
}
|
|
1278
1334
|
pageInfo {
|
|
1279
1335
|
hasNextPage
|
|
1280
1336
|
endCursor
|
|
1281
1337
|
}
|
|
1282
|
-
`,
|
|
1338
|
+
`,Fe=class extends U{async fetchIssue(s,e){let t=`
|
|
1283
1339
|
query GetIssue($identifier: String!) {
|
|
1284
1340
|
issue(id: $identifier) {
|
|
1285
|
-
${
|
|
1341
|
+
${Pt}
|
|
1286
1342
|
}
|
|
1287
1343
|
}
|
|
1288
1344
|
`;return(await _(this.config,e,t,{identifier:s})).issue}async fetchOrganization(s){let e=`
|
|
@@ -1297,7 +1353,7 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1297
1353
|
query GetTeams {
|
|
1298
1354
|
teams {
|
|
1299
1355
|
nodes {
|
|
1300
|
-
${
|
|
1356
|
+
${ir}
|
|
1301
1357
|
}
|
|
1302
1358
|
}
|
|
1303
1359
|
}
|
|
@@ -1310,11 +1366,11 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1310
1366
|
displayName
|
|
1311
1367
|
}
|
|
1312
1368
|
}
|
|
1313
|
-
`;return(await _(this.config,s,e)).viewer}async getIssue(s,e={}){let t=await this.fetchIssue(s.number,e);return{data:await
|
|
1369
|
+
`;return(await _(this.config,s,e)).viewer}async getIssue(s,e={}){let t=await this.fetchIssue(s.number,e);return{data:await yt(t)}}async getLinearOrganization(s={}){let e=await this.fetchOrganization(s);return{data:{id:e.id,name:e.name,key:e.urlKey,url:`https://linear.app/${e.urlKey}`}}}async getTeamsForCurrentUser(s={}){return{data:(await this.fetchTeams(s)).nodes.map(Ts)}}async getProjects(s={},e={}){let t=await Kt(this.config,e,s.cursor??void 0);return{data:t.nodes.map(Vt),pageInfo:{hasNextPage:t.pageInfo.hasNextPage,endCursor:t.pageInfo.endCursor??null}}}async getCycles(s={},e={}){let t=await Zt(this.config,e,s.cursor??void 0);return{data:t.nodes.map(Xt),pageInfo:{hasNextPage:t.pageInfo.hasNextPage,endCursor:t.pageInfo.endCursor??null}}}async getLabels(s={},e={}){let t=await er(this.config,e,s.cursor??void 0);return{data:t.nodes.map(Yt),pageInfo:{hasNextPage:t.pageInfo.hasNextPage,endCursor:t.pageInfo.endCursor??null}}}async getCurrentUser(s={}){return{data:await this.fetchViewer(s)}}async getIssuesForCurrentUser(s,e={}){let{cursor:t}=s,{category:n,cursor:o}=rr(t),i=await this.fetchViewer(e),a,u,l=new ke,p=async(d,c)=>{if(u||n>d)return;let g=await c(Math.max(sr-l.length,1),n===d?o:void 0);if(!g)return;let m=await ze(g.nodes.map(yt));l.push(...m),g.pageInfo.hasNextPage&&(a=d,u=g.pageInfo.endCursor)};return await p(1,async(d,c)=>(await this.rawRequest(e,`
|
|
1314
1370
|
query GetAssignedIssues($first: Int!, $after: String) {
|
|
1315
1371
|
viewer {
|
|
1316
1372
|
issues: assignedIssues(first: $first, after: $after) {
|
|
1317
|
-
${
|
|
1373
|
+
${Ne}
|
|
1318
1374
|
}
|
|
1319
1375
|
}
|
|
1320
1376
|
}
|
|
@@ -1322,7 +1378,7 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1322
1378
|
query GetCreatedIssues($first: Int!, $after: String) {
|
|
1323
1379
|
viewer {
|
|
1324
1380
|
issues: createdIssues(first: $first, after: $after) {
|
|
1325
|
-
${
|
|
1381
|
+
${Ne}
|
|
1326
1382
|
}
|
|
1327
1383
|
}
|
|
1328
1384
|
}
|
|
@@ -1334,20 +1390,20 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1334
1390
|
filter: {
|
|
1335
1391
|
or: [{
|
|
1336
1392
|
searchableContent: {
|
|
1337
|
-
contains: "${
|
|
1393
|
+
contains: "${i.displayName}"
|
|
1338
1394
|
}
|
|
1339
1395
|
},{
|
|
1340
1396
|
searchableContent: {
|
|
1341
|
-
contains: "${
|
|
1397
|
+
contains: "${i.email}"
|
|
1342
1398
|
}
|
|
1343
1399
|
},{
|
|
1344
1400
|
searchableContent: {
|
|
1345
|
-
contains: "${
|
|
1401
|
+
contains: "${i.name}"
|
|
1346
1402
|
}
|
|
1347
1403
|
}]
|
|
1348
1404
|
}
|
|
1349
1405
|
){
|
|
1350
|
-
${
|
|
1406
|
+
${Ne}
|
|
1351
1407
|
}
|
|
1352
1408
|
}
|
|
1353
1409
|
`,{first:d,after:c})).data?.issues),await p(5,async(d,c)=>{let m=(await this.rawRequest(e,`
|
|
@@ -1358,22 +1414,22 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1358
1414
|
filter: {
|
|
1359
1415
|
or: [{
|
|
1360
1416
|
body: {
|
|
1361
|
-
contains: "${
|
|
1417
|
+
contains: "${i.displayName}"
|
|
1362
1418
|
}
|
|
1363
1419
|
},{
|
|
1364
1420
|
body: {
|
|
1365
|
-
contains: "${
|
|
1421
|
+
contains: "${i.email}"
|
|
1366
1422
|
}
|
|
1367
1423
|
},{
|
|
1368
1424
|
body: {
|
|
1369
|
-
contains: "${
|
|
1425
|
+
contains: "${i.name}"
|
|
1370
1426
|
}
|
|
1371
1427
|
}]
|
|
1372
1428
|
}
|
|
1373
1429
|
){
|
|
1374
1430
|
nodes {
|
|
1375
1431
|
issue {
|
|
1376
|
-
${
|
|
1432
|
+
${Pt}
|
|
1377
1433
|
}
|
|
1378
1434
|
}
|
|
1379
1435
|
pageInfo {
|
|
@@ -1382,10 +1438,10 @@ OR comment ~ currentUser() OR summary ~ currentUser() OR description ~ currentUs
|
|
|
1382
1438
|
}
|
|
1383
1439
|
}
|
|
1384
1440
|
}
|
|
1385
|
-
`,{first:d,after:c})).data?.comments;return m?{nodes:m.nodes.map(I=>I.issue),pageInfo:m.pageInfo}:void 0}),{data:l.items,pageInfo:{hasNextPage:!!u,endCursor:
|
|
1441
|
+
`,{first:d,after:c})).data?.comments;return m?{nodes:m.nodes.map(I=>I.issue),pageInfo:m.pageInfo}:void 0}),{data:l.items,pageInfo:{hasNextPage:!!u,endCursor:tr(a,u)}}}async getIssues(s,e={}){let{teams:t,projects:n,labels:o,cursor:i}=s,a=[];if(t&&t.length>0){let g=t.map(m=>`"${m}"`).join(", ");a.push(`team: { id: { in: [${g}] } }`)}if(n&&n.length>0){let g=n.map(m=>`"${m}"`).join(", ");a.push(`project: { id: { in: [${g}] } }`)}if(o&&o.length>0){let g=o.map(m=>`"${m}"`).join(", ");a.push(`labels: { name: { in: [${g}] } }`)}let u=a.length>0?`filter: { ${a.join(", ")} }`:"",l=`
|
|
1386
1442
|
query GetIssues($first: Int!, $after: String) {
|
|
1387
1443
|
issues(first: $first, after: $after${u?", ":""}${u}) {
|
|
1388
|
-
${
|
|
1444
|
+
${Ne}
|
|
1389
1445
|
}
|
|
1390
1446
|
}
|
|
1391
|
-
`,d=(await this.rawRequest(e,l,{first:
|
|
1447
|
+
`,d=(await this.rawRequest(e,l,{first:sr,after:i})).data?.issues;return d?{data:await ze(d.nodes.map(yt)),pageInfo:{hasNextPage:d.pageInfo.hasNextPage,endCursor:d.pageInfo.endCursor??null}}:{data:[],pageInfo:{hasNextPage:!1,endCursor:null}}}};var ar=r=>{let s={request:r?.request};return{azureDevOps:new J({...s,...r?.azureDevOps}),bitbucket:new V({...s,...r?.bitbucket}),bitbucketServer:new K({...s,...r?.bitbucketServer}),github:new Z({...s,...r?.github}),gitlab:new ee({...s,...r?.gitlab}),jira:new te({...s,...r?.jira}),jiraServer:new re({...s,...r?.jiraServer}),linear:new Fe({...s,...r?.linear}),trello:new se({...s,...r?.trello})}};var ur=(i=>(i.Conflicts="conflicts",i.Failure="failure",i.NotSet="notSet",i.Queued="queued",i.RejectedByPolicy="rejectedByPolicy",i.Succeeded="succeeded",i))(ur||{});var lr=(e=>(e.Zero="0",e.One="1",e))(lr||{}),pr=(e=>(e.PullRequest="pr",e.Issue="issue",e))(pr||{}),dr=(c=>(c.Azure="azure",c.AzureDevOpsServer="azureDevOpsServer",c.Github="github",c.GithubEnterprise="githubEnterprise",c.Gitlab="gitlab",c.GitlabSelfHosted="gitlabSelfHosted",c.Bitbucket="bitbucket",c.BitbucketServer="bitbucketServer",c.Jira="jira",c.JiraServer="jiraServer",c.Linear="linear",c.Trello="trello",c))(dr||{});var cr=(e=>(e.Completed="COMPLETED",e.NotPlanned="NOT_PLANNED",e))(cr||{});var js=ar;
|