@infuro/cms-core 1.0.33 → 1.0.35

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 (164) hide show
  1. package/README.md +22 -6
  2. package/dist/OrderTrackPage-W3J6WIG2.js +426 -0
  3. package/dist/OrderTrackPage-Z6FCJQYY.cjs +428 -0
  4. package/dist/admin.cjs +34072 -20487
  5. package/dist/admin.d.cts +191 -9
  6. package/dist/admin.d.ts +191 -9
  7. package/dist/admin.js +33913 -20423
  8. package/dist/api.cjs +123 -16508
  9. package/dist/api.d.cts +633 -3
  10. package/dist/api.d.ts +633 -3
  11. package/dist/api.js +14 -16519
  12. package/dist/auth.cjs +196 -955
  13. package/dist/auth.d.cts +201 -42
  14. package/dist/auth.d.ts +201 -42
  15. package/dist/auth.js +4 -888
  16. package/dist/chunk-2XE4X74C.js +29602 -0
  17. package/dist/chunk-3DZRIZOD.cjs +52 -0
  18. package/dist/chunk-3KPNTQBV.cjs +620 -0
  19. package/dist/chunk-46GKADYE.cjs +84 -0
  20. package/dist/chunk-4TRPKBKO.js +589 -0
  21. package/dist/chunk-5ELSW2UP.js +150 -0
  22. package/dist/chunk-6KPQWRFW.js +171 -0
  23. package/dist/chunk-7NMT3GBR.cjs +29 -0
  24. package/dist/chunk-7YIBMQDR.cjs +86 -0
  25. package/dist/chunk-BGJAV67S.cjs +29710 -0
  26. package/dist/chunk-CNTSLED2.cjs +559 -0
  27. package/dist/chunk-CRFV5WJK.js +16 -0
  28. package/dist/chunk-D5FBNKQM.cjs +104 -0
  29. package/dist/chunk-EF2JBPDM.js +114 -0
  30. package/dist/chunk-EQPITOP6.js +543 -0
  31. package/dist/chunk-GO7PPYNU.js +76 -0
  32. package/dist/chunk-HF3L2GIT.cjs +194 -0
  33. package/dist/chunk-J7XHLOLO.js +830 -0
  34. package/dist/chunk-JBRR5UYL.js +87 -0
  35. package/dist/chunk-JC6DLWTE.js +21 -0
  36. package/dist/chunk-JHF4YYRC.cjs +188 -0
  37. package/dist/chunk-JXF23MPG.js +25 -0
  38. package/dist/chunk-MQBT33IV.js +48 -0
  39. package/dist/chunk-N44BJZ4C.cjs +123 -0
  40. package/dist/chunk-OOTLNH63.cjs +18 -0
  41. package/dist/chunk-PAMVINEX.cjs +577 -0
  42. package/dist/chunk-PNOKNSG2.cjs +222 -0
  43. package/dist/chunk-QM733NUK.js +186 -0
  44. package/dist/chunk-R73BKDRO.cjs +90 -0
  45. package/dist/chunk-SHUYVCID.js +4 -0
  46. package/dist/chunk-SYBOCAWB.js +97 -0
  47. package/dist/chunk-TDV6EJHV.js +192 -0
  48. package/dist/chunk-TFUOHI37.cjs +839 -0
  49. package/dist/chunk-TIAEXJLI.cjs +182 -0
  50. package/dist/chunk-UPLVMVRX.cjs +23 -0
  51. package/dist/chunk-USNT2KNT.cjs +6 -0
  52. package/dist/chunk-WEMDMVHQ.js +216 -0
  53. package/dist/chunk-XDSNZUW7.js +564 -0
  54. package/dist/chunk-XQ3QUHWR.cjs +83 -0
  55. package/dist/chunk-XW5ATPRW.cjs +155 -0
  56. package/dist/chunk-ZQ4X6OAU.js +82 -0
  57. package/dist/chunk-ZSVCP6N3.js +83 -0
  58. package/dist/cli.cjs +142 -84
  59. package/dist/cli.js +101 -27
  60. package/dist/email-FKR4FXFI.js +5 -0
  61. package/dist/email-KVKVPNCL.cjs +58 -0
  62. package/dist/email-queue-CGZBVVAS.js +2 -0
  63. package/dist/email-queue-TPZWLTIV.cjs +23 -0
  64. package/dist/erp-config-enabled-CUMQ6N2V.cjs +11 -0
  65. package/dist/erp-config-enabled-T37X7T34.js +2 -0
  66. package/dist/erp-order-invoice-3YISSOWW.js +3 -0
  67. package/dist/erp-order-invoice-ZR5F2KTA.cjs +12 -0
  68. package/dist/event-order-defaults-6E543227.js +2 -0
  69. package/dist/event-order-defaults-DUGDVGJI.cjs +39 -0
  70. package/dist/event-order-notifications-5GSAOYVS.cjs +27 -0
  71. package/dist/event-order-notifications-IIIF23D5.js +10 -0
  72. package/dist/hooks.cjs +259 -132
  73. package/dist/hooks.d.cts +42 -1
  74. package/dist/hooks.d.ts +42 -1
  75. package/dist/hooks.js +234 -91
  76. package/dist/index.cjs +3884 -21070
  77. package/dist/index.d.cts +2255 -749
  78. package/dist/index.d.ts +2255 -749
  79. package/dist/index.js +1925 -19891
  80. package/dist/interpolate-WAKPN56R.cjs +11 -0
  81. package/dist/interpolate-WDUWDF3I.js +2 -0
  82. package/dist/layout-36UFTHC5.cjs +11 -0
  83. package/dist/layout-AOBN26XG.js +2 -0
  84. package/dist/migrations/1778660000004-CreateCustomerAndCustomerContacts.ts +99 -0
  85. package/dist/migrations/1778660000005-AddCustomerIdToVendorCustomers.ts +39 -0
  86. package/dist/migrations/1778660000006-UpdateVendorCustomersContactNullable.ts +36 -0
  87. package/dist/migrations/1778660000007-VendorOwnerCustomerContactsPermission.ts +39 -0
  88. package/dist/migrations/1779300000000-VendorOwnerContactsPermission.ts +39 -0
  89. package/dist/migrations/1779400000000-AddCustomerContactIdToOrders.ts +33 -0
  90. package/dist/migrations/1779400000000-ConvertStatusToEnum.ts +142 -0
  91. package/dist/migrations/1779400000000-SeedDefaultCurrencies.ts +33 -0
  92. package/dist/migrations/1779500000000-VendorRolesAndPermissions.ts +102 -0
  93. package/dist/migrations/1779600000000-VendorRegistrationProfile.ts +52 -0
  94. package/dist/migrations/1779700000000-CollectionIsCatalog.ts +22 -0
  95. package/dist/migrations/1779710000000-CollectionPlatformCatalog.ts +60 -0
  96. package/dist/migrations/1779720000000-ProductCategoryPlatformCatalog.ts +157 -0
  97. package/dist/migrations/1779800000000-EventsAndEventProducts.ts +173 -0
  98. package/dist/migrations/1779810000000-BackfillVendorRoleEventsPermissions.ts +38 -0
  99. package/dist/migrations/1779820000000-FixProductsCategoryForeignKey.ts +70 -0
  100. package/dist/migrations/1779830000000-ProductTitleColumn.ts +32 -0
  101. package/dist/migrations/1779840000000-EventAboutAndVisibilityFields.ts +34 -0
  102. package/dist/migrations/1779850000000-EventCityCountrySplit.ts +43 -0
  103. package/dist/migrations/1779860000000-CreateCombos.ts +140 -0
  104. package/dist/migrations/1780100000000-OrderAttendeesEventId.ts +55 -0
  105. package/dist/migrations/1780110000000-EventContactFormId.ts +49 -0
  106. package/dist/migrations/1780130000000-ProductVariants.ts +54 -0
  107. package/dist/migrations/1780140000000-EventManagementEnhancements.ts +44 -0
  108. package/dist/migrations/1780160000000-EventRegistrationGstProductContactForm.ts +79 -0
  109. package/dist/migrations/1780170000000-ComboCurrencyPrices.ts +20 -0
  110. package/dist/migrations/1781110000000-VendorOwnerCombosPermission.ts +38 -0
  111. package/dist/migrations/1781120000000-RefundPoliciesAndRequests.ts +225 -0
  112. package/dist/migrations/1781130000000-CreateAttendees.ts +44 -0
  113. package/dist/migrations/1781140000000-EventOrderNotifications.ts +29 -0
  114. package/dist/migrations/1781150000000-EventNamedLists.ts +28 -0
  115. package/dist/migrations/1781160000000-RefundPolicyEventTiers.ts +27 -0
  116. package/dist/migrations/1781170000000-EventRefundPolicy.ts +42 -0
  117. package/dist/migrations/1781180000000-RemoveCartItemsUniqueConstraint.ts +15 -0
  118. package/dist/migrations/1781190000000-RenameProductTaxesToProductConfig.ts +84 -0
  119. package/dist/migrations/1781200000000-VendorOwnerProductConfigPermissions.ts +51 -0
  120. package/dist/migrations/1781210000000-VendorRoleProductConfigPermissions.ts +46 -0
  121. package/dist/migrations/helpers/vendor-role-seed.ts +243 -0
  122. package/dist/paid-order-erp-3USEG6WL.js +3 -0
  123. package/dist/paid-order-erp-FSQ3GSXE.cjs +12 -0
  124. package/dist/pg-boss-service-4XF2TQ2E.js +2 -0
  125. package/dist/pg-boss-service-L6MTF4EQ.cjs +15 -0
  126. package/dist/razorpay-KLO2KNCB.js +49 -0
  127. package/dist/razorpay-U23LGY72.cjs +56 -0
  128. package/dist/rbac-debug-db-D7ME7QUY.cjs +35 -0
  129. package/dist/rbac-debug-db-MTCTVNNM.js +33 -0
  130. package/dist/sms-defaults-2NL24H57.js +2 -0
  131. package/dist/sms-defaults-KCOPKQBA.cjs +19 -0
  132. package/dist/stripe-4FD27QVJ.js +51 -0
  133. package/dist/stripe-VU6OEG2D.cjs +57 -0
  134. package/dist/theme.cjs +31 -59
  135. package/dist/theme.d.cts +78 -3
  136. package/dist/theme.d.ts +78 -3
  137. package/dist/theme.js +23 -20
  138. package/dist/vendor-invite-status-77O7ZQ3U.cjs +19 -0
  139. package/dist/vendor-invite-status-PWJ3DE76.js +2 -0
  140. package/dist/whatsapp-queue-3DXA4MXU.js +2 -0
  141. package/dist/whatsapp-queue-KG65MXD5.cjs +15 -0
  142. package/package.json +147 -141
  143. package/dist/admin.cjs.map +0 -1
  144. package/dist/admin.js.map +0 -1
  145. package/dist/api.cjs.map +0 -1
  146. package/dist/api.js.map +0 -1
  147. package/dist/auth.cjs.map +0 -1
  148. package/dist/auth.js.map +0 -1
  149. package/dist/cli.cjs.map +0 -1
  150. package/dist/cli.js.map +0 -1
  151. package/dist/config-DJ5CmQvS.d.cts +0 -8
  152. package/dist/config-DJ5CmQvS.d.ts +0 -8
  153. package/dist/hooks.cjs.map +0 -1
  154. package/dist/hooks.js.map +0 -1
  155. package/dist/index-DWd5Gjc4.d.ts +0 -582
  156. package/dist/index-rZTnpK7y.d.cts +0 -582
  157. package/dist/index.cjs.map +0 -1
  158. package/dist/index.js.map +0 -1
  159. package/dist/theme.cjs.map +0 -1
  160. package/dist/theme.js.map +0 -1
  161. package/dist/types-DCVaXlPV.d.cts +0 -78
  162. package/dist/types-DCVaXlPV.d.ts +0 -78
  163. package/dist/vendor-scope-DTYhJk_I.d.cts +0 -129
  164. package/dist/vendor-scope-DTYhJk_I.d.ts +0 -129
