mdjournal 1.0.16 → 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 (203) hide show
  1. package/LICENSE +26 -0
  2. package/README.md +20 -17
  3. package/dist/README.md +335 -0
  4. package/dist/client/assets/index-CWshDATd.js +402 -0
  5. package/dist/client/dist/assets/index-CWshDATd.js +402 -0
  6. package/dist/client/dist/index.html +1 -1
  7. package/dist/client/index.html +1 -1
  8. package/dist/packages/contract/mdjournal/domains/CalendarApi.d.ts +19 -0
  9. package/dist/packages/contract/mdjournal/domains/CalendarApi.d.ts.map +1 -0
  10. package/dist/packages/contract/mdjournal/domains/CalendarApi.js +7 -0
  11. package/dist/packages/contract/mdjournal/domains/CalendarApi.js.map +1 -0
  12. package/dist/packages/contract/mdjournal/domains/ConfigApi.d.ts +29 -0
  13. package/dist/packages/contract/mdjournal/domains/ConfigApi.d.ts.map +1 -0
  14. package/dist/packages/contract/mdjournal/domains/ConfigApi.js +7 -0
  15. package/dist/packages/contract/mdjournal/domains/ConfigApi.js.map +1 -0
  16. package/dist/packages/contract/mdjournal/domains/GitApi.d.ts +14 -0
  17. package/dist/packages/contract/mdjournal/domains/GitApi.d.ts.map +1 -0
  18. package/dist/packages/contract/mdjournal/domains/GitApi.js +7 -0
  19. package/dist/packages/contract/mdjournal/domains/GitApi.js.map +1 -0
  20. package/dist/packages/contract/mdjournal/domains/ReportApi.d.ts +24 -0
  21. package/dist/packages/contract/mdjournal/domains/ReportApi.d.ts.map +1 -0
  22. package/dist/packages/contract/mdjournal/domains/ReportApi.js +7 -0
  23. package/dist/packages/contract/mdjournal/domains/ReportApi.js.map +1 -0
  24. package/dist/packages/contract/mdjournal/domains/index.d.ts +24 -0
  25. package/dist/packages/contract/mdjournal/domains/index.d.ts.map +1 -0
  26. package/dist/packages/contract/mdjournal/domains/index.js +7 -0
  27. package/dist/packages/contract/mdjournal/domains/index.js.map +1 -0
  28. package/dist/packages/contract/mdjournal/errors/index.d.ts +19 -0
  29. package/dist/packages/contract/mdjournal/errors/index.d.ts.map +1 -0
  30. package/dist/packages/contract/mdjournal/errors/index.js +29 -0
  31. package/dist/packages/contract/mdjournal/errors/index.js.map +1 -0
  32. package/dist/packages/contract/mdjournal/index.d.ts +8 -0
  33. package/dist/packages/contract/mdjournal/index.d.ts.map +1 -0
  34. package/dist/packages/contract/mdjournal/index.js +8 -0
  35. package/dist/packages/contract/mdjournal/index.js.map +1 -0
  36. package/dist/packages/contract/mdjournal/schemas/index.d.ts +7 -0
  37. package/dist/packages/contract/mdjournal/schemas/index.d.ts.map +1 -0
  38. package/dist/packages/contract/mdjournal/schemas/index.js +7 -0
  39. package/dist/packages/contract/mdjournal/schemas/index.js.map +1 -0
  40. package/dist/packages/contract/mdjournal/schemas/types.d.ts +357 -0
  41. package/dist/packages/contract/mdjournal/schemas/types.d.ts.map +1 -0
  42. package/dist/packages/contract/mdjournal/schemas/types.js +7 -0
  43. package/dist/packages/contract/mdjournal/schemas/types.js.map +1 -0
  44. package/dist/packages/contract/mdjournal/schemas/validators.d.ts +1576 -0
  45. package/dist/packages/contract/mdjournal/schemas/validators.d.ts.map +1 -0
  46. package/dist/packages/contract/mdjournal/schemas/validators.js +952 -0
  47. package/dist/packages/contract/mdjournal/schemas/validators.js.map +1 -0
  48. package/dist/server/src/cli.d.ts.map +1 -0
  49. package/dist/server/src/cli.js.map +1 -0
  50. package/dist/server/src/index.d.ts.map +1 -0
  51. package/dist/{index.js → server/src/index.js} +21 -11
  52. package/dist/server/src/index.js.map +1 -0
  53. package/dist/server/src/mdjournal/domains/CalendarDomain.d.ts +19 -0
  54. package/dist/server/src/mdjournal/domains/CalendarDomain.d.ts.map +1 -0
  55. package/dist/server/src/mdjournal/domains/CalendarDomain.js +88 -0
  56. package/dist/server/src/mdjournal/domains/CalendarDomain.js.map +1 -0
  57. package/dist/server/src/mdjournal/domains/CalendarDomain.test.d.ts +2 -0
  58. package/dist/server/src/mdjournal/domains/CalendarDomain.test.d.ts.map +1 -0
  59. package/dist/server/src/mdjournal/domains/CalendarDomain.test.js +111 -0
  60. package/dist/server/src/mdjournal/domains/CalendarDomain.test.js.map +1 -0
  61. package/dist/server/src/mdjournal/domains/ConfigDomain.d.ts +27 -0
  62. package/dist/server/src/mdjournal/domains/ConfigDomain.d.ts.map +1 -0
  63. package/dist/server/src/mdjournal/domains/ConfigDomain.js +59 -0
  64. package/dist/server/src/mdjournal/domains/ConfigDomain.js.map +1 -0
  65. package/dist/server/src/mdjournal/domains/ConfigDomain.test.d.ts +2 -0
  66. package/dist/server/src/mdjournal/domains/ConfigDomain.test.d.ts.map +1 -0
  67. package/dist/server/src/mdjournal/domains/ConfigDomain.test.js +177 -0
  68. package/dist/server/src/mdjournal/domains/ConfigDomain.test.js.map +1 -0
  69. package/dist/server/src/mdjournal/domains/GitDomain.d.ts +15 -0
  70. package/dist/server/src/mdjournal/domains/GitDomain.d.ts.map +1 -0
  71. package/dist/server/src/mdjournal/domains/GitDomain.js +16 -0
  72. package/dist/server/src/mdjournal/domains/GitDomain.js.map +1 -0
  73. package/dist/server/src/mdjournal/domains/GitDomain.test.d.ts +2 -0
  74. package/dist/server/src/mdjournal/domains/GitDomain.test.d.ts.map +1 -0
  75. package/dist/server/src/mdjournal/domains/GitDomain.test.js +112 -0
  76. package/dist/server/src/mdjournal/domains/GitDomain.test.js.map +1 -0
  77. package/dist/server/src/mdjournal/domains/ReportDomain.d.ts +23 -0
  78. package/dist/server/src/mdjournal/domains/ReportDomain.d.ts.map +1 -0
  79. package/dist/server/src/mdjournal/domains/ReportDomain.js +117 -0
  80. package/dist/server/src/mdjournal/domains/ReportDomain.js.map +1 -0
  81. package/dist/server/src/mdjournal/domains/ReportDomain.test.d.ts +2 -0
  82. package/dist/server/src/mdjournal/domains/ReportDomain.test.d.ts.map +1 -0
  83. package/dist/server/src/mdjournal/domains/ReportDomain.test.js +207 -0
  84. package/dist/server/src/mdjournal/domains/ReportDomain.test.js.map +1 -0
  85. package/dist/server/src/mdjournal/domains/errors.d.ts +17 -0
  86. package/dist/server/src/mdjournal/domains/errors.d.ts.map +1 -0
  87. package/dist/server/src/mdjournal/domains/errors.js +27 -0
  88. package/dist/server/src/mdjournal/domains/errors.js.map +1 -0
  89. package/dist/server/src/mdjournal/domains/index.d.ts +15 -0
  90. package/dist/server/src/mdjournal/domains/index.d.ts.map +1 -0
  91. package/dist/server/src/mdjournal/domains/index.js +11 -0
  92. package/dist/server/src/mdjournal/domains/index.js.map +1 -0
  93. package/dist/server/src/mdjournal/index.d.ts +17 -0
  94. package/dist/server/src/mdjournal/index.d.ts.map +1 -0
  95. package/dist/server/src/mdjournal/index.js +34 -0
  96. package/dist/server/src/mdjournal/index.js.map +1 -0
  97. package/dist/server/src/mdjournal/routes.generated.d.ts +28 -0
  98. package/dist/server/src/mdjournal/routes.generated.d.ts.map +1 -0
  99. package/dist/server/src/mdjournal/routes.generated.js +403 -0
  100. package/dist/server/src/mdjournal/routes.generated.js.map +1 -0
  101. package/dist/server/src/types/index.d.ts.map +1 -0
  102. package/dist/server/src/types/index.js.map +1 -0
  103. package/dist/server/src/utils/configValidator.d.ts.map +1 -0
  104. package/dist/server/src/utils/configValidator.js.map +1 -0
  105. package/dist/server/src/utils/configValidator.test.d.ts +2 -0
  106. package/dist/server/src/utils/configValidator.test.d.ts.map +1 -0
  107. package/dist/server/src/utils/configValidator.test.js +359 -0
  108. package/dist/server/src/utils/configValidator.test.js.map +1 -0
  109. package/dist/server/src/utils/fileManager.d.ts.map +1 -0
  110. package/dist/server/src/utils/fileManager.js.map +1 -0
  111. package/dist/server/src/utils/git.d.ts.map +1 -0
  112. package/dist/server/src/utils/git.js.map +1 -0
  113. package/dist/server/src/utils/index.d.ts.map +1 -0
  114. package/dist/server/src/utils/index.js.map +1 -0
  115. package/dist/server/src/utils/markdown.d.ts.map +1 -0
  116. package/dist/server/src/utils/markdown.js.map +1 -0
  117. package/dist/server/src/utils/markdown.test.d.ts +2 -0
  118. package/dist/server/src/utils/markdown.test.d.ts.map +1 -0
  119. package/dist/server/src/utils/markdown.test.js +291 -0
  120. package/dist/server/src/utils/markdown.test.js.map +1 -0
  121. package/dist/server/src/utils/slack.d.ts.map +1 -0
  122. package/dist/server/src/utils/slack.js.map +1 -0
  123. package/dist/server/src/utils/validator.d.ts.map +1 -0
  124. package/dist/server/src/utils/validator.js.map +1 -0
  125. package/dist/server/src/utils/validator.test.d.ts +2 -0
  126. package/dist/server/src/utils/validator.test.d.ts.map +1 -0
  127. package/dist/server/src/utils/validator.test.js +307 -0
  128. package/dist/server/src/utils/validator.test.js.map +1 -0
  129. package/package.json +37 -17
  130. package/dist/cli.d.ts.map +0 -1
  131. package/dist/cli.js.map +0 -1
  132. package/dist/client/assets/index-DlkkIyB6.js +0 -402
  133. package/dist/client/dist/assets/index-DlkkIyB6.js +0 -402
  134. package/dist/index.d.ts.map +0 -1
  135. package/dist/index.js.map +0 -1
  136. package/dist/routes/calendar.d.ts +0 -8
  137. package/dist/routes/calendar.d.ts.map +0 -1
  138. package/dist/routes/calendar.js +0 -115
  139. package/dist/routes/calendar.js.map +0 -1
  140. package/dist/routes/config.d.ts +0 -11
  141. package/dist/routes/config.d.ts.map +0 -1
  142. package/dist/routes/config.js +0 -120
  143. package/dist/routes/config.js.map +0 -1
  144. package/dist/routes/gcal.d.ts +0 -10
  145. package/dist/routes/gcal.d.ts.map +0 -1
  146. package/dist/routes/gcal.js +0 -100
  147. package/dist/routes/gcal.js.map +0 -1
  148. package/dist/routes/git.d.ts +0 -8
  149. package/dist/routes/git.d.ts.map +0 -1
  150. package/dist/routes/git.js +0 -28
  151. package/dist/routes/git.js.map +0 -1
  152. package/dist/routes/index.d.ts +0 -9
  153. package/dist/routes/index.d.ts.map +0 -1
  154. package/dist/routes/index.js +0 -9
  155. package/dist/routes/index.js.map +0 -1
  156. package/dist/routes/reports.d.ts +0 -10
  157. package/dist/routes/reports.d.ts.map +0 -1
  158. package/dist/routes/reports.js +0 -175
  159. package/dist/routes/reports.js.map +0 -1
  160. package/dist/types/index.d.ts.map +0 -1
  161. package/dist/types/index.js.map +0 -1
  162. package/dist/utils/configValidator.d.ts.map +0 -1
  163. package/dist/utils/configValidator.js.map +0 -1
  164. package/dist/utils/fileManager.d.ts.map +0 -1
  165. package/dist/utils/fileManager.js.map +0 -1
  166. package/dist/utils/git.d.ts.map +0 -1
  167. package/dist/utils/git.js.map +0 -1
  168. package/dist/utils/index.d.ts.map +0 -1
  169. package/dist/utils/index.js.map +0 -1
  170. package/dist/utils/markdown.d.ts.map +0 -1
  171. package/dist/utils/markdown.js.map +0 -1
  172. package/dist/utils/slack.d.ts.map +0 -1
  173. package/dist/utils/slack.js.map +0 -1
  174. package/dist/utils/validator.d.ts.map +0 -1
  175. package/dist/utils/validator.js.map +0 -1
  176. /package/{docs → dist/docs}/api-reference.html +0 -0
  177. /package/{docs → dist/docs}/config-spec.md +0 -0
  178. /package/{docs → dist/docs}/extension-spec.md +0 -0
  179. /package/{docs → dist/docs}/index.md +0 -0
  180. /package/{docs → dist/docs}/integration-spec.md +0 -0
  181. /package/{docs → dist/docs}/markdown-format-spec.md +0 -0
  182. /package/{docs → dist/docs}/openapi.yaml +0 -0
  183. /package/{docs → dist/docs}/requirements.md +0 -0
  184. /package/{docs → dist/docs}/screenshot.png +0 -0
  185. /package/dist/{cli.d.ts → server/src/cli.d.ts} +0 -0
  186. /package/dist/{cli.js → server/src/cli.js} +0 -0
  187. /package/dist/{index.d.ts → server/src/index.d.ts} +0 -0
  188. /package/dist/{types → server/src/types}/index.d.ts +0 -0
  189. /package/dist/{types → server/src/types}/index.js +0 -0
  190. /package/dist/{utils → server/src/utils}/configValidator.d.ts +0 -0
  191. /package/dist/{utils → server/src/utils}/configValidator.js +0 -0
  192. /package/dist/{utils → server/src/utils}/fileManager.d.ts +0 -0
  193. /package/dist/{utils → server/src/utils}/fileManager.js +0 -0
  194. /package/dist/{utils → server/src/utils}/git.d.ts +0 -0
  195. /package/dist/{utils → server/src/utils}/git.js +0 -0
  196. /package/dist/{utils → server/src/utils}/index.d.ts +0 -0
  197. /package/dist/{utils → server/src/utils}/index.js +0 -0
  198. /package/dist/{utils → server/src/utils}/markdown.d.ts +0 -0
  199. /package/dist/{utils → server/src/utils}/markdown.js +0 -0
  200. /package/dist/{utils → server/src/utils}/slack.d.ts +0 -0
  201. /package/dist/{utils → server/src/utils}/slack.js +0 -0
  202. /package/dist/{utils → server/src/utils}/validator.d.ts +0 -0
  203. /package/dist/{utils → server/src/utils}/validator.js +0 -0
