github-issue-tower-defence-management 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +6 -0
- package/.eslintrc.cjs +55 -0
- package/.github/CODEOWNERS +2 -0
- package/.github/workflows/assign-all-cards-to-owner.yml +14 -0
- package/.github/workflows/commit-lint.yml +54 -0
- package/.github/workflows/configs/commitlint.config.js +27 -0
- package/.github/workflows/create-pr.yml +64 -0
- package/.github/workflows/format.yml +25 -0
- package/.github/workflows/publish.yml +47 -0
- package/.github/workflows/test.yml +45 -0
- package/.github/workflows/umino-project.yml +181 -0
- package/.prettierignore +22 -0
- package/.prettierrc +5 -0
- package/CHANGELOG.md +49 -0
- package/CONTRIBUTING.md +107 -0
- package/README.md +108 -0
- package/bin/adapter/entry-points/cli/index.js +26 -0
- package/bin/adapter/entry-points/cli/index.js.map +1 -0
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +142 -0
- package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -0
- package/bin/adapter/repositories/AxiosSlackRepository.js +124 -0
- package/bin/adapter/repositories/AxiosSlackRepository.js.map +1 -0
- package/bin/adapter/repositories/BaseGitHubRepository.js +136 -0
- package/bin/adapter/repositories/BaseGitHubRepository.js.map +1 -0
- package/bin/adapter/repositories/GoogleSpreadsheetRepository.js +123 -0
- package/bin/adapter/repositories/GoogleSpreadsheetRepository.js.map +1 -0
- package/bin/adapter/repositories/GraphqlProjectRepository.js +167 -0
- package/bin/adapter/repositories/GraphqlProjectRepository.js.map +1 -0
- package/bin/adapter/repositories/LocalStorageCacheRepository.js +46 -0
- package/bin/adapter/repositories/LocalStorageCacheRepository.js.map +1 -0
- package/bin/adapter/repositories/LocalStorageRepository.js +30 -0
- package/bin/adapter/repositories/LocalStorageRepository.js.map +1 -0
- package/bin/adapter/repositories/SystemDateRepository.js +23 -0
- package/bin/adapter/repositories/SystemDateRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +148 -0
- package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/ApiV3IssueRepository.js +48 -0
- package/bin/adapter/repositories/issue/ApiV3IssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/CheerioIssueRepository.js +120 -0
- package/bin/adapter/repositories/issue/CheerioIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js +485 -0
- package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js +114 -0
- package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/RestIssueRepository.js +79 -0
- package/bin/adapter/repositories/issue/RestIssueRepository.js.map +1 -0
- package/bin/adapter/repositories/issue/issueTimelineUtils.js +38 -0
- package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +1 -0
- package/bin/adapter/repositories/utils.js +45 -0
- package/bin/adapter/repositories/utils.js.map +1 -0
- package/bin/domain/entities/Issue.js +3 -0
- package/bin/domain/entities/Issue.js.map +1 -0
- package/bin/domain/entities/Member.js +3 -0
- package/bin/domain/entities/Member.js.map +1 -0
- package/bin/domain/entities/Project.js +3 -0
- package/bin/domain/entities/Project.js.map +1 -0
- package/bin/domain/entities/ProjectField.js +3 -0
- package/bin/domain/entities/ProjectField.js.map +1 -0
- package/bin/domain/entities/ProjectFieldSingleSelect.js +3 -0
- package/bin/domain/entities/ProjectFieldSingleSelect.js.map +1 -0
- package/bin/domain/entities/ProjectFieldSingleSelectOption.js +3 -0
- package/bin/domain/entities/ProjectFieldSingleSelectOption.js.map +1 -0
- package/bin/domain/entities/WorkingTime.js +3 -0
- package/bin/domain/entities/WorkingTime.js.map +1 -0
- package/bin/domain/usecases/ActionAnnouncementUseCase.js +46 -0
- package/bin/domain/usecases/ActionAnnouncementUseCase.js.map +1 -0
- package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js +116 -0
- package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js.map +1 -0
- package/bin/domain/usecases/ClearNextActionHourUseCase.js +38 -0
- package/bin/domain/usecases/ClearNextActionHourUseCase.js.map +1 -0
- package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +180 -0
- package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +1 -0
- package/bin/domain/usecases/HandleScheduledEventUseCase.js +122 -0
- package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -0
- package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js +35 -0
- package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/DateRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/DateRepository.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/IssueRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/IssueRepository.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/ProjectRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/ProjectRepository.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/SlackRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/SlackRepository.js.map +1 -0
- package/bin/domain/usecases/adapter-interfaces/SpreadsheetRepository.js +3 -0
- package/bin/domain/usecases/adapter-interfaces/SpreadsheetRepository.js.map +1 -0
- package/bin/index.js +13 -0
- package/bin/index.js.map +1 -0
- package/commitlint.config.js +6 -0
- package/jest.config.js +19 -0
- package/package.json +80 -0
- package/renovate.json +37 -0
- package/src/adapter/entry-points/cli/index.test.ts +20 -0
- package/src/adapter/entry-points/cli/index.ts +36 -0
- package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +95 -0
- package/src/adapter/repositories/AxiosSlackRepository.test.ts +119 -0
- package/src/adapter/repositories/AxiosSlackRepository.ts +184 -0
- package/src/adapter/repositories/BaseGitHubRepository.test.ts +95 -0
- package/src/adapter/repositories/BaseGitHubRepository.ts +172 -0
- package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +124 -0
- package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +151 -0
- package/src/adapter/repositories/GraphqlProjectRepository.test.ts +46 -0
- package/src/adapter/repositories/GraphqlProjectRepository.ts +236 -0
- package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +146 -0
- package/src/adapter/repositories/LocalStorageCacheRepository.ts +53 -0
- package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +142 -0
- package/src/adapter/repositories/LocalStorageRepository.test.ts +161 -0
- package/src/adapter/repositories/LocalStorageRepository.ts +21 -0
- package/src/adapter/repositories/SystemDateRepository.ts +20 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +158 -0
- package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +274 -0
- package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +26 -0
- package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +59 -0
- package/src/adapter/repositories/issue/CheerioIssueRepository.test.ts +6610 -0
- package/src/adapter/repositories/issue/CheerioIssueRepository.ts +127 -0
- package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +49 -0
- package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +745 -0
- package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.test.ts +71 -0
- package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts +263 -0
- package/src/adapter/repositories/issue/RestIssueRepository.test.ts +29 -0
- package/src/adapter/repositories/issue/RestIssueRepository.ts +105 -0
- package/src/adapter/repositories/issue/issueTimelineUtils.test.ts +79 -0
- package/src/adapter/repositories/issue/issueTimelineUtils.ts +52 -0
- package/src/adapter/repositories/utils.test.ts +40 -0
- package/src/adapter/repositories/utils.ts +50 -0
- package/src/domain/entities/Issue.ts +23 -0
- package/src/domain/entities/Member.ts +3 -0
- package/src/domain/entities/Project.ts +29 -0
- package/src/domain/entities/ProjectField.ts +3 -0
- package/src/domain/entities/ProjectFieldSingleSelect.ts +8 -0
- package/src/domain/entities/ProjectFieldSingleSelectOption.ts +8 -0
- package/src/domain/entities/WorkingTime.ts +8 -0
- package/src/domain/usecases/ActionAnnouncementUseCase.ts +76 -0
- package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +209 -0
- package/src/domain/usecases/ClearNextActionHourUseCase.ts +51 -0
- package/src/domain/usecases/GenerateWorkingTimeReportUseCase.test.ts +382 -0
- package/src/domain/usecases/GenerateWorkingTimeReportUseCase.ts +284 -0
- package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +58 -0
- package/src/domain/usecases/HandleScheduledEventUseCase.ts +209 -0
- package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +46 -0
- package/src/domain/usecases/adapter-interfaces/DateRepository.ts +5 -0
- package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +44 -0
- package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +6 -0
- package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +20 -0
- package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +18 -0
- package/src/index.test.ts +8 -0
- package/src/index.ts +7 -0
- package/tsconfig.build.json +11 -0
- package/tsconfig.json +22 -0
- package/types/adapter/entry-points/cli/index.d.ts +3 -0
- package/types/adapter/entry-points/cli/index.d.ts.map +1 -0
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts +11 -0
- package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -0
- package/types/adapter/repositories/AxiosSlackRepository.d.ts +13 -0
- package/types/adapter/repositories/AxiosSlackRepository.d.ts.map +1 -0
- package/types/adapter/repositories/BaseGitHubRepository.d.ts +32 -0
- package/types/adapter/repositories/BaseGitHubRepository.d.ts.map +1 -0
- package/types/adapter/repositories/GoogleSpreadsheetRepository.d.ts +13 -0
- package/types/adapter/repositories/GoogleSpreadsheetRepository.d.ts.map +1 -0
- package/types/adapter/repositories/GraphqlProjectRepository.d.ts +13 -0
- package/types/adapter/repositories/GraphqlProjectRepository.d.ts.map +1 -0
- package/types/adapter/repositories/LocalStorageCacheRepository.d.ts +12 -0
- package/types/adapter/repositories/LocalStorageCacheRepository.d.ts.map +1 -0
- package/types/adapter/repositories/LocalStorageRepository.d.ts +7 -0
- package/types/adapter/repositories/LocalStorageRepository.d.ts.map +1 -0
- package/types/adapter/repositories/SystemDateRepository.d.ts +7 -0
- package/types/adapter/repositories/SystemDateRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +38 -0
- package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/ApiV3IssueRepository.d.ts +17 -0
- package/types/adapter/repositories/issue/ApiV3IssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts +31 -0
- package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts +39 -0
- package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts +83 -0
- package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/RestIssueRepository.d.ts +16 -0
- package/types/adapter/repositories/issue/RestIssueRepository.d.ts.map +1 -0
- package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +12 -0
- package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +1 -0
- package/types/adapter/repositories/utils.d.ts +4 -0
- package/types/adapter/repositories/utils.d.ts.map +1 -0
- package/types/domain/entities/Issue.d.ts +24 -0
- package/types/domain/entities/Issue.d.ts.map +1 -0
- package/types/domain/entities/Member.d.ts +4 -0
- package/types/domain/entities/Member.d.ts.map +1 -0
- package/types/domain/entities/Project.d.ts +29 -0
- package/types/domain/entities/Project.d.ts.map +1 -0
- package/types/domain/entities/ProjectField.d.ts +3 -0
- package/types/domain/entities/ProjectField.d.ts.map +1 -0
- package/types/domain/entities/ProjectFieldSingleSelect.d.ts +8 -0
- package/types/domain/entities/ProjectFieldSingleSelect.d.ts.map +1 -0
- package/types/domain/entities/ProjectFieldSingleSelectOption.d.ts +8 -0
- package/types/domain/entities/ProjectFieldSingleSelectOption.d.ts.map +1 -0
- package/types/domain/entities/WorkingTime.d.ts +8 -0
- package/types/domain/entities/WorkingTime.d.ts.map +1 -0
- package/types/domain/usecases/ActionAnnouncementUseCase.d.ts +17 -0
- package/types/domain/usecases/ActionAnnouncementUseCase.d.ts.map +1 -0
- package/types/domain/usecases/AnalyzeProblemByIssueUseCase.d.ts +26 -0
- package/types/domain/usecases/AnalyzeProblemByIssueUseCase.d.ts.map +1 -0
- package/types/domain/usecases/ClearNextActionHourUseCase.d.ts +14 -0
- package/types/domain/usecases/ClearNextActionHourUseCase.d.ts.map +1 -0
- package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +50 -0
- package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +1 -0
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +63 -0
- package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -0
- package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts +14 -0
- package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/DateRepository.d.ts +6 -0
- package/types/domain/usecases/adapter-interfaces/DateRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +23 -0
- package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/ProjectRepository.d.ts +6 -0
- package/types/domain/usecases/adapter-interfaces/ProjectRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/SlackRepository.d.ts +9 -0
- package/types/domain/usecases/adapter-interfaces/SlackRepository.d.ts.map +1 -0
- package/types/domain/usecases/adapter-interfaces/SpreadsheetRepository.d.ts +6 -0
- package/types/domain/usecases/adapter-interfaces/SpreadsheetRepository.d.ts.map +1 -0
- package/types/index.d.ts +10 -0
- package/types/index.d.ts.map +1 -0
|
@@ -0,0 +1,485 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.GraphqlProjectItemRepository = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const BaseGitHubRepository_1 = require("../BaseGitHubRepository");
|
|
9
|
+
class GraphqlProjectItemRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
10
|
+
constructor() {
|
|
11
|
+
super(...arguments);
|
|
12
|
+
this.fetchItemId = async (projectId, owner, repositoryName, issueNumber) => {
|
|
13
|
+
const graphqlQuery = {
|
|
14
|
+
query: `query GetProjectItemID( $owner: String!, $name: String!, $issueNumber: Int!) {
|
|
15
|
+
repository(owner: $owner, name: $name) {
|
|
16
|
+
issue(number: $issueNumber) {
|
|
17
|
+
projectItems(first: 2) {
|
|
18
|
+
nodes {
|
|
19
|
+
id
|
|
20
|
+
project {
|
|
21
|
+
id
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}`,
|
|
28
|
+
variables: {
|
|
29
|
+
projectID: projectId,
|
|
30
|
+
owner: owner,
|
|
31
|
+
name: repositoryName,
|
|
32
|
+
issueNumber: issueNumber,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
try {
|
|
36
|
+
const response = await (0, axios_1.default)({
|
|
37
|
+
url: 'https://api.github.com/graphql',
|
|
38
|
+
method: 'post',
|
|
39
|
+
headers: {
|
|
40
|
+
Authorization: `Bearer ${this.ghToken}`,
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
},
|
|
43
|
+
data: JSON.stringify(graphqlQuery),
|
|
44
|
+
});
|
|
45
|
+
const projectItems = response.data.data.repository.issue.projectItems.nodes;
|
|
46
|
+
const projectItemId = projectItems.find((item) => item.project.id === projectId)?.id;
|
|
47
|
+
return projectItemId;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.error('Error fetching GitHub Project V2 ID:', error);
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
this.fetchProjectItems = async (projectId) => {
|
|
55
|
+
const graphqlQueryString = `
|
|
56
|
+
query GetProjectItems($projectId: ID!, $after: String) {
|
|
57
|
+
node(id: $projectId) {
|
|
58
|
+
... on ProjectV2 {
|
|
59
|
+
items(first: 100, after: $after) {
|
|
60
|
+
totalCount
|
|
61
|
+
pageInfo {
|
|
62
|
+
endCursor
|
|
63
|
+
hasNextPage
|
|
64
|
+
}
|
|
65
|
+
nodes {
|
|
66
|
+
id
|
|
67
|
+
fieldValues(first: 10) {
|
|
68
|
+
nodes {
|
|
69
|
+
... on ProjectV2ItemFieldTextValue {
|
|
70
|
+
text
|
|
71
|
+
field {
|
|
72
|
+
... on ProjectV2Field{
|
|
73
|
+
name
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
... on ProjectV2ItemFieldNumberValue {
|
|
78
|
+
number
|
|
79
|
+
id
|
|
80
|
+
field {
|
|
81
|
+
... on ProjectV2Field{
|
|
82
|
+
name
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
... on ProjectV2ItemFieldDateValue {
|
|
87
|
+
date
|
|
88
|
+
field {
|
|
89
|
+
... on ProjectV2Field{
|
|
90
|
+
name
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
... on ProjectV2ItemFieldSingleSelectValue {
|
|
95
|
+
name
|
|
96
|
+
field {
|
|
97
|
+
... on ProjectV2SingleSelectField {
|
|
98
|
+
name
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
... on ProjectV2ItemFieldIterationValue {
|
|
103
|
+
title
|
|
104
|
+
field {
|
|
105
|
+
... on ProjectV2Field{
|
|
106
|
+
name
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
content {
|
|
113
|
+
... on Issue {
|
|
114
|
+
number
|
|
115
|
+
title
|
|
116
|
+
state
|
|
117
|
+
url
|
|
118
|
+
body
|
|
119
|
+
repository {
|
|
120
|
+
nameWithOwner
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
... on PullRequest {
|
|
124
|
+
number
|
|
125
|
+
title
|
|
126
|
+
state
|
|
127
|
+
url
|
|
128
|
+
body
|
|
129
|
+
repository {
|
|
130
|
+
nameWithOwner
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
`;
|
|
140
|
+
const callGraphql = async (projectId, after) => {
|
|
141
|
+
const graphqlQuery = {
|
|
142
|
+
query: graphqlQueryString,
|
|
143
|
+
variables: {
|
|
144
|
+
projectId: projectId,
|
|
145
|
+
after: after,
|
|
146
|
+
},
|
|
147
|
+
};
|
|
148
|
+
const response = await (0, axios_1.default)({
|
|
149
|
+
url: 'https://api.github.com/graphql',
|
|
150
|
+
method: 'post',
|
|
151
|
+
headers: {
|
|
152
|
+
Authorization: `Bearer ${this.ghToken}`,
|
|
153
|
+
'Content-Type': 'application/json',
|
|
154
|
+
},
|
|
155
|
+
data: JSON.stringify(graphqlQuery),
|
|
156
|
+
});
|
|
157
|
+
if (!response.data.data) {
|
|
158
|
+
throw new Error('No data returned from GitHub API');
|
|
159
|
+
}
|
|
160
|
+
return response.data.data;
|
|
161
|
+
};
|
|
162
|
+
const issues = [];
|
|
163
|
+
let after = null;
|
|
164
|
+
let totalCount = 1;
|
|
165
|
+
while (issues.length < totalCount) {
|
|
166
|
+
const data = await callGraphql(projectId, after);
|
|
167
|
+
const projectItems = data.node.items.nodes;
|
|
168
|
+
projectItems
|
|
169
|
+
// .filter(item => item.content.repository !== undefined)
|
|
170
|
+
.forEach((item) => {
|
|
171
|
+
if (!item || !item.content || !item.content.repository) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
issues.push({
|
|
175
|
+
id: item.id,
|
|
176
|
+
nameWithOwner: item.content.repository.nameWithOwner,
|
|
177
|
+
number: item.content.number,
|
|
178
|
+
title: item.content.title,
|
|
179
|
+
state: this.convertStrToState(item.content.state),
|
|
180
|
+
url: item.content.url,
|
|
181
|
+
body: item.content.body,
|
|
182
|
+
customFields: item.fieldValues.nodes
|
|
183
|
+
.filter((field) => !!field.field)
|
|
184
|
+
.map((field) => {
|
|
185
|
+
return {
|
|
186
|
+
name: field.field.name,
|
|
187
|
+
value: field.name ??
|
|
188
|
+
field.text ??
|
|
189
|
+
field.number?.toString() ??
|
|
190
|
+
field.date ??
|
|
191
|
+
null,
|
|
192
|
+
};
|
|
193
|
+
}),
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
totalCount = data.node.items.totalCount;
|
|
197
|
+
const pageInfo = data.node.items.pageInfo;
|
|
198
|
+
after = pageInfo.endCursor;
|
|
199
|
+
}
|
|
200
|
+
return issues;
|
|
201
|
+
};
|
|
202
|
+
this.getProjectItemFieldsFromIssueUrl = async (issueUrl) => {
|
|
203
|
+
const { owner, repo, issueNumber } = this.extractIssueFromUrl(issueUrl);
|
|
204
|
+
return this.getProjectItemFields(owner, repo, issueNumber);
|
|
205
|
+
};
|
|
206
|
+
this.getProjectItemFields = async (owner, repositoryName, issueNumber) => {
|
|
207
|
+
const graphqlQueryString = `
|
|
208
|
+
query GetProjectFields($owner: String!, $repository: String!, $issueNumber: Int!){
|
|
209
|
+
repository(owner: $owner, name: $repository) {
|
|
210
|
+
issue(number: $issueNumber) {
|
|
211
|
+
projectItems(first: 2) {
|
|
212
|
+
nodes {
|
|
213
|
+
id
|
|
214
|
+
fieldValues(first: 10) {
|
|
215
|
+
totalCount
|
|
216
|
+
nodes {
|
|
217
|
+
__typename
|
|
218
|
+
... on ProjectV2ItemFieldDateValue {
|
|
219
|
+
date
|
|
220
|
+
field {
|
|
221
|
+
... on ProjectV2Field {
|
|
222
|
+
name
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
... on ProjectV2ItemFieldSingleSelectValue {
|
|
227
|
+
name
|
|
228
|
+
field {
|
|
229
|
+
... on ProjectV2SingleSelectField {
|
|
230
|
+
name
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
... on ProjectV2ItemFieldUserValue {
|
|
235
|
+
users {
|
|
236
|
+
totalCount
|
|
237
|
+
nodes {
|
|
238
|
+
login
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
field {
|
|
242
|
+
... on ProjectV2Field {
|
|
243
|
+
name
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
... on ProjectV2ItemFieldRepositoryValue {
|
|
248
|
+
repository {
|
|
249
|
+
name
|
|
250
|
+
}
|
|
251
|
+
field {
|
|
252
|
+
__typename
|
|
253
|
+
... on ProjectV2Field {
|
|
254
|
+
name
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
... on ProjectV2ItemFieldTextValue {
|
|
259
|
+
text
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
`;
|
|
270
|
+
const graphqlQuery = {
|
|
271
|
+
query: graphqlQueryString,
|
|
272
|
+
variables: {
|
|
273
|
+
owner: owner,
|
|
274
|
+
repository: repositoryName,
|
|
275
|
+
issueNumber: issueNumber,
|
|
276
|
+
},
|
|
277
|
+
};
|
|
278
|
+
const response = await (0, axios_1.default)({
|
|
279
|
+
url: 'https://api.github.com/graphql',
|
|
280
|
+
method: 'post',
|
|
281
|
+
headers: {
|
|
282
|
+
Authorization: `Bearer ${this.ghToken}`,
|
|
283
|
+
'Content-Type': 'application/json',
|
|
284
|
+
},
|
|
285
|
+
data: JSON.stringify(graphqlQuery),
|
|
286
|
+
});
|
|
287
|
+
const data = response.data.data;
|
|
288
|
+
const issueFields = [];
|
|
289
|
+
if (!data.repository.issue) {
|
|
290
|
+
return issueFields;
|
|
291
|
+
}
|
|
292
|
+
const projectItems = data.repository.issue.projectItems.nodes[0].fieldValues.nodes;
|
|
293
|
+
projectItems.forEach((item) => {
|
|
294
|
+
issueFields.push({
|
|
295
|
+
fieldName: item.field?.name ?? '',
|
|
296
|
+
fieldValue: item.date ??
|
|
297
|
+
item.name ??
|
|
298
|
+
item.text ??
|
|
299
|
+
item.repository?.name ??
|
|
300
|
+
item.user?.login ??
|
|
301
|
+
'',
|
|
302
|
+
});
|
|
303
|
+
});
|
|
304
|
+
return issueFields;
|
|
305
|
+
};
|
|
306
|
+
this.fetchProjectItemByUrl = async (issueUrl) => {
|
|
307
|
+
const { owner, repo, issueNumber } = this.extractIssueFromUrl(issueUrl);
|
|
308
|
+
const graphql = `query GetIssue($owner: String!, $repo: String!, $number: Int!) {
|
|
309
|
+
repository(owner: $owner, name: $repo) {
|
|
310
|
+
issue(number: $number) {
|
|
311
|
+
number
|
|
312
|
+
title
|
|
313
|
+
state
|
|
314
|
+
url
|
|
315
|
+
body
|
|
316
|
+
repository {
|
|
317
|
+
nameWithOwner
|
|
318
|
+
}
|
|
319
|
+
projectItems(first: 10) {
|
|
320
|
+
nodes {
|
|
321
|
+
fieldValues(first: 10) {
|
|
322
|
+
nodes {
|
|
323
|
+
... on ProjectV2ItemFieldTextValue {
|
|
324
|
+
text
|
|
325
|
+
field {
|
|
326
|
+
... on ProjectV2Field {
|
|
327
|
+
name
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
... on ProjectV2ItemFieldNumberValue {
|
|
332
|
+
number
|
|
333
|
+
id
|
|
334
|
+
field {
|
|
335
|
+
... on ProjectV2Field {
|
|
336
|
+
name
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
... on ProjectV2ItemFieldDateValue {
|
|
341
|
+
date
|
|
342
|
+
field {
|
|
343
|
+
... on ProjectV2Field {
|
|
344
|
+
name
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
... on ProjectV2ItemFieldSingleSelectValue {
|
|
349
|
+
name
|
|
350
|
+
field {
|
|
351
|
+
... on ProjectV2SingleSelectField {
|
|
352
|
+
name
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
... on ProjectV2ItemFieldIterationValue {
|
|
357
|
+
title
|
|
358
|
+
field {
|
|
359
|
+
... on ProjectV2Field {
|
|
360
|
+
name
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}`;
|
|
371
|
+
const graphqlQuery = {
|
|
372
|
+
query: graphql,
|
|
373
|
+
variables: {
|
|
374
|
+
owner: owner,
|
|
375
|
+
repo: repo,
|
|
376
|
+
number: issueNumber,
|
|
377
|
+
},
|
|
378
|
+
};
|
|
379
|
+
const response = await (0, axios_1.default)({
|
|
380
|
+
url: 'https://api.github.com/graphql',
|
|
381
|
+
method: 'post',
|
|
382
|
+
headers: {
|
|
383
|
+
Authorization: `Bearer ${this.ghToken}`,
|
|
384
|
+
'Content-Type': 'application/json',
|
|
385
|
+
},
|
|
386
|
+
data: JSON.stringify(graphqlQuery),
|
|
387
|
+
});
|
|
388
|
+
const data = response.data.data;
|
|
389
|
+
if (!data.repository.issue) {
|
|
390
|
+
return null;
|
|
391
|
+
}
|
|
392
|
+
const projectItems = data.repository.issue.projectItems.nodes;
|
|
393
|
+
const item = projectItems[0];
|
|
394
|
+
return {
|
|
395
|
+
id: item.id,
|
|
396
|
+
nameWithOwner: data.repository.issue.repository.nameWithOwner,
|
|
397
|
+
number: data.repository.issue.number,
|
|
398
|
+
title: data.repository.issue.title,
|
|
399
|
+
state: this.convertStrToState(data.repository.issue.state),
|
|
400
|
+
url: data.repository.issue.url,
|
|
401
|
+
body: data.repository.issue.body,
|
|
402
|
+
customFields: item.fieldValues.nodes
|
|
403
|
+
.filter((field) => !!field.field)
|
|
404
|
+
.map((field) => {
|
|
405
|
+
return {
|
|
406
|
+
name: field.field.name,
|
|
407
|
+
value: field.name ??
|
|
408
|
+
field.text ??
|
|
409
|
+
field.number?.toString() ??
|
|
410
|
+
field.date ??
|
|
411
|
+
null,
|
|
412
|
+
};
|
|
413
|
+
}),
|
|
414
|
+
};
|
|
415
|
+
};
|
|
416
|
+
this.convertStrToState = (state) => {
|
|
417
|
+
return state === 'MERGED'
|
|
418
|
+
? 'MERGED'
|
|
419
|
+
: state === 'CLOSED'
|
|
420
|
+
? 'CLOSED'
|
|
421
|
+
: state === 'OPEN'
|
|
422
|
+
? 'OPEN'
|
|
423
|
+
: 'OPEN';
|
|
424
|
+
};
|
|
425
|
+
this.updateProjectField = async (projectId, fieldId, itemId, value) => {
|
|
426
|
+
const graphqlQuery = {
|
|
427
|
+
query: `mutation {
|
|
428
|
+
updateProjectV2ItemFieldValue(input: {
|
|
429
|
+
projectId: "${projectId}"
|
|
430
|
+
fieldId: "${fieldId}"
|
|
431
|
+
itemId: "${itemId}"
|
|
432
|
+
value: ${JSON.stringify(value).replace(/"([^"]+)":/g, '$1:')},
|
|
433
|
+
}) {
|
|
434
|
+
clientMutationId
|
|
435
|
+
}
|
|
436
|
+
}`,
|
|
437
|
+
};
|
|
438
|
+
const res = await (0, axios_1.default)({
|
|
439
|
+
url: 'https://api.github.com/graphql',
|
|
440
|
+
method: 'post',
|
|
441
|
+
headers: {
|
|
442
|
+
Authorization: `Bearer ${this.ghToken}`,
|
|
443
|
+
'Content-Type': 'application/json',
|
|
444
|
+
},
|
|
445
|
+
data: JSON.stringify(graphqlQuery),
|
|
446
|
+
});
|
|
447
|
+
if (res.status !== 200) {
|
|
448
|
+
throw new Error('Failed to update project field');
|
|
449
|
+
}
|
|
450
|
+
else if (res.data.errors) {
|
|
451
|
+
throw new Error(res.data.errors.map((e) => e.message).join('\n'));
|
|
452
|
+
}
|
|
453
|
+
};
|
|
454
|
+
this.clearProjectField = async (projectId, fieldId, itemId) => {
|
|
455
|
+
const graphqlQuery = {
|
|
456
|
+
query: `mutation {
|
|
457
|
+
clearProjectV2ItemFieldValue(input: {
|
|
458
|
+
projectId: "${projectId}"
|
|
459
|
+
fieldId: "${fieldId}"
|
|
460
|
+
itemId: "${itemId}"
|
|
461
|
+
}) {
|
|
462
|
+
clientMutationId
|
|
463
|
+
}
|
|
464
|
+
}`,
|
|
465
|
+
};
|
|
466
|
+
const res = await (0, axios_1.default)({
|
|
467
|
+
url: 'https://api.github.com/graphql',
|
|
468
|
+
method: 'post',
|
|
469
|
+
headers: {
|
|
470
|
+
Authorization: `Bearer ${this.ghToken}`,
|
|
471
|
+
'Content-Type': 'application/json',
|
|
472
|
+
},
|
|
473
|
+
data: JSON.stringify(graphqlQuery),
|
|
474
|
+
});
|
|
475
|
+
if (res.status !== 200) {
|
|
476
|
+
throw new Error('Failed to clear project field');
|
|
477
|
+
}
|
|
478
|
+
else if (res.data.errors) {
|
|
479
|
+
throw new Error(res.data.errors.map((e) => e.message).join('\n'));
|
|
480
|
+
}
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
exports.GraphqlProjectItemRepository = GraphqlProjectItemRepository;
|
|
485
|
+
//# sourceMappingURL=GraphqlProjectItemRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GraphqlProjectItemRepository.js","sourceRoot":"","sources":["../../../../src/adapter/repositories/issue/GraphqlProjectItemRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.InternalGraphqlIssueRepository = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const BaseGitHubRepository_1 = require("../BaseGitHubRepository");
|
|
9
|
+
const typia_1 = __importDefault(require("typia"));
|
|
10
|
+
const issueTimelineUtils_1 = require("./issueTimelineUtils");
|
|
11
|
+
class InternalGraphqlIssueRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this.getFrontTimelineItems = async (issueUrl, cursor, issueId, maxCount = 9999) => {
|
|
15
|
+
const query = 'f6ff036f8e215bd07d00516664e8725c';
|
|
16
|
+
const callQuery = async (query, count, cursor, issueId) => {
|
|
17
|
+
const requestBody = {
|
|
18
|
+
query: query,
|
|
19
|
+
variables: {
|
|
20
|
+
cursor: cursor || '',
|
|
21
|
+
count: count,
|
|
22
|
+
id: issueId,
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
const bodyParam = encodeURIComponent(JSON.stringify(requestBody));
|
|
26
|
+
const url = `https://github.com/_graphql?body=${bodyParam}`;
|
|
27
|
+
const headers = {
|
|
28
|
+
accept: '*/*',
|
|
29
|
+
'accept-language': 'en-US,en;q=0.9,ja;q=0.8',
|
|
30
|
+
'cache-Control': 'no-cache',
|
|
31
|
+
referer: issueUrl,
|
|
32
|
+
'sec-ch-ua': '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
|
|
33
|
+
'sec-ch-ua-mobile': '?0',
|
|
34
|
+
'sec-ch-ua-platform': '"Linux"',
|
|
35
|
+
'sec-fetch-dest': 'empty',
|
|
36
|
+
'sec-fetch-mode': 'cors',
|
|
37
|
+
'sec-fetch-site': 'same-origin',
|
|
38
|
+
'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36',
|
|
39
|
+
'x-requested-with': 'XMLHttpRequest',
|
|
40
|
+
cookie: await this.getCookie(),
|
|
41
|
+
};
|
|
42
|
+
const response = await axios_1.default.get(url, {
|
|
43
|
+
headers: headers,
|
|
44
|
+
withCredentials: true,
|
|
45
|
+
});
|
|
46
|
+
return response.data.data.node.frontTimelineItems;
|
|
47
|
+
};
|
|
48
|
+
const frontTimelineItems = [];
|
|
49
|
+
let nextCursor = cursor;
|
|
50
|
+
let remainingCount = maxCount;
|
|
51
|
+
while (frontTimelineItems.length < maxCount) {
|
|
52
|
+
const response = await callQuery(query, remainingCount, nextCursor, issueId);
|
|
53
|
+
frontTimelineItems.push(...response.edges);
|
|
54
|
+
if (response.totalCount < remainingCount) {
|
|
55
|
+
remainingCount = response.totalCount;
|
|
56
|
+
}
|
|
57
|
+
remainingCount -= response.edges.length;
|
|
58
|
+
nextCursor = response.pageInfo.endCursor;
|
|
59
|
+
if (!response.pageInfo.hasNextPage) {
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return frontTimelineItems;
|
|
64
|
+
};
|
|
65
|
+
this.getIssueFromBetaFeatureView = async (issueUrl, html) => {
|
|
66
|
+
const pattern = /<script type="application\/json" data-target="react-app\.embeddedData">([\s\S]*?)<\/script>/;
|
|
67
|
+
const match = html.match(pattern);
|
|
68
|
+
if (!match || !match[1]) {
|
|
69
|
+
throw new Error(`No script content found. URL: ${issueUrl}, HTML: ${html}`);
|
|
70
|
+
}
|
|
71
|
+
const scriptContent = match[1];
|
|
72
|
+
if (!scriptContent) {
|
|
73
|
+
throw new Error('No script content found');
|
|
74
|
+
}
|
|
75
|
+
const data = JSON.parse(scriptContent);
|
|
76
|
+
if (!(() => { const $io0 = input => "object" === typeof input.payload && null !== input.payload && $io1(input.payload); const $io1 = input => Array.isArray(input.preloadedQueries) && (input.preloadedQueries.length === 1 && ("object" === typeof input.preloadedQueries[0] && null !== input.preloadedQueries[0] && $io2(input.preloadedQueries[0]))); const $io2 = input => "object" === typeof input.variables && null !== input.variables && $io3(input.variables) && ("object" === typeof input.result && null !== input.result && $io4(input.result)); const $io3 = input => "string" === typeof input.owner && "string" === typeof input.repo && "number" === typeof input.number; const $io4 = input => "object" === typeof input.data && null !== input.data && $io5(input.data); const $io5 = input => "object" === typeof input.repository && null !== input.repository && $io6(input.repository); const $io6 = input => "object" === typeof input.issue && null !== input.issue && $io7(input.issue); const $io7 = input => "string" === typeof input.id && "string" === typeof input.title && "string" === typeof input.state && ("object" === typeof input.assignees && null !== input.assignees && $io8(input.assignees)) && ("object" === typeof input.labels && null !== input.labels && $io10(input.labels)) && ("object" === typeof input.projectItemsNext && null !== input.projectItemsNext && $io13(input.projectItemsNext)) && ("object" === typeof input.frontTimelineItems && null !== input.frontTimelineItems && $io17(input.frontTimelineItems)) && ("object" === typeof input.backTimelineItems && null !== input.backTimelineItems && $io21(input.backTimelineItems)); const $io8 = input => Array.isArray(input.nodes) && input.nodes.every(elem => "object" === typeof elem && null !== elem && $io9(elem)); const $io9 = input => "string" === typeof input.login; const $io10 = input => Array.isArray(input.edges) && input.edges.every(elem => "object" === typeof elem && null !== elem && $io11(elem)); const $io11 = input => "object" === typeof input.node && null !== input.node && $io12(input.node); const $io12 = input => "string" === typeof input.name; const $io13 = input => Array.isArray(input.edges) && input.edges.every(elem => "object" === typeof elem && null !== elem && $io14(elem)); const $io14 = input => "object" === typeof input.node && null !== input.node && $io15(input.node); const $io15 = input => "object" === typeof input.project && null !== input.project && $io16(input.project); const $io16 = input => "string" === typeof input.title; const $io17 = input => Array.isArray(input.edges) && input.edges.every(elem => "object" === typeof elem && null !== elem && $io18(elem)) && ("object" === typeof input.pageInfo && null !== input.pageInfo && $io20(input.pageInfo)) && "number" === typeof input.totalCount; const $io18 = input => "object" === typeof input.node && null !== input.node && $io19(input.node); const $io19 = input => "string" === typeof input.__typename && "string" === typeof input.id; const $io20 = input => "boolean" === typeof input.hasNextPage && "string" === typeof input.endCursor; const $io21 = input => Array.isArray(input.edges) && input.edges.every(elem => "object" === typeof elem && null !== elem && $io22(elem)); const $io22 = input => "object" === typeof input.node && null !== input.node && $io23(input.node); const $io23 = input => "string" === typeof input.__typename && "string" === typeof input.id; return input => "object" === typeof input && null !== input && $io0(input); })()(data)) {
|
|
77
|
+
throw new Error(`Invalid data: ${JSON.stringify(data)}`);
|
|
78
|
+
}
|
|
79
|
+
const issueData = data.payload.preloadedQueries[0].result.data.repository.issue;
|
|
80
|
+
const issueRemainingCount = issueData.frontTimelineItems.totalCount -
|
|
81
|
+
issueData.frontTimelineItems.edges.length -
|
|
82
|
+
issueData.backTimelineItems.edges.length;
|
|
83
|
+
const loadedMoreIssues = issueUrl.includes('/pull/')
|
|
84
|
+
? []
|
|
85
|
+
: await this.getFrontTimelineItems(issueUrl, issueData.frontTimelineItems.pageInfo.endCursor, issueData.id, issueRemainingCount);
|
|
86
|
+
const statusTimeline = issueData.frontTimelineItems.edges
|
|
87
|
+
.concat(loadedMoreIssues)
|
|
88
|
+
.concat(issueData.backTimelineItems.edges)
|
|
89
|
+
.filter((edge, index, self) => self.findIndex((t) => t.node.id === edge.node.id) === index)
|
|
90
|
+
.filter((edge) => edge.node.__typename === 'ProjectV2ItemStatusChangedEvent')
|
|
91
|
+
.map((edge) => ({
|
|
92
|
+
time: edge.node.createdAt,
|
|
93
|
+
author: edge.node.actor?.login || '',
|
|
94
|
+
from: edge.node.previousStatus,
|
|
95
|
+
to: edge.node.status,
|
|
96
|
+
}));
|
|
97
|
+
const inProgressTimeline = await (0, issueTimelineUtils_1.getInProgressTimeline)(statusTimeline, issueUrl);
|
|
98
|
+
return {
|
|
99
|
+
url: issueUrl,
|
|
100
|
+
title: issueData.title,
|
|
101
|
+
status: statusTimeline.length > 0
|
|
102
|
+
? statusTimeline[statusTimeline.length - 1].to
|
|
103
|
+
: '',
|
|
104
|
+
assignees: issueData.assignees.nodes.map((node) => node.login),
|
|
105
|
+
labels: issueData.labels.edges.map((edge) => edge.node.name),
|
|
106
|
+
project: issueData.projectItemsNext.edges[0].node.project.title,
|
|
107
|
+
statusTimeline,
|
|
108
|
+
inProgressTimeline,
|
|
109
|
+
};
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
exports.InternalGraphqlIssueRepository = InternalGraphqlIssueRepository;
|
|
114
|
+
//# sourceMappingURL=InternalGraphqlIssueRepository.js.map
|
|
@@ -0,0 +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,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,GAAG,CAAkB,GAAG,EAAE;oBACrD,OAAO,EAAE,OAAO;oBAChB,eAAe,EAAE,IAAI;iBACtB,CAAC,CAAC;gBACH,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC;YACpD,CAAC,CAAC;YAEF,MAAM,kBAAkB,GACtB,EAAE,CAAC;YACL,IAAI,UAAU,GAAG,MAAM,CAAC;YACxB,IAAI,cAAc,GAAG,QAAQ,CAAC;YAC9B,OAAO,kBAAkB,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;gBAC5C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAC9B,KAAK,EACL,cAAc,EACd,UAAU,EACV,OAAO,CACR,CAAC;gBACF,kBAAkB,CAAC,IAAI,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBAC3C,IAAI,QAAQ,CAAC,UAAU,GAAG,cAAc,EAAE,CAAC;oBACzC,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC;gBACvC,CAAC;gBACD,cAAc,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC;gBACxC,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACzC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;oBACnC,MAAM;gBACR,CAAC;YACH,CAAC;YACD,OAAO,kBAAkB,CAAC;QAC5B,CAAC,CAAC;QACF,gCAA2B,GAAG,KAAK,EACjC,QAAgB,EAChB,IAAY,EACI,EAAE;YAClB,MAAM,OAAO,GACX,6FAA6F,CAAC;YAChG,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAElC,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CACb,iCAAiC,QAAQ,WAAW,IAAI,EAAE,CAC3D,CAAC;YACJ,CAAC;YACD,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,IAAI,GAAY,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;YAChD,IAAI,s6GAAqC,IAAI,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,KAAK,CAAC,iBAAiB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,SAAS,GACb,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YAChE,MAAM,mBAAmB,GACvB,SAAS,CAAC,kBAAkB,CAAC,UAAU;gBACvC,SAAS,CAAC,kBAAkB,CAAC,KAAK,CAAC,MAAM;gBACzC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,MAAM,CAAC;YAC3C,MAAM,gBAAgB,GAAG,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAClD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,MAAM,IAAI,CAAC,qBAAqB,CAC9B,QAAQ,EACR,SAAS,CAAC,kBAAkB,CAAC,QAAQ,CAAC,SAAS,EAC/C,SAAS,CAAC,EAAE,EACZ,mBAAmB,CACpB,CAAC;YACN,MAAM,cAAc,GAAG,SAAS,CAAC,kBAAkB,CAAC,KAAK;iBACtD,MAAM,CAAC,gBAAgB,CAAC;iBACxB,MAAM,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC;iBACzC,MAAM,CACL,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CACpB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,KAAK,CAC9D;iBACA,MAAM,CACL,CAAC,IAAI,EAAqD,EAAE,CAC1D,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,iCAAiC,CAC7D;iBACA,GAAG,CACF,CAAC,IAAI,EAAuB,EAAE,CAAC,CAAC;gBAC9B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,IAAI,EAAE;gBACpC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,cAAc;gBAC9B,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM;aACrB,CAAC,CACH,CAAC;YACJ,MAAM,kBAAkB,GAAG,MAAM,IAAA,0CAAqB,EACpD,cAAc,EACd,QAAQ,CACT,CAAC;YACF,OAAO;gBACL,GAAG,EAAE,QAAQ;gBACb,KAAK,EAAE,SAAS,CAAC,KAAK;gBACtB,MAAM,EACJ,cAAc,CAAC,MAAM,GAAG,CAAC;oBACvB,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE;oBAC9C,CAAC,CAAC,EAAE;gBACR,SAAS,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC9D,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5D,OAAO,EAAE,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK;gBAC/D,cAAc;gBACd,kBAAkB;aACnB,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;CAAA;AApJD,wEAoJC"}
|