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,136 @@
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.BaseGitHubRepository = void 0;
7
+ const fs_1 = require("fs");
8
+ const cookie_1 = require("cookie");
9
+ const axios_1 = __importDefault(require("axios"));
10
+ const gh_cookie_1 = require("gh-cookie");
11
+ const fs_2 = __importDefault(require("fs"));
12
+ axios_1.default.interceptors.response.use((response) => response, (error) => {
13
+ if (error.response) {
14
+ throw new Error(`API Error: ${error.response.status}`);
15
+ }
16
+ throw new Error('Network Error');
17
+ });
18
+ class BaseGitHubRepository {
19
+ constructor(jsonFilePath = './tmp/github.com.cookies.json', ghToken = process.env.GH_TOKEN || 'dummy', ghUserName = process.env.GH_USER_NAME, ghUserPassword = process.env.GH_USER_PASSWORD, ghAuthenticatorKey = process.env
20
+ .GH_AUTHENTICATOR_KEY) {
21
+ this.jsonFilePath = jsonFilePath;
22
+ this.ghToken = ghToken;
23
+ this.ghUserName = ghUserName;
24
+ this.ghUserPassword = ghUserPassword;
25
+ this.ghAuthenticatorKey = ghAuthenticatorKey;
26
+ this.extractIssueFromUrl = (issueUrl) => {
27
+ const match = issueUrl.match(/https:\/\/github.com\/([^/]+)\/([^/]+)\/(issues|pull)\/(\d+)/);
28
+ if (!match) {
29
+ throw new Error(`Invalid issue URL: ${issueUrl}`);
30
+ }
31
+ const [, owner, repo, pullOrIssue, issueNumberStr] = match;
32
+ const issueNumber = parseInt(issueNumberStr, 10);
33
+ if (isNaN(issueNumber)) {
34
+ throw new Error(`Invalid issue number: ${issueNumberStr}. URL: ${issueUrl}`);
35
+ }
36
+ return { owner, repo, issueNumber, isIssue: pullOrIssue === 'issues' };
37
+ };
38
+ this.getCookie = async () => {
39
+ if (!this.cookie) {
40
+ this.cookie = await this.createCookieStringFromFile();
41
+ }
42
+ return this.cookie;
43
+ };
44
+ this.createHeader = async () => {
45
+ const cookie = await this.getCookie();
46
+ const headers = {
47
+ accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
48
+ 'accept-language': 'en-US,en;q=0.9,es-MX;q=0.8,es;q=0.7,ja-JP;q=0.6,ja;q=0.5',
49
+ 'cache-control': 'max-age=0',
50
+ 'sec-ch-ua': '"Google Chrome";v="123", "Not:A-Brand";v="8", "Chromium";v="123"',
51
+ 'sec-ch-ua-mobile': '?0',
52
+ 'sec-ch-ua-platform': '"Linux"',
53
+ 'sec-fetch-dest': 'document',
54
+ 'sec-fetch-mode': 'navigate',
55
+ 'sec-fetch-site': 'same-origin',
56
+ 'sec-fetch-user': '?1',
57
+ 'upgrade-insecure-requests': '1',
58
+ Referer: 'https://github.com/orgs/community/discussions/30979',
59
+ 'Referrer-Policy': 'no-referrer-when-downgrade',
60
+ };
61
+ return {
62
+ ...headers,
63
+ cookie: cookie,
64
+ };
65
+ };
66
+ this.createCookieStringFromFile = async () => {
67
+ if (!fs_2.default.existsSync(this.jsonFilePath)) {
68
+ if (!this.ghUserName ||
69
+ !this.ghUserPassword ||
70
+ !this.ghAuthenticatorKey) {
71
+ throw new Error('No cookie file and no credentials provided');
72
+ }
73
+ const cookie = await (0, gh_cookie_1.getCookieContent)(this.ghUserName, this.ghUserPassword, this.ghAuthenticatorKey);
74
+ await fs_1.promises.writeFile(this.jsonFilePath, cookie);
75
+ }
76
+ const data = await fs_1.promises.readFile(this.jsonFilePath, {
77
+ encoding: 'utf-8',
78
+ });
79
+ const cookiesData = JSON.parse(data);
80
+ return this.generateCookieHeaderFromJson(cookiesData);
81
+ };
82
+ this.isCookie = (cookie) => {
83
+ return ('name' in cookie &&
84
+ typeof cookie.name === 'string' &&
85
+ 'value' in cookie &&
86
+ typeof cookie.value === 'string' &&
87
+ 'domain' in cookie &&
88
+ typeof cookie.domain === 'string' &&
89
+ 'path' in cookie &&
90
+ typeof cookie.path === 'string' &&
91
+ 'expires' in cookie &&
92
+ typeof cookie.expires === 'number' &&
93
+ 'httpOnly' in cookie &&
94
+ typeof cookie.httpOnly === 'boolean' &&
95
+ 'secure' in cookie &&
96
+ typeof cookie.secure === 'boolean' &&
97
+ 'sameSite' in cookie &&
98
+ typeof cookie.sameSite === 'string' &&
99
+ ['lax', 'strict', 'none'].indexOf(cookie.sameSite) !== -1);
100
+ };
101
+ this.generateCookieHeaderFromJson = async (cookieData) => {
102
+ if (!Array.isArray(cookieData)) {
103
+ throw new Error('Invalid cookie array');
104
+ }
105
+ const cookies = cookieData.map((cookieOrig) => {
106
+ const sameSite = typeof cookieOrig !== 'object' ||
107
+ !('sameSite' in cookieOrig) ||
108
+ typeof cookieOrig.sameSite !== 'string'
109
+ ? 'none'
110
+ : cookieOrig.sameSite.toLowerCase();
111
+ const cookie = {
112
+ ...cookieOrig,
113
+ sameSite,
114
+ };
115
+ if (!this.isCookie(cookie)) {
116
+ throw new Error(`Invalid cookie properties: ${JSON.stringify(cookie)}`);
117
+ }
118
+ return cookie;
119
+ });
120
+ const cookieHeader = cookies
121
+ .map((cookie) => (0, cookie_1.serialize)(cookie.name, cookie.value, {
122
+ domain: cookie.domain,
123
+ path: cookie.path,
124
+ expires: cookie.expires ? new Date(cookie.expires * 1000) : undefined,
125
+ httpOnly: cookie.httpOnly,
126
+ secure: cookie.secure,
127
+ sameSite: cookie.sameSite,
128
+ }))
129
+ .join('; ');
130
+ return cookieHeader;
131
+ };
132
+ this.cookie = null;
133
+ }
134
+ }
135
+ exports.BaseGitHubRepository = BaseGitHubRepository;
136
+ //# sourceMappingURL=BaseGitHubRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseGitHubRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/BaseGitHubRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
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.GoogleSpreadsheetRepository = void 0;
7
+ const googleapis_1 = require("googleapis");
8
+ const dotenv_1 = __importDefault(require("dotenv"));
9
+ dotenv_1.default.config();
10
+ class GoogleSpreadsheetRepository {
11
+ constructor(localStorageRepository, serviceAccountKey = process.env.GOOGLE_SERVICE_ACCOUNT_KEY ||
12
+ 'dummy') {
13
+ this.localStorageRepository = localStorageRepository;
14
+ this.keyFile = './tmp/service-account-key.json';
15
+ this.getSpreadsheetId = (spreadsheetUrl) => {
16
+ const url = new URL(spreadsheetUrl);
17
+ return url.pathname.split('/')[3];
18
+ };
19
+ this.getSheet = async (spreadsheetUrl, sheetName) => {
20
+ const auth = new googleapis_1.google.auth.GoogleAuth({
21
+ keyFile: this.keyFile,
22
+ scopes: ['https://www.googleapis.com/auth/spreadsheets'],
23
+ });
24
+ const sheets = googleapis_1.google.sheets({ version: 'v4', auth });
25
+ const spreadsheetId = this.getSpreadsheetId(spreadsheetUrl);
26
+ const responseSheet = await sheets.spreadsheets.get({
27
+ spreadsheetId,
28
+ });
29
+ if (responseSheet.status !== 200) {
30
+ throw new Error(`Failed to get sheet: ${responseSheet.status}. ${JSON.stringify(responseSheet.data)}`);
31
+ }
32
+ const sheet = responseSheet.data.sheets?.find((s) => s.properties?.title === sheetName);
33
+ if (!sheet) {
34
+ return null;
35
+ }
36
+ const response = await sheets.spreadsheets.values.get({
37
+ spreadsheetId,
38
+ range: sheetName,
39
+ });
40
+ if (response.status !== 200) {
41
+ throw new Error(`Failed to get sheet: ${response.status}. ${JSON.stringify(response.data)}`);
42
+ }
43
+ if (!response.data.values) {
44
+ return null;
45
+ }
46
+ return response.data.values.map((row) => row.map((cell) => String(cell)));
47
+ };
48
+ this.updateCell = async (spreadsheetUrl, sheetName, row, column, value) => {
49
+ const auth = new googleapis_1.google.auth.GoogleAuth({
50
+ keyFile: this.keyFile,
51
+ scopes: ['https://www.googleapis.com/auth/spreadsheets'],
52
+ });
53
+ const sheets = googleapis_1.google.sheets({ version: 'v4', auth });
54
+ const spreadsheetId = this.getSpreadsheetId(spreadsheetUrl);
55
+ await this.createNewSheetIfNotExists(spreadsheetUrl, sheetName);
56
+ const response = await sheets.spreadsheets.values.update({
57
+ spreadsheetId,
58
+ range: `${sheetName}!${String.fromCharCode(65 + column)}${row + 1}`,
59
+ valueInputOption: 'RAW',
60
+ requestBody: {
61
+ values: [[value]],
62
+ },
63
+ });
64
+ if (response.status !== 200) {
65
+ throw new Error(`Failed to update cell: ${response.status}. ${JSON.stringify(response.data)}`);
66
+ }
67
+ };
68
+ this.createNewSheetIfNotExists = async (spreadsheetUrl, sheetName) => {
69
+ const auth = new googleapis_1.google.auth.GoogleAuth({
70
+ keyFile: this.keyFile,
71
+ scopes: ['https://www.googleapis.com/auth/spreadsheets'],
72
+ });
73
+ const sheets = googleapis_1.google.sheets({ version: 'v4', auth });
74
+ const spreadsheetId = this.getSpreadsheetId(spreadsheetUrl);
75
+ const sheet = await this.getSheet(spreadsheetUrl, sheetName);
76
+ if (sheet !== null) {
77
+ return;
78
+ }
79
+ const response = await sheets.spreadsheets.batchUpdate({
80
+ spreadsheetId,
81
+ requestBody: {
82
+ requests: [
83
+ {
84
+ addSheet: {
85
+ properties: {
86
+ title: sheetName,
87
+ },
88
+ },
89
+ },
90
+ ],
91
+ },
92
+ });
93
+ if (response.status !== 200) {
94
+ throw new Error(`Failed to create sheet: ${response.status}. ${JSON.stringify(response.data)}`);
95
+ }
96
+ };
97
+ this.appendSheetValues = async (spreadsheetUrl, sheetName, values) => {
98
+ const auth = new googleapis_1.google.auth.GoogleAuth({
99
+ keyFile: this.keyFile,
100
+ scopes: ['https://www.googleapis.com/auth/spreadsheets'],
101
+ });
102
+ const sheets = googleapis_1.google.sheets({ version: 'v4', auth });
103
+ const spreadsheetId = this.getSpreadsheetId(spreadsheetUrl);
104
+ await this.createNewSheetIfNotExists(spreadsheetUrl, sheetName);
105
+ const sheet = await this.getSheet(spreadsheetUrl, sheetName);
106
+ const range = `${sheetName}!A${sheet ? sheet.length + 1 : 1}:A`;
107
+ const response = await sheets.spreadsheets.values.append({
108
+ spreadsheetId,
109
+ range: range,
110
+ valueInputOption: 'RAW',
111
+ requestBody: {
112
+ values,
113
+ },
114
+ });
115
+ if (response.status !== 200) {
116
+ throw new Error(`Failed to append values: ${response.status}. ${JSON.stringify(response.data)}`);
117
+ }
118
+ };
119
+ this.localStorageRepository.write(this.keyFile, serviceAccountKey);
120
+ }
121
+ }
122
+ exports.GoogleSpreadsheetRepository = GoogleSpreadsheetRepository;
123
+ //# sourceMappingURL=GoogleSpreadsheetRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GoogleSpreadsheetRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/GoogleSpreadsheetRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
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.GraphqlProjectRepository = void 0;
7
+ const axios_1 = __importDefault(require("axios"));
8
+ const BaseGitHubRepository_1 = require("./BaseGitHubRepository");
9
+ const utils_1 = require("./utils");
10
+ class GraphqlProjectRepository extends BaseGitHubRepository_1.BaseGitHubRepository {
11
+ constructor() {
12
+ super(...arguments);
13
+ this.extractProjectFromUrl = (projectUrl) => {
14
+ const url = new URL(projectUrl);
15
+ const path = url.pathname.split('/');
16
+ const owner = path[2];
17
+ const projectNumber = parseInt(path[4], 10);
18
+ return { owner, projectNumber };
19
+ };
20
+ this.fetchProjectId = async (login, projectNumber) => {
21
+ const graphqlQuery = {
22
+ query: `query GetProjectID($login: String!, $number: Int!) {
23
+ organization(login: $login) {
24
+ projectV2(number: $number) {
25
+ id
26
+ }
27
+ }
28
+ user(login: $login){
29
+ projectV2(number: $number){
30
+ id
31
+ }
32
+ }
33
+ }`,
34
+ variables: {
35
+ login: login,
36
+ number: projectNumber,
37
+ },
38
+ };
39
+ const response = await (0, axios_1.default)({
40
+ url: 'https://api.github.com/graphql',
41
+ method: 'post',
42
+ headers: {
43
+ Authorization: `Bearer ${this.ghToken}`,
44
+ 'Content-Type': 'application/json',
45
+ },
46
+ data: JSON.stringify(graphqlQuery),
47
+ });
48
+ const projectId = response.data.data.organization?.projectV2?.id ||
49
+ response.data.data.user?.projectV2?.id;
50
+ if (!projectId) {
51
+ throw new Error('projectId is not found');
52
+ }
53
+ return projectId;
54
+ };
55
+ this.findProjectIdByUrl = async (projectUrl) => {
56
+ const { owner, projectNumber } = this.extractProjectFromUrl(projectUrl);
57
+ return await this.fetchProjectId(owner, projectNumber);
58
+ };
59
+ this.getProject = async (projectId) => {
60
+ const query = `query GetProjectV2($projectId: ID!) {
61
+ node(id: $projectId) {
62
+ ... on ProjectV2 {
63
+ id
64
+ title
65
+ shortDescription
66
+ public
67
+ closed
68
+ createdAt
69
+ updatedAt
70
+ number
71
+ url
72
+ fields(first: 100) {
73
+ nodes {
74
+ ... on ProjectV2Field {
75
+ id
76
+ name
77
+ dataType
78
+ }
79
+ ... on ProjectV2IterationField {
80
+ id
81
+ name
82
+ dataType
83
+ configuration {
84
+ iterations {
85
+ startDate
86
+ duration
87
+ title
88
+ }
89
+ }
90
+ }
91
+ ... on ProjectV2SingleSelectField {
92
+ id
93
+ name
94
+ dataType
95
+ options {
96
+ id
97
+ name
98
+ description
99
+ color
100
+ }
101
+ }
102
+ }
103
+ }
104
+ }
105
+ }
106
+ }
107
+
108
+ `;
109
+ const variables = {
110
+ projectId: projectId,
111
+ };
112
+ const response = await axios_1.default.post('https://api.github.com/graphql', {
113
+ query,
114
+ variables,
115
+ }, {
116
+ headers: {
117
+ Authorization: `Bearer ${this.ghToken}`,
118
+ 'Content-Type': 'application/json',
119
+ },
120
+ });
121
+ const project = response.data.data.node;
122
+ if (!project) {
123
+ return null;
124
+ }
125
+ const nextActionDate = project.fields.nodes.find((field) => (0, utils_1.normalizeFieldName)(field.name) === 'nextactiondate');
126
+ const nextActionHour = project.fields.nodes.find((field) => (0, utils_1.normalizeFieldName)(field.name) === 'nextactionhour');
127
+ const story = project.fields.nodes.find((field) => (0, utils_1.normalizeFieldName)(field.name) === 'story');
128
+ const workflowManagementStory = story?.options.find((option) => (0, utils_1.normalizeFieldName)(option.name).includes('workflowmanagement'));
129
+ const remainignEstimationMinutes = project.fields.nodes.find((field) => (0, utils_1.normalizeFieldName)(field.name) === 'remainingestimationminutes');
130
+ return {
131
+ id: project.id,
132
+ name: project.title,
133
+ nextActionDate: nextActionDate
134
+ ? {
135
+ name: nextActionDate.name,
136
+ fieldId: nextActionDate.id,
137
+ }
138
+ : null,
139
+ nextActionHour: nextActionHour
140
+ ? {
141
+ name: nextActionHour.name,
142
+ fieldId: nextActionHour.id,
143
+ }
144
+ : null,
145
+ story: story && workflowManagementStory
146
+ ? {
147
+ name: story.name,
148
+ fieldId: story.id,
149
+ stories: story.options.map((option) => ({
150
+ id: option.id,
151
+ name: option.name,
152
+ })),
153
+ workflowManagementStory,
154
+ }
155
+ : null,
156
+ remainingEstimationMinutes: remainignEstimationMinutes
157
+ ? {
158
+ name: remainignEstimationMinutes.name,
159
+ fieldId: remainignEstimationMinutes.id,
160
+ }
161
+ : null,
162
+ };
163
+ };
164
+ }
165
+ }
166
+ exports.GraphqlProjectRepository = GraphqlProjectRepository;
167
+ //# sourceMappingURL=GraphqlProjectRepository.js.map
@@ -0,0 +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,MAAM,SAAS,GACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,EAAE;gBAC9C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE,CAAC;YACzC,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC5C,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QACF,uBAAkB,GAAG,KAAK,EACxB,UAAkB,EACa,EAAE;YACjC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC;YACxE,OAAO,MAAM,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QACzD,CAAC,CAAC;QACF,eAAU,GAAG,KAAK,EAAE,SAAwB,EAA2B,EAAE;YACvE,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgDjB,CAAC;YACE,MAAM,SAAS,GAAG;gBAChB,SAAS,EAAE,SAAS;aACrB,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,eAAK,CAAC,IAAI,CAiC/B,gCAAgC,EAChC;gBACE,KAAK;gBACL,SAAS;aACV,EACD;gBACE,OAAO,EAAE;oBACP,aAAa,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE;oBACvC,cAAc,EAAE,kBAAkB;iBACnC;aACF,CACF,CAAC;YACF,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,0BAAkB,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAC/D,CAAC;YACF,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,0BAAkB,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,gBAAgB,CAC/D,CAAC;YACF,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CACrC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAA,0BAAkB,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,OAAO,CACtD,CAAC;YACF,MAAM,uBAAuB,GAAG,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAC7D,IAAA,0BAAkB,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAC/D,CAAC;YACF,MAAM,0BAA0B,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAC1D,CAAC,KAAK,EAAE,EAAE,CACR,IAAA,0BAAkB,EAAC,KAAK,CAAC,IAAI,CAAC,KAAK,4BAA4B,CAClE,CAAC;YACF,OAAO;gBACL,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,IAAI,EAAE,OAAO,CAAC,KAAK;gBACnB,cAAc,EAAE,cAAc;oBAC5B,CAAC,CAAC;wBACE,IAAI,EAAE,cAAc,CAAC,IAAI;wBACzB,OAAO,EAAE,cAAc,CAAC,EAAE;qBAC3B;oBACH,CAAC,CAAC,IAAI;gBACR,cAAc,EAAE,cAAc;oBAC5B,CAAC,CAAC;wBACE,IAAI,EAAE,cAAc,CAAC,IAAI;wBACzB,OAAO,EAAE,cAAc,CAAC,EAAE;qBAC3B;oBACH,CAAC,CAAC,IAAI;gBACR,KAAK,EACH,KAAK,IAAI,uBAAuB;oBAC9B,CAAC,CAAC;wBACE,IAAI,EAAE,KAAK,CAAC,IAAI;wBAChB,OAAO,EAAE,KAAK,CAAC,EAAE;wBACjB,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;4BACtC,EAAE,EAAE,MAAM,CAAC,EAAE;4BACb,IAAI,EAAE,MAAM,CAAC,IAAI;yBAClB,CAAC,CAAC;wBACH,uBAAuB;qBACxB;oBACH,CAAC,CAAC,IAAI;gBACV,0BAA0B,EAAE,0BAA0B;oBACpD,CAAC,CAAC;wBACE,IAAI,EAAE,0BAA0B,CAAC,IAAI;wBACrC,OAAO,EAAE,0BAA0B,CAAC,EAAE;qBACvC;oBACH,CAAC,CAAC,IAAI;aACT,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;CAAA;AArOD,4DAqOC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LocalStorageCacheRepository = void 0;
4
+ class LocalStorageCacheRepository {
5
+ constructor(localStorageRepository, cachePath = './tmp/cache') {
6
+ this.localStorageRepository = localStorageRepository;
7
+ this.cachePath = cachePath;
8
+ this.getLatest = async (key) => {
9
+ const dirPath = `${this.cachePath}/${key}`;
10
+ const latestFile = this.localStorageRepository
11
+ .listFiles(dirPath)
12
+ .sort((a, b) => a.localeCompare(b))
13
+ .reverse()[0];
14
+ if (!latestFile) {
15
+ return null;
16
+ }
17
+ const valueStr = this.localStorageRepository.read(`${dirPath}/${latestFile}`);
18
+ if (!valueStr) {
19
+ return null;
20
+ }
21
+ let value;
22
+ try {
23
+ value = JSON.parse(valueStr);
24
+ }
25
+ catch (e) {
26
+ return null;
27
+ }
28
+ if (typeof value !== 'object' || value === null) {
29
+ return null;
30
+ }
31
+ const timestampStr = latestFile.split('.')[0];
32
+ return {
33
+ value,
34
+ timestamp: new Date(timestampStr),
35
+ };
36
+ };
37
+ this.set = async (key, value) => {
38
+ const dirPath = `${this.cachePath}/${key}`;
39
+ this.localStorageRepository.mkdir(dirPath);
40
+ const timestamp = new Date().toISOString();
41
+ this.localStorageRepository.write(`${dirPath}/${timestamp}.json`, JSON.stringify(value));
42
+ };
43
+ }
44
+ }
45
+ exports.LocalStorageCacheRepository = LocalStorageCacheRepository;
46
+ //# sourceMappingURL=LocalStorageCacheRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalStorageCacheRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/LocalStorageCacheRepository.ts"],"names":[],"mappings":";;;AAEA,MAAa,2BAA2B;IACtC,YACW,sBAA8C,EAC9C,YAAY,aAAa;QADzB,2BAAsB,GAAtB,sBAAsB,CAAwB;QAC9C,cAAS,GAAT,SAAS,CAAgB;QAGpC,cAAS,GAAG,KAAK,EACf,GAAW,EAIH,EAAE;YACV,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;YAC3C,MAAM,UAAU,GAAG,IAAI,CAAC,sBAAsB;iBAC3C,SAAS,CAAC,OAAO,CAAC;iBAClB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;iBAClC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC;YAChB,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAC/C,GAAG,OAAO,IAAI,UAAU,EAAE,CAC3B,CAAC;YACF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,KAAc,CAAC;YACnB,IAAI,CAAC;gBACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC/B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,OAAO,IAAI,CAAC;YACd,CAAC;YACD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,YAAY,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO;gBACL,KAAK;gBACL,SAAS,EAAE,IAAI,IAAI,CAAC,YAAY,CAAC;aAClC,CAAC;QACJ,CAAC,CAAC;QACF,QAAG,GAAG,KAAK,EAAK,GAAW,EAAE,KAAQ,EAAiB,EAAE;YACtD,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,CAAC;YAC3C,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC3C,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAC/B,GAAG,OAAO,IAAI,SAAS,OAAO,EAC9B,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CACtB,CAAC;QACJ,CAAC,CAAC;IA7CC,CAAC;CA8CL;AAlDD,kEAkDC"}
@@ -0,0 +1,30 @@
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.LocalStorageRepository = void 0;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ class LocalStorageRepository {
9
+ constructor() {
10
+ this.write = (path, value) => {
11
+ const dirPath = path.split('/').slice(0, -1).join('/');
12
+ this.mkdir(dirPath);
13
+ fs_1.default.writeFileSync(path, value, 'utf8');
14
+ };
15
+ this.read = (path) => {
16
+ return fs_1.default.readFileSync(path, 'utf8');
17
+ };
18
+ this.listFiles = (dirPath) => {
19
+ if (!fs_1.default.existsSync(dirPath)) {
20
+ return [];
21
+ }
22
+ return fs_1.default.readdirSync(dirPath);
23
+ };
24
+ this.mkdir = (dirPath) => {
25
+ fs_1.default.mkdirSync(dirPath, { recursive: true });
26
+ };
27
+ }
28
+ }
29
+ exports.LocalStorageRepository = LocalStorageRepository;
30
+ //# sourceMappingURL=LocalStorageRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LocalStorageRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/LocalStorageRepository.ts"],"names":[],"mappings":";;;;;;AAAA,4CAAoB;AAEpB,MAAa,sBAAsB;IAAnC;QACE,UAAK,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,EAAE;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACvD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpB,YAAE,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;QACxC,CAAC,CAAC;QACF,SAAI,GAAG,CAAC,IAAY,EAAiB,EAAE;YACrC,OAAO,YAAE,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACvC,CAAC,CAAC;QACF,cAAS,GAAG,CAAC,OAAe,EAAY,EAAE;YACxC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5B,OAAO,EAAE,CAAC;YACZ,CAAC;YACD,OAAO,YAAE,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC,CAAC;QACF,UAAK,GAAG,CAAC,OAAe,EAAE,EAAE;YAC1B,YAAE,CAAC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,CAAC,CAAC;IACJ,CAAC;CAAA;AAlBD,wDAkBC"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SystemDateRepository = void 0;
4
+ class SystemDateRepository {
5
+ constructor() {
6
+ this.now = async () => new Date();
7
+ this.formatDurationToHHMM = (durationMinutes) => {
8
+ const hours = Math.floor(durationMinutes / 60);
9
+ const minutes = Math.floor(durationMinutes % 60);
10
+ return `${String(hours).padStart(2, '0')}:${String(minutes).padStart(2, '0')}`;
11
+ };
12
+ this.formatDateTimeWithDayOfWeek = (date) => {
13
+ const dayOfWeek = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'][date.getDay()];
14
+ const month = String(date.getMonth() + 1).padStart(2, '0');
15
+ const day = String(date.getDate()).padStart(2, '0');
16
+ const hours = String(date.getHours()).padStart(2, '0');
17
+ const minutes = String(date.getMinutes()).padStart(2, '0');
18
+ return `${date.getFullYear()}/${month}/${day} (${dayOfWeek}) ${hours}:${minutes}`;
19
+ };
20
+ }
21
+ }
22
+ exports.SystemDateRepository = SystemDateRepository;
23
+ //# sourceMappingURL=SystemDateRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SystemDateRepository.js","sourceRoot":"","sources":["../../../src/adapter/repositories/SystemDateRepository.ts"],"names":[],"mappings":";;;AAEA,MAAa,oBAAoB;IAAjC;QACE,QAAG,GAAG,KAAK,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;QAC7B,yBAAoB,GAAG,CAAC,eAAuB,EAAU,EAAE;YACzD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;YAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;YACjD,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;QACjF,CAAC,CAAC;QACF,gCAA2B,GAAG,CAAC,IAAU,EAAU,EAAE;YACnD,MAAM,SAAS,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CACjE,IAAI,CAAC,MAAM,EAAE,CACd,CAAC;YACF,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YAC3D,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,KAAK,IAAI,GAAG,KAAK,SAAS,KAAK,KAAK,IAAI,OAAO,EAAE,CAAC;QACpF,CAAC,CAAC;IACJ,CAAC;CAAA;AAjBD,oDAiBC"}