@meridianjs/meridian 0.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 (170) hide show
  1. package/dist/api/admin/issues/[id]/activities/route.d.ts +3 -0
  2. package/dist/api/admin/issues/[id]/activities/route.d.ts.map +1 -0
  3. package/dist/api/admin/issues/[id]/activities/route.js +7 -0
  4. package/dist/api/admin/issues/[id]/activities/route.js.map +1 -0
  5. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.d.ts +3 -0
  6. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.d.ts.map +1 -0
  7. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js +11 -0
  8. package/dist/api/admin/issues/[id]/attachments/[attachmentId]/route.js.map +1 -0
  9. package/dist/api/admin/issues/[id]/attachments/route.d.ts +4 -0
  10. package/dist/api/admin/issues/[id]/attachments/route.d.ts.map +1 -0
  11. package/dist/api/admin/issues/[id]/attachments/route.js +40 -0
  12. package/dist/api/admin/issues/[id]/attachments/route.js.map +1 -0
  13. package/dist/api/admin/issues/[id]/comments/route.d.ts +4 -0
  14. package/dist/api/admin/issues/[id]/comments/route.d.ts.map +1 -0
  15. package/dist/api/admin/issues/[id]/comments/route.js +20 -0
  16. package/dist/api/admin/issues/[id]/comments/route.js.map +1 -0
  17. package/dist/api/admin/issues/[id]/route.d.ts +5 -0
  18. package/dist/api/admin/issues/[id]/route.d.ts.map +1 -0
  19. package/dist/api/admin/issues/[id]/route.js +70 -0
  20. package/dist/api/admin/issues/[id]/route.js.map +1 -0
  21. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts +3 -0
  22. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.d.ts.map +1 -0
  23. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js +6 -0
  24. package/dist/api/admin/issues/[id]/time-logs/[logId]/route.js.map +1 -0
  25. package/dist/api/admin/issues/[id]/time-logs/route.d.ts +4 -0
  26. package/dist/api/admin/issues/[id]/time-logs/route.d.ts.map +1 -0
  27. package/dist/api/admin/issues/[id]/time-logs/route.js +26 -0
  28. package/dist/api/admin/issues/[id]/time-logs/route.js.map +1 -0
  29. package/dist/api/admin/issues/[id]/time-logs/timer/route.d.ts +4 -0
  30. package/dist/api/admin/issues/[id]/time-logs/timer/route.d.ts.map +1 -0
  31. package/dist/api/admin/issues/[id]/time-logs/timer/route.js +26 -0
  32. package/dist/api/admin/issues/[id]/time-logs/timer/route.js.map +1 -0
  33. package/dist/api/admin/issues/route.d.ts +4 -0
  34. package/dist/api/admin/issues/route.d.ts.map +1 -0
  35. package/dist/api/admin/issues/route.js +48 -0
  36. package/dist/api/admin/issues/route.js.map +1 -0
  37. package/dist/api/admin/notifications/[id]/read/route.d.ts +3 -0
  38. package/dist/api/admin/notifications/[id]/read/route.d.ts.map +1 -0
  39. package/dist/api/admin/notifications/[id]/read/route.js +6 -0
  40. package/dist/api/admin/notifications/[id]/read/route.js.map +1 -0
  41. package/dist/api/admin/notifications/read-all/route.d.ts +3 -0
  42. package/dist/api/admin/notifications/read-all/route.d.ts.map +1 -0
  43. package/dist/api/admin/notifications/read-all/route.js +11 -0
  44. package/dist/api/admin/notifications/read-all/route.js.map +1 -0
  45. package/dist/api/admin/notifications/route.d.ts +3 -0
  46. package/dist/api/admin/notifications/route.d.ts.map +1 -0
  47. package/dist/api/admin/notifications/route.js +14 -0
  48. package/dist/api/admin/notifications/route.js.map +1 -0
  49. package/dist/api/admin/projects/[id]/route.d.ts +5 -0
  50. package/dist/api/admin/projects/[id]/route.d.ts.map +1 -0
  51. package/dist/api/admin/projects/[id]/route.js +36 -0
  52. package/dist/api/admin/projects/[id]/route.js.map +1 -0
  53. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.d.ts +4 -0
  54. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.d.ts.map +1 -0
  55. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js +24 -0
  56. package/dist/api/admin/projects/[id]/statuses/[statusId]/route.js.map +1 -0
  57. package/dist/api/admin/projects/[id]/statuses/reorder/route.d.ts +3 -0
  58. package/dist/api/admin/projects/[id]/statuses/reorder/route.d.ts.map +1 -0
  59. package/dist/api/admin/projects/[id]/statuses/reorder/route.js +11 -0
  60. package/dist/api/admin/projects/[id]/statuses/reorder/route.js.map +1 -0
  61. package/dist/api/admin/projects/[id]/statuses/route.d.ts +4 -0
  62. package/dist/api/admin/projects/[id]/statuses/route.d.ts.map +1 -0
  63. package/dist/api/admin/projects/[id]/statuses/route.js +23 -0
  64. package/dist/api/admin/projects/[id]/statuses/route.js.map +1 -0
  65. package/dist/api/admin/projects/[id]/task-lists/route.d.ts +4 -0
  66. package/dist/api/admin/projects/[id]/task-lists/route.d.ts.map +1 -0
  67. package/dist/api/admin/projects/[id]/task-lists/route.js +18 -0
  68. package/dist/api/admin/projects/[id]/task-lists/route.js.map +1 -0
  69. package/dist/api/admin/projects/by-identifier/[identifier]/route.d.ts +3 -0
  70. package/dist/api/admin/projects/by-identifier/[identifier]/route.d.ts.map +1 -0
  71. package/dist/api/admin/projects/by-identifier/[identifier]/route.js +15 -0
  72. package/dist/api/admin/projects/by-identifier/[identifier]/route.js.map +1 -0
  73. package/dist/api/admin/projects/check-identifier/[identifier]/route.d.ts +3 -0
  74. package/dist/api/admin/projects/check-identifier/[identifier]/route.d.ts.map +1 -0
  75. package/dist/api/admin/projects/check-identifier/[identifier]/route.js +11 -0
  76. package/dist/api/admin/projects/check-identifier/[identifier]/route.js.map +1 -0
  77. package/dist/api/admin/projects/route.d.ts +4 -0
  78. package/dist/api/admin/projects/route.d.ts.map +1 -0
  79. package/dist/api/admin/projects/route.js +35 -0
  80. package/dist/api/admin/projects/route.js.map +1 -0
  81. package/dist/api/admin/projects/suggest-identifier/route.d.ts +3 -0
  82. package/dist/api/admin/projects/suggest-identifier/route.d.ts.map +1 -0
  83. package/dist/api/admin/projects/suggest-identifier/route.js +7 -0
  84. package/dist/api/admin/projects/suggest-identifier/route.js.map +1 -0
  85. package/dist/api/admin/sprints/[id]/route.d.ts +5 -0
  86. package/dist/api/admin/sprints/[id]/route.d.ts.map +1 -0
  87. package/dist/api/admin/sprints/[id]/route.js +41 -0
  88. package/dist/api/admin/sprints/[id]/route.js.map +1 -0
  89. package/dist/api/admin/sprints/route.d.ts +4 -0
  90. package/dist/api/admin/sprints/route.d.ts.map +1 -0
  91. package/dist/api/admin/sprints/route.js +25 -0
  92. package/dist/api/admin/sprints/route.js.map +1 -0
  93. package/dist/api/admin/task-lists/[id]/route.d.ts +4 -0
  94. package/dist/api/admin/task-lists/[id]/route.d.ts.map +1 -0
  95. package/dist/api/admin/task-lists/[id]/route.js +12 -0
  96. package/dist/api/admin/task-lists/[id]/route.js.map +1 -0
  97. package/dist/api/admin/users/route.d.ts +3 -0
  98. package/dist/api/admin/users/route.d.ts.map +1 -0
  99. package/dist/api/admin/users/route.js +9 -0
  100. package/dist/api/admin/users/route.js.map +1 -0
  101. package/dist/api/admin/workspaces/route.d.ts +4 -0
  102. package/dist/api/admin/workspaces/route.d.ts.map +1 -0
  103. package/dist/api/admin/workspaces/route.js +19 -0
  104. package/dist/api/admin/workspaces/route.js.map +1 -0
  105. package/dist/api/auth/login/route.d.ts +3 -0
  106. package/dist/api/auth/login/route.d.ts.map +1 -0
  107. package/dist/api/auth/login/route.js +16 -0
  108. package/dist/api/auth/login/route.js.map +1 -0
  109. package/dist/api/auth/register/route.d.ts +3 -0
  110. package/dist/api/auth/register/route.d.ts.map +1 -0
  111. package/dist/api/auth/register/route.js +18 -0
  112. package/dist/api/auth/register/route.js.map +1 -0
  113. package/dist/index.d.ts +9 -0
  114. package/dist/index.d.ts.map +1 -0
  115. package/dist/index.js +12 -0
  116. package/dist/index.js.map +1 -0
  117. package/dist/links/issue-project.d.ts +3 -0
  118. package/dist/links/issue-project.d.ts.map +1 -0
  119. package/dist/links/issue-project.js +5 -0
  120. package/dist/links/issue-project.js.map +1 -0
  121. package/dist/links/issue-sprint.d.ts +3 -0
  122. package/dist/links/issue-sprint.d.ts.map +1 -0
  123. package/dist/links/issue-sprint.js +5 -0
  124. package/dist/links/issue-sprint.js.map +1 -0
  125. package/dist/links/project-workspace.d.ts +3 -0
  126. package/dist/links/project-workspace.d.ts.map +1 -0
  127. package/dist/links/project-workspace.js +5 -0
  128. package/dist/links/project-workspace.js.map +1 -0
  129. package/dist/package.json +1 -0
  130. package/dist/subscribers/comment-created.d.ts +10 -0
  131. package/dist/subscribers/comment-created.d.ts.map +1 -0
  132. package/dist/subscribers/comment-created.js +25 -0
  133. package/dist/subscribers/comment-created.js.map +1 -0
  134. package/dist/subscribers/issue-assigned.d.ts +11 -0
  135. package/dist/subscribers/issue-assigned.d.ts.map +1 -0
  136. package/dist/subscribers/issue-assigned.js +15 -0
  137. package/dist/subscribers/issue-assigned.js.map +1 -0
  138. package/dist/subscribers/issue-created.d.ts +13 -0
  139. package/dist/subscribers/issue-created.d.ts.map +1 -0
  140. package/dist/subscribers/issue-created.js +17 -0
  141. package/dist/subscribers/issue-created.js.map +1 -0
  142. package/dist/utils/upload.d.ts +8 -0
  143. package/dist/utils/upload.d.ts.map +1 -0
  144. package/dist/utils/upload.js +22 -0
  145. package/dist/utils/upload.js.map +1 -0
  146. package/dist/workflows/assign-issue.d.ts +7 -0
  147. package/dist/workflows/assign-issue.d.ts.map +1 -0
  148. package/dist/workflows/assign-issue.js +39 -0
  149. package/dist/workflows/assign-issue.js.map +1 -0
  150. package/dist/workflows/complete-sprint.d.ts +7 -0
  151. package/dist/workflows/complete-sprint.d.ts.map +1 -0
  152. package/dist/workflows/complete-sprint.js +43 -0
  153. package/dist/workflows/complete-sprint.js.map +1 -0
  154. package/dist/workflows/create-issue.d.ts +19 -0
  155. package/dist/workflows/create-issue.d.ts.map +1 -0
  156. package/dist/workflows/create-issue.js +41 -0
  157. package/dist/workflows/create-issue.js.map +1 -0
  158. package/dist/workflows/create-project.d.ts +21 -0
  159. package/dist/workflows/create-project.d.ts.map +1 -0
  160. package/dist/workflows/create-project.js +80 -0
  161. package/dist/workflows/create-project.js.map +1 -0
  162. package/dist/workflows/emit-event.d.ts +3 -0
  163. package/dist/workflows/emit-event.d.ts.map +1 -0
  164. package/dist/workflows/emit-event.js +6 -0
  165. package/dist/workflows/emit-event.js.map +1 -0
  166. package/dist/workflows/update-issue-status.d.ts +7 -0
  167. package/dist/workflows/update-issue-status.d.ts.map +1 -0
  168. package/dist/workflows/update-issue-status.js +38 -0
  169. package/dist/workflows/update-issue-status.js.map +1 -0
  170. package/package.json +46 -0
