@meridianjs/meridian 0.1.20 → 0.1.22

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.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAIlE;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAgC,CAAA;AA2BvD,wBAA8B,QAAQ,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpF"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,mBAAmB,CAAA;AAIlE;;;GAGG;AACH,eAAO,MAAM,UAAU,QAAgC,CAAA;AAkCvD,wBAA8B,QAAQ,CAAC,GAAG,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAUpF"}
package/dist/index.js CHANGED
@@ -30,9 +30,23 @@ const CORE_MODULES = [
30
30
  "@meridianjs/app-role",
31
31
  "@meridianjs/org-calendar",
32
32
  ];
33
+ class ConsoleEmailService {
34
+ async send({ to, subject, text }) {
35
+ console.log(`[Email] → ${to} | ${subject}`);
36
+ if (text)
37
+ console.log(`[Email] ${text}`);
38
+ }
39
+ }
33
40
  export default async function register(ctx) {
34
41
  for (const resolve of CORE_MODULES) {
35
42
  await ctx.addModule({ resolve });
36
43
  }
44
+ // Register console fallback if no email provider module was configured
45
+ try {
46
+ ctx.container.resolve("emailService");
47
+ }
48
+ catch {
49
+ ctx.container.register({ emailService: new ConsoleEmailService() });
50
+ }
37
51
  }
38
52
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAE9D;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAEvD;;;;;;;GAOG;AACH,MAAM,YAAY,GAAG;IACnB,kBAAkB;IAClB,uBAAuB;IACvB,kBAAkB;IAClB,qBAAqB;IACrB,mBAAmB;IACnB,oBAAoB;IACpB,sBAAsB;IACtB,0BAA0B;IAC1B,wBAAwB;IACxB,8BAA8B;IAC9B,yBAAyB;IACzB,4BAA4B;IAC5B,sBAAsB;IACtB,0BAA0B;CAC3B,CAAA;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,GAA8B;IACnE,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAClC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,IAAI,MAAM,WAAW,CAAA;AAG5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;AAE9D;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;AAEvD;;;;;;;GAOG;AACH,MAAM,YAAY,GAAG;IACnB,kBAAkB;IAClB,uBAAuB;IACvB,kBAAkB;IAClB,qBAAqB;IACrB,mBAAmB;IACnB,oBAAoB;IACpB,sBAAsB;IACtB,0BAA0B;IAC1B,wBAAwB;IACxB,8BAA8B;IAC9B,yBAAyB;IACzB,4BAA4B;IAC5B,sBAAsB;IACtB,0BAA0B;CAC3B,CAAA;AAED,MAAM,mBAAmB;IACvB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAkD;QAC9E,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,OAAO,EAAE,CAAC,CAAA;QAC3C,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,EAAE,CAAC,CAAA;IAC5C,CAAC;CACF;AAED,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,QAAQ,CAAC,GAA8B;IACnE,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,MAAM,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAClC,CAAC;IACD,uEAAuE;IACvE,IAAI,CAAC;QACH,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,cAAc,CAAC,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,IAAI,mBAAmB,EAAE,EAAE,CAAC,CAAA;IACrE,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function emailHtml(message: string): string;
2
+ //# sourceMappingURL=_email-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_email-helper.d.ts","sourceRoot":"","sources":["../../src/subscribers/_email-helper.ts"],"names":[],"mappings":"AAAA,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMjD"}
@@ -0,0 +1,8 @@
1
+ export function emailHtml(message) {
2
+ return `<div style="font-family:sans-serif;color:#1a1a1a;max-width:560px;padding:24px">
3
+ <p>${message}</p>
4
+ <hr style="border:none;border-top:1px solid #e5e7eb;margin:24px 0"/>
5
+ <p style="font-size:12px;color:#6b7280">Sent by Meridian</p>
6
+ </div>`;
7
+ }
8
+ //# sourceMappingURL=_email-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_email-helper.js","sourceRoot":"","sources":["../../src/subscribers/_email-helper.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,OAAO;SACA,OAAO;;;SAGP,CAAA;AACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"comment-created.d.ts","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzE,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA6B7G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA+C,CAAA"}
1
+ {"version":3,"file":"comment-created.d.ts","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,kBAAkB;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,kBAAkB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAgD7G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA+C,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { sseManager } from "@meridianjs/framework";
2
+ import { emailHtml } from "./_email-helper.js";
2
3
  export default async function handler({ event, container }) {
3
4
  const data = event.data;
4
5
  const issueService = container.resolve("issueModuleService");
@@ -25,6 +26,25 @@ export default async function handler({ event, container }) {
25
26
  comment_id: data.comment_id,
26
27
  issue_id: data.issue_id,
27
28
  });
29
+ // ── Email ──────────────────────────────────────────────────────────────────
30
+ try {
31
+ const emailService = container.resolve("emailService");
32
+ const userService = container.resolve("userModuleService");
33
+ await Promise.allSettled([...recipients].map(async (userId) => {
34
+ const user = await userService.retrieveUser(userId);
35
+ if (!user?.email)
36
+ return;
37
+ await emailService.send({
38
+ to: user.email,
39
+ subject: `New comment on [${issue.identifier}]: ${issue.title}`,
40
+ text: `A comment was added on issue ${issue.identifier}: "${issue.title}" that you're involved with.`,
41
+ html: emailHtml(`A comment was added on issue <strong>${issue.identifier}</strong>: "${issue.title}" that you're involved with.`),
42
+ });
43
+ }));
44
+ }
45
+ catch (err) {
46
+ console.error("[email] comment.created:", err);
47
+ }
28
48
  }