@@ -0,0 +1,155 @@
1
+ 'use strict';
2
+
3
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
4
+
5
+ // src/plugins/email/email-queue.ts
6
+ var EMAIL_QUEUE_NAME = "email";
7
+ function registerEmailQueueProcessor(cms) {
8
+ const queue = cms.getPlugin("queue");
9
+ const email = cms.getPlugin("email");
10
+ if (!queue || !email) return;
11
+ queue.registerProcessor(EMAIL_QUEUE_NAME, async (data) => {
12
+ const payload = data;
13
+ const { to, templateName, ctx, subject, html, text } = payload;
14
+ if (!to) return;
15
+ if (templateName && ctx) {
16
+ const rendered = email.renderTemplate(templateName, ctx);
17
+ await email.send({
18
+ to,
19
+ subject: rendered.subject,
20
+ html: rendered.html,
21
+ text: rendered.text
22
+ });
23
+ } else if (subject != null && html != null) {
24
+ await email.send({
25
+ to,
26
+ subject,
27
+ html,
28
+ text
29
+ });
30
+ }
31
+ });
32
+ }
33
+ chunkUSNT2KNT_cjs.__name(registerEmailQueueProcessor, "registerEmailQueueProcessor");
34
+ async function queueEmail(cms, payload) {
35
+ const queue = cms.getPlugin("queue");
36
+ if (queue) {
37
+ await queue.add(EMAIL_QUEUE_NAME, payload);
38
+ return;
39
+ }
40
+ const email = cms.getPlugin("email");
41
+ if (email && payload.templateName && payload.ctx) {
42
+ const rendered = email.renderTemplate(payload.templateName, payload.ctx);
43
+ await email.send({
44
+ to: payload.to,
45
+ subject: rendered.subject,
46
+ html: rendered.html,
47
+ text: rendered.text
48
+ });
49
+ } else if (email && payload.subject != null && payload.html != null) {
50
+ await email.send({
51
+ to: payload.to,
52
+ subject: payload.subject,
53
+ html: payload.html,
54
+ text: payload.text
55
+ });
56
+ }
57
+ }
58
+ chunkUSNT2KNT_cjs.__name(queueEmail, "queueEmail");
59
+ async function queueOrderPlacedEmails(cms, payload) {
60
+ const { orderNumber, total, subtotal, tax, currency, customerName, customerEmail, salesTeamEmails, companyDetails, lineItems, billingAddress, shippingAddress } = payload;
61
+ const base = {
62
+ orderNumber,
63
+ total: total != null ? String(total) : void 0,
64
+ subtotal: subtotal != null ? String(subtotal) : void 0,
65
+ tax: tax != null ? String(tax) : void 0,
66
+ currency,
67
+ customerName,
68
+ companyDetails: companyDetails ?? {},
69
+ lineItems: lineItems ?? [],
70
+ billingAddress,
71
+ shippingAddress
72
+ };
73
+ const customerLower = customerEmail?.trim().toLowerCase() ?? "";
74
+ const jobs = [];
75
+ if (customerEmail?.trim()) {
76
+ jobs.push(queueEmail(cms, {
77
+ to: customerEmail.trim(),
78
+ templateName: "orderPlaced",
79
+ ctx: {
80
+ ...base,
81
+ audience: "customer"
82
+ }
83
+ }));
84
+ }
85
+ const seen = /* @__PURE__ */ new Set();
86
+ for (const raw of salesTeamEmails) {
87
+ const to = raw.trim();
88
+ if (!to) continue;
89
+ const key = to.toLowerCase();
90
+ if (seen.has(key)) continue;
91
+ seen.add(key);
92
+ if (customerLower && key === customerLower) continue;
93
+ jobs.push(queueEmail(cms, {
94
+ to,
95
+ templateName: "orderPlaced",
96
+ ctx: {
97
+ ...base,
98
+ audience: "sales",
99
+ internalCustomerEmail: customerEmail?.trim() || void 0
100
+ }
101
+ }));
102
+ }
103
+ await Promise.all(jobs);
104
+ }
105
+ chunkUSNT2KNT_cjs.__name(queueOrderPlacedEmails, "queueOrderPlacedEmails");
106
+ async function queueVendorOnboardEmails(cms, payload) {
107
+ const { vendorName, vendorSlug, ownerName, ownerEmail, activation, inviteLink, signInLink, kind = "vendor_onboard", notifyEmails, companyDetails, sendToOwner = true } = payload;
108
+ const base = {
109
+ vendorName,
110
+ vendorSlug,
111
+ ownerName,
112
+ ownerEmail,
113
+ activation,
114
+ inviteLink,
115
+ signInLink,
116
+ kind,
117
+ companyDetails: companyDetails ?? {}
118
+ };
119
+ const ownerLower = ownerEmail?.trim().toLowerCase() ?? "";
120
+ const jobs = [];
121
+ if (sendToOwner && ownerEmail?.trim()) {
122
+ jobs.push(queueEmail(cms, {
123
+ to: ownerEmail.trim(),
124
+ templateName: "vendorOnboarded",
125
+ ctx: {
126
+ ...base,
127
+ audience: "owner"
128
+ }
129
+ }));
130
+ }
131
+ const seen = /* @__PURE__ */ new Set();
132
+ for (const raw of notifyEmails) {
133
+ const to = raw.trim();
134
+ if (!to) continue;
135
+ const key = to.toLowerCase();
136
+ if (seen.has(key)) continue;
137
+ seen.add(key);
138
+ if (ownerLower && key === ownerLower) continue;
139
+ jobs.push(queueEmail(cms, {
140
+ to,
141
+ templateName: "vendorOnboarded",
142
+ ctx: {
143
+ ...base,
144
+ audience: "internal"
145
+ }
146
+ }));
147
+ }
148
+ await Promise.all(jobs);
149
+ }
150
+ chunkUSNT2KNT_cjs.__name(queueVendorOnboardEmails, "queueVendorOnboardEmails");
151
+
152
+ exports.queueEmail = queueEmail;
153
+ exports.queueOrderPlacedEmails = queueOrderPlacedEmails;
154
+ exports.queueVendorOnboardEmails = queueVendorOnboardEmails;
155
+ exports.registerEmailQueueProcessor = registerEmailQueueProcessor;
@@ -0,0 +1,82 @@
1
+ import { __name } from './chunk-SHUYVCID.js';
2
+
3
+ // src/plugins/email/templates/layout.ts
4
+ function escapeHtml(s) {
5
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
6
+ }
7
+ __name(escapeHtml, "escapeHtml");
8
+ function socialLinkInnerHtml(s) {
9
+ if (s.iconUrl?.trim()) {
10
+ return `<img src="${escapeHtml(s.iconUrl.trim())}" alt="" width="20" height="20" style="display:inline-block;vertical-align:middle;border:0;" />`;
11
+ }
12
+ const label = s.icon && s.icon.trim() || "\u{1F517}";
13
+ return escapeHtml(label);
14
+ }
15
+ __name(socialLinkInnerHtml, "socialLinkInnerHtml");
16
+ function supportLinesHtml(supportEmail, supportPhone, opts) {
17
+ const parts = [];
18
+ const top = opts?.tightTop ? "margin-top:0;" : "margin-top:4px;";
19
+ if (supportEmail) {
20
+ parts.push(`<div style="font-size:13px;color:#444;${top}">&#128231; ${escapeHtml(supportEmail)}</div>`);
21
+ }
22
+ if (supportPhone) {
23
+ parts.push(`<div style="font-size:13px;color:#444;margin-top:2px;">&#128222; ${escapeHtml(supportPhone)}</div>`);
24
+ }
25
+ return parts.join("");
26
+ }
27
+ __name(supportLinesHtml, "supportLinesHtml");
28
+ function renderLayout(options) {
29
+ const { bodyHtml, companyDetails } = options;
30
+ const { logoUrl, companyName, supportEmail, supportPhone, socialLinks, footerDisclaimer, followUsTitle = "Follow Us" } = companyDetails;
31
+ const supportFooterHtml = supportLinesHtml(supportEmail, supportPhone, {
32
+ tightTop: true
33
+ });
34
+ const hasSocial = Boolean(socialLinks?.length);
35
+ const brandFooterInner = [];
36
+ if (logoUrl) {
37
+ brandFooterInner.push(`<img src="${escapeHtml(logoUrl)}" alt="" style="max-height:28px;max-width:160px;height:auto;width:auto;display:inline-block;vertical-align:middle;margin-right:10px;border:0;" />`);
38
+ }
39
+ if (companyName) {
40
+ brandFooterInner.push(`<span style="font-size:14px;font-weight:600;color:#111;vertical-align:middle;">${escapeHtml(companyName)}</span>`);
41
+ }
42
+ const brandFooterHtml = brandFooterInner.length ? `<div style="line-height:1.4;">${brandFooterInner.join("")}</div>` : "";
43
+ const followTitleHtml = hasSocial && followUsTitle ? `<div class="footer-follow-title" style="font-size:13px;font-weight:600;color:#555;margin:0;">${escapeHtml(followUsTitle)}</div>` : "";
44
+ const socialRowHtml = hasSocial && socialLinks ? `<div class="footer-social-icons" style="margin-top:6px;text-align:left;font-size:0;line-height:0;">${socialLinks.map((s) => `<a href="${escapeHtml(s.url)}" style="display:inline-block;margin-right:12px;text-decoration:none;color:#333;font-size:18px;line-height:1;vertical-align:middle;">${socialLinkInnerHtml(s)}</a>`).join("")}</div>` : "";
45
+ const rowSupport = supportFooterHtml ? `<tr><td class="footer-support-cell" colspan="2" valign="top" style="padding:0 0 10px 0;">${supportFooterHtml}</td></tr>` : "";
46
+ let footerBlock = "";
47
+ if (brandFooterHtml || followTitleHtml || socialRowHtml || footerDisclaimer || rowSupport) {
48
+ const rowBrand = brandFooterHtml ? `<tr><td class="footer-brand-cell" colspan="2" valign="top" style="padding:0 0 10px 0;">${brandFooterHtml}</td></tr>` : "";
49
+ const rowFollowTitle = followTitleHtml ? `<tr><td class="footer-follow-cell" colspan="2" valign="top" style="padding:14px 0 0 0;text-align:left;">${followTitleHtml}</td></tr>` : "";
50
+ const rowSocial = socialRowHtml ? `<tr><td class="footer-social-cell" colspan="2" style="padding:0;text-align:left;">${socialRowHtml}</td></tr>` : "";
51
+ footerBlock = `<table role="presentation" class="footer-main" width="100%" cellpadding="0" cellspacing="0" style="margin-top:28px;padding-top:16px;">${rowBrand}${rowSupport}${rowFollowTitle}${rowSocial}</table>`;
52
+ }
53
+ const disclaimerBlock = footerDisclaimer ? `<div style="margin-top:20px;padding-top:12px;font-size:11px;line-height:1.5;color:#888;">${escapeHtml(footerDisclaimer).replace(/\n/g, "<br/>")}</div>` : "";
54
+ const responsiveCss = `
55
+ @media only screen and (max-width: 600px) {
56
+ .email-wrap { padding-left: 12px !important; padding-right: 12px !important; }
57
+ .footer-follow-cell { padding-top: 12px !important; }
58
+ }
59
+ `;
60
+ return `<!DOCTYPE html>
61
+ <html>
62
+ <head>
63
+ <meta charset="utf-8">
64
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
65
+ <style type="text/css">${responsiveCss}</style>
66
+ </head>
67
+ <body style="margin:0;padding:0;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;font-size:14px;line-height:1.5;color:#333;background:#fff;">
68
+ <table role="presentation" width="100%" cellpadding="0" cellspacing="0" style="background:#fff;">
69
+ <tr><td class="email-wrap" style="padding:16px;">
70
+ <div>
71
+ ${bodyHtml}
72
+ </div>
73
+ ${footerBlock}
74
+ ${disclaimerBlock}
75
+ </td></tr>
76
+ </table>
77
+ </body>
78
+ </html>`;
79
+ }
80
+ __name(renderLayout, "renderLayout");
81
+
82
+ export { renderLayout };
@@ -0,0 +1,83 @@
1
+ import { __name } from './chunk-SHUYVCID.js';
2
+
3
+ // src/plugins/whatsapp/whatsapp-queue.ts
4
+ var WHATSAPP_QUEUE_NAME = "whatsapp";
5
+ function maskPhone(raw) {
6
+ const digits = raw.replace(/\D/g, "");
7
+ if (digits.length <= 4) return "****";
8
+ return `${"*".repeat(Math.max(0, digits.length - 4))}${digits.slice(-4)}`;
9
+ }
10
+ __name(maskPhone, "maskPhone");
11
+ function registerWhatsAppQueueProcessor(cms) {
12
+ const queue = cms.getPlugin("queue");
13
+ const whatsapp = cms.getPlugin("whatsapp");
14
+ if (!queue) {
15
+ console.warn("[whatsapp] queue processor not registered: queue plugin missing");
16
+ return;
17
+ }
18
+ if (!whatsapp || typeof whatsapp.send !== "function") {
19
+ console.warn("[whatsapp] queue processor not registered: whatsapp plugin missing or not configured");
20
+ return;
21
+ }
22
+ queue.registerProcessor(WHATSAPP_QUEUE_NAME, async (data) => {
23
+ const payload = data;
24
+ if (!payload.to) {
25
+ console.warn("[whatsapp] queue job skipped: missing recipient");
26
+ return;
27
+ }
28
+ console.log("[whatsapp] queue job processing", {
29
+ to: maskPhone(payload.to),
30
+ templateKey: payload.templateKey ?? null,
31
+ externalTemplateRef: payload.externalTemplateRef ?? null
32
+ });
33
+ try {
34
+ const ok = await whatsapp.send(payload);
35
+ if (ok) {
36
+ console.log("[whatsapp] queue job completed", {
37
+ to: maskPhone(payload.to),
38
+ sent: true
39
+ });
40
+ } else {
41
+ console.warn("[whatsapp] queue job completed without delivery", {
42
+ to: maskPhone(payload.to),
43
+ sent: false
44
+ });
45
+ }
46
+ } catch (err) {
47
+ console.error("[whatsapp] queue job failed", {
48
+ to: maskPhone(payload.to),
49
+ error: err instanceof Error ? err.message : String(err)
50
+ });
51
+ }
52
+ });
53
+ console.log("[whatsapp] queue processor registered", {
54
+ queue: WHATSAPP_QUEUE_NAME
55
+ });
56
+ }
57
+ __name(registerWhatsAppQueueProcessor, "registerWhatsAppQueueProcessor");
58
+ async function queueWhatsApp(cms, payload) {
59
+ const queue = cms.getPlugin("queue");
60
+ if (queue) {
61
+ console.log("[whatsapp] enqueue", {
62
+ to: maskPhone(payload.to),
63
+ templateKey: payload.templateKey ?? null,
64
+ externalTemplateRef: payload.externalTemplateRef ?? null
65
+ });
66
+ await queue.add(WHATSAPP_QUEUE_NAME, payload);
67
+ return true;
68
+ }
69
+ const whatsapp = cms.getPlugin("whatsapp");
70
+ if (whatsapp && typeof whatsapp.send === "function") {
71
+ console.log("[whatsapp] no queue plugin \u2014 sending immediately", {
72
+ to: maskPhone(payload.to)
73
+ });
74
+ return whatsapp.send(payload);
75
+ }
76
+ console.warn("[whatsapp] send skipped: neither queue nor whatsapp plugin available", {
77
+ to: maskPhone(payload.to)
78
+ });
79
+ return false;
80
+ }
81
+ __name(queueWhatsApp, "queueWhatsApp");
82
+
83
+ export { queueWhatsApp, registerWhatsAppQueueProcessor };