github-issue-tower-defence-management 1.7.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.github/workflows/create-pr.yml +3 -1
- package/.github/workflows/test.yml +4 -0
- package/CHANGELOG.md +3 -3
- package/CONTRIBUTING.md +1 -48
- package/bin/adapter/repositories/GraphqlProjectRepository.js +1 -79
- package/bin/adapter/repositories/GraphqlProjectRepository.js.map +1 -1
- package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js +7 -6
- package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js.map +1 -1
- package/package.json +1 -1
- package/src/adapter/repositories/GraphqlProjectRepository.test.ts +4 -183
- package/src/adapter/repositories/GraphqlProjectRepository.ts +1 -119
- package/src/adapter/repositories/issue/CheerioIssueRepository.test.ts +21 -56
- package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.test.ts +1 -0
- package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts +7 -6
- package/types/adapter/repositories/GraphqlProjectRepository.d.ts +0 -3
- package/types/adapter/repositories/GraphqlProjectRepository.d.ts.map +1 -1
- package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
## [1.7.1](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.7.0...v1.7.1) (2025-01-19)
|
|
2
2
|
|
|
3
3
|
|
|
4
|
-
###
|
|
4
|
+
### Bug Fixes
|
|
5
5
|
|
|
6
|
-
*
|
|
6
|
+
* update version in package.json ([f413ba6](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/commit/f413ba6cf6ca8ea824280d1236e6809f70974ac1))
|
|
7
7
|
|
|
8
8
|
# [1.6.0](https://github.com/HiromiShikata/npm-cli-github-issue-tower-defence-management/compare/v1.5.0...v1.6.0) (2025-01-08)
|
|
9
9
|
|
package/CONTRIBUTING.md
CHANGED
|
@@ -36,58 +36,11 @@ We aim for a type-safe programming style, so please avoid using `any` or `as`. I
|
|
|
36
36
|
|
|
37
37
|
### Code Style
|
|
38
38
|
|
|
39
|
-
- As a general rule, please refrain from writing comments whenever possible.
|
|
39
|
+
- As a general rule, please refrain from writing comments in source code whenever possible.
|
|
40
40
|
- Your first approach should be to make your variable and function names as descriptive and self-explanatory as possible.
|
|
41
41
|
- Only when this is not sufficient, and the functionality or purpose of the code is not immediately clear, should comments be used.
|
|
42
42
|
- We encourage the use of the arrow function style as much as possible. It offers a more concise syntax and aligns with contemporary JavaScript practices. Please favor this style when contributing to our codebase.
|
|
43
43
|
|
|
44
|
-
## Writing Tests
|
|
45
|
-
|
|
46
|
-
Testing is a crucial part of our development process. We expect all code contributions to be accompanied by corresponding tests. This helps us maintain the quality of the project and catch any potential issues early.
|
|
47
|
-
|
|
48
|
-
### Unit Test Template
|
|
49
|
-
|
|
50
|
-
```
|
|
51
|
-
import { ReplaceAllWords } from './ReplaceAllWords';
|
|
52
|
-
import { FileRepository } from './adapter-interfaces/FileRepository';
|
|
53
|
-
import { StringConvertor } from './adapter-interfaces/StringConvertor';
|
|
54
|
-
type Mocked<T> = jest.Mocked<T> & jest.MockedObject<T>
|
|
55
|
-
|
|
56
|
-
describe('ReplaceAllWords', () => {
|
|
57
|
-
|
|
58
|
-
beforeEach(() => {
|
|
59
|
-
jest.resetAllMocks();
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
const createUseCaseAndMockRepositories = ()=>{
|
|
63
|
-
const fileRepository: Mocked<FileRepository> = {
|
|
64
|
-
readdirSync: jest.fn(),
|
|
65
|
-
renameSync: jest.fn(),
|
|
66
|
-
lstatSync: jest.fn(),
|
|
67
|
-
statSync: jest.fn(),
|
|
68
|
-
readFileSync: jest.fn(),
|
|
69
|
-
writeFileSync: jest.fn(),
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const stringConvertor: Mocked<StringConvertor> = {
|
|
73
|
-
camelCase: jest.fn(),
|
|
74
|
-
snakeCase: jest.fn(),
|
|
75
|
-
pascalCase: jest.fn(),
|
|
76
|
-
kebabCase: jest.fn(),
|
|
77
|
-
screamSnakeCase: jest.fn(),
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
const useCase: ReplaceAllWords = new ReplaceAllWords(fileRepository, stringConvertor);
|
|
81
|
-
return {
|
|
82
|
-
fileRepository,
|
|
83
|
-
stringConvertor,
|
|
84
|
-
useCase
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
```
|
|
90
|
-
|
|
91
44
|
## How to Submit Changes
|
|
92
45
|
|
|
93
46
|
Once you've identified a bug or an enhancement you'd like to work on, follow these steps to make and submit your changes:
|
|
@@ -45,14 +45,10 @@ class GraphqlProjectRepository extends BaseGitHubRepository_1.BaseGitHubReposito
|
|
|
45
45
|
},
|
|
46
46
|
data: JSON.stringify(graphqlQuery),
|
|
47
47
|
});
|
|
48
|
-
if (!response?.data?.data?.organization?.projectV2?.id &&
|
|
49
|
-
!response?.data?.data?.user?.projectV2?.id) {
|
|
50
|
-
throw new Error('Project or item not found');
|
|
51
|
-
}
|
|
52
48
|
const projectId = response.data.data.organization?.projectV2?.id ||
|
|
53
49
|
response.data.data.user?.projectV2?.id;
|
|
54
50
|
if (!projectId) {
|
|
55
|
-
throw new Error('
|
|
51
|
+
throw new Error('projectId is not found');
|
|
56
52
|
}
|
|
57
53
|
return projectId;
|
|
58
54
|
};
|
|
@@ -195,80 +191,6 @@ class GraphqlProjectRepository extends BaseGitHubRepository_1.BaseGitHubReposito
|
|
|
195
191
|
: null,
|
|
196
192
|
};
|
|
197
193
|
};
|
|
198
|
-
this.removeItemFromProject = async (projectId, itemId) => {
|
|
199
|
-
const graphqlQuery = {
|
|
200
|
-
query: `mutation removeItem($projectId: ID!, $itemId: ID!) {
|
|
201
|
-
deleteProjectV2Item(input: { projectId: $projectId, itemId: $itemId }) {
|
|
202
|
-
clientMutationId
|
|
203
|
-
}
|
|
204
|
-
}`,
|
|
205
|
-
variables: {
|
|
206
|
-
projectId,
|
|
207
|
-
itemId,
|
|
208
|
-
},
|
|
209
|
-
};
|
|
210
|
-
const response = await (0, axios_1.default)({
|
|
211
|
-
url: 'https://api.github.com/graphql',
|
|
212
|
-
method: 'post',
|
|
213
|
-
headers: {
|
|
214
|
-
Authorization: `Bearer ${this.ghToken}`,
|
|
215
|
-
'Content-Type': 'application/json',
|
|
216
|
-
},
|
|
217
|
-
data: JSON.stringify(graphqlQuery),
|
|
218
|
-
});
|
|
219
|
-
if (response?.data?.errors || !response?.data?.data?.deleteProjectV2Item) {
|
|
220
|
-
throw new Error('Project or item not found');
|
|
221
|
-
}
|
|
222
|
-
};
|
|
223
|
-
this.removeItemFromProjectByIssueUrl = async (projectUrl, issueUrl) => {
|
|
224
|
-
const projectId = await this.findProjectIdByUrl(projectUrl);
|
|
225
|
-
if (!projectId) {
|
|
226
|
-
throw new Error('Project or item not found');
|
|
227
|
-
}
|
|
228
|
-
const itemId = await this.fetchItemIdFromIssueUrl(projectId, issueUrl);
|
|
229
|
-
if (!itemId) {
|
|
230
|
-
throw new Error('Project or item not found');
|
|
231
|
-
}
|
|
232
|
-
await this.removeItemFromProject(projectId, itemId);
|
|
233
|
-
};
|
|
234
|
-
this.fetchItemIdFromIssueUrl = async (projectId, issueUrl) => {
|
|
235
|
-
if (!projectId) {
|
|
236
|
-
throw new Error('Project ID is required');
|
|
237
|
-
}
|
|
238
|
-
const { owner, repo, issueNumber } = this.extractIssueFromUrl(issueUrl);
|
|
239
|
-
const graphqlQuery = {
|
|
240
|
-
query: `query GetProjectItemID($owner: String!, $name: String!, $issueNumber: Int!) {
|
|
241
|
-
repository(owner: $owner, name: $name) {
|
|
242
|
-
issue(number: $issueNumber) {
|
|
243
|
-
projectItems(first: 2) {
|
|
244
|
-
nodes {
|
|
245
|
-
id
|
|
246
|
-
project {
|
|
247
|
-
id
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
}`,
|
|
254
|
-
variables: {
|
|
255
|
-
owner,
|
|
256
|
-
name: repo,
|
|
257
|
-
issueNumber,
|
|
258
|
-
},
|
|
259
|
-
};
|
|
260
|
-
const response = await (0, axios_1.default)({
|
|
261
|
-
url: 'https://api.github.com/graphql',
|
|
262
|
-
method: 'post',
|
|
263
|
-
headers: {
|
|
264
|
-
Authorization: `Bearer ${this.ghToken}`,
|
|
265
|
-
'Content-Type': 'application/json',
|
|
266
|
-
},
|
|
267
|
-
data: JSON.stringify(graphqlQuery),
|
|
268
|
-
});
|
|
269
|
-
const projectItems = response.data.data.repository.issue.projectItems.nodes;
|
|
270
|
-
return projectItems.find((item) => item.project.id === projectId)?.id;
|
|
271
|
-
};
|
|
272
194
|
}
|
|
273
195
|
}
|
|
274
196
|
exports.GraphqlProjectRepository = GraphqlProjectRepository;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphqlProjectRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GraphqlProjectRepository.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,iEAA8D;AAG9D,mCAA6C;AAE7C,MAAa,wBACX,SAAQ,2CAAoB;IAD9B;;QAIE,0BAAqB,GAAG,CACtB,UAAkB,EAIlB,EAAE;YACF,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;YAChC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC5C,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC;QAClC,CAAC,CAAC;QACF,mBAAc,GAAG,KAAK,EACpB,KAAa,EACb,aAAqB,EACJ,EAAE;YACnB,MAAM,YAAY,GAAG;gBACnB,KAAK,EAAE;;;;;;;;;;;EAWX;gBACI,SAAS,EAAE;oBACT,KAAK,EAAE,KAAK;oBACZ,MAAM,EAAE,aAAa;iBACtB;aACF,CAAC;YAEF,MAAM,QAAQ,GAAG,MAAM,IAAA,eAAK,EAazB;gBACD,GAAG,EAAE,gCAAgC;gBACrC,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;oBACvC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;aACnC,CAAC,CAAC;YAEH,
|
|
1
|
+
{"version":3,"file":"GraphqlProjectRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GraphqlProjectRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,14 +61,15 @@ class InternalGraphqlIssueRepository extends BaseGitHubRepository_1.BaseGitHubRe
|
|
|
61
61
|
};
|
|
62
62
|
const frontTimelineItems = [];
|
|
63
63
|
let nextCursor = cursor;
|
|
64
|
-
|
|
64
|
+
const maxCountPerRequest = 250;
|
|
65
65
|
while (frontTimelineItems.length < maxCount) {
|
|
66
|
-
const response = await callQuery(query,
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
66
|
+
const response = await callQuery(query, maxCountPerRequest, nextCursor, issueId);
|
|
67
|
+
for (const edge of response.edges) {
|
|
68
|
+
frontTimelineItems.push(edge);
|
|
69
|
+
if (frontTimelineItems.length >= maxCount) {
|
|
70
|
+
return frontTimelineItems;
|
|
71
|
+
}
|
|
70
72
|
}
|
|
71
|
-
remainingCount -= response.edges.length;
|
|
72
73
|
nextCursor = response.pageInfo.endCursor;
|
|
73
74
|
if (!response.pageInfo.hasNextPage) {
|
|
74
75
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InternalGraphqlIssueRepository.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,kEAA+D;AAC/D,kDAA0B;AAC1B,6DAG8B;AA4G9B,MAAa,8BAA+B,SAAQ,2CAAoB;IAAxE;;QACE,0BAAqB,GAAG,KAAK,EAC3B,QAAgB,EAChB,MAAqB,EACrB,OAAe,EACf,WAAmB,IAAI,EAGvB,EAAE;YACF,MAAM,KAAK,GAAG,kCAAkC,CAAC;YACjD,MAAM,SAAS,GAAG,KAAK,EACrB,KAAa,EACb,KAAoB,EACpB,MAAqB,EACrB,OAAe,EACiD,EAAE;gBAClE,MAAM,WAAW,GAAG;oBAClB,KAAK,EAAE,KAAK;oBACZ,SAAS,EAAE;wBACT,MAAM,EAAE,MAAM,IAAI,EAAE;wBACpB,KAAK,EAAE,KAAK;wBACZ,EAAE,EAAE,OAAO;qBACZ;iBACF,CAAC;gBAEF,MAAM,SAAS,GAAG,kBAAkB,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;gBAClE,MAAM,GAAG,GAAG,oCAAoC,SAAS,EAAE,CAAC;gBAE5D,MAAM,OAAO,GAAG;oBACd,MAAM,EAAE,KAAK;oBACb,iBAAiB,EAAE,yBAAyB;oBAC5C,eAAe,EAAE,UAAU;oBAC3B,OAAO,EAAE,QAAQ;oBACjB,WAAW,EACT,kEAAkE;oBACpE,kBAAkB,EAAE,IAAI;oBACxB,oBAAoB,EAAE,SAAS;oBAC/B,gBAAgB,EAAE,OAAO;oBACzB,gBAAgB,EAAE,MAAM;oBACxB,gBAAgB,EAAE,aAAa;oBAC/B,YAAY,EACV,uGAAuG;oBACzG,kBAAkB,EAAE,gBAAgB;oBACpC,MAAM,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE;iBAC/B,CAAC;gBAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC3B,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAkB,GAAG,EAAE;4BACrD,OAAO,EAAE,OAAO;4BAChB,eAAe,EAAE,IAAI;yBACtB,CAAC,CAAC;wBACH,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC;4BACnD,MAAM,IAAI,KAAK,CACb,qCAAqC,QAAQ,eAAe,IAAI,CAAC,SAAS,CACxE,QAAQ,CAAC,IAAI,CACd,EAAE,CACJ,CAAC;wBACJ,CAAC;wBACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;oBACpD,CAAC;oBAAC,OAAO,CAAC,EAAE,CAAC;wBACX,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;4BACZ,MAAM,CAAC,CAAC;wBACV,CAAC;wBACD,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC5D,CAAC;gBACH,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;YACjC,CAAC,CAAC;YAEF,MAAM,kBAAkB,GACtB,EAAE,CAAC;YACL,IAAI,UAAU,GAAG,MAAM,CAAC;YACxB,
|
|
1
|
+
{"version":3,"file":"InternalGraphqlIssueRepository.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { GraphqlProjectRepository } from './GraphqlProjectRepository';
|
|
2
2
|
import { LocalStorageRepository } from './LocalStorageRepository';
|
|
3
|
-
import axios from 'axios';
|
|
4
|
-
|
|
5
|
-
jest.mock('axios');
|
|
6
|
-
const mockedAxios = jest.mocked(axios);
|
|
7
3
|
|
|
8
4
|
describe('GraphqlProjectRepository', () => {
|
|
9
5
|
const localStorageRepository = new LocalStorageRepository();
|
|
@@ -13,92 +9,28 @@ describe('GraphqlProjectRepository', () => {
|
|
|
13
9
|
const projectUrl = `https://github.com/users/HiromiShikata/projects/49`;
|
|
14
10
|
const projectNumber = 49;
|
|
15
11
|
const projectId = 'PVT_kwHOAGJHa84AFhgF';
|
|
16
|
-
const itemId = 'PVTI_lAHOAGJHa84AFhgFzgM';
|
|
17
12
|
|
|
18
13
|
beforeEach(() => {
|
|
19
|
-
mockedAxios.post.mockReset();
|
|
20
14
|
repository = new GraphqlProjectRepository(localStorageRepository, token);
|
|
21
15
|
});
|
|
22
16
|
|
|
23
17
|
describe('fetchProjectId', () => {
|
|
24
18
|
it('should fetch project ID using GraphQL API', async () => {
|
|
25
|
-
|
|
26
|
-
data: {
|
|
27
|
-
data: {
|
|
28
|
-
organization: null,
|
|
29
|
-
user: null,
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
});
|
|
19
|
+
const response = await repository.fetchProjectId(login, projectNumber);
|
|
33
20
|
|
|
34
|
-
|
|
35
|
-
repository.fetchProjectId(login, projectNumber),
|
|
36
|
-
).rejects.toThrow('Project or item not found');
|
|
21
|
+
expect(response).toEqual(projectId);
|
|
37
22
|
});
|
|
38
23
|
});
|
|
39
24
|
|
|
40
25
|
describe('findProjectIdByUrl', () => {
|
|
41
26
|
it('should extract project ID from URL and fetch it', async () => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
data: {
|
|
45
|
-
organization: null,
|
|
46
|
-
user: null,
|
|
47
|
-
},
|
|
48
|
-
},
|
|
49
|
-
});
|
|
50
|
-
|
|
51
|
-
await expect(repository.findProjectIdByUrl(projectUrl)).rejects.toThrow(
|
|
52
|
-
'Project or item not found',
|
|
53
|
-
);
|
|
27
|
+
const response = await repository.findProjectIdByUrl(projectUrl);
|
|
28
|
+
expect(response).toEqual(projectId);
|
|
54
29
|
});
|
|
55
30
|
});
|
|
56
31
|
|
|
57
32
|
describe('getProject', () => {
|
|
58
33
|
it('should retrieve project details', async () => {
|
|
59
|
-
mockedAxios.post.mockResolvedValueOnce({
|
|
60
|
-
data: {
|
|
61
|
-
data: {
|
|
62
|
-
node: {
|
|
63
|
-
id: projectId,
|
|
64
|
-
title: 'V2 project on owner for testing',
|
|
65
|
-
fields: {
|
|
66
|
-
nodes: [
|
|
67
|
-
{
|
|
68
|
-
id: 'PVTSSF_lAHOAGJHa84AFhgFzgDLt0c',
|
|
69
|
-
name: 'Status',
|
|
70
|
-
options: [
|
|
71
|
-
{
|
|
72
|
-
id: 'f75ad846',
|
|
73
|
-
name: 'Todo',
|
|
74
|
-
color: 'GRAY',
|
|
75
|
-
description: '',
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
id: '47fc9ee4',
|
|
79
|
-
name: 'In Progress',
|
|
80
|
-
color: 'GRAY',
|
|
81
|
-
description: '',
|
|
82
|
-
},
|
|
83
|
-
{
|
|
84
|
-
id: '98236657',
|
|
85
|
-
name: 'Done',
|
|
86
|
-
color: 'GRAY',
|
|
87
|
-
description: '',
|
|
88
|
-
},
|
|
89
|
-
],
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
id: 'PVTF_lAHOAGJHa84AFhgFzgVlnK4',
|
|
93
|
-
name: 'NextActionDate',
|
|
94
|
-
},
|
|
95
|
-
],
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
},
|
|
100
|
-
});
|
|
101
|
-
|
|
102
34
|
const project = await repository.getProject(projectId);
|
|
103
35
|
expect(project).toEqual({
|
|
104
36
|
id: 'PVT_kwHOAGJHa84AFhgF',
|
|
@@ -140,115 +72,4 @@ describe('GraphqlProjectRepository', () => {
|
|
|
140
72
|
});
|
|
141
73
|
});
|
|
142
74
|
});
|
|
143
|
-
|
|
144
|
-
describe('removeItemFromProject', () => {
|
|
145
|
-
beforeEach(() => {
|
|
146
|
-
mockedAxios.post.mockReset();
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
it('should successfully remove item from project', async () => {
|
|
150
|
-
mockedAxios.post.mockResolvedValueOnce({
|
|
151
|
-
data: {
|
|
152
|
-
data: null,
|
|
153
|
-
errors: [{ message: 'Could not resolve to a node' }],
|
|
154
|
-
},
|
|
155
|
-
});
|
|
156
|
-
|
|
157
|
-
await expect(
|
|
158
|
-
repository.removeItemFromProject(projectId, itemId),
|
|
159
|
-
).rejects.toThrow('Project or item not found');
|
|
160
|
-
});
|
|
161
|
-
|
|
162
|
-
it('should throw error when project or item not found', async () => {
|
|
163
|
-
mockedAxios.post.mockResolvedValueOnce({
|
|
164
|
-
data: {
|
|
165
|
-
errors: [{ message: 'Could not resolve to a node' }],
|
|
166
|
-
},
|
|
167
|
-
});
|
|
168
|
-
|
|
169
|
-
const invalidItemId = 'invalid_item_id';
|
|
170
|
-
await expect(
|
|
171
|
-
repository.removeItemFromProject(projectId, invalidItemId),
|
|
172
|
-
).rejects.toThrow('Project or item not found');
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
|
|
176
|
-
describe('removeItemFromProjectByIssueUrl', () => {
|
|
177
|
-
const issueUrl =
|
|
178
|
-
'https://github.com/HiromiShikata/test-repository/issues/38';
|
|
179
|
-
|
|
180
|
-
beforeEach(() => {
|
|
181
|
-
mockedAxios.post.mockReset();
|
|
182
|
-
});
|
|
183
|
-
|
|
184
|
-
it('should successfully remove item from project by issue URL', async () => {
|
|
185
|
-
// Mock fetchProjectId response with error
|
|
186
|
-
mockedAxios.post.mockResolvedValueOnce({
|
|
187
|
-
data: {
|
|
188
|
-
data: {
|
|
189
|
-
organization: null,
|
|
190
|
-
user: null,
|
|
191
|
-
},
|
|
192
|
-
},
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
await expect(
|
|
196
|
-
repository.removeItemFromProjectByIssueUrl(projectUrl, issueUrl),
|
|
197
|
-
).rejects.toThrow('Project or item not found');
|
|
198
|
-
});
|
|
199
|
-
|
|
200
|
-
it('should throw error when project not found', async () => {
|
|
201
|
-
// Mock fetchProjectId response with null data
|
|
202
|
-
mockedAxios.post.mockResolvedValueOnce({
|
|
203
|
-
data: {
|
|
204
|
-
data: {
|
|
205
|
-
user: null,
|
|
206
|
-
organization: null,
|
|
207
|
-
},
|
|
208
|
-
},
|
|
209
|
-
});
|
|
210
|
-
|
|
211
|
-
const invalidProjectUrl =
|
|
212
|
-
'https://github.com/users/HiromiShikata/projects/999';
|
|
213
|
-
await expect(
|
|
214
|
-
repository.removeItemFromProjectByIssueUrl(invalidProjectUrl, issueUrl),
|
|
215
|
-
).rejects.toThrow('Project or item not found');
|
|
216
|
-
});
|
|
217
|
-
|
|
218
|
-
it('should throw error when item not found in project', async () => {
|
|
219
|
-
// Mock fetchProjectId response
|
|
220
|
-
mockedAxios.post.mockResolvedValueOnce({
|
|
221
|
-
data: {
|
|
222
|
-
data: {
|
|
223
|
-
user: {
|
|
224
|
-
projectV2: {
|
|
225
|
-
id: projectId,
|
|
226
|
-
},
|
|
227
|
-
},
|
|
228
|
-
},
|
|
229
|
-
},
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
// Mock fetchItemIdFromIssueUrl response with empty nodes
|
|
233
|
-
mockedAxios.post.mockResolvedValueOnce({
|
|
234
|
-
data: {
|
|
235
|
-
data: {
|
|
236
|
-
repository: {
|
|
237
|
-
issue: {
|
|
238
|
-
projectItems: {
|
|
239
|
-
nodes: [],
|
|
240
|
-
},
|
|
241
|
-
},
|
|
242
|
-
},
|
|
243
|
-
},
|
|
244
|
-
},
|
|
245
|
-
});
|
|
246
|
-
|
|
247
|
-
const invalidIssueUrl =
|
|
248
|
-
'https://github.com/HiromiShikata/test-repository/issues/999';
|
|
249
|
-
await expect(
|
|
250
|
-
repository.removeItemFromProjectByIssueUrl(projectUrl, invalidIssueUrl),
|
|
251
|
-
).rejects.toThrow('Project or item not found');
|
|
252
|
-
});
|
|
253
|
-
});
|
|
254
75
|
});
|
|
@@ -66,17 +66,11 @@ export class GraphqlProjectRepository
|
|
|
66
66
|
data: JSON.stringify(graphqlQuery),
|
|
67
67
|
});
|
|
68
68
|
|
|
69
|
-
if (
|
|
70
|
-
!response?.data?.data?.organization?.projectV2?.id &&
|
|
71
|
-
!response?.data?.data?.user?.projectV2?.id
|
|
72
|
-
) {
|
|
73
|
-
throw new Error('Project or item not found');
|
|
74
|
-
}
|
|
75
69
|
const projectId =
|
|
76
70
|
response.data.data.organization?.projectV2?.id ||
|
|
77
71
|
response.data.data.user?.projectV2?.id;
|
|
78
72
|
if (!projectId) {
|
|
79
|
-
throw new Error('
|
|
73
|
+
throw new Error('projectId is not found');
|
|
80
74
|
}
|
|
81
75
|
return projectId;
|
|
82
76
|
};
|
|
@@ -280,116 +274,4 @@ export class GraphqlProjectRepository
|
|
|
280
274
|
: null,
|
|
281
275
|
};
|
|
282
276
|
};
|
|
283
|
-
|
|
284
|
-
removeItemFromProject = async (
|
|
285
|
-
projectId: string,
|
|
286
|
-
itemId: string,
|
|
287
|
-
): Promise<void> => {
|
|
288
|
-
const graphqlQuery = {
|
|
289
|
-
query: `mutation removeItem($projectId: ID!, $itemId: ID!) {
|
|
290
|
-
deleteProjectV2Item(input: { projectId: $projectId, itemId: $itemId }) {
|
|
291
|
-
clientMutationId
|
|
292
|
-
}
|
|
293
|
-
}`,
|
|
294
|
-
variables: {
|
|
295
|
-
projectId,
|
|
296
|
-
itemId,
|
|
297
|
-
},
|
|
298
|
-
};
|
|
299
|
-
|
|
300
|
-
const response = await axios<{
|
|
301
|
-
data: {
|
|
302
|
-
deleteProjectV2Item: {
|
|
303
|
-
clientMutationId: string;
|
|
304
|
-
};
|
|
305
|
-
};
|
|
306
|
-
errors?: { message: string }[];
|
|
307
|
-
}>({
|
|
308
|
-
url: 'https://api.github.com/graphql',
|
|
309
|
-
method: 'post',
|
|
310
|
-
headers: {
|
|
311
|
-
Authorization: `Bearer ${this.ghToken}`,
|
|
312
|
-
'Content-Type': 'application/json',
|
|
313
|
-
},
|
|
314
|
-
data: JSON.stringify(graphqlQuery),
|
|
315
|
-
});
|
|
316
|
-
|
|
317
|
-
if (response?.data?.errors || !response?.data?.data?.deleteProjectV2Item) {
|
|
318
|
-
throw new Error('Project or item not found');
|
|
319
|
-
}
|
|
320
|
-
};
|
|
321
|
-
|
|
322
|
-
removeItemFromProjectByIssueUrl = async (
|
|
323
|
-
projectUrl: string,
|
|
324
|
-
issueUrl: string,
|
|
325
|
-
): Promise<void> => {
|
|
326
|
-
const projectId = await this.findProjectIdByUrl(projectUrl);
|
|
327
|
-
if (!projectId) {
|
|
328
|
-
throw new Error('Project or item not found');
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
const itemId = await this.fetchItemIdFromIssueUrl(projectId, issueUrl);
|
|
332
|
-
if (!itemId) {
|
|
333
|
-
throw new Error('Project or item not found');
|
|
334
|
-
}
|
|
335
|
-
|
|
336
|
-
await this.removeItemFromProject(projectId, itemId);
|
|
337
|
-
};
|
|
338
|
-
|
|
339
|
-
private fetchItemIdFromIssueUrl = async (
|
|
340
|
-
projectId: string,
|
|
341
|
-
issueUrl: string,
|
|
342
|
-
): Promise<string | undefined> => {
|
|
343
|
-
if (!projectId) {
|
|
344
|
-
throw new Error('Project ID is required');
|
|
345
|
-
}
|
|
346
|
-
const { owner, repo, issueNumber } = this.extractIssueFromUrl(issueUrl);
|
|
347
|
-
const graphqlQuery = {
|
|
348
|
-
query: `query GetProjectItemID($owner: String!, $name: String!, $issueNumber: Int!) {
|
|
349
|
-
repository(owner: $owner, name: $name) {
|
|
350
|
-
issue(number: $issueNumber) {
|
|
351
|
-
projectItems(first: 2) {
|
|
352
|
-
nodes {
|
|
353
|
-
id
|
|
354
|
-
project {
|
|
355
|
-
id
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
}
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
}`,
|
|
362
|
-
variables: {
|
|
363
|
-
owner,
|
|
364
|
-
name: repo,
|
|
365
|
-
issueNumber,
|
|
366
|
-
},
|
|
367
|
-
};
|
|
368
|
-
|
|
369
|
-
const response = await axios<{
|
|
370
|
-
data: {
|
|
371
|
-
repository: {
|
|
372
|
-
issue: {
|
|
373
|
-
projectItems: {
|
|
374
|
-
nodes: {
|
|
375
|
-
id: string;
|
|
376
|
-
project: { id: string };
|
|
377
|
-
}[];
|
|
378
|
-
};
|
|
379
|
-
};
|
|
380
|
-
};
|
|
381
|
-
};
|
|
382
|
-
}>({
|
|
383
|
-
url: 'https://api.github.com/graphql',
|
|
384
|
-
method: 'post',
|
|
385
|
-
headers: {
|
|
386
|
-
Authorization: `Bearer ${this.ghToken}`,
|
|
387
|
-
'Content-Type': 'application/json',
|
|
388
|
-
},
|
|
389
|
-
data: JSON.stringify(graphqlQuery),
|
|
390
|
-
});
|
|
391
|
-
|
|
392
|
-
const projectItems = response.data.data.repository.issue.projectItems.nodes;
|
|
393
|
-
return projectItems.find((item) => item.project.id === projectId)?.id;
|
|
394
|
-
};
|
|
395
277
|
}
|
|
@@ -43,6 +43,14 @@ describe('CheerioIssueRepository', () => {
|
|
|
43
43
|
expect(issue).toEqual({
|
|
44
44
|
assignees: ['HiromiShikata'],
|
|
45
45
|
inProgressTimeline: [
|
|
46
|
+
{
|
|
47
|
+
author: 'HiromiShikata',
|
|
48
|
+
durationMinutes: 3.5166666666666666,
|
|
49
|
+
endedAt: new Date('2024-04-21T09:31:46.000Z'),
|
|
50
|
+
issueUrl:
|
|
51
|
+
'https://github.com/HiromiShikata/test-repository/issues/38',
|
|
52
|
+
startedAt: new Date('2024-04-21T09:28:15.000Z'),
|
|
53
|
+
},
|
|
46
54
|
{
|
|
47
55
|
author: 'HiromiShikata',
|
|
48
56
|
durationMinutes: 60.516666666666666,
|
|
@@ -72,6 +80,12 @@ describe('CheerioIssueRepository', () => {
|
|
|
72
80
|
project: 'V2 project on owner for testing',
|
|
73
81
|
status: 'Todo',
|
|
74
82
|
statusTimeline: [
|
|
83
|
+
{
|
|
84
|
+
author: 'HiromiShikata',
|
|
85
|
+
from: '',
|
|
86
|
+
time: '2024-04-21T09:28:15Z',
|
|
87
|
+
to: 'In Progress',
|
|
88
|
+
},
|
|
75
89
|
{
|
|
76
90
|
author: 'HiromiShikata',
|
|
77
91
|
from: 'In Progress',
|
|
@@ -90,6 +104,12 @@ describe('CheerioIssueRepository', () => {
|
|
|
90
104
|
time: '2024-04-21T11:13:38Z',
|
|
91
105
|
to: 'Todo',
|
|
92
106
|
},
|
|
107
|
+
{
|
|
108
|
+
author: 'HiromiShikata',
|
|
109
|
+
from: '',
|
|
110
|
+
time: '2024-09-19T14:03:05Z',
|
|
111
|
+
to: 'Todo',
|
|
112
|
+
},
|
|
93
113
|
{
|
|
94
114
|
author: 'HiromiShikata',
|
|
95
115
|
from: 'Todo',
|
|
@@ -202,62 +222,7 @@ describe('CheerioIssueRepository', () => {
|
|
|
202
222
|
const content = await axios.get<string>(issueUrl, { headers });
|
|
203
223
|
const $ = cheerio.load(content.data);
|
|
204
224
|
const statusTimeline = await repository.getStatusTimelineEvents($);
|
|
205
|
-
expect(statusTimeline).toEqual([
|
|
206
|
-
{
|
|
207
|
-
author: 'HiromiShikata',
|
|
208
|
-
from: 'In Progress',
|
|
209
|
-
time: '2024-04-21T09:31:46Z',
|
|
210
|
-
to: 'Todo',
|
|
211
|
-
},
|
|
212
|
-
{
|
|
213
|
-
author: 'HiromiShikata',
|
|
214
|
-
from: 'Todo',
|
|
215
|
-
time: '2024-04-21T10:13:07Z',
|
|
216
|
-
to: 'In Progress',
|
|
217
|
-
},
|
|
218
|
-
{
|
|
219
|
-
author: 'HiromiShikata',
|
|
220
|
-
from: 'In Progress',
|
|
221
|
-
time: '2024-04-21T11:13:38Z',
|
|
222
|
-
to: 'Todo',
|
|
223
|
-
},
|
|
224
|
-
{
|
|
225
|
-
author: 'HiromiShikata',
|
|
226
|
-
from: 'Todo',
|
|
227
|
-
time: '2024-11-23T05:44:07Z',
|
|
228
|
-
to: 'In Progress',
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
author: 'HiromiShikata',
|
|
232
|
-
from: 'In Progress',
|
|
233
|
-
time: '2024-11-23T05:44:10Z',
|
|
234
|
-
to: 'Todo',
|
|
235
|
-
},
|
|
236
|
-
{
|
|
237
|
-
author: 'github-project-automation',
|
|
238
|
-
from: 'Todo',
|
|
239
|
-
time: '2024-11-23T05:45:50Z',
|
|
240
|
-
to: 'Done',
|
|
241
|
-
},
|
|
242
|
-
{
|
|
243
|
-
author: 'HiromiShikata',
|
|
244
|
-
from: 'Done',
|
|
245
|
-
time: '2024-11-23T05:46:22Z',
|
|
246
|
-
to: 'Todo',
|
|
247
|
-
},
|
|
248
|
-
{
|
|
249
|
-
author: 'HiromiShikata',
|
|
250
|
-
from: 'Todo',
|
|
251
|
-
time: '2024-11-23T05:46:25Z',
|
|
252
|
-
to: 'In Progress',
|
|
253
|
-
},
|
|
254
|
-
{
|
|
255
|
-
author: 'HiromiShikata',
|
|
256
|
-
from: 'In Progress',
|
|
257
|
-
time: '2024-11-23T05:46:27Z',
|
|
258
|
-
to: 'Todo',
|
|
259
|
-
},
|
|
260
|
-
]);
|
|
225
|
+
expect(statusTimeline).toEqual([]);
|
|
261
226
|
});
|
|
262
227
|
});
|
|
263
228
|
|
|
@@ -185,19 +185,20 @@ export class InternalGraphqlIssueRepository extends BaseGitHubRepository {
|
|
|
185
185
|
const frontTimelineItems: GraphqlResponse['data']['node']['frontTimelineItems']['edges'] =
|
|
186
186
|
[];
|
|
187
187
|
let nextCursor = cursor;
|
|
188
|
-
|
|
188
|
+
const maxCountPerRequest = 250;
|
|
189
189
|
while (frontTimelineItems.length < maxCount) {
|
|
190
190
|
const response = await callQuery(
|
|
191
191
|
query,
|
|
192
|
-
|
|
192
|
+
maxCountPerRequest,
|
|
193
193
|
nextCursor,
|
|
194
194
|
issueId,
|
|
195
195
|
);
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
196
|
+
for (const edge of response.edges) {
|
|
197
|
+
frontTimelineItems.push(edge);
|
|
198
|
+
if (frontTimelineItems.length >= maxCount) {
|
|
199
|
+
return frontTimelineItems;
|
|
200
|
+
}
|
|
199
201
|
}
|
|
200
|
-
remainingCount -= response.edges.length;
|
|
201
202
|
nextCursor = response.pageInfo.endCursor;
|
|
202
203
|
if (!response.pageInfo.hasNextPage) {
|
|
203
204
|
break;
|
|
@@ -9,8 +9,5 @@ export declare class GraphqlProjectRepository extends BaseGitHubRepository imple
|
|
|
9
9
|
fetchProjectId: (login: string, projectNumber: number) => Promise<string>;
|
|
10
10
|
findProjectIdByUrl: (projectUrl: string) => Promise<Project["id"] | null>;
|
|
11
11
|
getProject: (projectId: Project["id"]) => Promise<Project | null>;
|
|
12
|
-
removeItemFromProject: (projectId: string, itemId: string) => Promise<void>;
|
|
13
|
-
removeItemFromProjectByIssueUrl: (projectUrl: string, issueUrl: string) => Promise<void>;
|
|
14
|
-
private fetchItemIdFromIssueUrl;
|
|
15
12
|
}
|
|
16
13
|
//# sourceMappingURL=GraphqlProjectRepository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphqlProjectRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/GraphqlProjectRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4DAA4D,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAGxD,qBAAa,wBACX,SAAQ,oBACR,YAAW,iBAAiB;IAE5B,qBAAqB,eACP,MAAM,KACjB;QACD,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;KACvB,CAMC;IACF,cAAc,UACL,MAAM,iBACE,MAAM,KACpB,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"GraphqlProjectRepository.d.ts","sourceRoot":"","sources":["../../../src/adapter/repositories/GraphqlProjectRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,4DAA4D,CAAC;AAC/F,OAAO,EAAE,OAAO,EAAE,MAAM,+BAA+B,CAAC;AAGxD,qBAAa,wBACX,SAAQ,oBACR,YAAW,iBAAiB;IAE5B,qBAAqB,eACP,MAAM,KACjB;QACD,KAAK,EAAE,MAAM,CAAC;QACd,aAAa,EAAE,MAAM,CAAC;KACvB,CAMC;IACF,cAAc,UACL,MAAM,iBACE,MAAM,KACpB,OAAO,CAAC,MAAM,CAAC,CAkDhB;IACF,kBAAkB,eACJ,MAAM,KACjB,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAG9B;IACF,UAAU,cAAqB,OAAO,CAAC,IAAI,CAAC,KAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAiMpE;CACH"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InternalGraphqlIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAM/D,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEjD,KAAK,yBAAyB,GAAG;IAC/B,OAAO,EAAE;QACP,gBAAgB,EAAE;YAChB;gBACE,SAAS,EAAE;oBACT,KAAK,EAAE,MAAM,CAAC;oBACd,IAAI,EAAE,MAAM,CAAC;oBACb,MAAM,EAAE,MAAM,CAAC;iBAChB,CAAC;gBACF,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,EAAE,EAAE,MAAM,CAAC;gCACX,KAAK,EAAE,MAAM,CAAC;gCACd,KAAK,EAAE,MAAM,CAAC;gCACd,SAAS,EAAE;oCACT,KAAK,EAAE,KAAK,CAAC;wCACX,KAAK,EAAE,MAAM,CAAC;qCACf,CAAC,CAAC;iCACJ,CAAC;gCACF,MAAM,EAAE;oCACN,KAAK,EAAE,KAAK,CAAC;wCACX,IAAI,EAAE;4CACJ,IAAI,EAAE,MAAM,CAAC;yCACd,CAAC;qCACH,CAAC,CAAC;iCACJ,CAAC;gCACF,gBAAgB,EAAE;oCAChB,KAAK,EAAE,KAAK,CAAC;wCACX,IAAI,EAAE;4CACJ,OAAO,EAAE;gDACP,KAAK,EAAE,MAAM,CAAC;6CACf,CAAC;yCACH,CAAC;qCACH,CAAC,CAAC;iCACJ,CAAC;gCACF,kBAAkB,EAAE;oCAClB,KAAK,EAAE,KAAK,CAAC;wCACX,IAAI,EAAE;4CACJ,UAAU,EAAE,MAAM,CAAC;4CACnB,EAAE,EAAE,MAAM,CAAC;yCACZ,CAAC;qCACH,CAAC,CAAC;oCACH,QAAQ,EAAE;wCACR,WAAW,EAAE,OAAO,CAAC;wCACrB,SAAS,EAAE,MAAM,CAAC;qCACnB,CAAC;oCACF,UAAU,EAAE,MAAM,CAAC;iCACpB,CAAC;gCACF,iBAAiB,EAAE;oCACjB,KAAK,EAAE,KAAK,CAAC;wCACX,IAAI,EAAE;4CACJ,UAAU,EAAE,MAAM,CAAC;4CACnB,EAAE,EAAE,MAAM,CAAC;yCACZ,CAAC;qCACH,CAAC,CAAC;iCACJ,CAAC;6BACH,CAAC;yBACH,CAAC;qBACH,CAAC;iBACH,CAAC;aACH;SACF,CAAC;KACH,CAAC;CACH,CAAC;AA+BF,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,UAAU,EAAE,OAAO,CAAC;YACpB,kBAAkB,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAC/I,EAAE,EAAE,MAAM,CAAC;SACZ,CAAC;KACH,CAAC;CACH,CAAC;AACF,qBAAa,8BAA+B,SAAQ,oBAAoB;IACtE,qBAAqB,aACT,MAAM,UACR,MAAM,GAAG,IAAI,WACZ,MAAM,aACL,MAAM,KACf,OAAO,CACR,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAC/D,
|
|
1
|
+
{"version":3,"file":"InternalGraphqlIssueRepository.d.ts","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAM/D,OAAO,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AAEjD,KAAK,yBAAyB,GAAG;IAC/B,OAAO,EAAE;QACP,gBAAgB,EAAE;YAChB;gBACE,SAAS,EAAE;oBACT,KAAK,EAAE,MAAM,CAAC;oBACd,IAAI,EAAE,MAAM,CAAC;oBACb,MAAM,EAAE,MAAM,CAAC;iBAChB,CAAC;gBACF,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,UAAU,EAAE;4BACV,KAAK,EAAE;gCACL,EAAE,EAAE,MAAM,CAAC;gCACX,KAAK,EAAE,MAAM,CAAC;gCACd,KAAK,EAAE,MAAM,CAAC;gCACd,SAAS,EAAE;oCACT,KAAK,EAAE,KAAK,CAAC;wCACX,KAAK,EAAE,MAAM,CAAC;qCACf,CAAC,CAAC;iCACJ,CAAC;gCACF,MAAM,EAAE;oCACN,KAAK,EAAE,KAAK,CAAC;wCACX,IAAI,EAAE;4CACJ,IAAI,EAAE,MAAM,CAAC;yCACd,CAAC;qCACH,CAAC,CAAC;iCACJ,CAAC;gCACF,gBAAgB,EAAE;oCAChB,KAAK,EAAE,KAAK,CAAC;wCACX,IAAI,EAAE;4CACJ,OAAO,EAAE;gDACP,KAAK,EAAE,MAAM,CAAC;6CACf,CAAC;yCACH,CAAC;qCACH,CAAC,CAAC;iCACJ,CAAC;gCACF,kBAAkB,EAAE;oCAClB,KAAK,EAAE,KAAK,CAAC;wCACX,IAAI,EAAE;4CACJ,UAAU,EAAE,MAAM,CAAC;4CACnB,EAAE,EAAE,MAAM,CAAC;yCACZ,CAAC;qCACH,CAAC,CAAC;oCACH,QAAQ,EAAE;wCACR,WAAW,EAAE,OAAO,CAAC;wCACrB,SAAS,EAAE,MAAM,CAAC;qCACnB,CAAC;oCACF,UAAU,EAAE,MAAM,CAAC;iCACpB,CAAC;gCACF,iBAAiB,EAAE;oCACjB,KAAK,EAAE,KAAK,CAAC;wCACX,IAAI,EAAE;4CACJ,UAAU,EAAE,MAAM,CAAC;4CACnB,EAAE,EAAE,MAAM,CAAC;yCACZ,CAAC;qCACH,CAAC,CAAC;iCACJ,CAAC;6BACH,CAAC;yBACH,CAAC;qBACH,CAAC;iBACH,CAAC;aACH;SACF,CAAC;KACH,CAAC;CACH,CAAC;AA+BF,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE;QACJ,IAAI,EAAE;YACJ,UAAU,EAAE,OAAO,CAAC;YACpB,kBAAkB,EAAE,yBAAyB,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,CAAC;YAC/I,EAAE,EAAE,MAAM,CAAC;SACZ,CAAC;KACH,CAAC;CACH,CAAC;AACF,qBAAa,8BAA+B,SAAQ,oBAAoB;IACtE,qBAAqB,aACT,MAAM,UACR,MAAM,GAAG,IAAI,WACZ,MAAM,aACL,MAAM,KACf,OAAO,CACR,eAAe,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,CAC/D,CAqFC;IACF,2BAA2B,aACf,MAAM,QACV,MAAM,KACX,OAAO,CAAC,KAAK,CAAC,CAoEf;CACH"}
|