29
49
  export const config = { event: "comment.created" };
30
50
  //# sourceMappingURL=comment-created.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"comment-created.js","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAQlD,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;IAEF,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,EAAE;QAC1D,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA"}
1
+ {"version":3,"file":"comment-created.js","sourceRoot":"","sources":["../../src/subscribers/comment-created.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAQ9C,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;IAEF,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,YAAY,EAAE,iBAAiB,EAAE;QAC1D,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAA;IAEF,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC7D,MAAM,WAAW,GAAI,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAElE,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC5D,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACnD,IAAI,CAAC,IAAI,EAAE,KAAK;gBAAE,OAAM;YACxB,MAAM,YAAY,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,KAAK;gBACd,OAAO,EAAE,mBAAmB,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,KAAK,EAAE;gBAC/D,IAAI,EAAE,gCAAgC,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,KAAK,8BAA8B;gBACrG,IAAI,EAAE,SAAS,CAAC,wCAAwC,KAAK,CAAC,UAAU,eAAe,KAAK,CAAC,KAAK,8BAA8B,CAAC;aAClI,CAAC,CAAA;QACJ,CAAC,CAAC,CAAC,CAAA;IACL,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAA;IAChD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA"}
@@ -1 +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;AAGzE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,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,CAuB5G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA8C,CAAA"}
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;AAIzE,UAAU,iBAAiB;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,UAAU,EAAE,MAAM,CAAA;IAClB,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,CAgD5G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA8C,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { sseManager } from "@meridianjs/framework";
2
+ import { emailHtml } from "./_email-helper.js";
2
3
  export default async function handler({ event, container }) {
3
4
  const data = event.data;
4
5
  if (!data.assignee_ids?.length)
@@ -16,6 +17,29 @@ export default async function handler({ event, container }) {
16
17
  issue_id: data.issue_id,
17
18
  assignee_ids: data.assignee_ids,
18
19
  });
20
+ // ── Email ──────────────────────────────────────────────────────────────────
21
+ try {
22
+ const emailService = container.resolve("emailService");
23
+ const userService = container.resolve("userModuleService");
24
+ const issueService = container.resolve("issueModuleService");
25
+ const issue = await issueService.retrieveIssue(data.issue_id);
26
+ await Promise.allSettled(data.assignee_ids
27
+ .filter(id => id !== data.actor_id)
28
+ .map(async (userId) => {
29
+ const user = await userService.retrieveUser(userId);
30
+ if (!user?.email)
31
+ return;
32
+ await emailService.send({
33
+ to: user.email,
34
+ subject: `[${issue.identifier}] You've been assigned: ${issue.title}`,
35
+ text: `You've been assigned to issue ${issue.identifier}: "${issue.title}".`,
36
+ html: emailHtml(`You've been assigned to <strong>${issue.identifier}</strong>: "${issue.title}".`),
37
+ });
38
+ }));
39
+ }
40
+ catch (err) {
41
+ console.error("[email] issue.assigned:", err);
42
+ }
19
43
  }
20
44
  export const config = { event: "issue.assigned" };
21
45
  //# sourceMappingURL=issue-assigned.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"issue-assigned.js","sourceRoot":"","sources":["../../src/subscribers/issue-assigned.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAUlD,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;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC1C,CAAC,CACH,CACJ,CAAA;IAED,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,EAAE;QACxD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA"}
