npm-cli-gh-issue-preparator 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,3 +1,10 @@
1
+ ## [1.0.1](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/compare/v1.0.0...v1.0.1) (2025-12-14)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * failed to load PR and over 100 items ([dd1c216](https://github.com/HiromiShikata/npm-cli-gh-issue-preparator/commit/dd1c2164e3ed1b8dcfa1b4de75395f875a8d0de2))
7
+
1
8
  # 1.0.0 (2025-12-14)
2
9
 
3
10
 
@@ -31,10 +31,15 @@ class GitHubIssueRepository {
31
31
  }
32
32
  buildProjectItemsQuery() {
33
33
  return `
34
- query($owner: String!, $number: Int!) {
34
+ query($owner: String!, $number: Int!, $after: String) {
35
35
  organization(login: $owner) {
36
36
  projectV2(number: $number) {
37
- items(first: 100) {
37
+ items(first: 100, after: $after) {
38
+ totalCount
39
+ pageInfo {
40
+ endCursor
41
+ hasNextPage
42
+ }
38
43
  nodes {
39
44
  id
40
45
  content {
@@ -48,6 +53,16 @@ class GitHubIssueRepository {
48
53
  }
49
54
  }
50
55
  }
56
+ ... on PullRequest {
57
+ url
58
+ title
59
+ number
60
+ labels(first: 10) {
61
+ nodes {
62
+ name
63
+ }
64
+ }
65
+ }
51
66
  }
52
67
  fieldValues(first: 20) {
53
68
  nodes {
@@ -76,7 +91,12 @@ class GitHubIssueRepository {
76
91
  }
77
92
  user(login: $owner) {
78
93
  projectV2(number: $number) {
79
- items(first: 100) {
94
+ items(first: 100, after: $after) {
95
+ totalCount
96
+ pageInfo {
97
+ endCursor
98
+ hasNextPage
99
+ }
80
100
  nodes {
81
101
  id
82
102
  content {
@@ -90,6 +110,16 @@ class GitHubIssueRepository {
90
110
  }
91
111
  }
92
112
  }
113
+ ... on PullRequest {
114
+ url
115
+ title
116
+ number
117
+ labels(first: 10) {
118
+ nodes {
119
+ name
120
+ }
121
+ }
122
+ }
93
123
  }
94
124
  fieldValues(first: 20) {
95
125
  nodes {
@@ -198,45 +228,57 @@ class GitHubIssueRepository {
198
228
  async getAllOpened(project) {
199
229
  const { owner, projectNumber } = this.parseProjectInfo(project);
200
230
  const query = this.buildProjectItemsQuery();
201
- const response = await fetch('https://api.github.com/graphql', {
202
- method: 'POST',
203
- headers: {
204
- Authorization: `Bearer ${this.token}`,
205
- 'Content-Type': 'application/json',
206
- },
207
- body: JSON.stringify({
208
- query,
209
- variables: {
210
- owner,
211
- number: projectNumber,
212
- },
213
- }),
214
- });
215
- if (!response.ok) {
216
- const errorText = await response.text();
217
- throw new Error(`GitHub API error: ${errorText}`);
218
- }
219
- const responseData = await response.json();
220
- if (!isProjectItemsResponse(responseData)) {
221
- throw new Error('Invalid API response format');
222
- }
223
- const result = responseData;
224
- const items = result.data?.organization?.projectV2?.items.nodes ||
225
- result.data?.user?.projectV2?.items.nodes ||
226
- [];
227
231
  const issues = [];
228
- for (const item of items) {
229
- if (!item.content)
230
- continue;
231
- const statusField = item.fieldValues?.nodes.find((fv) => fv.field?.name === 'Status');
232
- const status = statusField?.name || '';
233
- issues.push({
234
- id: item.id,
235
- url: item.content.url,
236
- title: item.content.title,
237
- labels: item.content.labels.nodes.map((l) => l.name),
238
- status,
232
+ let after = null;
233
+ let hasNextPage = true;
234
+ while (hasNextPage) {
235
+ const response = await fetch('https://api.github.com/graphql', {
236
+ method: 'POST',
237
+ headers: {
238
+ Authorization: `Bearer ${this.token}`,
239
+ 'Content-Type': 'application/json',
240
+ },
241
+ body: JSON.stringify({
242
+ query,
243
+ variables: {
244
+ owner,
245
+ number: projectNumber,
246
+ after,
247
+ },
248
+ }),
239
249
  });
250
+ if (!response.ok) {
251
+ const errorText = await response.text();
252
+ throw new Error(`GitHub API error: ${errorText}`);
253
+ }
254
+ const responseData = await response.json();
255
+ if (!isProjectItemsResponse(responseData)) {
256
+ throw new Error('Invalid API response format');
257
+ }
258
+ const result = responseData;
259
+ const projectData = result.data?.organization?.projectV2 || result.data?.user?.projectV2;
260
+ if (!projectData) {
261
+ break;
262
+ }
263
+ const items = projectData.items.nodes;
264
+ for (const item of items) {
265
+ if (!item.content)
266
+ continue;
267
+ const statusField = item.fieldValues?.nodes.find((fv) => fv.field?.name === 'Status');
268
+ const status = statusField?.name || '';
269
+ if (item.content.url === undefined) {
270
+ continue;
271
+ }
272
+ issues.push({
273
+ id: item.id,
274
+ url: item.content.url,
275
+ title: item.content.title,
276
+ labels: item.content.labels?.nodes?.map((l) => l.name) || [],
277
+ status,
278
+ });
279
+ }
280
+ hasNextPage = projectData.items.pageInfo.hasNextPage;
281
+ after = projectData.items.pageInfo.endCursor;
240
282
  }
241
283
  return issues;
242
284
  }
@@ -293,45 +335,54 @@ class GitHubIssueRepository {
293
335
  async get(issueUrl, project) {
294
336
  const { owner, projectNumber } = this.parseProjectInfo(project);
295
337
  const query = this.buildProjectItemsQuery();
296
- const response = await fetch('https://api.github.com/graphql', {
297
- method: 'POST',
298
- headers: {
299
- Authorization: `Bearer ${this.token}`,
300
- 'Content-Type': 'application/json',
301
- },
302
- body: JSON.stringify({
303
- query,
304
- variables: {
305
- owner,
306
- number: projectNumber,
338
+ let after = null;
339
+ let hasNextPage = true;
340
+ while (hasNextPage) {
341
+ const response = await fetch('https://api.github.com/graphql', {
342
+ method: 'POST',
343
+ headers: {
344
+ Authorization: `Bearer ${this.token}`,
345
+ 'Content-Type': 'application/json',
307
346
  },
308
- }),
309
- });
310
- if (!response.ok) {
311
- return null;
312
- }
313
- const responseData = await response.json();
314
- if (!isProjectItemsResponse(responseData)) {
315
- return null;
316
- }
317
- const result = responseData;
318
- const items = result.data?.organization?.projectV2?.items.nodes ||
319
- result.data?.user?.projectV2?.items.nodes ||
320
- [];
321
- for (const item of items) {
322
- if (!item.content)
323
- continue;
324
- if (item.content.url === issueUrl) {
325
- const statusField = item.fieldValues?.nodes.find((fv) => fv.field?.name === 'Status');
326
- const status = statusField?.name || '';
327
- return {
328
- id: item.id,
329
- url: item.content.url,
330
- title: item.content.title,
331
- labels: item.content.labels.nodes.map((l) => l.name),
332
- status,
333
- };
347
+ body: JSON.stringify({
348
+ query,
349
+ variables: {
350
+ owner,
351
+ number: projectNumber,
352
+ after,
353
+ },
354
+ }),
355
+ });
356
+ if (!response.ok) {
357
+ return null;
358
+ }
359
+ const responseData = await response.json();
360
+ if (!isProjectItemsResponse(responseData)) {
361
+ return null;
362
+ }
363
+ const result = responseData;
364
+ const projectData = result.data?.organization?.projectV2 || result.data?.user?.projectV2;
365
+ if (!projectData) {
366
+ return null;
367
+ }
368
+ const items = projectData.items.nodes;
369
+ for (const item of items) {
370
+ if (!item.content)
371
+ continue;
372
+ if (item.content.url === issueUrl) {
373
+ const statusField = item.fieldValues?.nodes.find((fv) => fv.field?.name === 'Status');
374
+ const status = statusField?.name || '';
375
+ return {
376
+ id: item.id,
377
+ url: item.content.url,
378
+ title: item.content.title,
379
+ labels: item.content.labels?.nodes?.map((l) => l.name) || [],
380
+ status,
381
+ };
382
+ }
334
383
  }
384
+ hasNextPage = projectData.items.pageInfo.hasNextPage;
385
+ after = projectData.items.pageInfo.endCursor;
335
386
  }
336
387
  return null;
337
388
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GitHubIssueRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GitHubIssueRepository.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GitHubIssueRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GitHubIssueRepository.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "npm-cli-gh-issue-preparator",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "",
5
5
  "main": "bin/index.js",
6
6
  "scripts": {
@@ -10,41 +10,57 @@ describe('GitHubIssueRepository Integration Test', () => {
10
10
  const issueUrl =
11
11
  'https://github.com/HiromiShikata/test-repository/issues/1552';
12
12
 
13
- it('should update issue status from Awaiting workspace to Preparation and verify the change', async () => {
14
- if (!token) {
15
- throw new Error('GH_TOKEN environment variable is required');
16
- }
17
-
18
- const repository = new GitHubIssueRepository(token);
19
- const projectRepository = new GitHubProjectRepository(token);
20
- const project = await projectRepository.getByUrl(projectUrl);
21
-
22
- const initialIssue = await repository.get(issueUrl, project);
23
- expect(initialIssue).not.toBeNull();
24
- if (!initialIssue) {
25
- throw new Error('Failed to get initial issue');
26
- }
27
-
28
- initialIssue.status = 'Awaiting workspace';
29
- await repository.update(initialIssue, project);
30
-
31
- const reloadedIssue = await repository.get(issueUrl, project);
32
- if (!reloadedIssue) {
33
- throw new Error('Failed to get reloaded issue');
34
- }
35
- expect(reloadedIssue.status).toBe('Awaiting workspace');
36
-
37
- reloadedIssue.status = 'Preparation';
38
- await repository.update(reloadedIssue, project);
39
-
40
- const verifyIssue = await repository.get(issueUrl, project);
41
- expect(verifyIssue).not.toBeNull();
42
- if (!verifyIssue) {
43
- throw new Error('Failed to get verify issue');
44
- }
45
- expect(verifyIssue.status).toBe('Preparation');
46
-
47
- verifyIssue.status = 'Awaiting workspace';
48
- await repository.update(verifyIssue, project);
49
- }, 60000);
13
+ describe('getgetAllOpened', () => {
14
+ it('should get all opened issues and verify the list is not empty', async () => {
15
+ if (!token) {
16
+ throw new Error('GH_TOKEN environment variable is required');
17
+ }
18
+
19
+ const repository = new GitHubIssueRepository(token);
20
+ const projectRepository = new GitHubProjectRepository(token);
21
+ const project = await projectRepository.getByUrl(projectUrl);
22
+
23
+ const openedIssues = await repository.getAllOpened(project);
24
+ expect(openedIssues.length).toBeGreaterThan(0);
25
+ }, 60000);
26
+ });
27
+ describe('update', () => {
28
+ it('should update issue status from Awaiting workspace to Preparation and verify the change', async () => {
29
+ if (!token) {
30
+ throw new Error('GH_TOKEN environment variable is required');
31
+ }
32
+
33
+ const repository = new GitHubIssueRepository(token);
34
+ const projectRepository = new GitHubProjectRepository(token);
35
+ const project = await projectRepository.getByUrl(projectUrl);
36
+
37
+ const initialIssue = await repository.get(issueUrl, project);
38
+ expect(initialIssue).not.toBeNull();
39
+ if (!initialIssue) {
40
+ throw new Error('Failed to get initial issue');
41
+ }
42
+
43
+ initialIssue.status = 'Awaiting workspace';
44
+ await repository.update(initialIssue, project);
45
+
46
+ const reloadedIssue = await repository.get(issueUrl, project);
47
+ if (!reloadedIssue) {
48
+ throw new Error('Failed to get reloaded issue');
49
+ }
50
+ expect(reloadedIssue.status).toBe('Awaiting workspace');
51
+
52
+ reloadedIssue.status = 'Preparation';
53
+ await repository.update(reloadedIssue, project);
54
+
55
+ const verifyIssue = await repository.get(issueUrl, project);
56
+ expect(verifyIssue).not.toBeNull();
57
+ if (!verifyIssue) {
58
+ throw new Error('Failed to get verify issue');
59
+ }
60
+ expect(verifyIssue.status).toBe('Preparation');
61
+
62
+ verifyIssue.status = 'Awaiting workspace';
63
+ await repository.update(verifyIssue, project);
64
+ }, 60000);
65
+ });
50
66
  });
@@ -38,6 +38,11 @@ describe('GitHubIssueRepository', () => {
38
38
  organization: {
39
39
  projectV2: {
40
40
  items: {
41
+ totalCount: 2,
42
+ pageInfo: {
43
+ endCursor: null,
44
+ hasNextPage: false,
45
+ },
41
46
  nodes: [
42
47
  {
43
48
  id: 'issue-1',
@@ -149,6 +154,11 @@ describe('GitHubIssueRepository', () => {
149
154
  user: {
150
155
  projectV2: {
151
156
  items: {
157
+ totalCount: 1,
158
+ pageInfo: {
159
+ endCursor: null,
160
+ hasNextPage: false,
161
+ },
152
162
  nodes: [
153
163
  {
154
164
  id: 'user-issue-1',
@@ -199,6 +209,11 @@ describe('GitHubIssueRepository', () => {
199
209
  organization: {
200
210
  projectV2: {
201
211
  items: {
212
+ totalCount: 2,
213
+ pageInfo: {
214
+ endCursor: null,
215
+ hasNextPage: false,
216
+ },
202
217
  nodes: [
203
218
  {
204
219
  id: 'item-without-content',
@@ -263,6 +278,11 @@ describe('GitHubIssueRepository', () => {
263
278
  organization: {
264
279
  projectV2: {
265
280
  items: {
281
+ totalCount: 1,
282
+ pageInfo: {
283
+ endCursor: null,
284
+ hasNextPage: false,
285
+ },
266
286
  nodes: [
267
287
  {
268
288
  id: 'issue-no-status',
@@ -728,6 +748,11 @@ describe('GitHubIssueRepository', () => {
728
748
  organization: {
729
749
  projectV2: {
730
750
  items: {
751
+ totalCount: 1,
752
+ pageInfo: {
753
+ endCursor: null,
754
+ hasNextPage: false,
755
+ },
731
756
  nodes: [
732
757
  {
733
758
  id: 'issue-1',
@@ -805,6 +830,11 @@ describe('GitHubIssueRepository', () => {
805
830
  organization: {
806
831
  projectV2: {
807
832
  items: {
833
+ totalCount: 0,
834
+ pageInfo: {
835
+ endCursor: null,
836
+ hasNextPage: false,
837
+ },
808
838
  nodes: [],
809
839
  },
810
840
  },
@@ -828,6 +858,11 @@ describe('GitHubIssueRepository', () => {
828
858
  user: {
829
859
  projectV2: {
830
860
  items: {
861
+ totalCount: 1,
862
+ pageInfo: {
863
+ endCursor: null,
864
+ hasNextPage: false,
865
+ },
831
866
  nodes: [
832
867
  {
833
868
  id: 'issue-2',
@@ -880,6 +915,11 @@ describe('GitHubIssueRepository', () => {
880
915
  organization: {
881
916
  projectV2: {
882
917
  items: {
918
+ totalCount: 1,
919
+ pageInfo: {
920
+ endCursor: null,
921
+ hasNextPage: false,
922
+ },
883
923
  nodes: [
884
924
  {
885
925
  id: 'issue-3',
@@ -27,6 +27,11 @@ type ProjectItemsResponse = {
27
27
  organization?: {
28
28
  projectV2?: {
29
29
  items: {
30
+ totalCount: number;
31
+ pageInfo: {
32
+ endCursor: string;
33
+ hasNextPage: boolean;
34
+ };
30
35
  nodes: ProjectItem[];
31
36
  };
32
37
  };
@@ -34,6 +39,11 @@ type ProjectItemsResponse = {
34
39
  user?: {
35
40
  projectV2?: {
36
41
  items: {
42
+ totalCount: number;
43
+ pageInfo: {
44
+ endCursor: string;
45
+ hasNextPage: boolean;
46
+ };
37
47
  nodes: ProjectItem[];
38
48
  };
39
49
  };
@@ -117,10 +127,15 @@ export class GitHubIssueRepository implements IssueRepository {
117
127
 
118
128
  private buildProjectItemsQuery(): string {
119
129
  return `
120
- query($owner: String!, $number: Int!) {
130
+ query($owner: String!, $number: Int!, $after: String) {
121
131
  organization(login: $owner) {
122
132
  projectV2(number: $number) {
123
- items(first: 100) {
133
+ items(first: 100, after: $after) {
134
+ totalCount
135
+ pageInfo {
136
+ endCursor
137
+ hasNextPage
138
+ }
124
139
  nodes {
125
140
  id
126
141
  content {
@@ -134,6 +149,16 @@ export class GitHubIssueRepository implements IssueRepository {
134
149
  }
135
150
  }
136
151
  }
152
+ ... on PullRequest {
153
+ url
154
+ title
155
+ number
156
+ labels(first: 10) {
157
+ nodes {
158
+ name
159
+ }
160
+ }
161
+ }
137
162
  }
138
163
  fieldValues(first: 20) {
139
164
  nodes {
@@ -162,7 +187,12 @@ export class GitHubIssueRepository implements IssueRepository {
162
187
  }
163
188
  user(login: $owner) {
164
189
  projectV2(number: $number) {
165
- items(first: 100) {
190
+ items(first: 100, after: $after) {
191
+ totalCount
192
+ pageInfo {
193
+ endCursor
194
+ hasNextPage
195
+ }
166
196
  nodes {
167
197
  id
168
198
  content {
@@ -176,6 +206,16 @@ export class GitHubIssueRepository implements IssueRepository {
176
206
  }
177
207
  }
178
208
  }
209
+ ... on PullRequest {
210
+ url
211
+ title
212
+ number
213
+ labels(first: 10) {
214
+ nodes {
215
+ name
216
+ }
217
+ }
218
+ }
179
219
  }
180
220
  fieldValues(first: 20) {
181
221
  nodes {
@@ -300,53 +340,69 @@ export class GitHubIssueRepository implements IssueRepository {
300
340
 
301
341
  const query = this.buildProjectItemsQuery();
302
342
 
303
- const response = await fetch('https://api.github.com/graphql', {
304
- method: 'POST',
305
- headers: {
306
- Authorization: `Bearer ${this.token}`,
307
- 'Content-Type': 'application/json',
308
- },
309
- body: JSON.stringify({
310
- query,
311
- variables: {
312
- owner,
313
- number: projectNumber,
343
+ const issues: Issue[] = [];
344
+ let after: string | null = null;
345
+ let hasNextPage = true;
346
+
347
+ while (hasNextPage) {
348
+ const response = await fetch('https://api.github.com/graphql', {
349
+ method: 'POST',
350
+ headers: {
351
+ Authorization: `Bearer ${this.token}`,
352
+ 'Content-Type': 'application/json',
314
353
  },
315
- }),
316
- });
354
+ body: JSON.stringify({
355
+ query,
356
+ variables: {
357
+ owner,
358
+ number: projectNumber,
359
+ after,
360
+ },
361
+ }),
362
+ });
317
363
 
318
- if (!response.ok) {
319
- const errorText = await response.text();
320
- throw new Error(`GitHub API error: ${errorText}`);
321
- }
364
+ if (!response.ok) {
365
+ const errorText = await response.text();
366
+ throw new Error(`GitHub API error: ${errorText}`);
367
+ }
322
368
 
323
- const responseData: unknown = await response.json();
324
- if (!isProjectItemsResponse(responseData)) {
325
- throw new Error('Invalid API response format');
326
- }
369
+ const responseData: unknown = await response.json();
370
+ if (!isProjectItemsResponse(responseData)) {
371
+ throw new Error('Invalid API response format');
372
+ }
327
373
 
328
- const result: ProjectItemsResponse = responseData;
329
- const items =
330
- result.data?.organization?.projectV2?.items.nodes ||
331
- result.data?.user?.projectV2?.items.nodes ||
332
- [];
374
+ const result: ProjectItemsResponse = responseData;
375
+ const projectData =
376
+ result.data?.organization?.projectV2 || result.data?.user?.projectV2;
333
377
 
334
- const issues: Issue[] = [];
335
- for (const item of items) {
336
- if (!item.content) continue;
337
-
338
- const statusField = item.fieldValues?.nodes.find(
339
- (fv) => fv.field?.name === 'Status',
340
- );
341
- const status = statusField?.name || '';
342
-
343
- issues.push({
344
- id: item.id,
345
- url: item.content.url,
346
- title: item.content.title,
347
- labels: item.content.labels.nodes.map((l) => l.name),
348
- status,
349
- });
378
+ if (!projectData) {
379
+ break;
380
+ }
381
+
382
+ const items = projectData.items.nodes;
383
+
384
+ for (const item of items) {
385
+ if (!item.content) continue;
386
+
387
+ const statusField = item.fieldValues?.nodes.find(
388
+ (fv) => fv.field?.name === 'Status',
389
+ );
390
+ const status = statusField?.name || '';
391
+
392
+ if (item.content.url === undefined) {
393
+ continue;
394
+ }
395
+ issues.push({
396
+ id: item.id,
397
+ url: item.content.url,
398
+ title: item.content.title,
399
+ labels: item.content.labels?.nodes?.map((l) => l.name) || [],
400
+ status,
401
+ });
402
+ }
403
+
404
+ hasNextPage = projectData.items.pageInfo.hasNextPage;
405
+ after = projectData.items.pageInfo.endCursor;
350
406
  }
351
407
 
352
408
  return issues;
@@ -416,53 +472,66 @@ export class GitHubIssueRepository implements IssueRepository {
416
472
 
417
473
  const query = this.buildProjectItemsQuery();
418
474
 
419
- const response = await fetch('https://api.github.com/graphql', {
420
- method: 'POST',
421
- headers: {
422
- Authorization: `Bearer ${this.token}`,
423
- 'Content-Type': 'application/json',
424
- },
425
- body: JSON.stringify({
426
- query,
427
- variables: {
428
- owner,
429
- number: projectNumber,
475
+ let after: string | null = null;
476
+ let hasNextPage = true;
477
+
478
+ while (hasNextPage) {
479
+ const response = await fetch('https://api.github.com/graphql', {
480
+ method: 'POST',
481
+ headers: {
482
+ Authorization: `Bearer ${this.token}`,
483
+ 'Content-Type': 'application/json',
430
484
  },
431
- }),
432
- });
485
+ body: JSON.stringify({
486
+ query,
487
+ variables: {
488
+ owner,
489
+ number: projectNumber,
490
+ after,
491
+ },
492
+ }),
493
+ });
433
494
 
434
- if (!response.ok) {
435
- return null;
436
- }
495
+ if (!response.ok) {
496
+ return null;
497
+ }
437
498
 
438
- const responseData: unknown = await response.json();
439
- if (!isProjectItemsResponse(responseData)) {
440
- return null;
441
- }
499
+ const responseData: unknown = await response.json();
500
+ if (!isProjectItemsResponse(responseData)) {
501
+ return null;
502
+ }
442
503
 
443
- const result: ProjectItemsResponse = responseData;
444
- const items =
445
- result.data?.organization?.projectV2?.items.nodes ||
446
- result.data?.user?.projectV2?.items.nodes ||
447
- [];
504
+ const result: ProjectItemsResponse = responseData;
505
+ const projectData =
506
+ result.data?.organization?.projectV2 || result.data?.user?.projectV2;
448
507
 
449
- for (const item of items) {
450
- if (!item.content) continue;
508
+ if (!projectData) {
509
+ return null;
510
+ }
451
511
 
452
- if (item.content.url === issueUrl) {
453
- const statusField = item.fieldValues?.nodes.find(
454
- (fv) => fv.field?.name === 'Status',
455
- );
456
- const status = statusField?.name || '';
512
+ const items = projectData.items.nodes;
457
513
 
458
- return {
459
- id: item.id,
460
- url: item.content.url,
461
- title: item.content.title,
462
- labels: item.content.labels.nodes.map((l) => l.name),
463
- status,
464
- };
514
+ for (const item of items) {
515
+ if (!item.content) continue;
516
+
517
+ if (item.content.url === issueUrl) {
518
+ const statusField = item.fieldValues?.nodes.find(
519
+ (fv) => fv.field?.name === 'Status',
520
+ );
521
+ const status = statusField?.name || '';
522
+
523
+ return {
524
+ id: item.id,
525
+ url: item.content.url,
526
+ title: item.content.title,
527
+ labels: item.content.labels?.nodes?.map((l) => l.name) || [],
528
+ status,
529
+ };
530
+ }
465
531
  }
532
+
533
+ hasNextPage = projectData.items.pageInfo.hasNextPage;
534
+ after = projectData.items.pageInfo.endCursor;
466
535
  }
467
536
 
468
537
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"GitHubIssueRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/GitHubIssueRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAgGxD,qBAAa,qBAAsB,YAAW,eAAe;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,MAAM;IAE1C,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,sBAAsB;YA2FhB,iBAAiB;IAyFzB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAyDhD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2DrD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;CAwDrE"}
1
+ {"version":3,"file":"GitHubIssueRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/GitHubIssueRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,0DAA0D,CAAC;AAC3F,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AA0GxD,qBAAa,qBAAsB,YAAW,eAAe;IAC/C,OAAO,CAAC,QAAQ,CAAC,KAAK;gBAAL,KAAK,EAAE,MAAM;IAE1C,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,sBAAsB;YAyHhB,iBAAiB;IAyFzB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC;IAyEhD,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA2DrD,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;CAqErE"}