@@ -0,0 +1,177 @@
1
+ /**
2
+ * ConfigDomain tests
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { ConfigDomain } from './ConfigDomain.js';
6
+ import { ValidationError } from './errors.js';
7
+ // Mock dependencies
8
+ vi.mock('../../utils/fileManager.js', () => ({
9
+ readConfig: vi.fn(),
10
+ writeConfig: vi.fn(),
11
+ readRoutinesMarkdown: vi.fn(),
12
+ writeRoutinesMarkdown: vi.fn(),
13
+ }));
14
+ import { readConfig, writeConfig, readRoutinesMarkdown, writeRoutinesMarkdown, } from '../../utils/fileManager.js';
15
+ describe('ConfigDomain', () => {
16
+ let configDomain;
17
+ beforeEach(() => {
18
+ configDomain = new ConfigDomain();
19
+ vi.clearAllMocks();
20
+ });
21
+ describe('getConfig', () => {
22
+ it('should return config', async () => {
23
+ const mockConfig = {
24
+ projects: [
25
+ { code: 'P99', name: 'テストプロジェクト', color: '#FF0000', category: 'internal', active: true },
26
+ ],
27
+ routines: {
28
+ weekly: {
29
+ monday: [],
30
+ },
31
+ },
32
+ timeline: {
33
+ hourHeight: 60,
34
+ maxHours: 24,
35
+ defaultStartHour: 8,
36
+ defaultEndHour: 20,
37
+ snapMinutes: 15,
38
+ },
39
+ };
40
+ vi.mocked(readConfig).mockResolvedValue(mockConfig);
41
+ const result = await configDomain.getConfig({});
42
+ expect(readConfig).toHaveBeenCalled();
43
+ expect(result).toEqual(mockConfig);
44
+ });
45
+ });
46
+ describe('updateConfig', () => {
47
+ it('should update config with valid projects', async () => {
48
+ const mockConfig = {
49
+ projects: [
50
+ { code: 'P99', name: 'テストプロジェクト', color: '#FF0000', category: 'internal', active: true },
51
+ ],
52
+ routines: {},
53
+ };
54
+ vi.mocked(writeConfig).mockResolvedValue(undefined);
55
+ vi.mocked(readConfig).mockResolvedValue(mockConfig);
56
+ const result = await configDomain.updateConfig({
57
+ data: {
58
+ projects: [
59
+ { code: 'P99', name: 'テストプロジェクト', color: '#FF0000', category: 'internal', active: true },
60
+ ],
61
+ },
62
+ });
63
+ expect(writeConfig).toHaveBeenCalled();
64
+ expect(result).toEqual(mockConfig);
65
+ });
66
+ it('should throw ValidationError for project without required fields', async () => {
67
+ await expect(configDomain.updateConfig({
68
+ data: {
69
+ projects: [
70
+ { code: 'P99', name: '', color: '#FF0000', category: 'internal', active: true },
71
+ ],
72
+ },
73
+ })).rejects.toThrow(ValidationError);
74
+ });
75
+ it('should throw ValidationError for invalid color format', async () => {
76
+ await expect(configDomain.updateConfig({
77
+ data: {
78
+ projects: [
79
+ { code: 'P99', name: 'テスト', color: 'red', category: 'internal', active: true },
80
+ ],
81
+ },
82
+ })).rejects.toThrow(ValidationError);
83
+ await expect(configDomain.updateConfig({
84
+ data: {
85
+ projects: [
86
+ { code: 'P99', name: 'テスト', color: '#FFF', category: 'internal', active: true },
87
+ ],
88
+ },
89
+ })).rejects.toThrow(ValidationError);
90
+ });
91
+ it('should throw ValidationError for invalid category', async () => {
92
+ await expect(configDomain.updateConfig({
93
+ data: {
94
+ projects: [
95
+ { code: 'P99', name: 'テスト', color: '#FF0000', category: 'invalid', active: true },
96
+ ],
97
+ },
98
+ })).rejects.toThrow(ValidationError);
99
+ });
100
+ it('should accept all valid categories', async () => {
101
+ vi.mocked(writeConfig).mockResolvedValue(undefined);
102
+ vi.mocked(readConfig).mockResolvedValue({ projects: [], routines: {} });
103
+ const categories = ['internal', 'client', 'personal'];
104
+ for (const category of categories) {
105
+ await expect(configDomain.updateConfig({
106
+ data: {
107
+ projects: [
108
+ { code: 'P99', name: 'テスト', color: '#FF0000', category, active: true },
109
+ ],
110
+ },
111
+ })).resolves.toBeDefined();
112
+ }
113
+ });
114
+ it('should update config without projects', async () => {
115
+ const mockConfig = {
116
+ projects: [],
117
+ routines: {},
118
+ timeline: { hourHeight: 80, maxHours: 24, defaultStartHour: 8, defaultEndHour: 20, snapMinutes: 15 },
119
+ };
120
+ vi.mocked(writeConfig).mockResolvedValue(undefined);
121
+ vi.mocked(readConfig).mockResolvedValue(mockConfig);
122
+ const result = await configDomain.updateConfig({
123
+ data: { timeline: { hourHeight: 80 } },
124
+ });
125
+ expect(writeConfig).toHaveBeenCalled();
126
+ expect(result).toEqual(mockConfig);
127
+ });
128
+ });
129
+ describe('getRoutinesMarkdown', () => {
130
+ it('should return routines markdown', async () => {
131
+ const mockResponse = {
132
+ content: '# ルーチン設定\n\n## 平日\n* 08:00 [P99] 朝礼',
133
+ source: 'markdown',
134
+ };
135
+ vi.mocked(readRoutinesMarkdown).mockResolvedValue(mockResponse);
136
+ const result = await configDomain.getRoutinesMarkdown({});
137
+ expect(readRoutinesMarkdown).toHaveBeenCalled();
138
+ expect(result).toEqual(mockResponse);
139
+ });
140
+ it('should return routines from yaml source', async () => {
141
+ const mockResponse = {
142
+ content: '# ルーチン設定(YAMLから変換)',
143
+ source: 'yaml',
144
+ };
145
+ vi.mocked(readRoutinesMarkdown).mockResolvedValue(mockResponse);
146
+ const result = await configDomain.getRoutinesMarkdown({});
147
+ expect(result.source).toBe('yaml');
148
+ });
149
+ });
150
+ describe('saveRoutinesMarkdown', () => {
151
+ it('should save routines markdown', async () => {
152
+ const content = '# ルーチン設定\n\n## 平日\n* 08:00 [P99] 朝礼';
153
+ const mockResponse = {
154
+ content,
155
+ source: 'markdown',
156
+ };
157
+ vi.mocked(writeRoutinesMarkdown).mockResolvedValue(undefined);
158
+ vi.mocked(readRoutinesMarkdown).mockResolvedValue(mockResponse);
159
+ const result = await configDomain.saveRoutinesMarkdown({
160
+ data: { content },
161
+ });
162
+ expect(writeRoutinesMarkdown).toHaveBeenCalledWith(content);
163
+ expect(result).toEqual(mockResponse);
164
+ });
165
+ it('should throw ValidationError when content is missing', async () => {
166
+ await expect(configDomain.saveRoutinesMarkdown({
167
+ data: { content: '' },
168
+ })).rejects.toThrow(ValidationError);
169
+ });
170
+ it('should throw ValidationError when content is not a string', async () => {
171
+ await expect(configDomain.saveRoutinesMarkdown({
172
+ data: { content: undefined },
173
+ })).rejects.toThrow(ValidationError);
174
+ });
175
+ });
176
+ });
177
+ //# sourceMappingURL=ConfigDomain.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigDomain.test.js","sourceRoot":"","sources":["../../../../../server/src/mdjournal/domains/ConfigDomain.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAI9C,oBAAoB;AACpB,EAAE,CAAC,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE,CAAC,CAAC;IAC3C,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE;IACnB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;IACpB,oBAAoB,EAAE,EAAE,CAAC,EAAE,EAAE;IAC7B,qBAAqB,EAAE,EAAE,CAAC,EAAE,EAAE;CAC/B,CAAC,CAAC,CAAC;AAEJ,OAAO,EACL,UAAU,EACV,WAAW,EACX,oBAAoB,EACpB,qBAAqB,GACtB,MAAM,4BAA4B,CAAC;AAEpC,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,IAAI,YAA0B,CAAC;IAE/B,UAAU,CAAC,GAAG,EAAE;QACd,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC;QAClC,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;QACzB,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,MAAM,UAAU,GAAW;gBACzB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;iBACzF;gBACD,QAAQ,EAAE;oBACR,MAAM,EAAE;wBACN,MAAM,EAAE,EAAE;qBACX;iBACF;gBACD,QAAQ,EAAE;oBACR,UAAU,EAAE,EAAE;oBACd,QAAQ,EAAE,EAAE;oBACZ,gBAAgB,EAAE,CAAC;oBACnB,cAAc,EAAE,EAAE;oBAClB,WAAW,EAAE,EAAE;iBAChB;aACF,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YAEhD,MAAM,CAAC,UAAU,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACtC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;QAC5B,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;YACxD,MAAM,UAAU,GAAW;gBACzB,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;iBACzF;gBACD,QAAQ,EAAE,EAAE;aACb,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACpD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;gBAC7C,IAAI,EAAE;oBACJ,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;qBACzF;iBACF;aACF,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;YAChF,MAAM,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC;gBACrC,IAAI,EAAE;oBACJ,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;qBAChF;iBACF;aACF,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;YACrE,MAAM,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC;gBACrC,IAAI,EAAE;oBACJ,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;qBAC/E;iBACF;aACF,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;YAErC,MAAM,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC;gBACrC,IAAI,EAAE;oBACJ,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE;qBAChF;iBACF;aACF,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;YACjE,MAAM,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC;gBACrC,IAAI,EAAE;oBACJ,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAuB,EAAE,MAAM,EAAE,IAAI,EAAE;qBAChG;iBACF;aACF,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;YAClD,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACpD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;YAExE,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAC;YAE/D,KAAK,MAAM,QAAQ,IAAI,UAAU,EAAE,CAAC;gBAClC,MAAM,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC;oBACrC,IAAI,EAAE;wBACJ,QAAQ,EAAE;4BACR,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE;yBACvE;qBACF;iBACF,CAAC,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC7B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;YACrD,MAAM,UAAU,GAAW;gBACzB,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE;aACrG,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YACpD,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YAEpD,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,YAAY,CAAC;gBAC7C,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,EAAE;aACvC,CAAC,CAAC;YAEH,MAAM,CAAC,WAAW,CAAC,CAAC,gBAAgB,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,YAAY,GAA6B;gBAC7C,OAAO,EAAE,qCAAqC;gBAC9C,MAAM,EAAE,UAAU;aACnB,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAE1D,MAAM,CAAC,oBAAoB,CAAC,CAAC,gBAAgB,EAAE,CAAC;YAChD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;YACvD,MAAM,YAAY,GAA6B;gBAC7C,OAAO,EAAE,oBAAoB;gBAC7B,MAAM,EAAE,MAAM;aACf,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;YAE1D,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,MAAM,OAAO,GAAG,qCAAqC,CAAC;YACtD,MAAM,YAAY,GAA6B;gBAC7C,OAAO;gBACP,MAAM,EAAE,UAAU;aACnB,CAAC;YACF,EAAE,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;YAC9D,EAAE,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;YAEhE,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,oBAAoB,CAAC;gBACrD,IAAI,EAAE,EAAE,OAAO,EAAE;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,qBAAqB,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;YACpE,MAAM,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC;gBAC7C,IAAI,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;aACtB,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;YACzE,MAAM,MAAM,CAAC,YAAY,CAAC,oBAAoB,CAAC;gBAC7C,IAAI,EAAE,EAAE,OAAO,EAAE,SAA8B,EAAE;aAClD,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Git Domain Implementation
3
+ *
4
+ * Implements GitApi interface from the contract package.
5
+ * Contains HTTP-agnostic business logic for Git operations.
6
+ */
7
+ import type { GitApi } from '@mdjournal/contract/domains/GitApi.js';
8
+ import type { ExtendedGitStatus, Git_getStatusInput } from '@mdjournal/contract/schemas/types.js';
9
+ export declare class GitDomain implements GitApi {
10
+ /**
11
+ * Git状態取得
12
+ */
13
+ getStatus(_input: Git_getStatusInput): Promise<ExtendedGitStatus>;
14
+ }
15
+ //# sourceMappingURL=GitDomain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitDomain.d.ts","sourceRoot":"","sources":["../../../../../server/src/mdjournal/domains/GitDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uCAAuC,CAAC;AACpE,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,sCAAsC,CAAC;AAI9C,qBAAa,SAAU,YAAW,MAAM;IACtC;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAGxE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Git Domain Implementation
3
+ *
4
+ * Implements GitApi interface from the contract package.
5
+ * Contains HTTP-agnostic business logic for Git operations.
6
+ */
7
+ import { getExtendedGitStatus } from '../../utils/git.js';
8
+ export class GitDomain {
9
+ /**
10
+ * Git状態取得
11
+ */
12
+ async getStatus(_input) {
13
+ return await getExtendedGitStatus();
14
+ }
15
+ }
16
+ //# sourceMappingURL=GitDomain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitDomain.js","sourceRoot":"","sources":["../../../../../server/src/mdjournal/domains/GitDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE1D,MAAM,OAAO,SAAS;IACpB;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,MAA0B;QACxC,OAAO,MAAM,oBAAoB,EAAE,CAAC;IACtC,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=GitDomain.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitDomain.test.d.ts","sourceRoot":"","sources":["../../../../../server/src/mdjournal/domains/GitDomain.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,112 @@
1
+ /**
2
+ * GitDomain tests
3
+ */
4
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
5
+ import { GitDomain } from './GitDomain.js';
6
+ // Mock dependencies
7
+ vi.mock('../../utils/git.js', () => ({
8
+ getExtendedGitStatus: vi.fn(),
9
+ }));
10
+ import { getExtendedGitStatus } from '../../utils/git.js';
11
+ describe('GitDomain', () => {
12
+ let gitDomain;
13
+ beforeEach(() => {
14
+ gitDomain = new GitDomain();
15
+ vi.clearAllMocks();
16
+ });
17
+ describe('getStatus', () => {
18
+ it('should return git status when repo is clean', async () => {
19
+ const mockStatus = {
20
+ branch: 'main',
21
+ uncommitted: {
22
+ count: 0,
23
+ files: [],
24
+ },
25
+ unpushed: {
26
+ count: 0,
27
+ commits: [],
28
+ },
29
+ };
30
+ vi.mocked(getExtendedGitStatus).mockResolvedValue(mockStatus);
31
+ const result = await gitDomain.getStatus({});
32
+ expect(getExtendedGitStatus).toHaveBeenCalled();
33
+ expect(result.branch).toBe('main');
34
+ expect(result.uncommitted.count).toBe(0);
35
+ expect(result.unpushed.count).toBe(0);
36
+ });
37
+ it('should return git status with uncommitted changes', async () => {
38
+ const mockStatus = {
39
+ branch: 'feature/test',
40
+ uncommitted: {
41
+ count: 3,
42
+ files: [
43
+ { path: 'reports/2025-01-06.md', status: 'M' },
44
+ { path: 'config/projects.yaml', status: 'A' },
45
+ { path: 'README.md', status: 'M' },
46
+ ],
47
+ },
48
+ unpushed: {
49
+ count: 2,
50
+ commits: [
51
+ { hash: 'abc123', message: '日報更新', date: '2025-01-06 10:00:00', files: ['reports/2025-01-06.md'] },
52
+ { hash: 'def456', message: '設定追加', date: '2025-01-06 09:00:00', files: ['config/projects.yaml'] },
53
+ ],
54
+ },
55
+ lastCommit: {
56
+ hash: 'abc123',
57
+ message: '日報更新',
58
+ date: '2025-01-06 10:00:00',
59
+ },
60
+ };
61
+ vi.mocked(getExtendedGitStatus).mockResolvedValue(mockStatus);
62
+ const result = await gitDomain.getStatus({});
63
+ expect(result.branch).toBe('feature/test');
64
+ expect(result.uncommitted.count).toBe(3);
65
+ expect(result.uncommitted.files).toHaveLength(3);
66
+ expect(result.unpushed.count).toBe(2);
67
+ expect(result.lastCommit?.hash).toBe('abc123');
68
+ });
69
+ it('should handle repository with no unpushed commits', async () => {
70
+ const mockStatus = {
71
+ branch: 'main',
72
+ uncommitted: {
73
+ count: 1,
74
+ files: [{ path: 'file.txt', status: 'M' }],
75
+ },
76
+ unpushed: {
77
+ count: 0,
78
+ commits: [],
79
+ },
80
+ };
81
+ vi.mocked(getExtendedGitStatus).mockResolvedValue(mockStatus);
82
+ const result = await gitDomain.getStatus({});
83
+ expect(result.branch).toBe('main');
84
+ expect(result.uncommitted.count).toBe(1);
85
+ expect(result.unpushed.count).toBe(0);
86
+ });
87
+ it('should handle lastCommit info', async () => {
88
+ const mockStatus = {
89
+ branch: 'main',
90
+ uncommitted: {
91
+ count: 0,
92
+ files: [],
93
+ },
94
+ unpushed: {
95
+ count: 0,
96
+ commits: [],
97
+ },
98
+ lastCommit: {
99
+ hash: 'xyz789',
100
+ message: '最新コミット',
101
+ date: '2025-01-05 18:00:00',
102
+ },
103
+ };
104
+ vi.mocked(getExtendedGitStatus).mockResolvedValue(mockStatus);
105
+ const result = await gitDomain.getStatus({});
106
+ expect(result.lastCommit).toBeDefined();
107
+ expect(result.lastCommit?.hash).toBe('xyz789');
108
+ expect(result.lastCommit?.message).toBe('最新コミット');
109
+ });
110
+ });
111
+ });
112
+ //# sourceMappingURL=GitDomain.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitDomain.test.js","sourceRoot":"","sources":["../../../../../server/src/mdjournal/domains/GitDomain.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Report Domain Implementation
3
+ *
4
+ * Implements ReportApi interface from the contract package.
5
+ * Contains HTTP-agnostic business logic for report operations.
6
+ */
7
+ import type { ReportApi } from '@mdjournal/contract/domains/ReportApi.js';
8
+ import type { ReportResponse, ReportSaveResponse, Report_getReportInput, Report_saveReportInput, Report_deleteReportInput } from '@mdjournal/contract/schemas/types.js';
9
+ export declare class ReportDomain implements ReportApi {
10
+ /**
11
+ * 日報取得
12
+ */
13
+ getReport(input: Report_getReportInput): Promise<ReportResponse>;
14
+ /**
15
+ * 日報保存
16
+ */
17
+ saveReport(input: Report_saveReportInput): Promise<ReportSaveResponse>;
18
+ /**
19
+ * 日報削除
20
+ */
21
+ deleteReport(input: Report_deleteReportInput): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=ReportDomain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportDomain.d.ts","sourceRoot":"","sources":["../../../../../server/src/mdjournal/domains/ReportDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0CAA0C,CAAC;AAC1E,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,sBAAsB,EACtB,wBAAwB,EACzB,MAAM,sCAAsC,CAAC;AAe9C,qBAAa,YAAa,YAAW,SAAS;IAC5C;;OAEG;IACG,SAAS,CAAC,KAAK,EAAE,qBAAqB,GAAG,OAAO,CAAC,cAAc,CAAC;IA2BtE;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAoE5E;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;CAanE"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Report Domain Implementation
3
+ *
4
+ * Implements ReportApi interface from the contract package.
5
+ * Contains HTTP-agnostic business logic for report operations.
6
+ */
7
+ import { readReport, writeReport, deleteReport as deleteReportFile, getReportFilePath } from '../../utils/fileManager.js';
8
+ import { parseMarkdown, calculateStats } from '../../utils/markdown.js';
9
+ import { gitCommit, gitPush, getRelativePathFromGitRoot } from '../../utils/git.js';
10
+ import { postToSlack } from '../../utils/slack.js';
11
+ import { NotFoundError, ValidationError } from './errors.js';
12
+ /**
13
+ * 日付形式のバリデーション
14
+ */
15
+ function isValidDate(date) {
16
+ return /^\d{4}-\d{2}-\d{2}$/.test(date);
17
+ }
18
+ export class ReportDomain {
19
+ /**
20
+ * 日報取得
21
+ */
22
+ async getReport(input) {
23
+ const { date } = input;
24
+ if (!isValidDate(date)) {
25
+ throw new ValidationError('日付形式が不正です(YYYY-MM-DD形式で指定してください)');
26
+ }
27
+ const result = await readReport(date);
28
+ if (!result) {
29
+ throw new NotFoundError('指定された日報が見つかりません');
30
+ }
31
+ // frontmatterがない場合はパースして統計情報を計算
32
+ let stats = result.stats;
33
+ if (!stats) {
34
+ const report = parseMarkdown(date, result.content);
35
+ stats = calculateStats(report);
36
+ }
37
+ return {
38
+ date,
39
+ content: result.content,
40
+ stats,
41
+ };
42
+ }
43
+ /**
44
+ * 日報保存
45
+ */
46
+ async saveReport(input) {
47
+ const { date, data } = input;
48
+ if (!isValidDate(date)) {
49
+ throw new ValidationError('日付形式が不正です(YYYY-MM-DD形式で指定してください)');
50
+ }
51
+ if (!data.content) {
52
+ throw new ValidationError('contentフィールドは必須です');
53
+ }
54
+ // Markdownをパースして統計情報を計算
55
+ const report = parseMarkdown(date, data.content);
56
+ const stats = calculateStats(report);
57
+ // ファイルに保存
58
+ await writeReport(date, data.content, stats);
59
+ const response = {
60
+ date,
61
+ saved: true,
62
+ stats,
63
+ };
64
+ // Git操作
65
+ if (data.git?.commit) {
66
+ const filePath = getReportFilePath(date);
67
+ const relativePath = getRelativePathFromGitRoot(filePath);
68
+ const message = data.git.message || `日報更新: ${date}`;
69
+ console.log(`Git commit: ${relativePath}`);
70
+ const commitResult = await gitCommit(relativePath, message);
71
+ console.log(`Git commit result:`, commitResult);
72
+ response.git = {
73
+ committed: commitResult.success,
74
+ commitHash: commitResult.commitHash,
75
+ error: commitResult.error,
76
+ };
77
+ // Push
78
+ if (data.git.push && commitResult.success) {
79
+ const pushResult = await gitPush();
80
+ response.git.pushed = pushResult.success;
81
+ if (pushResult.error) {
82
+ response.git.error = pushResult.error;
83
+ }
84
+ }
85
+ }
86
+ // Slack投稿
87
+ if (data.slack?.post) {
88
+ console.log(`Slack post: ${date}`);
89
+ const slackResult = await postToSlack(date, data.content);
90
+ response.slack = {
91
+ posted: slackResult.success,
92
+ error: slackResult.error,
93
+ };
94
+ if (slackResult.success) {
95
+ console.log(`Slack post success`);
96
+ }
97
+ else {
98
+ console.log(`Slack post failed: ${slackResult.error}`);
99
+ }
100
+ }
101
+ return response;
102
+ }
103
+ /**
104
+ * 日報削除
105
+ */
106
+ async deleteReport(input) {
107
+ const { date } = input;
108
+ if (!isValidDate(date)) {
109
+ throw new ValidationError('日付形式が不正です(YYYY-MM-DD形式で指定してください)');
110
+ }
111
+ const deleted = await deleteReportFile(date);
112
+ if (!deleted) {
113
+ throw new NotFoundError('指定された日報が見つかりません');
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=ReportDomain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportDomain.js","sourceRoot":"","sources":["../../../../../server/src/mdjournal/domains/ReportDomain.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,IAAI,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC1H,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE7D;;GAEG;AACH,SAAS,WAAW,CAAC,IAAY;IAC/B,OAAO,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,OAAO,YAAY;IACvB;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,KAA4B;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,eAAe,CAAC,kCAAkC,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;QAEtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;QAC7C,CAAC;QAED,gCAAgC;QAChC,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACzB,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YACnD,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAED,OAAO;YACL,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,KAAK;SACN,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,KAA6B;QAC5C,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QAE7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,eAAe,CAAC,kCAAkC,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YAClB,MAAM,IAAI,eAAe,CAAC,mBAAmB,CAAC,CAAC;QACjD,CAAC;QAED,wBAAwB;QACxB,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACjD,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QAErC,UAAU;QACV,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAE7C,MAAM,QAAQ,GAAuB;YACnC,IAAI;YACJ,KAAK,EAAE,IAAI;YACX,KAAK;SACN,CAAC;QAEF,QAAQ;QACR,IAAI,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC;YACrB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM,YAAY,GAAG,0BAA0B,CAAC,QAAQ,CAAC,CAAC;YAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,SAAS,IAAI,EAAE,CAAC;YAEpD,OAAO,CAAC,GAAG,CAAC,eAAe,YAAY,EAAE,CAAC,CAAC;YAC3C,MAAM,YAAY,GAAG,MAAM,SAAS,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC;YAEhD,QAAQ,CAAC,GAAG,GAAG;gBACb,SAAS,EAAE,YAAY,CAAC,OAAO;gBAC/B,UAAU,EAAE,YAAY,CAAC,UAAU;gBACnC,KAAK,EAAE,YAAY,CAAC,KAAK;aAC1B,CAAC;YAEF,OAAO;YACP,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gBAC1C,MAAM,UAAU,GAAG,MAAM,OAAO,EAAE,CAAC;gBACnC,QAAQ,CAAC,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC;gBACzC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;oBACrB,QAAQ,CAAC,GAAG,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;gBACxC,CAAC;YACH,CAAC;QACH,CAAC;QAED,UAAU;QACV,IAAI,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;YACnC,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1D,QAAQ,CAAC,KAAK,GAAG;gBACf,MAAM,EAAE,WAAW,CAAC,OAAO;gBAC3B,KAAK,EAAE,WAAW,CAAC,KAAK;aACzB,CAAC;YACF,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;YACpC,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,sBAAsB,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,KAA+B;QAChD,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC;QAEvB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,eAAe,CAAC,kCAAkC,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAE7C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ReportDomain.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ReportDomain.test.d.ts","sourceRoot":"","sources":["../../../../../server/src/mdjournal/domains/ReportDomain.test.ts"],"names":[],"mappings":""}