1
+ {"version":3,"file":"issue-assigned.js","sourceRoot":"","sources":["../../src/subscribers/issue-assigned.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAU9C,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;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC1C,CAAC,CACH,CACJ,CAAA;IAED,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB,EAAE;QACxD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,YAAY,EAAE,IAAI,CAAC,YAAY;KAChC,CAAC,CAAA;IAEF,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC7D,MAAM,WAAW,GAAI,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAClE,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,oBAAoB,CAAQ,CAAA;QACnE,MAAM,KAAK,GAAG,MAAM,YAAY,CAAC,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QAE7D,MAAM,OAAO,CAAC,UAAU,CACtB,IAAI,CAAC,YAAY;aACd,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,CAAC;aAClC,GAAG,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;YAC5B,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,MAAM,CAAC,CAAA;YACnD,IAAI,CAAC,IAAI,EAAE,KAAK;gBAAE,OAAM;YACxB,MAAM,YAAY,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,KAAK;gBACd,OAAO,EAAE,IAAI,KAAK,CAAC,UAAU,2BAA2B,KAAK,CAAC,KAAK,EAAE;gBACrE,IAAI,EAAE,iCAAiC,KAAK,CAAC,UAAU,MAAM,KAAK,CAAC,KAAK,IAAI;gBAC5E,IAAI,EAAE,SAAS,CAAC,mCAAmC,KAAK,CAAC,UAAU,eAAe,KAAK,CAAC,KAAK,IAAI,CAAC;aACnG,CAAC,CAAA;QACJ,CAAC,CAAC,CACL,CAAA;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,GAAG,CAAC,CAAA;IAC/C,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAA"}
@@ -1 +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;AAGzE,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,CAqB3G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA6C,CAAA"}
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;AAIzE,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,CAmD3G;AAED,eAAO,MAAM,MAAM,EAAE,gBAA6C,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { sseManager } from "@meridianjs/framework";
2
+ import { emailHtml } from "./_email-helper.js";
2
3
  export default async function handler({ event, container }) {
3
4
  const notifService = container.resolve("notificationModuleService");
4
5
  const data = event.data;
@@ -18,6 +19,37 @@ export default async function handler({ event, container }) {
18
19
  issue_id: data.issue_id,
19
20
  project_id: data.project_id,
20
21
  });
22
+ // ── Email ──────────────────────────────────────────────────────────────────
23
+ try {
24
+ const emailService = container.resolve("emailService");
25
+ const userService = container.resolve("userModuleService");
26
+ const issueService = container.resolve("issueModuleService");
27
+ const issue = await issueService.retrieveIssue(data.issue_id);
28
+ const recipientIds = new Set();
29
+ if (data.assignee_ids)
30
+ data.assignee_ids.forEach(id => recipientIds.add(id));
31
+ if (data.reporter_id && data.reporter_id !== data.actor_id)
32
+ recipientIds.add(data.reporter_id);
33
+ await Promise.allSettled([...recipientIds].map(async (userId) => {
34
+ const user = await userService.retrieveUser(userId);
35
+ if (!user?.email)
36
+ return;
37
+ const isAssignee = data.assignee_ids?.includes(userId);
38
+ await emailService.send({
39
+ to: user.email,
40
+ subject: `New issue: [${issue.identifier}] ${issue.title}`,
41
+ text: isAssignee
42
+ ? `You've been assigned to new issue ${issue.identifier}: "${issue.title}".`
43
+ : `A new issue ${issue.identifier} was created: "${issue.title}".`,
44
+ html: emailHtml(isAssignee
45
+ ? `You've been assigned to new issue <strong>${issue.identifier}</strong>: "${issue.title}".`
46
+ : `A new issue <strong>${issue.identifier}</strong> was created: "${issue.title}".`),
47
+ });
48
+ }));
49
+ }
50
+ catch (err) {
51
+ console.error("[email] issue.created:", err);
52
+ }
21
53
  }
22
54
  export const config = { event: "issue.created" };
23
55
  //# sourceMappingURL=issue-created.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"issue-created.js","sourceRoot":"","sources":["../../src/subscribers/issue-created.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAWlD,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;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC1C,CAAC,CACH,CAAC,CAAA;IAEF,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,EAAE;QACvD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,eAAe,EAAE,CAAA"}
