@generacy-ai/generacy-plugin-github-issues 0.0.0-preview-20260304013206
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/LICENSE +191 -0
- package/dist/auth/auth-factory.d.ts +44 -0
- package/dist/auth/auth-factory.d.ts.map +1 -0
- package/dist/auth/auth-factory.js +85 -0
- package/dist/auth/auth-factory.js.map +1 -0
- package/dist/auth/env.d.ts +32 -0
- package/dist/auth/env.d.ts.map +1 -0
- package/dist/auth/env.js +88 -0
- package/dist/auth/env.js.map +1 -0
- package/dist/auth/github-app.d.ts +69 -0
- package/dist/auth/github-app.d.ts.map +1 -0
- package/dist/auth/github-app.js +191 -0
- package/dist/auth/github-app.js.map +1 -0
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +10 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token-cache.d.ts +70 -0
- package/dist/auth/token-cache.d.ts.map +1 -0
- package/dist/auth/token-cache.js +112 -0
- package/dist/auth/token-cache.js.map +1 -0
- package/dist/auth/types.d.ts +119 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/types.js +27 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/client.d.ts +101 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +197 -0
- package/dist/client.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/operations/comments.d.ts +46 -0
- package/dist/operations/comments.d.ts.map +1 -0
- package/dist/operations/comments.js +127 -0
- package/dist/operations/comments.js.map +1 -0
- package/dist/operations/issues.d.ts +46 -0
- package/dist/operations/issues.d.ts.map +1 -0
- package/dist/operations/issues.js +188 -0
- package/dist/operations/issues.js.map +1 -0
- package/dist/operations/labels.d.ts +46 -0
- package/dist/operations/labels.d.ts.map +1 -0
- package/dist/operations/labels.js +132 -0
- package/dist/operations/labels.js.map +1 -0
- package/dist/operations/pull-requests.d.ts +41 -0
- package/dist/operations/pull-requests.d.ts.map +1 -0
- package/dist/operations/pull-requests.js +162 -0
- package/dist/operations/pull-requests.js.map +1 -0
- package/dist/plugin.d.ts +181 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +324 -0
- package/dist/plugin.js.map +1 -0
- package/dist/types/config.d.ts +126 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +22 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/events.d.ts +72 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +2 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +3 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/issues.d.ts +178 -0
- package/dist/types/issues.d.ts.map +1 -0
- package/dist/types/issues.js +29 -0
- package/dist/types/issues.js.map +1 -0
- package/dist/types/responses.d.ts +61 -0
- package/dist/types/responses.d.ts.map +1 -0
- package/dist/types/responses.js +5 -0
- package/dist/types/responses.js.map +1 -0
- package/dist/utils/errors.d.ts +69 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +123 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/validation.d.ts +33 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +69 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/webhooks/handler.d.ts +66 -0
- package/dist/webhooks/handler.d.ts.map +1 -0
- package/dist/webhooks/handler.js +176 -0
- package/dist/webhooks/handler.js.map +1 -0
- package/dist/webhooks/parser.d.ts +36 -0
- package/dist/webhooks/parser.d.ts.map +1 -0
- package/dist/webhooks/parser.js +220 -0
- package/dist/webhooks/parser.js.map +1 -0
- package/dist/webhooks/triggers.d.ts +25 -0
- package/dist/webhooks/triggers.d.ts.map +1 -0
- package/dist/webhooks/triggers.js +119 -0
- package/dist/webhooks/triggers.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { validateCreateIssueParams, validateUpdateIssueParams, validateIssueFilter, } from '../utils/validation.js';
|
|
2
|
+
import { GitHubNotFoundError } from '../utils/errors.js';
|
|
3
|
+
/**
|
|
4
|
+
* Transform GitHub API issue response to our Issue type
|
|
5
|
+
*/
|
|
6
|
+
function transformIssue(apiIssue) {
|
|
7
|
+
return {
|
|
8
|
+
number: apiIssue.number,
|
|
9
|
+
title: apiIssue.title,
|
|
10
|
+
body: apiIssue.body ?? null,
|
|
11
|
+
state: apiIssue.state,
|
|
12
|
+
labels: apiIssue.labels
|
|
13
|
+
.filter((l) => typeof l === 'object')
|
|
14
|
+
.map((l) => ({
|
|
15
|
+
id: l.id ?? 0,
|
|
16
|
+
name: l.name ?? '',
|
|
17
|
+
color: l.color ?? '',
|
|
18
|
+
description: l.description ?? null,
|
|
19
|
+
})),
|
|
20
|
+
assignees: (apiIssue.assignees ?? []).map((a) => ({
|
|
21
|
+
id: a.id,
|
|
22
|
+
login: a.login,
|
|
23
|
+
avatarUrl: a.avatar_url,
|
|
24
|
+
type: (a.type ?? 'User'),
|
|
25
|
+
})),
|
|
26
|
+
milestone: apiIssue.milestone
|
|
27
|
+
? {
|
|
28
|
+
id: apiIssue.milestone.id,
|
|
29
|
+
number: apiIssue.milestone.number,
|
|
30
|
+
title: apiIssue.milestone.title,
|
|
31
|
+
description: apiIssue.milestone.description,
|
|
32
|
+
state: (apiIssue.milestone.state ?? 'open'),
|
|
33
|
+
dueOn: apiIssue.milestone.due_on ?? null,
|
|
34
|
+
}
|
|
35
|
+
: null,
|
|
36
|
+
createdAt: apiIssue.created_at,
|
|
37
|
+
updatedAt: apiIssue.updated_at,
|
|
38
|
+
closedAt: apiIssue.closed_at ?? null,
|
|
39
|
+
author: apiIssue.user
|
|
40
|
+
? {
|
|
41
|
+
id: apiIssue.user.id,
|
|
42
|
+
login: apiIssue.user.login,
|
|
43
|
+
avatarUrl: apiIssue.user.avatar_url,
|
|
44
|
+
type: (apiIssue.user.type ?? 'User'),
|
|
45
|
+
}
|
|
46
|
+
: { id: 0, login: 'unknown', avatarUrl: '', type: 'User' },
|
|
47
|
+
url: apiIssue.url,
|
|
48
|
+
htmlUrl: apiIssue.html_url,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Issue operations using the GitHub client
|
|
53
|
+
*/
|
|
54
|
+
export class IssueOperations {
|
|
55
|
+
client;
|
|
56
|
+
constructor(client) {
|
|
57
|
+
this.client = client;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a new issue
|
|
61
|
+
*/
|
|
62
|
+
async create(params) {
|
|
63
|
+
const validated = validateCreateIssueParams(params);
|
|
64
|
+
const { data } = await this.client.request(() => this.client.rest.issues.create({
|
|
65
|
+
owner: this.client.owner,
|
|
66
|
+
repo: this.client.repo,
|
|
67
|
+
title: validated.title,
|
|
68
|
+
body: validated.body,
|
|
69
|
+
labels: validated.labels,
|
|
70
|
+
assignees: validated.assignees,
|
|
71
|
+
milestone: validated.milestone,
|
|
72
|
+
}), 'create issue');
|
|
73
|
+
return transformIssue(data);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Get an issue by number
|
|
77
|
+
*/
|
|
78
|
+
async get(issueNumber) {
|
|
79
|
+
const { data } = await this.client.request(() => this.client.rest.issues.get({
|
|
80
|
+
owner: this.client.owner,
|
|
81
|
+
repo: this.client.repo,
|
|
82
|
+
issue_number: issueNumber,
|
|
83
|
+
}), `get issue #${issueNumber}`);
|
|
84
|
+
return transformIssue(data);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Update an issue
|
|
88
|
+
*/
|
|
89
|
+
async update(issueNumber, params) {
|
|
90
|
+
const validated = validateUpdateIssueParams(params);
|
|
91
|
+
const { data } = await this.client.request(() => this.client.rest.issues.update({
|
|
92
|
+
owner: this.client.owner,
|
|
93
|
+
repo: this.client.repo,
|
|
94
|
+
issue_number: issueNumber,
|
|
95
|
+
title: validated.title,
|
|
96
|
+
body: validated.body,
|
|
97
|
+
state: validated.state,
|
|
98
|
+
labels: validated.labels,
|
|
99
|
+
assignees: validated.assignees,
|
|
100
|
+
milestone: validated.milestone,
|
|
101
|
+
}), `update issue #${issueNumber}`);
|
|
102
|
+
return transformIssue(data);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Close an issue
|
|
106
|
+
*/
|
|
107
|
+
async close(issueNumber) {
|
|
108
|
+
await this.client.request(() => this.client.rest.issues.update({
|
|
109
|
+
owner: this.client.owner,
|
|
110
|
+
repo: this.client.repo,
|
|
111
|
+
issue_number: issueNumber,
|
|
112
|
+
state: 'closed',
|
|
113
|
+
}), `close issue #${issueNumber}`);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Reopen an issue
|
|
117
|
+
*/
|
|
118
|
+
async reopen(issueNumber) {
|
|
119
|
+
await this.client.request(() => this.client.rest.issues.update({
|
|
120
|
+
owner: this.client.owner,
|
|
121
|
+
repo: this.client.repo,
|
|
122
|
+
issue_number: issueNumber,
|
|
123
|
+
state: 'open',
|
|
124
|
+
}), `reopen issue #${issueNumber}`);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Search issues using GitHub search syntax
|
|
128
|
+
*/
|
|
129
|
+
async search(query) {
|
|
130
|
+
const fullQuery = `repo:${this.client.owner}/${this.client.repo} ${query}`;
|
|
131
|
+
const { data } = await this.client.request(() => this.client.rest.search.issuesAndPullRequests({
|
|
132
|
+
q: fullQuery,
|
|
133
|
+
per_page: 100,
|
|
134
|
+
}), 'search issues');
|
|
135
|
+
// Filter out pull requests (they're included in the search results)
|
|
136
|
+
return data.items
|
|
137
|
+
.filter((item) => !('pull_request' in item))
|
|
138
|
+
.map((item) => transformIssue(item));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* List issues with optional filtering
|
|
142
|
+
*/
|
|
143
|
+
async list(filter) {
|
|
144
|
+
const validated = filter ? validateIssueFilter(filter) : {};
|
|
145
|
+
const results = await this.client.paginate((params) => this.client.rest.issues.listForRepo({
|
|
146
|
+
owner: this.client.owner,
|
|
147
|
+
repo: this.client.repo,
|
|
148
|
+
state: validated.state,
|
|
149
|
+
labels: validated.labels?.join(','),
|
|
150
|
+
assignee: validated.assignee,
|
|
151
|
+
creator: validated.creator,
|
|
152
|
+
mentioned: validated.mentioned,
|
|
153
|
+
milestone: validated.milestone === 'none' || validated.milestone === '*'
|
|
154
|
+
? validated.milestone
|
|
155
|
+
: validated.milestone?.toString(),
|
|
156
|
+
since: validated.since,
|
|
157
|
+
sort: validated.sort,
|
|
158
|
+
direction: validated.direction,
|
|
159
|
+
...params,
|
|
160
|
+
}), 10);
|
|
161
|
+
// Filter out pull requests
|
|
162
|
+
return results
|
|
163
|
+
.filter((item) => !('pull_request' in item))
|
|
164
|
+
.map((item) => transformIssue(item));
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Check if an issue exists
|
|
168
|
+
*/
|
|
169
|
+
async exists(issueNumber) {
|
|
170
|
+
try {
|
|
171
|
+
await this.get(issueNumber);
|
|
172
|
+
return true;
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
if (error instanceof GitHubNotFoundError) {
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Create issue operations instance
|
|
184
|
+
*/
|
|
185
|
+
export function createIssueOperations(client) {
|
|
186
|
+
return new IssueOperations(client);
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=issues.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"issues.js","sourceRoot":"","sources":["../../src/operations/issues.ts"],"names":[],"mappings":"AASA,OAAO,EACL,yBAAyB,EACzB,yBAAyB,EACzB,mBAAmB,GACpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD;;GAEG;AACH,SAAS,cAAc,CAAC,QAqBvB;IACC,OAAO;QACL,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,IAAI,EAAE,QAAQ,CAAC,IAAI,IAAI,IAAI;QAC3B,KAAK,EAAE,QAAQ,CAAC,KAA0B;QAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM;aACpB,MAAM,CAAC,CAAC,CAAC,EAAoF,EAAE,CAC9F,OAAO,CAAC,KAAK,QAAQ,CACtB;aACA,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACX,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC;YACb,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,EAAE;YAClB,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE;YACpB,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,IAAI;SACnC,CAAC,CAAC;QACL,SAAS,EAAE,CAAC,QAAQ,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChD,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,CAAC,CAAC,UAAU;YACvB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,MAAM,CAAiB;SACzC,CAAC,CAAC;QACH,SAAS,EAAE,QAAQ,CAAC,SAAS;YAC3B,CAAC,CAAC;gBACE,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,EAAE;gBACzB,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM;gBACjC,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,KAAK;gBAC/B,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW;gBAC3C,KAAK,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,IAAI,MAAM,CAAuB;gBACjE,KAAK,EAAE,QAAQ,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI;aACzC;YACH,CAAC,CAAC,IAAI;QACR,SAAS,EAAE,QAAQ,CAAC,UAAU;QAC9B,SAAS,EAAE,QAAQ,CAAC,UAAU;QAC9B,QAAQ,EAAE,QAAQ,CAAC,SAAS,IAAI,IAAI;QACpC,MAAM,EAAE,QAAQ,CAAC,IAAI;YACnB,CAAC,CAAC;gBACE,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;gBACpB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK;gBAC1B,SAAS,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU;gBACnC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAiB;aACrD;YACH,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;QAC5D,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,OAAO,EAAE,QAAQ,CAAC,QAAQ;KAC3B,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAErD;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAyB;QACpC,MAAM,SAAS,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,SAAS,EAAE,SAAS,CAAC,SAAS;SAC/B,CAAC,EACJ,cAAc,CACf,CAAC;QAEF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,WAAmB;QAC3B,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC;YAC1B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,YAAY,EAAE,WAAW;SAC1B,CAAC,EACJ,cAAc,WAAW,EAAE,CAC5B,CAAC;QAEF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,MAAyB;QACzD,MAAM,SAAS,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,YAAY,EAAE,WAAW;YACzB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,SAAS,EAAE,SAAS,CAAC,SAAS;SAC/B,CAAC,EACJ,iBAAiB,WAAW,EAAE,CAC/B,CAAC;QAEF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,WAAmB;QAC7B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,YAAY,EAAE,WAAW;YACzB,KAAK,EAAE,QAAQ;SAChB,CAAC,EACJ,gBAAgB,WAAW,EAAE,CAC9B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;YAC7B,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,YAAY,EAAE,WAAW;YACzB,KAAK,EAAE,MAAM;SACd,CAAC,EACJ,iBAAiB,WAAW,EAAE,CAC/B,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAa;QACxB,MAAM,SAAS,GAAG,QAAQ,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,KAAK,EAAE,CAAC;QAE3E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,qBAAqB,CAAC;YAC5C,CAAC,EAAE,SAAS;YACZ,QAAQ,EAAE,GAAG;SACd,CAAC,EACJ,eAAe,CAChB,CAAC;QAEF,oEAAoE;QACpE,OAAO,IAAI,CAAC,KAAK;aACd,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;aAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAA4C,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,MAAoB;QAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAE5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CACxC,CAAC,MAAM,EAAE,EAAE,CACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,MAAM,EAAE,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC;YACnC,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC5B,OAAO,EAAE,SAAS,CAAC,OAAO;YAC1B,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,SAAS,EACP,SAAS,CAAC,SAAS,KAAK,MAAM,IAAI,SAAS,CAAC,SAAS,KAAK,GAAG;gBAC3D,CAAC,CAAC,SAAS,CAAC,SAAS;gBACrB,CAAC,CAAC,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE;YACrC,KAAK,EAAE,SAAS,CAAC,KAAK;YACtB,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,GAAG,MAAM;SACV,CAAC,EACJ,EAAE,CACH,CAAC;QAEF,2BAA2B;QAC3B,OAAO,OAAO;aACX,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,IAAI,IAAI,CAAC,CAAC;aAC3C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,cAAc,CAAC,IAA4C,CAAC,CAAC,CAAC;IACjF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;gBACzC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { GitHubClient } from '../client.js';
|
|
2
|
+
import type { Label } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Label operations using the GitHub client
|
|
5
|
+
*/
|
|
6
|
+
export declare class LabelOperations {
|
|
7
|
+
private readonly client;
|
|
8
|
+
constructor(client: GitHubClient);
|
|
9
|
+
/**
|
|
10
|
+
* Add labels to an issue
|
|
11
|
+
*/
|
|
12
|
+
add(issueNumber: number, labels: string[]): Promise<Label[]>;
|
|
13
|
+
/**
|
|
14
|
+
* Remove a label from an issue
|
|
15
|
+
*/
|
|
16
|
+
remove(issueNumber: number, label: string): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Remove multiple labels from an issue
|
|
19
|
+
*/
|
|
20
|
+
removeMany(issueNumber: number, labels: string[]): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Set labels on an issue (replaces all existing labels)
|
|
23
|
+
*/
|
|
24
|
+
set(issueNumber: number, labels: string[]): Promise<Label[]>;
|
|
25
|
+
/**
|
|
26
|
+
* List all labels on an issue
|
|
27
|
+
*/
|
|
28
|
+
list(issueNumber: number): Promise<Label[]>;
|
|
29
|
+
/**
|
|
30
|
+
* List all labels in the repository
|
|
31
|
+
*/
|
|
32
|
+
listForRepo(): Promise<Label[]>;
|
|
33
|
+
/**
|
|
34
|
+
* Create a label in the repository
|
|
35
|
+
*/
|
|
36
|
+
create(name: string, color: string, description?: string): Promise<Label>;
|
|
37
|
+
/**
|
|
38
|
+
* Delete a label from the repository
|
|
39
|
+
*/
|
|
40
|
+
delete(name: string): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Create label operations instance
|
|
44
|
+
*/
|
|
45
|
+
export declare function createLabelOperations(client: GitHubClient): LabelOperations;
|
|
46
|
+
//# sourceMappingURL=labels.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/operations/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAoB/C;;GAEG;AACH,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAEjD;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAmBlE;;OAEG;IACG,MAAM,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa/D;;OAEG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BtE;;OAEG;IACG,GAAG,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAelE;;OAEG;IACG,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAejD;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAcrC;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAgB/E;;OAEG;IACG,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAW1C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,GAAG,eAAe,CAE3E"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { GitHubValidationError } from '../utils/errors.js';
|
|
2
|
+
/**
|
|
3
|
+
* Transform GitHub API label response to our Label type
|
|
4
|
+
*/
|
|
5
|
+
function transformLabel(apiLabel) {
|
|
6
|
+
return {
|
|
7
|
+
id: apiLabel.id,
|
|
8
|
+
name: apiLabel.name,
|
|
9
|
+
color: apiLabel.color,
|
|
10
|
+
description: apiLabel.description,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Label operations using the GitHub client
|
|
15
|
+
*/
|
|
16
|
+
export class LabelOperations {
|
|
17
|
+
client;
|
|
18
|
+
constructor(client) {
|
|
19
|
+
this.client = client;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Add labels to an issue
|
|
23
|
+
*/
|
|
24
|
+
async add(issueNumber, labels) {
|
|
25
|
+
if (labels.length === 0) {
|
|
26
|
+
throw new GitHubValidationError('At least one label is required');
|
|
27
|
+
}
|
|
28
|
+
const { data } = await this.client.request(() => this.client.rest.issues.addLabels({
|
|
29
|
+
owner: this.client.owner,
|
|
30
|
+
repo: this.client.repo,
|
|
31
|
+
issue_number: issueNumber,
|
|
32
|
+
labels,
|
|
33
|
+
}), `add labels to issue #${issueNumber}`);
|
|
34
|
+
return data.map(transformLabel);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Remove a label from an issue
|
|
38
|
+
*/
|
|
39
|
+
async remove(issueNumber, label) {
|
|
40
|
+
await this.client.request(() => this.client.rest.issues.removeLabel({
|
|
41
|
+
owner: this.client.owner,
|
|
42
|
+
repo: this.client.repo,
|
|
43
|
+
issue_number: issueNumber,
|
|
44
|
+
name: label,
|
|
45
|
+
}), `remove label '${label}' from issue #${issueNumber}`);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Remove multiple labels from an issue
|
|
49
|
+
*/
|
|
50
|
+
async removeMany(issueNumber, labels) {
|
|
51
|
+
if (labels.length === 0) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
// GitHub API doesn't support bulk removal, so we remove one by one
|
|
55
|
+
await Promise.all(labels.map((label) => this.client.request(() => this.client.rest.issues.removeLabel({
|
|
56
|
+
owner: this.client.owner,
|
|
57
|
+
repo: this.client.repo,
|
|
58
|
+
issue_number: issueNumber,
|
|
59
|
+
name: label,
|
|
60
|
+
}), `remove label '${label}' from issue #${issueNumber}`).catch((error) => {
|
|
61
|
+
// Ignore 404 errors (label might not exist on the issue)
|
|
62
|
+
if (error.code !== 'NOT_FOUND_ERROR') {
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
})));
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Set labels on an issue (replaces all existing labels)
|
|
69
|
+
*/
|
|
70
|
+
async set(issueNumber, labels) {
|
|
71
|
+
const { data } = await this.client.request(() => this.client.rest.issues.setLabels({
|
|
72
|
+
owner: this.client.owner,
|
|
73
|
+
repo: this.client.repo,
|
|
74
|
+
issue_number: issueNumber,
|
|
75
|
+
labels,
|
|
76
|
+
}), `set labels on issue #${issueNumber}`);
|
|
77
|
+
return data.map(transformLabel);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* List all labels on an issue
|
|
81
|
+
*/
|
|
82
|
+
async list(issueNumber) {
|
|
83
|
+
const results = await this.client.paginate((params) => this.client.rest.issues.listLabelsOnIssue({
|
|
84
|
+
owner: this.client.owner,
|
|
85
|
+
repo: this.client.repo,
|
|
86
|
+
issue_number: issueNumber,
|
|
87
|
+
...params,
|
|
88
|
+
}), 5);
|
|
89
|
+
return results.map(transformLabel);
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* List all labels in the repository
|
|
93
|
+
*/
|
|
94
|
+
async listForRepo() {
|
|
95
|
+
const results = await this.client.paginate((params) => this.client.rest.issues.listLabelsForRepo({
|
|
96
|
+
owner: this.client.owner,
|
|
97
|
+
repo: this.client.repo,
|
|
98
|
+
...params,
|
|
99
|
+
}), 10);
|
|
100
|
+
return results.map(transformLabel);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Create a label in the repository
|
|
104
|
+
*/
|
|
105
|
+
async create(name, color, description) {
|
|
106
|
+
const { data } = await this.client.request(() => this.client.rest.issues.createLabel({
|
|
107
|
+
owner: this.client.owner,
|
|
108
|
+
repo: this.client.repo,
|
|
109
|
+
name,
|
|
110
|
+
color: color.replace(/^#/, ''), // Remove # prefix if present
|
|
111
|
+
description,
|
|
112
|
+
}), `create label '${name}'`);
|
|
113
|
+
return transformLabel(data);
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Delete a label from the repository
|
|
117
|
+
*/
|
|
118
|
+
async delete(name) {
|
|
119
|
+
await this.client.request(() => this.client.rest.issues.deleteLabel({
|
|
120
|
+
owner: this.client.owner,
|
|
121
|
+
repo: this.client.repo,
|
|
122
|
+
name,
|
|
123
|
+
}), `delete label '${name}'`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Create label operations instance
|
|
128
|
+
*/
|
|
129
|
+
export function createLabelOperations(client) {
|
|
130
|
+
return new LabelOperations(client);
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"labels.js","sourceRoot":"","sources":["../../src/operations/labels.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAE3D;;GAEG;AACH,SAAS,cAAc,CAAC,QAKvB;IACC,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,EAAE;QACf,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,WAAW,EAAE,QAAQ,CAAC,WAAW;KAClC,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAErD;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,MAAgB;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,qBAAqB,CAAC,gCAAgC,CAAC,CAAC;QACpE,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YAChC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,YAAY,EAAE,WAAW;YACzB,MAAM;SACP,CAAC,EACJ,wBAAwB,WAAW,EAAE,CACtC,CAAC;QAEF,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,KAAa;QAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,KAAK;SACZ,CAAC,EACJ,iBAAiB,KAAK,iBAAiB,WAAW,EAAE,CACrD,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,WAAmB,EAAE,MAAgB;QACpD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QAED,mEAAmE;QACnE,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACnB,IAAI,CAAC,MAAM,CAAC,OAAO,CACjB,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,YAAY,EAAE,WAAW;YACzB,IAAI,EAAE,KAAK;SACZ,CAAC,EACJ,iBAAiB,KAAK,iBAAiB,WAAW,EAAE,CACrD,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YAChB,yDAAyD;YACzD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;gBACrC,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,GAAG,CAAC,WAAmB,EAAE,MAAgB;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;YAChC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,YAAY,EAAE,WAAW;YACzB,MAAM;SACP,CAAC,EACJ,wBAAwB,WAAW,EAAE,CACtC,CAAC;QAEF,OAAO,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAClC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,IAAI,CAAC,WAAmB;QAC5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CACxC,CAAC,MAAM,EAAE,EAAE,CACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YACxC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,YAAY,EAAE,WAAW;YACzB,GAAG,MAAM;SACV,CAAC,EACJ,CAAC,CACF,CAAC;QAEF,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,CACxC,CAAC,MAAM,EAAE,EAAE,CACT,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;YACxC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,GAAG,MAAM;SACV,CAAC,EACJ,EAAE,CACH,CAAC;QAEF,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACrC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,KAAa,EAAE,WAAoB;QAC5D,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACxC,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI;YACJ,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,6BAA6B;YAC7D,WAAW;SACZ,CAAC,EACJ,iBAAiB,IAAI,GAAG,CACzB,CAAC;QAEF,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CACvB,GAAG,EAAE,CACH,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;YAClC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,KAAK;YACxB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;YACtB,IAAI;SACL,CAAC,EACJ,iBAAiB,IAAI,GAAG,CACzB,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAoB;IACxD,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { GitHubClient } from '../client.js';
|
|
2
|
+
import type { PullRequest } from '../types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Pull request operations using the GitHub client
|
|
5
|
+
*/
|
|
6
|
+
export declare class PullRequestOperations {
|
|
7
|
+
private readonly client;
|
|
8
|
+
constructor(client: GitHubClient);
|
|
9
|
+
/**
|
|
10
|
+
* Get a pull request by number
|
|
11
|
+
*/
|
|
12
|
+
get(prNumber: number): Promise<PullRequest>;
|
|
13
|
+
/**
|
|
14
|
+
* Link a pull request to an issue by adding a comment
|
|
15
|
+
* Note: GitHub automatically links PRs that reference issues in their description
|
|
16
|
+
* This method adds an explicit link comment
|
|
17
|
+
*/
|
|
18
|
+
linkToIssue(prNumber: number, issueNumber: number): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Get all PRs linked to an issue
|
|
21
|
+
* Uses GitHub's timeline events to find linked PRs
|
|
22
|
+
*/
|
|
23
|
+
getLinkedToIssue(issueNumber: number): Promise<PullRequest[]>;
|
|
24
|
+
/**
|
|
25
|
+
* List all open PRs in the repository
|
|
26
|
+
*/
|
|
27
|
+
listOpen(): Promise<PullRequest[]>;
|
|
28
|
+
/**
|
|
29
|
+
* List PRs by author
|
|
30
|
+
*/
|
|
31
|
+
listByAuthor(authorLogin: string): Promise<PullRequest[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Check if an issue has any linked PRs
|
|
34
|
+
*/
|
|
35
|
+
hasLinkedPRs(issueNumber: number): Promise<boolean>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Create pull request operations instance
|
|
39
|
+
*/
|
|
40
|
+
export declare function createPullRequestOperations(client: GitHubClient): PullRequestOperations;
|
|
41
|
+
//# sourceMappingURL=pull-requests.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-requests.d.ts","sourceRoot":"","sources":["../../src/operations/pull-requests.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAQ,MAAM,mBAAmB,CAAC;AAyD3D;;GAEG;AACH,qBAAa,qBAAqB;IACpB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAEjD;;OAEG;IACG,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAcjD;;;;OAIG;IACG,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAcvE;;;OAGG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IA2DnE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IAexC;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAiB/D;;OAEG;IACG,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAI1D;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,YAAY,GAAG,qBAAqB,CAEvF"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transform GitHub API PR response to our PullRequest type
|
|
3
|
+
*/
|
|
4
|
+
function transformPullRequest(apiPR) {
|
|
5
|
+
// Determine the effective state
|
|
6
|
+
let state = apiPR.state;
|
|
7
|
+
if (apiPR.state === 'closed' && apiPR.merged) {
|
|
8
|
+
state = 'merged';
|
|
9
|
+
}
|
|
10
|
+
// Extract linked issue numbers from PR body
|
|
11
|
+
const linkedIssues = [];
|
|
12
|
+
if (apiPR.body) {
|
|
13
|
+
// Match common patterns: Fixes #123, Closes #456, etc.
|
|
14
|
+
const patterns = [
|
|
15
|
+
/(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+#(\d+)/gi,
|
|
16
|
+
/(?:close[sd]?|fix(?:e[sd])?|resolve[sd]?)\s+(?:https?:\/\/github\.com\/[^/]+\/[^/]+\/issues\/)(\d+)/gi,
|
|
17
|
+
];
|
|
18
|
+
for (const pattern of patterns) {
|
|
19
|
+
let match;
|
|
20
|
+
while ((match = pattern.exec(apiPR.body)) !== null) {
|
|
21
|
+
const issueNum = parseInt(match[1] ?? '', 10);
|
|
22
|
+
if (!isNaN(issueNum) && !linkedIssues.includes(issueNum)) {
|
|
23
|
+
linkedIssues.push(issueNum);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
number: apiPR.number,
|
|
30
|
+
title: apiPR.title,
|
|
31
|
+
state,
|
|
32
|
+
author: apiPR.user
|
|
33
|
+
? {
|
|
34
|
+
id: apiPR.user.id,
|
|
35
|
+
login: apiPR.user.login,
|
|
36
|
+
avatarUrl: apiPR.user.avatar_url,
|
|
37
|
+
type: (apiPR.user.type ?? 'User'),
|
|
38
|
+
}
|
|
39
|
+
: { id: 0, login: 'unknown', avatarUrl: '', type: 'User' },
|
|
40
|
+
htmlUrl: apiPR.html_url,
|
|
41
|
+
linkedIssues,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Pull request operations using the GitHub client
|
|
46
|
+
*/
|
|
47
|
+
export class PullRequestOperations {
|
|
48
|
+
client;
|
|
49
|
+
constructor(client) {
|
|
50
|
+
this.client = client;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Get a pull request by number
|
|
54
|
+
*/
|
|
55
|
+
async get(prNumber) {
|
|
56
|
+
const { data } = await this.client.request(() => this.client.rest.pulls.get({
|
|
57
|
+
owner: this.client.owner,
|
|
58
|
+
repo: this.client.repo,
|
|
59
|
+
pull_number: prNumber,
|
|
60
|
+
}), `get PR #${prNumber}`);
|
|
61
|
+
return transformPullRequest(data);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Link a pull request to an issue by adding a comment
|
|
65
|
+
* Note: GitHub automatically links PRs that reference issues in their description
|
|
66
|
+
* This method adds an explicit link comment
|
|
67
|
+
*/
|
|
68
|
+
async linkToIssue(prNumber, issueNumber) {
|
|
69
|
+
// Add a comment to the PR referencing the issue
|
|
70
|
+
await this.client.request(() => this.client.rest.issues.createComment({
|
|
71
|
+
owner: this.client.owner,
|
|
72
|
+
repo: this.client.repo,
|
|
73
|
+
issue_number: prNumber, // PRs are also issues in GitHub API
|
|
74
|
+
body: `Linked to #${issueNumber}`,
|
|
75
|
+
}), `link PR #${prNumber} to issue #${issueNumber}`);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Get all PRs linked to an issue
|
|
79
|
+
* Uses GitHub's timeline events to find linked PRs
|
|
80
|
+
*/
|
|
81
|
+
async getLinkedToIssue(issueNumber) {
|
|
82
|
+
// First approach: Search for PRs that mention the issue
|
|
83
|
+
const { data: searchResults } = await this.client.request(() => this.client.rest.search.issuesAndPullRequests({
|
|
84
|
+
q: `repo:${this.client.owner}/${this.client.repo} is:pr #${issueNumber}`,
|
|
85
|
+
per_page: 100,
|
|
86
|
+
}), `search PRs linked to issue #${issueNumber}`);
|
|
87
|
+
const pullRequests = [];
|
|
88
|
+
for (const item of searchResults.items) {
|
|
89
|
+
// Verify it's a PR and links to this issue
|
|
90
|
+
if ('pull_request' in item) {
|
|
91
|
+
const pr = await this.get(item.number);
|
|
92
|
+
if (pr.linkedIssues.includes(issueNumber)) {
|
|
93
|
+
pullRequests.push(pr);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
// Second approach: Check timeline events for cross-references
|
|
98
|
+
const { data: timeline } = await this.client.request(() => this.client.rest.issues.listEventsForTimeline({
|
|
99
|
+
owner: this.client.owner,
|
|
100
|
+
repo: this.client.repo,
|
|
101
|
+
issue_number: issueNumber,
|
|
102
|
+
per_page: 100,
|
|
103
|
+
}), `get timeline for issue #${issueNumber}`);
|
|
104
|
+
// Find cross-referenced PRs
|
|
105
|
+
for (const event of timeline) {
|
|
106
|
+
if (event.event === 'cross-referenced' &&
|
|
107
|
+
'source' in event &&
|
|
108
|
+
event.source &&
|
|
109
|
+
typeof event.source === 'object' &&
|
|
110
|
+
'issue' in event.source) {
|
|
111
|
+
const source = event.source;
|
|
112
|
+
if (source.issue?.pull_request) {
|
|
113
|
+
const prNumber = source.issue.number;
|
|
114
|
+
// Avoid duplicates
|
|
115
|
+
if (!pullRequests.some((pr) => pr.number === prNumber)) {
|
|
116
|
+
const pr = await this.get(prNumber);
|
|
117
|
+
pullRequests.push(pr);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return pullRequests;
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* List all open PRs in the repository
|
|
126
|
+
*/
|
|
127
|
+
async listOpen() {
|
|
128
|
+
const results = await this.client.paginate((params) => this.client.rest.pulls.list({
|
|
129
|
+
owner: this.client.owner,
|
|
130
|
+
repo: this.client.repo,
|
|
131
|
+
state: 'open',
|
|
132
|
+
...params,
|
|
133
|
+
}), 10);
|
|
134
|
+
return results.map(transformPullRequest);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* List PRs by author
|
|
138
|
+
*/
|
|
139
|
+
async listByAuthor(authorLogin) {
|
|
140
|
+
const { data } = await this.client.request(() => this.client.rest.search.issuesAndPullRequests({
|
|
141
|
+
q: `repo:${this.client.owner}/${this.client.repo} is:pr author:${authorLogin}`,
|
|
142
|
+
per_page: 100,
|
|
143
|
+
}), `search PRs by author ${authorLogin}`);
|
|
144
|
+
return Promise.all(data.items
|
|
145
|
+
.filter((item) => 'pull_request' in item)
|
|
146
|
+
.map((item) => this.get(item.number)));
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Check if an issue has any linked PRs
|
|
150
|
+
*/
|
|
151
|
+
async hasLinkedPRs(issueNumber) {
|
|
152
|
+
const linkedPRs = await this.getLinkedToIssue(issueNumber);
|
|
153
|
+
return linkedPRs.length > 0;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Create pull request operations instance
|
|
158
|
+
*/
|
|
159
|
+
export function createPullRequestOperations(client) {
|
|
160
|
+
return new PullRequestOperations(client);
|
|
161
|
+
}
|
|
162
|
+
//# sourceMappingURL=pull-requests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pull-requests.js","sourceRoot":"","sources":["../../src/operations/pull-requests.ts"],"names":[],"mappings":"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"}
|