@infuro/cms-core 1.0.60 → 1.0.62

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 (50) hide show
  1. package/dist/admin.cjs +4179 -2665
  2. package/dist/admin.js +2990 -1476
  3. package/dist/api.cjs +41 -37
  4. package/dist/api.js +9 -5
  5. package/dist/{chunk-URN7GS23.js → chunk-6LV36PCL.js} +199 -1059
  6. package/dist/{chunk-O2642WVS.js → chunk-6XAVZE4I.js} +17 -3
  7. package/dist/{chunk-BXYZDMTZ.cjs → chunk-AXMP2U43.cjs} +3 -94
  8. package/dist/{chunk-T3HPSF7K.js → chunk-AYWDQFJZ.js} +3 -0
  9. package/dist/chunk-CTIEAHQL.cjs +96 -0
  10. package/dist/chunk-GWDI752Q.js +83 -0
  11. package/dist/chunk-GZGFNVTK.js +886 -0
  12. package/dist/chunk-H3IVLIPR.cjs +86 -0
  13. package/dist/{chunk-2KUCQVAQ.js → chunk-HMLVPIJR.js} +2 -91
  14. package/dist/{chunk-V25RDUOU.cjs → chunk-LRD4CGOG.cjs} +38 -4
  15. package/dist/{chunk-73WVHINE.cjs → chunk-LVQSG25Y.cjs} +18 -4
  16. package/dist/chunk-NMYGQWHV.js +93 -0
  17. package/dist/chunk-OVTOP42W.js +199 -0
  18. package/dist/{chunk-BSLNXKV2.cjs → chunk-QA5C477U.cjs} +927 -351
  19. package/dist/{chunk-JAEUYYGA.js → chunk-R6Q67HAS.js} +876 -291
  20. package/dist/{chunk-YSYX4GUD.cjs → chunk-TWTISTZB.cjs} +210 -1080
  21. package/dist/{chunk-77I3KS7V.cjs → chunk-UEE4PTTB.cjs} +3 -0
  22. package/dist/chunk-WFMVD567.cjs +209 -0
  23. package/dist/{chunk-L3525VXI.js → chunk-YW7EF7K7.js} +36 -2
  24. package/dist/chunk-ZPAPCGCR.cjs +899 -0
  25. package/dist/{email-queue-OI2HSCGE.js → email-queue-65PQAG4C.js} +3 -2
  26. package/dist/{email-queue-6NJY6HNM.cjs → email-queue-J7DXYNCE.cjs} +7 -6
  27. package/dist/email-service-F7HA4X63.js +3 -0
  28. package/dist/email-service-RDOTY3CO.cjs +28 -0
  29. package/dist/{emit-order-notification-trigger-TNEZOYEE.cjs → emit-order-notification-trigger-K7URAZHJ.cjs} +4 -4
  30. package/dist/{emit-order-notification-trigger-CZU3V2WE.js → emit-order-notification-trigger-MD7EBODC.js} +2 -2
  31. package/dist/{erp-order-invoice-EYYNR526.cjs → erp-order-invoice-C5GZCOBM.cjs} +6 -5
  32. package/dist/{erp-order-invoice-3GXDE443.js → erp-order-invoice-MYFCXOCY.js} +2 -1
  33. package/dist/index.cjs +638 -346
  34. package/dist/index.d.cts +53 -19
  35. package/dist/index.d.ts +53 -19
  36. package/dist/index.js +350 -58
  37. package/dist/migrations/1783000000000-AddOrderPendingProcessingCompletedTriggers.ts +56 -0
  38. package/dist/migrations/1783100000000-AddSmsToOrderNotificationBindingsChannelEnum.ts +17 -0
  39. package/dist/migrations/1783200000000-AddOrderAssigneeColumns.ts +30 -0
  40. package/dist/order-assignees-handlers-LKMAGLG6.js +150 -0
  41. package/dist/order-assignees-handlers-NPKD64P6.cjs +152 -0
  42. package/dist/order-completion-otp-handlers-3NTOGEA5.js +361 -0
  43. package/dist/order-completion-otp-handlers-4EOLYLAP.cjs +363 -0
  44. package/dist/order-notification-dispatcher-IYMOS4VY.js +10 -0
  45. package/dist/order-notification-dispatcher-X2XM5VUY.cjs +35 -0
  46. package/dist/sms-notification-templates-handlers-SJLO7JGZ.js +47 -0
  47. package/dist/sms-notification-templates-handlers-YSB3L2PK.cjs +49 -0
  48. package/package.json +1 -1
  49. package/dist/order-notification-dispatcher-KJVGLK5E.cjs +0 -24
  50. package/dist/order-notification-dispatcher-ZSFKEYMP.js +0 -7
