@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.
- package/dist/types/api/aiIntegration.js +7 -0
- package/dist/types/api/aiIntegration.js.map +1 -0
- package/dist/types/api/apiMessages.js +2 -0
- package/dist/types/api/apiMessages.js.map +1 -0
- package/dist/types/api/index.js +3 -0
- package/dist/types/api/index.js.map +1 -0
- package/dist/types/app.js +23 -0
- package/dist/types/app.js.map +1 -0
- package/dist/types/brand.js +31 -0
- package/dist/types/brand.js.map +1 -0
- package/dist/types/dynamic-values.js +5 -0
- package/dist/types/dynamic-values.js.map +1 -0
- package/dist/types/emailblocks.v1.defaults.js +83 -0
- package/dist/types/emailblocks.v1.defaults.js.map +1 -0
- package/dist/types/emailblocks.v1.js +339 -0
- package/dist/types/emailblocks.v1.js.map +1 -0
- package/dist/types/index.js +16 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/kafka-events.js +2 -0
- package/dist/types/kafka-events.js.map +1 -0
- package/dist/types/language.js +2 -0
- package/dist/types/language.js.map +1 -0
- package/dist/types/media.js +6 -0
- package/dist/types/media.js.map +1 -0
- package/dist/types/message.js +41 -0
- package/dist/types/message.js.map +1 -0
- package/dist/types/meta-template.js +2 -0
- package/dist/types/meta-template.js.map +1 -0
- package/dist/types/meta-webhook.js +2 -0
- package/dist/types/meta-webhook.js.map +1 -0
- package/dist/types/submission-job.js +2 -0
- package/dist/types/submission-job.js.map +1 -0
- package/dist/types/tag.js +2 -0
- package/dist/types/tag.js.map +1 -0
- package/dist/types/utils.js +2 -0
- package/dist/types/utils.js.map +1 -0
- package/dist/types/whatsappblocks.v1.js +24 -0
- package/dist/types/whatsappblocks.v1.js.map +1 -0
- package/dist/utils/array.js +26 -0
- package/dist/utils/array.js.map +1 -0
- package/dist/utils/async.js +22 -0
- package/dist/utils/async.js.map +1 -0
- package/dist/utils/date.js +37 -0
- package/dist/utils/date.js.map +1 -0
- package/dist/utils/index.js +34 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/intl.js +37 -0
- package/dist/utils/intl.js.map +1 -0
- package/dist/utils/meta-status.js +21 -0
- package/dist/utils/meta-status.js.map +1 -0
- package/dist/utils/number.js +24 -0
- package/dist/utils/number.js.map +1 -0
- package/dist/utils/object.js +87 -0
- package/dist/utils/object.js.map +1 -0
- package/dist/utils/string.js +22 -0
- package/dist/utils/string.js.map +1 -0
- package/dist/utils/templates/brand-cascade.js +116 -0
- package/dist/utils/templates/brand-cascade.js.map +1 -0
- package/dist/utils/templates/email-compiler.js +126 -0
- package/dist/utils/templates/email-compiler.js.map +1 -0
- package/dist/utils/templates/email-mjml.js +444 -0
- package/dist/utils/templates/email-mjml.js.map +1 -0
- package/dist/utils/templates/email.js +580 -0
- package/dist/utils/templates/email.js.map +1 -0
- package/dist/utils/templates/html-sanitizer.js +95 -0
- package/dist/utils/templates/html-sanitizer.js.map +1 -0
- package/dist/utils/templates/messages.js +33 -0
- package/dist/utils/templates/messages.js.map +1 -0
- package/dist/utils/templates/meta.js +246 -0
- package/dist/utils/templates/meta.js.map +1 -0
- package/dist/utils/templates/tiptap.js +167 -0
- package/dist/utils/templates/tiptap.js.map +1 -0
- package/dist/utils/templates/whatsapp-compiler.js +168 -0
- package/dist/utils/templates/whatsapp-compiler.js.map +1 -0
- package/dist/utils/templates/whatsapp.js +329 -0
- package/dist/utils/templates/whatsapp.js.map +1 -0
- package/dist/utils/validations.js +39 -0
- package/dist/utils/validations.js.map +1 -0
- package/package.json +43 -0
- package/src/types/api/aiIntegration.ts +59 -0
- package/src/types/api/apiMessages.ts +22 -0
- package/src/types/api/index.ts +2 -0
- package/src/types/app.ts +76 -0
- package/src/types/brand.ts +80 -0
- package/src/types/dynamic-values.ts +47 -0
- package/src/types/emailblocks.v1.defaults.ts +123 -0
- package/src/types/emailblocks.v1.ts +655 -0
- package/src/types/index.ts +15 -0
- package/src/types/kafka-events.ts +46 -0
- package/src/types/language.ts +9 -0
- package/src/types/media.ts +26 -0
- package/src/types/message.ts +635 -0
- package/src/types/meta-template.ts +50 -0
- package/src/types/meta-webhook.ts +32 -0
- package/src/types/submission-job.ts +30 -0
- package/src/types/tag.ts +8 -0
- package/src/types/utils.ts +14 -0
- package/src/types/whatsappblocks.v1.ts +102 -0
- package/src/utils/array.ts +33 -0
- package/src/utils/async.ts +30 -0
- package/src/utils/date.ts +39 -0
- package/src/utils/index.ts +44 -0
- package/src/utils/intl.ts +51 -0
- package/src/utils/meta-status.ts +24 -0
- package/src/utils/number.ts +36 -0
- package/src/utils/object.ts +101 -0
- package/src/utils/string.ts +24 -0
- package/src/utils/templates/brand-cascade.ts +156 -0
- package/src/utils/templates/email-compiler.ts +155 -0
- package/src/utils/templates/email-mjml.ts +602 -0
- package/src/utils/templates/email.ts +713 -0
- package/src/utils/templates/html-sanitizer.ts +121 -0
- package/src/utils/templates/messages.ts +44 -0
- package/src/utils/templates/meta.ts +336 -0
- package/src/utils/templates/tiptap.ts +247 -0
- package/src/utils/templates/whatsapp-compiler.ts +212 -0
- package/src/utils/templates/whatsapp.ts +408 -0
- package/src/utils/validations.ts +49 -0
- 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":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,OAAO,MAAM,2BAA2B,CAAC;AAChD,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,SAAS,MAAM,8BAA8B,CAAC;AAErD,OAAO,EAAc,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAkB3D,MAAM,OAAO,GAGT;IACF,QAAQ,EAAE;QACR,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;KACZ;IACD,iBAAiB,EAAE;QACjB,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;KACZ;IACD,KAAK,EAAE;QACL,IAAI,EAAE,IAAI;QACV,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,IAAI;QACX,SAAS,EAAE,IAAI;QACf,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,IAAI;QAChB,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,cAAc,EAAE,IAAI;QACpB,SAAS,EAAE,IAAI;KAChB;CACF,CAAC;AAEF,MAAM,UAAU,mBAAmB,CACjC,UAAkC,EAAE;IAEpC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,MAAM,MAAM,GAAG,EAAE,GAAG,aAAa,EAAE,GAAG,OAAO,EAAE,CAAC;IAEhD,MAAM,EACJ,IAAI,GAAG,KAAK,EACZ,MAAM,GAAG,KAAK,EACd,KAAK,GAAG,KAAK,EACb,SAAS,GAAG,KAAK,EACjB,IAAI,GAAG,KAAK,EACZ,UAAU,GAAG,KAAK,EAClB,WAAW,GAAG,KAAK,EACnB,SAAS,GAAG,KAAK,EACjB,aAAa,GAAG,IAAI,EACpB,cAAc,EACd,cAAc,GAAG,KAAK,EACtB,SAAS,GAAG,KAAK,GAClB,GAAG,MAAM,CAAC;IAEX,MAAM,UAAU,GAAe,EAAE,CAAC;IAElC,sCAAsC;IACtC,IAAI,cAAc,EAAE,CAAC;QACnB,UAAU,CAAC,IAAI,CACb,cAAc,CAAC,SAAS,CAAC;YACvB,KAAK,EAAE,cAAc;SACtB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,aAAa,EAAE,CAAC;QAClB,UAAU,CAAC,IAAI,CACb,OAAO,CAAC,SAAS,CAAC;YAChB,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI;YAC1D,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CACtB,KAAK,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI;YAC5D,cAAc,EAAE;gBACd,KAAK,EAAE,cAAc;aACtB;YACD,0BAA0B,EAAE,IAAI;SACjC,CAAC,CACH,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,KAAK,EAAE,CAAC;QACV,UAAU,CAAC,IAAI,CACb,KAAK,CAAC,SAAS,CAAC;YACd,MAAM,EAAE,YAAY;YACpB,cAAc,EAAE;gBACd,KAAK,EAAE,cAAc;aACtB;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,GAAG;gBACT,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CACf,YAAY,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;aACnE;SACF,CAAC,CACH,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,IAAI,SAAS,EAAE,CAAC;QACd,UAAU,CAAC,IAAI,CACb,SAAS,CAAC,SAAS,CAAC;YAClB,KAAK,EAAE,CAAC,WAAW,CAAC;SACrB,CAAC,CACH,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,UAAU,CAAC,IAAI,CACb,UAAU,CAAC,SAAS,CAAC;QACnB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QAC9B,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QAClC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QACxC,IAAI,EAAE,IAAI;YACR,CAAC,CAAC;gBACE,WAAW,EAAE,KAAK;aACnB;YACH,CAAC,CAAC,KAAK;QACT,OAAO,EAAE,KAAK;QACd,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QAC1C,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QAC5C,QAAQ,EAAE,UAAU,IAAI,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QACvD,UAAU,EAAE,KAAK;QACjB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,KAAK;QAChB,cAAc,EAAE,cAAc;YAC5B,CAAC,CAAC;gBACE,cAAc,EAAE;oBACd,KAAK,EAAE,gDAAgD;iBACxD;aACF;YACH,CAAC,CAAC,KAAK;QACT,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QACxC,MAAM,EAAE,KAAK;KACd,CAAC,CACH,CAAC;IAEF,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA4B;IACzD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IAExB,SAAS,WAAW,CAAC,IAAa;QAChC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,8BAA8B;QAC9B,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACjB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACxC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,8BAA8B;QAC9B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,SAAS;gBACZ,OAAO,CAAC,IAAI,CAAC,CAAC;YAEhB;gBACE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,OAAQ,WAAW,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,OAAO,CAAoB,IAAI,EAAE,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAuC,EACvC,UAAsB;IAEtB,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IAEtB,wDAAwD;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5C,OAAO,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IACzC,CAAC;IAED,qBAAqB;IACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAuC,EACvC,UAAsB;IAEtB,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,qBAAqB;IACrB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IACrC,CAAC;IAED,iBAAiB;IACjB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC;IACvC,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,UAAkC;IAChC,MAAM,EAAE,UAAU;IAClB,cAAc,EAAE,kBAAkB;CACnC;IAED,OAAO,YAAY,CAAC,IAAI,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;AAC1D,CAAC"}
|