@shizuoka-its/core 2.1.2 → 3.0.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (524) hide show
  1. package/README.md +45 -25
  2. package/dist/_virtual/_rolldown/runtime.cjs +13 -0
  3. package/dist/_virtual/_rolldown/runtime.mjs +13 -0
  4. package/dist/application/exceptions/ApplicationExceptions.cjs +124 -0
  5. package/dist/application/exceptions/ApplicationExceptions.cjs.map +1 -0
  6. package/dist/application/exceptions/ApplicationExceptions.mjs +115 -0
  7. package/dist/application/exceptions/ApplicationExceptions.mjs.map +1 -0
  8. package/dist/application/index.cjs +39 -0
  9. package/dist/application/index.mjs +40 -0
  10. package/dist/application/usecase/base.cjs +11 -0
  11. package/dist/application/usecase/base.cjs.map +1 -0
  12. package/dist/application/usecase/base.d.cts +12 -0
  13. package/dist/application/usecase/base.d.mts +12 -0
  14. package/dist/application/usecase/base.mjs +11 -0
  15. package/dist/application/usecase/base.mjs.map +1 -0
  16. package/dist/application/usecase/event/AddExhibitToEvent.cjs +27 -0
  17. package/dist/application/usecase/event/AddExhibitToEvent.cjs.map +1 -0
  18. package/dist/application/usecase/event/AddExhibitToEvent.d.cts +32 -0
  19. package/dist/application/usecase/event/AddExhibitToEvent.d.mts +32 -0
  20. package/dist/application/usecase/event/AddExhibitToEvent.mjs +27 -0
  21. package/dist/application/usecase/event/AddExhibitToEvent.mjs.map +1 -0
  22. package/dist/application/usecase/event/ChangeExhibitDescription.cjs +23 -0
  23. package/dist/application/usecase/event/ChangeExhibitDescription.cjs.map +1 -0
  24. package/dist/application/usecase/event/ChangeExhibitDescription.d.cts +26 -0
  25. package/dist/application/usecase/event/ChangeExhibitDescription.d.mts +26 -0
  26. package/dist/application/usecase/event/ChangeExhibitDescription.mjs +23 -0
  27. package/dist/application/usecase/event/ChangeExhibitDescription.mjs.map +1 -0
  28. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.cjs +23 -0
  29. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.cjs.map +1 -0
  30. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.d.cts +26 -0
  31. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.d.mts +26 -0
  32. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.mjs +23 -0
  33. package/dist/application/usecase/event/ChangeExhibitMarkdownContent.mjs.map +1 -0
  34. package/dist/application/usecase/event/ChangeExhibitName.cjs +23 -0
  35. package/dist/application/usecase/event/ChangeExhibitName.cjs.map +1 -0
  36. package/dist/application/usecase/event/ChangeExhibitName.d.cts +26 -0
  37. package/dist/application/usecase/event/ChangeExhibitName.d.mts +26 -0
  38. package/dist/application/usecase/event/ChangeExhibitName.mjs +23 -0
  39. package/dist/application/usecase/event/ChangeExhibitName.mjs.map +1 -0
  40. package/dist/application/usecase/event/ChangeExhibitUrl.cjs +23 -0
  41. package/dist/application/usecase/event/ChangeExhibitUrl.cjs.map +1 -0
  42. package/dist/application/usecase/event/ChangeExhibitUrl.d.cts +27 -0
  43. package/dist/application/usecase/event/ChangeExhibitUrl.d.mts +27 -0
  44. package/dist/application/usecase/event/ChangeExhibitUrl.mjs +23 -0
  45. package/dist/application/usecase/event/ChangeExhibitUrl.mjs.map +1 -0
  46. package/dist/application/usecase/event/ChangeLightningTalkDuration.cjs +23 -0
  47. package/dist/application/usecase/event/ChangeLightningTalkDuration.cjs.map +1 -0
  48. package/dist/application/usecase/event/ChangeLightningTalkDuration.d.cts +27 -0
  49. package/dist/application/usecase/event/ChangeLightningTalkDuration.d.mts +27 -0
  50. package/dist/application/usecase/event/ChangeLightningTalkDuration.mjs +23 -0
  51. package/dist/application/usecase/event/ChangeLightningTalkDuration.mjs.map +1 -0
  52. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.cjs +23 -0
  53. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.cjs.map +1 -0
  54. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.d.cts +27 -0
  55. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.d.mts +27 -0
  56. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.mjs +23 -0
  57. package/dist/application/usecase/event/ChangeLightningTalkSlideUrl.mjs.map +1 -0
  58. package/dist/application/usecase/event/ChangeLightningTalkStartTime.cjs +23 -0
  59. package/dist/application/usecase/event/ChangeLightningTalkStartTime.cjs.map +1 -0
  60. package/dist/application/usecase/event/ChangeLightningTalkStartTime.d.cts +26 -0
  61. package/dist/application/usecase/event/ChangeLightningTalkStartTime.d.mts +26 -0
  62. package/dist/application/usecase/event/ChangeLightningTalkStartTime.mjs +23 -0
  63. package/dist/application/usecase/event/ChangeLightningTalkStartTime.mjs.map +1 -0
  64. package/dist/application/usecase/event/CreateEvent.cjs +23 -0
  65. package/dist/application/usecase/event/CreateEvent.cjs.map +1 -0
  66. package/dist/application/usecase/event/CreateEvent.d.cts +25 -0
  67. package/dist/application/usecase/event/CreateEvent.d.mts +25 -0
  68. package/dist/application/usecase/event/CreateEvent.mjs +23 -0
  69. package/dist/application/usecase/event/CreateEvent.mjs.map +1 -0
  70. package/dist/application/usecase/event/DeleteEvent.cjs +22 -0
  71. package/dist/application/usecase/event/DeleteEvent.cjs.map +1 -0
  72. package/dist/application/usecase/event/DeleteEvent.d.cts +23 -0
  73. package/dist/application/usecase/event/DeleteEvent.d.mts +23 -0
  74. package/dist/application/usecase/event/DeleteEvent.mjs +22 -0
  75. package/dist/application/usecase/event/DeleteEvent.mjs.map +1 -0
  76. package/dist/application/usecase/event/GetEvent.cjs +18 -0
  77. package/dist/application/usecase/event/GetEvent.cjs.map +1 -0
  78. package/dist/application/usecase/event/GetEvent.d.cts +23 -0
  79. package/dist/application/usecase/event/GetEvent.d.mts +23 -0
  80. package/dist/application/usecase/event/GetEvent.mjs +18 -0
  81. package/dist/application/usecase/event/GetEvent.mjs.map +1 -0
  82. package/dist/application/usecase/event/GetEventList.cjs +15 -0
  83. package/dist/application/usecase/event/GetEventList.cjs.map +1 -0
  84. package/dist/application/usecase/event/GetEventList.d.cts +17 -0
  85. package/dist/application/usecase/event/GetEventList.d.mts +17 -0
  86. package/dist/application/usecase/event/GetEventList.mjs +15 -0
  87. package/dist/application/usecase/event/GetEventList.mjs.map +1 -0
  88. package/dist/application/usecase/event/RemoveExhibitFromEvent.cjs +23 -0
  89. package/dist/application/usecase/event/RemoveExhibitFromEvent.cjs.map +1 -0
  90. package/dist/application/usecase/event/RemoveExhibitFromEvent.d.cts +25 -0
  91. package/dist/application/usecase/event/RemoveExhibitFromEvent.d.mts +25 -0
  92. package/dist/application/usecase/event/RemoveExhibitFromEvent.mjs +23 -0
  93. package/dist/application/usecase/event/RemoveExhibitFromEvent.mjs.map +1 -0
  94. package/dist/application/usecase/event/UpdateEvent.cjs +21 -0
  95. package/dist/application/usecase/event/UpdateEvent.cjs.map +1 -0
  96. package/dist/application/usecase/event/UpdateEvent.d.cts +22 -0
  97. package/dist/application/usecase/event/UpdateEvent.d.mts +22 -0
  98. package/dist/application/usecase/event/UpdateEvent.mjs +21 -0
  99. package/dist/application/usecase/event/UpdateEvent.mjs.map +1 -0
  100. package/dist/application/usecase/event/index.cjs +14 -0
  101. package/dist/application/usecase/event/index.mjs +15 -0
  102. package/dist/application/usecase/eventParticipation/GetEventsByMember.cjs +15 -0
  103. package/dist/application/usecase/eventParticipation/GetEventsByMember.cjs.map +1 -0
  104. package/dist/application/usecase/eventParticipation/GetEventsByMember.d.cts +20 -0
  105. package/dist/application/usecase/eventParticipation/GetEventsByMember.d.mts +20 -0
  106. package/dist/application/usecase/eventParticipation/GetEventsByMember.mjs +15 -0
  107. package/dist/application/usecase/eventParticipation/GetEventsByMember.mjs.map +1 -0
  108. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.cjs +18 -0
  109. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.cjs.map +1 -0
  110. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.d.cts +20 -0
  111. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.d.mts +20 -0
  112. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.mjs +18 -0
  113. package/dist/application/usecase/eventParticipation/GetExhibitsByMember.mjs.map +1 -0
  114. package/dist/application/usecase/eventParticipation/GetMembersByEvent.cjs +19 -0
  115. package/dist/application/usecase/eventParticipation/GetMembersByEvent.cjs.map +1 -0
  116. package/dist/application/usecase/eventParticipation/GetMembersByEvent.d.cts +22 -0
  117. package/dist/application/usecase/eventParticipation/GetMembersByEvent.d.mts +22 -0
  118. package/dist/application/usecase/eventParticipation/GetMembersByEvent.mjs +19 -0
  119. package/dist/application/usecase/eventParticipation/GetMembersByEvent.mjs.map +1 -0
  120. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.cjs +19 -0
  121. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.cjs.map +1 -0
  122. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.d.cts +22 -0
  123. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.d.mts +22 -0
  124. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.mjs +19 -0
  125. package/dist/application/usecase/eventParticipation/GetMembersByExhibit.mjs.map +1 -0
  126. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.cjs +22 -0
  127. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.cjs.map +1 -0
  128. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.d.cts +24 -0
  129. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.d.mts +24 -0
  130. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.mjs +22 -0
  131. package/dist/application/usecase/eventParticipation/RegisterMemberToEvent.mjs.map +1 -0
  132. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.cjs +22 -0
  133. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.cjs.map +1 -0
  134. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.d.cts +24 -0
  135. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.d.mts +24 -0
  136. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.mjs +22 -0
  137. package/dist/application/usecase/eventParticipation/RegisterMemberToExhibit.mjs.map +1 -0
  138. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.cjs +21 -0
  139. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.cjs.map +1 -0
  140. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.d.cts +24 -0
  141. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.d.mts +24 -0
  142. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.mjs +21 -0
  143. package/dist/application/usecase/eventParticipation/RemoveMemberFromEvent.mjs.map +1 -0
  144. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.cjs +21 -0
  145. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.cjs.map +1 -0
  146. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.d.cts +24 -0
  147. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.d.mts +24 -0
  148. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.mjs +21 -0
  149. package/dist/application/usecase/eventParticipation/RemoveMemberFromExhibit.mjs.map +1 -0
  150. package/dist/application/usecase/karte/CorrectKarte.cjs +20 -0
  151. package/dist/application/usecase/karte/CorrectKarte.cjs.map +1 -0
  152. package/dist/application/usecase/karte/CorrectKarte.d.cts +20 -0
  153. package/dist/application/usecase/karte/CorrectKarte.d.mts +20 -0
  154. package/dist/application/usecase/karte/CorrectKarte.mjs +20 -0
  155. package/dist/application/usecase/karte/CorrectKarte.mjs.map +1 -0
  156. package/dist/application/usecase/karte/CreateKarte.cjs +19 -0
  157. package/dist/application/usecase/karte/CreateKarte.cjs.map +1 -0
  158. package/dist/application/usecase/karte/CreateKarte.d.cts +20 -0
  159. package/dist/application/usecase/karte/CreateKarte.d.mts +20 -0
  160. package/dist/application/usecase/karte/CreateKarte.mjs +19 -0
  161. package/dist/application/usecase/karte/CreateKarte.mjs.map +1 -0
  162. package/dist/application/usecase/karte/GetKarte.cjs +18 -0
  163. package/dist/application/usecase/karte/GetKarte.cjs.map +1 -0
  164. package/dist/application/usecase/karte/GetKarte.d.cts +20 -0
  165. package/dist/application/usecase/karte/GetKarte.d.mts +20 -0
  166. package/dist/application/usecase/karte/GetKarte.mjs +18 -0
  167. package/dist/application/usecase/karte/GetKarte.mjs.map +1 -0
  168. package/dist/application/usecase/karte/ImportKarte.cjs +19 -0
  169. package/dist/application/usecase/karte/ImportKarte.cjs.map +1 -0
  170. package/dist/application/usecase/karte/ImportKarte.d.cts +39 -0
  171. package/dist/application/usecase/karte/ImportKarte.d.mts +39 -0
  172. package/dist/application/usecase/karte/ImportKarte.mjs +19 -0
  173. package/dist/application/usecase/karte/ImportKarte.mjs.map +1 -0
  174. package/dist/application/usecase/karte/ListKartes.cjs +15 -0
  175. package/dist/application/usecase/karte/ListKartes.cjs.map +1 -0
  176. package/dist/application/usecase/karte/ListKartes.d.cts +17 -0
  177. package/dist/application/usecase/karte/ListKartes.d.mts +17 -0
  178. package/dist/application/usecase/karte/ListKartes.mjs +15 -0
  179. package/dist/application/usecase/karte/ListKartes.mjs.map +1 -0
  180. package/dist/application/usecase/karte/index.cjs +5 -0
  181. package/dist/application/usecase/karte/index.mjs +6 -0
  182. package/dist/application/usecase/member/ChangeDiscordNickName.cjs +20 -0
  183. package/dist/application/usecase/member/ChangeDiscordNickName.cjs.map +1 -0
  184. package/dist/application/usecase/member/ChangeDiscordNickName.d.cts +21 -0
  185. package/dist/application/usecase/member/ChangeDiscordNickName.d.mts +21 -0
  186. package/dist/application/usecase/member/ChangeDiscordNickName.mjs +20 -0
  187. package/dist/application/usecase/member/ChangeDiscordNickName.mjs.map +1 -0
  188. package/dist/application/usecase/member/ConnectDiscordAccount.cjs +27 -0
  189. package/dist/application/usecase/member/ConnectDiscordAccount.cjs.map +1 -0
  190. package/dist/application/usecase/member/ConnectDiscordAccount.d.cts +25 -0
  191. package/dist/application/usecase/member/ConnectDiscordAccount.d.mts +25 -0
  192. package/dist/application/usecase/member/ConnectDiscordAccount.mjs +27 -0
  193. package/dist/application/usecase/member/ConnectDiscordAccount.mjs.map +1 -0
  194. package/dist/application/usecase/member/GetMember.cjs +15 -0
  195. package/dist/application/usecase/member/GetMember.cjs.map +1 -0
  196. package/dist/application/usecase/member/GetMember.d.cts +20 -0
  197. package/dist/application/usecase/member/GetMember.d.mts +20 -0
  198. package/dist/application/usecase/member/GetMember.mjs +15 -0
  199. package/dist/application/usecase/member/GetMember.mjs.map +1 -0
  200. package/dist/application/usecase/member/GetMemberByDiscordId.cjs +18 -0
  201. package/dist/application/usecase/member/GetMemberByDiscordId.cjs.map +1 -0
  202. package/dist/application/usecase/member/GetMemberByDiscordId.d.cts +22 -0
  203. package/dist/application/usecase/member/GetMemberByDiscordId.d.mts +22 -0
  204. package/dist/application/usecase/member/GetMemberByDiscordId.mjs +18 -0
  205. package/dist/application/usecase/member/GetMemberByDiscordId.mjs.map +1 -0
  206. package/dist/application/usecase/member/GetMemberByEmail.cjs +15 -0
  207. package/dist/application/usecase/member/GetMemberByEmail.cjs.map +1 -0
  208. package/dist/application/usecase/member/GetMemberByEmail.d.cts +20 -0
  209. package/dist/application/usecase/member/GetMemberByEmail.d.mts +20 -0
  210. package/dist/application/usecase/member/GetMemberByEmail.mjs +15 -0
  211. package/dist/application/usecase/member/GetMemberByEmail.mjs.map +1 -0
  212. package/dist/application/usecase/member/GetMemberList.cjs +15 -0
  213. package/dist/application/usecase/member/GetMemberList.cjs.map +1 -0
  214. package/dist/application/usecase/member/GetMemberList.d.cts +17 -0
  215. package/dist/application/usecase/member/GetMemberList.d.mts +17 -0
  216. package/dist/application/usecase/member/GetMemberList.mjs +15 -0
  217. package/dist/application/usecase/member/GetMemberList.mjs.map +1 -0
  218. package/dist/application/usecase/member/RegisterMember.cjs +30 -0
  219. package/dist/application/usecase/member/RegisterMember.cjs.map +1 -0
  220. package/dist/application/usecase/member/RegisterMember.d.cts +28 -0
  221. package/dist/application/usecase/member/RegisterMember.d.mts +28 -0
  222. package/dist/application/usecase/member/RegisterMember.mjs +30 -0
  223. package/dist/application/usecase/member/RegisterMember.mjs.map +1 -0
  224. package/dist/application/usecase/member/UpdateMember.cjs +24 -0
  225. package/dist/application/usecase/member/UpdateMember.cjs.map +1 -0
  226. package/dist/application/usecase/member/UpdateMember.d.cts +26 -0
  227. package/dist/application/usecase/member/UpdateMember.d.mts +26 -0
  228. package/dist/application/usecase/member/UpdateMember.mjs +24 -0
  229. package/dist/application/usecase/member/UpdateMember.mjs.map +1 -0
  230. package/dist/application/usecase/member/index.cjs +8 -0
  231. package/dist/application/usecase/member/index.mjs +9 -0
  232. package/dist/domain/aggregates/discord-account/DiscordAccount.cjs +47 -0
  233. package/dist/domain/aggregates/discord-account/DiscordAccount.cjs.map +1 -0
  234. package/dist/domain/aggregates/discord-account/DiscordAccount.d.cts +43 -0
  235. package/dist/domain/aggregates/discord-account/DiscordAccount.d.mts +43 -0
  236. package/dist/domain/aggregates/discord-account/DiscordAccount.mjs +46 -0
  237. package/dist/domain/aggregates/discord-account/DiscordAccount.mjs.map +1 -0
  238. package/dist/domain/aggregates/discord-account/DiscordAccountRepository.d.cts +14 -0
  239. package/dist/domain/aggregates/discord-account/DiscordAccountRepository.d.mts +14 -0
  240. package/dist/domain/aggregates/discord-account/DiscordId.cjs +8 -0
  241. package/dist/domain/aggregates/discord-account/DiscordId.cjs.map +1 -0
  242. package/dist/domain/aggregates/discord-account/DiscordId.d.cts +9 -0
  243. package/dist/domain/aggregates/discord-account/DiscordId.d.mts +9 -0
  244. package/dist/domain/aggregates/discord-account/DiscordId.mjs +8 -0
  245. package/dist/domain/aggregates/discord-account/DiscordId.mjs.map +1 -0
  246. package/dist/domain/aggregates/event/Event.cjs +91 -0
  247. package/dist/domain/aggregates/event/Event.cjs.map +1 -0
  248. package/dist/domain/aggregates/event/Event.d.cts +59 -0
  249. package/dist/domain/aggregates/event/Event.d.mts +59 -0
  250. package/dist/domain/aggregates/event/Event.mjs +91 -0
  251. package/dist/domain/aggregates/event/Event.mjs.map +1 -0
  252. package/dist/domain/aggregates/event/EventId.cjs +8 -0
  253. package/dist/domain/aggregates/event/EventId.cjs.map +1 -0
  254. package/dist/domain/aggregates/event/EventId.d.cts +9 -0
  255. package/dist/domain/aggregates/event/EventId.d.mts +9 -0
  256. package/dist/domain/aggregates/event/EventId.mjs +8 -0
  257. package/dist/domain/aggregates/event/EventId.mjs.map +1 -0
  258. package/dist/domain/aggregates/event/EventRepository.d.cts +17 -0
  259. package/dist/domain/aggregates/event/EventRepository.d.mts +17 -0
  260. package/dist/domain/aggregates/event/Exhibit.cjs +86 -0
  261. package/dist/domain/aggregates/event/Exhibit.cjs.map +1 -0
  262. package/dist/domain/aggregates/event/Exhibit.d.cts +52 -0
  263. package/dist/domain/aggregates/event/Exhibit.d.mts +52 -0
  264. package/dist/domain/aggregates/event/Exhibit.mjs +86 -0
  265. package/dist/domain/aggregates/event/Exhibit.mjs.map +1 -0
  266. package/dist/domain/aggregates/event/ExhibitId.cjs +8 -0
  267. package/dist/domain/aggregates/event/ExhibitId.cjs.map +1 -0
  268. package/dist/domain/aggregates/event/ExhibitId.d.cts +9 -0
  269. package/dist/domain/aggregates/event/ExhibitId.d.mts +9 -0
  270. package/dist/domain/aggregates/event/ExhibitId.mjs +8 -0
  271. package/dist/domain/aggregates/event/ExhibitId.mjs.map +1 -0
  272. package/dist/domain/aggregates/event/LightningTalk.cjs +39 -0
  273. package/dist/domain/aggregates/event/LightningTalk.cjs.map +1 -0
  274. package/dist/domain/aggregates/event/LightningTalk.d.cts +27 -0
  275. package/dist/domain/aggregates/event/LightningTalk.d.mts +27 -0
  276. package/dist/domain/aggregates/event/LightningTalk.mjs +39 -0
  277. package/dist/domain/aggregates/event/LightningTalk.mjs.map +1 -0
  278. package/dist/domain/aggregates/event/LightningTalkDuration.cjs +12 -0
  279. package/dist/domain/aggregates/event/LightningTalkDuration.cjs.map +1 -0
  280. package/dist/domain/aggregates/event/LightningTalkDuration.d.cts +9 -0
  281. package/dist/domain/aggregates/event/LightningTalkDuration.d.mts +9 -0
  282. package/dist/domain/aggregates/event/LightningTalkDuration.mjs +12 -0
  283. package/dist/domain/aggregates/event/LightningTalkDuration.mjs.map +1 -0
  284. package/dist/domain/aggregates/event/Url.cjs +19 -0
  285. package/dist/domain/aggregates/event/Url.cjs.map +1 -0
  286. package/dist/domain/aggregates/event/Url.d.cts +9 -0
  287. package/dist/domain/aggregates/event/Url.d.mts +9 -0
  288. package/dist/domain/aggregates/event/Url.mjs +19 -0
  289. package/dist/domain/aggregates/event/Url.mjs.map +1 -0
  290. package/dist/domain/aggregates/index.cjs +25 -0
  291. package/dist/domain/aggregates/index.mjs +26 -0
  292. package/dist/domain/aggregates/karte/Assignee.cjs +7 -0
  293. package/dist/domain/aggregates/karte/Assignee.cjs.map +1 -0
  294. package/dist/domain/aggregates/karte/Assignee.d.cts +20 -0
  295. package/dist/domain/aggregates/karte/Assignee.d.mts +20 -0
  296. package/dist/domain/aggregates/karte/Assignee.mjs +7 -0
  297. package/dist/domain/aggregates/karte/Assignee.mjs.map +1 -0
  298. package/dist/domain/aggregates/karte/Client.cjs +20 -0
  299. package/dist/domain/aggregates/karte/Client.cjs.map +1 -0
  300. package/dist/domain/aggregates/karte/Client.d.cts +42 -0
  301. package/dist/domain/aggregates/karte/Client.d.mts +42 -0
  302. package/dist/domain/aggregates/karte/Client.mjs +19 -0
  303. package/dist/domain/aggregates/karte/Client.mjs.map +1 -0
  304. package/dist/domain/aggregates/karte/Consent.d.cts +14 -0
  305. package/dist/domain/aggregates/karte/Consent.d.mts +14 -0
  306. package/dist/domain/aggregates/karte/Consultation.d.cts +19 -0
  307. package/dist/domain/aggregates/karte/Consultation.d.mts +19 -0
  308. package/dist/domain/aggregates/karte/ConsultationCategory.cjs +89 -0
  309. package/dist/domain/aggregates/karte/ConsultationCategory.cjs.map +1 -0
  310. package/dist/domain/aggregates/karte/ConsultationCategory.d.cts +75 -0
  311. package/dist/domain/aggregates/karte/ConsultationCategory.d.mts +75 -0
  312. package/dist/domain/aggregates/karte/ConsultationCategory.mjs +89 -0
  313. package/dist/domain/aggregates/karte/ConsultationCategory.mjs.map +1 -0
  314. package/dist/domain/aggregates/karte/ConsultedAt.cjs +90 -0
  315. package/dist/domain/aggregates/karte/ConsultedAt.cjs.map +1 -0
  316. package/dist/domain/aggregates/karte/ConsultedAt.d.cts +49 -0
  317. package/dist/domain/aggregates/karte/ConsultedAt.d.mts +49 -0
  318. package/dist/domain/aggregates/karte/ConsultedAt.mjs +85 -0
  319. package/dist/domain/aggregates/karte/ConsultedAt.mjs.map +1 -0
  320. package/dist/domain/aggregates/karte/FollowUp.cjs +13 -0
  321. package/dist/domain/aggregates/karte/FollowUp.cjs.map +1 -0
  322. package/dist/domain/aggregates/karte/FollowUp.d.cts +8 -0
  323. package/dist/domain/aggregates/karte/FollowUp.d.mts +8 -0
  324. package/dist/domain/aggregates/karte/FollowUp.mjs +13 -0
  325. package/dist/domain/aggregates/karte/FollowUp.mjs.map +1 -0
  326. package/dist/domain/aggregates/karte/Karte.cjs +94 -0
  327. package/dist/domain/aggregates/karte/Karte.cjs.map +1 -0
  328. package/dist/domain/aggregates/karte/Karte.d.cts +131 -0
  329. package/dist/domain/aggregates/karte/Karte.d.mts +131 -0
  330. package/dist/domain/aggregates/karte/Karte.mjs +94 -0
  331. package/dist/domain/aggregates/karte/Karte.mjs.map +1 -0
  332. package/dist/domain/aggregates/karte/KarteId.cjs +8 -0
  333. package/dist/domain/aggregates/karte/KarteId.cjs.map +1 -0
  334. package/dist/domain/aggregates/karte/KarteId.d.cts +9 -0
  335. package/dist/domain/aggregates/karte/KarteId.d.mts +9 -0
  336. package/dist/domain/aggregates/karte/KarteId.mjs +8 -0
  337. package/dist/domain/aggregates/karte/KarteId.mjs.map +1 -0
  338. package/dist/domain/aggregates/karte/KarteRepository.d.cts +12 -0
  339. package/dist/domain/aggregates/karte/KarteRepository.d.mts +12 -0
  340. package/dist/domain/aggregates/karte/Resolution.cjs +7 -0
  341. package/dist/domain/aggregates/karte/Resolution.cjs.map +1 -0
  342. package/dist/domain/aggregates/karte/Resolution.d.cts +21 -0
  343. package/dist/domain/aggregates/karte/Resolution.d.mts +21 -0
  344. package/dist/domain/aggregates/karte/Resolution.mjs +7 -0
  345. package/dist/domain/aggregates/karte/Resolution.mjs.map +1 -0
  346. package/dist/domain/aggregates/karte/SupportRecord.d.cts +22 -0
  347. package/dist/domain/aggregates/karte/SupportRecord.d.mts +22 -0
  348. package/dist/domain/aggregates/karte/WorkDuration.cjs +11 -0
  349. package/dist/domain/aggregates/karte/WorkDuration.cjs.map +1 -0
  350. package/dist/domain/aggregates/karte/WorkDuration.d.cts +10 -0
  351. package/dist/domain/aggregates/karte/WorkDuration.d.mts +10 -0
  352. package/dist/domain/aggregates/karte/WorkDuration.mjs +11 -0
  353. package/dist/domain/aggregates/karte/WorkDuration.mjs.map +1 -0
  354. package/dist/domain/aggregates/karte/index.cjs +9 -0
  355. package/dist/domain/aggregates/karte/index.mjs +10 -0
  356. package/dist/domain/aggregates/member/Email.cjs +12 -0
  357. package/dist/domain/aggregates/member/Email.cjs.map +1 -0
  358. package/dist/domain/aggregates/member/Email.d.cts +9 -0
  359. package/dist/domain/aggregates/member/Email.d.mts +9 -0
  360. package/dist/domain/aggregates/member/Email.mjs +12 -0
  361. package/dist/domain/aggregates/member/Email.mjs.map +1 -0
  362. package/dist/domain/aggregates/member/Member.cjs +247 -0
  363. package/dist/domain/aggregates/member/Member.cjs.map +1 -0
  364. package/dist/domain/aggregates/member/Member.d.cts +91 -0
  365. package/dist/domain/aggregates/member/Member.d.mts +91 -0
  366. package/dist/domain/aggregates/member/Member.mjs +245 -0
  367. package/dist/domain/aggregates/member/Member.mjs.map +1 -0
  368. package/dist/domain/aggregates/member/MemberEvent.cjs +20 -0
  369. package/dist/domain/aggregates/member/MemberEvent.cjs.map +1 -0
  370. package/dist/domain/aggregates/member/MemberEvent.d.cts +115 -0
  371. package/dist/domain/aggregates/member/MemberEvent.d.mts +115 -0
  372. package/dist/domain/aggregates/member/MemberEvent.mjs +20 -0
  373. package/dist/domain/aggregates/member/MemberEvent.mjs.map +1 -0
  374. package/dist/domain/aggregates/member/MemberId.cjs +8 -0
  375. package/dist/domain/aggregates/member/MemberId.cjs.map +1 -0
  376. package/dist/domain/aggregates/member/MemberId.d.cts +9 -0
  377. package/dist/domain/aggregates/member/MemberId.d.mts +9 -0
  378. package/dist/domain/aggregates/member/MemberId.mjs +8 -0
  379. package/dist/domain/aggregates/member/MemberId.mjs.map +1 -0
  380. package/dist/domain/aggregates/member/MemberRepository.d.cts +14 -0
  381. package/dist/domain/aggregates/member/MemberRepository.d.mts +14 -0
  382. package/dist/domain/aggregates/member/UniversityEmail.cjs +14 -0
  383. package/dist/domain/aggregates/member/UniversityEmail.cjs.map +1 -0
  384. package/dist/domain/aggregates/member/UniversityEmail.d.cts +9 -0
  385. package/dist/domain/aggregates/member/UniversityEmail.d.mts +9 -0
  386. package/dist/domain/aggregates/member/UniversityEmail.mjs +14 -0
  387. package/dist/domain/aggregates/member/UniversityEmail.mjs.map +1 -0
  388. package/dist/domain/aggregates/member/index.cjs +5 -0
  389. package/dist/domain/aggregates/member/index.mjs +6 -0
  390. package/dist/domain/base/DomainEvent.d.cts +9 -0
  391. package/dist/domain/base/DomainEvent.d.mts +9 -0
  392. package/dist/domain/base/NonEmptyArray.d.cts +10 -0
  393. package/dist/domain/base/NonEmptyArray.d.mts +10 -0
  394. package/dist/domain/base/NonEmptyString.cjs +12 -0
  395. package/dist/domain/base/NonEmptyString.cjs.map +1 -0
  396. package/dist/domain/base/NonEmptyString.d.cts +12 -0
  397. package/dist/domain/base/NonEmptyString.d.mts +12 -0
  398. package/dist/domain/base/NonEmptyString.mjs +12 -0
  399. package/dist/domain/base/NonEmptyString.mjs.map +1 -0
  400. package/dist/domain/base/ValueObject.cjs +21 -0
  401. package/dist/domain/base/ValueObject.cjs.map +1 -0
  402. package/dist/domain/base/ValueObject.d.cts +12 -0
  403. package/dist/domain/base/ValueObject.d.mts +12 -0
  404. package/dist/domain/base/ValueObject.mjs +21 -0
  405. package/dist/domain/base/ValueObject.mjs.map +1 -0
  406. package/dist/domain/exceptions/DomainExceptions.cjs +196 -0
  407. package/dist/domain/exceptions/DomainExceptions.cjs.map +1 -0
  408. package/dist/domain/exceptions/DomainExceptions.d.cts +192 -0
  409. package/dist/domain/exceptions/DomainExceptions.d.mts +192 -0
  410. package/dist/domain/exceptions/DomainExceptions.mjs +181 -0
  411. package/dist/domain/exceptions/DomainExceptions.mjs.map +1 -0
  412. package/dist/domain/index.cjs +32 -0
  413. package/dist/domain/index.mjs +33 -0
  414. package/dist/domain/shared/Recorded.cjs +17 -0
  415. package/dist/domain/shared/Recorded.cjs.map +1 -0
  416. package/dist/domain/shared/Recorded.d.cts +20 -0
  417. package/dist/domain/shared/Recorded.d.mts +20 -0
  418. package/dist/domain/shared/Recorded.mjs +16 -0
  419. package/dist/domain/shared/Recorded.mjs.map +1 -0
  420. package/dist/domain/shared/StudentId.cjs +35 -0
  421. package/dist/domain/shared/StudentId.cjs.map +1 -0
  422. package/dist/domain/shared/StudentId.d.cts +25 -0
  423. package/dist/domain/shared/StudentId.d.mts +25 -0
  424. package/dist/domain/shared/StudentId.mjs +35 -0
  425. package/dist/domain/shared/StudentId.mjs.map +1 -0
  426. package/dist/domain/shared/affiliation/Affiliation.cjs +12 -0
  427. package/dist/domain/shared/affiliation/Affiliation.cjs.map +1 -0
  428. package/dist/domain/shared/affiliation/Affiliation.d.cts +59 -0
  429. package/dist/domain/shared/affiliation/Affiliation.d.mts +59 -0
  430. package/dist/domain/shared/affiliation/Affiliation.mjs +12 -0
  431. package/dist/domain/shared/affiliation/Affiliation.mjs.map +1 -0
  432. package/dist/domain/shared/affiliation/index.cjs +2 -0
  433. package/dist/domain/shared/affiliation/index.mjs +3 -0
  434. package/dist/domain/shared/affiliation/universityStructure.cjs +444 -0
  435. package/dist/domain/shared/affiliation/universityStructure.cjs.map +1 -0
  436. package/dist/domain/shared/affiliation/universityStructure.d.cts +262 -0
  437. package/dist/domain/shared/affiliation/universityStructure.d.mts +262 -0
  438. package/dist/domain/shared/affiliation/universityStructure.mjs +439 -0
  439. package/dist/domain/shared/affiliation/universityStructure.mjs.map +1 -0
  440. package/dist/domain/shared/index.cjs +5 -0
  441. package/dist/domain/shared/index.mjs +6 -0
  442. package/dist/executable/event.cjs +63 -0
  443. package/dist/executable/event.cjs.map +1 -0
  444. package/dist/executable/event.d.cts +56 -0
  445. package/dist/executable/event.d.mts +56 -0
  446. package/dist/executable/event.mjs +63 -0
  447. package/dist/executable/event.mjs.map +1 -0
  448. package/dist/executable/eventService.cjs +146 -0
  449. package/dist/executable/eventService.cjs.map +1 -0
  450. package/dist/executable/eventService.d.cts +143 -0
  451. package/dist/executable/eventService.d.mts +143 -0
  452. package/dist/executable/eventService.mjs +146 -0
  453. package/dist/executable/eventService.mjs.map +1 -0
  454. package/dist/executable/index.cjs +6 -0
  455. package/dist/executable/index.mjs +7 -0
  456. package/dist/executable/karte.cjs +24 -0
  457. package/dist/executable/karte.cjs.map +1 -0
  458. package/dist/executable/karte.d.cts +19 -0
  459. package/dist/executable/karte.d.mts +19 -0
  460. package/dist/executable/karte.mjs +24 -0
  461. package/dist/executable/karte.mjs.map +1 -0
  462. package/dist/executable/karteService.cjs +79 -0
  463. package/dist/executable/karteService.cjs.map +1 -0
  464. package/dist/executable/karteService.d.cts +87 -0
  465. package/dist/executable/karteService.d.mts +87 -0
  466. package/dist/executable/karteService.mjs +79 -0
  467. package/dist/executable/karteService.mjs.map +1 -0
  468. package/dist/executable/member.cjs +32 -0
  469. package/dist/executable/member.cjs.map +1 -0
  470. package/dist/executable/member.d.cts +25 -0
  471. package/dist/executable/member.d.mts +25 -0
  472. package/dist/executable/member.mjs +32 -0
  473. package/dist/executable/member.mjs.map +1 -0
  474. package/dist/executable/memberService.cjs +63 -0
  475. package/dist/executable/memberService.cjs.map +1 -0
  476. package/dist/executable/memberService.d.cts +59 -0
  477. package/dist/executable/memberService.d.mts +59 -0
  478. package/dist/executable/memberService.mjs +63 -0
  479. package/dist/executable/memberService.mjs.map +1 -0
  480. package/dist/index.cjs +105 -1914
  481. package/dist/index.d.cts +46 -754
  482. package/dist/index.d.mts +46 -0
  483. package/dist/index.mjs +39 -0
  484. package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.cjs +57 -0
  485. package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.cjs.map +1 -0
  486. package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.mjs +57 -0
  487. package/dist/infrastructure/drizzle/DrizzleDiscordAccountRepository.mjs.map +1 -0
  488. package/dist/infrastructure/drizzle/DrizzleEventRepository.cjs +196 -0
  489. package/dist/infrastructure/drizzle/DrizzleEventRepository.cjs.map +1 -0
  490. package/dist/infrastructure/drizzle/DrizzleEventRepository.mjs +196 -0
  491. package/dist/infrastructure/drizzle/DrizzleEventRepository.mjs.map +1 -0
  492. package/dist/infrastructure/drizzle/DrizzleKarteRepository.cjs +241 -0
  493. package/dist/infrastructure/drizzle/DrizzleKarteRepository.cjs.map +1 -0
  494. package/dist/infrastructure/drizzle/DrizzleKarteRepository.mjs +241 -0
  495. package/dist/infrastructure/drizzle/DrizzleKarteRepository.mjs.map +1 -0
  496. package/dist/infrastructure/drizzle/DrizzleMemberRepository.cjs +112 -0
  497. package/dist/infrastructure/drizzle/DrizzleMemberRepository.cjs.map +1 -0
  498. package/dist/infrastructure/drizzle/DrizzleMemberRepository.mjs +112 -0
  499. package/dist/infrastructure/drizzle/DrizzleMemberRepository.mjs.map +1 -0
  500. package/dist/infrastructure/drizzle/client.cjs +20 -0
  501. package/dist/infrastructure/drizzle/client.cjs.map +1 -0
  502. package/dist/infrastructure/drizzle/client.mjs +20 -0
  503. package/dist/infrastructure/drizzle/client.mjs.map +1 -0
  504. package/dist/infrastructure/drizzle/index.cjs +4 -0
  505. package/dist/infrastructure/drizzle/index.mjs +5 -0
  506. package/dist/infrastructure/drizzle/schema.cjs +353 -0
  507. package/dist/infrastructure/drizzle/schema.cjs.map +1 -0
  508. package/dist/infrastructure/drizzle/schema.mjs +337 -0
  509. package/dist/infrastructure/drizzle/schema.mjs.map +1 -0
  510. package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.cjs +14 -0
  511. package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.cjs.map +1 -0
  512. package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.mjs +14 -0
  513. package/dist/infrastructure/drizzle/serializeDiscordAccountEvent.mjs.map +1 -0
  514. package/dist/infrastructure/drizzle/serializeMemberEvent.cjs +61 -0
  515. package/dist/infrastructure/drizzle/serializeMemberEvent.cjs.map +1 -0
  516. package/dist/infrastructure/drizzle/serializeMemberEvent.mjs +61 -0
  517. package/dist/infrastructure/drizzle/serializeMemberEvent.mjs.map +1 -0
  518. package/dist/infrastructure/index.cjs +5 -0
  519. package/dist/infrastructure/index.mjs +6 -0
  520. package/package.json +67 -60
  521. package/dist/index.cjs.map +0 -1
  522. package/dist/index.d.ts +0 -754
  523. package/dist/index.js +0 -1875
  524. package/dist/index.js.map +0 -1
