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.
Files changed (221) hide show
  1. package/.env.example +6 -0
  2. package/.eslintrc.cjs +55 -0
  3. package/.github/CODEOWNERS +2 -0
  4. package/.github/workflows/assign-all-cards-to-owner.yml +14 -0
  5. package/.github/workflows/commit-lint.yml +54 -0
  6. package/.github/workflows/configs/commitlint.config.js +27 -0
  7. package/.github/workflows/create-pr.yml +64 -0
  8. package/.github/workflows/format.yml +25 -0
  9. package/.github/workflows/publish.yml +47 -0
  10. package/.github/workflows/test.yml +45 -0
  11. package/.github/workflows/umino-project.yml +181 -0
  12. package/.prettierignore +22 -0
  13. package/.prettierrc +5 -0
  14. package/CHANGELOG.md +49 -0
  15. package/CONTRIBUTING.md +107 -0
  16. package/README.md +108 -0
  17. package/bin/adapter/entry-points/cli/index.js +26 -0
  18. package/bin/adapter/entry-points/cli/index.js.map +1 -0
  19. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js +142 -0
  20. package/bin/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.js.map +1 -0
  21. package/bin/adapter/repositories/AxiosSlackRepository.js +124 -0
  22. package/bin/adapter/repositories/AxiosSlackRepository.js.map +1 -0
  23. package/bin/adapter/repositories/BaseGitHubRepository.js +136 -0
  24. package/bin/adapter/repositories/BaseGitHubRepository.js.map +1 -0
  25. package/bin/adapter/repositories/GoogleSpreadsheetRepository.js +123 -0
  26. package/bin/adapter/repositories/GoogleSpreadsheetRepository.js.map +1 -0
  27. package/bin/adapter/repositories/GraphqlProjectRepository.js +167 -0
  28. package/bin/adapter/repositories/GraphqlProjectRepository.js.map +1 -0
  29. package/bin/adapter/repositories/LocalStorageCacheRepository.js +46 -0
  30. package/bin/adapter/repositories/LocalStorageCacheRepository.js.map +1 -0
  31. package/bin/adapter/repositories/LocalStorageRepository.js +30 -0
  32. package/bin/adapter/repositories/LocalStorageRepository.js.map +1 -0
  33. package/bin/adapter/repositories/SystemDateRepository.js +23 -0
  34. package/bin/adapter/repositories/SystemDateRepository.js.map +1 -0
  35. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js +148 -0
  36. package/bin/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.js.map +1 -0
  37. package/bin/adapter/repositories/issue/ApiV3IssueRepository.js +48 -0
  38. package/bin/adapter/repositories/issue/ApiV3IssueRepository.js.map +1 -0
  39. package/bin/adapter/repositories/issue/CheerioIssueRepository.js +120 -0
  40. package/bin/adapter/repositories/issue/CheerioIssueRepository.js.map +1 -0
  41. package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js +485 -0
  42. package/bin/adapter/repositories/issue/GraphqlProjectItemRepository.js.map +1 -0
  43. package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js +114 -0
  44. package/bin/adapter/repositories/issue/InternalGraphqlIssueRepository.js.map +1 -0
  45. package/bin/adapter/repositories/issue/RestIssueRepository.js +79 -0
  46. package/bin/adapter/repositories/issue/RestIssueRepository.js.map +1 -0
  47. package/bin/adapter/repositories/issue/issueTimelineUtils.js +38 -0
  48. package/bin/adapter/repositories/issue/issueTimelineUtils.js.map +1 -0
  49. package/bin/adapter/repositories/utils.js +45 -0
  50. package/bin/adapter/repositories/utils.js.map +1 -0
  51. package/bin/domain/entities/Issue.js +3 -0
  52. package/bin/domain/entities/Issue.js.map +1 -0
  53. package/bin/domain/entities/Member.js +3 -0
  54. package/bin/domain/entities/Member.js.map +1 -0
  55. package/bin/domain/entities/Project.js +3 -0
  56. package/bin/domain/entities/Project.js.map +1 -0
  57. package/bin/domain/entities/ProjectField.js +3 -0
  58. package/bin/domain/entities/ProjectField.js.map +1 -0
  59. package/bin/domain/entities/ProjectFieldSingleSelect.js +3 -0
  60. package/bin/domain/entities/ProjectFieldSingleSelect.js.map +1 -0
  61. package/bin/domain/entities/ProjectFieldSingleSelectOption.js +3 -0
  62. package/bin/domain/entities/ProjectFieldSingleSelectOption.js.map +1 -0
  63. package/bin/domain/entities/WorkingTime.js +3 -0
  64. package/bin/domain/entities/WorkingTime.js.map +1 -0
  65. package/bin/domain/usecases/ActionAnnouncementUseCase.js +46 -0
  66. package/bin/domain/usecases/ActionAnnouncementUseCase.js.map +1 -0
  67. package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js +116 -0
  68. package/bin/domain/usecases/AnalyzeProblemByIssueUseCase.js.map +1 -0
  69. package/bin/domain/usecases/ClearNextActionHourUseCase.js +38 -0
  70. package/bin/domain/usecases/ClearNextActionHourUseCase.js.map +1 -0
  71. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js +180 -0
  72. package/bin/domain/usecases/GenerateWorkingTimeReportUseCase.js.map +1 -0
  73. package/bin/domain/usecases/HandleScheduledEventUseCase.js +122 -0
  74. package/bin/domain/usecases/HandleScheduledEventUseCase.js.map +1 -0
  75. package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js +35 -0
  76. package/bin/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.js.map +1 -0
  77. package/bin/domain/usecases/adapter-interfaces/DateRepository.js +3 -0
  78. package/bin/domain/usecases/adapter-interfaces/DateRepository.js.map +1 -0
  79. package/bin/domain/usecases/adapter-interfaces/IssueRepository.js +3 -0
  80. package/bin/domain/usecases/adapter-interfaces/IssueRepository.js.map +1 -0
  81. package/bin/domain/usecases/adapter-interfaces/ProjectRepository.js +3 -0
  82. package/bin/domain/usecases/adapter-interfaces/ProjectRepository.js.map +1 -0
  83. package/bin/domain/usecases/adapter-interfaces/SlackRepository.js +3 -0
  84. package/bin/domain/usecases/adapter-interfaces/SlackRepository.js.map +1 -0
  85. package/bin/domain/usecases/adapter-interfaces/SpreadsheetRepository.js +3 -0
  86. package/bin/domain/usecases/adapter-interfaces/SpreadsheetRepository.js.map +1 -0
  87. package/bin/index.js +13 -0
  88. package/bin/index.js.map +1 -0
  89. package/commitlint.config.js +6 -0
  90. package/jest.config.js +19 -0
  91. package/package.json +80 -0
  92. package/renovate.json +37 -0
  93. package/src/adapter/entry-points/cli/index.test.ts +20 -0
  94. package/src/adapter/entry-points/cli/index.ts +36 -0
  95. package/src/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.ts +95 -0
  96. package/src/adapter/repositories/AxiosSlackRepository.test.ts +119 -0
  97. package/src/adapter/repositories/AxiosSlackRepository.ts +184 -0
  98. package/src/adapter/repositories/BaseGitHubRepository.test.ts +95 -0
  99. package/src/adapter/repositories/BaseGitHubRepository.ts +172 -0
  100. package/src/adapter/repositories/GoogleSpreadsheetRepository.test.ts +124 -0
  101. package/src/adapter/repositories/GoogleSpreadsheetRepository.ts +151 -0
  102. package/src/adapter/repositories/GraphqlProjectRepository.test.ts +46 -0
  103. package/src/adapter/repositories/GraphqlProjectRepository.ts +236 -0
  104. package/src/adapter/repositories/LocalStorageCacheRepository.test.ts +146 -0
  105. package/src/adapter/repositories/LocalStorageCacheRepository.ts +53 -0
  106. package/src/adapter/repositories/LocalStorageRepository.integration.test.ts +142 -0
  107. package/src/adapter/repositories/LocalStorageRepository.test.ts +161 -0
  108. package/src/adapter/repositories/LocalStorageRepository.ts +21 -0
  109. package/src/adapter/repositories/SystemDateRepository.ts +20 -0
  110. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.test.ts +158 -0
  111. package/src/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.ts +274 -0
  112. package/src/adapter/repositories/issue/ApiV3IssueRepository.test.ts +26 -0
  113. package/src/adapter/repositories/issue/ApiV3IssueRepository.ts +59 -0
  114. package/src/adapter/repositories/issue/CheerioIssueRepository.test.ts +6610 -0
  115. package/src/adapter/repositories/issue/CheerioIssueRepository.ts +127 -0
  116. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.test.ts +49 -0
  117. package/src/adapter/repositories/issue/GraphqlProjectItemRepository.ts +745 -0
  118. package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.test.ts +71 -0
  119. package/src/adapter/repositories/issue/InternalGraphqlIssueRepository.ts +263 -0
  120. package/src/adapter/repositories/issue/RestIssueRepository.test.ts +29 -0
  121. package/src/adapter/repositories/issue/RestIssueRepository.ts +105 -0
  122. package/src/adapter/repositories/issue/issueTimelineUtils.test.ts +79 -0
  123. package/src/adapter/repositories/issue/issueTimelineUtils.ts +52 -0
  124. package/src/adapter/repositories/utils.test.ts +40 -0
  125. package/src/adapter/repositories/utils.ts +50 -0
  126. package/src/domain/entities/Issue.ts +23 -0
  127. package/src/domain/entities/Member.ts +3 -0
  128. package/src/domain/entities/Project.ts +29 -0
  129. package/src/domain/entities/ProjectField.ts +3 -0
  130. package/src/domain/entities/ProjectFieldSingleSelect.ts +8 -0
  131. package/src/domain/entities/ProjectFieldSingleSelectOption.ts +8 -0
  132. package/src/domain/entities/WorkingTime.ts +8 -0
  133. package/src/domain/usecases/ActionAnnouncementUseCase.ts +76 -0
  134. package/src/domain/usecases/AnalyzeProblemByIssueUseCase.ts +209 -0
  135. package/src/domain/usecases/ClearNextActionHourUseCase.ts +51 -0
  136. package/src/domain/usecases/GenerateWorkingTimeReportUseCase.test.ts +382 -0
  137. package/src/domain/usecases/GenerateWorkingTimeReportUseCase.ts +284 -0
  138. package/src/domain/usecases/HandleScheduledEventUseCase.test.ts +58 -0
  139. package/src/domain/usecases/HandleScheduledEventUseCase.ts +209 -0
  140. package/src/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.ts +46 -0
  141. package/src/domain/usecases/adapter-interfaces/DateRepository.ts +5 -0
  142. package/src/domain/usecases/adapter-interfaces/IssueRepository.ts +44 -0
  143. package/src/domain/usecases/adapter-interfaces/ProjectRepository.ts +6 -0
  144. package/src/domain/usecases/adapter-interfaces/SlackRepository.ts +20 -0
  145. package/src/domain/usecases/adapter-interfaces/SpreadsheetRepository.ts +18 -0
  146. package/src/index.test.ts +8 -0
  147. package/src/index.ts +7 -0
  148. package/tsconfig.build.json +11 -0
  149. package/tsconfig.json +22 -0
  150. package/types/adapter/entry-points/cli/index.d.ts +3 -0
  151. package/types/adapter/entry-points/cli/index.d.ts.map +1 -0
  152. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts +11 -0
  153. package/types/adapter/entry-points/handlers/HandleScheduledEventUseCaseHandler.d.ts.map +1 -0
  154. package/types/adapter/repositories/AxiosSlackRepository.d.ts +13 -0
  155. package/types/adapter/repositories/AxiosSlackRepository.d.ts.map +1 -0
  156. package/types/adapter/repositories/BaseGitHubRepository.d.ts +32 -0
  157. package/types/adapter/repositories/BaseGitHubRepository.d.ts.map +1 -0
  158. package/types/adapter/repositories/GoogleSpreadsheetRepository.d.ts +13 -0
  159. package/types/adapter/repositories/GoogleSpreadsheetRepository.d.ts.map +1 -0
  160. package/types/adapter/repositories/GraphqlProjectRepository.d.ts +13 -0
  161. package/types/adapter/repositories/GraphqlProjectRepository.d.ts.map +1 -0
  162. package/types/adapter/repositories/LocalStorageCacheRepository.d.ts +12 -0
  163. package/types/adapter/repositories/LocalStorageCacheRepository.d.ts.map +1 -0
  164. package/types/adapter/repositories/LocalStorageRepository.d.ts +7 -0
  165. package/types/adapter/repositories/LocalStorageRepository.d.ts.map +1 -0
  166. package/types/adapter/repositories/SystemDateRepository.d.ts +7 -0
  167. package/types/adapter/repositories/SystemDateRepository.d.ts.map +1 -0
  168. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts +38 -0
  169. package/types/adapter/repositories/issue/ApiV3CheerioRestIssueRepository.d.ts.map +1 -0
  170. package/types/adapter/repositories/issue/ApiV3IssueRepository.d.ts +17 -0
  171. package/types/adapter/repositories/issue/ApiV3IssueRepository.d.ts.map +1 -0
  172. package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts +31 -0
  173. package/types/adapter/repositories/issue/CheerioIssueRepository.d.ts.map +1 -0
  174. package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts +39 -0
  175. package/types/adapter/repositories/issue/GraphqlProjectItemRepository.d.ts.map +1 -0
  176. package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts +83 -0
  177. package/types/adapter/repositories/issue/InternalGraphqlIssueRepository.d.ts.map +1 -0
  178. package/types/adapter/repositories/issue/RestIssueRepository.d.ts +16 -0
  179. package/types/adapter/repositories/issue/RestIssueRepository.d.ts.map +1 -0
  180. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts +12 -0
  181. package/types/adapter/repositories/issue/issueTimelineUtils.d.ts.map +1 -0
  182. package/types/adapter/repositories/utils.d.ts +4 -0
  183. package/types/adapter/repositories/utils.d.ts.map +1 -0
  184. package/types/domain/entities/Issue.d.ts +24 -0
  185. package/types/domain/entities/Issue.d.ts.map +1 -0
  186. package/types/domain/entities/Member.d.ts +4 -0
  187. package/types/domain/entities/Member.d.ts.map +1 -0
  188. package/types/domain/entities/Project.d.ts +29 -0
  189. package/types/domain/entities/Project.d.ts.map +1 -0
  190. package/types/domain/entities/ProjectField.d.ts +3 -0
  191. package/types/domain/entities/ProjectField.d.ts.map +1 -0
  192. package/types/domain/entities/ProjectFieldSingleSelect.d.ts +8 -0
  193. package/types/domain/entities/ProjectFieldSingleSelect.d.ts.map +1 -0
  194. package/types/domain/entities/ProjectFieldSingleSelectOption.d.ts +8 -0
  195. package/types/domain/entities/ProjectFieldSingleSelectOption.d.ts.map +1 -0
  196. package/types/domain/entities/WorkingTime.d.ts +8 -0
  197. package/types/domain/entities/WorkingTime.d.ts.map +1 -0
  198. package/types/domain/usecases/ActionAnnouncementUseCase.d.ts +17 -0
  199. package/types/domain/usecases/ActionAnnouncementUseCase.d.ts.map +1 -0
  200. package/types/domain/usecases/AnalyzeProblemByIssueUseCase.d.ts +26 -0
  201. package/types/domain/usecases/AnalyzeProblemByIssueUseCase.d.ts.map +1 -0
  202. package/types/domain/usecases/ClearNextActionHourUseCase.d.ts +14 -0
  203. package/types/domain/usecases/ClearNextActionHourUseCase.d.ts.map +1 -0
  204. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts +50 -0
  205. package/types/domain/usecases/GenerateWorkingTimeReportUseCase.d.ts.map +1 -0
  206. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts +63 -0
  207. package/types/domain/usecases/HandleScheduledEventUseCase.d.ts.map +1 -0
  208. package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts +14 -0
  209. package/types/domain/usecases/SetWorkflowManagementIssueToStoryUseCase.d.ts.map +1 -0
  210. package/types/domain/usecases/adapter-interfaces/DateRepository.d.ts +6 -0
  211. package/types/domain/usecases/adapter-interfaces/DateRepository.d.ts.map +1 -0
  212. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts +23 -0
  213. package/types/domain/usecases/adapter-interfaces/IssueRepository.d.ts.map +1 -0
  214. package/types/domain/usecases/adapter-interfaces/ProjectRepository.d.ts +6 -0
  215. package/types/domain/usecases/adapter-interfaces/ProjectRepository.d.ts.map +1 -0
  216. package/types/domain/usecases/adapter-interfaces/SlackRepository.d.ts +9 -0
  217. package/types/domain/usecases/adapter-interfaces/SlackRepository.d.ts.map +1 -0
  218. package/types/domain/usecases/adapter-interfaces/SpreadsheetRepository.d.ts +6 -0
  219. package/types/domain/usecases/adapter-interfaces/SpreadsheetRepository.d.ts.map +1 -0
  220. package/types/index.d.ts +10 -0
  221. 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":"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"}