@@ -1,4 +1,4 @@
1
- import { notificationTriggerEmitter } from './chunk-T3HPSF7K.js';
1
+ import { notificationTriggerEmitter } from './chunk-AYWDQFJZ.js';
2
2
  import { __name } from './chunk-SHUYVCID.js';
3
3
 
4
4
  // src/lib/emit-order-notification-trigger.ts
@@ -77,7 +77,7 @@ async function emitOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
77
77
  }
78
78
  }
79
79
  }
80
- notificationTriggerEmitter.emitTrigger(triggerKey, {
80
+ const triggerPayload = {
81
81
  orderId,
82
82
  orderNumber: String(fo.orderNumber ?? ""),
83
83
  customerName: fo.contact?.name ?? "",
@@ -87,7 +87,21 @@ async function emitOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
87
87
  vendorId: fo.vendorId ?? null,
88
88
  extraVariables: extra?.extraVariables,
89
89
  refundAmount: resolvedRefundAmount
90
- });
90
+ };
91
+ if (listenerCount === 0) {
92
+ try {
93
+ const { dispatchOrderNotificationDirectly } = await import('./order-notification-dispatcher-IYMOS4VY.js');
94
+ await dispatchOrderNotificationDirectly(triggerKey, triggerPayload, deps.dataSource, deps.entityMap);
95
+ } catch (err) {
96
+ console.error("[notification-triggers] direct dispatch failed", {
97
+ triggerKey,
98
+ orderId,
99
+ err
100
+ });
101
+ }
102
+ } else {
103
+ notificationTriggerEmitter.emitTrigger(triggerKey, triggerPayload);
104
+ }
91
105
  }
92
106
  __name(emitOrderNotificationTrigger, "emitOrderNotificationTrigger");
