@dev.smartpricing/message-composer-utils 3.1.2

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 (119) hide show
  1. package/dist/types/api/aiIntegration.js +7 -0
  2. package/dist/types/api/aiIntegration.js.map +1 -0
  3. package/dist/types/api/apiMessages.js +2 -0
  4. package/dist/types/api/apiMessages.js.map +1 -0
  5. package/dist/types/api/index.js +3 -0
  6. package/dist/types/api/index.js.map +1 -0
  7. package/dist/types/app.js +23 -0
  8. package/dist/types/app.js.map +1 -0
  9. package/dist/types/brand.js +31 -0
  10. package/dist/types/brand.js.map +1 -0
  11. package/dist/types/dynamic-values.js +5 -0
  12. package/dist/types/dynamic-values.js.map +1 -0
  13. package/dist/types/emailblocks.v1.defaults.js +83 -0
  14. package/dist/types/emailblocks.v1.defaults.js.map +1 -0
  15. package/dist/types/emailblocks.v1.js +339 -0
  16. package/dist/types/emailblocks.v1.js.map +1 -0
  17. package/dist/types/index.js +16 -0
  18. package/dist/types/index.js.map +1 -0
  19. package/dist/types/kafka-events.js +2 -0
  20. package/dist/types/kafka-events.js.map +1 -0
  21. package/dist/types/language.js +2 -0
  22. package/dist/types/language.js.map +1 -0
  23. package/dist/types/media.js +6 -0
  24. package/dist/types/media.js.map +1 -0
  25. package/dist/types/message.js +41 -0
  26. package/dist/types/message.js.map +1 -0
  27. package/dist/types/meta-template.js +2 -0
  28. package/dist/types/meta-template.js.map +1 -0
  29. package/dist/types/meta-webhook.js +2 -0
  30. package/dist/types/meta-webhook.js.map +1 -0
  31. package/dist/types/submission-job.js +2 -0
  32. package/dist/types/submission-job.js.map +1 -0
  33. package/dist/types/tag.js +2 -0
  34. package/dist/types/tag.js.map +1 -0
  35. package/dist/types/utils.js +2 -0
  36. package/dist/types/utils.js.map +1 -0
  37. package/dist/types/whatsappblocks.v1.js +24 -0
  38. package/dist/types/whatsappblocks.v1.js.map +1 -0
  39. package/dist/utils/array.js +26 -0
  40. package/dist/utils/array.js.map +1 -0
  41. package/dist/utils/async.js +22 -0
  42. package/dist/utils/async.js.map +1 -0
  43. package/dist/utils/date.js +37 -0
  44. package/dist/utils/date.js.map +1 -0
  45. package/dist/utils/index.js +34 -0
  46. package/dist/utils/index.js.map +1 -0
  47. package/dist/utils/intl.js +37 -0
  48. package/dist/utils/intl.js.map +1 -0
  49. package/dist/utils/meta-status.js +21 -0
  50. package/dist/utils/meta-status.js.map +1 -0
  51. package/dist/utils/number.js +24 -0
  52. package/dist/utils/number.js.map +1 -0
  53. package/dist/utils/object.js +87 -0
  54. package/dist/utils/object.js.map +1 -0
  55. package/dist/utils/string.js +22 -0
  56. package/dist/utils/string.js.map +1 -0
  57. package/dist/utils/templates/brand-cascade.js +116 -0
  58. package/dist/utils/templates/brand-cascade.js.map +1 -0
  59. package/dist/utils/templates/email-compiler.js +126 -0
  60. package/dist/utils/templates/email-compiler.js.map +1 -0
  61. package/dist/utils/templates/email-mjml.js +444 -0
  62. package/dist/utils/templates/email-mjml.js.map +1 -0
  63. package/dist/utils/templates/email.js +580 -0
  64. package/dist/utils/templates/email.js.map +1 -0
  65. package/dist/utils/templates/html-sanitizer.js +95 -0
  66. package/dist/utils/templates/html-sanitizer.js.map +1 -0
  67. package/dist/utils/templates/messages.js +33 -0
  68. package/dist/utils/templates/messages.js.map +1 -0
  69. package/dist/utils/templates/meta.js +246 -0
  70. package/dist/utils/templates/meta.js.map +1 -0
  71. package/dist/utils/templates/tiptap.js +167 -0
  72. package/dist/utils/templates/tiptap.js.map +1 -0
  73. package/dist/utils/templates/whatsapp-compiler.js +168 -0
  74. package/dist/utils/templates/whatsapp-compiler.js.map +1 -0
  75. package/dist/utils/templates/whatsapp.js +329 -0
  76. package/dist/utils/templates/whatsapp.js.map +1 -0
  77. package/dist/utils/validations.js +39 -0
  78. package/dist/utils/validations.js.map +1 -0
  79. package/package.json +43 -0
  80. package/src/types/api/aiIntegration.ts +59 -0
  81. package/src/types/api/apiMessages.ts +22 -0
  82. package/src/types/api/index.ts +2 -0
  83. package/src/types/app.ts +76 -0
  84. package/src/types/brand.ts +80 -0
  85. package/src/types/dynamic-values.ts +47 -0
  86. package/src/types/emailblocks.v1.defaults.ts +123 -0
  87. package/src/types/emailblocks.v1.ts +655 -0
  88. package/src/types/index.ts +15 -0
  89. package/src/types/kafka-events.ts +46 -0
  90. package/src/types/language.ts +9 -0
  91. package/src/types/media.ts +26 -0
  92. package/src/types/message.ts +635 -0
  93. package/src/types/meta-template.ts +50 -0
  94. package/src/types/meta-webhook.ts +32 -0
  95. package/src/types/submission-job.ts +30 -0
  96. package/src/types/tag.ts +8 -0
  97. package/src/types/utils.ts +14 -0
  98. package/src/types/whatsappblocks.v1.ts +102 -0
  99. package/src/utils/array.ts +33 -0
  100. package/src/utils/async.ts +30 -0
  101. package/src/utils/date.ts +39 -0
  102. package/src/utils/index.ts +44 -0
  103. package/src/utils/intl.ts +51 -0
  104. package/src/utils/meta-status.ts +24 -0
  105. package/src/utils/number.ts +36 -0
  106. package/src/utils/object.ts +101 -0
  107. package/src/utils/string.ts +24 -0
  108. package/src/utils/templates/brand-cascade.ts +156 -0
  109. package/src/utils/templates/email-compiler.ts +155 -0
  110. package/src/utils/templates/email-mjml.ts +602 -0
  111. package/src/utils/templates/email.ts +713 -0
  112. package/src/utils/templates/html-sanitizer.ts +121 -0
  113. package/src/utils/templates/messages.ts +44 -0
  114. package/src/utils/templates/meta.ts +336 -0
  115. package/src/utils/templates/tiptap.ts +247 -0
  116. package/src/utils/templates/whatsapp-compiler.ts +212 -0
  117. package/src/utils/templates/whatsapp.ts +408 -0
  118. package/src/utils/validations.ts +49 -0
  119. package/tsconfig.json +10 -0
