@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,95 @@
1
+ /**
2
+ * HTML Sanitization for Email Blocks
3
+ *
4
+ * Sanitizes HTML content to remove potentially dangerous elements
5
+ * and ensure email client compatibility.
6
+ */
7
+ /**
8
+ * List of HTML event handler attributes to remove
9
+ */
10
+ const EVENT_HANDLERS = [
11
+ "onclick",
12
+ "ondblclick",
13
+ "onmousedown",
14
+ "onmouseup",
15
+ "onmouseover",
16
+ "onmousemove",
17
+ "onmouseout",
18
+ "onmouseenter",
19
+ "onmouseleave",
20
+ "onload",
21
+ "onunload",
22
+ "onchange",
23
+ "onsubmit",
24
+ "onreset",
25
+ "onselect",
26
+ "onblur",
27
+ "onfocus",
28
+ "onkeydown",
29
+ "onkeypress",
30
+ "onkeyup",
31
+ "onerror",
32
+ "onabort",
33
+ "onresize",
34
+ "onscroll",
35
+ ];
36
+ /**
37
+ * Sanitize HTML content for email use
38
+ *
39
+ * Removes:
40
+ * - <script> tags and their content
41
+ * - <style> tags (inline styles are allowed)
42
+ * - Event handlers (onclick, onerror, etc.)
43
+ * - javascript: URLs
44
+ * - Non-HTTPS external resources
45
+ *
46
+ * @param html - Raw HTML content
47
+ * @returns Sanitized HTML content
48
+ */
49
+ export function sanitizeEmailHtml(html) {
50
+ if (!html || html.trim() === "") {
51
+ return "";
52
+ }
53
+ let sanitized = html;
54
+ // Remove <script> tags and their content
55
+ sanitized = sanitized.replace(/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi, "");
56
+ // Remove <style> tags and their content
57
+ sanitized = sanitized.replace(/<style\b[^<]*(?:(?!<\/style>)<[^<]*)*<\/style>/gi, "");
58
+ // Remove javascript: URLs in href and src attributes
59
+ sanitized = sanitized.replace(/href\s*=\s*["']?\s*javascript:/gi, 'href="#"');
60
+ sanitized = sanitized.replace(/src\s*=\s*["']?\s*javascript:/gi, 'src=""');
61
+ // Remove event handler attributes
62
+ for (const handler of EVENT_HANDLERS) {
63
+ const regex = new RegExp(`\\s${handler}\\s*=\\s*["'][^"']*["']`, "gi");
64
+ sanitized = sanitized.replace(regex, "");
65
+ }
66
+ // Replace HTTP URLs with HTTPS in src and href attributes
67
+ // This is a best-effort approach - broken HTTPS links are better than HTTP for email security
68
+ sanitized = sanitized.replace(/(src|href)\s*=\s*["']http:\/\//gi, '$1="https://');
69
+ return sanitized;
70
+ }
71
+ /**
72
+ * Validate HTML content length
73
+ *
74
+ * @param html - HTML content
75
+ * @param maxLength - Maximum allowed length
76
+ * @returns True if valid, false otherwise
77
+ */
78
+ export function validateHtmlLength(html, maxLength) {
79
+ return html.length <= maxLength;
80
+ }
81
+ /**
82
+ * Get validation errors for HTML content
83
+ *
84
+ * @param html - HTML content
85
+ * @param maxLength - Maximum allowed length
86
+ * @returns Array of validation error messages
87
+ */
88
+ export function getHtmlValidationErrors(html, maxLength) {
89
+ const errors = [];
90
+ if (html.length > maxLength) {
91
+ errors.push(`HTML content exceeds maximum length of ${maxLength} characters`);
92
+ }
93
+ return errors;
94
+ }
95
+ //# sourceMappingURL=html-sanitizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-sanitizer.js","sourceRoot":"","sources":["../../../src/utils/templates/html-sanitizer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,cAAc,GAAG;IACrB,SAAS;IACT,YAAY;IACZ,aAAa;IACb,WAAW;IACX,aAAa;IACb,aAAa;IACb,YAAY;IACZ,cAAc;IACd,cAAc;IACd,QAAQ;IACR,UAAU;IACV,UAAU;IACV,UAAU;IACV,SAAS;IACT,UAAU;IACV,QAAQ;IACR,SAAS;IACT,WAAW;IACX,YAAY;IACZ,SAAS;IACT,SAAS;IACT,SAAS;IACT,UAAU;IACV,UAAU;CACX,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,SAAS,GAAG,IAAI,CAAC;IAErB,yCAAyC;IACzC,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,qDAAqD,EACrD,EAAE,CACH,CAAC;IAEF,wCAAwC;IACxC,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,kDAAkD,EAClD,EAAE,CACH,CAAC;IAEF,qDAAqD;IACrD,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,kCAAkC,EAAE,UAAU,CAAC,CAAC;IAC9E,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,iCAAiC,EAAE,QAAQ,CAAC,CAAC;IAE3E,kCAAkC;IAClC,KAAK,MAAM,OAAO,IAAI,cAAc,EAAE,CAAC;QACrC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,OAAO,yBAAyB,EAAE,IAAI,CAAC,CAAC;QACvE,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,0DAA0D;IAC1D,8FAA8F;IAC9F,SAAS,GAAG,SAAS,CAAC,OAAO,CAC3B,kCAAkC,EAClC,cAAc,CACf,CAAC;IAEF,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAY,EAAE,SAAiB;IAChE,OAAO,IAAI,CAAC,MAAM,IAAI,SAAS,CAAC;AAClC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAY,EACZ,SAAiB;IAEjB,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,IAAI,IAAI,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CACT,0CAA0C,SAAS,aAAa,CACjE,CAAC;IACJ,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { generateWhatsappTextPreview, generateWhatsappText, generateWhatsappHtml, } from "./whatsapp.js";
2
+ import { generateEmailHtml, generateEmailText, generateEmailTextPreview, } from "./email.js";
3
+ export function generateTextPreview(message) {
4
+ switch (message.render_type) {
5
+ case "whatsapp_v1":
6
+ return generateWhatsappTextPreview(message);
7
+ case "email_v1":
8
+ return generateEmailTextPreview(message);
9
+ default:
10
+ return "";
11
+ }
12
+ }
13
+ export function generateText(content, render_type) {
14
+ switch (render_type) {
15
+ case "whatsapp_v1":
16
+ return generateWhatsappText(content);
17
+ case "email_v1":
18
+ return generateEmailText(content);
19
+ default:
20
+ return "";
21
+ }
22
+ }
23
+ export function generateHtml(content, render_type) {
24
+ switch (render_type) {
25
+ case "whatsapp_v1":
26
+ return generateWhatsappHtml(content);
27
+ case "email_v1":
28
+ return generateEmailHtml(content);
29
+ default:
30
+ return "";
31
+ }
32
+ }
33
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../../src/utils/templates/messages.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAC3B,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,wBAAwB,GACzB,MAAM,YAAY,CAAC;AAEpB,MAAM,UAAU,mBAAmB,CAAC,OAAsB;IACxD,QAAQ,OAAO,CAAC,WAAW,EAAE,CAAC;QAC5B,KAAK,aAAa;YAChB,OAAO,2BAA2B,CAAC,OAAO,CAAC,CAAC;QAC9C,KAAK,UAAU;YACb,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC3C;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAoB,EAAE,WAAuB;IACxE,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,aAAa;YAChB,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvC,KAAK,UAAU;YACb,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACpC;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,OAAoB,EAAE,WAAuB;IACxE,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,aAAa;YAChB,OAAO,oBAAoB,CAAC,OAAO,CAAC,CAAC;QACvC,KAAK,UAAU;YACb,OAAO,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACpC;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC"}
@@ -0,0 +1,246 @@
1
+ import { WA_BODY_MAX_LENGTH, WA_HEADER_TEXT_MAX_LENGTH, WA_FOOTER_MAX_LENGTH, } from "../../types/index.js";
2
+ import { convertToWhatsappMarkdown } from "./whatsapp.js";
3
+ /**
4
+ * Generates a unique template name for Meta
5
+ */
6
+ function generateMetaTemplateName(groupName, languageId, prefix) {
7
+ const sanitized = groupName
8
+ .toLowerCase()
9
+ .replace(/[^a-z0-9]/g, "_")
10
+ .replace(/_+/g, "_")
11
+ .replace(/^_|_$/g, "");
12
+ const randomSuffix = Math.random().toString(36).substring(2, 8);
13
+ const name = `${prefix}_${sanitized}_${languageId}_${randomSuffix}`;
14
+ // Ensure max 512 characters
15
+ return name.substring(0, 512);
16
+ }
17
+ function generateExampleContent(text, componentType) {
18
+ const paramRegex = /\{\{([^}]+)\}\}/g;
19
+ const matches = [...text.matchAll(paramRegex)];
20
+ if (matches.length === 0) {
21
+ return undefined;
22
+ }
23
+ /**
24
+ * Generates an example value based on parameter name patterns
25
+ */
26
+ function getExampleValue(paramName) {
27
+ const lowerParam = paramName.toLowerCase();
28
+ // Check patterns in order of specificity
29
+ if (lowerParam.includes("link") ||
30
+ lowerParam.includes("url") ||
31
+ lowerParam.includes("website")) {
32
+ return "https://checkin.smartness.com?checkin=123";
33
+ }
34
+ if (lowerParam.includes("phone")) {
35
+ return "+39 123 456 7890";
36
+ }
37
+ if (lowerParam.includes("number") ||
38
+ lowerParam.includes("code") ||
39
+ lowerParam.includes("pin") ||
40
+ lowerParam.includes("id")) {
41
+ return "111";
42
+ }
43
+ if (lowerParam.includes("mail")) {
44
+ return "example@example.com";
45
+ }
46
+ if (lowerParam.includes("accommodation") ||
47
+ lowerParam.includes("property")) {
48
+ return "AB Hotel";
49
+ }
50
+ if (lowerParam.includes("surname")) {
51
+ return "Rossi";
52
+ }
53
+ if (lowerParam.includes("name")) {
54
+ return "Mario";
55
+ }
56
+ if (lowerParam.includes("date")) {
57
+ return "2024-06-15";
58
+ }
59
+ if (lowerParam.includes("amount") ||
60
+ lowerParam.includes("price") ||
61
+ lowerParam.includes("tax")) {
62
+ return "100";
63
+ }
64
+ // Default fallback
65
+ return `Example ${paramName}`;
66
+ }
67
+ const namedParams = matches.map((match) => {
68
+ const paramName = match[1].trim();
69
+ const example = getExampleValue(paramName);
70
+ return {
71
+ param_name: paramName,
72
+ example: example,
73
+ };
74
+ });
75
+ const propertyName = `${componentType}_text_named_params`;
76
+ return {
77
+ [propertyName]: namedParams,
78
+ };
79
+ }
80
+ /**
81
+ * Translates WhatsApp header to Meta header component
82
+ */
83
+ function translateHeaderToMeta(header) {
84
+ switch (header.type) {
85
+ case "none": {
86
+ return null;
87
+ }
88
+ case "text": {
89
+ if (!header.content)
90
+ return null;
91
+ const text = convertToWhatsappMarkdown(header.content);
92
+ const exampleContent = generateExampleContent(text, "header");
93
+ const result = {
94
+ type: "HEADER",
95
+ format: "TEXT",
96
+ text: text.substring(0, WA_HEADER_TEXT_MAX_LENGTH), // Meta limit
97
+ };
98
+ if (exampleContent && "header_text_named_params" in exampleContent) {
99
+ result.example = exampleContent;
100
+ }
101
+ return result;
102
+ }
103
+ case "image":
104
+ case "video":
105
+ case "document": {
106
+ const result = {
107
+ type: "HEADER",
108
+ format: header.type.toUpperCase(),
109
+ };
110
+ // Include media handle if available
111
+ if (header.metaMediaId) {
112
+ result.example = { header_handle: [header.metaMediaId] };
113
+ }
114
+ return result;
115
+ }
116
+ default: {
117
+ return null;
118
+ }
119
+ }
120
+ }
121
+ /**
122
+ * Translates WhatsApp body to Meta body component
123
+ */
124
+ function translateBodyToMeta(body) {
125
+ const text = convertToWhatsappMarkdown(body.content);
126
+ const exampleContent = generateExampleContent(text, "body");
127
+ const result = {
128
+ type: "BODY",
129
+ text: text.substring(0, WA_BODY_MAX_LENGTH), // Meta limit
130
+ };
131
+ if (exampleContent && "body_text_named_params" in exampleContent) {
132
+ result.example = exampleContent;
133
+ }
134
+ return result;
135
+ }
136
+ /**
137
+ * Translates WhatsApp footer to Meta footer component
138
+ */
139
+ function translateFooterToMeta(footer) {
140
+ if (!footer.enabled || !footer.content.trim()) {
141
+ return null;
142
+ }
143
+ return {
144
+ type: "FOOTER",
145
+ text: footer.content.substring(0, WA_FOOTER_MAX_LENGTH), // Meta limit
146
+ };
147
+ }
148
+ /**
149
+ * Generates example values for button URL parameters
150
+ */
151
+ function generateButtonExamples(url) {
152
+ const paramRegex = /\{\{([^}]+)\}\}/g;
153
+ const matches = [...url.matchAll(paramRegex)];
154
+ if (matches.length === 0) {
155
+ return undefined;
156
+ }
157
+ return Array.from({ length: matches.length }).map((_, index) => {
158
+ return `https://connect.smartness.com/123/book/${index + 1}`;
159
+ });
160
+ }
161
+ /**
162
+ * Translates WhatsApp buttons to Meta button component
163
+ */
164
+ function translateButtonsToMeta(buttons) {
165
+ if (!buttons.enabled || buttons.buttons.length === 0) {
166
+ return null;
167
+ }
168
+ const metaButtons = buttons.buttons
169
+ .map((button, index) => {
170
+ switch (button.type) {
171
+ case "quick_reply":
172
+ case "unsubscribe":
173
+ return {
174
+ type: "QUICK_REPLY",
175
+ text: button.text.substring(0, 20),
176
+ };
177
+ case "phone":
178
+ return {
179
+ type: "PHONE_NUMBER",
180
+ text: button.text.substring(0, 20),
181
+ phone_number: button.phoneNumber,
182
+ };
183
+ case "link": {
184
+ const examples = generateButtonExamples(button.url);
185
+ // Extract {{<variable_name>}} (single param case) and replace with {{1}} for url as required by Meta
186
+ let metaUrl = button.url;
187
+ const singleParamMatch = metaUrl.match(/\{\{([^}]+)\}\}/);
188
+ if (singleParamMatch) {
189
+ metaUrl = metaUrl.replace(singleParamMatch[0], `{{${index + 1}}}`);
190
+ }
191
+ const result = {
192
+ type: "URL",
193
+ text: button.text.substring(0, 20),
194
+ url: metaUrl,
195
+ };
196
+ if (examples) {
197
+ result.example = examples;
198
+ }
199
+ return result;
200
+ }
201
+ default:
202
+ return null;
203
+ }
204
+ })
205
+ .filter((btn) => btn !== null);
206
+ if (metaButtons.length === 0)
207
+ return null;
208
+ return {
209
+ type: "BUTTONS",
210
+ buttons: metaButtons.slice(0, 10), // Meta limit
211
+ };
212
+ }
213
+ /**
214
+ * Translates a WhatsApp message to Meta template format
215
+ */
216
+ export function translateWhatsappToMeta(message, groupName, groupCategory, prefix) {
217
+ const components = [];
218
+ // Header
219
+ const headerComponent = translateHeaderToMeta(message.body.header);
220
+ if (headerComponent) {
221
+ components.push(headerComponent);
222
+ }
223
+ // Body (mandatory)
224
+ const bodyComponent = translateBodyToMeta(message.body.body);
225
+ components.push(bodyComponent);
226
+ // Footer
227
+ const footerComponent = translateFooterToMeta(message.body.footer);
228
+ if (footerComponent) {
229
+ components.push(footerComponent);
230
+ }
231
+ // Buttons
232
+ const buttonComponent = translateButtonsToMeta(message.body.buttons);
233
+ if (buttonComponent) {
234
+ components.push(buttonComponent);
235
+ }
236
+ return {
237
+ name: message.metadata?.meta?.template_name ||
238
+ generateMetaTemplateName(groupName, message.language_id, prefix),
239
+ language: message.language_id,
240
+ category: groupCategory.toUpperCase(),
241
+ parameter_format: "NAMED",
242
+ allow_category_change: true,
243
+ components,
244
+ };
245
+ }
246
+ //# sourceMappingURL=meta.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../../../src/utils/templates/meta.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,167 @@
1
+ import { generateJSON } from "@tiptap/html";
2
+ import StarterKit from "@tiptap/starter-kit";
3
+ import Mention from "@tiptap/extension-mention";
4
+ import Emoji, { gitHubEmojis } from "@tiptap/extension-emoji";
5
+ import { CharacterCount } from "@tiptap/extensions";
6
+ import TextAlign from "@tiptap/extension-text-align";
7
+ import { WA_BODY_MAX_LENGTH } from "../../types/index.js";
8
+ import { generateHtml, generateText } from "./messages.js";
9
+ const PRESETS = {
10
+ whatsapp: {
11
+ bold: true,
12
+ italic: true,
13
+ emoji: true,
14
+ },
15
+ "whatsapp-header": {
16
+ bold: true,
17
+ italic: true,
18
+ emoji: true,
19
+ },
20
+ email: {
21
+ bold: true,
22
+ italic: true,
23
+ emoji: true,
24
+ underline: true,
25
+ link: true,
26
+ bulletList: true,
27
+ orderedList: true,
28
+ textAlign: true,
29
+ horizontalRule: true,
30
+ hardBreak: true,
31
+ },
32
+ };
33
+ export function getTipTapExtensions(options = {}) {
34
+ const presetOptions = options.preset ? PRESETS[options.preset] : {};
35
+ const merged = { ...presetOptions, ...options };
36
+ const { bold = false, italic = false, emoji = false, underline = false, link = false, bulletList = false, orderedList = false, textAlign = false, dynamicValues = true, characterLimit, horizontalRule = false, hardBreak = false, } = merged;
37
+ const extensions = [];
38
+ // Add character count if limit is set
39
+ if (characterLimit) {
40
+ extensions.push(CharacterCount.configure({
41
+ limit: characterLimit,
42
+ }));
43
+ }
44
+ // Add mention support if dynamic values are provided
45
+ if (dynamicValues) {
46
+ extensions.push(Mention.configure({
47
+ renderText: (mention) => `{{${mention.node.attrs.label}}}`,
48
+ renderHTML: (mention) => `{{${mention.node.attrs.label || mention.node.attrs.id}}}`,
49
+ HTMLAttributes: {
50
+ class: "dynamic-data",
51
+ },
52
+ deleteTriggerWithBackspace: true,
53
+ }));
54
+ }
55
+ // Add emoji support if enabled
56
+ if (emoji) {
57
+ extensions.push(Emoji.configure({
58
+ emojis: gitHubEmojis,
59
+ HTMLAttributes: {
60
+ class: "tiptap-emoji",
61
+ },
62
+ suggestion: {
63
+ char: ":",
64
+ items: (props) => gitHubEmojis.filter((emoji) => emoji.name.includes(props.query)),
65
+ },
66
+ }));
67
+ }
68
+ // Add text align extension if enabled
69
+ if (textAlign) {
70
+ extensions.push(TextAlign.configure({
71
+ types: ["paragraph"],
72
+ }));
73
+ }
74
+ // Configure StarterKit based on enabled features
75
+ extensions.push(StarterKit.configure({
76
+ bold: bold ? undefined : false,
77
+ italic: italic ? undefined : false,
78
+ underline: underline ? undefined : false,
79
+ link: link
80
+ ? {
81
+ openOnClick: false,
82
+ }
83
+ : false,
84
+ heading: false,
85
+ bulletList: bulletList ? undefined : false,
86
+ orderedList: orderedList ? undefined : false,
87
+ listItem: bulletList || orderedList ? undefined : false,
88
+ blockquote: false,
89
+ code: false,
90
+ codeBlock: false,
91
+ horizontalRule: horizontalRule
92
+ ? {
93
+ HTMLAttributes: {
94
+ style: "border-top: 1px solid #E5E7EB; margin: 16px 0;",
95
+ },
96
+ }
97
+ : false,
98
+ hardBreak: hardBreak ? undefined : false,
99
+ strike: false,
100
+ }));
101
+ return extensions;
102
+ }
103
+ export function getAllMentions(content) {
104
+ if (!content)
105
+ return [];
106
+ function processNode(node) {
107
+ if (typeof node === "string") {
108
+ return [];
109
+ }
110
+ if (Array.isArray(node)) {
111
+ return node.map(processNode);
112
+ }
113
+ if (!node || typeof node !== "object") {
114
+ return [];
115
+ }
116
+ // Process content recursively
117
+ if (node.content) {
118
+ const a = node.content.map(processNode);
119
+ return a.flat();
120
+ }
121
+ // Handle block-level elements
122
+ switch (node.type) {
123
+ case "mention":
124
+ return [node];
125
+ default:
126
+ return [];
127
+ }
128
+ }
129
+ return processNode(content)?.flat().filter(Boolean) ?? [];
130
+ }
131
+ export function extractText(field, renderType) {
132
+ if (!field)
133
+ return "";
134
+ // If it's TipTap content (object with type and content)
135
+ if (typeof field === "object" && field.type) {
136
+ return generateHtml(field, renderType);
137
+ }
138
+ // If it's plain text
139
+ if (typeof field === "string") {
140
+ return field;
141
+ }
142
+ return "";
143
+ }
144
+ export function isTiptapEmpty(field, renderType) {
145
+ if (!field)
146
+ return true;
147
+ // For TipTap content
148
+ if (typeof field === "object" && field.type) {
149
+ const text = generateText(field, renderType);
150
+ return !text || text.trim() === "";
151
+ }
152
+ // For plain text
153
+ if (typeof field === "string") {
154
+ return !field || field.trim() === "";
155
+ }
156
+ return true;
157
+ }
158
+ /**
159
+ * Create TipTap JSON structure from plain text
160
+ */
161
+ export function createTipTapContent(text, options = {
162
+ preset: "whatsapp",
163
+ characterLimit: WA_BODY_MAX_LENGTH,
164
+ }) {
165
+ return generateJSON(text, getTipTapExtensions(options));
166
+ }
167
+ //# sourceMappingURL=tiptap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tiptap.js","sourceRoot":"","sources":["../../../src/utils/templates/tiptap.ts"],"names":[],"mappings":"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"}