1
+ {"version":3,"file":"issue-created.js","sourceRoot":"","sources":["../../src/subscribers/issue-created.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"project-member-added.d.ts","sourceRoot":"","sources":["../../src/subscribers/project-member-added.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzE,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBjH;AAED,eAAO,MAAM,MAAM,EAAE,gBAAoD,CAAA"}
1
+ {"version":3,"file":"project-member-added.d.ts","sourceRoot":"","sources":["../../src/subscribers/project-member-added.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAIzE,UAAU,sBAAsB;IAC9B,UAAU,EAAE,MAAM,CAAA;IAClB,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,sBAAsB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAqCjH;AAED,eAAO,MAAM,MAAM,EAAE,gBAAoD,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import { sseManager } from "@meridianjs/framework";
2
+ import { emailHtml } from "./_email-helper.js";
2
3
  export default async function handler({ event, container }) {
3
4
  const data = event.data;
4
5
  if (!data.user_id || data.user_id === data.actor_id)
@@ -17,6 +18,23 @@ export default async function handler({ event, container }) {
17
18
  project_id: data.project_id,
18
19
  user_id: data.user_id,
19
20
  });
21
+ // ── Email ──────────────────────────────────────────────────────────────────
22
+ try {
23
+ const emailService = container.resolve("emailService");
24
+ const userService = container.resolve("userModuleService");
25
+ const user = await userService.retrieveUser(data.user_id);
26
+ if (user?.email) {
27
+ await emailService.send({
28
+ to: user.email,
29
+ subject: `You've been added to project "${data.project_name}"`,
30
+ text: `You've been added to the project "${data.project_name}".`,
31
+ html: emailHtml(`You've been added to the project <strong>"${data.project_name}"</strong>.`),
32
+ });
33
+ }
34
+ }
35
+ catch (err) {
36
+ console.error("[email] project.member_added:", err);
37
+ }
20
38
  }
21
39
  export const config = { event: "project.member_added" };
22
40
  //# sourceMappingURL=project-member-added.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"project-member-added.js","sourceRoot":"","sources":["../../src/subscribers/project-member-added.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAUlD,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAA0C;IAChG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ;QAAE,OAAM;IAE3D,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAE1E,MAAM,YAAY,CAAC,kBAAkB,CAAC;QACpC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,kCAAkC,IAAI,CAAC,YAAY,GAAG;QAC/D,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC1C,CAAC,CAAA;IAEF,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,EAAE;QAC9D,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAA"}
1
+ {"version":3,"file":"project-member-added.js","sourceRoot":"","sources":["../../src/subscribers/project-member-added.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAU9C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAA0C;IAChG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ;QAAE,OAAM;IAE3D,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,2BAA2B,CAAQ,CAAA;IAE1E,MAAM,YAAY,CAAC,kBAAkB,CAAC;QACpC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,WAAW,EAAE,SAAS;QACtB,SAAS,EAAE,IAAI,CAAC,UAAU;QAC1B,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,kCAAkC,IAAI,CAAC,YAAY,GAAG;QAC/D,YAAY,EAAE,IAAI,CAAC,YAAY;QAC/B,QAAQ,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;KAC1C,CAAC,CAAA;IAEF,UAAU,CAAC,SAAS,CAAC,IAAI,CAAC,YAAY,EAAE,sBAAsB,EAAE;QAC9D,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC,CAAA;IAEF,8EAA8E;IAC9E,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAC7D,MAAM,WAAW,GAAI,SAAS,CAAC,OAAO,CAAC,mBAAmB,CAAQ,CAAA;QAClE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QACzD,IAAI,IAAI,EAAE,KAAK,EAAE,CAAC;YAChB,MAAM,YAAY,CAAC,IAAI,CAAC;gBACtB,EAAE,EAAE,IAAI,CAAC,KAAK;gBACd,OAAO,EAAE,iCAAiC,IAAI,CAAC,YAAY,GAAG;gBAC9D,IAAI,EAAE,qCAAqC,IAAI,CAAC,YAAY,IAAI;gBAChE,IAAI,EAAE,SAAS,CAAC,6CAA6C,IAAI,CAAC,YAAY,aAAa,CAAC;aAC7F,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAA;IACrD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,sBAAsB,EAAE,CAAA"}
@@ -0,0 +1,12 @@
1
+ import type { SubscriberArgs, SubscriberConfig } from "@meridianjs/types";
2
+ interface WorkspaceMemberInvitedData {
3
+ invitation_id: string;
4
+ workspace_id: string;
5
+ email: string | null;
6
+ role: string;
7
+ created_by: string;
8
+ }
9
+ export default function handler({ event, container }: SubscriberArgs<WorkspaceMemberInvitedData>): Promise<void>;
10
+ export declare const config: SubscriberConfig;
11
+ export {};
12
+ //# sourceMappingURL=workspace-member-invited.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-member-invited.d.ts","sourceRoot":"","sources":["../../src/subscribers/workspace-member-invited.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAGzE,UAAU,0BAA0B;IAClC,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;CACnB;AAED,wBAA8B,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,cAAc,CAAC,0BAA0B,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CA8BrH;AAED,eAAO,MAAM,MAAM,EAAE,gBAAwD,CAAA"}
@@ -0,0 +1,30 @@
1
+ import { emailHtml } from "./_email-helper.js";
2
+ export default async function handler({ event, container }) {
3
+ const data = event.data;
4
+ if (!data.email)
5
+ return; // link-only invite — no address to send to
6
+ try {
7
+ const emailService = container.resolve("emailService");
8
+ const invitationSvc = container.resolve("invitationModuleService");
9
+ const workspaceSvc = container.resolve("workspaceModuleService");
10
+ const [invitation, workspace] = await Promise.all([
11
+ invitationSvc.retrieveInvitation(data.invitation_id),
12
+ workspaceSvc.retrieveWorkspace(data.workspace_id),
13
+ ]);
14
+ const appUrl = process.env.APP_URL ?? "http://localhost:9000";
15
+ const inviteLink = `${appUrl}/auth/invite/${invitation.token}`;
16
+ await emailService.send({
17
+ to: data.email,
18
+ subject: `You've been invited to join "${workspace.name}" on Meridian`,
19
+ text: `You've been invited to join "${workspace.name}" as a ${data.role}.\n\nAccept your invitation here: ${inviteLink}`,
20
+ html: emailHtml(`You've been invited to join <strong>${workspace.name}</strong> as a <strong>${data.role}</strong>.<br/><br/>` +
21
+ `<a href="${inviteLink}" style="display:inline-block;padding:10px 20px;background:#4f46e5;color:#fff;text-decoration:none;border-radius:6px;font-weight:600">Accept Invitation</a><br/><br/>` +
22
+ `Or copy this link: <a href="${inviteLink}">${inviteLink}</a>`),
23
+ });
24
+ }
25
+ catch (err) {
26
+ console.error("[email] workspace.member_invited:", err);
27
+ }
28
+ }
29
+ export const config = { event: "workspace.member_invited" };
30
+ //# sourceMappingURL=workspace-member-invited.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace-member-invited.js","sourceRoot":"","sources":["../../src/subscribers/workspace-member-invited.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAU9C,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAA8C;IACpG,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAA;IACvB,IAAI,CAAC,IAAI,CAAC,KAAK;QAAE,OAAM,CAAC,2CAA2C;IAEnE,IAAI,CAAC;QACH,MAAM,YAAY,GAAM,SAAS,CAAC,OAAO,CAAC,cAAc,CAAQ,CAAA;QAChE,MAAM,aAAa,GAAK,SAAS,CAAC,OAAO,CAAC,yBAAyB,CAAQ,CAAA;QAC3E,MAAM,YAAY,GAAM,SAAS,CAAC,OAAO,CAAC,wBAAwB,CAAQ,CAAA;QAE1E,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAChD,aAAa,CAAC,kBAAkB,CAAC,IAAI,CAAC,aAAa,CAAC;YACpD,YAAY,CAAC,iBAAiB,CAAC,IAAI,CAAC,YAAY,CAAC;SAClD,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,uBAAuB,CAAA;QAC7D,MAAM,UAAU,GAAG,GAAG,MAAM,gBAAgB,UAAU,CAAC,KAAK,EAAE,CAAA;QAE9D,MAAM,YAAY,CAAC,IAAI,CAAC;YACtB,EAAE,EAAE,IAAI,CAAC,KAAK;YACd,OAAO,EAAE,gCAAgC,SAAS,CAAC,IAAI,eAAe;YACtE,IAAI,EAAE,gCAAgC,SAAS,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,qCAAqC,UAAU,EAAE;YACxH,IAAI,EAAE,SAAS,CACb,uCAAuC,SAAS,CAAC,IAAI,0BAA0B,IAAI,CAAC,IAAI,sBAAsB;gBAC9G,YAAY,UAAU,uKAAuK;gBAC7L,+BAA+B,UAAU,KAAK,UAAU,MAAM,CAC/D;SACF,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAA;IACzD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAqB,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@meridianjs/meridian",
3
- "version": "0.1.20",
3
+ "version": "0.1.22",
4
4
  "description": "Default API routes, workflows, links, and subscribers for Meridian applications",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.js",