@@ -0,0 +1,126 @@
1
+ /**
2
+ * Extract parameters from TipTap JSONContent
3
+ */
4
+ function extractParamsFromContent(content) {
5
+ if (!content)
6
+ return [];
7
+ const results = [];
8
+ // Extract from text nodes
9
+ if (content.type === "text" && content.text) {
10
+ const matches = content.text.matchAll(/\{\{([^}]+)\}\}/g);
11
+ for (const match of matches) {
12
+ results.push(match[1]);
13
+ }
14
+ }
15
+ // Extract from mentions
16
+ if (content.type === "mention" && content.attrs?.label) {
17
+ results.push(content.attrs.label);
18
+ }
19
+ // Recurse through content
20
+ if (content.content && Array.isArray(content.content)) {
21
+ for (const child of content.content) {
22
+ results.push(...extractParamsFromContent(child));
23
+ }
24
+ }
25
+ return results;
26
+ }
27
+ /**
28
+ * Extract parameters from email blocks recursively
29
+ */
30
+ function extractParamsFromBlocks(blocks) {
31
+ const results = [];
32
+ for (const block of blocks) {
33
+ switch (block.type) {
34
+ case "heading":
35
+ case "paragraph":
36
+ case "discount":
37
+ case "footer":
38
+ case "unsubscribe_link":
39
+ results.push(...extractParamsFromContent(block.settings.content));
40
+ break;
41
+ case "socials":
42
+ for (const social of Object.values(block.settings.socials)) {
43
+ if (social.enabled && social.url) {
44
+ const matches = social.url.matchAll(/\{\{([^}]+)\}\}/g);
45
+ for (const match of matches) {
46
+ results.push(match[1]);
47
+ }
48
+ }
49
+ }
50
+ break;
51
+ case "button":
52
+ results.push(...extractParamsFromContent(block.settings.content));
53
+ // Extract from URL
54
+ if (block.settings.url) {
55
+ const matches = block.settings.url.matchAll(/\{\{([^}]+)\}\}/g);
56
+ for (const match of matches) {
57
+ results.push(match[1]);
58
+ }
59
+ }
60
+ break;
61
+ case "grid":
62
+ // Recurse into grid columns
63
+ for (const col of block.settings.columnData) {
64
+ results.push(...extractParamsFromBlocks(col.blocks));
65
+ }
66
+ break;
67
+ case "image":
68
+ // Extract from image href
69
+ if (block.settings.href) {
70
+ const matches = block.settings.href.matchAll(/\{\{([^}]+)\}\}/g);
71
+ for (const match of matches) {
72
+ results.push(match[1]);
73
+ }
74
+ }
75
+ break;
76
+ case "top_products":
77
+ if (block.settings.storeId) {
78
+ const matches = block.settings.storeId.matchAll(/\{\{([^}]+)\}\}/g);
79
+ for (const match of matches) {
80
+ results.push(match[1]);
81
+ }
82
+ }
83
+ break;
84
+ // Other blocks don't have parameters
85
+ default:
86
+ break;
87
+ }
88
+ }
89
+ return results;
90
+ }
91
+ /**
92
+ * Extract required parameters from email template
93
+ */
94
+ export function extractEmailParameters(message) {
95
+ const paramRegex = /\{\{([^}]+)\}\}/g;
96
+ const results = [];
97
+ // Extract from subject
98
+ if (message.body.subject) {
99
+ for (const match of message.body.subject.matchAll(paramRegex)) {
100
+ results.push(match[1]);
101
+ }
102
+ }
103
+ // Extract from preheader
104
+ if (message.metadata.preheader) {
105
+ for (const match of message.metadata.preheader.matchAll(paramRegex)) {
106
+ results.push(match[1]);
107
+ }
108
+ }
109
+ // Extract from blocks recursively
110
+ results.push(...extractParamsFromBlocks(message.body.blocks));
111
+ // Dedupe using Set
112
+ return [...new Set(results)];
113
+ }
114
+ /**
115
+ * Validate email parameters
116
+ */
117
+ export function validateEmailParameters(message, parameters) {
118
+ const required = extractEmailParameters(message);
119
+ const provided = Object.keys(parameters);
120
+ const missing = required.filter((p) => !provided.includes(p));
121
+ return {
122
+ valid: missing.length === 0,
123
+ missing,
124
+ };
125
+ }
126
+ //# sourceMappingURL=email-compiler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-compiler.js","sourceRoot":"","sources":["../../../src/utils/templates/email-compiler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,444 @@
1
+ import { SOCIAL_ICONS, SOCIAL_PLATFORMS } from "../../types/index.js";
2
+ // Default internal horizontal padding for text blocks (heading, paragraph, footer, unsubscribe_link)
3
+ const TEXT_HORIZONTAL_PADDING = 25;
4
+ import { generateHTML } from "@tiptap/html";
5
+ import { getTipTapExtensions } from "./tiptap.js";
6
+ import { generateText } from "./messages.js";
7
+ /**
8
+ * Converts TipTap JSONContent to HTML for email rendering
9
+ */
10
+ function generateEmailHtml(content) {
11
+ if (!content)
12
+ return "";
13
+ return generateHTML(content, getTipTapExtensions({ preset: "email" }));
14
+ }
15
+ /**
16
+ * Escapes special characters for XML/MJML attributes
17
+ */
18
+ function escapeXmlAttribute(value) {
19
+ if (value === undefined || value === null) {
20
+ return "";
21
+ }
22
+ return value
23
+ .replace(/&/g, "&")
24
+ .replace(/</g, "&lt;")
25
+ .replace(/>/g, "&gt;")
26
+ .replace(/"/g, "&quot;")
27
+ .replace(/'/g, "&apos;");
28
+ }
29
+ /**
30
+ * Translates a spacer block to MJML
31
+ */
32
+ function translateSpacerBlock(block, settings) {
33
+ const bgColor = block.settings.backgroundColor === "#FFFFFF00"
34
+ ? ""
35
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundColor)}"`;
36
+ const hPad = settings.horizontalSpacing ?? 0;
37
+ return `<mj-spacer height="${block.settings.height}px" padding="0px ${hPad}px"${bgColor} />`;
38
+ }
39
+ /**
40
+ * Translates a divider block to MJML
41
+ */
42
+ function translateDividerBlock(block, settings) {
43
+ const bgColor = block.settings.backgroundColor === "#FFFFFF00"
44
+ ? ""
45
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundColor)}"`;
46
+ const hPad = settings.horizontalSpacing ?? 0;
47
+ return `<mj-divider
48
+ border-style="${block.settings.style}"
49
+ border-width="${block.settings.thickness}px"
50
+ width="${block.settings.width}%"
51
+ border-color="${escapeXmlAttribute(block.settings.color)}"
52
+ padding="0px ${hPad}px"${bgColor} />`;
53
+ }
54
+ /**
55
+ * Translates a heading block to MJML
56
+ */
57
+ function translateHeadingBlock(block, settings) {
58
+ const html = generateEmailHtml(block.settings.content);
59
+ const bgColor = block.settings.backgroundColor === "#FFFFFF00"
60
+ ? ""
61
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundColor)}"`;
62
+ const textColor = block.settings.textColor ?? settings.textColor;
63
+ const fontFamily = block.settings.fontFamily ?? settings.fontFamily;
64
+ const hPad = TEXT_HORIZONTAL_PADDING + (settings.horizontalSpacing ?? 0);
65
+ return `<mj-text
66
+ font-family="${escapeXmlAttribute(fontFamily)}"
67
+ font-size="${block.settings.fontSize}px"
68
+ color="${escapeXmlAttribute(textColor)}"
69
+ padding="0px ${hPad}px"${bgColor}>
70
+ <${block.settings.tag} style="font-size: ${block.settings.fontSize}px">${html}</${block.settings.tag}>
71
+ </mj-text>`;
72
+ }
73
+ /**
74
+ * Translates a paragraph block to MJML
75
+ */
76
+ function translateParagraphBlock(block, settings) {
77
+ const html = generateEmailHtml(block.settings.content);
78
+ const bgColor = block.settings.backgroundColor === "#FFFFFF00"
79
+ ? ""
80
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundColor)}"`;
81
+ const textColor = block.settings.textColor ?? settings.textColor;
82
+ const fontFamily = block.settings.fontFamily ?? settings.fontFamily;
83
+ const hPad = TEXT_HORIZONTAL_PADDING + (settings.horizontalSpacing ?? 0);
84
+ return `<mj-text
85
+ font-family="${escapeXmlAttribute(fontFamily)}"
86
+ font-size="${block.settings.fontSize}px"
87
+ color="${escapeXmlAttribute(textColor)}"
88
+ padding="0px ${hPad}px"${bgColor}>
89
+ <${block.settings.tag} style="font-size: ${block.settings.fontSize}px">${html}</${block.settings.tag}>
90
+ </mj-text>`;
91
+ }
92
+ /**
93
+ * Translates an image block to MJML
94
+ */
95
+ function translateImageBlock(block, settings) {
96
+ const href = block.settings.href
97
+ ? ` href="${escapeXmlAttribute(block.settings.href)}"`
98
+ : "";
99
+ const hPad = settings.horizontalSpacing ?? 0;
100
+ return `<mj-image src="${escapeXmlAttribute(block.settings.src)}"${href} padding="0px ${hPad}px" />`;
101
+ }
102
+ /**
103
+ * Translates a button block to MJML
104
+ */
105
+ function translateButtonBlock(block, settings) {
106
+ const html = generateText(block.settings.content, "email_v1");
107
+ const borderRadius = block.settings.shape === "square"
108
+ ? "0px"
109
+ : block.settings.shape === "rounded"
110
+ ? "4px"
111
+ : "50px";
112
+ const widthAttr = block.settings.width === "full_width" ? ' width="100%"' : "";
113
+ const bgBlock = block.settings.backgroundBlock === "#FFFFFF00"
114
+ ? ""
115
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundBlock)}"`;
116
+ // Prepend mailto: or tel: based on linkType
117
+ let href = block.settings.url;
118
+ if (block.settings.linkType === "email" && !href.startsWith("mailto:")) {
119
+ href = `mailto:${href}`;
120
+ }
121
+ else if (block.settings.linkType === "phone" && !href.startsWith("tel:")) {
122
+ href = `tel:${href}`;
123
+ }
124
+ const textColor = block.settings.textColor ?? settings.button?.textColor ?? "#FFFFFF";
125
+ const backgroundColor = block.settings.backgroundColor ??
126
+ settings.button?.backgroundColor ??
127
+ "#000000";
128
+ const fontFamily = block.settings.fontFamily ?? settings.fontFamily;
129
+ const hPad = settings.horizontalSpacing ?? 0;
130
+ return `<mj-button
131
+ href="${escapeXmlAttribute(href)}"
132
+ font-family="${escapeXmlAttribute(fontFamily)}"
133
+ font-size="${block.settings.fontSize}px"
134
+ color="${escapeXmlAttribute(textColor)}"
135
+ background-color="${escapeXmlAttribute(backgroundColor)}"
136
+ border-radius="${borderRadius}"${widthAttr}
137
+ align="${block.settings.alignment}"
138
+ padding="0px ${hPad}px"${bgBlock}>
139
+ ${html}
140
+ </mj-button>`;
141
+ }
142
+ /**
143
+ * Translates a grid block to MJML (multi-column section)
144
+ */
145
+ function translateGridBlock(block, settings, sectionPadding) {
146
+ const columnWidth = `${100 / block.settings.columns}%`;
147
+ const columns = block.settings.columnData
148
+ .map((col) => `
149
+ <mj-column width="${columnWidth}">
150
+ ${col.blocks.map((b) => translateContentBlockToMjml(b, settings)).join("\n ")}
151
+ </mj-column>`)
152
+ .join("");
153
+ const bgColor = block.settings.backgroundColor === "#FFFFFF00"
154
+ ? ""
155
+ : ` background-color="${escapeXmlAttribute(block.settings.backgroundColor)}"`;
156
+ return `<mj-section padding="${sectionPadding}"${bgColor}>
157
+ ${columns}
158
+ </mj-section>`;
159
+ }
160
+ /**
161
+ * Translates a raw HTML block to MJML
162
+ */
163
+ function translateRawHtmlBlock(block) {
164
+ return `<mj-raw>${block.settings.html}</mj-raw>`;
165
+ }
166
+ /**
167
+ * Translates a discount block to MJML
168
+ */
169
+ function translateDiscountBlock(block, settings) {
170
+ const html = generateEmailHtml(block.settings.content);
171
+ const borderRadius = block.settings.style === "square"
172
+ ? "0px"
173
+ : block.settings.style === "rounded"
174
+ ? "4px"
175
+ : "50px";
176
+ const widthAttr = block.settings.width === "full_width" ? " width: 100%;" : "";
177
+ const bgBlock = block.settings.backgroundBlock === "#FFFFFF00"
178
+ ? ""
179
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundBlock)}"`;
180
+ const textColor = block.settings.textColor ?? settings.textColor;
181
+ const fontFamily = block.settings.fontFamily ?? settings.fontFamily;
182
+ const hPad = settings.horizontalSpacing ?? 0;
183
+ return `<mj-text
184
+ font-family="${escapeXmlAttribute(fontFamily)}"
185
+ font-size="${block.settings.fontSize}px"
186
+ color="${escapeXmlAttribute(textColor)}"
187
+ align="center"
188
+ padding="0px ${hPad}px"${bgBlock}>
189
+ <${block.settings.tag}
190
+ style="
191
+ font-size: ${block.settings.fontSize}px;
192
+ border-radius: ${borderRadius};
193
+ padding: 12px 0px;
194
+ background-color: ${escapeXmlAttribute(block.settings.backgroundComponent)};
195
+ text-align: center; ${widthAttr}"
196
+ >${html}</${block.settings.tag}>
197
+ </mj-text>`;
198
+ }
199
+ /**
200
+ * Translates a header block to MJML
201
+ */
202
+ function translateHeaderBlock(block, settings) {
203
+ const bgColor = block.settings.backgroundColor === "#FFFFFF00"
204
+ ? ""
205
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundColor)}"`;
206
+ const hPad = settings.horizontalSpacing ?? 0;
207
+ return `<mj-image
208
+ src="${escapeXmlAttribute(block.settings.src)}"
209
+ alt="${escapeXmlAttribute(block.settings.alt)}"
210
+ width="${block.settings.width}px"
211
+ align="${block.settings.alignment}"
212
+ padding="0px ${hPad}px"${bgColor} />`;
213
+ }
214
+ /**
215
+ * Translates a footer block to MJML
216
+ */
217
+ function translateFooterBlock(block, settings) {
218
+ const html = generateEmailHtml(block.settings.content);
219
+ const bgColor = block.settings.backgroundColor === "#FFFFFF00"
220
+ ? ""
221
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundColor)}"`;
222
+ const textColor = block.settings.textColor ?? settings.textColor;
223
+ const fontFamily = block.settings.fontFamily ?? settings.fontFamily;
224
+ const hPad = TEXT_HORIZONTAL_PADDING + (settings.horizontalSpacing ?? 0);
225
+ return `<mj-text
226
+ font-family="${escapeXmlAttribute(fontFamily)}"
227
+ font-size="${block.settings.fontSize}px"
228
+ color="${escapeXmlAttribute(textColor)}"
229
+ padding="0px ${hPad}px"${bgColor}>
230
+ ${html}
231
+ </mj-text>`;
232
+ }
233
+ /**
234
+ * Translates an unsubscribe link block to MJML
235
+ */
236
+ function translateUnsubscribeLinkBlock(block, settings) {
237
+ const html = generateEmailHtml(block.settings.content);
238
+ const bgColor = block.settings.backgroundColor === "#FFFFFF00"
239
+ ? ""
240
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundColor)}"`;
241
+ const textColor = block.settings.textColor ?? settings.textColor;
242
+ const fontFamily = block.settings.fontFamily ?? settings.fontFamily;
243
+ const hPad = TEXT_HORIZONTAL_PADDING + (settings.horizontalSpacing ?? 0);
244
+ return `<mj-text
245
+ font-family="${escapeXmlAttribute(fontFamily)}"
246
+ font-size="${block.settings.fontSize}px"
247
+ color="${escapeXmlAttribute(textColor)}"
248
+ align="${block.settings.alignment}"
249
+ padding="0px ${hPad}px"${bgColor}>
250
+ ${html}
251
+ </mj-text>`;
252
+ }
253
+ /**
254
+ * Translates a socials block to MJML
255
+ */
256
+ function translateSocialsBlock(block, settings) {
257
+ const bgColor = block.settings.backgroundColor === "#FFFFFF00"
258
+ ? ""
259
+ : ` container-background-color="${escapeXmlAttribute(block.settings.backgroundColor)}"`;
260
+ const enabledSocials = SOCIAL_PLATFORMS.filter((platform) => block.settings.socials[platform].enabled);
261
+ const socialIconsHtml = enabledSocials
262
+ .filter((platform) => {
263
+ const url = block.settings.socials[platform].url;
264
+ return url && url.trim() !== "";
265
+ })
266
+ .map((platform) => {
267
+ const url = escapeXmlAttribute(block.settings.socials[platform].url);
268
+ const icon = SOCIAL_ICONS[platform];
269
+ return `<a href="${url}" target="_blank" rel="noopener noreferrer" style="display:inline-block;margin:0 4px;"><img src="${icon}" alt="${platform}" width="24" height="24" style="border:0;display:inline-block;" /></a>`;
270
+ })
271
+ .join("");
272
+ const hPad = settings.horizontalSpacing ?? 0;
273
+ return `<mj-text align="center" padding="0px ${hPad}px"${bgColor}>
274
+ ${socialIconsHtml}
275
+ </mj-text>`;
276
+ }
277
+ /**
278
+ * Translates a top products block to MJML
279
+ * Products are pre-fetched during compilation enrichment
280
+ */
281
+ function translateTopProductsBlock(block, settings) {
282
+ const products = block._products;
283
+ if (!products || products.length === 0)
284
+ return "";
285
+ const fontFamily = settings.fontFamily || "Arial";
286
+ const displayProducts = products.slice(0, block.settings.maxProducts);
287
+ const productSections = displayProducts
288
+ .map((product) => {
289
+ const parsed = parseFloat(product.price);
290
+ const showPrice = product.price &&
291
+ product.price !== "0" &&
292
+ !isNaN(parsed) &&
293
+ parsed !== 0;
294
+ const priceHtml = showPrice
295
+ ? `<mj-text align="left" font-family="${escapeXmlAttribute(fontFamily)}" font-size="10px" line-height="16px" color="#86837C" padding="0px">${escapeXmlAttribute(product.price)}</mj-text>`
296
+ : "";
297
+ return `<mj-section background-color="#FFFFFF" padding="4px" border-radius="12px" border="2px solid #F1F0EF">
298
+ <mj-group>
299
+ <mj-column width="30%">
300
+ <mj-image padding="0px" border-radius="4px" src="${escapeXmlAttribute(product.image)}" alt="${escapeXmlAttribute(product.name)}" href="${escapeXmlAttribute(product.link)}" />
301
+ </mj-column>
302
+ <mj-column width="70%" padding="8px">
303
+ <mj-text padding="0px" align="left" font-family="${escapeXmlAttribute(fontFamily)}" font-size="12px" line-height="18px" font-weight="500" color="#292826" height="55px">${escapeXmlAttribute(product.name)}</mj-text>
304
+ ${priceHtml}
305
+ </mj-column>
306
+ </mj-group>
307
+ </mj-section>`;
308
+ })
309
+ .join("\n");
310
+ return `<mj-wrapper padding="24px" background-color="${escapeXmlAttribute(block.settings.backgroundColor)}">
311
+ ${productSections}
312
+ </mj-wrapper>`;
313
+ }
314
+ /**
315
+ * Translates a single content block to MJML (non-grid blocks only)
316
+ * These are components that go inside mj-column
317
+ */
318
+ function translateContentBlockToMjml(block, settings) {
319
+ switch (block.type) {
320
+ case "discount":
321
+ return translateDiscountBlock(block, settings);
322
+ case "heading":
323
+ return translateHeadingBlock(block, settings);
324
+ case "paragraph":
325
+ return translateParagraphBlock(block, settings);
326
+ case "image":
327
+ return translateImageBlock(block, settings);
328
+ case "button":
329
+ return translateButtonBlock(block, settings);
330
+ default:
331
+ return "";
332
+ }
333
+ }
334
+ /**
335
+ * Translates a block to MJML section(s)
336
+ * Grid blocks become multi-column sections
337
+ * Other blocks are wrapped in single-column sections
338
+ */
339
+ function translateBlockToSection(block, settings, isFirst) {
340
+ const { verticalSpacing = 0 } = settings;
341
+ const paddingTop = isFirst ? 0 : verticalSpacing;
342
+ const sectionPadding = `${paddingTop}px 0px 0px 0px`;
343
+ // Wrap single blocks in a section with one column
344
+ let content = "";
345
+ switch (block.type) {
346
+ case "spacer":
347
+ content = translateSpacerBlock(block, settings);
348
+ break;
349
+ case "divider":
350
+ content = translateDividerBlock(block, settings);
351
+ break;
352
+ case "heading":
353
+ content = translateHeadingBlock(block, settings);
354
+ break;
355
+ case "paragraph":
356
+ content = translateParagraphBlock(block, settings);
357
+ break;
358
+ case "image":
359
+ content = translateImageBlock(block, settings);
360
+ break;
361
+ case "button":
362
+ content = translateButtonBlock(block, settings);
363
+ break;
364
+ case "discount":
365
+ content = translateDiscountBlock(block, settings);
366
+ break;
367
+ case "header":
368
+ content = translateHeaderBlock(block, settings);
369
+ break;
370
+ case "raw_html":
371
+ return translateRawHtmlBlock(block);
372
+ case "grid":
373
+ return translateGridBlock(block, settings, sectionPadding);
374
+ case "footer":
375
+ content = translateFooterBlock(block, settings);
376
+ break;
377
+ case "unsubscribe_link":
378
+ content = translateUnsubscribeLinkBlock(block, settings);
379
+ break;
380
+ case "socials":
381
+ content = translateSocialsBlock(block, settings);
382
+ break;
383
+ case "top_products":
384
+ return translateTopProductsBlock(block, settings);
385
+ default:
386
+ return "";
387
+ }
388
+ return `<mj-section padding="${sectionPadding}">
389
+ <mj-column>
390
+ ${content}
391
+ </mj-column>
392
+ </mj-section>`;
393
+ }
394
+ /**
395
+ * Generates MJML head section with global settings
396
+ */
397
+ function generateMjmlHead(settings) {
398
+ const fontFamily = settings.fontFamily || "Arial";
399
+ const textColor = settings.textColor || "#1F2937";
400
+ return `<mj-head>
401
+ <mj-attributes>
402
+ <mj-text font-family="${escapeXmlAttribute(fontFamily)}" color="${escapeXmlAttribute(textColor)}" padding="0" />
403
+ <mj-all font-family="${escapeXmlAttribute(fontFamily)}" />
404
+ <mj-wrapper padding="0" />
405
+ <mj-section padding="0" />
406
+ <mj-image padding="0" />
407
+ <mj-button padding="0" />
408
+ </mj-attributes>
409
+ <mj-style>
410
+ h1, h2, h3, h4, h5, h6 {
411
+ font-weight: normal;
412
+ }
413
+ .tiptap-emoji img {
414
+ height: 1em !important;
415
+ width: 1em !important;
416
+ vertical-align: middle !important;
417
+ }
418
+ </mj-style>
419
+ </mj-head>`;
420
+ }
421
+ /**
422
+ * Translates an EmailMessage to MJML format
423
+ *
424
+ * @param message - The email message to translate
425
+ * @returns MJML string ready for compilation
426
+ */
427
+ export function translateEmailToMjml(message) {
428
+ const { blocks, settings } = message.body;
429
+ const sections = blocks
430
+ .map((block, index) => translateBlockToSection(block, settings, index === 0))
431
+ .join("\n ");
432
+ // Apply defaults for potentially undefined settings
433
+ const contentBackgroundColor = settings.contentBackgroundColor || "#FFFFFF";
434
+ const _backgroundColor = settings.backgroundColor || "#F3F4F6";
435
+ const contentWidth = settings.contentWidth || 600;
436
+ return `<mjml>
437
+ ${generateMjmlHead(settings)}
438
+ <mj-body background-color="${escapeXmlAttribute(contentBackgroundColor)}" width="${contentWidth}px">
439
+
440
+ ${sections}
441
+ </mj-body>
442
+ </mjml>`;
443
+ }
444
+ //# sourceMappingURL=email-mjml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email-mjml.js","sourceRoot":"","sources":["../../../src/utils/templates/email-mjml.ts"],"names":[],"mappings":"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"}