@@ -0,0 +1,25 @@
1
+ export default async function handler({ event, container }) {
2
+ const data = event.data;
3
+ const issueService = container.resolve("issueModuleService");
4
+ const notifService = container.resolve("notificationModuleService");
5
+ let issue;
6
+ try {
7
+ issue = await issueService.retrieveIssue(data.issue_id);
8
+ }
9
+ catch {
10
+ return;
11
+ }
12
+ const recipients = new Set();
13
+ if (issue.assignee_ids)
14
+ issue.assignee_ids.forEach((id) => recipients.add(id));
15
+ if (issue.reporter_id)
16
+ recipients.add(issue.reporter_id);
17
+ recipients.delete(data.author_id);
18
+ await Promise.all([...recipients].map(userId => notifService.createNotification({
19
+ user_id: userId, entity_type: "issue", entity_id: data.issue_id,
20
+ action: "commented", message: "Someone commented on an issue you're involved with",
21
+ workspace_id: issue.workspace_id,
22
+ })));
23
+ }
24
+ export const config = { event: "comment.created" };
25
+ //# sourceMappingURL=comment-created.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"comment-created.js","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAsC;IAC5F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;IACnE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAE1E,IAAI,KAAU,CAAA;IACd,IAAI,CAAC;QACH,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACzD,CAAC;IAAC,MAAM,CAAC;QACP,OAAM;IACR,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,IAAI,KAAK,CAAC,YAAY;QAAE,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,EAAU,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IACtF,IAAI,KAAK,CAAC,WAAW;QAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IACxD,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAEjC,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAC7C,YAAY,CAAC,kBAAkB,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ;QAC/D,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,oDAAoD;QAClF,YAAY,EAAE,KAAK,CAAC,YAAY;KACjC,CAAC,CACH,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA"}
@@ -0,0 +1,11 @@
1
+ import type { SubscriberArgs, SubscriberConfig } from "@meridianjs/types";
2
+ interface IssueAssignedData {
3
+ issue_id: string;
4
+ workspace_id: string;
5
+ actor_id: string;
6
+ assignee_ids: string[];
7
+ }
8
+ export default function handler({ event, container }: SubscriberArgs<IssueAssignedData>): Promise<void>;
9
+ export declare const config: SubscriberConfig;
10
+ export {};
11
+ //# sourceMappingURL=issue-assigned.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-assigned.d.ts","sourceRoot":"","sources":["../../src/subscribers/issue-assigned.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,iBAAiB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB5G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA8C,CAAA"}
@@ -0,0 +1,15 @@
1
+ export default async function handler({ event, container }) {
2
+ const data = event.data;
3
+ if (!data.assignee_ids?.length)
4
+ return;
5
+ const notifService = container.resolve("notificationModuleService");
6
+ await Promise.all(data.assignee_ids
7
+ .filter(id => id !== data.actor_id)
8
+ .map(userId => notifService.createNotification({
9
+ user_id: userId, entity_type: "issue", entity_id: data.issue_id,
10
+ action: "assigned", message: "You were assigned to an issue",
11
+ workspace_id: data.workspace_id,
12
+ })));
13
+ }
14
+ export const config = { event: "issue.assigned" };
15
+ //# sourceMappingURL=issue-assigned.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-assigned.js","sourceRoot":"","sources":["../../src/subscribers/issue-assigned.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAqC;IAC3F,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM;QAAE,OAAM;IAEtC,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAE1E,MAAM,OAAO,CAAC,GAAG,CACf,IAAI,CAAC,YAAY;SACd,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC;SAClC,GAAG,CAAC,MAAM,CAAC,EAAE,CACZ,YAAY,CAAC,kBAAkB,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ;QAC/D,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,+BAA+B;QAC5D,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC,CACH,CACJ,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA"}
@@ -0,0 +1,13 @@
1
+ import type { SubscriberArgs, SubscriberConfig } from "@meridianjs/types";
2
+ interface IssueCreatedData {
3
+ issue_id: string;
4
+ project_id: string;
5
+ workspace_id: string;
6
+ actor_id: string;
7
+ assignee_ids: string[] | null;
8
+ reporter_id: string | null;
9
+ }
10
+ export default function handler({ event, container }: SubscriberArgs<IssueCreatedData>): Promise<void>;
11
+ export declare const config: SubscriberConfig;
12
+ export {};
13
+ //# sourceMappingURL=issue-created.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-created.d.ts","sourceRoot":"","sources":["../../src/subscribers/issue-created.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzE,UAAU,gBAAgB;IACxB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,QAAQ,EAAE,MAAM,CAAA;IAChB,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC7B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,gBAAgB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA6C,CAAA"}
@@ -0,0 +1,17 @@
1
+ export default async function handler({ event, container }) {
2
+ const notifService = container.resolve("notificationModuleService");
3
+ const data = event.data;
4
+ const recipients = new Set();
5
+ if (data.assignee_ids)
6
+ data.assignee_ids.forEach(id => recipients.add(id));
7
+ if (data.reporter_id && data.reporter_id !== data.actor_id)
8
+ recipients.add(data.reporter_id);
9
+ await Promise.all([...recipients].map(userId => notifService.createNotification({
10
+ user_id: userId, entity_type: "issue", entity_id: data.issue_id,
11
+ action: "created",
12
+ message: data.assignee_ids?.includes(userId) ? "You were assigned to a new issue" : "An issue was created in your project",
13
+ workspace_id: data.workspace_id,
14
+ })));
15
+ }
16
+ export const config = { event: "issue.created" };
17
+ //# sourceMappingURL=issue-created.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issue-created.js","sourceRoot":"","sources":["../../src/subscribers/issue-created.ts"],"names":[],"mappings":"AAWA,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAoC;IAC1F,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAC1E,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,IAAI,IAAI,CAAC,YAAY;QAAE,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAA;IAC1E,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,QAAQ;QAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IAE5F,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAC7C,YAAY,CAAC,kBAAkB,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ;QAC/D,MAAM,EAAE,SAAS;QACjB,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,sCAAsC;QAC1H,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC,CACH,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,eAAe,EAAE,CAAA"}
@@ -0,0 +1,8 @@
1
+ import multer from "multer";
2
+ /**
3
+ * Multer instance for issue attachment uploads.
4
+ * Files are stored in <projectRoot>/uploads/issue-attachments/.
5
+ * The upload directory must exist before the server starts.
6
+ */
7
+ export declare function createUpload(uploadDir: string): multer.Multer;
8
+ //# sourceMappingURL=upload.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.d.ts","sourceRoot":"","sources":["../../src/utils/upload.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAI3B;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,iBAa7C"}
@@ -0,0 +1,22 @@
1
+ import multer from "multer";
2
+ import path from "node:path";
3
+ import { randomUUID } from "node:crypto";
4
+ /**
5
+ * Multer instance for issue attachment uploads.
6
+ * Files are stored in <projectRoot>/uploads/issue-attachments/.
7
+ * The upload directory must exist before the server starts.
8
+ */
9
+ export function createUpload(uploadDir) {
10
+ const storage = multer.diskStorage({
11
+ destination: (_req, _file, cb) => cb(null, uploadDir),
12
+ filename: (_req, file, cb) => {
13
+ const ext = path.extname(file.originalname);
14
+ const base = path.basename(file.originalname, ext)
15
+ .replace(/[^a-zA-Z0-9._-]/g, "_")
16
+ .slice(0, 80);
17
+ cb(null, `${randomUUID()}-${base}${ext}`);
18
+ },
19
+ });
20
+ return multer({ storage, limits: { fileSize: 50 * 1024 * 1024 } });
21
+ }
22
+ //# sourceMappingURL=upload.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"upload.js","sourceRoot":"","sources":["../../src/utils/upload.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,IAAI,MAAM,WAAW,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAExC;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,SAAiB;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC;QACjC,WAAW,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,SAAS,CAAC;QACrD,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YAC3C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,CAAC;iBAC/C,OAAO,CAAC,kBAAkB,EAAE,GAAG,CAAC;iBAChC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAA;YACf,EAAE,CAAC,IAAI,EAAE,GAAG,UAAU,EAAE,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC,CAAA;QAC3C,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,CAAA;AACpE,CAAC"}
@@ -0,0 +1,7 @@
1
+ export interface AssignIssueInput {
2
+ issueId: string;
3
+ assignee_ids: string[];
4
+ actor_id?: string | null;
5
+ }
6
+ export declare const assignIssueWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<AssignIssueInput, any>;
7
+ //# sourceMappingURL=assign-issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assign-issue.d.ts","sourceRoot":"","sources":["../../src/workflows/assign-issue.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAwCD,eAAO,MAAM,mBAAmB,2IAgB/B,CAAA"}
@@ -0,0 +1,39 @@
1
+ import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, } from "@meridianjs/workflow-engine";
2
+ import { emitEventStep } from "./emit-event.js";
3
+ const fetchIssueForAssignStep = createStep("fetch-issue-for-assign", async (input, { container }) => {
4
+ const svc = container.resolve("issueModuleService");
5
+ const issue = await svc.retrieveIssue(input.issueId);
6
+ return { issue, newAssignees: input.assignee_ids, actor_id: input.actor_id, oldAssignees: issue.assignee_ids ?? [] };
7
+ });
8
+ const setAssigneesStep = createStep("set-issue-assignees", async (input, { container }) => {
9
+ const svc = container.resolve("issueModuleService");
10
+ const updated = await svc.updateIssue(input.issue.id, { assignee_ids: input.newAssignees });
11
+ return new StepResponse(updated, { issueId: input.issue.id, previousAssignees: input.issue.assignee_ids ?? [] });
12
+ }, async ({ issueId, previousAssignees }, { container }) => {
13
+ const svc = container.resolve("issueModuleService");
14
+ await svc.updateIssue(issueId, { assignee_ids: previousAssignees });
15
+ });
16
+ const logAssigneesStep = createStep("log-issue-assignees", async (input, { container }) => {
17
+ const svc = container.resolve("activityModuleService");
18
+ const action = input.assignee_ids.length > 0 ? "assigned" : "unassigned";
19
+ await svc.recordActivity({
20
+ entity_type: "issue", entity_id: input.entity_id,
21
+ actor_id: input.actor_id, action, workspace_id: input.workspace_id,
22
+ changes: { assignee_ids: { from: input.oldAssignees, to: input.assignee_ids } },
23
+ });
24
+ });
25
+ export const assignIssueWorkflow = createWorkflow("assign-issue", async (input) => {
26
+ const { issue, newAssignees, actor_id, oldAssignees } = await fetchIssueForAssignStep(input);
27
+ const updated = await setAssigneesStep({ issue, newAssignees, actor_id });
28
+ const activityInput = transform(updated, (u) => ({
29
+ entity_id: u.id, actor_id: actor_id ?? "system",
30
+ workspace_id: u.workspace_id, assignee_ids: newAssignees, oldAssignees,
31
+ }));
32
+ await logAssigneesStep(activityInput);
33
+ await emitEventStep({
34
+ name: "issue.assigned",
35
+ data: { issue_id: updated.id, workspace_id: updated.workspace_id, actor_id: actor_id ?? "system", assignee_ids: newAssignees },
36
+ });
37
+ return new WorkflowResponse(updated);
38
+ });
39
+ //# sourceMappingURL=assign-issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assign-issue.js","sourceRoot":"","sources":["../../src/workflows/assign-issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface CompleteSprintInput {
2
+ sprintId: string;
3
+ moveIncompleteToSprintId?: string | null;
4
+ actor_id?: string | null;
5
+ }
6
+ export declare const completeSprintWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<CompleteSprintInput, any>;
7
+ //# sourceMappingURL=complete-sprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete-sprint.d.ts","sourceRoot":"","sources":["../../src/workflows/complete-sprint.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAA;IAChB,wBAAwB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAgDD,eAAO,MAAM,sBAAsB,8IAkBlC,CAAA"}
@@ -0,0 +1,43 @@
1
+ import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, when, } from "@meridianjs/workflow-engine";
2
+ import { emitEventStep } from "./emit-event.js";
3
+ const fetchSprintStep = createStep("fetch-sprint-for-completion", async (input, { container }) => {
4
+ const svc = container.resolve("sprintModuleService");
5
+ const sprint = await svc.retrieveSprint(input.sprintId);
6
+ if (sprint.status !== "active") {
7
+ throw Object.assign(new Error(`Sprint "${sprint.name}" is not active (status: ${sprint.status})`), { status: 400 });
8
+ }
9
+ return sprint;
10
+ });
11
+ const markSprintCompletedStep = createStep("mark-sprint-completed", async (sprint, { container }) => {
12
+ const svc = container.resolve("sprintModuleService");
13
+ const updated = await svc.completeSprint(sprint.id);
14
+ return new StepResponse(updated, { sprintId: sprint.id, previousStatus: sprint.status });
15
+ }, async ({ sprintId, previousStatus }, { container }) => {
16
+ const svc = container.resolve("sprintModuleService");
17
+ await svc.updateSprint(sprintId, { status: previousStatus });
18
+ });
19
+ const moveIncompleteIssuesStep = createStep("move-incomplete-issues", async (_input, _ctx) => {
20
+ return { moved: 0 };
21
+ });
22
+ const logSprintCompletedStep = createStep("log-sprint-completed", async (input, { container }) => {
23
+ const svc = container.resolve("activityModuleService");
24
+ await svc.recordActivity({
25
+ entity_type: "sprint", entity_id: input.entity_id,
26
+ actor_id: input.actor_id, action: "completed", workspace_id: input.workspace_id,
27
+ });
28
+ });
29
+ export const completeSprintWorkflow = createWorkflow("complete-sprint", async (input) => {
30
+ const sprint = await fetchSprintStep(input);
31
+ const completed = await markSprintCompletedStep(sprint);
32
+ await when(!!input.moveIncompleteToSprintId, () => moveIncompleteIssuesStep({ fromSprintId: sprint.id, toSprintId: input.moveIncompleteToSprintId }));
33
+ const activityInput = transform(completed, (s) => ({
34
+ entity_id: s.id, actor_id: input.actor_id ?? "system", workspace_id: s.project_id,
35
+ }));
36
+ await logSprintCompletedStep(activityInput);
37
+ await emitEventStep({
38
+ name: "sprint.completed",
39
+ data: { sprint_id: completed.id, project_id: completed.project_id, actor_id: input.actor_id ?? "system" },
40
+ });
41
+ return new WorkflowResponse(completed);
42
+ });
43
+ //# sourceMappingURL=complete-sprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complete-sprint.js","sourceRoot":"","sources":["../../src/workflows/complete-sprint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface CreateIssueInput {
2
+ title: string;
3
+ project_id: string;
4
+ workspace_id: string;
5
+ description?: string | null;
6
+ type?: string;
7
+ priority?: string;
8
+ status?: string;
9
+ assignee_ids?: string[] | null;
10
+ reporter_id?: string | null;
11
+ parent_id?: string | null;
12
+ due_date?: Date;
13
+ estimate?: number | null;
14
+ sprint_id?: string | null;
15
+ task_list_id?: string | null;
16
+ actor_id?: string | null;
17
+ }
18
+ export declare const createIssueWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<CreateIssueInput, any>;
19
+ //# sourceMappingURL=create-issue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-issue.d.ts","sourceRoot":"","sources":["../../src/workflows/create-issue.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,QAAQ,CAAC,EAAE,IAAI,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAiCD,eAAO,MAAM,mBAAmB,2IAkB/B,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, } from "@meridianjs/workflow-engine";
2
+ import { emitEventStep } from "./emit-event.js";
3
+ const createIssueStep = createStep("create-issue", async (input, { container }) => {
4
+ const svc = container.resolve("issueModuleService");
5
+ const issue = await svc.createIssueInProject({
6
+ title: input.title, project_id: input.project_id, workspace_id: input.workspace_id,
7
+ description: input.description, type: input.type, priority: input.priority,
8
+ status: input.status, assignee_ids: input.assignee_ids ?? null,
9
+ reporter_id: input.reporter_id ?? null, parent_id: input.parent_id ?? null,
10
+ due_date: input.due_date, estimate: input.estimate ?? null,
11
+ sprint_id: input.sprint_id ?? null, task_list_id: input.task_list_id ?? null,
12
+ });
13
+ return new StepResponse(issue, { issueId: issue.id });
14
+ }, async ({ issueId }, { container }) => {
15
+ const svc = container.resolve("issueModuleService");
16
+ await svc.deleteIssue(issueId);
17
+ });
18
+ const logIssueCreatedStep = createStep("log-issue-created", async (input, { container }) => {
19
+ const svc = container.resolve("activityModuleService");
20
+ await svc.recordActivity({
21
+ entity_type: "issue", entity_id: input.entity_id,
22
+ actor_id: input.actor_id, action: "created", workspace_id: input.workspace_id,
23
+ });
24
+ });
25
+ export const createIssueWorkflow = createWorkflow("create-issue", async (input) => {
26
+ const issue = await createIssueStep(input);
27
+ const activityInput = transform(issue, (i) => ({
28
+ entity_id: i.id, actor_id: input.actor_id ?? "system", workspace_id: i.workspace_id,
29
+ }));
30
+ await logIssueCreatedStep(activityInput);
31
+ await emitEventStep({
32
+ name: "issue.created",
33
+ data: {
34
+ issue_id: issue.id, project_id: issue.project_id, workspace_id: issue.workspace_id,
35
+ actor_id: input.actor_id ?? "system",
36
+ assignee_ids: issue.assignee_ids ?? null, reporter_id: issue.reporter_id ?? null,
37
+ },
38
+ });
39
+ return new WorkflowResponse(issue);
40
+ });
41
+ //# sourceMappingURL=create-issue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-issue.js","sourceRoot":"","sources":["../../src/workflows/create-issue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface InitialStatus {
2
+ name: string;
3
+ key: string;
4
+ color: string;
5
+ category: "backlog" | "unstarted" | "started" | "completed" | "cancelled";
6
+ position: number;
7
+ }
8
+ export interface CreateProjectInput {
9
+ name: string;
10
+ workspace_id: string;
11
+ identifier?: string;
12
+ description?: string | null;
13
+ visibility?: "private" | "public" | "workspace";
14
+ icon?: string | null;
15
+ color?: string | null;
16
+ owner_id?: string | null;
17
+ actor_id?: string | null;
18
+ initial_statuses?: InitialStatus[];
19
+ }
20
+ export declare const createProjectWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<CreateProjectInput, any>;
21
+ //# sourceMappingURL=create-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.d.ts","sourceRoot":"","sources":["../../src/workflows/create-project.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,WAAW,GAAG,WAAW,CAAA;IACzE,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,YAAY,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,UAAU,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAA;IAC/C,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,gBAAgB,CAAC,EAAE,aAAa,EAAE,CAAA;CACnC;AAkFD,eAAO,MAAM,qBAAqB,6IAmBjC,CAAA"}
@@ -0,0 +1,80 @@
1
+ import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, } from "@meridianjs/workflow-engine";
2
+ import { emitEventStep } from "./emit-event.js";
3
+ const DEFAULT_STATUSES = [
4
+ { name: "Backlog", key: "backlog", color: "#94a3b8", category: "backlog", position: 0 },
5
+ { name: "Todo", key: "todo", color: "#64748b", category: "unstarted", position: 1 },
6
+ { name: "In Progress", key: "in_progress", color: "#6366f1", category: "started", position: 2 },
7
+ { name: "In Review", key: "in_review", color: "#f59e0b", category: "started", position: 3 },
8
+ { name: "Done", key: "done", color: "#10b981", category: "completed", position: 4 },
9
+ { name: "Cancelled", key: "cancelled", color: "#9ca3af", category: "cancelled", position: 5 },
10
+ ];
11
+ const validateIdentifierStep = createStep("validate-project-identifier", async (input, { container }) => {
12
+ const svc = container.resolve("projectModuleService");
13
+ const identifier = (input.identifier ?? svc.generateIdentifier(input.name)).toUpperCase();
14
+ const existing = await svc.retrieveProjectByIdentifier(identifier);
15
+ if (existing) {
16
+ throw Object.assign(new Error(`Identifier "${identifier}" is already taken`), { status: 409 });
17
+ }
18
+ return { ...input, identifier };
19
+ });
20
+ const createProjectStep = createStep("create-project", async (input, { container }) => {
21
+ const svc = container.resolve("projectModuleService");
22
+ const project = await svc.createProject({
23
+ name: input.name,
24
+ identifier: input.identifier,
25
+ description: input.description ?? null,
26
+ workspace_id: input.workspace_id,
27
+ visibility: input.visibility ?? "private",
28
+ status: "active",
29
+ icon: input.icon ?? null,
30
+ color: input.color ?? null,
31
+ owner_id: input.owner_id ?? null,
32
+ });
33
+ return new StepResponse(project, { projectId: project.id });
34
+ }, async ({ projectId }, { container }) => {
35
+ const svc = container.resolve("projectModuleService");
36
+ await svc.deleteProject(projectId);
37
+ });
38
+ const seedDefaultStatusesStep = createStep("seed-project-statuses", async (input, { container }) => {
39
+ const svc = container.resolve("projectModuleService");
40
+ const statuses = input.initial_statuses ?? DEFAULT_STATUSES;
41
+ const created = [];
42
+ for (const s of statuses) {
43
+ const status = await svc.createProjectStatus({
44
+ project_id: input.project_id,
45
+ name: s.name, key: s.key, color: s.color,
46
+ category: s.category, position: s.position,
47
+ });
48
+ created.push(status.id);
49
+ }
50
+ return new StepResponse(created, { statusIds: created });
51
+ }, async ({ statusIds }, { container }) => {
52
+ const svc = container.resolve("projectModuleService");
53
+ for (const id of statusIds)
54
+ await svc.deleteProjectStatus(id);
55
+ });
56
+ const logProjectCreatedStep = createStep("log-project-created", async (input, { container }) => {
57
+ const svc = container.resolve("activityModuleService");
58
+ await svc.recordActivity({
59
+ entity_type: "project", entity_id: input.entity_id,
60
+ actor_id: input.actor_id, action: "created", workspace_id: input.workspace_id,
61
+ });
62
+ });
63
+ export const createProjectWorkflow = createWorkflow("create-project", async (input) => {
64
+ const enriched = await validateIdentifierStep(input);
65
+ const project = await createProjectStep(enriched);
66
+ const seedInput = transform(project, (p) => ({
67
+ project_id: p.id, initial_statuses: input.initial_statuses,
68
+ }));
69
+ await seedDefaultStatusesStep(seedInput);
70
+ const activityInput = transform(project, (p) => ({
71
+ entity_id: p.id, actor_id: input.actor_id ?? "system", workspace_id: p.workspace_id,
72
+ }));
73
+ await logProjectCreatedStep(activityInput);
74
+ await emitEventStep({
75
+ name: "project.created",
76
+ data: { project_id: project.id, workspace_id: project.workspace_id, actor_id: input.actor_id ?? "system" },
77
+ });
78
+ return new WorkflowResponse(project);
79
+ });
80
+ //# sourceMappingURL=create-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-project.js","sourceRoot":"","sources":["../../src/workflows/create-project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { EventMessage } from "@meridianjs/types";
2
+ export declare const emitEventStep: (input: EventMessage<unknown>) => Promise<void>;
3
+ //# sourceMappingURL=emit-event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-event.d.ts","sourceRoot":"","sources":["../../src/workflows/emit-event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAErD,eAAO,MAAM,aAAa,iDAMzB,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { createStep } from "@meridianjs/workflow-engine";
2
+ export const emitEventStep = createStep("emit-event", async (event, { container }) => {
3
+ const eventBus = container.resolve("eventBus");
4
+ await eventBus.emit(event);
5
+ });
6
+ //# sourceMappingURL=emit-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emit-event.js","sourceRoot":"","sources":["../../src/workflows/emit-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAA;AAGxD,MAAM,CAAC,MAAM,aAAa,GAAG,UAAU,CACrC,YAAY,EACZ,KAAK,EAAE,KAAmB,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IAC3C,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAQ,CAAA;IACrD,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC5B,CAAC,CACF,CAAA"}
@@ -0,0 +1,7 @@
1
+ export interface UpdateIssueStatusInput {
2
+ issueId: string;
3
+ status: string;
4
+ actor_id?: string | null;
5
+ }
6
+ export declare const updateIssueStatusWorkflow: (container: import("@meridianjs/types").MeridianContainer) => import("@meridianjs/workflow-engine").WorkflowRunner<UpdateIssueStatusInput, any>;
7
+ //# sourceMappingURL=update-issue-status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-issue-status.d.ts","sourceRoot":"","sources":["../../src/workflows/update-issue-status.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAuCD,eAAO,MAAM,yBAAyB,iJAgBrC,CAAA"}
@@ -0,0 +1,38 @@
1
+ import { createStep, createWorkflow, StepResponse, WorkflowResponse, transform, } from "@meridianjs/workflow-engine";
2
+ import { emitEventStep } from "./emit-event.js";
3
+ const fetchIssueStep = createStep("fetch-issue-for-status-update", async (input, { container }) => {
4
+ const svc = container.resolve("issueModuleService");
5
+ const issue = await svc.retrieveIssue(input.issueId);
6
+ return { issue, newStatus: input.status, actor_id: input.actor_id, oldStatus: issue.status };
7
+ });
8
+ const setIssueStatusStep = createStep("set-issue-status", async (input, { container }) => {
9
+ const svc = container.resolve("issueModuleService");
10
+ const updated = await svc.updateIssue(input.issue.id, { status: input.newStatus });
11
+ return new StepResponse(updated, { issueId: input.issue.id, previousStatus: input.issue.status });
12
+ }, async ({ issueId, previousStatus }, { container }) => {
13
+ const svc = container.resolve("issueModuleService");
14
+ await svc.updateIssue(issueId, { status: previousStatus });
15
+ });
16
+ const logStatusChangedStep = createStep("log-issue-status-changed", async (input, { container }) => {
17
+ const svc = container.resolve("activityModuleService");
18
+ await svc.recordActivity({
19
+ entity_type: "issue", entity_id: input.entity_id,
20
+ actor_id: input.actor_id, action: "status_changed", workspace_id: input.workspace_id,
21
+ changes: { status: { from: input.oldStatus, to: input.newStatus } },
22
+ });
23
+ });
24
+ export const updateIssueStatusWorkflow = createWorkflow("update-issue-status", async (input) => {
25
+ const { issue, newStatus, actor_id, oldStatus } = await fetchIssueStep(input);
26
+ const updated = await setIssueStatusStep({ issue, newStatus, actor_id });
27
+ const activityInput = transform(updated, (u) => ({
28
+ entity_id: u.id, actor_id: actor_id ?? "system",
29
+ workspace_id: u.workspace_id, newStatus, oldStatus,
30
+ }));
31
+ await logStatusChangedStep(activityInput);
32
+ await emitEventStep({
33
+ name: "issue.status_changed",
34
+ data: { issue_id: updated.id, workspace_id: updated.workspace_id, actor_id: actor_id ?? "system", new_status: newStatus },
35
+ });
36
+ return new WorkflowResponse(updated);
37
+ });
38
+ //# sourceMappingURL=update-issue-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-issue-status.js","sourceRoot":"","sources":["../../src/workflows/update-issue-status.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,46 @@
1
+ {
2
+ "name": "@meridianjs/meridian",
3
+ "version": "0.1.0",
4
+ "description": "Default API routes, workflows, links, and subscribers for Meridian applications",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "type": "module",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "build": "tsc --outDir dist --declaration --declarationMap --sourceMap && node -e \"const fs=require('fs');fs.writeFileSync('dist/package.json',JSON.stringify({type:'module'}))\"",
17
+ "dev": "tsc --outDir dist --watch",
18
+ "typecheck": "tsc --noEmit",
19
+ "clean": "rm -rf dist",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "dependencies": {
23
+ "@meridianjs/framework-utils": "^0.1.0",
24
+ "@meridianjs/workflow-engine": "^0.1.0",
25
+ "@meridianjs/types": "^0.1.1",
26
+ "@meridianjs/workspace": "^0.1.0",
27
+ "@meridianjs/project": "^0.1.0",
28
+ "@meridianjs/issue": "^0.1.0",
29
+ "@meridianjs/sprint": "^0.1.0",
30
+ "multer": "^1.4.5-lts.1",
31
+ "zod": "^3.24.0"
32
+ },
33
+ "devDependencies": {
34
+ "@types/multer": "^1.4.12",
35
+ "@types/express": "^5.0.0",
36
+ "tsup": "^8.3.5",
37
+ "tsx": "4.21.0",
38
+ "typescript": "*"
39
+ },
40
+ "files": [
41
+ "dist"
42
+ ],
43
+ "publishConfig": {
44
+ "access": "public"
45
+ }
46
+ }