93
107
  function fireOrderNotificationTrigger(triggerKey, orderId, deps, extra) {
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkUPLVMVRX_cjs = require('./chunk-UPLVMVRX.cjs');
4
+ var chunkCTIEAHQL_cjs = require('./chunk-CTIEAHQL.cjs');
4
5
  var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
5
6
  var pdfLib = require('pdf-lib');
6
7
 
@@ -585,96 +586,6 @@ function resolveInvoiceAssetUrl(raw) {
585
586
  }
586
587
  chunkUSNT2KNT_cjs.__name(resolveInvoiceAssetUrl, "resolveInvoiceAssetUrl");
587
588
 
588
- // src/plugins/email/templates/types.ts
589
- function normalizeSocialLinkItem(o) {
590
- const url = String(o.url ?? "").trim();
591
- if (!url) return null;
592
- let iconUrl = String(o.iconUrl ?? o.icon_image ?? "").trim();
593
- let icon = String(o.icon ?? "").trim();
594
- if (!iconUrl && /^https?:\/\//i.test(icon)) {
595
- iconUrl = icon;
596
- icon = "";
597
- }
598
- const item = {
599
- url
600
- };
601
- if (iconUrl) item.iconUrl = iconUrl;
602
- if (icon) item.icon = icon;
603
- return item;
604
- }
605
- chunkUSNT2KNT_cjs.__name(normalizeSocialLinkItem, "normalizeSocialLinkItem");
606
- function parseSocialLinksJson(raw) {
607
- if (raw == null || raw.trim() === "") return void 0;
608
- try {
609
- const parsed = JSON.parse(raw);
610
- if (!Array.isArray(parsed)) return void 0;
611
- const out = [];
612
- for (const item of parsed) {
613
- if (item && typeof item === "object" && "url" in item) {
614
- const n = normalizeSocialLinkItem(item);
615
- if (n) out.push(n);
616
- }
617
- }
618
- return out.length ? out : void 0;
619
- } catch {
620
- return void 0;
621
- }
622
- }
623
- chunkUSNT2KNT_cjs.__name(parseSocialLinksJson, "parseSocialLinksJson");
624
- function mergeEmailLayoutCompanyDetails(branding, emailSettings) {
625
- const fromBranding = getCompanyDetailsFromSettings(branding);
626
- const pick = /* @__PURE__ */ chunkUSNT2KNT_cjs.__name((emailVal, fallback) => {
627
- const t = emailVal?.trim();
628
- return t || fallback?.trim() || void 0;
629
- }, "pick");
630
- const logoUrl = pick(emailSettings.logoUrl ?? emailSettings.emailLogoUrl, fromBranding.logoUrl);
631
- const companyName = pick(emailSettings.companyName ?? emailSettings.emailCompanyName, fromBranding.companyName);
632
- const supportEmail = pick(emailSettings.supportEmail ?? emailSettings.emailSupportEmail, fromBranding.supportEmail);
633
- const supportPhone = pick(emailSettings.supportPhone, void 0);
634
- const footerDisclaimer = pick(emailSettings.footerDisclaimer, void 0);
635
- const followUsTitle = pick(emailSettings.followUsTitle, "Follow Us") || "Follow Us";
636
- const socialFromEmail = parseSocialLinksJson(emailSettings.socialLinks);
637
- const socialLinks = socialFromEmail?.length ? socialFromEmail : fromBranding.socialLinks;
638
- return {
639
- logoUrl,
640
- companyName,
641
- supportEmail,
642
- supportPhone,
643
- socialLinks,
644
- footerDisclaimer,
645
- followUsTitle
646
- };
647
- }
648
- chunkUSNT2KNT_cjs.__name(mergeEmailLayoutCompanyDetails, "mergeEmailLayoutCompanyDetails");
649
- function getCompanyDetailsFromSettings(settingsGroup) {
650
- const logoUrl = settingsGroup.logo ?? settingsGroup.logoUrl ?? "";
651
- const companyName = settingsGroup.companyName ?? settingsGroup.company_name ?? "";
652
- const supportEmail = settingsGroup.supportEmail ?? settingsGroup.support_email ?? "";
653
- let socialLinks = [];
654
- const raw = settingsGroup.socialLinks ?? settingsGroup.social_links;
655
- if (typeof raw === "string") {
656
- try {
657
- const arr = JSON.parse(raw);
658
- if (Array.isArray(arr)) {
659
- for (const item of arr) {
660
- if (item && typeof item === "object") {
661
- const n = normalizeSocialLinkItem(item);
662
- if (n) socialLinks.push(n);
663
- }
664
- }
665
- }
666
- } catch {
667
- }
668
- }
669
- return {
670
- logoUrl: logoUrl || void 0,
671
- companyName: companyName || void 0,
672
- supportEmail: supportEmail || void 0,
673
- socialLinks: socialLinks.length ? socialLinks : void 0
674
- };
675
- }
676
- chunkUSNT2KNT_cjs.__name(getCompanyDetailsFromSettings, "getCompanyDetailsFromSettings");
677
-
678
589
  // src/lib/invoice/build-local-invoice-for-order.ts
679
590
  async function loadSettingsGroup(ds, entityMap, group) {
680
591
  if (!entityMap.configs) return {};
@@ -755,8 +666,8 @@ async function buildLocalInvoicePdfForOrder(ds, entityMap, orderId) {
755
666
  loadSettingsGroup(ds, entityMap, "branding"),
756
667
  loadSettingsGroup(ds, entityMap, "email")
757
668
  ]);
758
- const companyDetails = mergeEmailLayoutCompanyDetails(branding, email);
759
- const fromBranding = getCompanyDetailsFromSettings(branding);
669
+ const companyDetails = chunkCTIEAHQL_cjs.mergeEmailLayoutCompanyDetails(branding, email);
670
+ const fromBranding = chunkCTIEAHQL_cjs.getCompanyDetailsFromSettings(branding);
760
671
  const rawLogo = store.invoiceLogoUrl || store.companyLogo || store.logo || companyDetails.logoUrl || fromBranding.logoUrl || null;
761
672
  const logoUrl = resolveInvoiceAssetUrl(rawLogo);
762
673
  const companyName = store.companyName || store.invoiceCompanyName || store.name || companyDetails.companyName || fromBranding.companyName || "Store";
@@ -941,11 +852,9 @@ exports.ORDER_INVOICE_EMAIL_ELIGIBLE_STATUSES = ORDER_INVOICE_EMAIL_ELIGIBLE_STA
941
852
  exports.buildLocalInvoicePdfForOrder = buildLocalInvoicePdfForOrder;
942
853
  exports.extractChildOrderRefsFromSalePayload = extractChildOrderRefsFromSalePayload;
943
854
  exports.generateLocalInvoicePdf = generateLocalInvoicePdf;
944
- exports.getCompanyDetailsFromSettings = getCompanyDetailsFromSettings;
945
855
  exports.isOrderEligibleForInvoiceEmail = isOrderEligibleForInvoiceEmail;
946
856
  exports.mapErpPayloadToFulfillment = mapErpPayloadToFulfillment;
947
857
  exports.mapErpPayloadToInvoiceNumber = mapErpPayloadToInvoiceNumber;
948
- exports.mergeEmailLayoutCompanyDetails = mergeEmailLayoutCompanyDetails;
949
858
  exports.normalizeInvoiceTemplateId = normalizeInvoiceTemplateId;
950
859
  exports.resolveInvoiceAssetUrl = resolveInvoiceAssetUrl;
951
860
  exports.resolveOrderInvoicePdfBytes = resolveOrderInvoicePdfBytes;
@@ -2,6 +2,9 @@ import { __name } from './chunk-SHUYVCID.js';
2
2
  import { EventEmitter } from 'events';
3
3
 
4
4
  var KNOWN_NOTIFICATION_TRIGGERS = {
5
+ ORDER_PENDING: "order_pending",
6
+ ORDER_PROCESSING: "order_processing",
7
+ ORDER_COMPLETED: "order_completed",
5
8
  ORDER_PLACED: "order_placed",
6
9
  ORDER_CANCELLED: "order_cancelled",
7
10
  PAYMENT_SUCCESS: "payment_success",
@@ -0,0 +1,96 @@
1
+ 'use strict';
2
+
3
+ var chunkUSNT2KNT_cjs = require('./chunk-USNT2KNT.cjs');
4
+
5
+ // src/plugins/email/templates/types.ts
6
+ function normalizeSocialLinkItem(o) {
7
+ const url = String(o.url ?? "").trim();
8
+ if (!url) return null;
9
+ let iconUrl = String(o.iconUrl ?? o.icon_image ?? "").trim();
10
+ let icon = String(o.icon ?? "").trim();
11
+ if (!iconUrl && /^https?:\/\//i.test(icon)) {
12
+ iconUrl = icon;
13
+ icon = "";
14
+ }
15
+ const item = {
16
+ url
17
+ };
18
+ if (iconUrl) item.iconUrl = iconUrl;
19
+ if (icon) item.icon = icon;
20
+ return item;
21
+ }
22
+ chunkUSNT2KNT_cjs.__name(normalizeSocialLinkItem, "normalizeSocialLinkItem");
23
+ function parseSocialLinksJson(raw) {
24
+ if (raw == null || raw.trim() === "") return void 0;
25
+ try {
26
+ const parsed = JSON.parse(raw);
27
+ if (!Array.isArray(parsed)) return void 0;
28
+ const out = [];
29
+ for (const item of parsed) {
30
+ if (item && typeof item === "object" && "url" in item) {
31
+ const n = normalizeSocialLinkItem(item);
32
+ if (n) out.push(n);
33
+ }
34
+ }
35
+ return out.length ? out : void 0;
36
+ } catch {
37
+ return void 0;
38
+ }
39
+ }
40
+ chunkUSNT2KNT_cjs.__name(parseSocialLinksJson, "parseSocialLinksJson");
41
+ function mergeEmailLayoutCompanyDetails(branding, emailSettings) {
42
+ const fromBranding = getCompanyDetailsFromSettings(branding);
43
+ const pick = /* @__PURE__ */ chunkUSNT2KNT_cjs.__name((emailVal, fallback) => {
44
+ const t = emailVal?.trim();
45
+ return t || fallback?.trim() || void 0;
46
+ }, "pick");
47
+ const logoUrl = pick(emailSettings.logoUrl ?? emailSettings.emailLogoUrl, fromBranding.logoUrl);
48
+ const companyName = pick(emailSettings.companyName ?? emailSettings.emailCompanyName, fromBranding.companyName);
49
+ const supportEmail = pick(emailSettings.supportEmail ?? emailSettings.emailSupportEmail, fromBranding.supportEmail);
50
+ const supportPhone = pick(emailSettings.supportPhone, void 0);
51
+ const footerDisclaimer = pick(emailSettings.footerDisclaimer, void 0);
52
+ const followUsTitle = pick(emailSettings.followUsTitle, "Follow Us") || "Follow Us";
53
+ const socialFromEmail = parseSocialLinksJson(emailSettings.socialLinks);
54
+ const socialLinks = socialFromEmail?.length ? socialFromEmail : fromBranding.socialLinks;
55
+ return {
56
+ logoUrl,
57
+ companyName,
58
+ supportEmail,
59
+ supportPhone,
60
+ socialLinks,
61
+ footerDisclaimer,
62
+ followUsTitle
63
+ };
64
+ }
65
+ chunkUSNT2KNT_cjs.__name(mergeEmailLayoutCompanyDetails, "mergeEmailLayoutCompanyDetails");
66
+ function getCompanyDetailsFromSettings(settingsGroup) {
67
+ const logoUrl = settingsGroup.logo ?? settingsGroup.logoUrl ?? "";
68
+ const companyName = settingsGroup.companyName ?? settingsGroup.company_name ?? "";
69
+ const supportEmail = settingsGroup.supportEmail ?? settingsGroup.support_email ?? "";
70
+ let socialLinks = [];
71
+ const raw = settingsGroup.socialLinks ?? settingsGroup.social_links;
72
+ if (typeof raw === "string") {
73
+ try {
74
+ const arr = JSON.parse(raw);
75
+ if (Array.isArray(arr)) {
76
+ for (const item of arr) {
77
+ if (item && typeof item === "object") {
78
+ const n = normalizeSocialLinkItem(item);
79
+ if (n) socialLinks.push(n);
80
+ }
81
+ }
82
+ }
83
+ } catch {
84
+ }
85
+ }
86
+ return {
87
+ logoUrl: logoUrl || void 0,
88
+ companyName: companyName || void 0,
89
+ supportEmail: supportEmail || void 0,
90
+ socialLinks: socialLinks.length ? socialLinks : void 0
91
+ };
92
+ }
93
+ chunkUSNT2KNT_cjs.__name(getCompanyDetailsFromSettings, "getCompanyDetailsFromSettings");
94
+
95
+ exports.getCompanyDetailsFromSettings = getCompanyDetailsFromSettings;
96
+ exports.mergeEmailLayoutCompanyDetails = mergeEmailLayoutCompanyDetails;
@@ -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 };