@@ -0,0 +1,241 @@
1
+ import { notRecorded, recorded } from "../../domain/shared/Recorded.mjs";
2
+ import { StudentId } from "../../domain/shared/StudentId.mjs";
3
+ import { Karte } from "../../domain/aggregates/karte/Karte.mjs";
4
+ import { karteId } from "../../domain/aggregates/karte/KarteId.mjs";
5
+ import { CONSULTATION_CATEGORIES } from "../../domain/aggregates/karte/ConsultationCategory.mjs";
6
+ import { workDuration } from "../../domain/aggregates/karte/WorkDuration.mjs";
7
+ import { memberId } from "../../domain/aggregates/member/MemberId.mjs";
8
+ import "../../domain/index.mjs";
9
+ import { karteAssignees, kartes } from "./schema.mjs";
10
+ import { getDb } from "./client.mjs";
11
+ import { eq } from "drizzle-orm";
12
+ //#region src/infrastructure/drizzle/DrizzleKarteRepository.ts
13
+ function toRecordedClient(row) {
14
+ if (row.clientType === null) return notRecorded();
15
+ if (row.clientName === null) throw new Error(`データ不整合: clientType=${row.clientType} だが clientName が null`);
16
+ const name = row.clientName;
17
+ switch (row.clientType) {
18
+ case "student":
19
+ if (row.clientStudentId === null || row.clientAffiliation === null) throw new Error("データ不整合: student だが studentId または affiliation が null");
20
+ return recorded({
21
+ type: "student",
22
+ name,
23
+ studentId: StudentId.fromString(row.clientStudentId),
24
+ affiliation: row.clientAffiliation
25
+ });
26
+ case "teacher": return recorded({
27
+ type: "teacher",
28
+ name
29
+ });
30
+ case "staff": return recorded({
31
+ type: "staff",
32
+ name
33
+ });
34
+ case "other": return recorded({
35
+ type: "other",
36
+ name
37
+ });
38
+ }
39
+ }
40
+ /**
41
+ * 配列をNonEmptyArrayに変換する。
42
+ * 要素が1つ以上あることを実行時に検証し、型を正しく導出する。
43
+ */
44
+ function toNonEmptyArray(arr) {
45
+ const [first, ...rest] = arr;
46
+ if (first === void 0) throw new Error("Expected non-empty array");
47
+ return [first, ...rest];
48
+ }
49
+ function toConsultation(row) {
50
+ return {
51
+ categories: row.categoryIds.length > 0 ? recorded(toNonEmptyArray(row.categoryIds.map((id) => {
52
+ const categoryId = id;
53
+ return {
54
+ id: categoryId,
55
+ displayName: CONSULTATION_CATEGORIES.find((c) => c.id === categoryId)?.displayName ?? id
56
+ };
57
+ }))) : notRecorded(),
58
+ targetDevice: row.targetDevice !== null ? recorded(row.targetDevice) : notRecorded(),
59
+ troubleDetails: row.troubleDetails !== null ? recorded(row.troubleDetails) : notRecorded()
60
+ };
61
+ }
62
+ function toResolution(row) {
63
+ if (row.resolutionType === null) return notRecorded();
64
+ switch (row.resolutionType) {
65
+ case "resolved": return recorded({ type: "resolved" });
66
+ case "unresolved": return recorded({
67
+ type: "unresolved",
68
+ followUp: row.followUp !== null ? recorded(row.followUp) : notRecorded()
69
+ });
70
+ }
71
+ }
72
+ function toAssignee(row) {
73
+ if (row.assigneeType === "resolved") {
74
+ if (row.memberId === null) throw new Error("データ不整合: assigneeType=resolved だが memberId が null");
75
+ return {
76
+ type: "resolved",
77
+ memberId: memberId(row.memberId)
78
+ };
79
+ }
80
+ if (row.assigneeName === null) throw new Error("データ不整合: assigneeType=unresolved だが assigneeName が null");
81
+ return {
82
+ type: "unresolved",
83
+ name: row.assigneeName
84
+ };
85
+ }
86
+ function toSupportRecord(row) {
87
+ return {
88
+ assignees: row.karteAssignees.length > 0 ? recorded(toNonEmptyArray(row.karteAssignees.map(toAssignee))) : notRecorded(),
89
+ content: row.supportContent !== null ? recorded(row.supportContent) : notRecorded(),
90
+ resolution: toResolution(row),
91
+ workDuration: row.workDurationMinutes !== null ? recorded(workDuration(row.workDurationMinutes)) : notRecorded()
92
+ };
93
+ }
94
+ function toDomain(row) {
95
+ return Karte.reconstruct({
96
+ id: karteId(row.id),
97
+ recordedAt: row.recordedAt,
98
+ consultedAt: deserializeConsultedAt(row.consultedAt, row.consultedAtPrecision),
99
+ lastUpdatedAt: row.lastUpdatedAt,
100
+ client: toRecordedClient(row),
101
+ consent: {
102
+ liabilityConsent: row.liabilityConsent,
103
+ disclosureConsent: row.disclosureConsent
104
+ },
105
+ consultation: toConsultation(row),
106
+ supportRecord: toSupportRecord(row)
107
+ });
108
+ }
109
+ function clientToColumns(client) {
110
+ if (client.type === "notRecorded") return {
111
+ clientType: null,
112
+ clientName: null,
113
+ clientStudentId: null,
114
+ clientAffiliation: null
115
+ };
116
+ const c = client.value;
117
+ return {
118
+ clientType: c.type,
119
+ clientName: c.name,
120
+ clientStudentId: c.type === "student" ? c.studentId.getValue() : null,
121
+ clientAffiliation: c.type === "student" ? c.affiliation : null
122
+ };
123
+ }
124
+ function resolutionToColumns(resolution) {
125
+ if (resolution.type === "notRecorded") return {
126
+ resolutionType: null,
127
+ followUp: null
128
+ };
129
+ const r = resolution.value;
130
+ if (r.type === "resolved") return {
131
+ resolutionType: "resolved",
132
+ followUp: null
133
+ };
134
+ return {
135
+ resolutionType: "unresolved",
136
+ followUp: r.followUp.type === "recorded" ? r.followUp.value : null
137
+ };
138
+ }
139
+ function recordedToNullable(r) {
140
+ return r.type === "recorded" ? r.value : null;
141
+ }
142
+ /** DB → ConsultedAt の復元(精度情報を使って正確に復元する) */
143
+ function deserializeConsultedAt(date, precision) {
144
+ if (date === null || precision === null) return notRecorded();
145
+ switch (precision) {
146
+ case "year": return recorded({
147
+ precision: "year",
148
+ year: date.getFullYear()
149
+ });
150
+ case "yearMonth": return recorded({
151
+ precision: "yearMonth",
152
+ year: date.getFullYear(),
153
+ month: date.getMonth() + 1
154
+ });
155
+ case "date": return recorded({
156
+ precision: "date",
157
+ value: new Date(date)
158
+ });
159
+ case "datetime": return recorded({
160
+ precision: "datetime",
161
+ value: new Date(date)
162
+ });
163
+ }
164
+ }
165
+ /** ConsultedAt → DBのtimestampカラム用Date | null */
166
+ function consultedAtToDate(r) {
167
+ if (r.type === "notRecorded") return null;
168
+ const ca = r.value;
169
+ switch (ca.precision) {
170
+ case "datetime":
171
+ case "date": return ca.value;
172
+ case "yearMonth": return new Date(ca.year, ca.month - 1, 1);
173
+ case "year": return new Date(ca.year, 0, 1);
174
+ }
175
+ }
176
+ /** ConsultedAt → 精度enum値 | null */
177
+ function consultedAtToPrecision(r) {
178
+ return r.type === "recorded" ? r.value.precision : null;
179
+ }
180
+ var DrizzleKarteRepository = class {
181
+ async findById(id) {
182
+ const row = await getDb().query.kartes.findFirst({
183
+ where: eq(kartes.id, id),
184
+ with: { karteAssignees: true }
185
+ });
186
+ if (!row) return null;
187
+ return toDomain(row);
188
+ }
189
+ async findAll() {
190
+ return (await getDb().query.kartes.findMany({
191
+ with: { karteAssignees: true },
192
+ orderBy: (kartes, { desc }) => [desc(kartes.recordedAt)]
193
+ })).map(toDomain);
194
+ }
195
+ async save(karte) {
196
+ const db = getDb();
197
+ const clientCols = clientToColumns(karte.client);
198
+ const resCols = resolutionToColumns(karte.supportRecord.resolution);
199
+ const values = {
200
+ id: karte.id,
201
+ recordedAt: karte.recordedAt,
202
+ consultedAt: consultedAtToDate(karte.consultedAt),
203
+ consultedAtPrecision: consultedAtToPrecision(karte.consultedAt),
204
+ lastUpdatedAt: karte.lastUpdatedAt,
205
+ clientType: clientCols.clientType,
206
+ clientName: clientCols.clientName,
207
+ clientStudentId: clientCols.clientStudentId,
208
+ clientAffiliation: clientCols.clientAffiliation,
209
+ liabilityConsent: karte.consent.liabilityConsent,
210
+ disclosureConsent: karte.consent.disclosureConsent,
211
+ categoryIds: karte.consultation.categories.type === "recorded" ? karte.consultation.categories.value.map((c) => c.id) : [],
212
+ troubleDetails: recordedToNullable(karte.consultation.troubleDetails),
213
+ targetDevice: recordedToNullable(karte.consultation.targetDevice),
214
+ supportContent: recordedToNullable(karte.supportRecord.content),
215
+ resolutionType: resCols.resolutionType,
216
+ followUp: resCols.followUp,
217
+ workDurationMinutes: recordedToNullable(karte.supportRecord.workDuration)
218
+ };
219
+ const { id: _, ...updateValues } = values;
220
+ await db.transaction(async (tx) => {
221
+ await tx.insert(kartes).values(values).onConflictDoUpdate({
222
+ target: kartes.id,
223
+ set: updateValues
224
+ });
225
+ await tx.delete(karteAssignees).where(eq(karteAssignees.karteId, karte.id));
226
+ if (karte.supportRecord.assignees.type === "recorded") {
227
+ const assigneeRows = karte.supportRecord.assignees.value.map((assignee) => ({
228
+ karteId: karte.id,
229
+ assigneeType: assignee.type,
230
+ memberId: assignee.type === "resolved" ? assignee.memberId : null,
231
+ assigneeName: assignee.type === "unresolved" ? assignee.name : null
232
+ }));
233
+ await tx.insert(karteAssignees).values(assigneeRows);
234
+ }
235
+ });
236
+ }
237
+ };
238
+ //#endregion
239
+ export { DrizzleKarteRepository };
240
+
241
+ //# sourceMappingURL=DrizzleKarteRepository.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrizzleKarteRepository.mjs","names":[],"sources":["../../../src/infrastructure/drizzle/DrizzleKarteRepository.ts"],"sourcesContent":["import { eq } from \"drizzle-orm\";\nimport {\n\tCONSULTATION_CATEGORIES,\n\tKarte,\n\tStudentId,\n\tkarteId,\n\tmemberId,\n\tnotRecorded,\n\trecorded,\n\tworkDuration,\n\ttype Assignee,\n\ttype Client,\n\ttype Consultation,\n\ttype ConsultationCategoryId,\n\ttype ConsultedAt,\n\ttype FollowUp,\n\ttype KarteId,\n\ttype KarteRepository,\n\ttype NonEmptyArray,\n\ttype Recorded,\n\ttype Resolution,\n\ttype SupportRecord,\n} from \"#domain\";\nimport { getDb } from \"./client\";\nimport { karteAssignees, kartes } from \"./schema\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ntype KarteRow = typeof kartes.$inferSelect;\n\ntype KarteWithRelations = KarteRow & {\n\tkarteAssignees: (typeof karteAssignees.$inferSelect)[];\n};\n\n// ============================================================================\n// Domain ↔ DB Mapping\n// ============================================================================\n\nfunction toRecordedClient(row: KarteRow): Recorded<Client> {\n\tif (row.clientType === null) return notRecorded();\n\n\tif (row.clientName === null) {\n\t\tthrow new Error(`データ不整合: clientType=${row.clientType} だが clientName が null`);\n\t}\n\tconst name = row.clientName;\n\n\tswitch (row.clientType) {\n\t\tcase \"student\": {\n\t\t\tif (row.clientStudentId === null || row.clientAffiliation === null) {\n\t\t\t\tthrow new Error(\"データ不整合: student だが studentId または affiliation が null\");\n\t\t\t}\n\t\t\treturn recorded({\n\t\t\t\ttype: \"student\",\n\t\t\t\tname,\n\t\t\t\tstudentId: StudentId.fromString(row.clientStudentId),\n\t\t\t\taffiliation: row.clientAffiliation,\n\t\t\t} as Client);\n\t\t}\n\t\tcase \"teacher\":\n\t\t\treturn recorded({ type: \"teacher\", name });\n\t\tcase \"staff\":\n\t\t\treturn recorded({ type: \"staff\", name });\n\t\tcase \"other\":\n\t\t\treturn recorded({ type: \"other\", name });\n\t}\n}\n\n/**\n * 配列をNonEmptyArrayに変換する。\n * 要素が1つ以上あることを実行時に検証し、型を正しく導出する。\n */\nfunction toNonEmptyArray<T>(arr: T[]): NonEmptyArray<T> {\n\tconst [first, ...rest] = arr;\n\tif (first === undefined) {\n\t\tthrow new Error(\"Expected non-empty array\");\n\t}\n\treturn [first, ...rest];\n}\n\nfunction toConsultation(row: KarteRow): Consultation {\n\treturn {\n\t\tcategories:\n\t\t\trow.categoryIds.length > 0\n\t\t\t\t? recorded(\n\t\t\t\t\t\ttoNonEmptyArray(\n\t\t\t\t\t\t\trow.categoryIds.map((id) => {\n\t\t\t\t\t\t\t\tconst categoryId = id as ConsultationCategoryId;\n\t\t\t\t\t\t\t\tconst master = CONSULTATION_CATEGORIES.find((c) => c.id === categoryId);\n\t\t\t\t\t\t\t\treturn { id: categoryId, displayName: master?.displayName ?? id };\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t),\n\t\t\t\t\t)\n\t\t\t\t: notRecorded(),\n\t\ttargetDevice: row.targetDevice !== null ? recorded(row.targetDevice) : notRecorded(),\n\t\ttroubleDetails: row.troubleDetails !== null ? recorded(row.troubleDetails) : notRecorded(),\n\t};\n}\n\nfunction toResolution(row: KarteRow): Recorded<Resolution> {\n\tif (row.resolutionType === null) return notRecorded();\n\n\tswitch (row.resolutionType) {\n\t\tcase \"resolved\":\n\t\t\treturn recorded({ type: \"resolved\" });\n\t\tcase \"unresolved\":\n\t\t\treturn recorded({\n\t\t\t\ttype: \"unresolved\",\n\t\t\t\tfollowUp: row.followUp !== null ? recorded(row.followUp as FollowUp) : notRecorded(),\n\t\t\t});\n\t}\n}\n\nfunction toAssignee(row: typeof karteAssignees.$inferSelect): Assignee {\n\tif (row.assigneeType === \"resolved\") {\n\t\tif (row.memberId === null) {\n\t\t\tthrow new Error(\"データ不整合: assigneeType=resolved だが memberId が null\");\n\t\t}\n\t\treturn { type: \"resolved\", memberId: memberId(row.memberId) };\n\t}\n\tif (row.assigneeName === null) {\n\t\tthrow new Error(\"データ不整合: assigneeType=unresolved だが assigneeName が null\");\n\t}\n\treturn { type: \"unresolved\", name: row.assigneeName };\n}\n\nfunction toSupportRecord(row: KarteWithRelations): SupportRecord {\n\treturn {\n\t\tassignees:\n\t\t\trow.karteAssignees.length > 0\n\t\t\t\t? recorded(toNonEmptyArray(row.karteAssignees.map(toAssignee)))\n\t\t\t\t: notRecorded(),\n\t\tcontent: row.supportContent !== null ? recorded(row.supportContent) : notRecorded(),\n\t\tresolution: toResolution(row),\n\t\tworkDuration:\n\t\t\trow.workDurationMinutes !== null\n\t\t\t\t? recorded(workDuration(row.workDurationMinutes))\n\t\t\t\t: notRecorded(),\n\t};\n}\n\nfunction toDomain(row: KarteWithRelations): Karte {\n\treturn Karte.reconstruct({\n\t\tid: karteId(row.id),\n\t\trecordedAt: row.recordedAt,\n\t\tconsultedAt: deserializeConsultedAt(row.consultedAt, row.consultedAtPrecision),\n\t\tlastUpdatedAt: row.lastUpdatedAt,\n\t\tclient: toRecordedClient(row),\n\t\tconsent: {\n\t\t\tliabilityConsent: row.liabilityConsent,\n\t\t\tdisclosureConsent: row.disclosureConsent,\n\t\t},\n\t\tconsultation: toConsultation(row),\n\t\tsupportRecord: toSupportRecord(row),\n\t});\n}\n\n// ============================================================================\n// Persistence Helpers\n// ============================================================================\n\ntype KarteInsert = typeof kartes.$inferInsert;\n\nfunction clientToColumns(\n\tclient: Recorded<Client>,\n): Pick<KarteInsert, \"clientType\" | \"clientName\" | \"clientStudentId\" | \"clientAffiliation\"> {\n\tif (client.type === \"notRecorded\") {\n\t\treturn {\n\t\t\tclientType: null,\n\t\t\tclientName: null,\n\t\t\tclientStudentId: null,\n\t\t\tclientAffiliation: null,\n\t\t};\n\t}\n\tconst c = client.value;\n\treturn {\n\t\tclientType: c.type,\n\t\tclientName: c.name,\n\t\tclientStudentId: c.type === \"student\" ? c.studentId.getValue() : null,\n\t\tclientAffiliation: c.type === \"student\" ? c.affiliation : null,\n\t};\n}\n\nfunction resolutionToColumns(\n\tresolution: Recorded<Resolution>,\n): Pick<KarteInsert, \"resolutionType\" | \"followUp\"> {\n\tif (resolution.type === \"notRecorded\") {\n\t\treturn { resolutionType: null, followUp: null };\n\t}\n\tconst r = resolution.value;\n\tif (r.type === \"resolved\") {\n\t\treturn { resolutionType: \"resolved\", followUp: null };\n\t}\n\treturn {\n\t\tresolutionType: \"unresolved\",\n\t\tfollowUp: r.followUp.type === \"recorded\" ? r.followUp.value : null,\n\t};\n}\n\nfunction recordedToNullable<T>(r: Recorded<T>): T | null {\n\treturn r.type === \"recorded\" ? r.value : null;\n}\n\n/** DB → ConsultedAt の復元(精度情報を使って正確に復元する) */\nfunction deserializeConsultedAt(\n\tdate: Date | null,\n\tprecision: ConsultedAt[\"precision\"] | null,\n): Recorded<ConsultedAt> {\n\tif (date === null || precision === null) return notRecorded();\n\tswitch (precision) {\n\t\tcase \"year\":\n\t\t\treturn recorded({ precision: \"year\", year: date.getFullYear() });\n\t\tcase \"yearMonth\":\n\t\t\treturn recorded({\n\t\t\t\tprecision: \"yearMonth\",\n\t\t\t\tyear: date.getFullYear(),\n\t\t\t\tmonth: date.getMonth() + 1,\n\t\t\t});\n\t\tcase \"date\":\n\t\t\treturn recorded({ precision: \"date\", value: new Date(date) });\n\t\tcase \"datetime\":\n\t\t\treturn recorded({ precision: \"datetime\", value: new Date(date) });\n\t}\n}\n\n/** ConsultedAt → DBのtimestampカラム用Date | null */\nfunction consultedAtToDate(r: Recorded<ConsultedAt>): Date | null {\n\tif (r.type === \"notRecorded\") return null;\n\tconst ca = r.value;\n\tswitch (ca.precision) {\n\t\tcase \"datetime\":\n\t\tcase \"date\":\n\t\t\treturn ca.value;\n\t\tcase \"yearMonth\":\n\t\t\treturn new Date(ca.year, ca.month - 1, 1);\n\t\tcase \"year\":\n\t\t\treturn new Date(ca.year, 0, 1);\n\t}\n}\n\n/** ConsultedAt → 精度enum値 | null */\nfunction consultedAtToPrecision(r: Recorded<ConsultedAt>): ConsultedAt[\"precision\"] | null {\n\treturn r.type === \"recorded\" ? r.value.precision : null;\n}\n\n// ============================================================================\n// Repository Implementation\n// ============================================================================\n\nexport class DrizzleKarteRepository implements KarteRepository {\n\tasync findById(id: KarteId): Promise<Karte | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.kartes.findFirst({\n\t\t\twhere: eq(kartes.id, id as string),\n\t\t\twith: {\n\t\t\t\tkarteAssignees: true,\n\t\t\t},\n\t\t});\n\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findAll(): Promise<Karte[]> {\n\t\tconst db = getDb();\n\t\tconst rows = await db.query.kartes.findMany({\n\t\t\twith: {\n\t\t\t\tkarteAssignees: true,\n\t\t\t},\n\t\t\torderBy: (kartes, { desc }) => [desc(kartes.recordedAt)],\n\t\t});\n\t\treturn rows.map(toDomain);\n\t}\n\n\tasync save(karte: Karte): Promise<void> {\n\t\tconst db = getDb();\n\n\t\tconst clientCols = clientToColumns(karte.client);\n\t\tconst resCols = resolutionToColumns(karte.supportRecord.resolution);\n\n\t\tconst values = {\n\t\t\tid: karte.id as string,\n\t\t\trecordedAt: karte.recordedAt,\n\t\t\tconsultedAt: consultedAtToDate(karte.consultedAt),\n\t\t\tconsultedAtPrecision: consultedAtToPrecision(karte.consultedAt),\n\t\t\tlastUpdatedAt: karte.lastUpdatedAt,\n\t\t\tclientType: clientCols.clientType,\n\t\t\tclientName: clientCols.clientName,\n\t\t\tclientStudentId: clientCols.clientStudentId,\n\t\t\tclientAffiliation: clientCols.clientAffiliation,\n\t\t\tliabilityConsent: karte.consent.liabilityConsent,\n\t\t\tdisclosureConsent: karte.consent.disclosureConsent,\n\t\t\tcategoryIds:\n\t\t\t\tkarte.consultation.categories.type === \"recorded\"\n\t\t\t\t\t? karte.consultation.categories.value.map((c) => c.id)\n\t\t\t\t\t: [],\n\t\t\ttroubleDetails: recordedToNullable(karte.consultation.troubleDetails),\n\t\t\ttargetDevice: recordedToNullable(karte.consultation.targetDevice),\n\t\t\tsupportContent: recordedToNullable(karte.supportRecord.content),\n\t\t\tresolutionType: resCols.resolutionType,\n\t\t\tfollowUp: resCols.followUp,\n\t\t\tworkDurationMinutes: recordedToNullable(karte.supportRecord.workDuration),\n\t\t};\n\n\t\tconst { id: _, ...updateValues } = values;\n\n\t\tawait db.transaction(async (tx) => {\n\t\t\t// Upsert karte\n\t\t\tawait tx.insert(kartes).values(values).onConflictDoUpdate({\n\t\t\t\ttarget: kartes.id,\n\t\t\t\tset: updateValues,\n\t\t\t});\n\n\t\t\t// Sync assignees (delete-all-then-insert)\n\t\t\tawait tx.delete(karteAssignees).where(eq(karteAssignees.karteId, karte.id as string));\n\n\t\t\tif (karte.supportRecord.assignees.type === \"recorded\") {\n\t\t\t\tconst assigneeRows = karte.supportRecord.assignees.value.map((assignee) => ({\n\t\t\t\t\tkarteId: karte.id as string,\n\t\t\t\t\tassigneeType: assignee.type as Assignee[\"type\"],\n\t\t\t\t\tmemberId: assignee.type === \"resolved\" ? (assignee.memberId as string) : null,\n\t\t\t\t\tassigneeName: assignee.type === \"unresolved\" ? assignee.name : null,\n\t\t\t\t}));\n\t\t\t\tawait tx.insert(karteAssignees).values(assigneeRows);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ const require_Recorded = require("../../domain/shared/Recorded.cjs");
2
+ const require_StudentId = require("../../domain/shared/StudentId.cjs");
3
+ const require_Member = require("../../domain/aggregates/member/Member.cjs");
4
+ const require_MemberId = require("../../domain/aggregates/member/MemberId.cjs");
5
+ const require_Email = require("../../domain/aggregates/member/Email.cjs");
6
+ const require_UniversityEmail = require("../../domain/aggregates/member/UniversityEmail.cjs");
7
+ require("../../domain/index.cjs");
8
+ const require_schema = require("./schema.cjs");
9
+ const require_client = require("./client.cjs");
10
+ const require_serializeMemberEvent = require("./serializeMemberEvent.cjs");
11
+ let uuid = require("uuid");
12
+ let drizzle_orm = require("drizzle-orm");
13
+ //#region src/infrastructure/drizzle/DrizzleMemberRepository.ts
14
+ function toDomain(row) {
15
+ const id = require_MemberId.memberId(row.id);
16
+ const email = new require_UniversityEmail.UniversityEmail(row.email);
17
+ const name = row.name;
18
+ const personalEmail = row.personalEmail !== null ? require_Recorded.recorded(new require_Email.Email(row.personalEmail)) : require_Recorded.notRecorded();
19
+ switch (row.status) {
20
+ case "active":
21
+ if (row.affiliation === null || row.studentId === null) throw new Error(`データ不整合: status=active だが affiliation または studentId が null (id=${row.id})`);
22
+ return require_Member.ActiveMember.reconstruct({
23
+ id,
24
+ email,
25
+ name,
26
+ personalEmail,
27
+ studentId: require_StudentId.StudentId.fromString(row.studentId),
28
+ affiliation: row.affiliation
29
+ });
30
+ case "unconfirmed": return require_Member.UnconfirmedMember.reconstruct({
31
+ id,
32
+ email,
33
+ name,
34
+ personalEmail
35
+ });
36
+ case "former": return require_Member.FormerMember.reconstruct({
37
+ id,
38
+ email,
39
+ name,
40
+ personalEmail
41
+ });
42
+ }
43
+ }
44
+ function toInsertValues(member) {
45
+ const base = {
46
+ id: member.id,
47
+ name: member.name,
48
+ email: member.email.getValue(),
49
+ personalEmail: member.personalEmail.type === "recorded" ? member.personalEmail.value.getValue() : null,
50
+ status: member.status,
51
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
52
+ };
53
+ switch (member.status) {
54
+ case "active": return {
55
+ ...base,
56
+ studentId: member.studentId.getValue(),
57
+ affiliation: member.affiliation
58
+ };
59
+ case "unconfirmed":
60
+ case "former": return {
61
+ ...base,
62
+ studentId: null,
63
+ affiliation: null
64
+ };
65
+ }
66
+ }
67
+ var DrizzleMemberRepository = class {
68
+ async findById(id) {
69
+ const row = await require_client.getDb().query.members.findFirst({ where: (0, drizzle_orm.eq)(require_schema.members.id, id) });
70
+ if (!row) return null;
71
+ return toDomain(row);
72
+ }
73
+ async findByEmail(email) {
74
+ const row = await require_client.getDb().query.members.findFirst({ where: (0, drizzle_orm.eq)(require_schema.members.email, email.getValue()) });
75
+ if (!row) return null;
76
+ return toDomain(row);
77
+ }
78
+ async findAll() {
79
+ return (await require_client.getDb().query.members.findMany()).map(toDomain);
80
+ }
81
+ async save(member) {
82
+ const db = require_client.getDb();
83
+ const values = toInsertValues(member);
84
+ const events = member.getDomainEvents();
85
+ await db.transaction(async (tx) => {
86
+ await tx.insert(require_schema.members).values(values).onConflictDoUpdate({
87
+ target: require_schema.members.id,
88
+ set: {
89
+ name: values.name,
90
+ email: values.email,
91
+ personalEmail: values.personalEmail,
92
+ status: values.status,
93
+ studentId: values.studentId,
94
+ affiliation: values.affiliation,
95
+ updatedAt: values.updatedAt
96
+ }
97
+ });
98
+ if (events.length > 0) await tx.insert(require_schema.memberDomainEvents).values(events.map((event) => ({
99
+ id: (0, uuid.v4)(),
100
+ memberId: event.id,
101
+ email: event.email.getValue(),
102
+ eventName: event.eventName,
103
+ payload: require_serializeMemberEvent.serializeMemberEventPayload(event),
104
+ occurredAt: event.occurredAt.toISOString()
105
+ })));
106
+ });
107
+ }
108
+ };
109
+ //#endregion
110
+ exports.DrizzleMemberRepository = DrizzleMemberRepository;
111
+
112
+ //# sourceMappingURL=DrizzleMemberRepository.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrizzleMemberRepository.cjs","names":["memberId","UniversityEmail","recorded","Email","notRecorded","ActiveMember","StudentId","UnconfirmedMember","FormerMember","getDb","members","memberDomainEvents","serializeMemberEventPayload"],"sources":["../../../src/infrastructure/drizzle/DrizzleMemberRepository.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\nimport { eq } from \"drizzle-orm\";\nimport {\n\tActiveMember,\n\tEmail,\n\tFormerMember,\n\tStudentId,\n\tUnconfirmedMember,\n\tUniversityEmail,\n\tmemberId,\n\tnotRecorded,\n\trecorded,\n\ttype CompleteAffiliation,\n\ttype Member,\n\ttype MemberId,\n\ttype MemberRepository,\n\ttype Recorded,\n} from \"#domain\";\nimport { getDb } from \"./client\";\nimport { memberDomainEvents, members } from \"./schema\";\nimport { serializeMemberEventPayload } from \"./serializeMemberEvent\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ntype MemberRow = typeof members.$inferSelect;\n\n// ============================================================================\n// Domain ↔ DB Mapping\n// ============================================================================\n\nfunction toDomain(row: MemberRow): Member {\n\tconst id = memberId(row.id);\n\tconst email = new UniversityEmail(row.email);\n\tconst name = row.name;\n\tconst personalEmail: Recorded<Email> =\n\t\trow.personalEmail !== null ? recorded(new Email(row.personalEmail)) : notRecorded();\n\n\tswitch (row.status) {\n\t\tcase \"active\": {\n\t\t\tif (row.affiliation === null || row.studentId === null) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`データ不整合: status=active だが affiliation または studentId が null (id=${row.id})`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn ActiveMember.reconstruct({\n\t\t\t\tid,\n\t\t\t\temail,\n\t\t\t\tname,\n\t\t\t\tpersonalEmail,\n\t\t\t\tstudentId: StudentId.fromString(row.studentId),\n\t\t\t\taffiliation: row.affiliation as CompleteAffiliation,\n\t\t\t});\n\t\t}\n\t\tcase \"unconfirmed\":\n\t\t\treturn UnconfirmedMember.reconstruct({ id, email, name, personalEmail });\n\t\tcase \"former\":\n\t\t\treturn FormerMember.reconstruct({ id, email, name, personalEmail });\n\t}\n}\n\n// ============================================================================\n// Persistence Helpers\n// ============================================================================\n\ntype MemberInsert = typeof members.$inferInsert;\n\nfunction toInsertValues(member: Member): MemberInsert {\n\tconst base = {\n\t\tid: member.id as string,\n\t\tname: member.name,\n\t\temail: member.email.getValue(),\n\t\tpersonalEmail:\n\t\t\tmember.personalEmail.type === \"recorded\" ? member.personalEmail.value.getValue() : null,\n\t\tstatus: member.status,\n\t\tupdatedAt: new Date().toISOString(),\n\t};\n\n\tswitch (member.status) {\n\t\tcase \"active\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstudentId: member.studentId.getValue(),\n\t\t\t\taffiliation: member.affiliation,\n\t\t\t};\n\t\tcase \"unconfirmed\":\n\t\tcase \"former\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstudentId: null,\n\t\t\t\taffiliation: null,\n\t\t\t};\n\t}\n}\n\n// ============================================================================\n// Repository Implementation\n// ============================================================================\n\nexport class DrizzleMemberRepository implements MemberRepository {\n\tasync findById(id: MemberId): Promise<Member | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.members.findFirst({\n\t\t\twhere: eq(members.id, id as string),\n\t\t});\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findByEmail(email: UniversityEmail): Promise<Member | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.members.findFirst({\n\t\t\twhere: eq(members.email, email.getValue()),\n\t\t});\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findAll(): Promise<Member[]> {\n\t\tconst db = getDb();\n\t\tconst rows = await db.query.members.findMany();\n\t\treturn rows.map(toDomain);\n\t}\n\n\tasync save(member: Member): Promise<void> {\n\t\tconst db = getDb();\n\t\tconst values = toInsertValues(member);\n\t\tconst events = member.getDomainEvents();\n\n\t\tawait db.transaction(async (tx) => {\n\t\t\tawait tx\n\t\t\t\t.insert(members)\n\t\t\t\t.values(values)\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: members.id,\n\t\t\t\t\tset: {\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\temail: values.email,\n\t\t\t\t\t\tpersonalEmail: values.personalEmail,\n\t\t\t\t\t\tstatus: values.status,\n\t\t\t\t\t\tstudentId: values.studentId,\n\t\t\t\t\t\taffiliation: values.affiliation,\n\t\t\t\t\t\tupdatedAt: values.updatedAt,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\tif (events.length > 0) {\n\t\t\t\tawait tx.insert(memberDomainEvents).values(\n\t\t\t\t\tevents.map((event) => ({\n\t\t\t\t\t\tid: uuid(),\n\t\t\t\t\t\tmemberId: event.id as string,\n\t\t\t\t\t\temail: event.email.getValue(),\n\t\t\t\t\t\teventName: event.eventName,\n\t\t\t\t\t\tpayload: serializeMemberEventPayload(event),\n\t\t\t\t\t\toccurredAt: event.occurredAt.toISOString(),\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { notRecorded, recorded } from "../../domain/shared/Recorded.mjs";
2
+ import { StudentId } from "../../domain/shared/StudentId.mjs";
3
+ import { ActiveMember, FormerMember, UnconfirmedMember } from "../../domain/aggregates/member/Member.mjs";
4
+ import { memberId } from "../../domain/aggregates/member/MemberId.mjs";
5
+ import { Email } from "../../domain/aggregates/member/Email.mjs";
6
+ import { UniversityEmail } from "../../domain/aggregates/member/UniversityEmail.mjs";
7
+ import "../../domain/index.mjs";
8
+ import { memberDomainEvents, members } from "./schema.mjs";
9
+ import { getDb } from "./client.mjs";
10
+ import { serializeMemberEventPayload } from "./serializeMemberEvent.mjs";
11
+ import { v4 } from "uuid";
12
+ import { eq } from "drizzle-orm";
13
+ //#region src/infrastructure/drizzle/DrizzleMemberRepository.ts
14
+ function toDomain(row) {
15
+ const id = memberId(row.id);
16
+ const email = new UniversityEmail(row.email);
17
+ const name = row.name;
18
+ const personalEmail = row.personalEmail !== null ? recorded(new Email(row.personalEmail)) : notRecorded();
19
+ switch (row.status) {
20
+ case "active":
21
+ if (row.affiliation === null || row.studentId === null) throw new Error(`データ不整合: status=active だが affiliation または studentId が null (id=${row.id})`);
22
+ return ActiveMember.reconstruct({
23
+ id,
24
+ email,
25
+ name,
26
+ personalEmail,
27
+ studentId: StudentId.fromString(row.studentId),
28
+ affiliation: row.affiliation
29
+ });
30
+ case "unconfirmed": return UnconfirmedMember.reconstruct({
31
+ id,
32
+ email,
33
+ name,
34
+ personalEmail
35
+ });
36
+ case "former": return FormerMember.reconstruct({
37
+ id,
38
+ email,
39
+ name,
40
+ personalEmail
41
+ });
42
+ }
43
+ }
44
+ function toInsertValues(member) {
45
+ const base = {
46
+ id: member.id,
47
+ name: member.name,
48
+ email: member.email.getValue(),
49
+ personalEmail: member.personalEmail.type === "recorded" ? member.personalEmail.value.getValue() : null,
50
+ status: member.status,
51
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
52
+ };
53
+ switch (member.status) {
54
+ case "active": return {
55
+ ...base,
56
+ studentId: member.studentId.getValue(),
57
+ affiliation: member.affiliation
58
+ };
59
+ case "unconfirmed":
60
+ case "former": return {
61
+ ...base,
62
+ studentId: null,
63
+ affiliation: null
64
+ };
65
+ }
66
+ }
67
+ var DrizzleMemberRepository = class {
68
+ async findById(id) {
69
+ const row = await getDb().query.members.findFirst({ where: eq(members.id, id) });
70
+ if (!row) return null;
71
+ return toDomain(row);
72
+ }
73
+ async findByEmail(email) {
74
+ const row = await getDb().query.members.findFirst({ where: eq(members.email, email.getValue()) });
75
+ if (!row) return null;
76
+ return toDomain(row);
77
+ }
78
+ async findAll() {
79
+ return (await getDb().query.members.findMany()).map(toDomain);
80
+ }
81
+ async save(member) {
82
+ const db = getDb();
83
+ const values = toInsertValues(member);
84
+ const events = member.getDomainEvents();
85
+ await db.transaction(async (tx) => {
86
+ await tx.insert(members).values(values).onConflictDoUpdate({
87
+ target: members.id,
88
+ set: {
89
+ name: values.name,
90
+ email: values.email,
91
+ personalEmail: values.personalEmail,
92
+ status: values.status,
93
+ studentId: values.studentId,
94
+ affiliation: values.affiliation,
95
+ updatedAt: values.updatedAt
96
+ }
97
+ });
98
+ if (events.length > 0) await tx.insert(memberDomainEvents).values(events.map((event) => ({
99
+ id: v4(),
100
+ memberId: event.id,
101
+ email: event.email.getValue(),
102
+ eventName: event.eventName,
103
+ payload: serializeMemberEventPayload(event),
104
+ occurredAt: event.occurredAt.toISOString()
105
+ })));
106
+ });
107
+ }
108
+ };
109
+ //#endregion
110
+ export { DrizzleMemberRepository };
111
+
112
+ //# sourceMappingURL=DrizzleMemberRepository.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DrizzleMemberRepository.mjs","names":["uuid"],"sources":["../../../src/infrastructure/drizzle/DrizzleMemberRepository.ts"],"sourcesContent":["import { v4 as uuid } from \"uuid\";\nimport { eq } from \"drizzle-orm\";\nimport {\n\tActiveMember,\n\tEmail,\n\tFormerMember,\n\tStudentId,\n\tUnconfirmedMember,\n\tUniversityEmail,\n\tmemberId,\n\tnotRecorded,\n\trecorded,\n\ttype CompleteAffiliation,\n\ttype Member,\n\ttype MemberId,\n\ttype MemberRepository,\n\ttype Recorded,\n} from \"#domain\";\nimport { getDb } from \"./client\";\nimport { memberDomainEvents, members } from \"./schema\";\nimport { serializeMemberEventPayload } from \"./serializeMemberEvent\";\n\n// ============================================================================\n// Type Definitions\n// ============================================================================\n\ntype MemberRow = typeof members.$inferSelect;\n\n// ============================================================================\n// Domain ↔ DB Mapping\n// ============================================================================\n\nfunction toDomain(row: MemberRow): Member {\n\tconst id = memberId(row.id);\n\tconst email = new UniversityEmail(row.email);\n\tconst name = row.name;\n\tconst personalEmail: Recorded<Email> =\n\t\trow.personalEmail !== null ? recorded(new Email(row.personalEmail)) : notRecorded();\n\n\tswitch (row.status) {\n\t\tcase \"active\": {\n\t\t\tif (row.affiliation === null || row.studentId === null) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`データ不整合: status=active だが affiliation または studentId が null (id=${row.id})`,\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn ActiveMember.reconstruct({\n\t\t\t\tid,\n\t\t\t\temail,\n\t\t\t\tname,\n\t\t\t\tpersonalEmail,\n\t\t\t\tstudentId: StudentId.fromString(row.studentId),\n\t\t\t\taffiliation: row.affiliation as CompleteAffiliation,\n\t\t\t});\n\t\t}\n\t\tcase \"unconfirmed\":\n\t\t\treturn UnconfirmedMember.reconstruct({ id, email, name, personalEmail });\n\t\tcase \"former\":\n\t\t\treturn FormerMember.reconstruct({ id, email, name, personalEmail });\n\t}\n}\n\n// ============================================================================\n// Persistence Helpers\n// ============================================================================\n\ntype MemberInsert = typeof members.$inferInsert;\n\nfunction toInsertValues(member: Member): MemberInsert {\n\tconst base = {\n\t\tid: member.id as string,\n\t\tname: member.name,\n\t\temail: member.email.getValue(),\n\t\tpersonalEmail:\n\t\t\tmember.personalEmail.type === \"recorded\" ? member.personalEmail.value.getValue() : null,\n\t\tstatus: member.status,\n\t\tupdatedAt: new Date().toISOString(),\n\t};\n\n\tswitch (member.status) {\n\t\tcase \"active\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstudentId: member.studentId.getValue(),\n\t\t\t\taffiliation: member.affiliation,\n\t\t\t};\n\t\tcase \"unconfirmed\":\n\t\tcase \"former\":\n\t\t\treturn {\n\t\t\t\t...base,\n\t\t\t\tstudentId: null,\n\t\t\t\taffiliation: null,\n\t\t\t};\n\t}\n}\n\n// ============================================================================\n// Repository Implementation\n// ============================================================================\n\nexport class DrizzleMemberRepository implements MemberRepository {\n\tasync findById(id: MemberId): Promise<Member | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.members.findFirst({\n\t\t\twhere: eq(members.id, id as string),\n\t\t});\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findByEmail(email: UniversityEmail): Promise<Member | null> {\n\t\tconst db = getDb();\n\t\tconst row = await db.query.members.findFirst({\n\t\t\twhere: eq(members.email, email.getValue()),\n\t\t});\n\t\tif (!row) return null;\n\t\treturn toDomain(row);\n\t}\n\n\tasync findAll(): Promise<Member[]> {\n\t\tconst db = getDb();\n\t\tconst rows = await db.query.members.findMany();\n\t\treturn rows.map(toDomain);\n\t}\n\n\tasync save(member: Member): Promise<void> {\n\t\tconst db = getDb();\n\t\tconst values = toInsertValues(member);\n\t\tconst events = member.getDomainEvents();\n\n\t\tawait db.transaction(async (tx) => {\n\t\t\tawait tx\n\t\t\t\t.insert(members)\n\t\t\t\t.values(values)\n\t\t\t\t.onConflictDoUpdate({\n\t\t\t\t\ttarget: members.id,\n\t\t\t\t\tset: {\n\t\t\t\t\t\tname: values.name,\n\t\t\t\t\t\temail: values.email,\n\t\t\t\t\t\tpersonalEmail: values.personalEmail,\n\t\t\t\t\t\tstatus: values.status,\n\t\t\t\t\t\tstudentId: values.studentId,\n\t\t\t\t\t\taffiliation: values.affiliation,\n\t\t\t\t\t\tupdatedAt: values.updatedAt,\n\t\t\t\t\t},\n\t\t\t\t});\n\n\t\t\tif (events.length > 0) {\n\t\t\t\tawait tx.insert(memberDomainEvents).values(\n\t\t\t\t\tevents.map((event) => ({\n\t\t\t\t\t\tid: uuid(),\n\t\t\t\t\t\tmemberId: event.id as string,\n\t\t\t\t\t\temail: event.email.getValue(),\n\t\t\t\t\t\teventName: event.eventName,\n\t\t\t\t\t\tpayload: serializeMemberEventPayload(event),\n\t\t\t\t\t\toccurredAt: event.occurredAt.toISOString(),\n\t\t\t\t\t})),\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":";;;;;;;;;;;;;AAgCA,SAAS,SAAS,KAAwB;CACzC,MAAM,KAAK,SAAS,IAAI,GAAG;CAC3B,MAAM,QAAQ,IAAI,gBAAgB,IAAI,MAAM;CAC5C,MAAM,OAAO,IAAI;CACjB,MAAM,gBACL,IAAI,kBAAkB,OAAO,SAAS,IAAI,MAAM,IAAI,cAAc,CAAC,GAAG,aAAa;AAEpF,SAAQ,IAAI,QAAZ;EACC,KAAK;AACJ,OAAI,IAAI,gBAAgB,QAAQ,IAAI,cAAc,KACjD,OAAM,IAAI,MACT,iEAAiE,IAAI,GAAG,GACxE;AAEF,UAAO,aAAa,YAAY;IAC/B;IACA;IACA;IACA;IACA,WAAW,UAAU,WAAW,IAAI,UAAU;IAC9C,aAAa,IAAI;IACjB,CAAC;EAEH,KAAK,cACJ,QAAO,kBAAkB,YAAY;GAAE;GAAI;GAAO;GAAM;GAAe,CAAC;EACzE,KAAK,SACJ,QAAO,aAAa,YAAY;GAAE;GAAI;GAAO;GAAM;GAAe,CAAC;;;AAUtE,SAAS,eAAe,QAA8B;CACrD,MAAM,OAAO;EACZ,IAAI,OAAO;EACX,MAAM,OAAO;EACb,OAAO,OAAO,MAAM,UAAU;EAC9B,eACC,OAAO,cAAc,SAAS,aAAa,OAAO,cAAc,MAAM,UAAU,GAAG;EACpF,QAAQ,OAAO;EACf,4BAAW,IAAI,MAAM,EAAC,aAAa;EACnC;AAED,SAAQ,OAAO,QAAf;EACC,KAAK,SACJ,QAAO;GACN,GAAG;GACH,WAAW,OAAO,UAAU,UAAU;GACtC,aAAa,OAAO;GACpB;EACF,KAAK;EACL,KAAK,SACJ,QAAO;GACN,GAAG;GACH,WAAW;GACX,aAAa;GACb;;;AAQJ,IAAa,0BAAb,MAAiE;CAChE,MAAM,SAAS,IAAsC;EAEpD,MAAM,MAAM,MADD,OAAO,CACG,MAAM,QAAQ,UAAU,EAC5C,OAAO,GAAG,QAAQ,IAAI,GAAa,EACnC,CAAC;AACF,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,SAAS,IAAI;;CAGrB,MAAM,YAAY,OAAgD;EAEjE,MAAM,MAAM,MADD,OAAO,CACG,MAAM,QAAQ,UAAU,EAC5C,OAAO,GAAG,QAAQ,OAAO,MAAM,UAAU,CAAC,EAC1C,CAAC;AACF,MAAI,CAAC,IAAK,QAAO;AACjB,SAAO,SAAS,IAAI;;CAGrB,MAAM,UAA6B;AAGlC,UADa,MADF,OAAO,CACI,MAAM,QAAQ,UAAU,EAClC,IAAI,SAAS;;CAG1B,MAAM,KAAK,QAA+B;EACzC,MAAM,KAAK,OAAO;EAClB,MAAM,SAAS,eAAe,OAAO;EACrC,MAAM,SAAS,OAAO,iBAAiB;AAEvC,QAAM,GAAG,YAAY,OAAO,OAAO;AAClC,SAAM,GACJ,OAAO,QAAQ,CACf,OAAO,OAAO,CACd,mBAAmB;IACnB,QAAQ,QAAQ;IAChB,KAAK;KACJ,MAAM,OAAO;KACb,OAAO,OAAO;KACd,eAAe,OAAO;KACtB,QAAQ,OAAO;KACf,WAAW,OAAO;KAClB,aAAa,OAAO;KACpB,WAAW,OAAO;KAClB;IACD,CAAC;AAEH,OAAI,OAAO,SAAS,EACnB,OAAM,GAAG,OAAO,mBAAmB,CAAC,OACnC,OAAO,KAAK,WAAW;IACtB,IAAIA,IAAM;IACV,UAAU,MAAM;IAChB,OAAO,MAAM,MAAM,UAAU;IAC7B,WAAW,MAAM;IACjB,SAAS,4BAA4B,MAAM;IAC3C,YAAY,MAAM,WAAW,aAAa;IAC1C,EAAE,CACH;IAED"}
@@ -0,0 +1,20 @@
1
+ const require_schema = require("./schema.cjs");
2
+ let drizzle_orm_node_postgres = require("drizzle-orm/node-postgres");
3
+ let pg = require("pg");
4
+ //#region src/infrastructure/drizzle/client.ts
5
+ let pool = null;
6
+ function getPool() {
7
+ if (!pool) {
8
+ const connectionString = process.env.DATABASE_URL;
9
+ if (!connectionString) throw new Error("DATABASE_URL environment variable is not set");
10
+ pool = new pg.Pool({ connectionString });
11
+ }
12
+ return pool;
13
+ }
14
+ function getDb() {
15
+ return (0, drizzle_orm_node_postgres.drizzle)(getPool(), { schema: require_schema.schema_exports });
16
+ }
17
+ //#endregion
18
+ exports.getDb = getDb;
19
+
20
+ //# sourceMappingURL=client.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.cjs","names":["Pool"],"sources":["../../../src/infrastructure/drizzle/client.ts"],"sourcesContent":["import { drizzle } from \"drizzle-orm/node-postgres\";\nimport { Pool } from \"pg\";\nimport * as schema from \"./schema\";\n\nlet pool: Pool | null = null;\n\nfunction getPool(): Pool {\n\tif (!pool) {\n\t\tconst connectionString = process.env.DATABASE_URL;\n\t\tif (!connectionString) {\n\t\t\tthrow new Error(\"DATABASE_URL environment variable is not set\");\n\t\t}\n\t\tpool = new Pool({ connectionString });\n\t}\n\treturn pool;\n}\n\nexport function getDb() {\n\treturn drizzle(getPool(), { schema });\n}\n\nexport type DrizzleDb = ReturnType<typeof getDb>;\n"],"mappings":";;;;AAIA,IAAI,OAAoB;AAExB,SAAS,UAAgB;AACxB,KAAI,CAAC,MAAM;EACV,MAAM,mBAAmB,QAAQ,IAAI;AACrC,MAAI,CAAC,iBACJ,OAAM,IAAI,MAAM,+CAA+C;AAEhE,SAAO,IAAIA,GAAAA,KAAK,EAAE,kBAAkB,CAAC;;AAEtC,QAAO;;AAGR,SAAgB,QAAQ;AACvB,SAAA,GAAA,0BAAA,SAAe,SAAS,EAAE,EAAE,QAAA,eAAA,gBAAQ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { schema_exports } from "./schema.mjs";
2
+ import { drizzle } from "drizzle-orm/node-postgres";
3
+ import { Pool } from "pg";
4
+ //#region src/infrastructure/drizzle/client.ts
5
+ let pool = null;
6
+ function getPool() {
7
+ if (!pool) {
8
+ const connectionString = process.env.DATABASE_URL;
9
+ if (!connectionString) throw new Error("DATABASE_URL environment variable is not set");
10
+ pool = new Pool({ connectionString });
11
+ }
12
+ return pool;
13
+ }
14
+ function getDb() {
15
+ return drizzle(getPool(), { schema: schema_exports });
16
+ }
17
+ //#endregion
18
+ export { getDb };
19
+
20
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.mjs","names":[],"sources":["../../../src/infrastructure/drizzle/client.ts"],"sourcesContent":["import { drizzle } from \"drizzle-orm/node-postgres\";\nimport { Pool } from \"pg\";\nimport * as schema from \"./schema\";\n\nlet pool: Pool | null = null;\n\nfunction getPool(): Pool {\n\tif (!pool) {\n\t\tconst connectionString = process.env.DATABASE_URL;\n\t\tif (!connectionString) {\n\t\t\tthrow new Error(\"DATABASE_URL environment variable is not set\");\n\t\t}\n\t\tpool = new Pool({ connectionString });\n\t}\n\treturn pool;\n}\n\nexport function getDb() {\n\treturn drizzle(getPool(), { schema });\n}\n\nexport type DrizzleDb = ReturnType<typeof getDb>;\n"],"mappings":";;;;AAIA,IAAI,OAAoB;AAExB,SAAS,UAAgB;AACxB,KAAI,CAAC,MAAM;EACV,MAAM,mBAAmB,QAAQ,IAAI;AACrC,MAAI,CAAC,iBACJ,OAAM,IAAI,MAAM,+CAA+C;AAEhE,SAAO,IAAI,KAAK,EAAE,kBAAkB,CAAC;;AAEtC,QAAO;;AAGR,SAAgB,QAAQ;AACvB,QAAO,QAAQ,SAAS,EAAE,EAAE,QAAA,gBAAQ,CAAC"}
@@ -0,0 +1,4 @@
1
+ require("./DrizzleDiscordAccountRepository.cjs");
2
+ require("./DrizzleEventRepository.cjs");
3
+ require("./DrizzleKarteRepository.cjs");
4
+ require("./DrizzleMemberRepository.cjs");
@@ -0,0 +1,5 @@
1
+ import "./DrizzleDiscordAccountRepository.mjs";
2
+ import "./DrizzleEventRepository.mjs";
3
+ import "./DrizzleKarteRepository.mjs";
4
+ import "./DrizzleMemberRepository.mjs";
5
+ export {};