@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,580 @@
1
+ import { TRANSLATABLE_BLOCK_TYPES, HTML_MAX_LENGTH, emptyFooterBlock, emptyDividerBlock, emptyUnsubscribeLinkBlock, emptyHeaderBlock, } from "../../types/index.js";
2
+ import { generateHTML } from "@tiptap/html";
3
+ import { generateText } from "@tiptap/core";
4
+ import { getTipTapExtensions, isTiptapEmpty } from "./tiptap.js";
5
+ import { isValidUrl, isValidPhoneNumber, isEmail } from "../validations.js";
6
+ /**
7
+ * Creates an empty email message template
8
+ */
9
+ export function getEmailEmpty(languageId) {
10
+ const defaultSettings = {
11
+ contentWidth: 600,
12
+ verticalSpacing: 0,
13
+ horizontalSpacing: 0,
14
+ };
15
+ return {
16
+ user_id: "",
17
+ status: "draft",
18
+ render_type: "email_v1",
19
+ body: {
20
+ subject: "",
21
+ blocks: [
22
+ emptyHeaderBlock(),
23
+ emptyFooterBlock(),
24
+ emptyDividerBlock(),
25
+ emptyUnsubscribeLinkBlock(languageId),
26
+ ],
27
+ settings: { ...defaultSettings },
28
+ },
29
+ metadata: {},
30
+ language_id: languageId,
31
+ message_group_id: "",
32
+ };
33
+ }
34
+ /**
35
+ * Validates if an email message is valid
36
+ * Checks:
37
+ * - Subject required and not empty
38
+ * - At least one non-empty block exists
39
+ * - Block-specific constraints (dimensions, content)
40
+ */
41
+ export function isEmailValid(message, brand) {
42
+ const errors = [];
43
+ if (message.render_type !== "email_v1") {
44
+ return {
45
+ valid: false,
46
+ errors: ["editor.validation.error.invalidRenderType"],
47
+ };
48
+ }
49
+ // Validate subject
50
+ if (!message.body.subject || message.body.subject.trim() === "") {
51
+ errors.push("editor.validation.error.subjectRequired");
52
+ }
53
+ // Validate that at least one content block exists (text or image)
54
+ const hasContent = hasContentBlock(message.body.blocks);
55
+ if (!hasContent) {
56
+ errors.push("editor.validation.error.atLeastOneBlockRequired");
57
+ }
58
+ // Validate unsubscribe block exists
59
+ const hasUnsubscribe = message.body.blocks.some((block) => block.type === "unsubscribe_link");
60
+ if (!hasUnsubscribe) {
61
+ errors.push("editor.validation.error.unsubscribeBlockMissing");
62
+ }
63
+ // Validate block constraints
64
+ for (const block of message.body.blocks) {
65
+ validateEmailBlock(block, errors, brand);
66
+ }
67
+ return {
68
+ valid: errors.length === 0,
69
+ errors,
70
+ };
71
+ }
72
+ /**
73
+ * Check if blocks array has at least one content block (text or image with src)
74
+ */
75
+ function hasContentBlock(blocks) {
76
+ for (const block of blocks) {
77
+ // Check translatable text blocks
78
+ if (block.type === "heading" ||
79
+ block.type === "paragraph" ||
80
+ block.type === "button" ||
81
+ block.type === "discount" ||
82
+ block.type === "footer" ||
83
+ block.type === "raw_html" ||
84
+ block.type === "unsubscribe_link") {
85
+ if (!isEmailBlockEmpty(block))
86
+ return true;
87
+ }
88
+ // Check image blocks with valid src
89
+ if (block.type === "image") {
90
+ if (block.settings.src && block.settings.src.trim() !== "")
91
+ return true;
92
+ }
93
+ // Recursively check grid columns
94
+ if (block.type === "grid") {
95
+ for (const column of block.settings.columnData) {
96
+ if (hasContentBlock(column.blocks))
97
+ return true;
98
+ }
99
+ }
100
+ }
101
+ return false;
102
+ }
103
+ /**
104
+ * Validates individual email blocks
105
+ */
106
+ function validateEmailBlock(block, errors, brand) {
107
+ switch (block.type) {
108
+ case "image":
109
+ if (!block.settings.src || block.settings.src.trim() === "") {
110
+ errors.push("editor.validation.error.imageSourceRequired");
111
+ }
112
+ break;
113
+ case "header":
114
+ if ((!block.settings.src || block.settings.src.trim() === "") &&
115
+ !brand?.logo_url) {
116
+ errors.push("editor.validation.error.headerLogoRequired");
117
+ }
118
+ break;
119
+ case "button":
120
+ if (isTiptapEmpty(block.settings.content, "email_v1")) {
121
+ errors.push("editor.validation.error.buttonTextRequired");
122
+ }
123
+ if (!block.settings.url || block.settings.url.trim() === "") {
124
+ errors.push("editor.validation.error.urlRequired");
125
+ }
126
+ else {
127
+ const url = block.settings.url.trim();
128
+ switch (block.settings.linkType) {
129
+ case "web":
130
+ if (!isValidUrl(url)) {
131
+ errors.push("editor.validation.error.urlInvalid");
132
+ }
133
+ break;
134
+ case "email":
135
+ if (!isEmail(url)) {
136
+ errors.push("editor.validation.error.emailInvalid");
137
+ }
138
+ break;
139
+ case "phone":
140
+ if (!isValidPhoneNumber(url)) {
141
+ errors.push("editor.validation.error.phoneInvalid");
142
+ }
143
+ break;
144
+ }
145
+ }
146
+ break;
147
+ case "unsubscribe_link": {
148
+ // Content must contain {{unsubscribe}} dynamic value
149
+ const html = generateEmailHtml(block.settings.content);
150
+ if (!html.includes("{{unsubscribe}}")) {
151
+ errors.push("editor.validation.error.unsubscribeLinkRequired");
152
+ }
153
+ break;
154
+ }
155
+ case "socials": {
156
+ const entries = Object.entries(block.settings.socials);
157
+ const enabled = entries.filter(([, s]) => s.enabled);
158
+ if (enabled.length === 0) {
159
+ errors.push("editor.validation.error.socialsNoEnabled");
160
+ }
161
+ else {
162
+ const brandSocials = brand?.default_socials;
163
+ for (const [platform, social] of enabled) {
164
+ const hasBlockUrl = social.url && social.url.trim() !== "";
165
+ const hasBrandUrl = !!brandSocials?.[platform];
166
+ if (!hasBlockUrl && !hasBrandUrl) {
167
+ errors.push("editor.validation.error.socialsUrlRequired");
168
+ break;
169
+ }
170
+ }
171
+ }
172
+ break;
173
+ }
174
+ case "raw_html":
175
+ if (block.settings.html.length > HTML_MAX_LENGTH) {
176
+ errors.push("editor.validation.error.htmlMaxLength");
177
+ }
178
+ break;
179
+ case "top_products":
180
+ if (!block.settings.storeId || block.settings.storeId.trim() === "") {
181
+ errors.push("editor.validation.error.topProductsStoreIdRequired");
182
+ }
183
+ break;
184
+ case "grid":
185
+ // Each column must have at least one valid block
186
+ for (const column of block.settings.columnData) {
187
+ if (!hasContentBlock(column.blocks)) {
188
+ errors.push("editor.validation.error.gridColumnEmpty");
189
+ }
190
+ // Recursively validate nested blocks
191
+ for (const nestedBlock of column.blocks) {
192
+ validateEmailBlock(nestedBlock, errors, brand);
193
+ }
194
+ }
195
+ break;
196
+ }
197
+ }
198
+ /**
199
+ * Extract translatable blocks from email blocks array (including nested grid blocks)
200
+ */
201
+ export function extractTranslatableBlocks(blocks) {
202
+ const translatable = [];
203
+ for (const block of blocks) {
204
+ if (block.type === "heading" ||
205
+ block.type === "paragraph" ||
206
+ block.type === "button" ||
207
+ block.type === "discount" ||
208
+ block.type === "footer" ||
209
+ block.type === "raw_html" ||
210
+ block.type === "unsubscribe_link") {
211
+ translatable.push(block);
212
+ }
213
+ else if (block.type === "grid") {
214
+ // Recursively extract from grid columns
215
+ for (const column of block.settings.columnData) {
216
+ const nestedTranslatable = extractTranslatableBlocks(column.blocks);
217
+ translatable.push(...nestedTranslatable);
218
+ }
219
+ }
220
+ }
221
+ return translatable;
222
+ }
223
+ /**
224
+ * Check if email block content is empty
225
+ */
226
+ export function isEmailBlockEmpty(block) {
227
+ switch (block.type) {
228
+ case "heading":
229
+ case "paragraph":
230
+ case "button":
231
+ case "discount":
232
+ case "footer":
233
+ case "unsubscribe_link":
234
+ return (Boolean(block.settings.content) &&
235
+ isTiptapEmpty(block.settings.content, "email_v1"));
236
+ case "raw_html":
237
+ return !block.settings.html || block.settings.html.trim() === "";
238
+ case "image":
239
+ case "header":
240
+ return !block.settings.src;
241
+ default:
242
+ return false;
243
+ }
244
+ }
245
+ /**
246
+ * Check if email block content is empty
247
+ */
248
+ export function isEmailTranslatableBlockEmpty(block) {
249
+ switch (block.type) {
250
+ case "heading":
251
+ case "paragraph":
252
+ case "button":
253
+ case "discount":
254
+ case "footer":
255
+ case "unsubscribe_link":
256
+ return (Boolean(block.settings.content) &&
257
+ isTiptapEmpty(block.settings.content, "email_v1"));
258
+ case "raw_html":
259
+ return !block.settings.html || block.settings.html.trim() === "";
260
+ default:
261
+ return true;
262
+ }
263
+ }
264
+ /**
265
+ * Calculate translation percentage for email message
266
+ */
267
+ export function calculateEmailTranslationPercentage(target, base) {
268
+ if (target.render_type !== "email_v1" || base.render_type !== "email_v1") {
269
+ return 0;
270
+ }
271
+ const baseTranslatableBlocks = extractTranslatableBlocks(base.body.blocks);
272
+ const targetTranslatableBlocks = extractTranslatableBlocks(target.body.blocks);
273
+ // Build ID-based map of target blocks for matching
274
+ const targetBlocksMap = new Map(targetTranslatableBlocks.map((block) => [block.id, block]));
275
+ let totalFields = baseTranslatableBlocks.length;
276
+ let completedFields = 0;
277
+ // Count subject line
278
+ if (base.body.subject && base.body.subject.trim() !== "") {
279
+ totalFields++;
280
+ if (target.body.subject && target.body.subject.trim() !== "") {
281
+ completedFields++;
282
+ }
283
+ }
284
+ // Count translated blocks by ID
285
+ for (const baseBlock of baseTranslatableBlocks) {
286
+ const targetBlock = targetBlocksMap.get(baseBlock.id);
287
+ if (!targetBlock)
288
+ continue;
289
+ // Check if base has content
290
+ if (!isEmailBlockEmpty(baseBlock)) {
291
+ // Check if target also has content
292
+ if (!isEmailBlockEmpty(targetBlock)) {
293
+ completedFields++;
294
+ }
295
+ }
296
+ else {
297
+ // If base is empty, don't count it
298
+ totalFields--;
299
+ }
300
+ }
301
+ if (totalFields === 0)
302
+ return 100;
303
+ return Math.round((completedFields / totalFields) * 100);
304
+ }
305
+ /**
306
+ * Duplicate blocks for new language (preserve block IDs, clear translatable content)
307
+ */
308
+ export function duplicateBlocksForNewLanguage(blocks) {
309
+ return blocks.map((block) => {
310
+ const newBlock = { ...block };
311
+ switch (block.type) {
312
+ case "heading":
313
+ case "paragraph":
314
+ case "button":
315
+ case "discount":
316
+ case "footer":
317
+ case "unsubscribe_link":
318
+ // Clear translatable content
319
+ return {
320
+ ...newBlock,
321
+ settings: {
322
+ ...block.settings,
323
+ content: undefined,
324
+ },
325
+ };
326
+ case "raw_html":
327
+ // Copy HTML as-is (manual customization needed)
328
+ return {
329
+ ...newBlock,
330
+ settings: { ...block.settings, html: "" },
331
+ };
332
+ case "grid":
333
+ // Recursively duplicate nested blocks
334
+ return {
335
+ ...newBlock,
336
+ settings: {
337
+ ...block.settings,
338
+ columnData: block.settings.columnData.map((column) => ({
339
+ id: column.id,
340
+ blocks: duplicateBlocksForNewLanguage(column.blocks),
341
+ })),
342
+ },
343
+ };
344
+ default:
345
+ // Non-translatable blocks (spacer, divider, image, header) - copy as-is
346
+ return {
347
+ ...newBlock,
348
+ settings: { ...block.settings },
349
+ };
350
+ }
351
+ });
352
+ }
353
+ /**
354
+ * Helper: Check if block type has translatable content
355
+ */
356
+ function hasTranslatableContent(block) {
357
+ return TRANSLATABLE_BLOCK_TYPES.includes(block.type);
358
+ }
359
+ /**
360
+ * Helper: Create empty translation version of a block
361
+ */
362
+ function createEmptyTranslationBlock(baseBlock) {
363
+ const newBlock = { ...baseBlock };
364
+ switch (baseBlock.type) {
365
+ case "heading":
366
+ case "paragraph":
367
+ case "button":
368
+ case "discount":
369
+ case "footer":
370
+ case "unsubscribe_link":
371
+ return {
372
+ ...newBlock,
373
+ settings: {
374
+ ...baseBlock.settings,
375
+ content: undefined,
376
+ },
377
+ };
378
+ case "grid":
379
+ return {
380
+ ...newBlock,
381
+ settings: {
382
+ ...baseBlock.settings,
383
+ columnData: baseBlock.settings.columnData.map((column) => ({
384
+ id: column.id,
385
+ blocks: column.blocks.map(createEmptyTranslationBlock),
386
+ })),
387
+ },
388
+ };
389
+ default:
390
+ return {
391
+ ...newBlock,
392
+ settings: { ...baseBlock.settings },
393
+ };
394
+ }
395
+ }
396
+ /**
397
+ * Build ID-based map of all target blocks (including nested grid blocks)
398
+ */
399
+ function buildTargetBlockMap(blocks) {
400
+ const map = new Map();
401
+ for (const block of blocks) {
402
+ map.set(block.id, block);
403
+ if (block.type === "grid") {
404
+ for (const column of block.settings.columnData) {
405
+ const nestedMap = buildTargetBlockMap(column.blocks);
406
+ for (const [id, nestedBlock] of nestedMap) {
407
+ map.set(id, nestedBlock);
408
+ }
409
+ }
410
+ }
411
+ }
412
+ return map;
413
+ }
414
+ /**
415
+ * Sync grid columns by ID
416
+ */
417
+ function syncGridColumnsForLayout(baseColumns, targetColumns) {
418
+ const targetMap = new Map(targetColumns.map((col) => [col.id, col]));
419
+ return baseColumns.map((baseCol) => {
420
+ const existing = targetMap.get(baseCol.id);
421
+ if (existing) {
422
+ return {
423
+ id: baseCol.id,
424
+ blocks: syncBlocksRecursiveForLayout(baseCol.blocks, existing.blocks),
425
+ };
426
+ }
427
+ else {
428
+ return {
429
+ id: baseCol.id,
430
+ blocks: baseCol.blocks.map(createEmptyTranslationBlock),
431
+ };
432
+ }
433
+ });
434
+ }
435
+ /**
436
+ * Recursively sync blocks (for nested grids)
437
+ */
438
+ function syncBlocksRecursiveForLayout(baseBlocks, targetBlocks) {
439
+ const targetMap = new Map(targetBlocks.map((b) => [b.id, b]));
440
+ return baseBlocks.map((baseBlock) => {
441
+ const existing = targetMap.get(baseBlock.id);
442
+ if (existing) {
443
+ const synced = { ...existing };
444
+ if (baseBlock.type === "grid" && existing.type === "grid") {
445
+ synced.settings = {
446
+ ...baseBlock.settings,
447
+ columnData: syncGridColumnsForLayout(baseBlock.settings.columnData, existing.settings.columnData),
448
+ };
449
+ }
450
+ else if (hasTranslatableContent(baseBlock) &&
451
+ hasTranslatableContent(existing)) {
452
+ synced.settings = {
453
+ ...baseBlock.settings,
454
+ content: existing.settings.content,
455
+ };
456
+ }
457
+ else if (baseBlock.type === "image" && existing.type === "image") {
458
+ synced.settings = {
459
+ ...baseBlock.settings,
460
+ src: existing.settings.src,
461
+ href: existing.settings.href,
462
+ };
463
+ }
464
+ else {
465
+ synced.settings = { ...baseBlock.settings };
466
+ }
467
+ return synced;
468
+ }
469
+ else {
470
+ return createEmptyTranslationBlock(baseBlock);
471
+ }
472
+ });
473
+ }
474
+ /**
475
+ * Sync single block using target blocks map
476
+ */
477
+ function syncSingleBlock(baseBlock, targetBlocksMap) {
478
+ const existing = targetBlocksMap.get(baseBlock.id);
479
+ if (existing) {
480
+ // Preserve translatable content, sync structure
481
+ const synced = { ...existing };
482
+ switch (baseBlock.type) {
483
+ case "heading":
484
+ case "paragraph":
485
+ case "button":
486
+ case "discount":
487
+ case "footer":
488
+ case "unsubscribe_link":
489
+ synced.settings = {
490
+ ...baseBlock.settings,
491
+ content: existing.settings.content, // PRESERVE
492
+ };
493
+ break;
494
+ case "raw_html":
495
+ // Keep target's HTML (manual customization)
496
+ synced.settings = { ...existing.settings };
497
+ break;
498
+ case "image":
499
+ if (existing.type === "image") {
500
+ synced.settings = {
501
+ ...baseBlock.settings,
502
+ src: existing.settings.src,
503
+ href: existing.settings.href,
504
+ };
505
+ }
506
+ break;
507
+ case "header":
508
+ if (existing.type === "header") {
509
+ synced.settings = {
510
+ ...baseBlock.settings,
511
+ src: existing.settings.src,
512
+ alt: existing.settings.alt,
513
+ };
514
+ }
515
+ break;
516
+ case "grid":
517
+ if (existing.type === "grid") {
518
+ synced.settings = {
519
+ ...baseBlock.settings,
520
+ columnData: syncGridColumnsForLayout(baseBlock.settings.columnData, existing.settings.columnData),
521
+ };
522
+ }
523
+ break;
524
+ default:
525
+ // Non-translatable blocks (spacer, divider)
526
+ synced.settings = { ...baseBlock.settings };
527
+ }
528
+ return synced;
529
+ }
530
+ else {
531
+ // Block doesn't exist in target - create empty translation
532
+ return createEmptyTranslationBlock(baseBlock);
533
+ }
534
+ }
535
+ /**
536
+ * Sync layout from base language to target language
537
+ * - Preserves translatable content in target
538
+ * - Matches blocks by ID
539
+ * - Handles: add blocks, remove blocks (orphans), reorder blocks
540
+ * - Recursively handles grid columns and nested blocks
541
+ */
542
+ export function syncLayoutFromBase(baseBlocks, targetBlocks) {
543
+ // Build ID map of all target blocks (including nested)
544
+ const targetBlocksMap = buildTargetBlockMap(targetBlocks);
545
+ // Main sync: rebuild target array following base order
546
+ return baseBlocks.map((block) => syncSingleBlock(block, targetBlocksMap));
547
+ }
548
+ export function generateEmailTextPreview(message) {
549
+ if (!message?.body.blocks)
550
+ return "";
551
+ const content = message.body.blocks
552
+ .filter((block) => block.type === "paragraph" ||
553
+ block.type === "heading" ||
554
+ block.type === "button" ||
555
+ block.type === "discount" ||
556
+ block.type === "footer" ||
557
+ block.type === "unsubscribe_link")
558
+ .at(0);
559
+ if (content) {
560
+ return generateEmailText(content.settings.content);
561
+ }
562
+ const html = message.body.blocks
563
+ .filter((block) => block.type === "raw_html")
564
+ .at(0);
565
+ if (html) {
566
+ return html.settings.html;
567
+ }
568
+ return "";
569
+ }
570
+ export function generateEmailText(content) {
571
+ if (!content)
572
+ return "";
573
+ return generateText(content, getTipTapExtensions({ preset: "email" }));
574
+ }
575
+ export function generateEmailHtml(content) {
576
+ if (!content)
577
+ return "";
578
+ return generateHTML(content, getTipTapExtensions({ preset: "email" }));
579
+ }
580
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../../src/utils/templates/email.ts"],"names":[],"mappings":"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"}